Skip to content

Piloter un instrument MIDI

APrint Studio permet le pilotage d'un instrument midi à partir du jeu de la vue carton (play). Le menu Options de la fenêtre principale permet la sélection du sous système de jeu utilisé pour la restitution sonore. Cette restitution peut être interne à l'ordinateur en utilisant une synthèse à partir des échantillons sonores de l'instrument. En sélectionnant une interfaçe MIDI, ou une sortie USB MIDI le jeu d'un carton pilotera alors directement l'instrument.

Transcription par défaut en MIDI d'un Carton Virtuel

Par défaut, la transcription en MIDI est effectuée à partir de la gamme de l'instrument, celle ci donne par défaut une correspondance MIDI pour : les notes (le code midi est utilisé) et les percussions (le code midi et nom de la percussion est utilisé pour la correspondance), les percussions sont envoyées sur le canal 10.

Transcription MIDI personnalisée par script dans un instrument

La transcription de carton vers midi peut être personnalisé pour s'adapter à la commande réelle de l'instrument. Il s'agit ici de faire la correspondance entre les pistes du carton et les ordres MIDI envoyés vers l'instrument.

Cette transcription personnalisée prend la forme d'un script associé à l'instrument et sauvegardé dans l'instrument utilisé avec le carton virtuel. Si plusieurs scripts existent, un choix de la transcription est proposé à l'utilisateur. Ces scripts peuvent être étendus et adaptés en fonction du pilotage de l'instrument.

Ci dessous un exemple de script réalisé pour piloter un instrument et ses registres avec des commandes MIDI spécifiques :

import org.barrelorgandiscovery.playsubsystem.*
import org.barrelorgandiscovery.virtualbook.transformation.importer.*
import org.barrelorgandiscovery.virtualbook.*

def vb = virtualbook;

def notemapping = [:]

for(int i = 0 ; i < 43 ; i ++)
{
    def md = [channel : 13, note : 35 + 6 + i]
    notemapping[i] = md
}

// fin chant
for (int i = 43 ; i < 51 ; i ++)
{
    def md = [channel : 14, note : 20 + 35 + i - 43]
    notemapping[i] = md
}

// contre chant
// DO
notemapping[51] = [channel : 14, note : 55 + 51 - 43]
// DO #
notemapping[52] = [channel : 14, note : 55 + 52 - 43]

// RE
notemapping[53] = [channel : 14, note : 55 + 76 - 3 - 43 ]

// RE#
notemapping[54] = [channel : 14, note : 55 + 77 - 3 - 43]

// MI
notemapping[55] = [channel : 14, note : 55 + 78 - 3 - 43 ]

// contre chant
for (int i = 56 ; i < 76 ; i ++)
{
    def md = [channel : 14, note : 55 + i - 3 - 43]
    notemapping[i] = md
}

// registres
// channel 15 - (ou 14 à partir de zero)

// declenche

notemapping[77] = [channel :14 , note : 36]

// registres, notation sur les broches

def mregistre = [ 79 : [14 , 61] , //viloncell
                  80 : [15 , 57], //flute 8

                  82 : [14 , 57], // bourdon
                  83 : [14 , 59], // voix celeste

                  84 : [15 , 4], // sax

                  85 : [14 , 62], // flute dans le chant
                  86 : [14 , 51], //trompette
                  87 : [14 , 52], // udamaris

                  88 : [14 , 50], // violon dans le chant
                  89 : [15 , 19], // xylophone dans le chant
                  90 : [14 , 62], // Flute harmonique
                  91 : [15 , 2], // Flute de 8
                  92 : [15 , 17], // accordeon
                  93 : [14 , 64], // forte
                   94 : [14 , 49], // bonrdon dans le chant
                   95 : [14 , 53] // vibraphone

                 ]

mregistre.each { k, v ->

   notemapping[k - 1] = [channel : v[0] - 1 , note : v[1] + 35]

}

// percussions

for (int i = 96; i <= 105 ; i ++)
{
    notemapping[i] = [channel : 14, note : 55 + (80 + i - 96) - 3 - 43 ]
}

def m = new MidiFile()

def holes = vb.getHolesCopy()

// declanche ON
byte[] data = [ 0x9E, 36,127  ]
def n = new MidiGenericEvent(0, data)
m.add(n)

holes.each {

    def nn = notemapping[it.track]
    if (nn != null)
    {

       if (nn == 77)
       {
          // declenche
          // off , puis on
          byte[] data1 = [ 0x8E, 36,127  ]
          m.add( new MidiGenericEvent(it.timestamp, data1) )

          byte[] data2 = [ 0x9E, 36,127  ]
          m.add( new MidiGenericEvent(it.timestamp + it.length, data2) )

       } else 
       {
           def n2 = new MidiNote(it.timestamp, it.length, nn.note, 0 , nn.channel)
           m.add(n2)
       }
    }

}

return m