diff options
| author | 2025-11-23 09:07:02 -0800 | |
|---|---|---|
| committer | 2025-11-23 18:07:02 +0100 | |
| commit | 41087f4e7db4fb122e549dc3b3e53147df62e5ed (patch) | |
| tree | 5bb60173ac9ec178131aa9954cdf379714a20cb3 | |
| parent | 2b6a57013ae158b0fa85e9c6e789bf35327aad4e (diff) | |
sequential/prophet5.cpp: Added interactive internal artwork. (#14575)
Also increased the resolution of most knob adjusters and set reasonable defaults.
| -rw-r--r-- | src/mame/layout/sequential_prophet5.lay | 1159 | ||||
| -rw-r--r-- | src/mame/sequential/prophet5.cpp | 137 |
2 files changed, 1255 insertions, 41 deletions
diff --git a/src/mame/layout/sequential_prophet5.lay b/src/mame/layout/sequential_prophet5.lay new file mode 100644 index 00000000000..10ff66121d1 --- /dev/null +++ b/src/mame/layout/sequential_prophet5.lay @@ -0,0 +1,1159 @@ +<?xml version="1.0"?> +<!-- +license:CC0-1.0 +copyright-holders:m1macrophage +--> +<mamelayout version="2"> + <!-- labels --> + <element name="transparent"><rect><color red="0" green="0" blue="0" alpha="0"/></rect></element> + <repeat count="8"> + <param name="i" start="1" increment="1"/> + <element name="txt_~i~"><text string="~i~"><color red="0.86" green="0.86" blue="0.86"/></text></element> + </repeat> + <element name="txt_polymod"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="POLY - MOD"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_lfo"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="LFO"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_wheelmod"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="WHEEL - MOD"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_oscillator_a"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="OSCILLATOR A"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_oscillator_b"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="OSCILLATOR B"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_mixer"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="MIXER"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_cass"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="CASSETTE"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_filter"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="FILTER"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_amp"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="AMPLIFIER"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_programmer"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="PROGRAMMER"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_source_amount"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="SOURCE AMOUNT"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_destination"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="DESTINATION"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_shape"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="SHAPE"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_prog_sel"> + <rect><color red="0.16" green="0.16" blue="0.16"/></rect> + <text string="PROGRAM SELECT"><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="txt_freq_a"><text string="FREQ A"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_freq_b"><text string="FREQ B"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_pw_a"><text string="PW A"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_pw_b"><text string="PW B"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_filt_env"><text string="FILT ENV" align="1"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_osc_a"><text string="OSC A"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_osc_b"><text string="OSC B"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_osc_b_l"><text string="OSC B" align="1"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_noise"><text string="NOISE"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_noise_l"><text string="NOISE" align="1"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_frequency"><text string="FREQUENCY"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_source_mix"><text string="SOURCE MIX"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_lfo_r"><text string="LFO" align="2"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_pulse_width"><text string="PULSE WIDTH"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_sync"><text string="SYNC"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_fine"><text string="FINE"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_lo_freq"><text string="LO FREQ"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_attack"><text string="ATTACK"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_decay"><text string="DECAY"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_sustain"><text string="SUSTAIN"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_release"><text string="RELEASE"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_cutoff"><text string="CUTOFF"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_resonance"><text string="RESONANCE"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_env_amt"><text string="ENVELOPE AMOUNT"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_keyboard"><text string="KEYBOARD"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_pitch"><text string="PITCH"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_mod"><text string="MOD"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_save"><text string="SAVE"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_load"><text string="LOAD"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_to_tape"><text string="TO TAPE"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_from_tape"><text string="FROM TAPE"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_glide"><text string="GLIDE"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_master_tune"><text string="MASTER TUNE"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_volume"><text string="VOLUME"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_unison"><text string="UNISON"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_tune"><text string="TUNE"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_A440"><text string="A-440"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_preset"><text string="PRESET"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_record"><text string="RECORD"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_bank"><text string="BANK"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_select"><text string="SELECT"><color red="0.86" green="0.86" blue="0.86"/></text></element> + <element name="txt_program"><text string="PROGRAM"><color red="0.86" green="0.86" blue="0.86"/></text></element> + + <!-- case elements --> + <element name="wood"><rect><color red="0.71" green="0.46" blue="0.28"/></rect></element> + <element name="edgewood"><rect><color red="0.50" green="0.30" blue="0.22"/></rect></element> + <element name="darkwood"><rect><color red="0.32" green="0.21" blue="0.18"/></rect></element> + <element name="panel"><rect><color red="0.16" green="0.16" blue="0.16"/></rect></element> + <element name="silverrect"> + <image><data><![CDATA[ + <rect fill="#a7a7a7" stroke="none" x="1" y="1" width="166" height="40" rx="10" ry="10"/> + ]]></data></image> + </element> + <element name="script_warning" defstate="1"> + <text state="1" string="*** to control knobs and wheels with a mouse, enable the layout plugin ***"> + <color red="0.90" green="0.90" blue="0.90"/> + </text> + </element> + + <!-- display elements --> + <element name="display"><rect><color red="0.15" green="0.08" blue="0.06"/></rect></element> + <element name="digit"><led7seg><color red="0.90" green="0.14" blue="0.35"/></led7seg></element> + <element name="led"> + <disk> + <color state="0" red="0.25" green="0.07" blue="0.07"/> + <color state="1" red="0.85" green="0.15" blue="0.15"/> + </disk> + </element> + + <!-- panel section elements --> + <element name="line"><rect><color red="0.75" green="0.75" blue="0.75"/></rect></element> + <element name="section_polymod"> + <image><data><![CDATA[ + <svg width="250" height="72"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="248" height="70" rx="10" ry="10"/> + <line stroke="#c0c0c0" stroke-width="1" x1="8" x2="128" y1="63" y2="63"/> + <line stroke="#c0c0c0" stroke-width="1" x1="154" x2="230" y1="56" y2="56"/> + </svg> + ]]></data></image> + </element> + <element name="section_lfo"> + <image><data><![CDATA[ + <svg width="186" height="72"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="184" height="70" rx="10" ry="10"/> + <line stroke="#c0c0c0" stroke-width="1" x1="90" x2="166" y1="56" y2="56"/> + </svg> + ]]></data></image> + </element> + <element name="section_wheelmod"> + <image><data><![CDATA[ + <svg width="250" height="72"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="248" height="70" rx="10" ry="10"/> + <line stroke="#c0c0c0" stroke-width="1" x1="78" x2="230" y1="56" y2="56"/> + </svg> + ]]></data></image> + </element> + <element name="section_osc_a"> + <image><data><![CDATA[ + <svg width="264" height="72"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="262" height="70" rx="10" ry="10"/> + <line stroke="#c0c0c0" stroke-width="1" x1="90" x2="128" y1="56" y2="56"/> + </svg> + ]]></data></image> + </element> + <element name="section_osc_b"> + <image><data><![CDATA[ + <svg width="408" height="72"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="406" height="70" rx="10" ry="10"/> + <line stroke="#c0c0c0" stroke-width="1" x1="155" x2="231" y1="56" y2="56"/> + </svg> + ]]></data></image> + </element> + <element name="section_mixer"> + <image><data><![CDATA[ + <svg width="208" height="72"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="206" height="70" rx="10" ry="10"/> + </svg> + ]]></data></image> + </element> + <element name="section_filter"> + <image><data><![CDATA[ + <svg width="288" height="148"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="286" height="146" rx="10" ry="10"/> + </svg> + ]]></data></image> + </element> + <element name="section_cass"> + <image><data><![CDATA[ + <svg width="120" height="72"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="118" height="70" rx="10" ry="10"/> + </svg> + ]]></data></image> + </element> + <element name="section_amp"> + <image><data><![CDATA[ + <svg width="264" height="72"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="262" height="70" rx="10" ry="10"/> + </svg> + ]]></data></image> + </element> + <element name="section_programmer"> + <image><data><![CDATA[ + <svg width="578" height="72"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="576" height="70" rx="10" ry="10"/> + <line stroke="#c0c0c0" stroke-width="1" x1="291" x2="557" y1="56" y2="56"/> + </svg> + ]]></data></image> + </element> + + <!-- button elements --> + <element name="wave_ramp"> + <image><data><![CDATA[ + <svg width="22" height="10"> + <polyline fill="none" stroke="#c0c0c0" stroke-width="1" points="6,9 17,0 17,9"/> + </svg> + ]]></data></image> + </element> + <element name="wave_triangle"> + <image><data><![CDATA[ + <svg width="22" height="10"> + <polyline fill="none" stroke="#c0c0c0" stroke-width="1" points="5,9 11,0 16,9"/> + </svg> + ]]></data></image> + </element> + <element name="wave_square"> + <image><data><![CDATA[ + <svg width="22" height="10"> + <polyline fill="none" stroke="#c0c0c0" stroke-width="1" points="2,9 6,9 6,0 16,0 16,9 20,9"/> + </svg> + ]]></data></image> + </element> + <element name="btn_black"> + <rect> + <bounds x="0" y="0" width="22" height="28"/> + <color red="0.08" green="0.08" blue="0.08"/> + </rect> + <rect> + <bounds x="1" y="1" width="20" height="10"/> + <color state="0" red="0.29" green="0.29" blue="0.29"/> + <color state="1" red="0.45" green="0.45" blue="0.45"/> + </rect> + <rect> + <bounds x="1" y="11" width="20" height="17"/> + <color red="0.14" green="0.14" blue="0.14"/> + </rect> + <rect> + <bounds x="3" y="13" width="16" height="12"/> + <color state="0" red="0.26" green="0.26" blue="0.26"/> + <color state="1" red="0.45" green="0.45" blue="0.45"/> + </rect> + </element> + <element name="btn_grey"> + <rect> + <bounds x="0" y="0" width="22" height="28"/> + <color red="0.08" green="0.08" blue="0.08"/> + </rect> + <rect> + <bounds x="1" y="1" width="20" height="10"/> + <color state="0" red="0.60" green="0.60" blue="0.60"/> + <color state="1" red="0.73" green="0.73" blue="0.73"/> + </rect> + <rect> + <bounds x="1" y="11" width="20" height="17"/> + <color red="0.49" green="0.49" blue="0.49"/> + </rect> + <rect> + <bounds x="3" y="13" width="16" height="12"/> + <color state="0" red="0.57" green="0.57" blue="0.57"/> + <color state="1" red="0.73" green="0.73" blue="0.73"/> + </rect> + </element> + <element name="btn_orange"> + <rect> + <bounds x="0" y="0" width="22" height="28"/> + <color red="0.08" green="0.08" blue="0.08"/> + </rect> + <rect> + <bounds x="1" y="1" width="20" height="10"/> + <color state="0" red="0.82" green="0.42" blue="0.17"/> + <color state="1" red="1.0" green="0.50" blue="0.18"/> + </rect> + <rect> + <bounds x="1" y="11" width="20" height="17"/> + <color red="0.63" green="0.28" blue="0.12"/> + </rect> + <rect> + <bounds x="3" y="13" width="16" height="12"/> + <color state="0" red="0.79" green="0.39" blue="0.14"/> + <color state="1" red="1.0" green="0.50" blue="0.18"/> + </rect> + </element> + <group name="button"> + <bounds x="0" y="0" width="38" height="52"/> + <element ref="~btn_label_top~"><bounds x="0" y="2" width="38" height="8"/></element> + <element ref="~btn_style~" inputtag="~btn_input~" inputmask="~btn_mask~"> + <bounds x="8" y="12" width="22" height="28"/> + </element> + <element ref="led" name="~btn_led~"><bounds x="16" y="15" width="6" height="6"/></element> + <element ref="~btn_label_bottom~"><bounds x="0" y="44" width="38" height="8"/></element> + </group> + <group name="wave_button"> + <bounds x="0" y="0" width="38" height="40"/> + <element ref="~wave~"><bounds x="8" y="0" width="22" height="10"/></element> + <element ref="btn_black" inputtag="~btn_input~" inputmask="~btn_mask~"> + <bounds x="8" y="12" width="22" height="28"/> + </element> + <element ref="led" name="~btn_led~"><bounds x="16" y="15" width="6" height="6"/></element> + </group> + + <!-- knob elements --> + <element name="knob_numbers_0_10"> + <rect><bounds x="0" y="0" width="56" height="56"/><color red="0" green="0" blue="0" alpha="0"/></rect> + <text string="0" align="1"><bounds x="13" y="46" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="1" align="1"><bounds x="5" y="36" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="2" align="1"><bounds x="2" y="24" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="3" align="1"><bounds x="5" y="12" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="4" align="1"><bounds x="13" y="3" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="5" align="0"><bounds x="25" y="0" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="6" align="2"><bounds x="35" y="3" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="7" align="2"><bounds x="43" y="12" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="8" align="2"><bounds x="46" y="24" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="9" align="2"><bounds x="43" y="36" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="10" align="2"><bounds x="35" y="46" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="knob_numbers_5_5"> + <rect><bounds x="0" y="0" width="56" height="56"/><color red="0" green="0" blue="0" alpha="0"/></rect> + <text string="5" align="1"><bounds x="13" y="46" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="4" align="1"><bounds x="5" y="36" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="3" align="1"><bounds x="2" y="24" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="2" align="1"><bounds x="5" y="12" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="1" align="1"><bounds x="13" y="3" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="0" align="0"><bounds x="25" y="0" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="1" align="2"><bounds x="35" y="3" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="2" align="2"><bounds x="43" y="12" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="3" align="2"><bounds x="46" y="24" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="4" align="2"><bounds x="43" y="36" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + <text string="5" align="2"><bounds x="35" y="46" width="8" height="7"/><color red="0.86" green="0.86" blue="0.86"/></text> + </element> + <element name="knob_tickmarks"> + <image><data><![CDATA[ + <svg width="42" height="42"> + <g stroke="#dbdbdb" stroke-width="0.5" transform="translate(20.5, 20.5)> + <line x1="0" y1="0" x2="0" y2="-21"/> + <line transform="rotate(30)" x1="0" y1="0" x2="0" y2="-21"/> + <line transform="rotate(60)" x1="0" y1="0" x2="0" y2="-21"/> + <line transform="rotate(90)" x1="0" y1="0" x2="0" y2="-21"/> + <line transform="rotate(120)" x1="0" y1="0" x2="0" y2="-21"/> + <line transform="rotate(150)" x1="0" y1="0" x2="0" y2="-21"/> + <line transform="rotate(210)" x1="0" y1="0" x2="0" y2="-21"/> + <line transform="rotate(240)" x1="0" y1="0" x2="0" y2="-21"/> + <line transform="rotate(270)" x1="0" y1="0" x2="0" y2="-21"/> + <line transform="rotate(300)" x1="0" y1="0" x2="0" y2="-21"/> + <line transform="rotate(330)" x1="0" y1="0" x2="0" y2="-21"/> + </g> + </svg> + ]]></data></image> + </element> + <element name="knob_black"> + <disk><bounds x="0" y="0" width="28" height="28"/><color red="0.63" green="0.63" blue="0.63"/></disk> + <disk><bounds x="2" y="2" width="24" height="24"/><color red="0.13" green="0.13" blue="0.13"/></disk> + </element> + <element name="knob_silver"> + <disk><bounds x="0" y="0" width="28" height="28"/><color red="0.50" green="0.50" blue="0.50"/></disk> + <disk><bounds x="2" y="2" width="24" height="24"/><color red="0.67" green="0.67" blue="0.67"/></disk> + </element> + <element name="knob_black_value"> + <simplecounter digits="1"><color red="0.86" green="0.86" blue="0.86"/></simplecounter> + </element> + <element name="knob_silver_value"> + <simplecounter digits="1"><color red="0.0" green="0.0" blue="0.0"/></simplecounter> + </element> + <group name="knob"> + <bounds x="0" y="0" width="56" height="62"/> + <element ref="~knob_numbers~"><bounds x="0" y="0" width="56" height="56"/></element> + <element ref="knob_tickmarks"><bounds x="7" y="7" width="42" height="42"/></element> + <element ref="~knob_style~" id="~knob_input~"> + <bounds x="14" y="14" width="28" height="28"/> + </element> + <element ref="~knob_style~_value" inputtag="~knob_input~" inputmask="0xffff" inputraw="yes"> + <bounds x="18" y="23" width="20" height="10"/> + </element> + <element ref="transparent" clickthrough="no"> + <bounds x="18" y="23" width="20" height="10"/> + </element> + <element ref="~knob_label~"><bounds x="0" y="54" width="56" height="8"/></element> + </group> + + <!-- wheel elements --> + <element name="section_wheel"> + <image><data><![CDATA[ + <svg width="112" height="194"> + <rect fill="none" stroke="#c0c0c0" stroke-width="2" x="1" y="1" width="110" height="192" rx="10" ry="10"/> + </svg> + ]]></data></image> + </element> + <element name="wheel_well"><rect><color red="0.08" green="0.08" blue="0.08"/></rect></element> + <element name="wheel_area"><rect><color red="0.14" green="0.14" blue="0.14"/></rect></element> + <element name="wheel_dent"> + <rect><color red="0.25" green="0.25" blue="0.25"/><bounds x="0" y="0" width="14" height="14"/></rect> + <rect><color red="0.60" green="0.60" blue="0.60"/><bounds x="0" y="6" width="14" height="2"/></rect> + </element> + <group name="wheel"> + <bounds x="0" y="0" width="18" height="98"/> + <element ref="wheel_well"><bounds x="0" y="0" width="18" height="98"/></element> + <element ref="wheel_area" id="~wheel_input~"><bounds x="2" y="6" width="14" height="86"/></element> + <element ref="wheel_dent" id="~wheel_input~_dent"> + <animate inputtag="~wheel_input~" inputmask="0xffff"/> + <bounds state="100" x="2" y="6" width="14" height="14"/> + <bounds state="0" x="2" y="78" width="14" height="14"/> + </element> + </group> + + <!-- keyboard elements --> + <element name="whitekey"> + <rect> + <color state="0" red="0.94" green="0.94" blue="0.94"/> + <color state="1" red="0.50" green="0.50" blue="0.50"/> + </rect> + </element> + <element name="blackkey"> + <rect> + <bounds x="0" y="0" width="18" height="130"/> + <color red="0.08" green="0.08" blue="0.08"/> + </rect> + <rect> + <bounds x="1" y="0" width="16" height="128"/> + <color state="0" red="0.18" green="0.18" blue="0.18"/> + <color state="1" red="0.50" green="0.50" blue="0.50"/> + </rect> + </element> + <group name="octave_var1"> + <element ref="whitekey" inputtag="~kbd_input_1~" inputmask="0x01"><!-- C --> + <bounds x="0" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_1~" inputmask="0x04"><!-- D --> + <bounds x="34" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_1~" inputmask="0x10"><!-- E --> + <bounds x="68" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_1~" inputmask="0x20"><!-- F --> + <bounds x="102" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_1~" inputmask="0x80"><!-- G --> + <bounds x="136" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_2~" inputmask="0x02"><!-- A --> + <bounds x="170" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_2~" inputmask="0x08"><!-- B --> + <bounds x="204" y="0" width="32" height="202"/> + </element> + <element ref="blackkey" inputtag="~kbd_input_1~" inputmask="0x02"><!-- C# --> + <bounds x="21" y="0" width="18" height="130"/> + </element> + <element ref="blackkey" inputtag="~kbd_input_1~" inputmask="0x08"><!-- D# --> + <bounds x="61" y="0" width="18" height="130"/> + </element> + <element ref="blackkey" inputtag="~kbd_input_1~" inputmask="0x40"><!-- F# --> + <bounds x="123" y="0" width="18" height="130"/> + </element> + <element ref="blackkey" inputtag="~kbd_input_2~" inputmask="0x01"><!-- G# --> + <bounds x="159" y="0" width="18" height="130"/> + </element> + <element ref="blackkey" inputtag="~kbd_input_2~" inputmask="0x04"><!-- A# --> + <bounds x="197" y="0" width="18" height="130"/> + </element> + </group> + <group name="octave_var2"> + <element ref="whitekey" inputtag="~kbd_input_1~" inputmask="0x10"><!-- C --> + <bounds x="0" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_1~" inputmask="0x40"><!-- D --> + <bounds x="34" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_2~" inputmask="0x01"><!-- E --> + <bounds x="68" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_2~" inputmask="0x02"><!-- F --> + <bounds x="102" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_2~" inputmask="0x08"><!-- G --> + <bounds x="136" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_2~" inputmask="0x20"><!-- A --> + <bounds x="170" y="0" width="32" height="202"/> + </element> + <element ref="whitekey" inputtag="~kbd_input_2~" inputmask="0x80"><!-- B --> + <bounds x="204" y="0" width="32" height="202"/> + </element> + <element ref="blackkey" inputtag="~kbd_input_1~" inputmask="0x20"><!-- C# --> + <bounds x="21" y="0" width="18" height="130"/> + </element> + <element ref="blackkey" inputtag="~kbd_input_1~" inputmask="0x80"><!-- D# --> + <bounds x="61" y="0" width="18" height="130"/> + </element> + <element ref="blackkey" inputtag="~kbd_input_2~" inputmask="0x04"><!-- F# --> + <bounds x="123" y="0" width="18" height="130"/> + </element> + <element ref="blackkey" inputtag="~kbd_input_2~" inputmask="0x10"><!-- G# --> + <bounds x="159" y="0" width="18" height="130"/> + </element> + <element ref="blackkey" inputtag="~kbd_input_2~" inputmask="0x40"><!-- A# --> + <bounds x="197" y="0" width="18" height="130"/> + </element> + </group> + + + <view name="Default Layout"> + <bounds x="0" y="0" width="1400" height="600"/> + + <!-- case --> + + <element ref="wood"><bounds x="14" y="282" width="1372" height="102"/></element> + <element ref="wood"><bounds x="22" y="586" width="1356" height="14"/></element> + <element ref="silverrect"><bounds x="1158" y="314" width="166" height="40"/></element> + <element ref="edgewood"><bounds x="14" y="0" width="1372" height="14"/></element> + <element ref="edgewood"><bounds x="0" y="0" width="14" height="600"/></element> + <element ref="darkwood"><bounds x="14" y="384" width="12" height="216"/></element> + <element ref="edgewood"><bounds x="1386" y="0" width="14" height="600"/></element> + <element ref="darkwood"><bounds x="1374" y="384" width="12" height="216"/></element> + <element ref="panel"><bounds x="14" y="14" width="1372" height="268"/></element> + <element ref="line"><bounds x="283" y="42" width="2" height="224"/></element> + + <collection name="script warning"> + <element ref="script_warning" id="warning"><bounds x="300" y="324" width="800" height="18"/></element> + </collection> + + <!-- wheels --> + + <element ref="panel"><bounds x="26" y="384" width="118" height="202"/></element> + <element ref="section_wheel"><bounds x="28" y="390" width="112" height="194"/></element> + + <element ref="txt_pitch"><bounds x="53" y="534" width="28" height="10"/></element> + <param name="wheel_input" value="wheel_pitch"/> + <group ref="wheel"><bounds x="58" y="434" width="18" height="98"/></group> + + <element ref="txt_mod"><bounds x="102" y="534" width="28" height="10"/></element> + <param name="wheel_input" value="wheel_mod"/> + <group ref="wheel"><bounds x="107" y="434" width="18" height="98"/></group> + + <!-- Most knobs are black and the tickmarks are numbered from 0 to 10. --> + <param name="knob_style" value="knob_black"/> + <param name="knob_numbers" value="knob_numbers_0_10"/> + + <!-- poly mod --> + + <param name="btn_style" value="btn_black"/> + <param name="btn_label_bottom" value="transparent"/> + <param name="btn_input" value="switch_row_1"/> + + <element ref="section_polymod"><bounds x="24" y="42" width="250" height="72"/></element> + <element ref="txt_polymod"><bounds x="118" y="38" width="62" height="10"/></element> + + <param name="knob_label" value="transparent"/> + <param name="knob_input" value="pot_4"/> + <group ref="knob"><bounds x="32" y="47" width="56" height="62"/></group> + <element ref="txt_filt_env"><bounds x="78" y="94" width="40" height="7"/></element> + + <param name="knob_input" value="pot_3"/> + <group ref="knob"><bounds x="96" y="47" width="56" height="62"/></group> + <element ref="txt_osc_b_l"><bounds x="142" y="94" width="40" height="7"/></element> + + <param name="btn_label_top" value="txt_freq_a"/> + <param name="btn_led" value="led_pmod_freq_a"/> + <param name="btn_mask" value="0x01"/> + <group ref="button"><bounds x="159" y="50" width="38" height="52"/></group> + + <param name="btn_label_top" value="txt_pw_a"/> + <param name="btn_led" value="led_pmod_pw_a"/> + <param name="btn_mask" value="0x02"/> + <group ref="button"><bounds x="197" y="50" width="38" height="52"/></group> + + <param name="btn_label_top" value="txt_filter"/> + <param name="btn_led" value="led_pmod_filt"/> + <param name="btn_mask" value="0x04"/> + <group ref="button"><bounds x="235" y="50" width="38" height="52"/></group> + + <element ref="txt_destination"><bounds x="189" y="94" width="54" height="8"/></element> + <element ref="txt_source_amount"><bounds x="57" y="101" width="68" height="8"/></element> + + <!-- lfo --> + + <param name="btn_input" value="switch_row_1"/> + <element ref="section_lfo"><bounds x="88" y="118" width="186" height="72"/></element> + <element ref="txt_lfo"><bounds x="167" y="114" width="28" height="10"/></element> + + <param name="knob_label" value="txt_frequency"/> + <param name="knob_input" value="pot_1"/> + <group ref="knob"><bounds x="96" y="123" width="56" height="62"/></group> + + <param name="wave" value="wave_ramp"/> + <param name="btn_led" value="led_lfo_saw"/> + <param name="btn_mask" value="0x08"/> + <group ref="wave_button"><bounds x="159" y="126" width="38" height="40"/></group> + + <param name="wave" value="wave_triangle"/> + <param name="btn_led" value="led_lfo_tri"/> + <param name="btn_mask" value="0x10"/> + <group ref="wave_button"><bounds x="197" y="126" width="38" height="40"/></group> + + <param name="wave" value="wave_square"/> + <param name="btn_led" value="led_lfo_sqr"/> + <param name="btn_mask" value="0x20"/> + <group ref="wave_button"><bounds x="235" y="126" width="38" height="40"/></group> + + <element ref="txt_shape"><bounds x="201" y="170" width="30" height="8"/></element> + + <!-- wheel mod --> + + <param name="btn_style" value="btn_black"/> + <param name="btn_label_bottom" value="transparent"/> + <param name="btn_input" value="switch_row_2"/> + + <element ref="section_wheelmod"><bounds x="24" y="194" width="250" height="72"/></element> + <element ref="txt_wheelmod"><bounds x="115" y="190" width="68" height="10"/></element> + + <param name="knob_numbers" value="knob_numbers_5_5"/> + <param name="knob_label" value="txt_source_mix"/> + <param name="knob_input" value="pot_2"/> + <group ref="knob"><bounds x="32" y="199" width="56" height="62"/></group> + <param name="knob_numbers" value="knob_numbers_0_10"/> + <element ref="txt_lfo_r"><bounds x="32" y="246" width="10" height="7"/></element> + <element ref="txt_noise_l"><bounds x="78" y="246" width="20" height="7"/></element> + + <param name="btn_label_top" value="txt_freq_a"/> + <param name="btn_led" value="led_wmod_freq_a"/> + <param name="btn_mask" value="0x01"/> + <group ref="button"><bounds x="83" y="202" width="38" height="52"/></group> + + <param name="btn_label_top" value="txt_freq_b"/> + <param name="btn_led" value="led_wmod_freq_b"/> + <param name="btn_mask" value="0x02"/> + <group ref="button"><bounds x="121" y="202" width="38" height="52"/></group> + + <param name="btn_label_top" value="txt_pw_a"/> + <param name="btn_led" value="led_wmod_pw_a"/> + <param name="btn_mask" value="0x04"/> + <group ref="button"><bounds x="159" y="202" width="38" height="52"/></group> + + <param name="btn_label_top" value="txt_pw_b"/> + <param name="btn_led" value="led_wmod_pw_b"/> + <param name="btn_mask" value="0x08"/> + <group ref="button"><bounds x="197" y="202" width="38" height="52"/></group> + + <param name="btn_label_top" value="txt_filter"/> + <param name="btn_led" value="led_wmod_filt"/> + <param name="btn_mask" value="0x10"/> + <group ref="button"><bounds x="235" y="202" width="38" height="52"/></group> + + <element ref="txt_destination"><bounds x="151" y="246" width="54" height="8"/></element> + + <!-- oscillator A --> + + <param name="btn_style" value="btn_black"/> + <param name="btn_label_top" value="transparent"/> + <param name="btn_input" value="switch_row_0"/> + + <element ref="section_osc_a"><bounds x="294" y="42" width="264" height="72"/></element> + <element ref="txt_oscillator_a"><bounds x="389" y="38" width="74" height="10"/></element> + + <param name="knob_label" value="txt_frequency"/> + <param name="knob_input" value="pot_5"/> + <group ref="knob"><bounds x="302" y="47" width="56" height="62"/></group> + + <param name="wave" value="wave_ramp"/> + <param name="btn_led" value="led_osc_a_saw"/> + <param name="btn_mask" value="0x02"/> + <group ref="wave_button"><bounds x="365" y="50" width="38" height="40"/></group> + + <param name="wave" value="wave_square"/> + <param name="btn_led" value="led_osc_a_sqr"/> + <param name="btn_mask" value="0x01"/> + <group ref="wave_button"><bounds x="403" y="50" width="38" height="40"/></group> + + <param name="knob_label" value="txt_pulse_width"/> + <param name="knob_input" value="pot_13"/> + <group ref="knob"><bounds x="453" y="47" width="56" height="62"/></group> + + <param name="btn_label_bottom" value="txt_sync"/> + <param name="btn_led" value="led_osc_a_sync"/> + <param name="btn_mask" value="0x04"/> + <group ref="button"><bounds x="519" y="50" width="38" height="52"/></group> + + <element ref="txt_shape"><bounds x="388" y="94" width="30" height="8"/></element> + + <!-- oscillator B --> + + <param name="btn_style" value="btn_black"/> + <param name="btn_label_top" value="transparent"/> + <param name="btn_input" value="switch_row_0"/> + + <element ref="section_osc_b"><bounds x="294" y="118" width="408" height="72"/></element> + <element ref="txt_oscillator_b"><bounds x="462" y="114" width="74" height="10"/></element> + + <param name="knob_label" value="txt_frequency"/> + <param name="knob_input" value="pot_6"/> + <group ref="knob"><bounds x="302" y="123" width="56" height="62"/></group> + + <param name="knob_label" value="txt_fine"/> + <param name="knob_input" value="pot_7"/> + <group ref="knob"><bounds x="366" y="123" width="56" height="62"/></group> + + <param name="wave" value="wave_ramp"/> + <param name="btn_led" value="led_osc_b_saw"/> + <param name="btn_mask" value="0x08"/> + <group ref="wave_button"><bounds x="430" y="126" width="38" height="40"/></group> + + <param name="wave" value="wave_triangle"/> + <param name="btn_led" value="led_osc_b_tri"/> + <param name="btn_mask" value="0x10"/> + <group ref="wave_button"><bounds x="468" y="126" width="38" height="40"/></group> + + <param name="wave" value="wave_square"/> + <param name="btn_led" value="led_osc_b_sqr"/> + <param name="btn_mask" value="0x20"/> + <group ref="wave_button"><bounds x="506" y="126" width="38" height="40"/></group> + + <element ref="txt_shape"><bounds x="468" y="170" width="30" height="8"/></element> + + <param name="knob_label" value="txt_pulse_width"/> + <param name="knob_input" value="pot_11"/> + <group ref="knob"><bounds x="554" y="123" width="56" height="62"/></group> + + <param name="btn_label_bottom" value="txt_keyboard"/> + <param name="btn_led" value="led_osc_b_kbd"/> + <param name="btn_mask" value="0x40"/> + <group ref="button"><bounds x="656" y="126" width="38" height="52"/></group> + + <param name="btn_label_bottom" value="txt_lo_freq"/> + <param name="btn_led" value="led_osc_b_lo"/> + <param name="btn_input" value="switch_row_2"/> + <param name="btn_mask" value="0x20"/> + <group ref="button"><bounds x="618" y="126" width="38" height="52"/></group> + + <!-- mixer --> + + <element ref="section_mixer"><bounds x="578" y="42" width="208" height="72"/></element> + <element ref="txt_mixer"><bounds x="664" y="38" width="36" height="10"/></element> + + <param name="knob_label" value="txt_osc_a"/> + <param name="knob_input" value="pot_12"/> + <group ref="knob"><bounds x="586" y="47" width="56" height="62"/></group> + + <param name="knob_label" value="txt_osc_b"/> + <param name="knob_input" value="pot_10"/> + <group ref="knob"><bounds x="654" y="47" width="56" height="62"/></group> + + <param name="knob_label" value="txt_noise"/> + <param name="knob_input" value="pot_14"/> + <group ref="knob"><bounds x="722" y="47" width="56" height="62"/></group> + + <!-- filter--> + + <element ref="section_filter"><bounds x="806" y="42" width="288" height="148"/></element> + <element ref="txt_filter"><bounds x="930" y="38" width="40" height="10"/></element> + + <param name="knob_label" value="txt_cutoff"/> + <param name="knob_input" value="pot_8"/> + <group ref="knob"><bounds x="826" y="47" width="56" height="62"/></group> + + <param name="knob_label" value="txt_resonance"/> + <param name="knob_input" value="pot_15"/> + <group ref="knob"><bounds x="890" y="47" width="56" height="62"/></group> + + <param name="knob_label" value="txt_env_amt"/> + <param name="knob_input" value="pot_9"/> + <group ref="knob"><bounds x="954" y="47" width="56" height="62"/></group> + + <param name="btn_label_top" value="transparent"/> + <param name="btn_label_bottom" value="txt_keyboard"/> + <param name="btn_led" value="led_filt_kbd"/> + <param name="btn_input" value="switch_row_1"/> + <param name="btn_mask" value="0x40"/> + <group ref="button"><bounds x="1027" y="50" width="38" height="52"/></group> + + <param name="knob_label" value="txt_attack"/> + <param name="knob_input" value="pot_16"/> + <group ref="knob"><bounds x="826" y="123" width="56" height="62"/></group> + + <param name="knob_label" value="txt_decay"/> + <param name="knob_input" value="pot_17"/> + <group ref="knob"><bounds x="890" y="123" width="56" height="62"/></group> + + <param name="knob_label" value="txt_sustain"/> + <param name="knob_input" value="pot_18"/> + <group ref="knob"><bounds x="954" y="123" width="56" height="62"/></group> + + <param name="knob_label" value="txt_release"/> + <param name="knob_input" value="pot_19"/> + <group ref="knob"><bounds x="1018" y="123" width="56" height="62"/></group> + + <!-- amplifier --> + + <element ref="section_amp"><bounds x="1108" y="118" width="264" height="72"/></element> + <element ref="txt_amp"><bounds x="1211" y="114" width="56" height="10"/></element> + + <param name="knob_label" value="txt_attack"/> + <param name="knob_input" value="pot_20"/> + <group ref="knob"><bounds x="1116" y="123" width="56" height="62"/></group> + + <param name="knob_label" value="txt_decay"/> + <param name="knob_input" value="pot_21"/> + <group ref="knob"><bounds x="1180" y="123" width="56" height="62"/></group> + + <param name="knob_label" value="txt_sustain"/> + <param name="knob_input" value="pot_22"/> + <group ref="knob"><bounds x="1244" y="123" width="56" height="62"/></group> + + <param name="knob_label" value="txt_release"/> + <param name="knob_input" value="pot_23"/> + <group ref="knob"><bounds x="1308" y="123" width="56" height="62"/></group> + + <!-- cassette --> + + <param name="btn_style" value="btn_grey"/> + <param name="btn_input" value="switch_row_4"/> + + <element ref="section_cass"><bounds x="1250" y="42" width="122" height="72"/></element> + <element ref="txt_cass"><bounds x="1283" y="38" width="56" height="10"/></element> + + <param name="btn_label_top" value="txt_save"/> + <param name="btn_label_bottom" value="txt_to_tape"/> + <param name="btn_led" value="led_to_cass"/> + <param name="btn_mask" value="0x10"/> + <group ref="button"><bounds x="1253" y="50" width="38" height="52"/></group> + + <param name="btn_label_top" value="txt_load"/> + <param name="btn_label_bottom" value="txt_from_tape"/> + <param name="btn_led" value="led_from_cass"/> + <param name="btn_mask" value="0x20"/> + <group ref="button"><bounds x="1317" y="50" width="38" height="52"/></group> + + <!-- programmer --> + + <element ref="section_programmer"><bounds x="516" y="194" width="578" height="72"/></element> + <element ref="txt_programmer"><bounds x="767" y="190" width="76" height="10"/></element> + + <param name="btn_style" value="btn_grey"/> + <param name="btn_label_top" value="transparent"/> + <param name="btn_label_bottom" value="txt_preset"/> + <param name="btn_led" value="led_preset"/> + <param name="btn_input" value="switch_row_4"/> + <param name="btn_mask" value="0x80"/> + <group ref="button"><bounds x="518" y="202" width="38" height="52"/></group> + + <param name="btn_style" value="btn_orange"/> + <param name="btn_label_bottom" value="txt_record"/> + <param name="btn_led" value="led_record"/> + <param name="btn_mask" value="0x01"/> + <group ref="button"><bounds x="595" y="202" width="38" height="52"/></group> + + <element ref="btn_grey" inputtag="switch_row_4" inputmask="0x02"> + <bounds x="680" y="214" width="22" height="28"/> + </element> + <element ref="txt_bank"><bounds x="672" y="246" width="38" height="8"/></element> + <element ref="txt_select"><bounds x="672" y="254" width="38" height="8"/></element> + + <element ref="display"><bounds x="730" y="214" width="40" height="30"/></element> + <element ref="digit" name="digit0"><bounds x="731" y="215" width="18" height="28"/></element> + <element ref="digit" name="digit1"><bounds x="751" y="215" width="18" height="28"/></element> + <element ref="txt_bank"><bounds x="724" y="246" width="24" height="8"/></element> + <element ref="txt_program"><bounds x="753" y="246" width="36" height="8"/></element> + + <param name="btn_style" value="btn_grey"/> + <param name="btn_label_bottom" value="transparent"/> + <param name="btn_input" value="switch_row_3"/> + <repeat count="8"> + <param name="i" start="1" increment="1"/> + <param name="x" start="788" increment="38"/> + <param name="btn_led" value="led_ps~i~"/> + <param name="btn_mask" start="0x01" lshift="1"/> + <param name="btn_label_top" value="txt_~i~"/> + <group ref="button"><bounds x="~x~" y="202" width="38" height="52"/></group> + </repeat> + + <element ref="txt_prog_sel"><bounds x="903" y="246" width="74" height="8"/></element> + + <!-- knobs and buttons outside of any sections --> + + <param name="knob_label" value="txt_glide"/> + <param name="knob_input" value="pot_0"/> + <group ref="knob"><bounds x="302" y="199" width="56" height="62"/></group> + + <param name="btn_style" value="btn_black"/> + <param name="btn_label_top" value="transparent"/> + <param name="btn_label_bottom" value="txt_unison"/> + <param name="btn_led" value="led_unison"/> + <param name="btn_input" value="switch_row_0"/> + <param name="btn_mask" value="0x80"/> + <group ref="button"><bounds x="404" y="202" width="38" height="52"/></group> + + <param name="knob_style" value="knob_silver"/> + <param name="knob_label" value="txt_master_tune"/> + <param name="knob_input" value="pot_tune"/> + <param name="knob_numbers" value="knob_numbers_5_5"/> + <group ref="knob"><bounds x="1116" y="47" width="56" height="62"/></group> + + <param name="btn_style" value="btn_grey"/> + <param name="btn_label_bottom" value="txt_A440"/> + <param name="btn_led" value="led_a_440"/> + <param name="btn_input" value="switch_row_4"/> + <param name="btn_mask" value="0x04"/> + <group ref="button"><bounds x="1189" y="50" width="38" height="52"/></group> + + <param name="btn_style" value="btn_black"/> + <param name="btn_label_bottom" value="txt_release"/> + <param name="btn_led" value="led_release"/> + <param name="btn_input" value="switch_row_1"/> + <param name="btn_mask" value="0x80"/> + <group ref="button"><bounds x="1125" y="202" width="38" height="52"/></group> + + <param name="knob_label" value="txt_volume"/> + <param name="knob_input" value="pot_volume"/> + <param name="knob_numbers" value="knob_numbers_0_10"/> + <group ref="knob"><bounds x="1212" y="199" width="56" height="62"/></group> + + <param name="btn_style" value="btn_grey"/> + <param name="btn_label_bottom" value="txt_tune"/> + <param name="btn_led" value="led_tune"/> + <param name="btn_input" value="switch_row_4"/> + <param name="btn_mask" value="0x08"/> + <group ref="button"><bounds x="1317" y="202" width="38" height="52"/></group> + + <!-- keyboard --> + + <param name="kbd_input_1" value="switch_row_8"/> + <param name="kbd_input_2" value="switch_row_9"/> + <group ref="octave_var1"><bounds x="148" y="384" width="236" height="202"/></group> + + <param name="kbd_input_1" value="switch_row_9"/> + <param name="kbd_input_2" value="switch_row_10"/> + <group ref="octave_var2"><bounds x="386" y="384" width="236" height="202"/></group> + + <param name="kbd_input_1" value="switch_row_11"/> + <param name="kbd_input_2" value="switch_row_12"/> + <group ref="octave_var1"><bounds x="624" y="384" width="236" height="202"/></group> + + <param name="kbd_input_1" value="switch_row_12"/> + <param name="kbd_input_2" value="switch_row_13"/> + <group ref="octave_var2"><bounds x="862" y="384" width="236" height="202"/></group> + + <param name="kbd_input_1" value="switch_row_14"/> + <param name="kbd_input_2" value="switch_row_15"/> + <group ref="octave_var1"><bounds x="1100" y="384" width="236" height="202"/></group> + + <element ref="whitekey" inputtag="switch_row_15" inputmask="0x10"> + <bounds x="1338" y="384" width="32" height="202"/> + </element> + </view> + + <script><![CDATA[ + file:set_resolve_tags_callback( + function() + local view = file.views["Default Layout"] + install_slider_callbacks(view) + + add_slider(view, "wheel_pitch", "wheel_pitch_dent", "wheel_pitch") + add_slider(view, "wheel_mod", "wheel_mod_dent", "wheel_mod") + + local knob_scale = 1.6 + add_knob(view, "pot_tune", "pot_tune", knob_scale, VERTICAL) + add_knob(view, "pot_volume", "pot_volume", knob_scale, VERTICAL) + + for i = 0, 23 do + local knob = "pot_" .. i + add_knob(view, knob, knob, knob_scale, VERTICAL) + end + + view.items["warning"]:set_state(0) + end) + + ----------------------------------------------------------------------- + -- Slider and knob library starts. + -- Can be copied as-is to other layouts. + ----------------------------------------------------------------------- + VERTICAL = 0 + HORIZONTAL = 1 + + local widgets = {} -- Stores slider and knob information. + local pointers = {} -- Tracks pointer state. + + -- The knob's Y position must be animated using <animate inputtag="{port_name}">. + -- The click area's vertical size must exactly span the range of the + -- knob's movement. + function add_slider(view, clickarea_id, knob_id, port_name) + table.insert(widgets, { + clickarea = get_layout_item(view, clickarea_id), + slider_knob = get_layout_item(view, knob_id), + field = get_port_field(port_name), + is_knob = false }) + end + + -- A sweep between the attached field's min and max values requires + -- moving the pointer by `scale * clickarea.height` pixes. + function add_knob(view, clickarea_id, port_name, scale, drag_direction) + table.insert(widgets, { + clickarea = get_layout_item(view, clickarea_id), + field = get_port_field(port_name), + is_knob = true, + scale = scale, + is_horizontal = (drag_direction == HORIZONTAL) }) + end + + function get_layout_item(view, item_id) + local item = view.items[item_id] + if item == nil then + emu.print_error("Layout element: '" .. item_id .. "' not found.") + end + return item + end + + function get_port_field(port_name) + local port = file.device:ioport(port_name) + if port == nil then + emu.print_error("Port: '" .. port_name .. "' not found.") + return nil + end + local field = nil + for k, val in pairs(port.fields) do + field = val + break + end + local field_msg = "Needs to either be an IPT_ADJUSTER, or an analog port with auto-center." + if field == nil then + emu.print_error("Port '" .. port_name .."' " .. field_msg) + return nil + end + if field.is_analog and (not field.centerdelta or field.centerdelta == 0) then + emu.print_error("Port '" .. port_name .."' " .. field_msg) + return nil + end + return field + end + + local function release_pointer(pointer_id) + if pointers[pointer_id] then + local field = widgets[pointers[pointer_id].selected_widget].field + if field.is_analog then + field:clear_value() + end + end + pointers[pointer_id] = nil + end + + local function pointer_updated(type, id, dev, x, y, btn, dn, up, cnt) + -- If a button is not pressed, reset the state of the current pointer. + if btn & 1 == 0 then + release_pointer(id) + return + end + + -- If a button was just pressed, find the affected widget, if any. + if dn & 1 ~= 0 then + for i = 1, #widgets do + local found, relative + if widgets[i].slider_knob and widgets[i].slider_knob.bounds:includes(x, y) then + found = true + relative = true + elseif widgets[i].clickarea.bounds:includes(x, y) then + found = true + relative = false + end + if found then + pointers[id] = { + selected_widget = i, + relative = relative, + start_x = x, + start_y = y, + start_value = widgets[i].field.port:read() } + break + end + end + end + + -- If there is no widget selected by the current pointer, we are done. + if pointers[id] == nil then + return + end + + -- A widget is selected. Update its state based on the pointer's position. + + local pointer = pointers[id] + local widget = widgets[pointer.selected_widget] + + local min_value = widget.field.minvalue + local max_value = widget.field.maxvalue + local value_range = max_value - min_value + + local new_value + if widget.is_knob then + if widget.is_horizontal then + local step_x = value_range / (widget.scale * widget.clickarea.bounds.width) + new_value = pointer.start_value + (x - pointer.start_x) * step_x + else + local step_y = value_range / (widget.scale * widget.clickarea.bounds.height) + new_value = pointer.start_value + (pointer.start_y - y) * step_y + end + else + local knob_half_height = widget.slider_knob.bounds.height / 2 + local min_y = widget.clickarea.bounds.y0 + knob_half_height + local max_y = widget.clickarea.bounds.y1 - knob_half_height + + if pointer.relative then + -- User clicked on the knob. The new value will depend on how + -- much the knob was dragged. + new_value = pointer.start_value - value_range * (y - pointer.start_y) / (max_y - min_y) + else + -- User clicked elsewhere on the slider. The new value will depend on + -- the absolute position of the click. + new_value = max_value - value_range * (y - min_y) / (max_y - min_y) + end + end + + new_value = math.floor(new_value + 0.5) + if new_value < min_value then new_value = min_value end + if new_value > max_value then new_value = max_value end + + if widget.field.is_analog then + widget.field:set_value(new_value) + else + widget.field.user_value = new_value + end + end + + local function pointer_left(type, id, dev, x, y, up, cnt) + release_pointer(id) + end + + local function pointer_aborted(type, id, dev, x, y, up, cnt) + release_pointer(id) + end + + local function forget_pointers() + for id, pointer in pairs(pointers) do + release_pointer(id) + end + pointers = {} + end + + function install_slider_callbacks(view) + view:set_pointer_updated_callback(pointer_updated) + view:set_pointer_left_callback(pointer_left) + view:set_pointer_aborted_callback(pointer_aborted) + view:set_forget_pointers_callback(forget_pointers) + end + ----------------------------------------------------------------------- + -- Slider and knob library ends. + ----------------------------------------------------------------------- + ]]></script> +</mamelayout> diff --git a/src/mame/sequential/prophet5.cpp b/src/mame/sequential/prophet5.cpp index c28486e71f8..0905afe9245 100644 --- a/src/mame/sequential/prophet5.cpp +++ b/src/mame/sequential/prophet5.cpp @@ -38,8 +38,11 @@ TODO: Outline of voice architecture. This driver is based on the Prophet 5 Rev 3.0 technical manual, and is intended as an education tool. -There is no layout and no audio. Running with `-oslog -output console` will -display CVs, and voice and LED control signals. +There is no audio. Running with `-oslog -output console` will display CVs, and +voice and LED control signals. + +When the Prophet 5 boots up, it runs its autotune routine (`tune` LED will be +illuminated). The synth is unresponsive while this is happening. */ #include "emu.h" @@ -52,6 +55,8 @@ display CVs, and voice and LED control signals. #include "machine/timer.h" #include "video/pwm.h" +#include "sequential_prophet5.lh" + #define LOG_SWITCHES (1U << 1) #define LOG_CV (1U << 2) #define LOG_ADC (1U << 3) @@ -85,6 +90,7 @@ protected: void machine_reset() override ATTR_COLD; private: + static double normalized(const required_ioport &rp); static double i_bias(const required_ioport &rp, double rp_max, double r, double v); void switch_w(u8 data); @@ -92,8 +98,8 @@ private: u8 misc_r(); u8 adc_r(); - void led_drive_w(u8 data); void led_sink_w(u8 data); + void led_drive_w(u8 data); void led_update_w(offs_t offset, u8 data); void update_sh(); @@ -202,6 +208,12 @@ prophet5_state::prophet5_state(const machine_config &mconfig, device_type type, } } +double prophet5_state::normalized(const required_ioport &input) +{ + assert(input->field(1)->minval() == 0); + return double(input->read()) / double(input->field(1)->maxval()); +} + // Computes the current through resistor R, from the junction of the resistors // towards V. Rp1 and Rp2 are the two sides of a single potentiometer. // @@ -212,7 +224,7 @@ prophet5_state::prophet5_state(const machine_config &mconfig, device_type type, // V double prophet5_state::i_bias(const required_ioport &rp, double rp_max, double r, double v) { - const double rp1 = rp_max * rp->read() / 100.0; + const double rp1 = rp_max * normalized(rp); const double rp2 = rp_max - rp1; // Compute voltage at the junction of all resistors. const double vx = (r * rp1 * VMINUS + r * rp2 * VPLUS + rp1 * rp2 * v) / (r * rp1 + r * rp2 + rp1 * rp2); @@ -266,20 +278,24 @@ u8 prophet5_state::adc_r() return (d5 << 5) | (d4 << 4) | (d3 << 3) | (d2 << 2) | (d1 << 1) | d0; } -void prophet5_state::led_drive_w(u8 data) -{ - m_led_matrix_pwm->write_my(data); - m_digit_pwm->write_my(data & 0x7f); -} - void prophet5_state::led_sink_w(u8 data) { // The full LED matrix size is 8x7. Columns 0-4 control individual LEDs // (m_led_matrix_pwm), and columns 5 and 6 control the "bank" and "program" // 7-segment digit displays, respectively (m_digit_pwm). Only the first 7 // rows are used for the digit displays. + m_led_matrix_pwm->write_mx(data & 0x1f); - m_digit_pwm->write_mx((data >> 5) & 0x03); + + // Using write_my() because video/pwm.cpp assumes the selected digit is in + // the row. + m_digit_pwm->write_my((data >> 5) & 0x03); +} + +void prophet5_state::led_drive_w(u8 data) +{ + m_led_matrix_pwm->write_my(data); + m_digit_pwm->write_mx(data & 0x7f); } void prophet5_state::led_update_w(offs_t offset, u8 data) @@ -354,7 +370,7 @@ void prophet5_state::update_vdac() // The DAC voltage is scaled down and used as a reference for the ADC. It // will be divided by ~2 if ADC Gain is properly calibrated. - const double adc_gain = RES_K(5) * m_adc_gain->read() / 100.0; // R334 + const double adc_gain = RES_K(5) * normalized(m_adc_gain); // R334 m_adc_vref = m_vdac * RES_VOLTAGE_DIVIDER(adc_gain + RES_K(18.2), RES_K(20.0)); // R335, R336 } @@ -372,7 +388,7 @@ void prophet5_state::update_vmux() if (!BIT(m_pot_mux_inh, mux)) // Active low. { const int pot_index = 8 * mux + m_pot_mux_abc; - vmux_sum += POT_V_MAX * m_pots[pot_index]->read() / 100.0; + vmux_sum += POT_V_MAX * normalized(m_pots[pot_index]); ++n_active_switches; } } @@ -380,7 +396,7 @@ void prophet5_state::update_vmux() if (m_seq_cv_enabled) // U371C (CD4016) control input. { // CV input is expected to be 0-10V. - const double cv_in = 10.0 * m_seq_cv_in->read() / 100.0; + const double cv_in = 10.0 * normalized(m_seq_cv_in); // The external CV is buffered, scaled, and offsetted by U374A (LM348 // op-amp) and surrounding circuit. @@ -389,7 +405,7 @@ void prophet5_state::update_vmux() constexpr double R396 = RES_R(470); constexpr double R392 = RES_K(24.9); constexpr double R391 = RES_K(30.1); - const double R386 = RES_K(10) * m_seq_scale->read() / 100.0; + const double R386 = RES_K(10) * normalized(m_seq_scale); const double scaled_cv = cv_in * RES_VOLTAGE_DIVIDER(R396 + R392 + R386, R391); // Offset resistor network. @@ -600,6 +616,8 @@ void prophet5_state::prophet5rev30(machine_config &config) PWM_DISPLAY(config, m_digit_pwm).set_size(2, 7); m_digit_pwm->set_segmask(0x03, 0x7f); + config.set_default_layout(layout_sequential_prophet5); + auto &u332 = OUTPUT_LATCH(config, "misc_latch"); u332.bit_handler<0>().set(m_tune_ff, FUNC(ttl7474_device::clear_w)); u332.bit_handler<1>().set(m_tune_ff, FUNC(ttl7474_device::preset_w)); @@ -736,7 +754,7 @@ INPUT_PORTS_START(prophet5) PORT_START("switch_row_4") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("RECORD") PORT_CODE(KEYCODE_R) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("BANK SELECT") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("BANK SELECT") PORT_CODE(KEYCODE_K) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A-440") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("TUNE") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("TO CASS") @@ -862,79 +880,116 @@ INPUT_PORTS_START(prophet5) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("TP304") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("TP306") - // All knob potentiometers are 10K linear. + // All knob potentiometers are 10K linear, unless otherwise noted. PORT_START("pot_0") // R217 - PORT_ADJUSTER(50, "GLIDE") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 0) + PORT_ADJUSTER(0, "GLIDE") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 0) PORT_START("pot_1") // R211 - PORT_ADJUSTER(50, "LFO FREQ") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 1) + PORT_ADJUSTER(127, "LFO FREQ") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 1) PORT_START("pot_2") // R216 - PORT_ADJUSTER(50, "WMOD SRC MIX") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 2) + PORT_ADJUSTER(0, "WMOD SRC MIX") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 2) PORT_START("pot_3") // R202 - PORT_ADJUSTER(50, "PMOD OSC B") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 3) + PORT_ADJUSTER(0, "PMOD OSC B") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 3) PORT_START("pot_4") // R201 - PORT_ADJUSTER(50, "PMOD FILT ENV") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 4) + PORT_ADJUSTER(0, "PMOD FILT ENV") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 4) PORT_START("pot_5") // R204 - PORT_ADJUSTER(50, "OSC A FREQ") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 5) + PORT_ADJUSTER(127, "OSC A FREQ") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 5) PORT_START("pot_6") // R213 - PORT_ADJUSTER(50, "OSC B FREQ") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 6) + PORT_ADJUSTER(127, "OSC B FREQ") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 6) PORT_START("pot_7") // R214 - PORT_ADJUSTER(50, "OSC B FINE") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 7) + PORT_ADJUSTER(127, "OSC B FINE") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 7) PORT_START("pot_8") // R101 - PORT_ADJUSTER(50, "FILT CUTOFF") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 8) + PORT_ADJUSTER(255, "FILT CUTOFF") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 8) PORT_START("pot_9") // R103 - PORT_ADJUSTER(50, "FILT ENV AMT") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 9) + PORT_ADJUSTER(0, "FILT ENV AMT") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 9) PORT_START("pot_10") // R208 - PORT_ADJUSTER(50, "MIX OSC B") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 10) + PORT_ADJUSTER(255, "MIX OSC B") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 10) PORT_START("pot_11") // R215 - PORT_ADJUSTER(50, "OSC B PW") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 11) + PORT_ADJUSTER(127, "OSC B PW") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 11) PORT_START("pot_12") // R207 - PORT_ADJUSTER(50, "MIX OSC A") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 12) + PORT_ADJUSTER(255, "MIX OSC A") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 12) PORT_START("pot_13") // R205 - PORT_ADJUSTER(50, "OSC A PW") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 13) + PORT_ADJUSTER(127, "OSC A PW") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 13) PORT_START("pot_14") // R210 - PORT_ADJUSTER(50, "MIX NOISE") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 14) + PORT_ADJUSTER(0, "MIX NOISE") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 14) PORT_START("pot_15") // R102 - PORT_ADJUSTER(50, "FILT RESONANCE") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 15) + PORT_ADJUSTER(0, "FILT RESONANCE") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 15) PORT_START("pot_16") // R105 - PORT_ADJUSTER(50, "FILT ATTACK") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 16) + PORT_ADJUSTER(10, "FILT ATTACK") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 16) PORT_START("pot_17") // R106 - PORT_ADJUSTER(50, "FILT DECAY") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 17) + PORT_ADJUSTER(10, "FILT DECAY") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 17) PORT_START("pot_18") // R107 - PORT_ADJUSTER(50, "FILT SUSTAIN") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 18) + PORT_ADJUSTER(255, "FILT SUSTAIN") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 18) PORT_START("pot_19") // R108 - PORT_ADJUSTER(50, "FILT RELEASE") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 19) + PORT_ADJUSTER(20, "FILT RELEASE") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 19) PORT_START("pot_20") // R109 - PORT_ADJUSTER(50, "AMP ATTACK") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 20) + PORT_ADJUSTER(10, "AMP ATTACK") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 20) PORT_START("pot_21") // R110 - PORT_ADJUSTER(50, "AMP DECAY") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 21) + PORT_ADJUSTER(10, "AMP DECAY") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 21) PORT_START("pot_22") // R111 - PORT_ADJUSTER(50, "AMP SUSTAIN") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 22) + PORT_ADJUSTER(255, "AMP SUSTAIN") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 22) PORT_START("pot_23") // R112 - PORT_ADJUSTER(50, "AMP RELEASE") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 23) + PORT_ADJUSTER(20, "AMP RELEASE") PORT_MINMAX(0, 255) + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(prophet5_state::pot_adjusted), 23) + + PORT_START("pot_tune") // R104, 100K, linear + PORT_ADJUSTER(50, "MASTER TUNE") + + PORT_START("pot_volume") // R113, 100K, linear + PORT_ADJUSTER(90, "VOLUME") + + PORT_START("wheel_pitch") // R1, 100K, linear + PORT_BIT(0xff, 50, IPT_PADDLE) PORT_NAME("PITCH WHEEL") PORT_MINMAX(0, 100) + PORT_SENSITIVITY(30) PORT_KEYDELTA(15) PORT_CENTERDELTA(30) + + PORT_START("wheel_mod") // R2, 100K, linear + PORT_ADJUSTER(0, "MOD WHEEL") PORT_START("trimmer_dac_gain") // R333, 100K trimmer. // Default value based on calibration instructions, with a small error due |
