diff --git a/packages/midi/README.md b/packages/midi/README.md index faf9993f..cefe40ab 100644 --- a/packages/midi/README.md +++ b/packages/midi/README.md @@ -26,11 +26,11 @@ OUTPUT: - `sysex` - Sends MIDI System Exclusive messages (id: number 0-127 or array of bytes 0-127, data: array of bytes 0-127) - `sysexid` - Sets MIDI System Exclusive ID (number 0-127 or array of bytes 0-127) - `sysexdata` - Sets MIDI System Exclusive data (array of bytes 0-127) -- `nrpnn` - Sets MIDI NRPN non-registered parameter number (array of bytes 0-127) -- `nrpv` - Sets MIDI NRPN non-registered parameter value (0-127) -- `midicmd` - Sends MIDI system real-time messages to control timing and transport on MIDI devices. - `midibend` - Sets MIDI pitch bend (-1 - 1) - `miditouch` - Sets MIDI key after touch (0-1) +- `midicmd` - Sends MIDI system real-time messages to control timing and transport on MIDI devices. +- `nrpnn` - Sets MIDI NRPN non-registered parameter number (array of bytes 0-127) +- `nrpv` - Sets MIDI NRPN non-registered parameter value (0-127) INPUT: @@ -56,6 +56,70 @@ In the console, you will see a log of the available MIDI devices as soon as you Selects the MIDI channel to use. If not used, `.midi` will use channel 1 by default. +### control, ccn && ccv + +`control` sends MIDI control change messages to your MIDI device. + +- `ccn` sets the cc number. Depends on your synths midi mapping +- `ccv` sets the cc value. normalized from 0 to 1. + +```javascript +$: note("c a f e").control([74, sine.slow(4)]).midi() +$: note("c a f e").ccn(74).ccv(sine.slow(4)).midi() +``` + +In the above snippet, `ccn` is set to 74, which is the filter cutoff for many synths. `ccv` is controlled by a saw pattern. +Having everything in one pattern, the `ccv` pattern will be aligned to the note pattern, because the structure comes from the left by default. +But you can also control cc messages separately like this: + +```javascript +$: note("c a f e").midi() +$: ccv(sine.segment(16).slow(4)).ccn(74).midi() +``` + +### progNum (Program Change) + +`progNum` control sends MIDI program change messages to switch between different presets/patches on your MIDI device. +Program change values should be numbers between 0 and 127. + +```javascript +// Play notes while changing programs +note("c3 e3 g3").progNum("<0 1 2>").midi() +``` + +Program change messages are useful for switching between different instrument sounds or presets during a performance. +The exact sound that each program number maps to depends on your MIDI device's configuration. + +## sysex, sysexid && sysexdata (System Exclusive Message) + +`sysex`, `sysexid` and `sysexdata` control sends MIDI System Exclusive (SysEx) messages to your MIDI device. +sysEx messages are device-specific commands that allow deeper control over synthesizer parameters. +The value should be an array of numbers between 0-255 representing the SysEx data bytes. + +```javascript +// Send a simple SysEx message +let id = 0x43; //Yamaha +//let id = "0x00:0x20:0x32"; //Behringer ID can be an array of numbers +let data = "0x79:0x09:0x11:0x0A:0x00:0x00"; // Set NSX-39 voice to say "Aa" +$: note("c d e f e d c").sysex(id, data).midi(); +$: note("c d e f e d c").sysexid(id).sysexdata(data).midi(); +``` + +The exact format of SysEx messages depends on your MIDI device's specification. +Consult your device's MIDI implementation guide for details on supported SysEx messages. + +### midibend && miditouch + +`midibend` sets MIDI pitch bend (-1 - 1) +`miditouch` sets MIDI key after touch (0-1) + +```javascript + +$: note("c d e f e d c").midibend(sine.slow(4).range(-0.4,0.4)).midi(); +$: note("c d e f e d c").miditouch(sine.slow(4).range(0,1)).midi(); + +``` + ### midicmd `midicmd` sends MIDI system real-time messages to control timing and transport on MIDI devices. @@ -90,68 +154,4 @@ stack( // "sysex:[sysexid]:[sysexdata]" midicmd("sysex:[0x43]:[0x79:0x09:0x11:0x0A:0x00:0x00]").midi('IAC Driver') ) -``` - -### control, ccn && ccv - -`control` sends MIDI control change messages to your MIDI device. - -- `ccn` sets the cc number. Depends on your synths midi mapping -- `ccv` sets the cc value. normalized from 0 to 1. - -```javascript -$: note("c a f e").control([74, sine.slow(4)]).midi() -$: note("c a f e").ccn(74).ccv(sine.slow(4)).midi() -``` - -In the above snippet, `ccn` is set to 74, which is the filter cutoff for many synths. `ccv` is controlled by a saw pattern. -Having everything in one pattern, the `ccv` pattern will be aligned to the note pattern, because the structure comes from the left by default. -But you can also control cc messages separately like this: - -```javascript -$: note("c a f e").midi() -$: ccv(sine.segment(16).slow(4)).ccn(74).midi() -``` - -### progNum (Program Change) - -`progNum` control sends MIDI program change messages to switch between different presets/patches on your MIDI device. -Program change values should be numbers between 0 and 127. - -```javascript -// Play notes while changing programs -note("c3 e3 g3").pc("<0 1 2>").midi() -``` - -Program change messages are useful for switching between different instrument sounds or presets during a performance. -The exact sound that each program number maps to depends on your MIDI device's configuration. - -## sysex, sysexid && sysexdata (System Exclusive Message) - -`sysex`, `sysexid` and `sysexdata` control sends MIDI System Exclusive (SysEx) messages to your MIDI device. -sysEx messages are device-specific commands that allow deeper control over synthesizer parameters. -The value should be an array of numbers between 0-255 representing the SysEx data bytes. - -```javascript -// Send a simple SysEx message -let id = 0x43; //Yamaha -//let id = "0x00:0x20:0x32"; //Behringer ID can be an array of numbers -let data = "0x79:0x09:0x11:0x0A:0x00:0x00"; // Set NSX-39 voice to say "Aa" -$: note("c d e f e d c").sysex(id, data).midi(); -$: note("c d e f e d c").sysexid(id).sysexdata(data).midi(); -``` - -The exact format of SysEx messages depends on your MIDI device's specification. -Consult your device's MIDI implementation guide for details on supported SysEx messages. - -### midibend && miditouch - -`midibend` sets MIDI pitch bend (-1 - 1) -`miditouch` sets MIDI key after touch (0-1) - -```javascript - -$: note("c d e f e d c").midibend(sine.slow(4).range(-0.4,0.4)).midi(); -$: note("c d e f e d c").miditouch(sine.slow(4).range(0,1)).midi(); - ``` \ No newline at end of file