summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author m1macrophage <168948267+m1macrophage@users.noreply.github.com>2025-11-23 09:07:02 -0800
committer GitHub <noreply@github.com>2025-11-23 18:07:02 +0100
commit41087f4e7db4fb122e549dc3b3e53147df62e5ed (patch)
tree5bb60173ac9ec178131aa9954cdf379714a20cb3
parent2b6a57013ae158b0fa85e9c6e789bf35327aad4e (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.lay1159
-rw-r--r--src/mame/sequential/prophet5.cpp137
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