
mmd-device-library
by cjgdev
A human-readable, text-based format for creating and automating MIDI sequences
SKILL.md
name: mmd-device-library description: Create custom MIDI device libraries for MIDI Markdown with aliases, parameters, and documentation. Use when the user wants to create device-specific aliases for hardware (guitar processors, synthesizers, effects units), document MIDI implementations, or build reusable command libraries.
Device Library Creation Skill
Overview
This skill guides you through creating custom device libraries for MIDI Markdown. Device libraries provide high-level aliases for MIDI hardware, making automation code more readable and maintainable.
What is a Device Library?
A device library is an MMD file containing:
- Device metadata (name, manufacturer, MIDI channel)
- Alias definitions for device-specific commands
- Documentation for each alias
- Optional computed values and conditionals
Example usage:
@import "devices/my_device.mmd"
[00:00.000]
- my_device_preset 1.5 # Instead of: cc 1.32.0; pc 1.5
Quick Start
Minimal Device Library
---
device: "My Device Name"
manufacturer: "Company Name"
version: 1.0.0
default_channel: 1
---
@alias device_preset pc.{ch}.{preset} "Load preset (0-127)"
Save as devices/my_device.mmd and import:
@import "devices/my_device.mmd"
[00:00.000]
- device_preset 1.42
Step-by-Step Creation
Step 1: Gather MIDI Implementation
You need:
- MIDI Implementation Chart (from device manual)
- CC numbers for device functions
- PC behavior (how program changes work)
- SysEx messages (if applicable)
- Channel assignment (default MIDI channel)
Where to find:
- Device user manual (appendix)
- Manufacturer website (downloads section)
- MIDI implementation PDF/chart
Step 2: Create Library File
Create devices/my_device.mmd:
---
device: "Device Name"
manufacturer: "Company"
version: 1.0.0
default_channel: 1
documentation: "https://example.com/midi-docs"
midi_channels: [1]
capabilities:
- program_change
- control_change
- sysex
---
# ==============================================
# Device Name MIDI Library
# ==============================================
# MIDI Implementation Overview:
# - Channel: 1 (default)
# - Program Change: 0-127
# - Control Change: See sections below
# - SysEx: F0 00 01 02 ... F7
# ==============================================
# Section 1: Preset Management
# ==============================================
@alias device_preset pc.{ch}.{preset:0-127} "Load preset (0-127)"
# Add more aliases...
Step 3: Document Your Aliases
Each alias needs a description:
@alias device_volume cc.{ch}.7.{value:0-127} "Set master volume (0-127)"
Description guidelines:
- What it does
- Parameter ranges
- Special notes (if any)
Step 4: Test the Library
Create test file:
---
title: "Device Library Test"
ppq: 480
---
@import "devices/my_device.mmd"
[00:00.000]
- device_preset 1.0
- device_volume 1.100
Validate:
mmdc validate test.mmd
mmdc inspect test.mmd
Alias Patterns
Simple Aliases
Map device functions to CC or PC:
@alias device_function cc.{ch}.{cc_number}.{value} "Description"
Examples:
@alias amp_gain cc.{ch}.1.{value:0-127} "Amp gain (0-127)"
@alias delay_time cc.{ch}.12.{value:0-127} "Delay time (0-127)"
@alias reverb_mix cc.{ch}.91.{value:0-127} "Reverb mix (0-127)"
Multi-Command Aliases
Combine multiple MIDI commands:
@alias device_load {ch}.{bank}.{preset} "Load bank and preset"
- cc {ch}.32.{bank} # Bank select LSB
- cc {ch}.0.0 # Bank select MSB
- pc {ch}.{preset} # Program change
@end
Aliases with Defaults
Provide default values for optional parameters:
@alias device_volume {ch}.{value=100} "Set volume (default: 100)"
- cc {ch}.7.{value}
@end
# Usage
- device_volume 1 # Uses default 100
- device_volume 1.75 # Uses 75
Enum Parameters
Named values for parameters:
@alias device_routing {ch}.{mode=series:0,parallel:1,a_only:2,b_only:3} "Set routing mode"
- cc {ch}.85.{mode}
@end
# Usage
- device_routing 1.parallel # Sends value 1
- device_routing 1.a_only # Sends value 2
Computed Values
Transform parameters before sending:
@alias device_tempo {ch} {bpm:40-300} "Set tempo (40-300 BPM)"
{midi_val = int((${bpm} - 40) * 127 / 260)}
- cc {ch}.14.{midi_val}
@end
# BPM 120 → MIDI value 39
Common Device Patterns
Guitar Processor (Quad Cortex, Helix, Kemper)
# Preset loading
@alias cortex_load {ch}.{setlist}.{scene}.{preset} "Load complete preset"
- cc {ch}.32.{setlist} # Setlist
- cc {ch}.0.{scene} # Scene/group
- pc {ch}.{preset} # Preset
@end
# Scene switching
@alias cortex_scene pc.{ch}.{scene:0-7} "Switch scene (A-H = 0-7)"
# Expression pedals
@alias cortex_exp1 cc.{ch}.11.{value:0-127} "Expression pedal 1"
@alias cortex_exp2 cc.{ch}.12.{value:0-127} "Expression pedal 2"
# Stomp switches
@alias cortex_stomp_a cc.{ch}.81.{state:0-127} "Stomp A (0=off, 127=on)"
@alias cortex_stomp_a_on cc.{ch}.81.127 "Stomp A on"
@alias cortex_stomp_a_off cc.{ch}.81.0 "Stomp A off"
# Tap tempo
@alias cortex_tap_tempo cc.{ch}.80.127 "Tap tempo"
# Tuner
@alias cortex_tuner cc.{ch}.68.{state:0-127} "Tuner (0=off, 127=on)"
Multi-FX Unit (Eventide, Strymon)
# Preset selection
@alias h90_preset pc.{ch}.{preset:0-127} "Load preset"
# Algorithm selection
@alias h90_algo_a cc.{ch}.82.{algo:0-52} "Algorithm for path A"
@alias h90_algo_b cc.{ch}.83.{algo:0-52} "Algorithm for path B"
# Mix control
@alias h90_mix cc.{ch}.84.{percent:0-100} "A/B mix (0=A, 100=B)"
# Routing
@alias h90_routing cc.{ch}.85.{mode=series:0,parallel:1} "Routing mode"
# Performance controls
@alias h90_bypass cc.{ch}.102.{state=active:127,bypassed:0} "Bypass"
@alias h90_infinity cc.{ch}.90.127 "Infinity (freeze)"
@alias h90_hotswitch cc.{ch}.91.127 "HotSwitch"
Synthesizer
# Oscillator controls
@alias synth_osc1_wave cc.{ch}.70.{wave=saw:0,square:32,tri:64,sine:96} "OSC1 waveform"
@alias synth_osc1_detune cc.{ch}.71.{value:0-127} "OSC1 detune"
# Filter controls
@alias synth_filter_cutoff cc.{ch}.74.{value:0-127} "Filter cutoff"
@alias synth_filter_resonance cc.{ch}.71.{value:0-127} "Filter resonance"
# Envelope
@alias synth_env_attack cc.{ch}.73.{value:0-127} "Envelope attack"
@alias synth_env_decay cc.{ch}.75.{value:0-127} "Envelope decay"
@alias synth_env_sustain cc.{ch}.76.{value:0-127} "Envelope sustain"
@alias synth_env_release cc.{ch}.77.{value:0-127} "Envelope release"
# LFO
@alias synth_lfo_rate cc.{ch}.78.{value:0-127} "LFO rate"
@alias synth_lfo_depth cc.{ch}.79.{value:0-127} "LFO depth"
Organization Best Practices
Section Headers
Organize aliases by function:
# ==============================================
# Preset Management
# ==============================================
@alias device_preset ...
@alias device_bank ...
# ==============================================
# Effects Controls
# ==============================================
@alias device_reverb ...
@alias device_delay ...
# ==============================================
# Expression Pedals
# ==============================================
@alias device_exp1 ...
@alias device_exp2 ...
Naming Conventions
Prefix with device name:
@alias cortex_preset ... # ✓ Clear
@alias preset ... # ✗ Too generic
Use descriptive names:
@alias amp_gain ... # ✓ Descriptive
@alias ag ... # ✗ Unclear
Group related functions:
@alias stomp_a_on ...
@alias stomp_a_off ...
@alias stomp_a_toggle ...
Parameter Naming
Use meaningful names:
{ch} # Channel
{preset} # Preset number
{value} # Generic value
{percent} # Percentage (0-100)
{state} # On/off state
{mode} # Mode selection
Include ranges in descriptions:
@alias device_tempo {ch} {bpm:40-300} "Set tempo (40-300 BPM)"
Advanced Features
Conditional Aliases
Different behavior based on parameters:
@alias smart_load {ch}.{preset}.{device_type} "Device-aware preset load"
@if {device_type} == "a"
- cc {ch}.32.0
- pc {ch}.{preset}
@elif {device_type} == "b"
- cc {ch}.71.{preset}
@end
@end
SysEx Support
Include SysEx messages:
@alias device_patch_dump "Request patch dump"
- sysex F0 00 01 06 02 F7
@end
Macros for Common Sequences
@alias scene_change_smooth {ch}.{old_scene}.{new_scene} "Smooth scene transition"
# Fade out old scene
- cc {ch}.7.curve(100, 0, ease-in)
# Switch scene
[+500ms]
- pc {ch}.{new_scene}
# Fade in new scene
[@]
- cc {ch}.7.curve(0, 100, ease-out)
@end
Validation and Testing
Validate Library Structure
mmdc validate devices/my_device.mmd
Test Each Alias
Create comprehensive test file:
---
title: "Device Library Test Suite"
ppq: 480
---
@import "devices/my_device.mmd"
# Test all aliases
[00:00.000]
- device_preset 1.0
- device_volume 1.100
- device_function1 1.50
# ... test each alias
# Test edge cases
[00:10.000]
- device_preset 1.127 # Max value
- device_volume 1.0 # Min value
- device_function1 1.127 # Max value
Verify MIDI Output
# Inspect generated events
mmdc inspect test.mmd
# Compile and check MIDI
mmdc compile test.mmd -o test.mid
# Play back to verify
mmdc play test.mmd --port 0
Documentation Template
Complete library template:
---
device: "Device Full Name"
manufacturer: "Company Name"
version: 1.0.0
default_channel: 1
documentation: "https://example.com/midi-implementation"
midi_channels: [1]
date_created: "2025-01-15"
date_modified: "2025-01-15"
author: "Your Name"
capabilities:
- program_change
- control_change
- sysex
notes: "Additional notes about this device"
---
# ==============================================
# Device Name MIDI Library
# ==============================================
/**
* MIDI Implementation Summary
*
* Channels: 1 (default), supports 1-16
* Program Change: 0-127 (presets)
* Control Change: See sections below
* SysEx: See SysEx section
*
* Quick Start:
* @import "devices/device_name.mmd"
* - device_preset 1.0
*
* Documentation: https://example.com/docs
*/
# ==============================================
# Preset Management
# ==============================================
@alias device_preset pc.{ch}.{preset:0-127} "Load preset (0-127)"
@alias device_bank_preset {ch}.{bank:0-7}.{preset:0-127} "Load bank and preset"
- cc {ch}.32.{bank}
- pc {ch}.{preset}
@end
# ==============================================
# Effects Controls
# ==============================================
@alias device_reverb cc.{ch}.91.{value:0-127} "Reverb mix (0-127)"
@alias device_delay cc.{ch}.92.{value:0-127} "Delay mix (0-127)"
# ... Add more sections as needed
Real-World Examples
Study existing device libraries:
# View Quad Cortex implementation
cat devices/quad_cortex.mmd
# View Eventide H90 implementation
cat devices/eventide_h90.mmd
# View Helix implementation
cat devices/helix.mmd
These provide patterns for:
- Complex preset loading sequences
- Expression pedal mapping
- Stomp switch control
- Tempo synchronization
- Scene management
Publishing Your Library
1. Test Thoroughly
# Validate
mmdc validate devices/my_device.mmd
# Test all aliases
mmdc validate test_suite.mmd
# Test with actual device
mmdc play test_suite.mmd --port "Device Name"
2. Document Usage
Add README or examples:
/**
* Usage Examples
*
* Basic preset load:
* - device_preset 1.42
*
* Bank select:
* - device_bank_preset 1.2.5
*
* Effects control:
* - device_reverb 1.75
*/
3. Share with Community
- Add to project
devices/directory - Create pull request
- Include test files
- Document MIDI implementation source
Troubleshooting
Alias Not Working
# Check import
grep "@import" your_file.mmd
# Verify alias definition
grep "@alias device_name" devices/my_device.mmd
# Test with raw MIDI
- cc 1.XX.YY # Instead of alias
Parameter Count Mismatch
# Check parameter count
@alias name {p1}.{p2} "..."
# Usage must match
- name 1.2 # ✓ Correct
- name 1 # ✗ Missing parameter
Value Out of Range
# Add range constraints
@alias func {ch}.{value:0-100} "..."
# Or use computed values
{clamped = min(127, max(0, ${value}))}
Related Skills and Resources
Skills:
- mmd-writing - MMD syntax reference
- mmd-debugging - Troubleshooting aliases
- mmd-cli - Testing and validation
Resources:
- devices/ - Existing device libraries (6 examples)
- examples/04_device_libraries/ - Usage examples
- docs/user-guide/alias-system.md - Alias documentation
- spec.md - Complete alias syntax reference
Quick Reference
Alias Syntax
# Simple alias
@alias name command.{param} "Description"
# Multi-command alias
@alias name {p1}.{p2} "Description"
- command1
- command2
@end
# With defaults
@alias name {param=default} "Description"
# With enums
@alias name {param=opt1:val1,opt2:val2} "Description"
# With computed values
@alias name {param} "Description"
{computed = expression}
- command ${computed}
@end
Testing Workflow
1. mmdc validate devices/my_device.mmd
2. mmdc validate test_file.mmd
3. mmdc inspect test_file.mmd
4. mmdc play test_file.mmd --port 0
For complete device library examples, see the devices/ directory in the project.
スコア
総合スコア
リポジトリの品質指標に基づく評価
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 100以上
3ヶ月以内に更新がある
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
レビュー
レビュー機能は近日公開予定です
