GNMIDI

Inhaltsverzeichnis Stichwortindex
Syntax für gnscript MIDI Befehlsänderungen
Previous  Top  Next

Einige GNMIDI Funktionen verwenden gnscript Ausdrücke expressions zum Ändern von MIDI Befehlen (nur für Experten).
Der aktuelle Befehl kann geändert oder gelöscht werden mit mehreren Skriptansweiungen und möglichen Bedingungen.

gnscript Skriptsprache
Unter https://www.gnmidi.com/gnscript.htm finden Sie eine kostenlose Demo vom allgemeinen Scriptinterpreter mit vielen Scriptbeispielen zum Lernen von Programmieren. Es ist leichter Programmieren durch Beispiele zu erlernen als durch Syntax.  
Dort können Sie die komplette Syntax der gnscript Sprache nachlesen.  
Hinweis: gnscript Skriptsprache enthält selbst keinen MIDI Support. GNMIDI und GNMIDI Benutzertools verwenden gnscript und eine MIDI Erweiterung, die MIDI Dateien unterstützt (z.B. Variablen song, ev, Funktionen wie midiload, midisave ...).  
 
Variablen
song ist eine Strukturvariable mit Liedinformationen
song.filename Dateiname
song.events ein Vektor von Eventobjekte

ev ist eine Strukturvariable mit Eventinformationen zum aktuellen Event
ev.type ist die Typbezeichnung des Events
               EVENTTYPE_NOTE
               EVENTTYPE_PROGRAM
               EVENTTYPE_CONTROL
               EVENTTYPE_HEADER
               EVENTTYPE_TEMPO
               EVENTTYPE_TACT
               EVENTTYPE_TEXT
               EVENTTYPE_PITCHBEND
               EVENTTYPE_AFTERTOUCH
               EVENTTYPE_POLYAFTERTOUCH
               EVENTTYPE_KEY
               EVENTTYPE_SYSEX
               EVENTTYPE_META
               EVENTTYPE_REALTIME
               EVENTTYPE_ENDTRACK

Abhängig vom Eventtyp haben Events unterschiedliche Attribute
          ev.track      Spurnummer (1,...)
          ev.channel    Kanalnummer  (0 für kein Kanal, 1-16)
          ev.startunit  MIDI Einheit, wo der Event startet (0 ist der Liedanfang)
          ev.endunit    event EVENTTYPE_NOTE enthält MIDI Einheit, wo die Note endet
          ev.length     event EVENTTYPE_NOTE enthält die Notenlänge in MIDI Einheiten (kann auch 0 sein)
          ev.startms    Startzeit in Millisekunden, wo der Event beginnt (0 ist der Liedanfang)
          ev.endms      event EVENTTYPE_NOTE enthält die Endzeit in Millisekunden, wo die Note endet
          ev.duration   event EVENTTYPE_NOTE enthält die Notendauer in Millisekunden
          ev.velocity         event EVENTTYPE_NOTE enthält die Notenanschlagstärke am Notenbeginn (1-127)
          ev.velocityoff     event EVENTTYPE_NOTE contains die Notenanschlagstärke am Notenende (0-127)
          ev.hasstart   kann 0 sein, wenn Note On/Off nicht kombiniert sind
          ev.hasend     kann 0 sein, wenn Note On/Off nicht kombiniert sind
          ev.iscombined  1 wenn zusammengehörige Note On/Off kombiniert in einer ev Struktur sind
          ev.unitsperbeat   event EVENTTYPE_HEADER enthält MIDI Auflösung als Einheiten per Beat
          ev.version    event EVENTTYPE_HEADER enthält MIDI Version 0, 1, 2
          ev.trackcount   event EVENTTYPE_HEADER enthält Anzahl der MIDI Spuren
          ev.bpm         event EVENTTYPE_TEMPO enthält Tempo als Beats pro Minute
          ev.microsecondsperbeat    event EVENTTYPE_TEMPO enthält Tempo als Mikrosekunden pro Beat
          ev.nomin       event EVENTTYPE_TACT enthält Zähler vom Takt (z.B. 3 of 3/4)
          ev.denom       event EVENTTYPE_TACT enthält Nenner vom Takt (z.B. 4 of 3/4)
          ev.texttype    event EVENTTYPE_TEXT enthält Texttypnummer
                meta_text
                meta_copyright
                meta_trackname
                meta_instrument
                meta_lyric
                meta_marker
                meta_cuepoint
                meta_programname
                meta_devicename
          
          ev.program     event EVENTTYPE_PROGRAM entält die Programmnummer (1,...)
          ev.programname   event EVENTTYPE_PROGRAM enthält den GM Programmnamen 
          ev.note        event EVENTTYPE_NOTE enthält die Notennummer (0-127)
          ev.notename    event EVENTTYPE_NOTE enthält den Notennamen
          ev.controlnr   event EVENTTYPE_CONTROL enthält die Control Nummer (0-127)
                   ev.ctrl_highbank
                   ev.ctrl_wheel
                   ev.ctrl_breath
                   ev.ctrl_foot
                   ev.ctrl_portamentotime
                   ev.ctrl_data
                   ev.ctrl_volume
                   ev.ctrl_balance
                   ev.ctrl_expression
                   ev.ctrl_effect1
                   ev.ctrl_effect2
                   ev.ctrl_slider1
                   ev.ctrl_slider2
                   ev.ctrl_slider3
                   ev.ctrl_slider4
                   ev.ctrl_lowbank
                   ev.ctrl_lowdata
                   ev.ctrl_hold
                   ev.ctrl_portamento
                   ev.ctrl_sustenuto
                   ev.ctrl_soft
                   ev.ctrl_legato
                   ev.ctrl_hold2
                   ev.ctrl_sound_variation
                   ev.ctrl_resonance
                   ev.ctrl_sound_release_time
                   ev.ctrl_sound_attack_time
                   ev.ctrl_xg_brightness
                   ev.ctrl_xg_portamento
                   ev.ctrl_reverb
                   ev.ctrl_tremolo
                   ev.ctrl_chorus
                   ev.ctrl_xg_effect4
                   ev.ctrl_phaser_level
                   ev.ctrl_datainc
                   ev.ctrl_datadec
                   ev.ctrl_lownrpn
                   ev.ctrl_highnrpn
                   ev.ctrl_lowrpn
                   ev.ctrl_highrpn
                   ev.ctrl_allsoundoff
                   ev.ctrl_allcontroloff
                   ev.ctrl_localkeyboard
                   ev.ctrl_allnotesoff
                   ev.ctrl_omnioff
                   ev.ctrl_omnion
                   ev.ctrl_mono
                   ev.ctrl_poly
          ev.controlvalue  event EVENTTYPE_CONTROL enthält den Control Wert (0-127)
          ev.text        event EVENTTYPE_TEXT enthält Text
          ev.key         
          ev.pitchbend        event EVENTTYPE_PITCHBEND enthält die Pitchbend Nummer
                  pitch_center = 0
                  pitch_maxdown = -0x2000
                  pitch_maxup = 0x1fff
          
          ev.aftertouch       event EVENTTYPE_AFTERTOUCH enthält Aftertouch Wert
          ev.polykey          event EVENTTYPE_POLYAFTERTOUCH enthält polyaftertouch Key
          ev.polyvalue        event EVENTTYPE_POLYAFTERTOUCH enthält polyaftertouch Wert
          ev.key              event EVENTTYPE_KEY enthält Key
          ev.metatype         event EVENTTYPE_META enthält META Typnummer
                meta_seqnumber
                meta_prefixchannel
                meta_prefixport
                meta_endtrack
                meta_tempo
                meta_smpte
                meta_meter
                meta_key
          ev.meta            event EVENTTYPE_META enthält META Daten als Hexadezimaltext(Werte 00 - 7F)
          ev.metadatalength  event EVENTTYPE_META enthält META Datenlänge in Bytes
          ev.realtimeevent    event EVENTTYPE_REALTIME enthält eine Echtzeiteventnummer
                event_songpos
                event_songselect
                event_tunerequest
                event_clock
                event_start
                event_continue
                event_stop
                event_activesense
          ev.realtimeparam    event EVENTTYPE_REALTIME enthält einen Echtzeitevent Parameterwert
          ev.sysex       event EVENTTYPE_SYSEX enthält Sysexdaten als Hexadezimaltext (Werte 00 - 7F oder F7)
                sysex_GMReset = "7E 7F 09 01 F7"
                sysex_GMExit = "7E 7F 09 02 F7"
                sysex_GM2Reset = "7E 7F 09 03 F7"
                sysex_GSReset = "41 10 42 12 40 00 7F 00 41 F7"
                sysex_GSExit = "41 10 42 12 40 00 7F 7F 42 F7"
                sysex_XGReset = "43 10 4C 00 00 7E 00 F7"
          ev.sysexdatalength   event EVENTTYPE_SYSEX enthält die Sysexdatenlänge in Bytes

Hinweis: die oben angegebenen Konstanten sollten verwendet werden z.B. ev.type == EVENTTYPE_CONTROL && ev.controlnr == ctrl_volume
Wichtig: auf viele dieser Eigenschaften kann nur zugegriffen werden, wenn der aktuelle Befehl den geeigneten Typ hat z.B. ev.velocity ist nur bei ev.type == EVENTTYPE_NOTE möglich und sonst bricht das Skript mit Fehler ab. Schränken sie deshalb mit einer Bedingung vorher den Befehlstyp ein z.B: ev.type == EVENTTYPE_NOTE && ev.velocity >= 80

Zuweisungsoperatoren
= Wertzuweisung z.B. ev.controlvalue = 127 oder ev.text = "hello";
+= Inkrementierung von Werten z.B. if (ev.controlvalue + 10 <= 127) ev.controlvalue += 10;
+= Anhängen von Text z.B. ev.text += "\n";
-= Dekrementierung von Werten
*= Multiplikation von Werten z.B. if (ev.type == EVENTTYPE_TEMPO) ev.bpm *= 2;
/= Division von Werten



Funktionen (mehr können im gnscript Paket gefunden werden)
random(maxvalue)      eine zufällige Zahl zwischen 0 und maxvalue-1
replace(text, pattern, against)         ersetzt vorkommende Textstellen pattern in text durch against z.B. text.replace('(c)', 'copyright');
text.length()         Anzahl der Zeichen in text
text.index(subtext)   Indexposition des ersten vorkommens von subtext in text oder -1 wenn nicht vorhanden
text.toupper()        ändere alle Zeichen a-z in A-Z
text.tolower()        ändere alle Zeichen A-Z in a-z
text.mid(pos, len)    Textausschnitt ab Position pos und maximaler Länge len
text.left(len)        Textausschnitt ab Position 0 und maximaler Länge len
match(text,regex,options)     prüft ob text zum regulären Ausdruck regex passt
substitute(text, regex, against, options)   ersetzt alle Textstellen von text die zum regulären Ausdruck regex passen durch against z.B. text.substitute('hel.*o', 'HELLO','gi');
round(value)          Zahl runden auf ganze Zahl
song.deleteevent(ev.eventindex())    löscht den Befehl ev





Beispiele für Änderungen:
if (ev.type== EVENTTYPE_TEXT) ev.text = ev.text.toupper();
if (ev.type == EVENTTYPE_SYSEX) song.deleteevent(ev.eventindex());
if (ev.type == EVENTTYPE_CONTROL && ev.controlnr == ctrl_volume) ev.controlvalue = max(127, ev.controlvalue + random(10));
if (ev.type == EVENTTYPE_TEXT && ev.texttype == meta_trackname) ev.text = ev.text.replace(" ", "-");