Repository navigation
How to use Midi Functions
Abbiamo visto che in GPScript , abbiamo delle funzioni specifiche che trattano i messaggi di tipo NOTE e MIDI In realtà MIDI message contiene tutte le informazioni , quindi può essere utilizzato anche per leggere/scrivere note
Vediamo più in dettagli i tipi di messaggi MIDI che possono essere elaborati
PROGRAM CHANGE (PC)
CONTROL CHANGE (CC)
PITCHBEND
POLYPRESSURE (AT)
CHANNELL PRESSURE
Il messaggio program change viene utilizzato in GIG ed associato automaticamente per cambiare la selezione dei Rackspace e delle Song nella SetList I messaggi PC vengono indicizzati con offset, questo significa che se riceviamo un messaggio PC con valore zero si attiva il primo rackspace o Song presente nella lista
La numerazione dell'ordine Rackspace/Songs viene cambiata con l'impostazione Option->General->Global Midi

d
| PC 0 | Rackspace 1 | Song 1 |
|---|---|---|
| PC 1 | Rackspace 2 | Song 2 |
| … | … | … |
| PC 99 | Rackspace 100 | Song 100 |

| PC 0 | Rackspace 0 | Song 0 |
|---|---|---|
| PC 1 | Rackspace 1 | Song 1 |
| … | … | … |
| PC 99 | Rackspace 99 | Song 99 |
Un esempio di applicazione che prevede di intercettare i program change message e manipolarli
Supponiamo di usare una tastiera che ha un range di programmi da P001 -- P256 ( esempio con Numa X Piano )
Abbiamo deciso di mantenere i programmi da P001 - P099 con i suoni interni e utilizza un range da utilizzare con GIG (P100-P130)
Per default il controller invierà il PC selezionato corrispondente. Noi vogliamo attivare la nostra setlist sono con il programmi compresi 101-130

Lo scopo è di scrivere uno script che sia in grado di:
- Intercettare i messaggi PC provenienti dal controller
- Cambiare il messaggio PC a livello alto per convertirlo nel range (0-30) per GiG
Scriviamo il codice in GiG Script
/******************************************************
//
// Gig Script
//
******************************************************/
var touch : MidiInDevice
Initialization
Print("Hello")
End
On ProgramChangeEvent(p : ProgramChangeMessage) from touch
var PC : integer
PC=GetProgramChangeNumber(p)
Print("Channel " + GetChannel(p) + " Program Change " + PC)
End
La callback ProgramChangeEvent viene attivata alla ricezione del messaggio PC da parte del controller MIDI collegato ( touch)
L'argomento contiene il messaggio MIDI ProgramChangeMessage
Con la funzione GetProgramChangeNumber otteniamo il numero del programma ricevuto

Possiamo notare che la songlist non riceve l'evento perchè è stato "bloccato" in GiG script
Per poter reinviare dobbiamo utilizzare un metodo appropiato. In questo caso dobbiamo utilizzare InjectMidiEventViaRigManager
Con questa funzione viene inviato il messaggio contenuto nella variabile p tramite l'alias del device presente nel Rig manager touch
InjectMidiEventViaRigManager
<KeyWord name="InjectMidiEventViaRigManager" func="yes">
<Overload retVal="" descr="Inject a message to a MidiInDeviceAlias using its Rig Manager name directly">
<Param name="rmDeviceAliasName : MidiInDeviceAlias" />
<Param name="m : MidiMessage" />
</Overload>
</KeyWord>
💡 Tip: E' possibile utilizzare la funzione
InjectMidiEventche ha come parametro il nome del dispositivo fisico collegato

In questo la funzione verrà utilzzata in questo modo
InjectMidiEvent("TouchOSC Bridge", p)
InjectMidiEvent
<KeyWord name="InjectMidiEvent" func="yes">
<Overload retVal="" descr="Inject a message to any Midi Input Port with the specified physical device name">
<Param name="physicalDeviceName : String" />
<Param name="m : midiMessage" />
</Overload>
</KeyWord>Proseguendo nell'esempio ora andiamo a filtrare i messaggi e cambieremo il numero del programma in base al range ricevuto
Se il numero programma è compreso tra 100-130 , all'interno di GIG invieremo il programma 0-30
Con la funzione WithProgramChangeNumber sostituiremo il mumero programma con quello calcolato
On ProgramChangeEvent(p : ProgramChangeMessage) from touch
var PC : integer
const PC_MIN : integer= 100
const PC_MAX : integer= 130
PC=GetProgramChangeNumber(p)
Print("Channel " + GetChannel(p) + " Program Change " + PC)
If PC>=PC_MIN && PC<=PC_MAX Then
PC=PC - PC_MIN
Notify("PC changed" + PC)
p= WithProgramChangeNumber(p, PC)
InjectMidiEventViaRigManager(touch, p)
end
End