Kontakt: gli script (parte 9)

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.

072 ksp

Agite sulla manopola Divisi impostando il valore 2.

073 ksp

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.

074 ksp

Impostiamo ora il valore 4 per la manopola Dividi.

075 ksp

Quando avvieremo la sequenza otterremo il seguente risultato.

076 ksp

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.

parte 10

Annunci

Informazioni su silviorelandini

sound designer, docente di tecnologie musicali, direttore iitm
Questa voce è stata pubblicata in Campionamento, Corsi, Software, Sound Designing, Tecnologie Musicali e contrassegnata con , , , . Contrassegna il permalink.

2 risposte a Kontakt: gli script (parte 9)

  1. Pingback: Kontakt: gli script (parte 8) | tecnologiamusicale

  2. Pingback: Kontakt: gli script (parte 10) | tecnologiamusicale

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...