Skip to content

How to use Midi Functions

Domenico Patella edited this page Apr 16, 2025 · 14 revisions

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

Program Change

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

image

d

PC 0 Rackspace 1 Song 1
PC 1 Rackspace 2 Song 2
… … …
PC 99 Rackspace 100 Song 100

image

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

image

Lo scopo è di scrivere uno script che sia in grado di:

  1. Intercettare i messaggi PC provenienti dal controller
  2. 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

PC_base

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>

PC_adv

💡 Tip: E' possibile utilizzare la funzione InjectMidiEvent che ha come parametro il nome del dispositivo fisico collegato

image

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

Clone this wiki locally