Con questo articolo completiamo la progettazione dello Step Sequencer e affrontiamo l’argomento delle istruzioni cicliche.
Una volta che abbiamo completata la progettazione dello step sequencer dobbiamo renderlo operativo. Poichè la sequenza deve essere avviata da una nota suonata su una tastiera MIDI o sulla tastiera virtuale utilizzeremo la callback note. Ogni qualvolta premeremo la nota per avviare la sequenza memorizzata negli step del sequencer dobbiamo dire al KSP di ignorare, come suono, la nota stessa che avvia la sequenza. Tutto ciò è possibile tramite l’istruzione ignore_event ($EVENT_ID).
on note
ignore_event ($EVENT_ID)
end on
Ora la nota premuta avvia la lettura della sequenza. E’ importante utilizzare la variabile $contatore che terrà conto dell’avanzare degli step. Occorre inizializzarla a zero in modo che ogni volta che si ripreme una nota la sequenza partirà dal primo step.
on note
ignore_event ($EVENT_ID)
$contatore := 0
end on
Quello che vogliamo ora è specificare che finché la nota rimane premuta la sequenza dovrà andare in riproduzione. Dovremo quindi affidare questa condizione ad un’istruzione ciclica chiamata while la cui sintassi è la seguente:
while (<condizione>)
<istruzione>
…..
end while
La condizione che dobbiamo esprimere è la validità dell’affermazione “nota premuta”. Questa condizione si esprime utilizzando la variabile interna $NOTE_HELD. Se questa variabile è pari ad 1 vuol dire che la nota che avvia la sequenza è premuta mentre se è 0 allora la nota è stata rilasciata (con un messaggio MIDI di Nota Off). La condizione quindi che dobbiamo porre è:
while ($NOTE_HELD = 1)
Quando la condizione è verificata dobbiamo quindi suonare la nota per un dato step, pertanto utilizziamo il comando play_note:
play_note (%Sequencer[$contatore], $EVENT_VELOCITY, 0, $Durata_Step/$Dividi)
L’altezza della nota dipende dal contenuto dello specifico Step del Sequencer (%Sequencer[$contatore]), la velocity viene impostata in base a quella effettivamente suonata con la nota che avvia la sequenza ($EVENT_VELOCITY). Il valore 0 indica che non c’è sample offset mentre la durata è espressa dall’operazione matematica $Durata_Step/$Dividi che esprime la lunghezza dello step divisa il rapporto di divisione espresso dalla manopola Dividi.
Dopo aver avviata la sequenza e quindi suonato lo step specifico dobbiamo dire al KSP di attendere il tempo relativo alla durata dello step prima di suonare lo step successivo. A tal fine si utilizza l’istruzione wait().
wait ($Durata_Step)
La callback note diventa:
on note
ignore_event ($EVENT_ID)
$contatore := 0
while ($NOTE_HELD = 1)
play_note (%Sequencer[$contatore], $EVENT_VELOCITY, 0, $Durata_Step/$Dividi)
wait ($Durata_Step)
end while
end on
Una volta suonato uno step occorre passare allo step successivo per cui occorre incrementarlo di un valore con l’istruzione $contatore := $contatore + 1
on note
ignore_event ($EVENT_ID)
$contatore := 0
while ($NOTE_HELD = 1)
play_note (%Sequencer[$contatore], $EVENT_VELOCITY, 0, $Durata_Step/$Dividi)
wait ($Durata_Step)
$contatore := $contatore + 1
end while
end on
Che succede quando raggiungiamo l’ultimo step della sequenza? Se la nota rimane premuta (condizione dell’istruzione while) dobbiamo ripartire da capo. Questa situazione può essere rappresentata tramite un’altra istruzione condizionale chiamata if la cui sintassi è:
if (<condizione>)
<istruzione>
…
end if
Nel nostro caso dovremo dire che quando il numero di step è maggiore rispetto all’ultimo possibile occorre inizializzare a zero la variabile che conta il numero di step:
If ($contatore >= $N_Steps)
$contatore :=0
end if
Ora la callback note è completa.
on note
ignore_event ($EVENT_ID)
$contatore := 0
while ($NOTE_HELD = 1)
play_note (%Sequencer[$contatore], $EVENT_VELOCITY, 0, $Durata_Step/$Dividi)
wait ($Durata_Step)
$contatore := $contatore + 1
if ($contatore >= $N_Steps)
$contatore := 0
end if
end while
end on
Lo script completo è:
on init
declare ui_table %Sequencer[16] (4, 4, 127)
%Sequencer[0] := 60
%Sequencer[1] := 60
%Sequencer[2] := 60
%Sequencer[3] := 60
%Sequencer[4] := 60
%Sequencer[5] := 60
%Sequencer[6] := 60
%Sequencer[7] := 60
%Sequencer[8] := 60
%Sequencer[9] := 60
%Sequencer[10] := 60
%Sequencer[11] := 60
%Sequencer[12] := 60
%Sequencer[13] := 60
%Sequencer[14] := 60
%Sequencer[15] := 60
make_persistent (%Sequencer)
declare ui_menu $Durata_Step
add_menu_item ($Durata_Step, “1/4”, $DURATION_QUARTER)
add_menu_item ($Durata_Step, “1/8”, $DURATION_EIGHTH)
add_menu_item ($Durata_Step, “1/16”, $DURATION_SIXTEENTH)
add_menu_item ($Durata_Step, “1/4T”, $DURATION_QUARTER_TRIPLET)
add_menu_item ($Durata_Step, “1/8T”, $DURATION_EIGHTH_TRIPLET)
add_menu_item ($Durata_Step, “1/16T”, $DURATION_SIXTEENTH_TRIPLET)
$Durata_Step := $DURATION_QUARTER
make_persistent ($Durata_Step)
declare ui_knob $N_Steps(1,16,1)
$N_Steps := 16
make_persistent($N_Steps)
move_control ($N_Steps, 1, 3)
declare ui_knob $Dividi(1,4,1)
$Dividi := 1
make_persistent($Dividi)
move_control ($Dividi, 1, 1)
declare $contatore
set_ui_height(3)
make_perfview
end on
on note
ignore_event ($EVENT_ID)
$contatore := 0
while ($NOTE_HELD = 1)
play_note (%Sequencer[$contatore], $EVENT_VELOCITY, 0, $Durata_Step/$Dividi)
wait ($Durata_Step)
$contatore := $contatore + 1
if ($contatore >= $N_Steps)
$contatore := 0
end if
end while
end on
Cliccate su apply e provate ad avviare una sequenza suonando una nota. A prescindere dell’altezza suonata la sequenza sarà la seguente in quanto abbiamo assegnato di default tutti gli step all’altezza del Do centrale.
Agite sulla manopola Divisi impostando il valore 2.
Premete una nota ed ascoltate il risultato. Ora gli step continuano ad essere della durata di 1/4 ma le note in essi contenute diventano della metà del valore originale quindi l’effetto che avremo è una sequenza con note di un ottavo seguite dalla relativa pausa.
Impostiamo ora il valore 4 per la manopola Dividi.
Quando avvieremo la sequenza otterremo il seguente risultato.
E’ chiaro che questo Step Sequencer appena creato ha dei grossi limiti. E’ vero che possiamo intervenire sull’altezza della sequenza cambiando i valori delle altezze modificando manualmente i valori contenuti nelle 16 celle della tabella ma non possiamo trasportare la sequenza decidendo che il primo Step ha l’altezza determinata dalla nota che avvia la sequenza.
Pingback: Kontakt: gli script (parte 8) | tecnologiamusicale
Pingback: Kontakt: gli script (parte 10) | tecnologiamusicale