Ispirato da un articolo che ho trovato online sull’argomento (Tetris Theme Song Using Processing) ho deciso di riprodurre il medesimo risultato in VBA su Excel, riproducendo quindi il tema musicale di Tetris tramite una macro per Excel.
Anzitutto importiamo dal kernel32 di Windows la funzione appropriata per eseguire un Beep, riproducendo quindi un suono, nel modo seguente:
1 2 3 |
Public Declare PtrSafe Function Beep Lib "kernel32" _ (ByVal dwFreq As Long, _ ByVal dwDuration As Long) As Long |
La funzione accetta due argomenti: frequenza in Hz e durata in ms. Quindi per eseguire un 1 beep a 800Hz di 0,5 secondi, dovremo scrivere: Beep 800, 500
Detto questo voglio anzitutto riconvertire le funzioni dell’esempio nel link in VBA, creando un vettore di frequenze ed uno dei tempi, nel modo seguente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub Gioca() Dim frequenze As Variant frequenze = Array(659.25511, 493.8833, 523.25113, 587.32954, 523.25113, 493.8833, 440#, 440#, _ 523.25113, 659.25511, 587.32954, 523.25113, 493.8833, 523.25113, 587.32954, _ 659.25511, 523.25113, 440#, 440#, 440#, 493.8833, 523.25113, 587.32954, _ 698.45646, 880#, 783.99087, 698.45646, 659.25511, 523.25113, 659.25511, _ 587.32954, 523.25113, 493.8833, 493.8833, 523.25113, 587.32954, 659.25511, _ 523.25113, 440#, 440#) Dim durata As Variant durata = Array(406.25, 203.125, 203.125, 406.25, 203.125, 203.125, 406.25, 203.125, _ 203.125, 406.25, 203.125, 203.125, 609.375, 203.125, 406.25, 406.25, _ 406.25, 406.25, 203.125, 203.125, 203.125, 203.125, 609.375, 203.125, _ 406.25, 203.125, 203.125, 609.375, 203.125, 406.25, 203.125, 203.125, _ 406.25, 203.125, 203.125, 406.25, 406.25, 406.25, 406.25, 406.25) For i = LBound(frequenze) To UBound(frequenze) Beep frequenze(i), durata(i) Next i End Sub |
Faccio notare che per la conversione dello spartito (che si può trovare al seguente link) è stata usata una tabella di conversione simile a questa.
Detto questo voglio riportare la medesima tabella di conversione in Excel, in un foglio che chiameremo NOTE. Il risultato che otterremo sarà simile a questo:
A questo punto voglio creare un altro foglio, chiamato SPARTITO, dove creeremo tre colonne, una nella quale scegliere le note e l’altra dove inserire i tempi come ottavi di nota.
A questo punto associamo al pulsante Suona la seguente macro:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub Suona() Dim ottavo As Double ottavo = 1000 * 13 / 8 / 8 ' 1000 * 13 secondi / 8 / 8 = 203,125 ms Dim frequenze As Variant frequenze = Worksheets("SPARTITO").Range("FREQUENZE").Value Dim tempi As Variant tempi = Worksheets("SPARTITO").Range("TEMPI").Value For i = LBound(frequenze) To UBound(frequenze) Beep CDbl(frequenze(i, 1)), CDbl(tempi(i, 1) * ottavo) Next i End Sub |
Le frequenze vengono recuperate dal foglio NOTE.
Da qui si può scaricare il file excel comprensivo di macro: excel VBA – note musicali – tema tetris