domenica 14 dicembre 2008

Macro e Rock&Roll (3)

Dopo avere esaminato e tradotto in StarBasic il modulo FileExtractor, proseguiamo il discorso prendendo velocemente in esame i moduli di codice rimanenti:
  • ThisWorkbook

  • Sheet1

  • LoadModule

  • Module

Modulo ThisWorkbook

Questo modulo contiene le routine collegate agli eventi del documento.

In particolare nella routine Workbook_Open() vengono effettuate alcune inizializzazioni, come ad esempio l'estrazione del file audio, in corrispondenza dell'apertura del documento.

Modulo Sheet1

Qui ci sono le routine collegate agli eventi della tabella "Sheet1". In particolare vengono gestiti i due pulsanti presenti nella tabella.

Modulo LoadModule

Questo modulo contiene solamente la routine LoadVideo()
Questa procedura non viene usata in nessun modo ma è stata inizialmente impiegata dagli sviluppatori per caricare i "fotogrammi" del video in ASCII Art entro alcune celle del foglio elettronico, a partire da un file di testo chiamato 12fps-45sec-cut.txt ottenuto presumibilmente processando il "vero" file video degli AC/DC.
Osservando il codice possiamo capire che le celle della colona Q a partire dalla riga 100 contengono ciascuna un fotogramma ASCII Art. La cella Q99 invece contiene il logo del gruppo, che viene mostrato all'apertura del documento.

Modulo Module.

Questo è il modulo di codice che contiene le routine che eseguono materialmente il video musicale. Possiamo vedere che il file wav viene eseguito sfruttando alcune chiamate all'API di Windows dichiarate all'inizio del codice:

Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _ 
(
ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

L'istruzione Declare funziona anche in StarBasic, però questo approccio funzionerebbe solamente in Windows, per cui nella versione OpenOffice.org verrà senz'altro preferito l'approccio mostrato in questo post
La routine PlayVideo() è responsabile della proiezione del video nella cella B2 (in realtà si tratta di una cella risultante dall'unione dell'intervallo B2:L20)
Il codice è assolutamente semplice (ho rimosso le parti non essenziali):


VBA:
i =100
Do
While Sheet1.Cells(i, 17).Value <> ""
'[...]
Sheet1.Range("B2").Value = Sheet1.Cells(i, 17).Value
'[...]
i = i + 1
Loop

In pratica si tratta di un ciclo che copia il contenuto delle celle della colonna Q:Q a partire da Q100 nella cella di destinazione B2.
Il risultato è la proiezione del video in ASCII Art.
Dato che si tratta di un video a 12fps occorre introdurre un ritardo di 1/12 sec tra un fotogramma e l'altro.
Gli sviluppatori del codice VBA originale hanno utilizzato la funzione di libreria Timer ma in StarBasic è disponibile la più comoda funzione Wait.
Traducendo:

StarBasic:
i = 99
oSh = ThisComponent.Sheets(0)
Do While oSh.getCellByPosition(16, i).String <> ""
oSh.getCellRangeByName("B2").String = oSh.getCellByPosition(16, i).String
Wait 83 '1/12 sec
i = i + 1
Loop

Ed ecco finalmente il nostro video su OpenOffice.org Calc!!
Ora manca solo l'audio ma, ricordando quanto riportato qui, non ci vuole molto a mettere insieme le cose:

REM  *****  BASIC  *****
Sub Main
sMMUrl = "file:///home/paolo/Scrivania/acdc/MMFiles/acdc.wav"
oMediaMgr = CreateUnoService("com.sun.star.media.Manager_Java")
oMMPlayer = oMediaMgr.createPlayer(sMMUrl)
oMMPlayer.start
i = 99
oSh = ThisComponent.Sheets(0)
Do
While oSh.getCellByPosition(16, i).String <> ""
oSh.getCellRangeByName("B2").String = oSh.getCellByPosition(16, i).String
Wait 83 '1/12 sec i = i + 1
Loop

oMMPlayer.stop
End Sub

Questo il risultato finale: