Algo-ritmi

Tutorial e idee su software musicali

Posts Tagged ‘route

Terza Parte: Creare note con matrixctrl

con 2 commenti

tutorial 1_3

In questa parte vedremo come poter generare un numero che rappresenterà l’altezza della nota tramite la lettura di una colonna del matrixctrl.

Prima di impostare il matrixctrl, vediamo come poter visualizzare quale colonna viene letta in un determinato momento.
Per fare questo, ho creato un oggetto route ed impostato 16 outlet, agganciando ad ognuno un button. Per charezza, ne ho colorato uno diversamente (verde) ogni 4, quindi i bottoni 1, 5, 9 e 13 rappresentano ¼ della battuta.
L’oggetto route ridireziona l’input all’outlet corrispondente, nel nostro caso ho impostato come argomenti:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Questo significa che collegando l’output dall’oggetto tempo nell’input del router (è un numero intero che va da 0 a 15), il bottone che si accenderà sarà corrispondente alla suddivisione corrente.
Per esempio nell’immagine sopra viene passato il numero 6 che quindi sarà ridirezionato al settimo outlet, infatti il settimo bottone è acceso (giallo).

Siamo dunque arrivati al momento di impostare il matrixctrl, che dovrà essere una griglia di 16×12, questo perché sull’asse x avremo l’avanzamento del tempo, mentre sull’asse y la nota da riprodurre.

Una volta disegnato il matrixctrl della dimensione giusta è necessario impostarne le proprietà attraverso l’inspector, di seguito ecco come è settato l’oggetto per il nostro scopo:

matrixctrl inspector

La cosa importante è impostare che solo una cella per colonna può essere accesa, di modo da fornire l’indicazione dell’altezza della nota.

L’output interessante del matrixctrl è la lista di celle corrispondenti a una determinata colonna, dove i valori delle celle possono essere 0 (spento) o 1 (acceso)

La parte più importante da sviluppare è a questo punto come leggere l’output della colonna e trasformarlo in una nota, secondo questa logica:

1. recupero la lista delle celle della colonna corrente

questo avviene tramite la connessione del messaggio [getcolumn $1], dove la variabile passata è il numero della colonna della quale voglio recuperare la lista.
Connettendo quindi l’utput del tempo al messaggio da inviare al matrixctrl, avrò in uscita la lista della colonna.
Nell’esempio della figura sopra, sto chiedendo la lista della colonna 6, considerando che la prima colonna è la colonna 0, avrò in uscita questa lista:
0 0 0 0 0 1 0 0 0 0 0 0
(vedi messaggio in uscita dal matrixctrl dopo l’oggetto [prepend set])

2. inverto la lista

La lista è letta dall’alto verso il basso, quindi gli indici della colonna sono:
1 -> prima riga -> nota B
2 -> seconda riga -> nota A#
3 -> terza riga -> nota A
4 -> quarta riga -> nota G#

11 -> undicesima riga -> nota C#
12 -> dodicesima riga -> nota C

Quindi per avere il corretto valore della nota, devo inverire la lista, di modo che abbia le note espresse come:
C -> nota 1
C# -> nota 2
D -> nota 3
D# -> nota 4
E -> nota 5
F -> nota 6
F# -> nota 7
G -> nota 8
G# -> nota 9
A -> nota 10
A# -> nota 11
B -> nota 12

Per invertire una lista si può usare l’oggetto zl e impostare il parametro rev, in questo modo l’oggetto prende come inlet una lista e la restituisce come outlet rovesciata.

Ricapitolando, nel caso dell’esempio avremo la lista:
0 0 0 0 0 1 0 0 0 0 0 0
che viene rovesciata in:
0 0 0 0 0 0 1 0 0 0 0 0

3. prendo l’indice della lista dove il valore è 1

Ora non mi resta che trovare quale elemento della lista vale 1, questo può essere fatto attraverso un’altra funzione dell’oggetto zl, questa è sub, in questo caso zl sub 1 significa che estrae dalla lista l’indice che corrisponde al valore 1.
Sempre per fare riferimento all’esempio dell’immagine, l’indice estratto è 7, di conseguenza la nota sarà F#.

4. sommo all’indice il numero 59

Tramite l’espressione presente in expr ($i1+59), ottengo il giusto valore della nota, considerando che nell’ottava centrale di una tastiera midi, il C corrisponde a 60, di conseguenza se avessi selezionato l’ultima cella in basso della colonna avrei avuto 59+1, quindi la nota C, mentre nell’esempio ho 59+7 = 66, la nota F# nell’ottava centrale.

5. controllo che la colonna non sia vuota (neanche una nota selezionata)

Resta un’ultimo problema da gestire: come faccio a controllare che la colonna sia vuota?
Se guardate il number box in uscita dall’oggetto zl sub 1, noterete che l’output non torna mai a 0, questo perché l’oggetto non emette output nel caso non trovi neanche una corrispondenza.
Quindi per emettere una nota con il valore 0, nel caso non ci sia neanche una cella selezionata è necessario trovare un’altra strada.
La strada che ho perseguito in questo esempio è tramite l’oggetto peak.
L’oggetto peak emette il valore del primo inlet se questo supera il valore precedente o quello impostato tramite il secondo inlet.
Quindi tramite un button connesso all’output del tempo, imposto ad ogni lettura il valore massimo di peak a 0 e di conseguenza se dalla colonna arriva output, questo sarà superiore a 0 (minimo 60) quindi emetterà la nota desiderata, altrimenti emetterà la nota 0.

Written by lodevalm

Novembre 19, 2007 alle 2:57 pm