summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author m1macrophage <168948267+m1macrophage@users.noreply.github.com>2025-02-24 04:17:41 -0800
committer GitHub <noreply@github.com>2025-02-24 13:17:41 +0100
commit6addc09da6ee16ac537dd4c46183ba5edb6f28f0 (patch)
treee31e6f0f238c2a67fde8b93405dd4d1511fbe0f4
parent67d0a1e2d521a8d948bc576394c31b573835fa9f (diff)
linn/linndrum.cpp: Added interactive layout for the LinnDrum. (#13404)
* linn/linndrum.cpp: Added interactive layout for LinnDrum. * linn/linndrum.cpp: Spell tuning correctly.
-rw-r--r--src/mame/layout/linn_linndrum.lay714
-rw-r--r--src/mame/linn/linndrum.cpp170
2 files changed, 843 insertions, 41 deletions
diff --git a/src/mame/layout/linn_linndrum.lay b/src/mame/layout/linn_linndrum.lay
new file mode 100644
index 00000000000..66530763c41
--- /dev/null
+++ b/src/mame/layout/linn_linndrum.lay
@@ -0,0 +1,714 @@
+<?xml version="1.0"?>
+<!--
+license:CC0-1.0
+copyright-holders:m1macrophage
+-->
+<mamelayout version="2">
+ <element name="txt_bass"><text string="BASS"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_snare"><text string="SNARE"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_toms"><text string="TOMS"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_hihat"><text string="HIHAT"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_ride"><text string="RIDE"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_crash"><text string="CRASH"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_congas"><text string="CONGAS"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_conga"><text string="CONGA"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_cabasa"><text string="CABASA"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_tambourine"><text string="TAMBOURINE"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_percussion"><text string="PERCUSSION"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drums"><text string="DRUMS"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+
+ <element name="txt_in"><text string="IN"><color red="0.91" green="0.48" blue="0.33"/></text></element>
+ <element name="txt_out"><text string="OUT"><color red="0.91" green="0.48" blue="0.33"/></text></element>
+ <element name="txt_cassette"><text string="CASSETTE"><color red="0.91" green="0.48" blue="0.33"/></text></element>
+ <element name="txt_sync"><text string="SYNC"><color red="0.91" green="0.48" blue="0.33"/></text></element>
+ <element name="txt_trigger"><text string="TRIGGER"><color red="0.91" green="0.48" blue="0.33"/></text></element>
+ <element name="txt_output"><text string="OUTPUT"><color red="0.91" green="0.48" blue="0.33"/></text></element>
+ <element name="txt_remote"><text string="REMOTE"><color red="0.91" green="0.48" blue="0.33"/></text></element>
+ <element name="txt_play"><text string="PLAY/STOP"><color red="0.91" green="0.48" blue="0.33"/></text></element>
+ <element name="txt_trigger_inputs"><text string="TRIGGER INPUTS"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_load"><text string="LOAD"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_verify"><text string="VERIFY"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_store"><text string="STORE"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_tempo"><text string="TEMPO"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_bpm"><text string="BPM/TRIGGER"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_volume"><text string="VOLUME"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_ext_sync"><text string="EXT. SYNC"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+
+ <element name="txt_drum_top_1"><text string="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_top_2"><text string="2"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_top_3"><text string="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_top_4"><text string="2"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_top_5"><text string="HI"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_top_6"><text string="LO"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_top_7"><text string="COWBELL"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_top_8"><text string="CLAPS"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_middle_1"><text string="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_middle_2"><text string="2"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_middle_3"><text string="OPEN"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_middle_4"><text string="HI"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_middle_5"><text string="MID"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_middle_6"><text string="LO"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_middle_7"><text string="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_middle_8"><text string="2"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_bottom_1"><text string="SIDESTICK"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_bottom_2"><text string="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_bottom_3"><text string="2"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_bottom_4"><text string="3"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_bottom_5"><text string="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_bottom_6"><text string="2"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_bottom_7"><text string=""><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_drum_bottom_8"><text string=""><color red="0.82" green="0.43" blue="0.31"/></text></element>
+
+ <element name="txt_tuning"><text string="TUNING"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_decay"><text string="DECAY"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_tune_1"><text string=""><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_tune_2"><text string="HI"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_tune_3"><text string="MID"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_tune_4"><text string="LO"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_tune_5"><text string="HI"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_tune_6"><text string="LO"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_tune_7"><text string="HIHAT"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+
+ <element name="txt_mixer"><text string="MIXER"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_left_1"><text string="LEFT" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_right_1"><text string="RIGHT" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_left_2"><text string="LEFT" align="2"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_right_2"><text string="RIGHT" align="2"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_1"><text string="BASS"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_2"><text string="SNARE"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_3"><text string="SIDESTICK"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_4"><text string="HIHAT"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_5"><text string="HI"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_6"><text string="MID"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_7"><text string="LO"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_8"><text string="RIDE"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_9"><text string="CRASH"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_10"><text string="CABASA"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_11"><text string="TAMB"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_12"><text string="HI"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_13"><text string="LO"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_14"><text string="COWBELL"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_15"><text string="CLAPS"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_slider_16"><text string="CLICK"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+
+ <element name="txt_create">
+ <text string="CREATE RHYTHM PATTERN / SONG"><color red="0.82" green="0.43" blue="0.31"/></text>
+ </element>
+ <element name="txt_select">
+ <text string="SELECT RHYTHM PATTERN"><color red="0.82" green="0.43" blue="0.31"/></text>
+ </element>
+ <element name="txt_song"><text string="SONG"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_pattern"><text string="PATTERN"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_step"><text string="STEP 0/% MEM"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_pattern_num"><text string="PATTERN#"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_correct"><text string="CORRECT"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_timing"><text string="TIMING"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_straight"><text string="STRAIGHT"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_shuffle"><text string="SHUFFLE"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_top_1"><text string="SONG#"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_top_2"><text string="END"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_top_3"><text string="DELETE"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_top_4"><text string="INSERT"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_top_5"><text string="&lt;-----"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_top_6"><text string="-----&gt;"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_top_7"><text string="ENTER"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_middle_1"><text string="ERROR"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_middle_2"><text string="BEFORE"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_middle_3"><text string="AFTER"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_middle_4"><text string="COPY"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_middle_5"><text string="LENGTH"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_middle_6"><text string="ERASE"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_create_middle_7"><text string="RECORD"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_top_1"><text string="" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_top_2"><text string="A" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_top_3"><text string="B" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_top_4"><text string="C" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_top_5"><text string="D" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_top_6"><text string="E" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_top_7"><text string="F" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_bottom_1"><text string="1/8" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_bottom_2"><text string="1/8T" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_bottom_3"><text string="1/16" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_bottom_4"><text string="1/16T" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_bottom_5"><text string="1/32" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_bottom_6"><text string="1/32T" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ <element name="txt_led_bottom_7"><text string="HI" align="1"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+
+ <repeat count="7">
+ <param name="i" start="1" increment="1"/>
+ <element name="txt_~i~"><text string="~i~"><color red="0.82" green="0.43" blue="0.31"/></text></element>
+ </repeat>
+
+ <element name="wood"><rect><color red="0.66" green="0.48" blue="0.37"/></rect></element>
+ <element name="case"><rect><color red="0.12" green="0.10" blue="0.12"/></rect></element>
+ <element name="line"><rect><color red="0.82" green="0.43" blue="0.31"/></rect></element>
+ <element name="dark_line"><rect><color red="0.61" green="0.34" blue="0.27"/></rect></element>
+ <element name="screw"><rect><color red="0.19" green="0.18" blue="0.18"/></rect></element>
+ <element name="jack"><rect><color red="0.35" green="0.35" blue="0.36"/></rect></element>
+
+ <element name="outline_cassette_tempo">
+ <image><data><![CDATA[
+ <rect stroke="#f28367" fill="none" stroke-width="3" width="124" height="400" rx="16" ry="16"/>
+ ]]></data></image>
+ </element>
+ <element name="outline_create">
+ <image><data><![CDATA[
+ <rect stroke="#f28367" fill="none" stroke-width="3" width="706" height="400" rx="16" ry="16"/>
+ ]]></data></image>
+ </element>
+ <element name="outline_drumpads">
+ <image><data><![CDATA[
+ <rect stroke="#f28367" fill="none" stroke-width="3" width="838" height="273" rx="16" ry="16"/>
+ ]]></data></image>
+ </element>
+ <element name="outline_play">
+ <image><data><![CDATA[
+ <rect stroke="#f28367" fill="none" stroke-width="3" width="124" height="273" rx="16" ry="16"/>
+ ]]></data></image>
+ </element>
+ <element name="outline_tuning">
+ <image><data><![CDATA[
+ <rect stroke="#f28367" fill="none" stroke-width="3" width="783" height="195" rx="16" ry="16"/>
+ ]]></data></image>
+ </element>
+ <element name="outline_volume">
+ <image><data><![CDATA[
+ <rect stroke="#f28367" fill="none" stroke-width="3" width="125" height="195" rx="16" ry="16"/>
+ ]]></data></image>
+ </element>
+ <element name="outline_mixer">
+ <image><data><![CDATA[
+ <rect stroke="#f28367" fill="none" stroke-width="3" width="916" height="479" rx="16" ry="16"/>
+ ]]></data></image>
+ </element>
+
+ <group name="button_group_top">
+ <element ref="line"><bounds x="0" y="0" width="~line_width~" height="2"/></element>
+ <element ref="line"><bounds x="0" y="0" width="2" height="17"/></element>
+ <element ref="line"><bounds x="~line_width~" y="0" width="2" height="17"/></element>
+ </group>
+ <group name="button_group_bottom">
+ <element ref="line"><bounds x="0" y="15" width="~line_width~" height="2"/></element>
+ <element ref="line"><bounds x="0" y="0" width="2" height="17"/></element>
+ <element ref="line"><bounds x="~line_width~" y="0" width="2" height="17"/></element>
+ </group>
+
+ <element name="led">
+ <disk state="0"><color red="0.28" green="0.06" blue="0.10"/></disk>
+ <disk state="1"><color red="0.81" green="0.21" blue="0.18"/></disk>
+ </element>
+
+ <element name="button">
+ <rect>
+ <bounds x="0" y="0" width="80" height="76"/>
+ <color red="0.06" green="0.04" blue="0.06"/>
+ </rect>
+ <rect>
+ <bounds x="5" y="4" width="70" height="68"/>
+ <color red="0.17" green="0.16" blue="0.17"/>
+ </rect>
+ <rect state="0">
+ <bounds x="12" y="12" width="56" height="52"/>
+ <color red="0.11" green="0.11" blue="0.13"/>
+ </rect>
+ <rect state="1">
+ <bounds x="12" y="12" width="56" height="52"/>
+ <color red="0.31" green="0.31" blue="0.33"/>
+ </rect>
+ </element>
+
+ <element name="knob_outer"><disk><color red="0.17" green="0.16" blue="0.18"/></disk></element>
+ <element name="knob_inner"><disk><color red="0.23" green="0.22" blue="0.24"/></disk></element>
+ <element name="knob_value_background"><rect><color red="0.0" green="0.0" blue="0.0" alpha="0.0"/></rect></element>
+ <element name="knob_value">
+ <simplecounter maxstate="100" digits="1"><color red="1.0" green="0.5" blue="0.2"/></simplecounter>
+ </element>
+ <group name="knob">
+ <element ref="knob_outer"><bounds x="0" y="0" width="68" height="68"/></element>
+ <element ref="knob_inner"><bounds x="9" y="9" width="50" height="50"/></element>
+ <element ref="knob_value_background" clickthrough="no">
+ <bounds x="17" y="22" width="34" height="24"/>
+ </element>
+ <element ref="knob_value" inputtag="~knob_input~" inputmask="0x7f" inputraw="yes">
+ <bounds x="17" y="22" width="34" height="24"/>
+ </element>
+ </group>
+
+ <element name="slider_area"><rect><color red="0.0" blue="0.0" green="0.0" alpha="0.0"/></rect></element>
+ <element name="slider_well"><rect><color red="0.05" blue="0.04" green="0.06"/></rect></element>
+ <element name="slider_knob"><rect><color red="0.27" blue="0.27" green="0.27"/></rect></element>
+ <group name="slider">
+ <element ref="slider_area" id="slider_~slider_input~">
+ <bounds x="0" y="0" width="32" height="~slider_height~"/>
+ </element>
+ <element ref="slider_well"><bounds x="8" y="0" width="16" height="~slider_height~"/></element>
+ <element ref="slider_knob" id="slider_knob_~slider_input~">>
+ <animate inputtag="~slider_input~" inputmask="0x7f"/>
+ <bounds state="100" x="10" y="0" width="12" height="28"/>
+ <bounds state="0" x="10" y="~slider_knob_max_y~" width="12" height="28"/>
+ </element>
+ </group>
+
+ <element name="display_background"><rect><color red="0.06" blue="0.01" green="0.05"/></rect></element>
+ <element name="display_digit"><led7seg><color red="0.81" blue="0.21" green="0.18"/></led7seg></element>
+ <group name="display">
+ <element ref="display_background"><bounds x="0" y="0" width="80" height="46"/></element>
+ <element ref="display_digit" name="~display_output~0"><bounds x="6" y="5" width="30" height="38"/></element>
+ <element ref="display_digit" name="~display_output~1"><bounds x="44" y="5" width="30" height="38"/></element>
+ </group>
+
+ <view name="Default Layout">
+ <bounds x="53" y="49" width="2113" height="1112"/>
+
+ <!-- Case -->
+ <element ref="screw"><bounds x="420" y="1145" width="29" height="13"/></element>
+ <element ref="screw"><bounds x="1780" y="1145" width="29" height="13"/></element>
+ <element ref="case"><bounds x="127" y="70" width="1965" height="1080"/></element>
+ <element ref="wood"><bounds x="55" y="50" width="72" height="1104"/></element>
+ <element ref="wood"><bounds x="2092" y="50" width="72" height="1104"/></element>
+ <element ref="dark_line"><bounds x="160" y="283" width="1897" height="3"/></element>
+ <element ref="dark_line"><bounds x="160" y="321" width="1897" height="3"/></element>
+
+ <!-- I/O -->
+ <element ref="jack"><bounds x="655" y="64" width="18" height="6"/></element>
+ <element ref="txt_cassette"><bounds x="855" y="99" width="68" height="17"/></element>
+ <element ref="txt_in"><bounds x="847" y="76" width="20" height="17"/></element>
+ <element ref="jack"><bounds x="842" y="64" width="37" height="6"/></element>
+ <element ref="txt_out"><bounds x="903" y="76" width="31" height="17"/></element>
+ <element ref="jack"><bounds x="904" y="64" width="37" height="6"/></element>
+ <element ref="txt_sync"><bounds x="1005" y="99" width="42" height="17"/></element>
+ <element ref="txt_in"><bounds x="985" y="76" width="20" height="17"/></element>
+ <element ref="jack"><bounds x="980" y="64" width="37" height="6"/></element>
+ <element ref="txt_out"><bounds x="1042" y="76" width="31" height="17"/></element>
+ <element ref="jack"><bounds x="1042" y="64" width="37" height="6"/></element>
+ <element ref="txt_trigger"><bounds x="1104" y="76" width="62" height="17"/></element>
+ <element ref="txt_output"><bounds x="1104" y="99" width="62" height="17"/></element>
+ <element ref="jack"><bounds x="1117" y="64" width="37" height="6"/></element>
+ <element ref="txt_remote"><bounds x="1177" y="76" width="62" height="17"/></element>
+ <element ref="txt_play"><bounds x="1173" y="99" width="73" height="17"/></element>
+ <element ref="jack"><bounds x="1193" y="64" width="37" height="6"/></element>
+ <element ref="line"><bounds x="1265" y="107" width="155" height="2"/></element>
+ <element ref="line"><bounds x="1539" y="107" width="155" height="2"/></element>
+ <element ref="txt_trigger_inputs"><bounds x="1426" y="99" width="105" height="17"/></element>
+ <repeat count="5">
+ <param name="i" start="1" increment="1"/>
+ <param name="x" start="1275" increment="94"/>
+ <element ref="txt_~i~"><bounds x="~x~" y="76" width="37" height="17"/></element>
+ <element ref="jack"><bounds x="~x~" y="64" width="37" height="6"/></element>
+ </repeat>
+
+ <!-- CASSETTE -->
+ <element ref="outline_cassette_tempo"><bounds x="163" y="425" width="124" height="400"/></element>
+ <element ref="txt_cassette"><bounds x="166" y="435" width="118" height="24"/></element>
+ <element ref="button" inputtag="keyboard_col_2" inputmask="0x08">
+ <bounds x="185" y="487" width="80" height="76"/>
+ </element>
+ <element ref="txt_store"><bounds x="166" y="564" width="118" height="17"/></element>
+ <element ref="led" name="led_store"><bounds x="213" y="586" width="24" height="24"/></element>
+ <element ref="line"><bounds x="224" y="612" width="2" height="20"/></element>
+ <element ref="txt_verify"><bounds x="166" y="633" width="118" height="17"/></element>
+ <element ref="line"><bounds x="224" y="651" width="2" height="20"/></element>
+ <element ref="led" name="led_load"><bounds x="213" y="673" width="24" height="24"/></element>
+ <element ref="txt_load"><bounds x="166" y="703" width="118" height="17"/></element>
+ <element ref="button" inputtag="keyboard_col_2" inputmask="0x10">
+ <bounds x="185" y="720" width="80" height="76"/>
+ </element>
+
+ <!-- CREATE RHYTHM PATTERN / SONG -->
+
+ <element ref="outline_create"><bounds x="295" y="425" width="706" height="400"/></element>
+ <element ref="txt_create"><bounds x="463" y="435" width="355" height="24"/></element>
+ <element ref="line"><bounds x="311" y="445" width="150" height="2"/></element>
+ <element ref="line"><bounds x="819" y="445" width="165" height="2"/></element>
+
+ <element ref="txt_song"><bounds x="311" y="467" width="80" height="17"/></element>
+ <element ref="led" name="led_song"><bounds x="398" y="462" width="24" height="24"/></element>
+ <element ref="button" inputtag="keyboard_col_1" inputmask="0x02">
+ <bounds x="311" y="487" width="80" height="76"/>
+ </element>
+ <element ref="txt_pattern"><bounds x="311" y="564" width="80" height="17"/></element>
+ <element ref="led" name="led_pattern"><bounds x="398" y="565" width="24" height="24"/></element>
+
+ <param name="display_output" value="display_step_"/>
+ <group ref="display"><bounds x="314" y="623" width="80" height="46"/></group>
+ <element ref="txt_pattern"><bounds x="309" y="786" width="90" height="17"/></element>
+ <param name="display_output" value="display_pattern_"/>
+ <group ref="display"><bounds x="314" y="737" width="80" height="46"/></group>
+ <element ref="txt_step"><bounds x="309" y="672" width="90" height="17"/></element>
+
+ <!-- Text labels for buttons and LEDs. -->
+ <repeat count="7">
+ <param name="i" start="1" increment="1"/>
+ <param name="x" start="428" increment="80"/>
+ <element ref="txt_create_top_~i~"><bounds x="~x~" y="467" width="80" height="17"/></element>
+ <element ref="txt_create_middle_~i~"><bounds x="~x~" y="564" width="80" height="17"/></element>
+ <element ref="txt_~i~"><bounds x="~x~" y="700" width="80" height="17"/></element>
+ <param name="led_txt_x" start="483" increment="80"/>
+ <element ref="txt_led_top_~i~"><bounds x="~led_txt_x~" y="628" width="40" height="17"/></element>
+ <element ref="txt_led_bottom_~i~"><bounds x="~led_txt_x~" y="665" width="40" height="17"/></element>
+ </repeat>
+
+ <!-- Top row of buttons. -->
+ <repeat count="4">
+ <param name="x" start="428" increment="80"/>
+ <param name="input_mask" start="0x04" lshift="1"/>
+ <element ref="button" inputtag="keyboard_col_1" inputmask="~input_mask~">
+ <bounds x="~x~" y="487" width="80" height="76"/>
+ </element>
+ </repeat>
+ <repeat count="3">
+ <param name="x" start="748" increment="80"/>
+ <param name="input_mask" start="0x01" lshift="1"/>
+ <element ref="button" inputtag="keyboard_col_2" inputmask="~input_mask~">
+ <bounds x="~x~" y="487" width="80" height="76"/>
+ </element>
+ </repeat>
+
+ <!-- Top row of LEDs. -->
+ <element ref="led" name="led_a"><bounds x="536" y="625" width="24" height="24"/></element>
+ <element ref="led" name="led_b"><bounds x="616" y="625" width="24" height="24"/></element>
+ <element ref="led" name="led_c"><bounds x="696" y="625" width="24" height="24"/></element>
+ <element ref="led" name="led_d"><bounds x="776" y="625" width="24" height="24"/></element>
+ <element ref="led" name="led_e"><bounds x="856" y="625" width="24" height="24"/></element>
+ <element ref="led" name="led_f"><bounds x="936" y="625" width="24" height="24"/></element>
+
+ <!-- Bottom row of LEDs. -->
+ <element ref="led" name="led_1_8"><bounds x="456" y="662" width="24" height="24"/></element>
+ <element ref="led" name="led_1_8_t"><bounds x="536" y="662" width="24" height="24"/></element>
+ <element ref="led" name="led_1_16"><bounds x="616" y="662" width="24" height="24"/></element>
+ <element ref="led" name="led_1_16_t"><bounds x="696" y="662" width="24" height="24"/></element>
+ <element ref="led" name="led_1_32"><bounds x="776" y="662" width="24" height="24"/></element>
+ <element ref="led" name="led_1_32_t"><bounds x="856" y="662" width="24" height="24"/></element>
+ <element ref="led" name="led_hi"><bounds x="936" y="662" width="24" height="24"/></element>
+
+ <!-- Bottom row of buttons. -->
+ <repeat count="6">
+ <param name="x" start="428" increment="80"/>
+ <param name="input_mask" start="0x01" lshift="1"/>
+ <element ref="button" inputtag="keyboard_col_0" inputmask="~input_mask~">
+ <bounds x="~x~" y="720" width="80" height="76"/>
+ </element>
+ </repeat>
+ <element ref="button" inputtag="keyboard_col_1" inputmask="0x01">
+ <bounds x="908" y="720" width="80" height="76"/>
+ </element>
+
+ <element ref="txt_correct"><bounds x="428" y="588" width="80" height="17"/></element>
+ <element ref="txt_timing"><bounds x="559" y="588" width="52" height="17"/></element>
+ <element ref="line"><bounds x="518" y="595" width="40" height="2"/></element>
+ <element ref="line"><bounds x="613" y="595" width="40" height="2"/></element>
+
+ <element ref="txt_straight"><bounds x="508" y="606" width="80" height="17"/></element>
+ <element ref="txt_shuffle"><bounds x="908" y="606" width="80" height="17"/></element>
+ <element ref="line"><bounds x="593" y="613" width="310" height="2"/></element>
+
+ <element ref="line"><bounds x="428" y="564" width="2" height="134"/></element>
+ <element ref="line"><bounds x="508" y="564" width="2" height="90"/></element>
+ <element ref="line"><bounds x="668" y="564" width="2" height="35"/></element>
+ <element ref="line"><bounds x="668" y="597" width="320" height="2"/></element>
+ <element ref="line"><bounds x="508" y="652" width="480" height="2"/></element>
+ <element ref="line"><bounds x="428" y="696" width="560" height="2"/></element>
+ <element ref="line"><bounds x="986" y="597" width="2" height="99"/></element>
+
+ <element ref="txt_select"><bounds x="616" y="798" width="168" height="17"/></element>
+ <element ref="line"><bounds x="431" y="805" width="183" height="2"/></element>
+ <element ref="line"><bounds x="787" y="805" width="183" height="2"/></element>
+
+ <!-- Drum pads -->
+
+ <element ref="outline_drumpads"><bounds x="163" y="833" width="838" height="273"/></element>
+ <element ref="led" name="led_percussion"><bounds x="955" y="851" width="24" height="24"/></element>
+ <element ref="line"><bounds x="966" y="877" width="2" height="150"/></element>
+ <element ref="line"><bounds x="940" y="1027" width="26" height="2"/></element>
+
+ <!-- Text for all drum pads. -->
+ <repeat count="8">
+ <param name="i" start="1" increment="1"/>
+ <param name="x" start="187" increment="96"/>
+ <element ref="txt_drum_top_~i~"><bounds x="~x~" y="861" width="80" height="17"/></element>
+ <element ref="txt_drum_middle_~i~"><bounds x="~x~" y="957" width="80" height="17"/></element>
+ <element ref="txt_drum_bottom_~i~"><bounds x="~x~" y="1070" width="80" height="17"/></element>
+ </repeat>
+
+ <!-- Top row of drum pads. -->
+ <repeat count="3">
+ <param name="x" start="187" increment="96"/>
+ <param name="input_mask" start="0x08" lshift="1"/>
+ <element ref="button" inputtag="keyboard_col_4" inputmask="~input_mask~">
+ <bounds x="~x~" y="878" width="80" height="76"/>
+ </element>
+ </repeat>
+ <repeat count="5">
+ <param name="x" start="475" increment="96"/>
+ <param name="input_mask" start="0x01" lshift="1"/>
+ <element ref="button" inputtag="keyboard_col_5" inputmask="~input_mask~">
+ <bounds x="~x~" y="878" width="80" height="76"/>
+ </element>
+ </repeat>
+
+ <!-- Bottom row of drum pads. -->
+ <repeat count="5">
+ <param name="x" start="187" increment="96"/>
+ <param name="input_mask" start="0x02" lshift="1"/>
+ <element ref="button" inputtag="keyboard_col_3" inputmask="~input_mask~">
+ <bounds x="~x~" y="991" width="80" height="76"/>
+ </element>
+ </repeat>
+ <repeat count="3">
+ <param name="x" start="667" increment="96"/>
+ <param name="input_mask" start="0x01" lshift="1"/>
+ <element ref="button" inputtag="keyboard_col_4" inputmask="~input_mask~">
+ <bounds x="~x~" y="991" width="80" height="76"/>
+ </element>
+ </repeat>
+
+ <param name="line_width" value="176"/>
+ <group ref="button_group_top"><bounds x="187" y="854" width="~line_width~" height="17"/></group>
+ <element ref="case"><bounds x="251" y="848" width="53" height="17"/></element>
+ <element ref="txt_cabasa"><bounds x="251" y="848" width="53" height="17"/></element>
+ <group ref="button_group_top"><bounds x="379" y="854" width="~line_width~" height="17"/></group>
+ <element ref="case"><bounds x="422" y="848" width="89" height="17"/></element>
+ <element ref="txt_tambourine"><bounds x="422" y="848" width="89" height="17"/></element>
+ <group ref="button_group_top"><bounds x="571" y="854" width="~line_width~" height="17"/></group>
+ <element ref="case"><bounds x="635" y="848" width="54" height="17"/></element>
+ <element ref="txt_conga"><bounds x="635" y="848" width="54" height="17"/></element>
+
+ <param name="line_width" value="272"/>
+ <group ref="button_group_bottom"><bounds x="187" y="963" width="~line_width~" height="17"/></group>
+ <element ref="case"><bounds x="254" y="970" width="46" height="17"/></element>
+ <element ref="txt_hihat"><bounds x="254" y="970" width="46" height="17"/></element>
+ <group ref="button_group_bottom"><bounds x="475" y="963" width="~line_width~" height="17"/></group>
+ <element ref="case"><bounds x="543" y="970" width="43" height="17"/></element>
+ <element ref="txt_toms"><bounds x="543" y="970" width="43" height="17"/></element>
+ <param name="line_width" value="176"/>
+ <group ref="button_group_bottom"><bounds x="763" y="963" width="~line_width~" height="17"/></group>
+ <element ref="case"><bounds x="834" y="970" width="37" height="17"/></element>
+ <element ref="txt_ride"><bounds x="834" y="970" width="37" height="17"/></element>
+
+ <param name="line_width" value="368"/>
+ <group ref="button_group_bottom"><bounds x="187" y="1073" width="~line_width~" height="17"/></group>
+ <element ref="case"><bounds x="349" y="1080" width="50" height="17"/></element>
+ <element ref="txt_snare"><bounds x="349" y="1080" width="50" height="17"/></element>
+ <param name="line_width" value="176"/>
+ <group ref="button_group_bottom"><bounds x="571" y="1073" width="~line_width~" height="17"/></group>
+ <element ref="case"><bounds x="641" y="1080" width="40" height="17"/></element>
+ <element ref="txt_bass"><bounds x="641" y="1080" width="40" height="17"/></element>
+ <element ref="txt_crash"><bounds x="780" y="1080" width="50" height="17"/></element>
+ <element ref="txt_percussion"><bounds x="860" y="1080" width="80" height="17"/></element>
+
+ <!-- TEMPO -->
+ <element ref="outline_cassette_tempo"><bounds x="1007" y="425" width="124" height="400"/></element>
+ <element ref="txt_tempo"><bounds x="1010" y="435" width="118" height="24"/></element>
+ <param name="knob_input" value="pot_tempo"/>
+ <group ref="knob"><bounds x="1037" y="488" width="68" height="68"/></group>
+ <element ref="button" inputtag="keyboard_col_3" inputmask="0x01">
+ <bounds x="1029" y="577" width="80" height="76"/>
+ </element>
+ <element ref="txt_bpm"><bounds x="1010" y="657" width="118" height="17"/></element>
+ <element ref="led" name="led_ext_sync"><bounds x="1057" y="686" width="24" height="24"/></element>
+ <element ref="button" inputtag="keyboard_col_2" inputmask="0x20">
+ <bounds x="1029" y="720" width="80" height="76"/>
+ </element>
+ <element ref="txt_ext_sync"><bounds x="1010" y="798" width="118" height="17"/></element>
+
+ <!-- PLAY/STOP -->
+ <element ref="outline_play"><bounds x="1007" y="833" width="124" height="273"/></element>
+ <element ref="led" name="led_play_stop"><bounds x="1057" y="899" width="24" height="24"/></element>
+ <element ref="line"><bounds x="1067" y="925" width="2" height="62"/></element>
+ <element ref="button" inputtag="play_stop" inputmask="0x01">
+ <bounds x="1029" y="988" width="80" height="76"/>
+ </element>
+ <element ref="txt_play"><bounds x="1012" y="1068" width="114" height="24"/></element>
+
+ <!-- TUNING -->
+ <element ref="outline_tuning"><bounds x="1138" y="425" width="783" height="195"/></element>
+ <element ref="txt_tuning"><bounds x="1473" y="435" width="118" height="24"/></element>
+ <element ref="line"><bounds x="1183" y="445" width="295" height="2"/></element>
+ <element ref="line"><bounds x="1590" y="445" width="295" height="2"/></element>
+ <repeat count="7">
+ <param name="i" start="1" increment="1"/>
+ <param name="x" start="1183" increment="106"/>
+ <param name="knob_input" value="pot_tuning_~i~"/>
+ <group ref="knob"><bounds x="~x~" y="495" width="54" height="54"/></group>
+ <element ref="txt_tune_~i~"><bounds x="~x~" y="560" width="54" height="17"/></element>
+ </repeat>
+ <element ref="txt_snare"><bounds x="1183" y="582" width="54" height="17"/></element>
+ <element ref="txt_toms"><bounds x="1395" y="582" width="54" height="17"/></element>
+ <element ref="line"><bounds x="1286" y="590" width="108" height="2"/></element>
+ <element ref="line"><bounds x="1450" y="590" width="108" height="2"/></element>
+ <element ref="txt_congas"><bounds x="1661" y="582" width="54" height="17"/></element>
+ <element ref="line"><bounds x="1604" y="590" width="50" height="2"/></element>
+ <element ref="line"><bounds x="1720" y="590" width="50" height="2"/></element>
+ <element ref="txt_decay"><bounds x="1819" y="582" width="54" height="17"/></element>
+
+ <!-- VOLUME -->
+ <element ref="outline_volume"><bounds x="1929" y="425" width="125" height="195"/></element>
+ <element ref="txt_volume"><bounds x="1933" y="435" width="118" height="24"/></element>
+ <param name="knob_input" value="pot_volume"/>
+ <group ref="knob"><bounds x="1960" y="488" width="68" height="68"/></group>
+
+ <!-- MIXER -->
+
+ <element ref="outline_mixer"><bounds x="1138" y="627" width="916" height="479"/></element>
+ <element ref="txt_mixer"><bounds x="1560" y="1067" width="75" height="24"/></element>
+ <element ref="line"><bounds x="1200" y="1079" width="355" height="2"/></element>
+ <element ref="line"><bounds x="1640" y="1079" width="355" height="2"/></element>
+
+ <param name="line_width" value="150"/>
+ <group ref="button_group_top"><bounds x="1390" y="790" width="~line_width~" height="17"/></group>
+ <element ref="case"><bounds x="1442" y="783" width="46" height="17"/></element>
+ <element ref="txt_toms"><bounds x="1442" y="783" width="46" height="17"/></element>
+ <param name="line_width" value="98"/>
+ <group ref="button_group_top"><bounds x="1752" y="790" width="~line_width~" height="17"/></group>
+ <element ref="case"><bounds x="1775" y="783" width="55" height="17"/></element>
+ <element ref="txt_congas"><bounds x="1775" y="783" width="55" height="17"/></element>
+
+ <element ref="txt_drums"><bounds x="1386" y="836" width="49" height="17"/></element>
+ <element ref="line"><bounds x="1180" y="844" width="201" height="2"/></element>
+ <element ref="line"><bounds x="1440" y="844" width="201" height="2"/></element>
+ <element ref="txt_percussion"><bounds x="1767" y="836" width="79" height="17"/></element>
+ <element ref="line"><bounds x="1653" y="844" width="108" height="2"/></element>
+ <element ref="line"><bounds x="1850" y="844" width="100" height="2"/></element>
+
+ <repeat count="16">
+ <param name="i" start="1" increment="1"/>
+ <param name="slider_x" start="1188" increment="52"/>
+ <param name="txt_x" start="1181" increment="52"/>
+ <param name="slider_height" value="96"/>
+ <param name="slider_knob_max_y" value="68"/>
+ <param name="slider_input" value="pot_pan_~i~"/>
+ <group ref="slider"><bounds x="~slider_x~" y="665" width="32" height="~slider_height~"/></group>
+ <element ref="txt_slider_~i~"><bounds x="~txt_x~" y="809" width="46" height="17"/></element>
+ <param name="slider_height" value="186"/>
+ <param name="slider_knob_max_y" value="158"/>
+ <param name="slider_input" value="pot_gain_~i~"/>
+ <group ref="slider"><bounds x="~slider_x~" y="867" width="32" height="~slider_height~"/></group>
+ </repeat>
+
+ <element ref="txt_left_2"><bounds x="1148" y="671" width="40" height="17"/></element>
+ <element ref="txt_right_2"><bounds x="1148" y="738" width="40" height="17"/></element>
+ <element ref="txt_left_1"><bounds x="2006" y="671" width="40" height="17"/></element>
+ <element ref="txt_right_1"><bounds x="2006" y="738" width="40" height="17"/></element>
+ </view>
+
+ <script><![CDATA[
+ file:set_resolve_tags_callback(
+ function()
+ local id_port_index <const> = string.len("slider_knob_") + 1
+
+ -- State used by pointer handlers.
+ local sliders = {} -- Info about all sliders (constant after initialization).
+ local pointers = {} -- Pointer tracking state.
+
+ -- Gather relevant elements and inputs into `sliders`.
+ local view = file.views["Default Layout"]
+ for i = 1, #view.items do
+ local item = view.items:at(i)
+ if item.id ~= nil and string.find(item.id, "slider_knob_") == 1 then
+ local slider_id = string.sub(item.id, id_port_index)
+
+ local port = file.device:ioport(slider_id)
+ local field = nil
+ if port ~= nil then
+ for k, val in pairs(port.fields) do
+ field = val
+ break
+ end
+ if field == nil then
+ print("LAYOUT ERROR - Port does not have a field: " .. slider_id)
+ end
+ else
+ print("LAYOUT ERROR - Port not found: " .. slider_id)
+ end
+
+ local slider = view.items["slider_" .. slider_id]
+ if slider == nil then
+ print("LAYOUT ERROR - Element: 'slider_" .. slider_id .. "' does not exist.")
+ end
+
+ local slider_info = {}
+ slider_info.slider = slider
+ slider_info.knob = item
+ slider_info.field = field
+ table.insert(sliders, slider_info)
+ end
+ end
+
+ local function forget_pointers()
+ pointers = {}
+ end
+
+ local function pointer_lost(type, id, dev, x, y, up, cnt)
+ pointers[id] = nil
+ end
+
+ local function pointer_updated(type, id, dev, x, y, btn, dn, up, cnt)
+ -- Button not pressed? Reset state of current pointer.
+ if btn & 1 == 0 then
+ pointers[id] = nil
+ return
+ end
+
+ -- Button just pressed? Find affected slider, if any.
+ if dn & 1 ~= 0 then
+ for i = 1, #sliders do
+ if sliders[i].knob.bounds:includes(x, y) then
+ local pointer = {}
+ pointer.selected_slider = i
+ pointer.relative = true
+ pointer.start_y = y
+ pointer.start_value = sliders[i].field.user_value
+ pointers[id] = pointer
+ break
+ elseif sliders[i].slider.bounds:includes(x, y) then
+ local pointer = {}
+ pointer.selected_slider = i
+ pointer.relative = false
+ pointers[id] = pointer
+ break
+ end
+ end
+ end
+
+ -- No slider selected by current pointer? Nothing to do.
+ if pointers[id] == nil then
+ return
+ end
+
+ -- A slider is selected. Update state and, indirectly,
+ -- slider knob position, based on the pointer's Y position.
+ -- It is assumed the attached IO field is an IPT_ADJUSTER
+ -- with a range of 0-100 (the default).
+
+ local pointer = pointers[id]
+ local slider_info = sliders[pointer.selected_slider]
+
+ local knob_half_height = slider_info.knob.bounds.height / 2
+ local min_y = slider_info.slider.bounds.y0 + knob_half_height
+ local max_y = slider_info.slider.bounds.y1 - knob_half_height
+
+ local new_value = 0
+ if pointer.relative then
+ -- User clicked on the knob. New value depends on how
+ -- much the knob was dragged.
+ new_value = pointer.start_value - 100 * (y - pointer.start_y) / (max_y - min_y)
+ else
+ -- User clicked elsewhere on the slider. New value
+ -- depends on the absolute position of the click.
+ new_value = 100 - 100 * (y - min_y) / (max_y - min_y)
+ end
+
+ new_value = math.floor(new_value + 0.5)
+ if new_value < 0 then new_value = 0 end
+ if new_value > 100 then new_value = 100 end
+ slider_info.field.user_value = new_value
+ end
+
+ view:set_pointer_updated_callback(pointer_updated)
+ view:set_pointer_left_callback(pointer_lost)
+ view:set_pointer_aborted_callback(pointer_lost)
+ view:set_forget_pointers_callback(forget_pointers)
+ end)
+ ]]></script>
+</mamelayout>
+
diff --git a/src/mame/linn/linndrum.cpp b/src/mame/linn/linndrum.cpp
index 2613e06dc62..608b3cd4a88 100644
--- a/src/mame/linn/linndrum.cpp
+++ b/src/mame/linn/linndrum.cpp
@@ -17,8 +17,7 @@ variations, which brings the total to 24 different sounds.
The driver is based on the LinnDrum's service manual and schematics, and is
intended as an educational tool.
-Most of the digital functionality is emulated, though it is not very usable due
-to the lack of a layout. Audio is not yet emulated.
+Most of the digital functionality is emulated. Audio is not yet emulated.
PCBoards:
* CPU board. 2 sections in schematics:
@@ -34,16 +33,17 @@ PCBoards:
Usage:
-Since there is no layout yet, usability is limited.
+The driver includes a (mostly) interactive layout, including buttons, LEDs and
+sliders. The only non-interactive widgets right now are the knobs (such as
+tuning and volume). Those will display their current value, but they can only
+be modified by the Slider Control menu.
-Run the driver with `-log`:
+Since there is no audio, the driver logs triggers and other info. To see these
+run the driver with `-log`:
./mame -window linndrum -log
Tail the log file:
(on linux): tail -f error.log
-
-Press a few of the assigned buttons (B for bass drum, N for snare, T for toms),
-and see the voice triggers in the log.
*/
#include "emu.h"
@@ -53,6 +53,8 @@ and see the voice triggers in the log.
#include "machine/rescap.h"
#include "machine/timer.h"
+#include "linn_linndrum.lh"
+
#define LOG_KEYBOARD (1U << 1)
#define LOG_DEBOUNCE (1U << 2)
#define LOG_TEMPO (1U << 3)
@@ -368,6 +370,8 @@ void linndrum_state::linndrum(machine_config &config)
TIMER(config, m_debounce_timer).configure_generic( // 556, U30B.
FUNC(linndrum_state::debounce_timer_elapsed));
+ config.set_default_layout(layout_linn_linndrum);
+
// Latches connected to cathodes of LEDs (through resistors), so they are
// active-low.
@@ -413,51 +417,51 @@ DECLARE_INPUT_CHANGED_MEMBER(linndrum_state::tempo_pot_adjusted)
// PORT_NAMEs are based on the annotations in the schematic.
INPUT_PORTS_START(linndrum)
PORT_START("keyboard_col_0")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("1")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("2")
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("3")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("4")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("5")
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("1") PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("2") PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("3") PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("4") PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("5") PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("6") PORT_CODE(KEYCODE_6)
PORT_START("keyboard_col_1")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("7")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SONG/PAT.")
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SONG#")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("END")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("DELETE")
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("INSERT")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("7") PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SONG/PAT.") PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SONG#") PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("END") PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("DELETE") PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("INSERT") PORT_CODE(KEYCODE_T)
PORT_START("keyboard_col_2")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("<-")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("->")
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("ENTER")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("STORE")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("LOAD")
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("EXT.SYNC") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("<-") PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("->") PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("ENTER") PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("STORE") PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("LOAD") PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("EXT.SYNC") PORT_CODE(KEYCODE_L)
PORT_START("keyboard_col_3")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("BPM/TRIG.")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SIDESTICK")
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SNARE 1") PORT_CODE(KEYCODE_N)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SNARE 2")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SNARE 3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("BPM/TRIG.") PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SIDESTICK") PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SNARE 1") PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SNARE 2") PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("SNARE 3") PORT_CODE(KEYCODE_V)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("BASS 1") PORT_CODE(KEYCODE_B)
PORT_START("keyboard_col_4")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("BASS 2")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("CRASH")
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("PERC.") PORT_CODE(KEYCODE_P)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("CABASA1 / HIHAT1")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("CABASA2 / HIHAT2")
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("TAMP 1 / HIHAT O")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("BASS 2") PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("CRASH") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("PERC.") PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("CABASA1 / HIHAT1") PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("CABASA2 / HIHAT2") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("TAMP 1 / HIHAT O") PORT_CODE(KEYCODE_D)
PORT_START("keyboard_col_5")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("TAMP 2 / HI TOM")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("HI CONGA / MID TOM") PORT_CODE(KEYCODE_T)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("LO CONGA / LO TOM")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("COWBELL / RIDE 1")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("CLAPS / RIDE 2") PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("TAMP 2 / HI TOM") PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("HI CONGA / MID TOM") PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("LO CONGA / LO TOM") PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("COWBELL / RIDE 1") PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("CLAPS / RIDE 2") PORT_CODE(KEYCODE_K)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
// The play-stop button and footswitch input are both connected together
@@ -482,6 +486,90 @@ INPUT_PORTS_START(linndrum)
PORT_START("pot_tempo")
PORT_ADJUSTER(50, "TEMPO")
PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(linndrum_state::tempo_pot_adjusted), 0)
+
+ PORT_START("pot_volume")
+ PORT_ADJUSTER(100, "MASTER VOLUME")
+
+ PORT_START("pot_tuning_1")
+ PORT_ADJUSTER(50, "SNARE TUNING");
+ PORT_START("pot_tuning_2")
+ PORT_ADJUSTER(50, "HI TOM TUNING");
+ PORT_START("pot_tuning_3")
+ PORT_ADJUSTER(50, "MID TOM TUNING");
+ PORT_START("pot_tuning_4")
+ PORT_ADJUSTER(50, "LO TOM TUNING");
+ PORT_START("pot_tuning_5")
+ PORT_ADJUSTER(50, "HI CONGAS TUNING");
+ PORT_START("pot_tuning_6")
+ PORT_ADJUSTER(50, "LO CONGAS TUNING");
+ PORT_START("pot_tuning_7")
+ PORT_ADJUSTER(50, "HIHAT DECAY");
+
+ PORT_START("pot_pan_1")
+ PORT_ADJUSTER(50, "BASS PAN")
+ PORT_START("pot_pan_2")
+ PORT_ADJUSTER(50, "SNARE PAN")
+ PORT_START("pot_pan_3")
+ PORT_ADJUSTER(50, "SIDESTICK PAN")
+ PORT_START("pot_pan_4")
+ PORT_ADJUSTER(50, "HIHAT PAN")
+ PORT_START("pot_pan_5")
+ PORT_ADJUSTER(50, "HI TOM PAN")
+ PORT_START("pot_pan_6")
+ PORT_ADJUSTER(50, "MID TOM PAN")
+ PORT_START("pot_pan_7")
+ PORT_ADJUSTER(50, "LO TOM PAN")
+ PORT_START("pot_pan_8")
+ PORT_ADJUSTER(50, "RIDE PAN")
+ PORT_START("pot_pan_9")
+ PORT_ADJUSTER(50, "CRASH PAN")
+ PORT_START("pot_pan_10")
+ PORT_ADJUSTER(50, "CABASA PAN")
+ PORT_START("pot_pan_11")
+ PORT_ADJUSTER(50, "TAMB PAN")
+ PORT_START("pot_pan_12")
+ PORT_ADJUSTER(50, "HI CONGA PAN")
+ PORT_START("pot_pan_13")
+ PORT_ADJUSTER(50, "LO CONGA PAN")
+ PORT_START("pot_pan_14")
+ PORT_ADJUSTER(50, "COWBELL PAN")
+ PORT_START("pot_pan_15")
+ PORT_ADJUSTER(50, "CLAPS PAN")
+ PORT_START("pot_pan_16")
+ PORT_ADJUSTER(50, "CLICK PAN")
+
+ PORT_START("pot_gain_1")
+ PORT_ADJUSTER(100, "BASS GAIN")
+ PORT_START("pot_gain_2")
+ PORT_ADJUSTER(100, "SNARE GAIN")
+ PORT_START("pot_gain_3")
+ PORT_ADJUSTER(100, "SIDESTICK GAIN")
+ PORT_START("pot_gain_4")
+ PORT_ADJUSTER(100, "HIHAT GAIN")
+ PORT_START("pot_gain_5")
+ PORT_ADJUSTER(100, "HI TOM GAIN")
+ PORT_START("pot_gain_6")
+ PORT_ADJUSTER(100, "MID TOM GAIN")
+ PORT_START("pot_gain_7")
+ PORT_ADJUSTER(100, "LO TOM GAIN")
+ PORT_START("pot_gain_8")
+ PORT_ADJUSTER(100, "RIDE GAIN")
+ PORT_START("pot_gain_9")
+ PORT_ADJUSTER(100, "CRASH GAIN")
+ PORT_START("pot_gain_10")
+ PORT_ADJUSTER(100, "CABASA GAIN")
+ PORT_START("pot_gain_11")
+ PORT_ADJUSTER(100, "TAMB GAIN")
+ PORT_START("pot_gain_12")
+ PORT_ADJUSTER(100, "HI CONGA GAIN")
+ PORT_START("pot_gain_13")
+ PORT_ADJUSTER(100, "LO CONGA GAIN")
+ PORT_START("pot_gain_14")
+ PORT_ADJUSTER(100, "COWBELL GAIN")
+ PORT_START("pot_gain_15")
+ PORT_ADJUSTER(100, "CLAPS GAIN")
+ PORT_START("pot_gain_16")
+ PORT_ADJUSTER(100, "CLICK GAIN")
INPUT_PORTS_END
ROM_START(linndrum)