Kontakt: gli script (parte 10)

L’utilizzo del ciclo while ben si sposa con le strutture degli array. Vediamo un altro esempio relativamente ad un arpeggiatore. Per memorizzare la sequenza di note utilizziamo ora un array. Immaginiamo di voler arpeggiare la seguente sequenza musicale.

077 ksp

Occorre pertanto creare un array costituito da 8 valori:

on init
 declare %Arpeggio[8]
end on

Consideriamo i valori delle note non più con il loro reale numero di nota che sarebbe:

  • prima nota: 60 (do centrale)
  • seconda nota: 64
  • terza nota: 67
  • quarta nota: 72
  • quinta nota: 69
  • sesta nota: 74
  • ottava nota: 67

Se inserissimo questi valori nelle assegnazioni all’interno dell’array ogni volta che suoneremo una nota otterremo sempre quella sequenza con quelle specifiche altezze ricadendo nel caso visto nel precedente articolo con lo Step Sequencer. Consideriamo invece i rapporti armonici esistenti tra le note della sequenza:

  • prima nota: tonica della sequenza (0)
  • seconda nota: nota caratteristica (4)
  • terza nota: dominante (7)
  • quarta nota: tonica all’ottava superiore (12)
  • quinta nota: sopradominante (9)
  • sesta nota: sopratonica all’ottava (14)
  • settima nota: sensibile (11)
  • ottava nota: dominante (7)

Con queste assegnazioni faremo in modo che la sequenza venga trasportata a seconda della nota che si va a premere. Procediamo dunque ad effettuare le assegnazioni dei valori di nota alle varie memorie dell’array. Possiamo farlo anche nel seguente modo:

on init
 declare %Arpeggio[8] := (0,4,7,12,9,14,11,7)
end on

Dobbiamo dichiarare anche una variabile contatrice che farà eseguire la sequenza.

on init
 declare %Arpeggio[8] := (0,4,7,12,9,14,11,7)
 declare $cont
end on

Dedichiamoci ora alle istruzioni della callback note. Dobbiamo intanto ignorare la nota suonata come evento di per sè ma considerarla come trigger della sequenza memorizzata nell’array.

on note
 ignore_event ($EVENT_ID)
end on

Inizializziamo anche la variabile contatore al valore 0.

on note
 ignore_event ($EVENT_ID)
 $cont := 0
end on

A questo punto diciamo allo script di suonare la sequenza dell’array la cui altezza di partenza (la tonica) è determinata dalla nota premuta sulla tastiera.

on note
 ignore_event ($EVENT_ID)
 $cont := 0
 while ($cont<8)
  play_note ($EVENT_NOTE+%Arpeggio[$cont], $EVENT_VELOCITY, 0, 100000)
  wait (100000)
  inc($cont)
 end while
end on

Analizziamo quello che abbiamo scritto. Finché la variabile contatore, che rappresenta l’indice dell’array, è inferiore al valore 8 suonare la nota premuta che ha altezza pari a quella relativa al tasto premuto più quella contenuta nella memoria dell’array di indice pari alla variabile contatore. La nota premuta ha la velocity pari a quella premuta e durata pari a un decimo di secondo. Mentre si suona la prima nota si attende un tempo pari alla sua durata (grazie all’istruzione wait) dopodiché si incrementa di un’unità la variabile contatore utilizzando l’istruzione inc($cont).

Lo script completo è il seguente:

on init
 declare %Arpeggio[8] := (0,4,7,12,9,14,11,7)
 declare $cont
end on

on note
 ignore_event ($EVENT_ID)
 $cont := 0
 while ($cont<8)
  play_note ($EVENT_NOTE+%Arpeggio[$cont], $EVENT_VELOCITY, 0, 100000)
  wait (100000)
  inc($cont)
 end while
end on

Proviamo a suonare la nota G3. La sequenza verrà suonata una sola volta (perché il ciclo contenuto nell’istruzione while continuerà ad essere eseguito fintanto che il valore della variabile cont è inferiore ad 8) e avrà altezza pari all’esempio sottostante.

078 ksp

Infatti la formula $EVENT_NOTE + %Arpeggio[$cont] agisce applicando una trasposizione della sequenza sulla base della nota premuta:

  • prima nota: G3 + %Arpeggio[0] = G3 + 0 = G3
  • seconda nota: G3 + %Arpeggio[1] = G3 + 4 = B3
  • terza nota: G3 + %Arpeggio[2] = G3 + 7 = D4
  • quarta nota: G3 + %Arpeggio[3] = G3 + 12 = G4
  • quinta nota: G3 + %Arpeggio[4] = G3 + 9 = E4
  • sesta nota: G3 + %Arpeggio[5] = G3 + 14 = A4
  • settima nota: G3 + %Arpeggio[6] = G3 + 11 = F#4
  • ottava nota: G3 + %Arpeggio[7] = G3 + 7 = D4

Possiamo intanto creare una ripetizione della sequenza fintanto che la nota rimane premuta. Potremmo ripetere lo stesso schema visto per lo Step Sequencer ma cambiamo metodo ed utilizziamo due cicli while nel seguente modo:

on note
 ignore_event ($EVENT_ID)
 while ($NOTE_HELD = 1)
  $cont := 0
  while ($cont<8 and $NOTE_HELD = 1)
  play_note ($EVENT_NOTE+%Arpeggio[$cont], $EVENT_VELOCITY, 0, 100000)
  wait (100000)
  inc($cont)
  end while
 end while
end on

In questo caso diciamo nel ciclo while più esterno di impostare al valore 0 la variabile contatore se la nota musicale è premuta sulla tastiera e fintanto che rimane premuta incrementiamo la variabile di un’unità spostando quindi la lettura sulla cella di memoria specifica dell’array. Poichè il ciclo più interno viene applicato se la variabile cont è inferiore ad 8, come raggiunge tale valore il ciclo si ferma e entra in azione il ciclo più esterno che riporta a zero la variabile e di fatto riavvia il ciclo interno. Questo genererà un loop continuo della sequenza fino a che la nota rimane premuta. Rilasciando la nota l’arpeggiatore si ferma ma se premeremo un’altra nota la sequenza ripartirà non dall’ultima memoria suonata dell’array ma nuovamente da capo visto che il ciclo while più esterno inizializza a zero la variabile cont.

La condizione del ciclo while più interno prevede un’espressione di tipo booleano attraverso l’operatore and la cui sintassi a and b specifica che la condizione è vera se e solo se a è vero e contemporaneamente b è vero il che significa che il ciclo while sarà eseguito se e solo se la variabile cont è inferiore a 8 e la nota suonata rimane premuta.

Lo script completo ora è il seguente:

on init
 declare %Arpeggio[8] := (0,4,7,12,9,14,11,7)
 declare $cont
end on

on note
 ignore_event ($EVENT_ID)
 while ($NOTE_HELD = 1)
  $cont := 0
  while ($cont<8 and $NOTE_HELD = 1)
  play_note ($EVENT_NOTE+%Arpeggio[$cont], $EVENT_VELOCITY, 0, 100000)
  wait (100000)
  inc($cont)
  end while
 end while
end on

Provate ora a suonare una nota e ascolterete la stessa sequenza ripetuta continuamente se mantenete premuta la nota.

Come avrete notato è una sequenza molto veloce dato che ogni nota ha durata pari ad un decimo di secondo. Possiamo rallentare la sequenza aumentando questo valore oppure possiamo vincolare la durata ad un valore musicale in modo tale da avere un sincronismo nell’esecuzione nel momento in cui usiamo kontakt all’interno di un sequencer. Ad esempio se volessimo che le note della sequenza avessero la durata di una croma dobbiamo scrivere:

play_note ($EVENT_NOTE+%Arpeggio[$cont], $EVENT_VELOCITY, 0, $DURATION_EIGHTH)
wait ($DURATION_EIGHTH)

Premete su apply. Prima di suonare una nota ed ascoltare il risultato occorre fare una considerazione. Kontakt può essere sincronizzato ad uno specifico valore di metronomo. Normalmente si tiene conto del fatto che kontakt viene suonato in un sequencer che pertanto fornirà la velocità di metronomo a cui tutti dovranno adattarsi. In questa situazione Kontakt è impostato per far riferimento ad un’impostazione esterna di metronomo specificata dal pulsante Ext nella sezione del metronomo nel Master Editor collocato nella parte superiore di Kontakt.

079 ksp

Se invece si utilizza Kontakt come standalone allora occorre disabilitare questa funzione spengendo il pulsante sopra citato.

080 ksp

Lo script completo è ora diventato:

on init
 declare %Arpeggio[8] := (0,4,7,12,9,14,11,7)
 declare $cont
end on

on note
 ignore_event ($EVENT_ID)
 while ($NOTE_HELD = 1)
  $cont := 0
  while ($cont<8 and $NOTE_HELD = 1)
   play_note ($EVENT_NOTE+%Arpeggio[$cont], $EVENT_VELOCITY, 0, $DURATION_EIGHTH)
  wait ($DURATION_EIGHTH)
  inc($cont)
  end while
 end while
end on

Nel prossimo articolo vedremo come dare all’utente la possibilità di scegliere le otto altezze delle note che costituiscono la sequenza nonché i valori musicali.

Annunci

Informazioni su silviorelandini

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

2 risposte a Kontakt: gli script (parte 10)

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

  2. Pingback: Kontakt: gli script (parte 11) | 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...