Skip to content

Commit 1419b2f

Browse files
authored
Expand Roland S-1 MIDI CC definition to full spec (#9)
* Expand Roland S-1 MIDI CC definition to full 54-parameter spec Add 19 missing CC parameters (mod wheel, pan, expression, damper pedal, LFO mode, chord voice controls, OSC draw/chop controls) and document discrete value mappings via notes fields for 17 switched parameters. * Fix E501 line too long in S-1 test * Fix S-1 spec mismatches from PR review - Default MIDI channel 1 -> 3 per Roland documentation - LFO waveform: add missing inv-sawtooth (6 waveforms, not 5) - osc_draw_sw: three states (off/step/slope), not binary on/off * Set S-1 MIDI channel to 13
1 parent 9a61206 commit 1419b2f

2 files changed

Lines changed: 105 additions & 39 deletions

File tree

synths/roland_s1.yaml

Lines changed: 94 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,55 @@
11
name: S-1
22
manufacturer: Roland
3-
midi_channel: 1
3+
midi_channel: 13
44
cc_map:
5-
# Oscillator
5+
# ── Controls ──────────────────────────────────
6+
mod_wheel:
7+
cc: 1
8+
portamento_time:
9+
cc: 5
10+
pan:
11+
cc: 10
12+
notes: "64=center"
13+
expression:
14+
cc: 11
15+
damper_pedal:
16+
cc: 64
17+
notes: "0-63=off, 64-127=on"
18+
portamento_switch:
19+
cc: 65
20+
notes: "0-63=off, 64-127=on"
21+
22+
# ── LFO ───────────────────────────────────────
23+
lfo_rate:
24+
cc: 3
25+
lfo_waveform:
26+
cc: 12
27+
notes: "0-21=sawtooth, 22-42=inv-sawtooth, 43-63=triangle, 64-84=square, 85-106=random, 107-127=noise"
28+
lfo_mod_depth:
29+
cc: 17
30+
lfo_mode:
31+
cc: 79
32+
notes: "0-63=normal, 64-127=fast"
33+
lfo_key_trigger:
34+
cc: 105
35+
notes: "0-63=off, 64-127=on"
36+
lfo_sync:
37+
cc: 106
38+
notes: "0-63=off, 64-127=on"
39+
40+
# ── Oscillator ────────────────────────────────
41+
osc_lfo_pitch:
42+
cc: 13
643
osc_range:
744
cc: 14
8-
osc_range_fine_tune:
9-
cc: 76
45+
notes: "0-21=64ft, 22-42=32ft, 43-63=16ft, 64-84=8ft, 85-106=4ft, 107-127=2ft"
46+
osc_square_pw:
47+
cc: 15
48+
osc_pwm_source:
49+
cc: 16
50+
notes: "0-42=manual, 43-85=LFO, 86-127=envelope"
51+
osc_pitch_bend_sens:
52+
cc: 18
1053
osc_square_level:
1154
cc: 19
1255
osc_saw_level:
@@ -15,18 +58,17 @@ cc_map:
1558
cc: 21
1659
osc_sub_octave_type:
1760
cc: 22
61+
notes: "0-42=-2oct-asym, 43-85=-2oct, 86-127=-1oct"
1862
osc_noise_level:
1963
cc: 23
20-
osc_square_pw:
21-
cc: 15
22-
osc_pwm_source:
23-
cc: 16
24-
osc_pitch_bend_sens:
25-
cc: 18
64+
osc_range_fine_tune:
65+
cc: 76
66+
notes: "64=center"
2667
noise_mode:
2768
cc: 78
69+
notes: "0-63=pink, 64-127=white"
2870

29-
# Filter
71+
# ── Filter ────────────────────────────────────
3072
filter_cutoff:
3173
cc: 74
3274
filter_resonance:
@@ -40,7 +82,7 @@ cc_map:
4082
filter_bend_sens:
4183
cc: 27
4284

43-
# Envelope
85+
# ── Envelope ──────────────────────────────────
4486
env_attack:
4587
cc: 73
4688
env_decay:
@@ -49,45 +91,60 @@ cc_map:
4991
cc: 30
5092
env_release:
5193
cc: 72
52-
env_mode:
94+
amp_env_mode:
5395
cc: 28
96+
notes: "0-63=gate, 64-127=envelope"
5497
env_trigger_mode:
5598
cc: 29
99+
notes: "0-42=LFO, 43-85=gate, 86-127=gate+trig"
56100

57-
# LFO
58-
lfo_rate:
59-
cc: 3
60-
lfo_waveform:
61-
cc: 12
62-
lfo_pitch_depth:
63-
cc: 13
64-
lfo_mod_depth:
65-
cc: 17
66-
lfo_key_trigger:
67-
cc: 105
68-
lfo_sync_mode:
69-
cc: 106
70-
71-
# Performance
72-
portamento_time:
73-
cc: 5
101+
# ── Performance ───────────────────────────────
74102
portamento_mode:
75103
cc: 31
76-
portamento_switch:
77-
cc: 65
78-
polyphony_mode:
79-
cc: 80
104+
notes: "0-42=off, 43-85=on, 86-127=auto"
80105
keyboard_transpose:
81106
cc: 77
107+
notes: "64=center"
108+
polyphony_mode:
109+
cc: 80
110+
notes: "0-31=mono, 32-63=unison, 64-95=poly, 96-127=chord"
111+
112+
# ── Chord ─────────────────────────────────────
113+
chord_voice_2_sw:
114+
cc: 81
115+
notes: "0-63=off, 64-127=on"
116+
chord_voice_3_sw:
117+
cc: 82
118+
notes: "0-63=off, 64-127=on"
119+
chord_voice_4_sw:
120+
cc: 83
121+
notes: "0-63=off, 64-127=on"
122+
chord_voice_2_key_shift:
123+
cc: 85
124+
chord_voice_3_key_shift:
125+
cc: 86
126+
chord_voice_4_key_shift:
127+
cc: 87
82128

83-
# Effects
129+
# ── Effects ───────────────────────────────────
84130
reverb_time:
85131
cc: 89
86-
reverb_level:
87-
cc: 91
88132
delay_time:
89133
cc: 90
134+
reverb_level:
135+
cc: 91
90136
delay_level:
91137
cc: 92
92138
chorus_type:
93139
cc: 93
140+
141+
# ── OSC Draw / Chop ──────────────────────────
142+
osc_draw_multiply:
143+
cc: 102
144+
osc_chop_overtone:
145+
cc: 103
146+
osc_chop_comb:
147+
cc: 104
148+
osc_draw_sw:
149+
cc: 107
150+
notes: "0-42=off, 43-85=step, 86-127=slope"

tests/test_synth_yamls.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,18 @@ def test_s1_yaml_loads():
3232
synth = SynthDefinition(**data)
3333
assert synth.name == "S-1"
3434
assert synth.manufacturer == "Roland"
35-
assert synth.midi_channel == 1
36-
assert "filter_cutoff" in synth.cc_map
35+
assert synth.midi_channel == 13
36+
assert len(synth.cc_map) == 54
37+
# Verify core parameters
3738
assert synth.cc_map["filter_cutoff"].cc == 74
39+
assert synth.cc_map["polyphony_mode"].cc == 80
40+
expected_notes = "0-31=mono, 32-63=unison, 64-95=poly, 96-127=chord"
41+
assert synth.cc_map["polyphony_mode"].notes == expected_notes
42+
# Verify draw/chop section present
43+
assert synth.cc_map["osc_draw_multiply"].cc == 102
44+
assert synth.cc_map["osc_draw_sw"].cc == 107
45+
# Verify chord section present
46+
assert synth.cc_map["chord_voice_2_sw"].cc == 81
3847

3948

4049
def test_all_synth_yamls_valid():

0 commit comments

Comments
 (0)