Référence du langage NeuroScript
NeuroScript modifie les événements MIDI d'une route. Les instructions de premier niveau s'exécutent une fois pour chaque événement entrant. Un événement passe sans modification à moins qu'une règle ne le modifie, n'en produise un autre ou ne le supprime.
Faire correspondre les événements
Utilisez when <condition> { … }, avec un bloc else { … } facultatif.
when is note and channel == 1 and velocity > 110 {
velocity = 110
}Les types d'événements précis comprennent note_on, note_off, cc, program, bend, poly_pressure, channel_pressure, clock, start, continue, stop, active_sensing, reset et sysex. Les familles comprennent note, aftertouch, channel_voice, realtime, transport, system et any.
when is [note, cc] { channel = 1 }
when is note and note in C3..C4 { transpose(+12) }
when is cc and controller in [1, 74] { drop }Utilisez ==, !=, <, <=, >, >=, and, or et not dans les conditions.
Champs d'événement
Les scripts peuvent lire kind, channel, note, velocity, controller, value, program, bend et pressure. Le champ kind est en lecture seule. Les autres champs peuvent recevoir une valeur lorsqu'ils s'appliquent à l'événement actuel.
when is note {
note = clamp(note + 12, 0, 127)
velocity = clamp(velocity + 10, 1, 127)
channel = 2
}Produire et supprimer des événements
drop supprime l'événement actuel. emit current produit un instantané de l'événement actuel. Les constructeurs d'événements utilisent des arguments nommés et le canal de l'événement actuel.
when is cc and controller == 1 {
emit cc(controller: 74, value: value)
}
when is note and velocity > 100 {
emit note_on(note: note + 12, velocity: velocity / 2) after 1/8 note
}Les constructeurs disponibles comprennent cc, cc14, note_on, note_off, bend, program, bank, aftertouch, poly_pressure, channel_pressure, nrpn et sysex.
Un événement produit ne supprime pas automatiquement l'événement entrant. Ajoutez drop lorsque seul l'événement produit doit continuer.
Liaisons et état
Utilisez let pour une valeur immuable calculée pendant un événement.
when is note {
let semitones = clamp(cc(1) / 11, 0, 12)
note = clamp(note + semitones, 0, 127)
}Utilisez l'état de route ou de canal lorsqu'une logique doit conserver une valeur entre les événements.
state route pedal: Bool = false
state channel hits: Int = 0
when is cc and controller == 64 {
state.pedal = value >= 64
}Les types d'état pris en charge sont Int, Bool, Note, Ratio, Duration, Kind et Policy.
Fonctions courantes
- Hauteur :
transpose,transpose_or_drop,octave,octave_or_drop,note_clamp,note_wrap - Vélocité et canal :
velocity_scale,velocity_curve,channel_map - Mathématiques :
clamp,scale,wrap,min,max,abs,lerp,quantize,deadzone,clamp7,clamp14 - Valeurs actuelles de la route :
cc(number),cc14(number),note_velocity(note),held_notes()
Temporisation
Les événements différés acceptent des durées comme 120ms, 2 beats ou 1/8 note. La temporisation suit le contexte d'horloge disponible pour la route.
when is note_on {
emit current after 120ms
drop
}Valider et tester
Sélectionnez Valider dans l'éditeur de route avant d'enregistrer. Utilisez le simulateur pour des événements isolés, puis testez le script avec la source et la destination réelles.
Consultez les recettes musicales pour d'autres exemples.
