REAPER JSFX MIDI Processing
Patterns for MIDI utility plugins including note processing, arpeggiators, chord generators, and CC manipulation.
Requires: reaper-jsfx-core for language fundamentals.
Rules
| Rule |
Description |
| midi-basics |
MIDI message structure, receive/send, SysEx handling |
| midi-transform |
Note transposition, velocity scaling, CC mapping |
| midi-generate |
Arpeggiators, sequencers, chord generators |
| midi-routing |
Multi-bus routing, channel filtering, splitting |
Official Documentation
Key Principles
1. MIDI-Only Plugin Structure
desc:MIDI Utility
tags:midi
in_pin:none
out_pin:none
@block
while(midirecv(offset, msg1, msg2, msg3)) (
// Process and forward
midisend(offset, msg1, msg2, msg3);
);
2. Always Forward or Handle All Messages
@block
while(midirecv(offset, msg1, msg2, msg3)) (
status = msg1 & $xF0;
status == $x90 || status == $x80 ? (
// Process notes
process_note(offset, msg1, msg2, msg3);
) : (
// Pass through everything else unchanged
midisend(offset, msg1, msg2, msg3);
);
);
3. Preserve Timing
@block
// Use original offset for timing-critical events
while(midirecv(offset, msg1, msg2, msg3)) (
// Transform but keep original offset
midisend(offset, new_msg1, new_msg2, new_msg3);
);
Quick Reference
1---2name: reaper-jsfx-midi3description: MIDI processing patterns for JSFX plugins. Use when building MIDI utilities, arpeggiators, chord generators, note filters, or CC processors. Triggers on requests for MIDI effects, arpeggiator, chord, transpose, or MIDI routing in JSFX.4license: MIT5---67# REAPER JSFX MIDI Processing89Patterns for MIDI utility plugins including note processing, arpeggiators, chord generators, and CC manipulation.1011**Requires:** [reaper-jsfx-core](../reaper-jsfx-core/SKILL.md) for language fundamentals.1213## Rules1415| Rule | Description |16|------|-------------|17| [midi-basics](./rules/midi-basics.md) | MIDI message structure, receive/send, SysEx handling |18| [midi-transform](./rules/midi-transform.md) | Note transposition, velocity scaling, CC mapping |19| [midi-generate](./rules/midi-generate.md) | Arpeggiators, sequencers, chord generators |20| [midi-routing](./rules/midi-routing.md) | Multi-bus routing, channel filtering, splitting |2122## Official Documentation2324- [JSFX MIDI Functions](https://www.reaper.fm/sdk/js/midi.php)2526## Key Principles2728### 1. MIDI-Only Plugin Structure2930```31desc:MIDI Utility32tags:midi3334in_pin:none35out_pin:none3637@block38while(midirecv(offset, msg1, msg2, msg3)) (39 // Process and forward40 midisend(offset, msg1, msg2, msg3);41);42```4344### 2. Always Forward or Handle All Messages4546```47@block48while(midirecv(offset, msg1, msg2, msg3)) (49 status = msg1 & $xF0;5051 status == $x90 || status == $x80 ? (52 // Process notes53 process_note(offset, msg1, msg2, msg3);54 ) : (55 // Pass through everything else unchanged56 midisend(offset, msg1, msg2, msg3);57 );58);59```6061### 3. Preserve Timing6263```64@block65// Use original offset for timing-critical events66while(midirecv(offset, msg1, msg2, msg3)) (67 // Transform but keep original offset68 midisend(offset, new_msg1, new_msg2, new_msg3);69);70```7172## Quick Reference7374| Use Case | Rule |75|----------|------|76| Understanding MIDI | [midi-basics](./rules/midi-basics.md) |77| Transpose / Velocity | [midi-transform](./rules/midi-transform.md) |78| Arpeggiator | [midi-generate](./rules/midi-generate.md) |79| Channel Filter | [midi-routing](./rules/midi-routing.md) |