diff --git a/synths/moog_minitaur.yaml b/synths/moog_minitaur.yaml index a70cd3b..76c3b26 100644 --- a/synths/moog_minitaur.yaml +++ b/synths/moog_minitaur.yaml @@ -1,30 +1,104 @@ name: Minitaur manufacturer: Moog -midi_channel: 2 +midi_channel: 16 cc_map: + # Oscillators + vco1_level: + cc: 15 + vco2_level: + cc: 16 + vco2_frequency: + cc: 17 + notes: "64=center/unison" + vco2_beat: + cc: 18 + notes: "64=center, fine detune" + vco1_wave: + cc: 70 + notes: "0-63=saw, 64-127=square" + vco2_wave: + cc: 71 + notes: "0-63=saw, 64-127=square" + hard_sync: + cc: 80 + notes: "0-63=off, 64-127=on" + + # Filter filter_cutoff: - cc: 22 + cc: 19 filter_resonance: - cc: 23 + cc: 21 filter_eg_amount: + cc: 22 + filter_kb_tracking: + cc: 20 + notes: "default 32 (~50%)" + + # Filter envelope + vcf_attack: + cc: 23 + vcf_decay: cc: 24 - osc2_frequency: - cc: 18 - osc_mix: - cc: 15 + notes: "shared decay/release" + vcf_sustain: + cc: 25 + + # Amp envelope + vca_attack: + cc: 28 + vca_decay: + cc: 29 + notes: "shared decay/release" + vca_sustain: + cc: 30 + + # Amp vca_volume: cc: 7 - eg_attack: - cc: 105 - eg_decay: - cc: 106 - eg_sustain: - cc: 107 - eg_release: - cc: 108 + + # LFO + lfo_rate: + cc: 3 + lfo_vcf_amount: + cc: 12 + lfo_vco_amount: + cc: 13 + lfo_shape: + cc: 85 + notes: "0-25=tri, 26-51=sq, 52-76=saw, 77-101=s&h, 102-127=filter_eg" + lfo_midi_sync: + cc: 87 + notes: "0-63=internal, 64-127=midi clock" + lfo_key_trigger: + cc: 82 + notes: "0-63=off, 64-127=on" + lfo_vco2_only: + cc: 112 + notes: "0-63=off, 64-127=on" + + # Performance glide_rate: cc: 5 - legato_mode: - cc: 114 - value_range: [0, 127] - notes: "0=off, 127=on" + glide_switch: + cc: 65 + notes: "0-63=off, 64-127=on" + glide_type: + cc: 92 + notes: "0-42=linear, 43-85=time, 86-127=exponential" + glide_legato: + cc: 83 + notes: "0-63=always, 64-127=legato only" + eg_trigger_mode: + cc: 73 + notes: "0-42=legato, 43-85=off, 86-127=reset" + release_switch: + cc: 72 + notes: "0-63=off, 64-127=on" + + # Velocity + filter_vel_sens: + cc: 89 + notes: "default 64 (~50%)" + vca_vel_sens: + cc: 90 + notes: "default 64 (~50%)" diff --git a/synths/roland_s1.yaml b/synths/roland_s1.yaml new file mode 100644 index 0000000..6b76b90 --- /dev/null +++ b/synths/roland_s1.yaml @@ -0,0 +1,93 @@ +name: S-1 +manufacturer: Roland +midi_channel: 1 +cc_map: + # Oscillator + osc_range: + cc: 14 + osc_range_fine_tune: + cc: 76 + osc_square_level: + cc: 19 + osc_saw_level: + cc: 20 + osc_sub_level: + cc: 21 + osc_sub_octave_type: + cc: 22 + osc_noise_level: + cc: 23 + osc_square_pw: + cc: 15 + osc_pwm_source: + cc: 16 + osc_pitch_bend_sens: + cc: 18 + noise_mode: + cc: 78 + + # Filter + filter_cutoff: + cc: 74 + filter_resonance: + cc: 71 + filter_env_depth: + cc: 24 + filter_lfo_depth: + cc: 25 + filter_kb_follow: + cc: 26 + filter_bend_sens: + cc: 27 + + # Envelope + env_attack: + cc: 73 + env_decay: + cc: 75 + env_sustain: + cc: 30 + env_release: + cc: 72 + env_mode: + cc: 28 + env_trigger_mode: + cc: 29 + + # LFO + lfo_rate: + cc: 3 + lfo_waveform: + cc: 12 + lfo_pitch_depth: + cc: 13 + lfo_mod_depth: + cc: 17 + lfo_key_trigger: + cc: 105 + lfo_sync_mode: + cc: 106 + + # Performance + portamento_time: + cc: 5 + portamento_mode: + cc: 31 + portamento_switch: + cc: 65 + polyphony_mode: + cc: 80 + keyboard_transpose: + cc: 77 + + # Effects + reverb_time: + cc: 89 + reverb_level: + cc: 91 + delay_time: + cc: 90 + delay_level: + cc: 92 + chorus_type: + cc: 93 diff --git a/synths/roland_tb03.yaml b/synths/roland_tb03.yaml index 0445c4a..479d82b 100644 --- a/synths/roland_tb03.yaml +++ b/synths/roland_tb03.yaml @@ -1,6 +1,6 @@ name: TB-03 manufacturer: Roland -midi_channel: 3 +midi_channel: 14 cc_map: tuning: cc: 104 diff --git a/tests/test_synth_yamls.py b/tests/test_synth_yamls.py index a3dc182..d3b5d8c 100644 --- a/tests/test_synth_yamls.py +++ b/tests/test_synth_yamls.py @@ -12,9 +12,9 @@ def test_minitaur_yaml_loads(): synth = SynthDefinition(**data) assert synth.name == "Minitaur" assert synth.manufacturer == "Moog" - assert synth.midi_channel == 2 + assert synth.midi_channel == 16 assert "filter_cutoff" in synth.cc_map - assert synth.cc_map["filter_cutoff"].cc == 22 + assert synth.cc_map["filter_cutoff"].cc == 19 def test_tb03_yaml_loads(): @@ -22,11 +22,21 @@ def test_tb03_yaml_loads(): synth = SynthDefinition(**data) assert synth.name == "TB-03" assert synth.manufacturer == "Roland" - assert synth.midi_channel == 3 + assert synth.midi_channel == 14 assert "cutoff" in synth.cc_map assert synth.cc_map["cutoff"].cc == 74 +def test_s1_yaml_loads(): + data = yaml.safe_load((SYNTHS_DIR / "roland_s1.yaml").read_text()) + synth = SynthDefinition(**data) + assert synth.name == "S-1" + assert synth.manufacturer == "Roland" + assert synth.midi_channel == 1 + assert "filter_cutoff" in synth.cc_map + assert synth.cc_map["filter_cutoff"].cc == 74 + + def test_all_synth_yamls_valid(): yaml_files = list(SYNTHS_DIR.glob("*.yaml")) + list(SYNTHS_DIR.glob("*.yml")) assert len(yaml_files) > 0, "No synth YAML files found"