summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author arbee <rb6502@users.noreply.github.com>2025-12-26 22:08:25 -0500
committer arbee <rb6502@users.noreply.github.com>2025-12-26 22:08:25 -0500
commit6f4ac2fcad9524184a039d82a85b8b35f83ea64f (patch)
tree31b3b02b094ef7e69f0e92c6c91e2f717c686296
parent121e29e520adbb3c787598e8938fa27e324fa595 (diff)
akai/mpc2000.cpp: Put a valid ATAPI device on the ATA bus to stop the long delay on startup. Only a Zip250 is actually supported by the firmware. [R. Belmont]
akai/mpc60.cpp: Fixed labeling of Enter key. [R. Belmont] akai/s3000.cpp: Added layouts for CD3000i and S3000/S3000i. [Guru] layout/s2000.lay: Minor fixes and updates. [Guru]
-rw-r--r--src/mame/akai/mpc2000.cpp38
-rw-r--r--src/mame/akai/mpc60.cpp2
-rw-r--r--src/mame/akai/s3000.cpp25
-rw-r--r--src/mame/layout/cd3000i.lay881
-rw-r--r--src/mame/layout/s2000.lay542
-rw-r--r--src/mame/layout/s3000.lay877
6 files changed, 2185 insertions, 180 deletions
diff --git a/src/mame/akai/mpc2000.cpp b/src/mame/akai/mpc2000.cpp
index 2edaf07a5b9..89da6b203a8 100644
--- a/src/mame/akai/mpc2000.cpp
+++ b/src/mame/akai/mpc2000.cpp
@@ -47,6 +47,7 @@
#include "machine/74259.h"
#include "machine/i8255.h"
#include "machine/input_merger.h"
+#include "machine/intelfsh.h"
#include "machine/mb87030.h"
#include "machine/mb89371.h"
#include "machine/pit8253.h"
@@ -61,6 +62,8 @@
#include "mpc2000xl.lh"
+#define ENABLE_FLASH (0)
+
static constexpr uint8_t BIT4 = (1 << 4);
static constexpr uint8_t BIT5 = (1 << 5);
@@ -72,6 +75,9 @@ public:
, m_maincpu(*this, "maincpu")
, m_subcpu(*this, "subcpu")
, m_dsp(*this, "dsp")
+#if ENABLE_FLASH
+ , m_flash(*this, "flash%u", 0U)
+#endif
, m_screen(*this, "screen")
, m_fdc(*this, "fdc")
, m_floppy(*this, "fdc:0")
@@ -109,6 +115,9 @@ private:
required_device<v53a_device> m_maincpu;
required_device<upd7810_device> m_subcpu;
required_device<l7a1045_sound_device> m_dsp;
+#if ENABLE_FLASH
+ required_device_array<intel_28f016sa_16bit_device, 8> m_flash;
+#endif
required_device<screen_device> m_screen;
required_device<upd72069_device> m_fdc;
required_device<floppy_connector> m_floppy;
@@ -127,6 +136,7 @@ private:
void mpc2000_io_map(address_map &map) ATTR_COLD;
void mpc2000_sub_map(address_map &map) ATTR_COLD;
void dsp_map(address_map &map) ATTR_COLD;
+ void dsp_rom_map(address_map &map) ATTR_COLD;
uint8_t dma_memr_cb(offs_t offset);
void dma_memw_cb(offs_t offset, uint8_t data);
@@ -265,6 +275,20 @@ void mpc2000_state::dsp_map(address_map &map)
map(0x0000'0000, 0x01ff'ffff).ram();
}
+void mpc2000_state::dsp_rom_map(address_map &map)
+{
+#if ENABLE_FLASH
+ map(0x0000'0000, 0x001f'ffff).rw(m_flash[0], FUNC(intel_28f016sa_16bit_device::read), FUNC(intel_28f016sa_16bit_device::write));
+ map(0x0020'0000, 0x003f'ffff).rw(m_flash[0], FUNC(intel_28f016sa_16bit_device::read), FUNC(intel_28f016sa_16bit_device::write));
+ map(0x0040'0000, 0x005f'ffff).rw(m_flash[0], FUNC(intel_28f016sa_16bit_device::read), FUNC(intel_28f016sa_16bit_device::write));
+ map(0x0060'0000, 0x007f'ffff).rw(m_flash[0], FUNC(intel_28f016sa_16bit_device::read), FUNC(intel_28f016sa_16bit_device::write));
+ map(0x0080'0000, 0x009f'ffff).rw(m_flash[0], FUNC(intel_28f016sa_16bit_device::read), FUNC(intel_28f016sa_16bit_device::write));
+ map(0x00a0'0000, 0x00bf'ffff).rw(m_flash[0], FUNC(intel_28f016sa_16bit_device::read), FUNC(intel_28f016sa_16bit_device::write));
+ map(0x00c0'0000, 0x00df'ffff).rw(m_flash[0], FUNC(intel_28f016sa_16bit_device::read), FUNC(intel_28f016sa_16bit_device::write));
+ map(0x00e0'0000, 0x00ff'ffff).rw(m_flash[0], FUNC(intel_28f016sa_16bit_device::read), FUNC(intel_28f016sa_16bit_device::write));
+#endif
+}
+
void mpc2000_state::mpc2000_palette(palette_device &palette) const
{
palette.set_pen_color(0, rgb_t(230, 240, 250));
@@ -639,7 +663,7 @@ void mpc2000_state::mpc2000(machine_config &config)
FLOPPY_CONNECTOR(config, m_floppy, mpc2000_state::floppies, "35hd", add_formats).enable_sound(false);
- ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, false);
+ ATA_INTERFACE(config, m_ata).options(ata_devices, "cdrom", nullptr, false);
m_ata->irq_handler().set(FUNC(mpc2000_state::ata_irq_w));
m_ata->dmarq_handler().set(FUNC(mpc2000_state::ata_drq_w));
@@ -685,6 +709,7 @@ void mpc2000_state::mpc2000(machine_config &config)
L7A1045(config, m_dsp, 33.8688_MHz_XTAL); // clock verified by schematic
m_dsp->set_addrmap(AS_DATA, &mpc2000_state::dsp_map);
+ m_dsp->set_addrmap(AS_IO, &mpc2000_state::dsp_rom_map);
m_dsp->drq_handler_cb().set(m_maincpu, FUNC(v53a_device::dreq_w<3>));
m_dsp->add_route(l7a1045_sound_device::L6028_LEFT, "speaker", 1.0, 0);
m_dsp->add_route(l7a1045_sound_device::L6028_RIGHT, "speaker", 1.0, 1);
@@ -698,6 +723,17 @@ void mpc2000_state::mpc2000(machine_config &config)
m_dsp->add_route(l7a1045_sound_device::L6028_OUT6, "outputs", 1.0, 6);
m_dsp->add_route(l7a1045_sound_device::L6028_OUT7, "outputs", 1.0, 7);
+#if ENABLE_FLASH
+ INTEL_28F016SA_16BIT(config, m_flash[0]);
+ INTEL_28F016SA_16BIT(config, m_flash[1]);
+ INTEL_28F016SA_16BIT(config, m_flash[2]);
+ INTEL_28F016SA_16BIT(config, m_flash[3]);
+ INTEL_28F016SA_16BIT(config, m_flash[4]);
+ INTEL_28F016SA_16BIT(config, m_flash[5]);
+ INTEL_28F016SA_16BIT(config, m_flash[6]);
+ INTEL_28F016SA_16BIT(config, m_flash[7]);
+#endif
+
// back compatible with MPC3000 and MPC60 disks
SOFTWARE_LIST(config, "flop_mpc3000").set_original("mpc3000_flop");
diff --git a/src/mame/akai/mpc60.cpp b/src/mame/akai/mpc60.cpp
index c6acb87d60e..e2e07a79945 100644
--- a/src/mame/akai/mpc60.cpp
+++ b/src/mame/akai/mpc60.cpp
@@ -448,7 +448,7 @@ static INPUT_PORTS_START(mpc60)
PORT_START("Y4")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_NAME(".")
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Wait For Key") PORT_CODE(KEYCODE_Z)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Auto Punch") PORT_CODE(KEYCODE_X)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up Arrow")
diff --git a/src/mame/akai/s3000.cpp b/src/mame/akai/s3000.cpp
index 8ef32089298..7ce19c08dca 100644
--- a/src/mame/akai/s3000.cpp
+++ b/src/mame/akai/s3000.cpp
@@ -119,6 +119,8 @@
#include "formats/pc_dsk.h"
#include "s2000.lh"
+#include "s3000.lh"
+#include "cd3000i.lh"
#include "cd3000xl.lh"
namespace {
@@ -152,6 +154,7 @@ public:
, m_id_magic(0)
{ }
+ void base(machine_config & config);
void s2000(machine_config &config);
void s3000(machine_config &config);
void s3000xl(machine_config &config);
@@ -187,6 +190,7 @@ private:
void s3000xl_io_map(address_map &map) ATTR_COLD;
void cd3000_io_map(address_map &map) ATTR_COLD;
void dsp_map(address_map &map) ATTR_COLD;
+ void dsp_rom_map(address_map &map) ATTR_COLD;
void floppy_led_cb(floppy_image_device *, int state);
@@ -322,6 +326,10 @@ void s3000_state::dsp_map(address_map &map)
map(0x0000'0000, 0x01ff'ffff).ram();
}
+void s3000_state::dsp_rom_map(address_map &map)
+{
+}
+
void s3000_state::floppy_led_cb(floppy_image_device *, int state)
{
m_floppy_led = state;
@@ -530,7 +538,7 @@ static void add_formats(format_registration &fr)
fr.add(FLOPPY_HFE_FORMAT);
}
-void s3000_state::s3000(machine_config &config)
+void s3000_state::base(machine_config &config)
{
V53A(config, m_maincpu, 32_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &s3000_state::s3000_map);
@@ -638,6 +646,7 @@ void s3000_state::s3000(machine_config &config)
L7A1045(config, m_dsp, 33.8688_MHz_XTAL);
m_dsp->set_addrmap(AS_DATA, &s3000_state::dsp_map);
+ m_dsp->set_addrmap(AS_IO, &s3000_state::dsp_rom_map);
m_dsp->drq_handler_cb().set(m_maincpu, FUNC(v53a_device::dreq_w<3>));
m_dsp->add_route(l7a1045_sound_device::L6028_LEFT, "speaker", 1.0, 0);
m_dsp->add_route(l7a1045_sound_device::L6028_RIGHT, "speaker", 1.0, 1);
@@ -645,9 +654,15 @@ void s3000_state::s3000(machine_config &config)
TIMER(config, "dialtimer").configure_periodic(FUNC(s3000_state::dial_timer_tick), attotime::from_hz(60.0));
}
+void s3000_state::s3000(machine_config &config)
+{
+ base(config);
+ config.set_default_layout(layout_s3000);
+}
+
void s3000_state::s2000(machine_config &config)
{
- s3000(config);
+ base(config);
m_maincpu->set_clock(31.9488_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &s3000_state::s2000_map);
m_maincpu->set_addrmap(AS_IO, &s3000_state::s2000_io_map);
@@ -677,13 +692,15 @@ void s3000_state::s2000(machine_config &config)
void s3000_state::cd3000(machine_config &config)
{
- s3000(config);
+ base(config);
m_maincpu->set_addrmap(AS_IO, &s3000_state::cd3000_io_map);
+
+ config.set_default_layout(layout_cd3000i);
}
void s3000_state::s3000xl(machine_config &config)
{
- s3000(config);
+ base(config);
m_maincpu->set_addrmap(AS_PROGRAM, &s3000_state::s3000xl_map);
m_maincpu->set_addrmap(AS_IO, &s3000_state::s3000xl_io_map);
m_maincpu->v53_tout_handler<1>().set_inputline(m_maincpu, INPUT_LINE_IRQ6);
diff --git a/src/mame/layout/cd3000i.lay b/src/mame/layout/cd3000i.lay
new file mode 100644
index 00000000000..c9cacda7dc9
--- /dev/null
+++ b/src/mame/layout/cd3000i.lay
@@ -0,0 +1,881 @@
+<?xml version="1.0"?>
+<!-- license:CC0-1.0 -->
+<mamelayout version="2">
+
+<!-- Layout for AKAI CD3000i MIDI Digital Stereo CD-ROM Sampler Rack Unit (1993)
+ by Guru (https://gurudumps.otenko.com/)
+-->
+
+ <!-- All Texts -->
+ <element name="text-0z"><text align="3" string="0/Z" /></element>
+ <element name="text-1w"><text align="3" string="1/W" /></element>
+ <element name="text-2x"><text align="3" string="2/X" /></element>
+ <element name="text-3y"><text align="3" string="3/Y" /></element>
+ <element name="text-4t"><text align="3" string="4/T" /></element>
+ <element name="text-5u"><text align="3" string="5/U" /></element>
+ <element name="text-6v"><text align="3" string="6/V" /></element>
+ <element name="text-7q"><text align="3" string="7/Q" /></element>
+ <element name="text-8r"><text align="3" string="8/R" /></element>
+ <element name="text-9s"><text align="3" string="9/S" /></element>
+ <element name="text-compact"><text align="3" string="COMPACT" /></element>
+ <element name="text-cdromsampler"><text align="3" string="CD-ROM SAMPLE PLAYER" /></element>
+ <element name="text-close"><text align="3" string="CLOSE" /></element>
+ <element name="text-contrast1"><text align="3" string="DISPLAY" /></element>
+ <element name="text-contrast2"><text align="3" string="CONTRAST" /></element>
+ <element name="text-cursor"><text align="3" string="CURSOR" /></element>
+ <element name="text-data"><text align="3" string="DATA" /></element>
+ <element name="text-d"><text align="3" string="d" /></element>
+ <element name="text-diskm"><text align="3" string="DISK/M" /></element>
+ <element name="text-dot"><text align="3" string="." /></element>
+ <element name="text-isc"><text align="3" string="ISC" /></element>
+ <element name="text-edit"><text align="3" string="EDIT" /></element>
+ <element name="text-lf1"><text align="3" string="F1/A" /></element>
+ <element name="text-lf2"><text align="3" string="F2/B" /></element>
+ <element name="text-lf3"><text align="3" string="F3/C" /></element>
+ <element name="text-lf4"><text align="3" string="F4/D" /></element>
+ <element name="text-lf5"><text align="3" string="F5/E" /></element>
+ <element name="text-lf6"><text align="3" string="F6/F" /></element>
+ <element name="text-lf7"><text align="3" string="F7/G" /></element>
+ <element name="text-lf8"><text align="3" string="F8/H" /></element>
+ <element name="text-f1"><text align="3" string="F1" /></element>
+ <element name="text-f2"><text align="3" string="F2" /></element>
+ <element name="text-f3"><text align="3" string="F3" /></element>
+ <element name="text-f4"><text align="3" string="F4" /></element>
+ <element name="text-f5"><text align="3" string="F5" /></element>
+ <element name="text-f6"><text align="3" string="F6" /></element>
+ <element name="text-f7"><text align="3" string="F7" /></element>
+ <element name="text-f8"><text align="3" string="F8" /></element>
+ <element name="text-helpp"><text align="3" string="HELP/P" /></element>
+ <element name="text-jump"><text align="3" string="JUMP/" /></element>
+ <element name="text-leveln"><text align="3" string="LEVEL/N" /></element>
+ <element name="text-mainvolume"><text align="3" string="MAIN VOLUME" /></element>
+ <element name="text-mark"><text align="3" string="MARK/#" /></element>
+ <element name="text-max"><text align="3" string="MAX" /></element>
+ <element name="text-min"><text align="3" string="MIN" /></element>
+ <element name="text-midil"><text align="3" string="MIDI/L" /></element>
+ <element name="text-name"><text align="3" string="NAME" /></element>
+ <element name="text-off"><text align="3" string="OFF" /></element>
+ <element name="text-on"><text align="3" string="ON" /></element>
+ <element name="text-open"><text align="3" string="OPEN" /></element>
+ <element name="text-headphone"><text align="3" string="HEADPHONE" /></element>
+ <element name="text-play"><text align="3" string="ENT/PLAY" /></element>
+ <element name="text-power"><text align="3" string="POWER" /></element>
+ <element name="text-professional"><text align="3" string="professional" /></element>
+ <element name="text-progi"><text align="3" string="PROG/I" /></element>
+ <element name="text-progk"><text align="3" string="PROG/K" /></element>
+ <element name="text-samplej"><text align="3" string="SAMPLE/J" /></element>
+ <element name="text-screenfunction"><text align="3" string="SCREEN FUNCTION" /></element>
+ <element name="text-select"><text align="3" string="SELECT" /></element>
+ <element name="text-tune"><text align="3" string="TUNE" /></element>
+ <element name="text-utilityo"><text align="3" string="UTILITY/O" /></element>
+ <element name="text-plus">
+ <image><data><![CDATA[
+ <svg width="200" height="60" viewBox="-5 -5 200 100" stroke="black" stroke-width="6">
+ <line x1="0" y1="30" x2="36" y2="30" />
+ <line x1="18" y1="0" x2="18" y2="60" />
+ <line x1="45" y1="60" x2="60" y2="0" />
+ <line x1="75" y1="3" x2="120" y2="30" />
+ <line x1="120" y1="30" x2="75" y2="57" />
+ <line x1="75" y1="57" x2="75" y2="3" />
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="text-minus">
+ <image><data><![CDATA[
+ <svg width="200" height="60" viewBox="-5 -5 200 100" stroke="black" stroke-width="6">
+ <line x1="0" y1="30" x2="36" y2="30" />
+ <line x1="45" y1="57" x2="60" y2="0" />
+ <line x1="70" y1="30" x2="115" y2="3" />
+ <line x1="115" y1="3" x2="115" y2="57" />
+ <line x1="115" y1="57" x2="70" y2="30" />
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- Model -->
+ <element name="text-cd3000i">
+ <image><data><![CDATA[
+ <svg width="400" height="100" viewBox="0 0 500 100" stroke="black" stroke-width="4">
+ <g transform="scale(1.7,1)">
+ <line x1="60" y1="20" x2="80" y2="20" />
+ <line x1="60" y1="20" x2="60" y2="80" />
+ <line x1="60" y1="80" x2="80" y2="80" />
+ <line x1="90" y1="20" x2="107" y2="20" />
+ <line x1="90" y1="20" x2="90" y2="80" />
+ <line x1="107" y1="20" x2="110" y2="35" />
+ <line x1="90" y1="80" x2="107" y2="80" />
+ <line x1="107" y1="80" x2="110" y2="65" />
+ <line x1="110" y1="65" x2="110" y2="35" />
+ <line x1="120" y1="20" x2="140" y2="20" />
+ <line x1="140" y1="20" x2="140" y2="50" />
+ <line x1="120" y1="50" x2="140" y2="50" />
+ <line x1="140" y1="50" x2="140" y2="80" />
+ <line x1="120" y1="80" x2="140" y2="80" />
+ <line x1="150" y1="20" x2="170" y2="20" />
+ <line x1="170" y1="20" x2="170" y2="80" />
+ <line x1="150" y1="80" x2="170" y2="80" />
+ <line x1="150" y1="20" x2="150" y2="80" />
+ <line x1="180" y1="20" x2="200" y2="20" />
+ <line x1="200" y1="20" x2="200" y2="80" />
+ <line x1="180" y1="80" x2="200" y2="80" />
+ <line x1="180" y1="20" x2="180" y2="80" />
+ <line x1="210" y1="20" x2="230" y2="20" />
+ <line x1="230" y1="20" x2="230" y2="80" />
+ <line x1="210" y1="80" x2="230" y2="80" />
+ <line x1="210" y1="20" x2="210" y2="80" />
+ <line x1="240" y1="80" x2="243" y2="40" />
+ <ellipse cx="244.3" cy="25.5" rx="2.5" ry="9" fill="black" stroke="none" />
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- AKAI Text (optimize level 3) using free Novo font converted to SVG (layout system doesn't support multiple truetype fonts) -->
+ <element name="text-akainovo">
+ <image><data><![CDATA[
+ <svg width: 300px; height: auto;>
+ <g fill="#a0222c">
+ <path d="M8.5 11.6l-0.8 -2.7 -4.2 0 -0.8 2.7 -2.6 0 4.1 -11.6 3.0 0 4.1 11.6 -2.6 0zm-1.4 -4.8c-0.8,-2.5 -1.2,-3.9 -1.3,-4.2 -0.1,-0.3 -0.2,-0.6 -0.2,-0.8 -0.2,0.7 -0.7,2.3 -1.5,5.0l3.0 0z"/>
+ <path d="M21.0,11.6l-2.8,0l-3.0-4.9l-1.0.7l0,4.2l-2.5,0l0-11.6l2.5,0l0,5.3l.9-1.3l3.1-4.0l2.7,0l-4.1,5.1z"/>
+ <path d="M29.5 11.6l-0.8 -2.7 -4.2 0 -0.8 2.7 -2.6 0 4.1 -11.6 3.0 0 4.1 11.6 -2.6 0zm-1.4 -4.8c-0.8,-2.5 -1.2,-3.9 -1.3,-4.2 -0.1,-0.3 -0.2,-0.6 -0.2,-0.8 -0.2,0.7 -0.7,2.3 -1.5,5.0l3.0 0z"/>
+ <path d="M37.9,0.0 h-5.2 v1.4 h1.4 v8.5 h-1.4 v1.4 h5.2 v-1.4 h-1.4 v-8.5 h1.4 z"/>
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- 3 1/2" FDD Module (BLACK) -->
+ <element name="floppyblack">
+ <image><data><![CDATA[
+ <svg width="1277" height="337" viewBox="0 0 1288 358">
+ <rect x="12" y="0" width="1277" height="347" fill="black" stroke="black" stroke-width=".5"/>
+ <rect x="22" y="12" width="1255" height="325" fill="#343136" stroke="#343136" stroke-width="5"/>
+ <rect x="92" y="102" width="1115" height="50" fill="black" stroke="black" stroke-width="5" rx="10" ry="10"/>
+ <rect x="52" y="42" width="1195" height="140" fill="none" stroke="#49444c" stroke-width="5" rx="20" ry="20"/>
+ <rect x="429.5" y="44" width="440" height="50" fill="#2f2e33" stroke="#2f2e33" stroke-width="5"/>
+ <rect x="429.5" y="212" width="440" height="90" fill="#49444c" stroke="#49444c" stroke-width="5"/>
+ <line x1="57" y1="47" x2="95" y2="100" stroke="#49444c" stroke-width="5"/>
+ <line x1="1242" y1="47" x2="1210" y2="100" stroke="#49444c" stroke-width="5"/>
+ <line x1="64" y1="182" x2="92" y2="153" stroke="#49444c" stroke-width="5"/>
+ <line x1="1241" y1="182" x2="1210" y2="150" stroke="#49444c" stroke-width="5"/>
+ <rect x="302" y="92" width="695" height="70" fill="black" stroke="black" stroke-width="5"/>
+ <rect x="262" y="242" width="100" height="50" fill="none" stroke="#49444c" stroke-width="5"/>
+ <line x1="264" y1="292" x2="362" y2="292" stroke="#49444c" stroke-width="5"/>
+ <rect x="907" y="227" width="190" height="75" fill="black" stroke="black" stroke-width="5" rx="10" ry="10"/>
+ <rect x="914" y="234" width="176" height="61" fill="#343136" stroke="#343136" stroke-width="5" rx="5" ry="5"/>
+ <line x1="920" y1="236" x2="1090" y2="236" stroke="#49444c" stroke-width="5"/>
+ <line x1="430" y1="41" x2="870" y2="41" stroke="#49444c" stroke-width="5"/>
+ <line x1="424" y1="182" x2="424" y2="305" stroke="#49444c" stroke-width="8"/>
+ <line x1="878" y1="182" x2="878" y2="305" stroke="#49444c" stroke-width="5"/>
+ <rect x="429.5" y="182" width="440" height="30" fill="#343136" stroke="#49444c" stroke-width="5"/>
+ <rect x="429.5" y="72" width="440" height="110" fill="black" stroke="black" stroke-width="5"/>
+ <line x1="428" y1="182" x2="428" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="869.5" y1="182" x2="869.5" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="432" y1="182" x2="428" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="865.5" y1="182" x2="869.5" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="436" y1="182" x2="428" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="861.5" y1="182" x2="869.5" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="428" y1="42" x2="428" y2="72" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="869.5" y1="42" x2="869.5" y2="72" stroke="#2f2e33" stroke-width="5"/>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- CDROM Module (BLACK TRAY BEZEL ONLY) -->
+ <element name="cdromtraybezelblack">
+ <image><data><![CDATA[
+ <svg width="1860" height="550" viewBox="0 0 1861 551">
+ <rect x="100" y="33" width="1660" height="310" fill="#c6c8cc" stroke="none" stroke-width="5" rx="20" ry="20"/>
+ <rect x="128" y="58" width="1607" height="253" fill="black" stroke="none"/>
+ <rect x="143" y="73" width="1577" height="223" fill="#343136" stroke="none"/>
+ <path d="M120,33 h1617 a 20 20 0 0 1 20 20 v270" fill="none" stroke="#928f87" stroke-width="5"/>
+ <path d="M120,33 a 20 20 0 0 0 -20 20 V323 a 20 20 0 0 0 20 20 h1620 a 20 20 0 0 0 20 -20" fill="none" stroke="#e3e4e9" stroke-width="5"/>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- Power Switch (BLACK) -->
+ <element name="powerswitchblack">
+ <image><data><![CDATA[
+ <svg width="280" height="365" viewBox="0 0 285 370">
+ <rect x="0" y="0" width="280" height="365" fill="#242126" stroke="#242126" stroke-width="5" rx="30" ry="30"/>
+ <rect x="15" y="15" width="250" height="345" fill="#343136" stroke="#343136" stroke-width="5" rx="20" ry="20"/>
+ <line x1="18" y1="22" x2="255" y2="22" stroke="#726d75" stroke-width="7" />
+ <rect x="45" y="60" width="190" height="280" fill="black" stroke="black" stroke-width="15" rx="20" ry="20"/>
+ <rect x="60" y="65" width="160" height="235" fill="#343136" stroke="#343136" stroke-width="5" rx="18" ry="18"/>
+ <path d="M60,200 L52,320 A 18 18 0 0 0 70,338 H210 A 18 18 0 0 0 228,320 L220,200 Z" stroke="#49444c" stroke-width="5" fill="#49444c"/>
+ <path d="M53,310 L52,320 A 18 18 0 0 0 70,338 H210 A 18 18 0 0 0 228,320 L219,310 Z" stroke="#343136" stroke-width="5" fill="#343136"/>
+ <line x1="52" y1="310" x2="228" y2="310" stroke="#726d75" stroke-width="7" />
+ <ellipse cx="140" cy="110" rx="11" ry="11" fill="#f6f5f8" stroke="none" />
+ <line x1="70" y1="70" x2="210" y2="70" stroke="#726d75" stroke-width="7" />
+ <path d="M15,200 L10,310 H30 L35,200 Z" stroke="#49444c" stroke-width="5" fill="#49444c"/>
+ <line x1="10" y1="310" x2="30" y2="310" stroke="#726d75" stroke-width="7" />
+ <path d="M245,200 L245,310 H270 L265,200 Z" stroke="#49444c" stroke-width="5" fill="#49444c"/>
+ <line x1="245" y1="310" x2="270" y2="310" stroke="#726d75" stroke-width="7" />
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- LEDs -->
+ <element name="fddled"><rect></rect></element>
+ <element name="cdled"><rect></rect></element>
+
+ ]<!-- Basic Elements -->
+ <element name="line"><rect><color red="0" green="0" blue="0"/></rect></element>
+ <element name="vline"><rect><color red="0" green="0" blue="0"/></rect></element>
+
+ <!-- Slots with screws -->
+ <element name="slot1">
+ <image><data><![CDATA[
+ <svg width="130" height="104" viewBox="0 0 130 104">
+ <rect x="0" y="10" width="130" height="80" rx="40" ry="40" fill="black"/>
+ <ellipse cx="65" cy="52" rx="52" ry="52" fill="#6e6e6e"/>
+ <ellipse cx="65" cy="52" rx="45" ry="45" fill="#a9a9a9"/>
+ <ellipse cx="65" cy="52" rx="37" ry="37" fill="#b8b8b8"/>
+ <g>
+ <rect x="58" y="25" width="14" height="27" fill="black"/>
+ <rect x="58" y="52" width="14" height="27" fill="black"/>
+ <rect x="39" y="45" width="27" height="14" fill="black"/>
+ <rect x="65" y="45" width="27" height="14" fill="black"/>
+ <polygon points="65,42 78,52 65,62 52,52" fill="grey" transform="rotate(45 65 52)"/>
+ </g>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="slot2">
+ <image><data><![CDATA[
+ <svg width="130" height="104" viewBox="0 0 130 104">
+ <rect x="0" y="10" width="130" height="80" rx="40" ry="40" fill="black"/>
+ <ellipse cx="65" cy="52" rx="52" ry="52" fill="#6e6e6e"/>
+ <ellipse cx="65" cy="52" rx="45" ry="45" fill="#a9a9a9"/>
+ <ellipse cx="65" cy="52" rx="37" ry="37" fill="#b8b8b8"/>
+ <g transform="rotate(15 65 52)">
+ <rect x="58" y="25" width="14" height="27" fill="black"/>
+ <rect x="58" y="52" width="14" height="27" fill="black"/>
+ <rect x="39" y="45" width="27" height="14" fill="black"/>
+ <rect x="65" y="45" width="27" height="14" fill="black"/>
+ <polygon points="65,42 78,52 65,62 52,52" fill="grey" transform="rotate(45 65 52)"/>
+ </g>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="slot3">
+ <image><data><![CDATA[
+ <svg width="130" height="104" viewBox="0 0 130 104">
+ <rect x="0" y="10" width="130" height="80" rx="40" ry="40" fill="black"/>
+ <ellipse cx="65" cy="52" rx="52" ry="52" fill="#6e6e6e"/>
+ <ellipse cx="65" cy="52" rx="45" ry="45" fill="#a9a9a9"/>
+ <ellipse cx="65" cy="52" rx="37" ry="37" fill="#b8b8b8"/>
+ <g transform="rotate(45 65 52)">
+ <rect x="58" y="25" width="14" height="27" fill="black"/>
+ <rect x="58" y="52" width="14" height="27" fill="black"/>
+ <rect x="39" y="45" width="27" height="14" fill="black"/>
+ <rect x="65" y="45" width="27" height="14" fill="black"/>
+ <polygon points="65,42 78,52 65,62 52,52" fill="grey" transform="rotate(45 65 52)"/>
+ </g>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <!-- Cursor Module -->
+ <element name="cursoroutline">
+ <image><data><![CDATA[
+ <svg width="115" height="85">
+ <rect x="0" y="0" width="115" height="85" rx="7" ry="7" fill="black" stroke="black" stroke-width=".6"/>
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="cursorup">
+ <image state="0"><data><![CDATA[
+ <svg width="40" height="30">
+ <path d="M0,0 H38 V2 L32,25 H6 L0,2 Z" fill="rgb(239,228,199)" stroke="rgb(239,228,199)" stroke-width=".2"/>
+ <line x1="0.5" y1="2" x2="37.5" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="5" y1="19" x2="33" y2="19" stroke="#c5ba9c" stroke-width="1"/>
+ <path d="M5,19 H33 L32,25 H6 Z" stroke="rgb(197,186,156)" fill="rgb(197,186,156)" stroke-width=".5"/>
+ <path d="M12,11 L18.5,7 L25,11" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ <image state="1"><data><![CDATA[
+ <svg width="40" height="30">
+ <path d="M0,0 H38 V2 L32,25 H6 L0,2 Z" fill="rgb(229,218,189)" stroke="rgb(229,218,189)" stroke-width=".2"/>
+ <line x1="0.5" y1="2" x2="37.5" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="5" y1="19" x2="33" y2="19" stroke="#c5ba9c" stroke-width="1"/>
+ <path d="M5,19 H33 L32,25 H6 Z" stroke="rgb(187,176,146)" fill="rgb(187,176,146)" stroke-width=".5"/>
+ <path d="M12,11 L18.5,7 L25,11" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="cursordown">
+ <image state="0"><data><![CDATA[
+ <svg width="40" height="30">
+ <path d="M6,0 H32 L38,23 V25 H0 Z" fill="rgb(239,228,199)" stroke="rgb(239,228,199)" stroke-width=".2"/>
+ <line x1="0.5" y1="23" x2="37.5" y2="23" stroke="#fffbea" stroke-width="1"/>
+ <path d="M5,6 H33 L32,0 H6 Z" stroke="rgb(197,186,156)" fill="rgb(197,186,156)" stroke-width=".5"/>
+ <path d="M12,14 L18.5,18 L25,14" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ <image state="1"><data><![CDATA[
+ <svg width="40" height="30">
+ <path d="M6,0 H32 L38,23 V25 H0 Z" fill="rgb(229,218,189)" stroke="rgb(229,218,189)" stroke-width=".2"/>
+ <line x1="0.5" y1="23" x2="37.5" y2="23" stroke="#fffbea" stroke-width="1"/>
+ <line x1="5" y1="6" x2="33" y2="6" stroke="#c5ba9c" stroke-width="1"/>
+ <path d="M5,6 H33 L32,0 H6 Z" stroke="rgb(187,176,146)" fill="rgb(187,176,146)" stroke-width=".5"/>
+ <path d="M12,14 L18.5,18 L25,14" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="cursorleft">
+ <image state="0"><data><![CDATA[
+ <svg width="25" height="55">
+ <path d="M3,0 H16 V2 L21,25 L16,48 V50 H3 A3,3 0 0,1 0,47 V3 A3,3 0 0,1 3,0 Z" fill="rgb(239,228,199)" stroke="rgb(239,228,199)" stroke-width=".2"/>
+ <line x1="2" y1="2" x2="15.5" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="2" y1="48" x2="15.5" y2="48" stroke="#fffbea" stroke-width="1"/>
+ <line x1="15.5" y1="2" x2="15.5" y2="48" stroke="#c5ba9c" stroke-width="1"/>
+ <path d="M15.5,2 V48 L20.5,25 Z" stroke="rgb(197,186,156)" fill="rgb(197,186,156)" stroke-width=".5"/>
+ <path d="M10,19 L6,25 L10,31" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ <image state="1"><data><![CDATA[
+ <svg width="25" height="55">
+ <path d="M3,0 H16 V2 L21,25 L16,48 V50 H3 A3,3 0 0,1 0,47 V3 A3,3 0 0,1 3,0 Z" fill="rgb(229,218,189)" stroke="rgb(229,218,189)" stroke-width=".2"/>
+ <line x1="2" y1="2" x2="15.5" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="2" y1="48" x2="15.5" y2="48" stroke="#fffbea" stroke-width="1"/>
+ <line x1="15.5" y1="2" x2="15.5" y2="48" stroke="#c5ba9c" stroke-width="1"/>
+ <path d="M15.5,2 V48 L20,25 Z" stroke="rgb(187,176,146)" fill="rgb(187,176,146)" stroke-width=".5"/>
+ <path d="M10,19 L6,25 L10,31" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="cursorright">
+ <image state="0"><data><![CDATA[
+ <svg width="25" height="55">
+ <path d="M6,0 H19 A3,3 0 0,1 22,3 V47 A3,3 0 0,1 19,50 H6 V48 L1,25 L6,2 Z" fill="rgb(239,228,199)" stroke="rgb(239,228,199)" stroke-width=".2"/>
+ <line x1="6.5" y1="2" x2="20" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="6.5" y1="48" x2="20" y2="48" stroke="#fffbea" stroke-width="1"/>
+ <path d="M6.5,2 V48 L1,25 Z" stroke="rgb(197,186,156)" fill="rgb(197,186,156)" stroke-width=".5"/>
+ <path d="M12,19 L16,25 L12,31" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ <image state="1"><data><![CDATA[
+ <svg width="25" height="55">
+ <path d="M6,0 H19 A3,3 0 0,1 22,3 V47 A3,3 0 0,1 19,50 H6 V48 L1,25 L6,2 Z" fill="rgb(229,218,189)" stroke="rgb(229,218,189)" stroke-width=".2"/>
+ <line x1="6.5" y1="2" x2="20" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="6.5" y1="48" x2="20" y2="48" stroke="#fffbea" stroke-width="1"/>
+ <path d="M6.5,2 V48 L1,25 Z" stroke="rgb(187,176,146)" fill="rgb(187,176,146)" stroke-width=".5"/>
+ <path d="M12,19 L16,25 L12,31" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ </element>
+ <group name="cursormodule">
+ <bounds x="0" y="0" width="530" height="410" />
+ <element ref="cursoroutline"><bounds x="0" y="0" width="535" height="392" /></element>
+ <element ref="cursorleft" inputtag="C7" inputmask="0x10"><bounds x="13" y="15" width="190" height="400" /></element>
+ <element ref="cursorup" inputtag="C2" inputmask="0x10"><bounds x="150" y="15" width="251" height="211" /></element>
+ <element ref="cursordown" inputtag="C6" inputmask="0x10"><bounds x="148" y="200" width="251" height="211" /></element>
+ <element ref="cursorright" inputtag="C1" inputmask="0x10"><bounds x="351" y="15" width="190" height="400" /></element>
+ </group>
+
+ <!-- Buttons -->
+ <element name="rectbutton-white" defstate="0">
+ <image state="0"><data><![CDATA[
+ <svg width="145" height="76" viewBox="-1 -1 146 77">
+ <rect x="0" y="0" width="145" height="76" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="60" rx="8" ry="8" fill="rgb(203,203,203)" stroke="rgb(203,203,203)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ <image state="1"><data><![CDATA[
+ <svg width="145" height="76" viewBox="-1 -1 146 77">
+ <rect x="0" y="0" width="145" height="76" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="60" rx="8" ry="8" fill="rgb(193,193,193)" stroke="rgb(193,193,193)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="rectbutton-blue" defstate="0">
+ <image state="0"><data><![CDATA[
+ <svg width="145" height="76" viewBox="-1 -1 146 77">
+ <rect x="0" y="0" width="145" height="76" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="60" rx="8" ry="8" fill="rgb(135,165,193)" stroke="rgb(135,165,193)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ <image state="1"><data><![CDATA[
+ <svg width="145" height="76" viewBox="-1 -1 146 77">
+ <rect x="0" y="0" width="145" height="76" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="60" rx="8" ry="8" fill="rgb(125,155,183)" stroke="rgb(125,155,183)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="squarebutton-white" defstate="0">
+ <image state="0"><data><![CDATA[
+ <svg width="145" height="107">
+ <rect x="0" y="0" width="145" height="107" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="91" rx="8" ry="8" fill="rgb(239,228,199)" stroke="rgb(239,228,199)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ <image state="1"><data><![CDATA[
+ <svg width="145" height="107">
+ <rect x="0" y="0" width="145" height="107" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="91" rx="8" ry="8" fill="rgb(229,218,189)" stroke="rgb(239,228,199)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="squarebutton-grey" defstate="0">
+ <image state="0"><data><![CDATA[
+ <svg width="145" height="107">
+ <rect x="0" y="0" width="145" height="107" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="91" rx="8" ry="8" fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="0.6" fill-opacity="1"/>
+ </svg>
+ ]]></data>
+ </image>
+ <image state="1"><data><![CDATA[
+ <svg width="145" height="107">
+ <rect x="0" y="0" width="145" height="107" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="91" rx="8" ry="8" fill="rgb(245,245,245)" stroke="rgb(255,255,255)" stroke-width="0.6" fill-opacity="1"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <!-- Knob Elements -->
+ <element name="knob"><disk></disk></element>
+ <element name="knob-position"><rect></rect></element>
+ <element name="rect"><rect></rect></element>
+ <element name="knobdots">
+ <image><data><![CDATA[
+ <svg width="500" height="500" viewBox="0 0 500 500">
+ <g fill="black" stroke="black" stroke-width="5" transform="translate(250, 250)">
+ <circle transform="rotate(0)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(30)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(60)" cx="200" cy="0" r="11"/>
+ <circle transform="rotate(120)" cx="200" cy="0" r="11"/>
+ <circle transform="rotate(150)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(180)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(210)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(240)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(270)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(300)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(330)" cx="200" cy="0" r="6"/>
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+ <group name="volumeknob">
+ <bounds x="0" y="0" width="740" height="740" />
+ <element ref="text-mainvolume"><bounds x="65" y="194" width="350" height="53" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knobdots"><bounds x="20" y="265" width="435" height="420" /></element>
+ <element ref="knob"><bounds x="92" y="335" width="290" height="290" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knob"><bounds x="107" y="350" width="260" height="260" /><color red="0.7" green="0.7" blue="0.7" /></element>
+ <element ref="knob"><bounds x="137" y="382" width="196" height="196" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob"><bounds x="147" y="388" width="180" height="180" /><color red="0.88" green="0.9" blue="0.778" /></element>
+ <element ref="knob-position"><bounds x="212" y="310" width="40" height="180" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob-position"><bounds x="219" y="315" width="30" height="190" /><color red="0.78" green="0.8" blue="0.678" /></element>
+ </group>
+ <group name="contrastknob">
+ <bounds x="0" y="0" width="276" height="276" />
+ <element ref="knobdots"><bounds x="0" y="0" width="276" height="276" /></element>
+ <element ref="knob"><bounds x="50" y="50" width="176" height="176" /><color red="0.0" green="0.0" blue="0.0" /></element>
+ <element ref="knob"><bounds x="59" y="59" width="160" height="160" /><color red="0.88" green="0.9" blue="0.778" /></element>
+ <element ref="knob-position"><bounds x="62" y="118" width="155" height="40" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob-position"><bounds x="56" y="123" width="152" height="30" /><color red="0.78" green="0.8" blue="0.678" /></element>
+ </group>
+
+ <!-- Bezel / Panel Elements -->
+ <element name="panel"><rect></rect></element>
+ <element name="fkeyboxgrey"><rect><color red="0.3" green="0.3" blue="0.3" /></rect></element>
+ <element name="fkeyboxblack"><rect><color red="0" green="0" blue="0" /></rect></element>
+ <element name="bezel">
+ <image><data><![CDATA[
+ <svg width="2500" height="600">
+ <rect x="0" y="0" width="2500" height="600" rx="45" ry="45" fill="black" stroke="none" stroke-width="1" />
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="jack">
+ <disk><bounds x="0" y="0" width="140" height="140" /><color red="0" green="0" blue="0" /></disk>
+ <disk><bounds x="7" y="7" width="126" height="126" /><color red="0.709" green="0.674" blue="0.611" /></disk>
+ <disk><bounds x="12.5" y="12.5" width="115" height="115" /><color red="0" green="0" blue="0" /></disk>
+ <disk><bounds x="15" y="15" width="110" height="110" /><color red="0.317" green="0.290" blue="0.227" /></disk>
+ <disk><bounds x="27.5" y="27.5" width="85" height="85" /><color red="0" green="0" blue="0" /></disk>
+ </element>
+
+ <!-- Screen Assembly -->
+ <group name="group-screen">
+ <bounds x="0" y="0" width="2500" height="600" />
+ <element ref="bezel"><bounds x="0" y="0" width="2500" height="600" /></element>
+ <screen index="0"><bounds x="205" y="99" width="2070" height="385" /></screen>
+ <repeat count="8">
+ <param name="gbox_x" start="250" increment="255"/>
+ <param name="gtext_x" start="315" increment="255"/>
+ <param name="gnum" start="1" increment="1"/>
+ <repeat count="1">
+ <element ref="fkeyboxgrey">
+ <bounds x="~gbox_x~" y ="525" width="200" height="30"/></element>
+ <element ref="text-f~gnum~">
+ <bounds x="~gtext_x~" y ="523" width="80" height="34"/><color red="1" green="1" blue="1" /></element>
+ </repeat>
+ </repeat>
+ </group>
+
+ <!-- Encoder Wheel -->
+ <element name="dataentry_bottom"><disk><color red="0" green="0" blue="0"/></disk></element>
+ <element name="dataentry_edge"><disk><color red="0.733" green="0.752" blue="0.780"/></disk></element>
+ <element name="dataentry_top"><disk><color red="0.803" green="0.831" blue="0.866"/></disk></element>
+ <element name="dataentry_outer"><disk><color red="0.952" green="0.952" blue="0.976"/></disk></element>
+ <element name="dataentry_knob">
+ <simplecounter maxstate="100" digits="3"><color red="0.505" green="0.458" blue="0.337"/></simplecounter>
+ </element>
+ <group name="select_data_knob">
+ <bounds x="0" y="0" width="440" height="540" />
+ <element ref="text-data"><bounds x="160" y="24" width="117" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="dataentry_bottom"><bounds x="0" y="100" width="440" height="440"/></element>
+ <element ref="dataentry_edge"><bounds x="15" y="115" width="410" height="410"/></element>
+ <element ref="dataentry_outer"><bounds x="40" y="140" width="360" height="360"/></element>
+ <element ref="dataentry_top"><bounds x="50" y="148" width="342" height="340"/></element>
+ <element ref="dataentry_knob" id="dataentry_knob" inputtag="DATAENTRY" inputmask="0xffff" inputraw="yes">
+ <bounds x="150" y="290" width="130" height="60"/>
+ </element>
+ </group>
+
+ <group name="text-compactdisc">
+ <bounds x="0" y="0" width="177" height="125" />
+ <element ref="text-d"><bounds x="0" y="0" width="45" height="125" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-isc"><bounds x="48" y="30" width="122" height="93" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-compact"><bounds x="52" y="15" width="130" height="35" /><color red="0.833" green="0.817" blue="0.739" /></element>
+ <element ref="text-d"><bounds x="5" y="0" width="45" height="122" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-isc"><bounds x="55" y="30" width="122" height="93" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-compact"><bounds x="57" y="15" width="130" height="35" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-d"><bounds x="0" y="8" width="45" height="125" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-isc"><bounds x="48" y="35" width="122" height="93" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-compact"><bounds x="52" y="20" width="130" height="35" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-d"><bounds x="5" y="7" width="45" height="125" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-isc"><bounds x="53" y="35" width="122" height="93" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-compact"><bounds x="55" y="20" width="130" height="35" /><color red="0.66" green="0.66" blue="0.66" /></element>
+ <element ref="text-d"><bounds x="5" y="5" width="45" height="122" /><color red="0.203" green="0.192" blue="0.211" /></element>
+ <element ref="text-isc"><bounds x="54" y="33" width="120" height="92" /><color red="0.203" green="0.192" blue="0.211" /></element>
+ <element ref="text-compact"><bounds x="55" y="19" width="127" height="31" /><color red="0.203" green="0.192" blue="0.211" /></element>
+ </group>
+
+ <!-- Show Everything -->
+ <view name="Default Layout">
+
+ <!-- Screen and Panel -->
+ <element ref="panel"><bounds x="0" y="0" width="6000" height="1650" /><color red="0.835" green="0.839" blue="0.854" /></element>
+ <group ref="group-screen"><bounds x="2280" y="180" width="1725" height="616" /></group>
+ <element ref="slot1"><bounds x="35" y="412" width="130" height="104" /></element>
+ <element ref="slot2"><bounds x="35" y="1127" width="130" height="104" /></element>
+ <element ref="slot2"><bounds x="5830" y="412" width="130" height="104" /></element>
+ <element ref="slot3"><bounds x="5830" y="1127" width="130" height="104" /></element>
+ <element ref="vline"><bounds x="300" y="0" width="10" height="1647" /></element>
+ <element ref="vline"><bounds x="5690" y="0" width="10" height="1647" /></element>
+ <element ref="jack"><bounds x="5345" y="1250" width="150" height="150" /></element>
+ <element ref="text-headphone"><bounds x="5296" y="1188" width="267" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-akainovo"><bounds x="435" y="110" width="305" height="80" /></element>
+ <element ref="text-professional"><bounds x="775" y="140" width="220" height="50" /><color red="0.627" green="0.133" blue="0.172" /></element>
+ <element ref="text-cdromsampler"><bounds x="2315" y="115" width="567" height="51.50" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-cd3000i"><bounds x="3165" y="75" width="960" height="100" /></element>
+ <element ref="text-screenfunction"><bounds x="2938" y="950" width="420" height="45" /><color red="0" green="0" blue="0" /></element>
+
+ <!-- Knobs -->
+ <group ref="volumeknob"><bounds x="5220" y="135" width="640" height="640" /></group>
+ <element ref="text-min"><bounds x="5278" y="685" width="70" height="30" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-max"><bounds x="5515" y="685" width="75" height="30" /><color red="0" green="0" blue="0" /></element>
+ <group ref="select_data_knob" clickthrough="no"><bounds x="4745" y="195" width="430" height="530" /></group>
+ <group ref="contrastknob"><bounds x="5332" y="905" width="202" height="202" /></group>
+ <element ref="text-contrast1"><bounds x="5343" y="832" width="172" height="45" /><color red="0" green="0.0" blue="0.0" /></element>
+ <element ref="text-contrast2"><bounds x="5310" y="872" width="235" height="45" /><color red="0" green="0.0" blue="0.0" /></element>
+
+ <!-- Floppy Drive -->
+ <element ref="floppyblack"><bounds x="792.5" y="1131.5" width="1277" height="337" /></element>
+ <element ref="fddled"><bounds x="1070" y="1373" width="70" height="25" /><animate name="drive_led" /><color state="0" red="0.437" green="0.249" blue="0" /><color state="1" red="1" green="0.674" blue="0.219" /></element>
+
+ <!-- CD Drive -->
+ <element ref="cdromtraybezelblack"><bounds x="330" y="330" width="1860" height="550" /></element>
+ <element ref="squarebutton-grey"><bounds x="1908" y="210" width="145" height="107" /><animate name="cd_led" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.933" green="0.588" blue="0.313" /></element>
+ <element ref="text-open"><bounds x="1768" y="222" width="106" height="40" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-close"><bounds x="1762" y="256" width="122" height="40" /><color red="0" green="0" blue="0" /></element>
+ <group ref="text-compactdisc"><bounds x="1136" y="447" width="220" height="135" /></group>
+
+ <!-- Power Switch -->
+ <element ref="powerswitchblack"><bounds x="455" y="1130" width="280" height="335" /></element>
+ <element ref="text-power"><bounds x="514" y="1015" width="162" height="50" /><color red="0.627" green="0.133" blue="0.172" /></element>
+ <element ref="text-on"><bounds x="570" y="1075" width="50" height="40" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-off"><bounds x="560" y="1480" width="70" height="40" /><color red="0" green="0" blue="0" /></element>
+
+ <!-- Buttons -->
+ <!-- Mark -->
+ <element ref="rectbutton-white" inputtag="C2" inputmask="0x04"><bounds x="4990" y="988" width="145" height="76" /></element>
+ <element ref="text-mark"><bounds x="4977" y="939" width="168" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Jump -->
+ <element ref="rectbutton-white" inputtag="C2" inputmask="0x08"><bounds x="4990" y="1125" width="145" height="76" /></element>
+ <element ref="text-jump"><bounds x="4995" y="1072" width="115" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-dot"><bounds x="5110" y="1033" width="35" height="80" /><color red="0" green="0" blue="0" /></element>
+ <!-- Name -->
+ <element ref="rectbutton-white" inputtag="C6" inputmask="0x04"><bounds x="4990" y="1260" width="145" height="76" /></element>
+ <element ref="text-name"><bounds x="5008" y="1210" width="115" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Play -->
+ <element ref="rectbutton-white" inputtag="C6" inputmask="0x08"><bounds x="4990" y="1400" width="145" height="76" /></element>
+ <element ref="text-play"><bounds x="4965" y="1347" width="205" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- F1 -->
+ <element ref="squarebutton-white" inputtag="C7" inputmask="0x02"><bounds x="2298" y="1120" width="145" height="107" /></element>
+ <!-- F2 -->
+ <element ref="squarebutton-white" inputtag="C6" inputmask="0x02"><bounds x="2520" y="1120" width="145" height="107" /></element>
+ <!-- F3 -->
+ <element ref="squarebutton-white" inputtag="C5" inputmask="0x02"><bounds x="2742" y="1120" width="145" height="107" /></element>
+ <!-- F4 -->
+ <element ref="squarebutton-white" inputtag="C4" inputmask="0x02"><bounds x="2964" y="1120" width="145" height="107" /></element>
+ <!-- F5 -->
+ <element ref="squarebutton-white" inputtag="C3" inputmask="0x02"><bounds x="3186" y="1120" width="145" height="107" /></element>
+ <!-- F6 -->
+ <element ref="squarebutton-white" inputtag="C2" inputmask="0x02"><bounds x="3408" y="1120" width="145" height="107" /></element>
+ <!-- F7 -->
+ <element ref="squarebutton-white" inputtag="C1" inputmask="0x02"><bounds x="3630" y="1120" width="145" height="107" /></element>
+ <!-- F8 -->
+ <element ref="squarebutton-white" inputtag="C0" inputmask="0x02"><bounds x="3852" y="1120" width="145" height="107" /></element>
+ <!-- F-Key Box+Text Labels -->
+ <repeat count="8">
+ <param name="box_x" start="2300" increment="222"/>
+ <param name="text_x" start="2320" increment="221.5"/>
+ <param name="num" start="1" increment="1"/>
+ <repeat count="1">
+ <element ref="fkeyboxblack">
+ <bounds x="~box_x~" y ="1063" width="138" height="40"/></element>
+ <element ref="text-lf~num~">
+ <bounds x="~text_x~" y ="1060" width="100" height="44"/></element>
+ </repeat>
+ </repeat>
+ <!-- Select Program -->
+ <element ref="squarebutton-grey" inputtag="C7" inputmask="0x01"><bounds x="2298" y="1360" width="145" height="107" /><animate name="led0" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-select"><bounds x="2295" y="1262" width="153" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-progi"><bounds x="2296" y="1302" width="150" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Edit Sample -->
+ <element ref="squarebutton-grey" inputtag="C6" inputmask="0x01"><bounds x="2520" y="1360" width="145" height="107" /><animate name="led1" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-edit"><bounds x="2543" y="1262" width="93" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-samplej"><bounds x="2498" y="1302" width="198" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Edit Program -->
+ <element ref="squarebutton-grey" inputtag="C5" inputmask="0x01"><bounds x="2742" y="1360" width="145" height="107" /><animate name="led2" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-edit"><bounds x="2762" y="1262" width="93" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-progk"><bounds x="2734" y="1302" width="152" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Midi -->
+ <element ref="squarebutton-grey" inputtag="C4" inputmask="0x01"><bounds x="2964" y="1360" width="145" height="107" /><animate name="led3" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-midil"><bounds x="2975" y="1287" width="125" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Disk -->
+ <element ref="squarebutton-grey" inputtag="C3" inputmask="0x01"><bounds x="3186" y="1360" width="145" height="107" /><animate name="led4" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-diskm"><bounds x="3186" y="1287" width="145" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Tune Level -->
+ <element ref="squarebutton-grey" inputtag="C2" inputmask="0x01"><bounds x="3408" y="1360" width="145" height="107" /><animate name="led5" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-tune"><bounds x="3428" y="1262" width="103" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-leveln"><bounds x="3398" y="1302" width="167" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Utility -->
+ <element ref="squarebutton-grey" inputtag="C1" inputmask="0x01"><bounds x="3630" y="1360" width="145" height="107" /><animate name="led6" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-utilityo"><bounds x="3609" y="1287" width="185" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Help -->
+ <element ref="squarebutton-grey" inputtag="C0" inputmask="0x01"><bounds x="3852" y="1360" width="145" height="107" /><animate name="led7" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-helpp"><bounds x="3856" y="1287" width="142" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 7/T -->
+ <element ref="rectbutton-blue" inputtag="C5" inputmask="0x04"><bounds x="4202" y="984" width="145" height="76" /></element>
+ <element ref="text-7q"><bounds x="4240" y="936" width="80" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 8/U -->
+ <element ref="rectbutton-blue" inputtag="C4" inputmask="0x04"><bounds x="4450" y="984" width="145" height="76" /></element>
+ <element ref="text-8r"><bounds x="4488" y="936" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 9/V -->
+ <element ref="rectbutton-blue" inputtag="C3" inputmask="0x04"><bounds x="4698" y="984" width="145" height="76" /></element>
+ <element ref="text-9s"><bounds x="4738" y="936" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 4/T -->
+ <element ref="rectbutton-blue" inputtag="C5" inputmask="0x08"><bounds x="4202" y="1124" width="145" height="76" /></element>
+ <element ref="text-4t"><bounds x="4240" y="1076" width="80" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 5/U -->
+ <element ref="rectbutton-blue" inputtag="C4" inputmask="0x08"><bounds x="4450" y="1124" width="145" height="76" /></element>
+ <element ref="text-5u"><bounds x="4488" y="1076" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 6/V -->
+ <element ref="rectbutton-blue" inputtag="C3" inputmask="0x08"><bounds x="4698" y="1124" width="145" height="76" /></element>
+ <element ref="text-6v"><bounds x="4738" y="1076" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 1/W -->
+ <element ref="rectbutton-blue" inputtag="C0" inputmask="0x04"><bounds x="4202" y="1264" width="145" height="76" /></element>
+ <element ref="text-1w"><bounds x="4240" y="1216" width="80" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 2/X -->
+ <element ref="rectbutton-blue" inputtag="C1" inputmask="0x04"><bounds x="4450" y="1264" width="145" height="76" /></element>
+ <element ref="text-2x"><bounds x="4488" y="1216" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 3/Y -->
+ <element ref="rectbutton-blue" inputtag="C7" inputmask="0x04"><bounds x="4698" y="1264" width="145" height="76" /></element>
+ <element ref="text-3y"><bounds x="4738" y="1216" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 0/Z -->
+ <element ref="rectbutton-blue" inputtag="C0" inputmask="0x08"><bounds x="4202" y="1404" width="145" height="76" /></element>
+ <element ref="text-0z"><bounds x="4240" y="1356" width="80" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Minus -->
+ <element ref="rectbutton-blue" inputtag="C7" inputmask="0x08"><bounds x="4450" y="1404" width="145" height="76" /></element>
+ <element ref="text-minus"><bounds x="4455" y="1356" width="195" height="50" /></element>
+ <!-- Plus -->
+ <element ref="rectbutton-blue" inputtag="C1" inputmask="0x08"><bounds x="4698" y="1404" width="145" height="76" /></element>
+ <element ref="text-plus"><bounds x="4700" y="1356" width="195" height="50" /></element>
+
+ <!-- Cursor Module -->
+ <element ref="text-cursor"><bounds x="4333" y="302" width="185" height="45" /><color red="0" green="0" blue="0" /></element>
+ <group ref="cursormodule"><bounds x="4210" y="365" width="432" height="340" /></group>
+
+ </view>
+
+ <script><![CDATA[
+ file:set_resolve_tags_callback(
+ function()
+ local view = file.views["Default Layout"]
+ add_simplecounter_knob(view, "dataentry_knob", "DATAENTRY", 1.5)
+ end)
+
+
+ -----------------------------------------------------------------------
+ -- Slider and knob library starts.
+ -- Can be copied as-is to other layouts.
+ -----------------------------------------------------------------------
+ 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_vertical_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_simplecounter_knob(view, clickarea_id, port_name, scale)
+ table.insert(widgets, {
+ clickarea = get_layout_item(view, clickarea_id),
+ field = get_port_field(port_name),
+ is_knob = true,
+ scale = scale })
+ 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
+ if field == nil then
+ emu.print_error("Port: '" .. port_name .."' does not seem to be an IPT_ADJUSTER.")
+ return nil
+ end
+ return field
+ 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
+ pointers[id] = nil
+ 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_y = y,
+ start_value = widgets[i].field.user_value }
+ 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 Y
+ -- position. It is assumed the attached IO field is an IPT_ADJUSTER.
+
+ 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
+ local step_y = value_range / (widget.scale * widget.clickarea.bounds.height)
+ new_value = pointer.start_value + (pointer.start_y - y) * step_y
+ 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
+ widget.field.user_value = new_value
+ end
+
+ local function pointer_left(type, id, dev, x, y, up, cnt)
+ pointers[id] = nil
+ end
+
+ local function pointer_aborted(type, id, dev, x, y, up, cnt)
+ pointers[id] = nil
+ end
+
+ local function forget_pointers()
+ 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/layout/s2000.lay b/src/mame/layout/s2000.lay
index 1c42bb853cd..370e1b32acc 100644
--- a/src/mame/layout/s2000.lay
+++ b/src/mame/layout/s2000.lay
@@ -2,30 +2,11 @@
<!-- license:CC0-1.0 -->
<mamelayout version="2">
-<!--
- #include "s2000.lh"
- config.set_default_layout(layout_s2000);
- palette.set_pen_color(0, rgb_t(88, 247, 0)); // bright green
- palette.set_pen_color(1, rgb_t(3, 179, 6)); // dark green
--->
-
-<!-- Layout for AKAI S2000 MIDI Stereo Digital Sampler Rack Unit
+<!-- Layout for AKAI S2000 MIDI Stereo Digital Sampler Rack Unit (1993)
by Guru (https://gurudumps.otenko.com/)
(thanks to robcfg for real unit reference photos and infos)
-->
- <!-- TODO: Add Script
- Text For Layout Plugin Enable Check At Boot
- <element name="script_warning" defstate="1">
- <text state="1" string="TO CONTROL SLIDERS/KNOBS WITH MOUSE PLEASE ENABLE LAYOUT PLUGIN">
- <color red="1" green="0" blue="0"/></text></element>
--->
-
- <!-- TODO: Delete when done.
- Guide image. All elements in this layout is positionally accurate (within 2 pixels) vs an
- image of a real unit -->
- <element name="background"><image file="s2000.png" /></element>
-
<!-- Model Logo Using Simple Lines -->
<element name="s2000-text">
<image><data><![CDATA[
@@ -133,6 +114,53 @@
]]></data></image>
</element>
+ <!-- 3 1/2" FDD Module -->
+ <element name="floppycutout"><rect></rect></element>
+ <element name="floppy">
+ <image><data><![CDATA[
+ <svg width="1255" height="335" viewBox="0 0 1255 335">
+ <rect x="0" y="0" width="1255" height="325" fill="#c4c0ab" stroke="#c4c0ab" stroke-width="5"/>
+ <line x1="35" y1="35" x2="80" y2="100" stroke="#d9d5c0" stroke-width="5"/>
+ <line x1="1220" y1="35" x2="1175" y2="100" stroke="#d9d5c0" stroke-width="5"/>
+ <line x1="40" y1="170" x2="80" y2="130" stroke="#d9d5c0" stroke-width="5"/>
+ <line x1="1215" y1="170" x2="1175" y2="130" stroke="#d9d5c0" stroke-width="5"/>
+ <rect x="70" y="90" width="1115" height="50" fill="black" stroke="black" stroke-width="5" rx="10" ry="10"/>
+ <rect x="30" y="30" width="1195" height="140" fill="none" stroke="#d9d5c0" stroke-width="5" rx="20" ry="20"/>
+ <rect x="407.5" y="30" width="440" height="50" fill="#b3ae99" stroke="#b3ae99" stroke-width="5"/>
+ <rect x="407.5" y="200" width="440" height="90" fill="#cfcbb7" stroke="#cfcbb7" stroke-width="5"/>
+ <rect x="280" y="80" width="695" height="70" fill="black" stroke="black" stroke-width="5"/>
+ <rect x="240" y="230" width="100" height="50" fill="none" stroke="#d9d5c0" stroke-width="5"/>
+ <line x1="242" y1="230" x2="340" y2="230" stroke="#8e8673" stroke-width="5"/>
+ <rect x="885" y="215" width="190" height="75" fill="black" stroke="black" stroke-width="5" rx="10" ry="10"/>
+ <rect x="897" y="227" width="166" height="51" fill="#c4c0ab" stroke="#c4c0ab" stroke-width="5" rx="5" ry="5"/>
+ <rect x="407.5" y="170" width="440" height="30" fill="#c4c0ab" stroke="#d9d5c0" stroke-width="5"/>
+ <rect x="407.5" y="60" width="440" height="110" fill="black" stroke="black" stroke-width="5"/>
+ <line x1="406" y1="170" x2="406" y2="290" stroke="#8e8673" stroke-width="5"/>
+ <line x1="847.5" y1="170" x2="847.5" y2="290" stroke="#8e8673" stroke-width="5"/>
+ <line x1="410" y1="170" x2="406" y2="290" stroke="#8e8673" stroke-width="5"/>
+ <line x1="843.5" y1="170" x2="847.5" y2="290" stroke="#8e8673" stroke-width="5"/>
+ <line x1="414" y1="170" x2="406" y2="290" stroke="#8e8673" stroke-width="5"/>
+ <line x1="839.5" y1="170" x2="847.5" y2="290" stroke="#8e8673" stroke-width="5"/>
+ <line x1="406" y1="30" x2="406" y2="60" stroke="#8e8673" stroke-width="5"/>
+ <line x1="847.5" y1="30" x2="847.5" y2="60" stroke="#8e8673" stroke-width="5"/>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- Power switch -->
+ <element name="powerswitch">
+ <image><data><![CDATA[
+ <svg width="280" height="365" viewBox="0 0 285 370">
+ <rect x="0" y="0" width="280" height="365" fill="#9b8a67" stroke="#9b8a67" stroke-width="5" rx="30" ry="30"/>
+ <rect x="10" y="10" width="260" height="345" fill="#c8b88e" stroke="#c8b88e" stroke-width="5" rx="20" ry="20"/>
+ <rect x="45" y="60" width="190" height="245" fill="black" stroke="black" stroke-width="15" rx="20" ry="20"/>
+ <rect x="50" y="65" width="180" height="235" fill="#c8b88e" stroke="#c8b88e" stroke-width="5" rx="18" ry="18"/>
+ <path d="M50,270 V282 A 18 18 0 0 0 68,300 H212 A 18 18 0 0 0 230,282 V270 H50 Z" stroke="#9b8a67" stroke-width="5" fill="#9b8a67"/>
+ <line x1="50" y1="270" x2="230" y2="270" stroke="#e1dac2" stroke-width="7" fill-opacity="0.7" />
+ </svg>
+ ]]></data></image>
+ </element>
+
<!-- LEDs -->
<element name="fddled"><rect></rect></element>
<element name="led"><disk></disk></element>
@@ -140,10 +168,8 @@
]<!-- Basic Elements -->
<element name="line"><rect><color red="0" green="0" blue="0"/></rect></element>
<element name="vline"><rect><color red="0" green="0" blue="0"/></rect></element>
- <element name="circle"><disk></disk></element>
- <element name="box"><rect></rect></element>
- <!-- Slots (with screws at different angles), so the unit doesn't fall down and break your foot ;-) -->
+ <!-- Slots with screws (at different angles)... so the unit doesn't fall down and break your foot ;-) -->
<element name="slot1">
<image><data><![CDATA[
<svg width="130" height="104" viewBox="0 0 130 104">
@@ -277,20 +303,6 @@
</image>
</element>
- <element name="indicator">
- <image state="0"><data><![CDATA[
- <svg width="100" height="100" viewBox="0 -30 100 100" stroke-width="7" stroke="black" >
- <line x1="49" y1="-30" x2="49" y2="5" />
- <ellipse cx="50" cy="35" rx="12" ry="12" fill="black"/>
- <line x1="49" y1="50" x2="49" y2="78" />
- <svg width="100" height="100">
- <path d="M 25,60 A 35,35 0 1 1 75,60"
- fill="none" stroke="black" stroke-width="6"/>
- </svg>
- ]]></data>
- </image>
- </element>
-
<!-- All Texts -->
<element name="knob-volume-text"><text align="0" string="MAIN VOLUME" /></element>
<element name="knob-gain-text"><text align="0" string="REC GAIN" /></element>
@@ -319,7 +331,106 @@
<element name="professional-text"><text align="2" string="professional" /></element>
<element name="msds"><text align="1" string="MIDI STEREO DIGITAL SAMPLER" /></element>
- <!-- Arrows -->
+ <!-- Knobs -->
+ <element name="gain">
+ <image><data><![CDATA[
+ <svg width="500" height="500" viewBox="0 0 500 500">
+ <g fill="black" stroke="rgb(192,181,137)" stroke-width="5" transform="translate(250, 250)">
+ <circle cx="0" cy="0" r="165" fill="black" stroke="black"/>
+ <circle cx="0" cy="0" r="150" fill="rgb(192,181,137)" stroke="rgb(192,181,137)"/>
+ <rect x="-30" y="-120" width="60" height="220" fill="#cdc191" stroke="#cdc191"/>
+ <line x1="0" y1="-150" x2="0" y2="-80" stroke="#ac2414" stroke-width="14"/>
+ <line x1="-30" y1="95" x2="30" y2="95" stroke="rgb(234,226,194)" stroke-width="14" fill-opacity="0.5"/>
+ <path d="M -60,-135 L -75.8,130 L -54.59,141.21 L -35,100 L -35,-110 A 25 25 0 0 0 -60,-135 Z" stroke="#b9a97d" stroke-width="5" fill="#b9a97d"/>
+ <path d="M -60,-135 L -75.8,130" stroke="rgb(199,188,143)" stroke-width="11" fill="none" fill-opacity="0.5"/>
+ <path d="M 60,-135 L 75.8,130 L 54.59,141.21 L 35,100 L 35,-110 A 25 25 0 0 0 60,-135 Z" stroke="#b9a97d" stroke-width="5" fill="#b9a97d"/>
+ <path d="M 60,-135 L 75.8,130" stroke="rgb(199,188,143)" stroke-width="11" fill="none" fill-opacity="0.5"/>
+ <circle transform="rotate(0)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(30)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(60)" cx="200" cy="0" r="12"/>
+ <circle transform="rotate(120)" cx="200" cy="0" r="12"/>
+ <circle transform="rotate(150)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(180)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(210)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(240)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(270)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(300)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(330)" cx="200" cy="0" r="7"/>
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="volume">
+ <image><data><![CDATA[
+ <svg width="500" height="500" viewBox="0 0 500 500">
+ <g fill="black" stroke="rgb(192,181,137)" stroke-width="5" transform="translate(250, 250)">
+ <circle cx="0" cy="0" r="165" fill="black" stroke="black"/>
+ <circle cx="0" cy="0" r="150" fill="rgb(192,181,137)" stroke="rgb(192,181,137)"/>
+ <rect x="-30" y="-120" width="60" height="220" fill="#cdc191" stroke="#cdc191"/>
+ <line x1="0" y1="-150" x2="0" y2="-80" stroke="#2227b5" stroke-width="14"/>
+ <line x1="-30" y1="95" x2="30" y2="95" stroke="rgb(234,226,194)" stroke-width="14" fill-opacity="0.5"/>
+ <path d="M -60,-135 L -75.8,130 L -54.59,141.21 L -35,100 L -35,-110 A 25 25 0 0 0 -60,-135 Z" stroke="#b9a97d" stroke-width="5" fill="#b9a97d"/>
+ <path d="M -60,-135 L -75.8,130" stroke="rgb(199,188,143)" stroke-width="11" fill="none" fill-opacity="0.5"/>
+ <path d="M 60,-135 L 75.8,130 L 54.59,141.21 L 35,100 L 35,-110 A 25 25 0 0 0 60,-135 Z" stroke="#b9a97d" stroke-width="5" fill="#b9a97d"/>
+ <path d="M 60,-135 L 75.8,130" stroke="rgb(199,188,143)" stroke-width="11" fill="none" fill-opacity="0.5"/>
+ <circle transform="rotate(0)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(30)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(60)" cx="200" cy="0" r="12"/>
+ <circle transform="rotate(120)" cx="200" cy="0" r="12"/>
+ <circle transform="rotate(150)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(180)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(210)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(240)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(270)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(300)" cx="200" cy="0" r="7"/>
+ <circle transform="rotate(330)" cx="200" cy="0" r="7"/>
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- Bezel / Panel Elements -->
+ <element name="bezel"><rect><bounds x="0" y="0" width="72" height="208" /></rect></element>
+ <element name="panel"><rect></rect></element>
+ <element name="bezel-highlightbr">
+ <image><data><![CDATA[
+ <svg width="50" height="50" viewBox="0 0 60 60">
+ <path d="M 0,0 L 50,50 Z" fill="none" stroke="#595b4c" stroke-width="12"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="bezel-highlightbl">
+ <image><data><![CDATA[
+ <svg width="50" height="50" viewBox="0 0 60 60">
+ <path d="M50,0 L 0,50 Z" fill="none" stroke="#595b4c" stroke-width="12"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="bezel-highlighttl">
+ <image><data><![CDATA[
+ <svg width="50" height="50" viewBox="0 0 60 60">
+ <path d="M 0,0 L 50,50 Z" fill="none" stroke="#595b4c" stroke-width="12"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="bezel-highlighttr">
+ <image><data><![CDATA[
+ <svg width="50" height="50" viewBox="0 0 60 60">
+ <path d="M50,0 L 0,50 Z" fill="none" stroke="#595b4c" stroke-width="12"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="jack">
+ <disk><bounds x="0" y="0" width="140" height="140" /><color red="0" green="0" blue="0" /></disk>
+ <disk><bounds x="7" y="7" width="126" height="126" /><color red="0.709" green="0.674" blue="0.611" /></disk>
+ <disk><bounds x="12.5" y="12.5" width="115" height="115" /><color red="0" green="0" blue="0" /></disk>
+ <disk><bounds x="15" y="15" width="110" height="110" /><color red="0.317" green="0.290" blue="0.227" /></disk>
+ <disk><bounds x="27.5" y="27.5" width="85" height="85" /><color red="0" green="0" blue="0" /></disk>
+ </element>
<element name="cursor-down-arrow">
<image>
<bounds xc="7.5" yc="5" width="20" height="10" />
@@ -361,158 +472,82 @@
</image>
</element>
- <!-- TODO: Replace with correct knobs. Selective tick marks around the volume and record knobs every 30 degrees (some missing by design) -->
- <element name="knob-ticks">
- <image><data><![CDATA[
- <svg width="500" height="500" viewBox="0 0 500 500">
- <g stroke="#000000" stroke-width="5" transform="translate(250, 250)>
- <line x1="0" y1="0" x2="200" y2="0"/>
- <line transform="rotate(30)" x1="0" y1="0" x2="200" y2="0"/>
- <line transform="rotate(60)" x1="0" y1="0" x2="200" y2="0"/>
- <line transform="rotate(120)" x1="0" y1="0" x2="200" y2="0"/>
- <line transform="rotate(150)" x1="0" y1="0" x2="200" y2="0"/>
- <line transform="rotate(180)" x1="0" y1="0" x2="200" y2="0"/>
- <line transform="rotate(210)" x1="0" y1="0" x2="200" y2="0"/>
- <line transform="rotate(240)" x1="0" y1="0" x2="200" y2="0"/>
- <line transform="rotate(270)" x1="0" y1="0" x2="200" y2="0"/>
- <line transform="rotate(300)" x1="0" y1="0" x2="200" y2="0"/>
- <line transform="rotate(330)" x1="0" y1="0" x2="200" y2="0"/>
- </g>
- </svg>
- ]]></data></image>
- </element>
-
- <!-- Bezel / Panel Elements -->
- <element name="bezel"><rect><bounds x="0" y="0" width="72" height="208" /></rect></element>
- <element name="panel"><rect></rect></element>
- <element name="bezel-highlightbr">
- <image><data><![CDATA[
- <svg width="126" height="88" viewBox="0 0 128 90">
- <path d="M 0,0 L 123,86 Z" fill="#595b4c" stroke="#595b4c" stroke-width="5"/>
- </svg>
- ]]></data>
- </image>
- </element>
- <element name="bezel-highlightbl">
- <image><data><![CDATA[
- <svg width="126" height="88" viewBox="0 0 128 90">
- <path d="M119,0 L 0,86 Z" fill="#595b4c" stroke="#595b4c" stroke-width="5"/>
- </svg>
- ]]></data>
- </image>
- </element>
- <element name="bezel-highlighttl">
- <image><data><![CDATA[
- <svg width="126" height="35" viewBox="0 0 128 37">
- <path d="M 0,0 L 123,35 Z" fill="#595b4c" stroke="#595b4c" stroke-width="5"/>
- </svg>
- ]]></data>
- </image>
- </element>
- <element name="bezel-highlighttr">
- <image><data><![CDATA[
- <svg width="126" height="35" viewBox="0 0 128 37">
- <path d="M119,0 L 0,35 Z" fill="#595b4c" stroke="#595b4c" stroke-width="5"/>
- </svg>
- ]]></data>
- </image>
- </element>
-
<!-- Screen Assembly -->
<group name="group-screen">
<bounds x="0" y="0" width="940" height="300" />
<element ref="bezel"><bounds x="0" y="0" width="940" height="300" /><color red="0" green="0" blue="0" /></element>
- <element ref="bezel"><bounds x="10" y="10" width="920" height="265" /><color red="0.317" green="0.321" blue="0.294" /></element>
- <element ref="bezel"><bounds x="20" y="20" width="900" height="245" /><color red="0" green="0" blue="0" alpha="0.25" /></element>
- <element ref="bezel-highlighttl"><bounds x="15" y="15" width="124" height="30" /></element>
- <element ref="bezel-highlighttr"><bounds x="812" y="15" width="124" height="30" /></element>
- <element ref="bezel-highlightbl"><bounds x="15" y="184" width="124" height="88" /></element>
- <element ref="bezel-highlightbr"><bounds x="812" y="184" width="124" height="88" /></element>
+ <element ref="bezel"><bounds x="10" y="10" width="920" height="280" /><color red="0.290" green="0.278" blue="0.254" /></element>
+ <element ref="bezel"><bounds x="15" y="15" width="910" height="270" /><color red="0.207" green="0.207" blue="0.192" /></element>
+ <element ref="bezel"><bounds x="23" y="23" width="894" height="254" /><color red="0.290" green="0.278" blue="0.254" /></element>
+ <element ref="bezel"><bounds x="31" y="31" width="878" height="238" /><color red="0.207" green="0.207" blue="0.192" /></element>
+ <element ref="bezel-highlighttl"><bounds x="14" y="14" width="20" height="20" /></element>
+ <element ref="bezel-highlighttr"><bounds x="910" y="14" width="20" height="20" /></element>
+ <element ref="bezel-highlightbl"><bounds x="14" y="273" width="20" height="20" /></element>
+ <element ref="bezel-highlightbr"><bounds x="910" y="273" width="20" height="20" /></element>
<screen index="0"><bounds x="110" y="37" width="720" height="160" /></screen>
</group>
- <!-- Knob Elements -->
- <element name="knob"><disk></disk></element>
- <element name="knob-position"><rect></rect></element>
+ <!-- Data/Select Symbol -->
+ <element name="data_select_symbol">
+ <image state="0"><data><![CDATA[
+ <svg width="100" height="100" viewBox="0 -30 100 100" stroke-width="7" stroke="black" >
+ <line x1="49" y1="-30" x2="49" y2="5" />
+ <ellipse cx="50" cy="35" rx="12" ry="12" fill="black"/>
+ <line x1="49" y1="50" x2="49" y2="78" />
+ <svg width="100" height="100">
+ <path d="M 25,60 A 35,35 0 1 1 75,60"
+ fill="none" stroke="black" stroke-width="6"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
- <!-- Data Entry Pieces -->
- <element name="dataentry_bottom"><disk><color red="0" green="0" blue="0"/></disk></element>
- <element name="dataentry_top"><disk><color red="0.741" green="0.678" blue="0.513"/></disk></element>
- <element name="dataentry_outer"><disk><color red="0.772" green="0.725" blue="0.603"/></disk></element>
+ <!-- Build Encoder Wheel -->
+ <element name="dataentry_bottom" clickthrough="no"><disk><color red="0" green="0" blue="0"/></disk></element>
+ <element name="dataentry_top" clickthrough="no"><disk><color red="0.741" green="0.678" blue="0.513"/></disk></element>
+ <element name="dataentry_outer" clickthrough="no"><disk><color red="0.772" green="0.725" blue="0.603"/></disk></element>
<element name="outer_ring"><disk><color red="0.741" green="0.678" blue="0.513"/></disk></element>
<element name="outer_ring_top"><disk><color red="0.870" green="0.823" blue="0.674"/></disk></element>
-<!--<element name="dataentry_knob">
- <simplecounter maxstate="100" digits="1"><color red="0.505" green="0.458" blue="0.337"/></simplecounter>
- </element>
--->
-
- <!-- Volume Knob (non-functional) TODO: replace with visually-correct knob -->
+ <element name="dataentry_knob">
+ <simplecounter maxstate="100" digits="3"><color red="0.505" green="0.458" blue="0.337"/></simplecounter>
+ </element>
<group name="volumeknob"><bounds x="0" y="0" width="500" height="500"/>
- <element ref="knob-ticks"><bounds x="0" y="30" width="500" height="500"/></element>
- <element ref="knob"><bounds x="92" y="115" width="330" height="330" /><color red="0.827" green="0.827" blue="0.827" /></element>
- <element ref="knob"><bounds x="112" y="135" width="290" height="290" /><color red="0.0" green="0.0" blue="0.0" /></element>
- <element ref="knob"><bounds x="127" y="150" width="260" height="260" /><color red="0.7" green="0.7" blue="0.7" /></element>
- <element ref="knob"><bounds x="161" y="185" width="196" height="196" /><color red="0.5" green="0.5" blue="0.5" /></element>
- <element ref="knob"><bounds x="167" y="190" width="180" height="180" /><color red="0.88" green="0.9" blue="0.778" /></element>
- <element ref="knob-position"><bounds x="232" y="110" width="40" height="180" /><color red="0.5" green="0.5" blue="0.5" /></element>
- <element ref="knob-position"><bounds x="240" y="115" width="30" height="190" /><color red="0.78" green="0.8" blue="0.678" /></element>
+ <element ref="volume"><bounds x="0" y="30" width="500" height="500"/></element>
</group>
-
- <!-- Record Knob (non-functional) TODO: replace with visually-correct knob -->
- <group name="recordknob">
- <bounds x="0" y="0" width="500" height="500"/>
- <element ref="knob-ticks"><bounds x="0" y="30" width="500" height="500"/></element>
- <element ref="knob"><bounds x="92" y="115" width="330" height="330" /><color red="0.745" green="0.729" blue="0.654" /></element>
- <element ref="knob"><bounds x="112" y="135" width="290" height="290" /><color red="0.0" green="0.0" blue="0.0" /></element>
- <element ref="knob"><bounds x="127" y="150" width="260" height="260" /><color red="0.7" green="0.7" blue="0.7" /></element>
- <element ref="knob"><bounds x="161" y="185" width="196" height="196" /><color red="0.5" green="0.5" blue="0.5" /></element>
- <element ref="knob"><bounds x="167" y="190" width="180" height="180" /><color red="0.764" green="0.376" blue="0.302" /></element>
- <element ref="knob-position"><bounds x="232" y="110" width="40" height="180" /><color red="0.5" green="0.5" blue="0.5" /></element>
- <element ref="knob-position"><bounds x="240" y="115" width="30" height="190" /><color red="0.664" green="0.276" blue="0.202" /></element>
- </group>
-
- <!-- Data Entry Knob
- TODO: Missing in MAME driver:
- 360 degrees Encoder (center wheel)
- Outer ring; rotates +- 90 degrees and springs back to center
- -->
- <group name="outerknob">
+ <group name="gainknob">
+ <bounds x="0" y="0" width="500" height="500"/>
+ <element ref="gain"><bounds x="0" y="30" width="500" height="500"/></element>
+ </group>
+ <element name="ringleft">
+ <rect state="0"><bounds x="290" y="0" width="10" height="30" /><color red="0" green="0" blue="0" /></rect>
+ <rect state="1"><bounds x="290" y="0" width="10" height="30" /><color red="0.741" green="0.678" blue="0.513"/></rect>
+ <rect state="1"><bounds x="0" y="0" width="290" height="580" /><color red="1" green="1" blue="1" alpha="0" /></rect>
+ <rect state="1"><bounds x="0" y="285" width="30" height="10" /><color red="0" green="0" blue="0" /></rect>
+ </element>
+ <element name="ringright">
+ <rect state="1"><bounds x="290" y="0" width="10" height="30" /><color red="0.741" green="0.678" blue="0.513"/></rect>
+ <rect state="1"><bounds x="290" y="0" width="290" height="580" /><color red="1" green="1" blue="1" alpha="0" /></rect>
+ <rect state="1"><bounds x="550" y="285" width="30" height="10" /><color red="0" green="0" blue="0" /></rect>
+ </element>
+ <group name="outerknob">
<bounds x="0" y="0" width="580" height="580" />
<element ref="outer_ring" ><bounds x="0" y="0" width="580" height="580"/></element>
<element ref="outer_ring_top" ><bounds x="50" y="50" width="480" height="480"/></element>
- <element ref="vline"><bounds x="285" y="0" width="10" height="30" /></element>
- </group>
-
- <group name="select_data_knob">
+ <element ref="ringleft" inputtag="C5" inputmask="0x02"><bounds x="0" y="0" width="295" height="580" /></element>
+ <element ref="ringright" inputtag="C2" inputmask="0x02"><bounds x="285" y="0" width="295" height="580" /></element>
+ </group>
+ <group name="select_data_knob">
<bounds x="0" y="0" width="590" height="590" />
- <element ref="dataentry_bottom" ><bounds x="0" y="0" width="590" height="590"/></element>
+ <element ref="dataentry_bottom" clickthrough="no" ><bounds x="0" y="0" width="590" height="590"/></element>
<group ref="outerknob" ><bounds x="15" y="15" width="560" height="560"/></group>
<element ref="dataentry_bottom" ><bounds x="80" y="80" width="430" height="430"/></element>
- <element ref="dataentry_outer" ><bounds x="90" y="90" width="410" height="410"/></element>
- <element ref="dataentry_top" ><bounds x="105" y="105" width="380" height="380"/></element>
- </group>
-
- <!-- 1/4" Jacks -->
- <element name="jack">
- <disk><bounds x="0" y="0" width="140" height="140" /><color red="0" green="0" blue="0" /></disk>
- <disk><bounds x="7" y="7" width="126" height="126" /><color red="0.709" green="0.674" blue="0.611" /></disk>
- <disk><bounds x="12.5" y="12.5" width="115" height="115" /><color red="0" green="0" blue="0" /></disk>
- <disk><bounds x="15" y="15" width="110" height="110" /><color red="0.317" green="0.290" blue="0.227" /></disk>
- <disk><bounds x="27.5" y="27.5" width="85" height="85" /><color red="0" green="0" blue="0" /></disk>
- </element>
+ <element ref="dataentry_outer" clickthrough="no" ><bounds x="90" y="90" width="410" height="410"/></element>
+ <element ref="dataentry_top" clickthrough="no" ><bounds x="105" y="105" width="380" height="380"/></element>
+ </group>
<!-- Show Everything -->
<view name="Default Layout">
- <!-- TODO: Add Script. Check Layout Plugin Is Turned On
- <collection name="script warning">
- <element ref="script_warning" id="warning"><bounds x="200" y="50" width="1200" height="30"/></element>
- </collection>
--->
-
- <!-- TODO: Delete when done. Guide .png image when editing layout -->
-<!-- <element ref="background"><bounds x="0" y="0" width="6000" height="1112" /></element>
--->
<!-- Screen and Panel -->
<element ref="panel"><bounds x="0" y="0" width="6000" height="1112" /><color red="0.745" green="0.729" blue="0.654" /></element>
<group ref="group-screen"><bounds x="2248" y="175" width="940" height="300" /></group>
@@ -531,10 +566,12 @@
<element ref="jack"><bounds x="4880" y="575" width="150" height="150" /></element>
<element ref="jack"><bounds x="4880" y="815" width="150" height="150" /></element>
<element ref="jack"><bounds x="5290" y="815" width="150" height="150" /></element>
- <group ref="recordknob"><bounds x="4765" y="70" width="375" height="375" /></group>
+ <group ref="gainknob"><bounds x="4765" y="70" width="375" height="375" /></group>
<group ref="volumeknob"><bounds x="5185" y="70" width="375" height="375" /></group>
<group ref="select_data_knob"><bounds x="3915" y="220" width="680" height="680" /></group>
- <element ref="indicator"><bounds x="4234" y="100" width="50" height="50" /></element>
+ <element ref="dataentry_knob" id="dataentry_knob" inputtag="DATAENTRY" inputmask="0xffff" inputraw="yes">
+ <bounds x="4185" y="530" width="130" height="60"/></element>
+ <element ref="data_select_symbol"><bounds x="4234" y="100" width="50" height="50" /></element>
<element ref="akai-novo-text"><bounds x="445" y="130" width="325" height="90" /></element>
<element ref="professional-text"><bounds x="785" y="178" width="230" height="50" /><color red="0.902" green="0.117" blue="0.149" /></element>
<element ref="msds"><bounds x="1085" y="180" width="650" height="51.50" /><color red="0" green="0" blue="0" /></element>
@@ -564,7 +601,6 @@
<element ref="f1-text"><bounds x="2240" y="542" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
<element ref="cursor-text"><bounds x="2600" y="542" width="250" height="45" /><color red="0" green="0" blue="0" /></element>
<element ref="f2-text"><bounds x="3002" y="542" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
- <element ref="power-text"><bounds x="480" y="750" width="250" height="45" /><color red="0" green="0" blue="0" /></element>
<element ref="led"><bounds x="3243" y="937" width="25" height="25" /><animate name="led0" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
<element ref="led"><bounds x="3243" y="745" width="25" height="25" /><animate name="led1" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
<element ref="led"><bounds x="2912" y="937" width="25" height="25" /><animate name="led2" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
@@ -574,10 +610,14 @@
<element ref="led"><bounds x="2250" y="937" width="25" height="25" /><animate name="led6" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
<element ref="led"><bounds x="2250" y="745" width="25" height="25" /><animate name="led7" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
- <!-- Floppy Drive TODO -->
- <element ref="box"><bounds x="845" y="607" width="1278" height="341" /><color red="0" green="0" blue="0" /></element>
+ <!-- Floppy Drive -->
+ <element ref="floppycutout"><bounds x="841.5" y="601.5" width="1277" height="337" /><color red="0" green="0" blue="0" /></element>
+ <element ref="floppy"><bounds x="853" y="612" width="1255" height="325" /></element>
<element ref="fddled"><bounds x="1110" y="845" width="70" height="25" /><animate name="drive_led" /><color state="0" red="0.0" green="0.4" blue="0" /><color state="1" red="0" green="1" blue="0" /></element>
+ <!-- Power Switch -->
+ <element ref="powerswitch"><bounds x="475" y="605" width="280" height="335" /></element>
+ <element ref="power-text"><bounds x="492" y="750" width="250" height="45" /><color red="0" green="0" blue="0" /></element>
<!-- Buttons -->
<!-- F1 -->
@@ -626,7 +666,161 @@
<element ref="squarebutton-black"><bounds x="3639" y="900" width="145" height="107" /></element>
<element ref="squarebutton-owhite" inputtag="C1" inputmask="0x01"><bounds x="3646" y="910" width="130" height="87" /></element>
-
</view>
+ <script><![CDATA[
+ file:set_resolve_tags_callback(
+ function()
+ local view = file.views["Default Layout"]
+ add_simplecounter_knob(view, "dataentry_knob", "DATAENTRY", 1.5)
+ end)
+
+
+ -----------------------------------------------------------------------
+ -- Slider and knob library starts.
+ -- Can be copied as-is to other layouts.
+ -----------------------------------------------------------------------
+ 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_vertical_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_simplecounter_knob(view, clickarea_id, port_name, scale)
+ table.insert(widgets, {
+ clickarea = get_layout_item(view, clickarea_id),
+ field = get_port_field(port_name),
+ is_knob = true,
+ scale = scale })
+ 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
+ if field == nil then
+ emu.print_error("Port: '" .. port_name .."' does not seem to be an IPT_ADJUSTER.")
+ return nil
+ end
+ return field
+ 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
+ pointers[id] = nil
+ 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_y = y,
+ start_value = widgets[i].field.user_value }
+ 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 Y
+ -- position. It is assumed the attached IO field is an IPT_ADJUSTER.
+
+ 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
+ local step_y = value_range / (widget.scale * widget.clickarea.bounds.height)
+ new_value = pointer.start_value + (pointer.start_y - y) * step_y
+ 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
+ widget.field.user_value = new_value
+ end
+
+ local function pointer_left(type, id, dev, x, y, up, cnt)
+ pointers[id] = nil
+ end
+
+ local function pointer_aborted(type, id, dev, x, y, up, cnt)
+ pointers[id] = nil
+ end
+
+ local function forget_pointers()
+ 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/layout/s3000.lay b/src/mame/layout/s3000.lay
new file mode 100644
index 00000000000..4ed46b3cbe2
--- /dev/null
+++ b/src/mame/layout/s3000.lay
@@ -0,0 +1,877 @@
+<?xml version="1.0"?>
+<!-- license:CC0-1.0 -->
+<mamelayout version="2">
+
+<!-- Layout for AKAI S3000/S3000i MIDI Stereo Digital Sampler Rack Unit (1993)
+ by Guru (https://gurudumps.otenko.com/)
+-->
+
+ <!-- All Texts -->
+ <element name="text-0z"><text align="3" string="0/Z" /></element>
+ <element name="text-1w"><text align="3" string="1/W" /></element>
+ <element name="text-2x"><text align="3" string="2/X" /></element>
+ <element name="text-3y"><text align="3" string="3/Y" /></element>
+ <element name="text-4t"><text align="3" string="4/T" /></element>
+ <element name="text-5u"><text align="3" string="5/U" /></element>
+ <element name="text-6v"><text align="3" string="6/V" /></element>
+ <element name="text-7q"><text align="3" string="7/Q" /></element>
+ <element name="text-8r"><text align="3" string="8/R" /></element>
+ <element name="text-9s"><text align="3" string="9/S" /></element>
+ <element name="text-compact"><text align="3" string="COMPACT" /></element>
+ <element name="text-digitalsampler"><text align="3" string="MIDI STEREO DIGITAL SAMPLER" /></element>
+ <element name="text-close"><text align="3" string="CLOSE" /></element>
+ <element name="text-contrast1"><text align="3" string="DISPLAY" /></element>
+ <element name="text-contrast2"><text align="3" string="CONTRAST" /></element>
+ <element name="text-cursor"><text align="3" string="CURSOR" /></element>
+ <element name="text-data"><text align="3" string="DATA" /></element>
+ <element name="text-d"><text align="3" string="d" /></element>
+ <element name="text-diskm"><text align="3" string="DISK/M" /></element>
+ <element name="text-dot"><text align="3" string="." /></element>
+ <element name="text-isc"><text align="3" string="ISC" /></element>
+ <element name="text-edit"><text align="3" string="EDIT" /></element>
+ <element name="text-lf1"><text align="3" string="F1/A" /></element>
+ <element name="text-lf2"><text align="3" string="F2/B" /></element>
+ <element name="text-lf3"><text align="3" string="F3/C" /></element>
+ <element name="text-lf4"><text align="3" string="F4/D" /></element>
+ <element name="text-lf5"><text align="3" string="F5/E" /></element>
+ <element name="text-lf6"><text align="3" string="F6/F" /></element>
+ <element name="text-lf7"><text align="3" string="F7/G" /></element>
+ <element name="text-lf8"><text align="3" string="F8/H" /></element>
+ <element name="text-f1"><text align="3" string="F1" /></element>
+ <element name="text-f2"><text align="3" string="F2" /></element>
+ <element name="text-f3"><text align="3" string="F3" /></element>
+ <element name="text-f4"><text align="3" string="F4" /></element>
+ <element name="text-f5"><text align="3" string="F5" /></element>
+ <element name="text-f6"><text align="3" string="F6" /></element>
+ <element name="text-f7"><text align="3" string="F7" /></element>
+ <element name="text-f8"><text align="3" string="F8" /></element>
+ <element name="text-footsw"><text align="3" string="FOOT SW" /></element>
+ <element name="text-helpp"><text align="3" string="HELP/P" /></element>
+ <element name="text-highspeed"><text align="3" string="HIGH SPEED" /></element>
+ <element name="text-digital"><text align="3" string="DIGITAL" /></element>
+ <element name="text-sound"><text align="3" string="SOUND" /></element>
+ <element name="text-processor"><text align="3" string="PROCESSOR" /></element>
+ <element name="text-jump"><text align="3" string="JUMP/" /></element>
+ <element name="text-leveln"><text align="3" string="LEVEL/N" /></element>
+ <element name="text-mainvolume"><text align="3" string="MAIN VOLUME" /></element>
+ <element name="text-mark"><text align="3" string="MARK/#" /></element>
+ <element name="text-max"><text align="3" string="MAX" /></element>
+ <element name="text-min"><text align="3" string="MIN" /></element>
+ <element name="text-midil"><text align="3" string="MIDI/L" /></element>
+ <element name="text-name"><text align="3" string="NAME" /></element>
+ <element name="text-off"><text align="3" string="OFF" /></element>
+ <element name="text-on"><text align="3" string="ON" /></element>
+ <element name="text-open"><text align="3" string="OPEN" /></element>
+ <element name="text-headphone"><text align="3" string="HEADPHONE" /></element>
+ <element name="text-play"><text align="3" string="ENT/PLAY" /></element>
+ <element name="text-power"><text align="3" string="POWER" /></element>
+ <element name="text-professional"><text align="3" string="professional" /></element>
+ <element name="text-progi"><text align="3" string="PROG/I" /></element>
+ <element name="text-progk"><text align="3" string="PROG/K" /></element>
+ <element name="text-reclevel"><text align="3" string="REC LEVEL" /></element>
+ <element name="text-samplej"><text align="3" string="SAMPLE/J" /></element>
+ <element name="text-screenfunction"><text align="3" string="SCREEN FUNCTION" /></element>
+ <element name="text-select"><text align="3" string="SELECT" /></element>
+ <element name="text-tune"><text align="3" string="TUNE" /></element>
+ <element name="text-utilityo"><text align="3" string="UTILITY/O" /></element>
+ <element name="text-plus">
+ <image><data><![CDATA[
+ <svg width="200" height="60" viewBox="-5 -5 200 100" stroke="black" stroke-width="6">
+ <line x1="0" y1="30" x2="36" y2="30" />
+ <line x1="18" y1="0" x2="18" y2="60" />
+ <line x1="45" y1="60" x2="60" y2="0" />
+ <line x1="75" y1="3" x2="120" y2="30" />
+ <line x1="120" y1="30" x2="75" y2="57" />
+ <line x1="75" y1="57" x2="75" y2="3" />
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="text-minus">
+ <image><data><![CDATA[
+ <svg width="200" height="60" viewBox="-5 -5 200 100" stroke="black" stroke-width="6">
+ <line x1="0" y1="30" x2="36" y2="30" />
+ <line x1="45" y1="57" x2="60" y2="0" />
+ <line x1="70" y1="30" x2="115" y2="3" />
+ <line x1="115" y1="3" x2="115" y2="57" />
+ <line x1="115" y1="57" x2="70" y2="30" />
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- Model -->
+ <element name="text-s3000i">
+ <image><data><![CDATA[
+ <svg width="400" height="100" viewBox="0 0 500 100" stroke="black" stroke-width="4">
+ <g transform="scale(1.7,1)">
+ <line x1="90" y1="20" x2="110" y2="20" />
+ <line x1="90" y1="20" x2="90" y2="50" />
+ <line x1="90" y1="50" x2="110" y2="50" />
+ <line x1="110" y1="50" x2="110" y2="80" />
+ <line x1="90" y1="80" x2="110" y2="80" />
+ <line x1="120" y1="20" x2="140" y2="20" />
+ <line x1="140" y1="20" x2="140" y2="50" />
+ <line x1="120" y1="50" x2="140" y2="50" />
+ <line x1="140" y1="50" x2="140" y2="80" />
+ <line x1="120" y1="80" x2="140" y2="80" />
+ <line x1="150" y1="20" x2="170" y2="20" />
+ <line x1="170" y1="20" x2="170" y2="80" />
+ <line x1="150" y1="80" x2="170" y2="80" />
+ <line x1="150" y1="20" x2="150" y2="80" />
+ <line x1="180" y1="20" x2="200" y2="20" />
+ <line x1="200" y1="20" x2="200" y2="80" />
+ <line x1="180" y1="80" x2="200" y2="80" />
+ <line x1="180" y1="20" x2="180" y2="80" />
+ <line x1="210" y1="20" x2="230" y2="20" />
+ <line x1="230" y1="20" x2="230" y2="80" />
+ <line x1="210" y1="80" x2="230" y2="80" />
+ <line x1="210" y1="20" x2="210" y2="80" />
+ <line x1="240" y1="80" x2="243" y2="40" />
+ <ellipse cx="244.3" cy="25.5" rx="2.5" ry="9" fill="black" stroke="none" />
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- AKAI Text (optimize level 3) using free Novo font converted to SVG (layout system doesn't support multiple truetype fonts) -->
+ <element name="text-akainovo">
+ <image><data><![CDATA[
+ <svg width: 300px; height: auto;>
+ <g fill="#a0222c">
+ <path d="M8.5 11.6l-0.8 -2.7 -4.2 0 -0.8 2.7 -2.6 0 4.1 -11.6 3.0 0 4.1 11.6 -2.6 0zm-1.4 -4.8c-0.8,-2.5 -1.2,-3.9 -1.3,-4.2 -0.1,-0.3 -0.2,-0.6 -0.2,-0.8 -0.2,0.7 -0.7,2.3 -1.5,5.0l3.0 0z"/>
+ <path d="M21.0,11.6l-2.8,0l-3.0-4.9l-1.0.7l0,4.2l-2.5,0l0-11.6l2.5,0l0,5.3l.9-1.3l3.1-4.0l2.7,0l-4.1,5.1z"/>
+ <path d="M29.5 11.6l-0.8 -2.7 -4.2 0 -0.8 2.7 -2.6 0 4.1 -11.6 3.0 0 4.1 11.6 -2.6 0zm-1.4 -4.8c-0.8,-2.5 -1.2,-3.9 -1.3,-4.2 -0.1,-0.3 -0.2,-0.6 -0.2,-0.8 -0.2,0.7 -0.7,2.3 -1.5,5.0l3.0 0z"/>
+ <path d="M37.9,0.0 h-5.2 v1.4 h1.4 v8.5 h-1.4 v1.4 h5.2 v-1.4 h-1.4 v-8.5 h1.4 z"/>
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- 3 1/2" FDD Module (BLACK) -->
+ <element name="floppyblack">
+ <image><data><![CDATA[
+ <svg width="1388" height="1388" viewBox="0 0 1388 1388">
+ <g transform="translate rotate(90 644,644)">
+ <rect x="12" y="0" width="1277" height="347" fill="black" stroke="black" stroke-width=".5"/>
+ <rect x="22" y="12" width="1255" height="325" fill="#343136" stroke="#343136" stroke-width="5"/>
+ <rect x="92" y="102" width="1115" height="50" fill="black" stroke="black" stroke-width="5" rx="10" ry="10"/>
+ <rect x="52" y="42" width="1195" height="140" fill="none" stroke="#49444c" stroke-width="5" rx="20" ry="20"/>
+ <rect x="429.5" y="44" width="440" height="50" fill="#2f2e33" stroke="#2f2e33" stroke-width="5"/>
+ <rect x="429.5" y="212" width="440" height="90" fill="#49444c" stroke="#49444c" stroke-width="5"/>
+ <line x1="57" y1="47" x2="95" y2="100" stroke="#49444c" stroke-width="5"/>
+ <line x1="1242" y1="47" x2="1210" y2="100" stroke="#49444c" stroke-width="5"/>
+ <line x1="64" y1="182" x2="92" y2="153" stroke="#49444c" stroke-width="5"/>
+ <line x1="1241" y1="182" x2="1210" y2="150" stroke="#49444c" stroke-width="5"/>
+ <rect x="302" y="92" width="695" height="70" fill="black" stroke="black" stroke-width="5"/>
+ <rect x="262" y="242" width="100" height="50" fill="none" stroke="#49444c" stroke-width="5"/>
+ <line x1="264" y1="292" x2="362" y2="292" stroke="#49444c" stroke-width="5"/>
+ <rect x="907" y="227" width="190" height="75" fill="black" stroke="black" stroke-width="5" rx="10" ry="10"/>
+ <rect x="914" y="234" width="176" height="61" fill="#343136" stroke="#343136" stroke-width="5" rx="5" ry="5"/>
+ <line x1="920" y1="236" x2="1090" y2="236" stroke="#49444c" stroke-width="5"/>
+ <line x1="430" y1="41" x2="870" y2="41" stroke="#49444c" stroke-width="5"/>
+ <line x1="424" y1="182" x2="424" y2="305" stroke="#49444c" stroke-width="8"/>
+ <line x1="878" y1="182" x2="878" y2="305" stroke="#49444c" stroke-width="5"/>
+ <rect x="429.5" y="182" width="440" height="30" fill="#343136" stroke="#49444c" stroke-width="5"/>
+ <rect x="429.5" y="72" width="440" height="110" fill="black" stroke="black" stroke-width="5"/>
+ <line x1="428" y1="182" x2="428" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="869.5" y1="182" x2="869.5" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="432" y1="182" x2="428" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="865.5" y1="182" x2="869.5" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="436" y1="182" x2="428" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="861.5" y1="182" x2="869.5" y2="302" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="428" y1="42" x2="428" y2="72" stroke="#2f2e33" stroke-width="5"/>
+ <line x1="869.5" y1="42" x2="869.5" y2="72" stroke="#2f2e33" stroke-width="5"/>
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- Power Switch (BLACK) -->
+ <element name="powerswitchblack">
+ <image><data><![CDATA[
+ <svg width="280" height="365" viewBox="0 0 285 370">
+ <rect x="0" y="0" width="280" height="365" fill="#242126" stroke="#242126" stroke-width="5" rx="30" ry="30"/>
+ <rect x="15" y="15" width="250" height="345" fill="#343136" stroke="#343136" stroke-width="5" rx="20" ry="20"/>
+ <line x1="18" y1="22" x2="255" y2="22" stroke="#726d75" stroke-width="7" />
+ <rect x="45" y="60" width="190" height="280" fill="black" stroke="black" stroke-width="15" rx="20" ry="20"/>
+ <rect x="60" y="65" width="160" height="235" fill="#343136" stroke="#343136" stroke-width="5" rx="18" ry="18"/>
+ <path d="M60,200 L52,320 A 18 18 0 0 0 70,338 H210 A 18 18 0 0 0 228,320 L220,200 Z" stroke="#49444c" stroke-width="5" fill="#49444c"/>
+ <path d="M53,310 L52,320 A 18 18 0 0 0 70,338 H210 A 18 18 0 0 0 228,320 L219,310 Z" stroke="#343136" stroke-width="5" fill="#343136"/>
+ <line x1="52" y1="310" x2="228" y2="310" stroke="#726d75" stroke-width="7" />
+ <ellipse cx="140" cy="110" rx="11" ry="11" fill="#f6f5f8" stroke="none" />
+ <line x1="70" y1="70" x2="210" y2="70" stroke="#726d75" stroke-width="7" />
+ <path d="M15,200 L10,310 H30 L35,200 Z" stroke="#49444c" stroke-width="5" fill="#49444c"/>
+ <line x1="10" y1="310" x2="30" y2="310" stroke="#726d75" stroke-width="7" />
+ <path d="M245,200 L245,310 H270 L265,200 Z" stroke="#49444c" stroke-width="5" fill="#49444c"/>
+ <line x1="245" y1="310" x2="270" y2="310" stroke="#726d75" stroke-width="7" />
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- LEDs -->
+ <element name="fddled"><rect></rect></element>
+
+ <!-- Basic Elements -->
+ <element name="line"><rect><color red="0" green="0" blue="0"/></rect></element>
+ <element name="vline"><rect><color red="0" green="0" blue="0"/></rect></element>
+
+ <!-- Slots with screws -->
+ <element name="slot1">
+ <image><data><![CDATA[
+ <svg width="130" height="104" viewBox="0 0 130 104">
+ <rect x="0" y="10" width="130" height="80" rx="40" ry="40" fill="black"/>
+ <ellipse cx="65" cy="52" rx="52" ry="52" fill="#6e6e6e"/>
+ <ellipse cx="65" cy="52" rx="45" ry="45" fill="#a9a9a9"/>
+ <ellipse cx="65" cy="52" rx="37" ry="37" fill="#b8b8b8"/>
+ <g>
+ <rect x="58" y="25" width="14" height="27" fill="black"/>
+ <rect x="58" y="52" width="14" height="27" fill="black"/>
+ <rect x="39" y="45" width="27" height="14" fill="black"/>
+ <rect x="65" y="45" width="27" height="14" fill="black"/>
+ <polygon points="65,42 78,52 65,62 52,52" fill="grey" transform="rotate(45 65 52)"/>
+ </g>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="slot2">
+ <image><data><![CDATA[
+ <svg width="130" height="104" viewBox="0 0 130 104">
+ <rect x="0" y="10" width="130" height="80" rx="40" ry="40" fill="black"/>
+ <ellipse cx="65" cy="52" rx="52" ry="52" fill="#6e6e6e"/>
+ <ellipse cx="65" cy="52" rx="45" ry="45" fill="#a9a9a9"/>
+ <ellipse cx="65" cy="52" rx="37" ry="37" fill="#b8b8b8"/>
+ <g transform="rotate(15 65 52)">
+ <rect x="58" y="25" width="14" height="27" fill="black"/>
+ <rect x="58" y="52" width="14" height="27" fill="black"/>
+ <rect x="39" y="45" width="27" height="14" fill="black"/>
+ <rect x="65" y="45" width="27" height="14" fill="black"/>
+ <polygon points="65,42 78,52 65,62 52,52" fill="grey" transform="rotate(45 65 52)"/>
+ </g>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="slot3">
+ <image><data><![CDATA[
+ <svg width="130" height="104" viewBox="0 0 130 104">
+ <rect x="0" y="10" width="130" height="80" rx="40" ry="40" fill="black"/>
+ <ellipse cx="65" cy="52" rx="52" ry="52" fill="#6e6e6e"/>
+ <ellipse cx="65" cy="52" rx="45" ry="45" fill="#a9a9a9"/>
+ <ellipse cx="65" cy="52" rx="37" ry="37" fill="#b8b8b8"/>
+ <g transform="rotate(45 65 52)">
+ <rect x="58" y="25" width="14" height="27" fill="black"/>
+ <rect x="58" y="52" width="14" height="27" fill="black"/>
+ <rect x="39" y="45" width="27" height="14" fill="black"/>
+ <rect x="65" y="45" width="27" height="14" fill="black"/>
+ <polygon points="65,42 78,52 65,62 52,52" fill="grey" transform="rotate(45 65 52)"/>
+ </g>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <!-- Cursor Module -->
+ <element name="cursoroutline">
+ <image><data><![CDATA[
+ <svg width="115" height="85">
+ <rect x="0" y="0" width="115" height="85" rx="7" ry="7" fill="black" stroke="black" stroke-width=".6"/>
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="cursorup">
+ <image state="0"><data><![CDATA[
+ <svg width="40" height="30">
+ <path d="M0,0 H38 V2 L32,25 H6 L0,2 Z" fill="rgb(239,228,199)" stroke="rgb(239,228,199)" stroke-width=".2"/>
+ <line x1="0.5" y1="2" x2="37.5" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="5" y1="19" x2="33" y2="19" stroke="#c5ba9c" stroke-width="1"/>
+ <path d="M5,19 H33 L32,25 H6 Z" stroke="rgb(197,186,156)" fill="rgb(197,186,156)" stroke-width=".5"/>
+ <path d="M12,11 L18.5,7 L25,11" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ <image state="1"><data><![CDATA[
+ <svg width="40" height="30">
+ <path d="M0,0 H38 V2 L32,25 H6 L0,2 Z" fill="rgb(229,218,189)" stroke="rgb(229,218,189)" stroke-width=".2"/>
+ <line x1="0.5" y1="2" x2="37.5" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="5" y1="19" x2="33" y2="19" stroke="#c5ba9c" stroke-width="1"/>
+ <path d="M5,19 H33 L32,25 H6 Z" stroke="rgb(187,176,146)" fill="rgb(187,176,146)" stroke-width=".5"/>
+ <path d="M12,11 L18.5,7 L25,11" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="cursordown">
+ <image state="0"><data><![CDATA[
+ <svg width="40" height="30">
+ <path d="M6,0 H32 L38,23 V25 H0 Z" fill="rgb(239,228,199)" stroke="rgb(239,228,199)" stroke-width=".2"/>
+ <line x1="0.5" y1="23" x2="37.5" y2="23" stroke="#fffbea" stroke-width="1"/>
+ <path d="M5,6 H33 L32,0 H6 Z" stroke="rgb(197,186,156)" fill="rgb(197,186,156)" stroke-width=".5"/>
+ <path d="M12,14 L18.5,18 L25,14" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ <image state="1"><data><![CDATA[
+ <svg width="40" height="30">
+ <path d="M6,0 H32 L38,23 V25 H0 Z" fill="rgb(229,218,189)" stroke="rgb(229,218,189)" stroke-width=".2"/>
+ <line x1="0.5" y1="23" x2="37.5" y2="23" stroke="#fffbea" stroke-width="1"/>
+ <line x1="5" y1="6" x2="33" y2="6" stroke="#c5ba9c" stroke-width="1"/>
+ <path d="M5,6 H33 L32,0 H6 Z" stroke="rgb(187,176,146)" fill="rgb(187,176,146)" stroke-width=".5"/>
+ <path d="M12,14 L18.5,18 L25,14" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="cursorleft">
+ <image state="0"><data><![CDATA[
+ <svg width="25" height="55">
+ <path d="M3,0 H16 V2 L21,25 L16,48 V50 H3 A3,3 0 0,1 0,47 V3 A3,3 0 0,1 3,0 Z" fill="rgb(239,228,199)" stroke="rgb(239,228,199)" stroke-width=".2"/>
+ <line x1="2" y1="2" x2="15.5" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="2" y1="48" x2="15.5" y2="48" stroke="#fffbea" stroke-width="1"/>
+ <line x1="15.5" y1="2" x2="15.5" y2="48" stroke="#c5ba9c" stroke-width="1"/>
+ <path d="M15.5,2 V48 L20.5,25 Z" stroke="rgb(197,186,156)" fill="rgb(197,186,156)" stroke-width=".5"/>
+ <path d="M10,19 L6,25 L10,31" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ <image state="1"><data><![CDATA[
+ <svg width="25" height="55">
+ <path d="M3,0 H16 V2 L21,25 L16,48 V50 H3 A3,3 0 0,1 0,47 V3 A3,3 0 0,1 3,0 Z" fill="rgb(229,218,189)" stroke="rgb(229,218,189)" stroke-width=".2"/>
+ <line x1="2" y1="2" x2="15.5" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="2" y1="48" x2="15.5" y2="48" stroke="#fffbea" stroke-width="1"/>
+ <line x1="15.5" y1="2" x2="15.5" y2="48" stroke="#c5ba9c" stroke-width="1"/>
+ <path d="M15.5,2 V48 L20,25 Z" stroke="rgb(187,176,146)" fill="rgb(187,176,146)" stroke-width=".5"/>
+ <path d="M10,19 L6,25 L10,31" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ </element>
+ <element name="cursorright">
+ <image state="0"><data><![CDATA[
+ <svg width="25" height="55">
+ <path d="M6,0 H19 A3,3 0 0,1 22,3 V47 A3,3 0 0,1 19,50 H6 V48 L1,25 L6,2 Z" fill="rgb(239,228,199)" stroke="rgb(239,228,199)" stroke-width=".2"/>
+ <line x1="6.5" y1="2" x2="20" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="6.5" y1="48" x2="20" y2="48" stroke="#fffbea" stroke-width="1"/>
+ <path d="M6.5,2 V48 L1,25 Z" stroke="rgb(197,186,156)" fill="rgb(197,186,156)" stroke-width=".5"/>
+ <path d="M12,19 L16,25 L12,31" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ <image state="1"><data><![CDATA[
+ <svg width="25" height="55">
+ <path d="M6,0 H19 A3,3 0 0,1 22,3 V47 A3,3 0 0,1 19,50 H6 V48 L1,25 L6,2 Z" fill="rgb(229,218,189)" stroke="rgb(229,218,189)" stroke-width=".2"/>
+ <line x1="6.5" y1="2" x2="20" y2="2" stroke="#fffbea" stroke-width="1"/>
+ <line x1="6.5" y1="48" x2="20" y2="48" stroke="#fffbea" stroke-width="1"/>
+ <path d="M6.5,2 V48 L1,25 Z" stroke="rgb(187,176,146)" fill="rgb(187,176,146)" stroke-width=".5"/>
+ <path d="M12,19 L16,25 L12,31" stroke="rgb(0,0,0)" stroke-width="1" fill="none"/>
+ </svg>
+ ]]></data></image>
+ </element>
+ <group name="cursormodule">
+ <bounds x="0" y="0" width="530" height="410" />
+ <element ref="cursoroutline"><bounds x="0" y="0" width="535" height="392" /></element>
+ <element ref="cursorleft" inputtag="C7" inputmask="0x10"><bounds x="13" y="15" width="190" height="400" /></element>
+ <element ref="cursorup" inputtag="C2" inputmask="0x10"><bounds x="147.5" y="15" width="251" height="211" /></element>
+ <element ref="cursordown" inputtag="C6" inputmask="0x10"><bounds x="147.5" y="200" width="251" height="211" /></element>
+ <element ref="cursorright" inputtag="C1" inputmask="0x10"><bounds x="352" y="15" width="190" height="400" /></element>
+ </group>
+
+ <!-- Buttons -->
+ <element name="rectbutton-white" defstate="0">
+ <image state="0"><data><![CDATA[
+ <svg width="145" height="76" viewBox="-1 -1 146 77">
+ <rect x="0" y="0" width="145" height="76" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="60" rx="8" ry="8" fill="rgb(203,203,203)" stroke="rgb(203,203,203)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ <image state="1"><data><![CDATA[
+ <svg width="145" height="76" viewBox="-1 -1 146 77">
+ <rect x="0" y="0" width="145" height="76" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="60" rx="8" ry="8" fill="rgb(193,193,193)" stroke="rgb(193,193,193)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="rectbutton-blue" defstate="0">
+ <image state="0"><data><![CDATA[
+ <svg width="145" height="76" viewBox="-1 -1 146 77">
+ <rect x="0" y="0" width="145" height="76" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="60" rx="8" ry="8" fill="rgb(135,165,193)" stroke="rgb(135,165,193)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ <image state="1"><data><![CDATA[
+ <svg width="145" height="76" viewBox="-1 -1 146 77">
+ <rect x="0" y="0" width="145" height="76" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="60" rx="8" ry="8" fill="rgb(125,155,183)" stroke="rgb(125,155,183)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="squarebutton-white" defstate="0">
+ <image state="0"><data><![CDATA[
+ <svg width="145" height="107">
+ <rect x="0" y="0" width="145" height="107" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="91" rx="8" ry="8" fill="rgb(239,228,199)" stroke="rgb(239,228,199)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ <image state="1"><data><![CDATA[
+ <svg width="145" height="107">
+ <rect x="0" y="0" width="145" height="107" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="91" rx="8" ry="8" fill="rgb(229,218,189)" stroke="rgb(239,228,199)" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="squarebutton-grey" defstate="0">
+ <image state="0"><data><![CDATA[
+ <svg width="145" height="107">
+ <rect x="0" y="0" width="145" height="107" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="91" rx="8" ry="8" fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="0.6" fill-opacity="1"/>
+ </svg>
+ ]]></data>
+ </image>
+ <image state="1"><data><![CDATA[
+ <svg width="145" height="107">
+ <rect x="0" y="0" width="145" height="107" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ <rect x="8" y="8" width="129" height="91" rx="8" ry="8" fill="rgb(245,245,245)" stroke="rgb(255,255,255)" stroke-width="0.6" fill-opacity="1"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <!-- Knob Elements -->
+ <element name="knob"><disk></disk></element>
+ <element name="knob-position"><rect></rect></element>
+ <element name="rect"><rect></rect></element>
+ <element name="knobdots">
+ <image><data><![CDATA[
+ <svg width="500" height="500" viewBox="0 0 500 500">
+ <g fill="black" stroke="black" stroke-width="5" transform="translate(250, 250)">
+ <circle transform="rotate(0)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(30)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(60)" cx="200" cy="0" r="11"/>
+ <circle transform="rotate(120)" cx="200" cy="0" r="11"/>
+ <circle transform="rotate(150)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(180)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(210)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(240)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(270)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(300)" cx="200" cy="0" r="6"/>
+ <circle transform="rotate(330)" cx="200" cy="0" r="6"/>
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+ <group name="volumeknob">
+ <bounds x="0" y="0" width="740" height="740" />
+ <element ref="text-mainvolume"><bounds x="61" y="226" width="350" height="53" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knobdots"><bounds x="20" y="265" width="435" height="420" /></element>
+ <element ref="knob"><bounds x="92" y="335" width="290" height="290" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knob"><bounds x="107" y="350" width="260" height="260" /><color red="0.7" green="0.7" blue="0.7" /></element>
+ <element ref="knob"><bounds x="137" y="382" width="196" height="196" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob"><bounds x="147" y="388" width="180" height="180" /><color red="0.88" green="0.9" blue="0.778" /></element>
+ <element ref="knob-position"><bounds x="212" y="310" width="40" height="180" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob-position"><bounds x="219" y="315" width="30" height="190" /><color red="0.78" green="0.8" blue="0.678" /></element>
+ </group>
+ <group name="recordknob">
+ <bounds x="0" y="0" width="740" height="740" />
+ <element ref="text-reclevel"><bounds x="105" y="226" width="260" height="53" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knobdots"><bounds x="20" y="265" width="435" height="420" /></element>
+ <element ref="knob"><bounds x="92" y="335" width="290" height="290" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knob"><bounds x="107" y="350" width="260" height="260" /><color red="0.7" green="0.7" blue="0.7" /></element>
+ <element ref="knob"><bounds x="137" y="382" width="196" height="196" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob"><bounds x="147" y="388" width="180" height="180" /><color red="0.764" green="0.376" blue="0.302" /></element>
+ <element ref="knob-position"><bounds x="216" y="310" width="40" height="180" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob-position"><bounds x="219" y="315" width="30" height="190" /><color red="0.664" green="0.276" blue="0.202" /></element>
+ </group>
+ <group name="contrastknob">
+ <bounds x="0" y="0" width="276" height="276" />
+ <element ref="knobdots"><bounds x="0" y="0" width="276" height="276" /></element>
+ <element ref="knob"><bounds x="50" y="50" width="176" height="176" /><color red="0.0" green="0.0" blue="0.0" /></element>
+ <element ref="knob"><bounds x="59" y="59" width="160" height="160" /><color red="0.88" green="0.9" blue="0.778" /></element>
+ <element ref="knob-position"><bounds x="62" y="118" width="155" height="40" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob-position"><bounds x="56" y="123" width="152" height="30" /><color red="0.78" green="0.8" blue="0.678" /></element>
+ </group>
+
+ <!-- Bezel / Panel Elements -->
+ <element name="panel"><rect></rect></element>
+ <element name="fkeyboxgrey"><rect><color red="0.3" green="0.3" blue="0.3" /></rect></element>
+ <element name="fkeyboxblack"><rect><color red="0" green="0" blue="0" /></rect></element>
+ <element name="bezel">
+ <image><data><![CDATA[
+ <svg width="1685" height="516">
+ <rect x="0" y="0" width="1685" height="516" rx="45" ry="45" fill="black" stroke="none" stroke-width="2"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="jack">
+ <disk><bounds x="0" y="0" width="140" height="140" /><color red="0" green="0" blue="0" /></disk>
+ <disk><bounds x="15" y="15" width="110" height="110" /><color red="0.776" green="0.776" blue="0.674" /></disk>
+ <disk><bounds x="23" y="23" width="94" height="94" /><color red="0.984" green="0.980" blue="0.964" /></disk>
+ <disk><bounds x="27.5" y="27.5" width="85" height="85" /><color red="0" green="0" blue="0" /></disk>
+ </element>
+ <element name="console">
+ <image><data><![CDATA[
+ <svg width="3465" height="1340" viewBox="0 0 3565 1440">
+ <rect x="40" y="0" width="3465" height="1340" rx="40" ry="40" fill="#2e331f" stroke="#2e331f" stroke-width="4" />
+ <path d="M70,650 L30,1270 H3510 L3470,650 Z" stroke="#888f87" fill="#dfdfdf" stroke-width="2"/>
+ <path d="M30,1270 L70,1320 H3470 L3510,1270 Z" stroke="none" fill="#49534a" stroke-width="1"/>
+ <path d="M80,3 L80,105 H3460 L3460,3 Z" stroke="none" fill="#c8cabc" stroke-width="1"/>
+ <line x1="80" y1="17" x2="3460" y2="17" stroke="#787f77" stroke-width="27"/>
+ <path d="M80,105 V550 L70,650 H3470 L3460,550 V105 Z" stroke="none" fill="#edece8" stroke-width="1"/>
+ <line x1="70" y1="647" x2="3470" y2="647" stroke="#888f87" stroke-width="5"/>
+ <line x1="82" y1="547" x2="3458" y2="547" stroke="#c8cfc7" stroke-width="5"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <!-- Screen Assembly -->
+ <group name="group-screen">
+ <bounds x="0" y="0" width="1685" height="516" />
+ <element ref="bezel"><bounds x="0" y="0" width="1685" height="516" /></element>
+ <screen index="0"><bounds x="145" y="64" width="1390" height="400" /></screen>
+ <repeat count="8">
+ <param name="gtext_x" start="207" increment="173.5"/>
+ <param name="gnum" start="1" increment="1"/>
+ <repeat count="1">
+ <element ref="text-f~gnum~">
+ <bounds x="~gtext_x~" y ="465" width="45" height="34"/><color red="1" green="1" blue="1" /></element>
+ </repeat>
+ </repeat>
+ </group>
+
+ <!-- Encoder Wheel -->
+ <element name="dataentry_bottom"><disk><color red="0" green="0" blue="0"/></disk></element>
+ <element name="dataentry_edge"><disk><color red="0.733" green="0.752" blue="0.780"/></disk></element>
+ <element name="dataentry_top"><disk><color red="0.803" green="0.831" blue="0.866"/></disk></element>
+ <element name="dataentry_outer"><disk><color red="0.952" green="0.952" blue="0.976"/></disk></element>
+ <element name="dataentry_knob">
+ <simplecounter maxstate="100" digits="3"><color red="0.505" green="0.458" blue="0.337"/></simplecounter>
+ </element>
+ <group name="select_data_knob">
+ <bounds x="0" y="0" width="440" height="540" />
+ <element ref="text-data"><bounds x="160" y="24" width="110" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="dataentry_bottom"><bounds x="0" y="100" width="440" height="440"/></element>
+ <element ref="dataentry_edge"><bounds x="15" y="115" width="410" height="410"/></element>
+ <element ref="dataentry_outer"><bounds x="40" y="140" width="360" height="360"/></element>
+ <element ref="dataentry_top"><bounds x="50" y="148" width="342" height="340"/></element>
+ <element ref="dataentry_knob" id="dataentry_knob" inputtag="DATAENTRY" inputmask="0xffff" inputraw="yes">
+ <bounds x="150" y="290" width="130" height="60"/>
+ </element>
+ </group>
+
+ <!-- Show Everything -->
+ <view name="Default Layout">
+
+ <!-- Screen and Panel -->
+ <element ref="panel"><bounds x="0" y="0" width="6000" height="1650" /><color red="0.835" green="0.839" blue="0.854" /></element>
+ <element ref="console"><bounds x="1790" y="200" width="3506" height="1435" /></element>
+ <group ref="group-screen"><bounds x="1950" y="275" width="1685" height="516" /></group>
+ <element ref="slot1"><bounds x="35" y="412" width="130" height="104" /></element>
+ <element ref="slot2"><bounds x="35" y="1127" width="130" height="104" /></element>
+ <element ref="slot2"><bounds x="5830" y="412" width="130" height="104" /></element>
+ <element ref="slot3"><bounds x="5830" y="1127" width="130" height="104" /></element>
+ <element ref="vline"><bounds x="300" y="0" width="10" height="1647" /></element>
+ <element ref="vline"><bounds x="5690" y="0" width="10" height="1647" /></element>
+ <element ref="jack"><bounds x="5335" y="930" width="150" height="150" /></element>
+ <element ref="text-headphone"><bounds x="5276" y="843" width="292" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="jack"><bounds x="5335" y="1250" width="150" height="150" /></element>
+ <element ref="text-footsw"><bounds x="5308" y="1153" width="205" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-akainovo"><bounds x="465" y="88" width="305" height="80" /></element>
+ <element ref="text-professional"><bounds x="805" y="125" width="220" height="50" /><color red="0.627" green="0.133" blue="0.172" /></element>
+ <element ref="text-digitalsampler"><bounds x="4545" y="128" width="670" height="51.50" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-s3000i"><bounds x="860" y="85" width="940" height="100" /></element>
+ <element ref="text-screenfunction"><bounds x="2603" y="905" width="377" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-highspeed"><bounds x="909" y="1180" width="245" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-digital"><bounds x="909" y="1220" width="153" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-sound"><bounds x="909" y="1260" width="140" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-processor"><bounds x="909" y="1300" width="250" height="45" /><color red="0" green="0" blue="0" /></element>
+
+ <!-- Knobs -->
+ <group ref="volumeknob"><bounds x="4670" y="135" width="630" height="630" /></group>
+ <element ref="text-min"><bounds x="4733" y="680" width="70" height="33" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-max"><bounds x="4952" y="680" width="70" height="33" /><color red="0" green="0" blue="0" /></element>
+ <group ref="recordknob"><bounds x="4260" y="135" width="630" height="630" /></group>
+ <element ref="text-min"><bounds x="4323" y="680" width="70" height="33" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-max"><bounds x="4542" y="680" width="70" height="33" /><color red="0" green="0" blue="0" /></element>
+ <group ref="select_data_knob" clickthrough="no"><bounds x="3733" y="235" width="430" height="530" /></group>
+ <group ref="contrastknob"><bounds x="522" y="430" width="202" height="202" /></group>
+ <element ref="text-contrast1"><bounds x="535" y="342" width="172" height="45" /><color red="0" green="0.0" blue="0.0" /></element>
+ <element ref="text-contrast2"><bounds x="505" y="382" width="235" height="45" /><color red="0" green="0.0" blue="0.0" /></element>
+
+ <!-- Floppy Drive -->
+ <element ref="floppyblack"><bounds x="430" y="222" width="1300" height="1388" /></element>
+ <element ref="fddled"><bounds x="1375" y="500" width="25" height="70" /><animate name="drive_led" /><color state="0" red="0.437" green="0.249" blue="0" /><color state="1" red="1" green="0.674" blue="0.219" /></element>
+
+ <!-- Power Switch -->
+ <element ref="powerswitchblack"><bounds x="480" y="1140" width="280" height="335" /></element>
+ <element ref="text-power"><bounds x="539" y="1025" width="162" height="50" /><color red="0.627" green="0.133" blue="0.172" /></element>
+ <element ref="text-on"><bounds x="595" y="1085" width="50" height="40" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-off"><bounds x="585" y="1490" width="70" height="40" /><color red="0" green="0" blue="0" /></element>
+
+ <!-- Buttons -->
+ <!-- Mark -->
+ <element ref="rectbutton-white" inputtag="C2" inputmask="0x04"><bounds x="4955" y="918" width="145" height="76" /></element>
+ <element ref="text-mark"><bounds x="4947" y="869" width="168" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Jump -->
+ <element ref="rectbutton-white" inputtag="C2" inputmask="0x08"><bounds x="4965" y="1055" width="145" height="76" /></element>
+ <element ref="text-jump"><bounds x="4970" y="1002" width="125" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-dot"><bounds x="5085" y="968" width="32" height="89" /><color red="0" green="0" blue="0" /></element>
+ <!-- Name -->
+ <element ref="rectbutton-white" inputtag="C6" inputmask="0x04"><bounds x="4975" y="1190" width="145" height="76" /></element>
+ <element ref="text-name"><bounds x="4993" y="1140" width="115" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Play -->
+ <element ref="rectbutton-white" inputtag="C6" inputmask="0x08"><bounds x="4980" y="1330" width="145" height="76" /></element>
+ <element ref="text-play"><bounds x="4950" y="1277" width="205" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- F1 -->
+ <element ref="squarebutton-white" inputtag="C7" inputmask="0x02"><bounds x="1958" y="1035" width="145" height="107" /></element>
+ <!-- F2 -->
+ <element ref="squarebutton-white" inputtag="C6" inputmask="0x02"><bounds x="2176" y="1035" width="145" height="107" /></element>
+ <!-- F3 -->
+ <element ref="squarebutton-white" inputtag="C5" inputmask="0x02"><bounds x="2394" y="1035" width="145" height="107" /></element>
+ <!-- F4 -->
+ <element ref="squarebutton-white" inputtag="C4" inputmask="0x02"><bounds x="2612" y="1035" width="145" height="107" /></element>
+ <!-- F5 -->
+ <element ref="squarebutton-white" inputtag="C3" inputmask="0x02"><bounds x="2830" y="1035" width="145" height="107" /></element>
+ <!-- F6 -->
+ <element ref="squarebutton-white" inputtag="C2" inputmask="0x02"><bounds x="3048" y="1035" width="145" height="107" /></element>
+ <!-- F7 -->
+ <element ref="squarebutton-white" inputtag="C1" inputmask="0x02"><bounds x="3266" y="1035" width="145" height="107" /></element>
+ <!-- F8 -->
+ <element ref="squarebutton-white" inputtag="C0" inputmask="0x02"><bounds x="3484" y="1035" width="145" height="107" /></element>
+ <!-- F-Key Box+Text Labels -->
+ <repeat count="8">
+ <param name="box_x" start="1966" increment="217"/>
+ <param name="text_x" start="1986" increment="216.5"/>
+ <param name="num" start="1" increment="1"/>
+ <repeat count="1">
+ <element ref="fkeyboxblack">
+ <bounds x="~box_x~" y ="968" width="138" height="40"/></element>
+ <element ref="text-lf~num~">
+ <bounds x="~text_x~" y ="965" width="100" height="44"/></element>
+ </repeat>
+ </repeat>
+ <!-- Select Program -->
+ <element ref="squarebutton-grey" inputtag="C7" inputmask="0x01"><bounds x="1948" y="1240" width="145" height="107" /><animate name="led0" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-select"><bounds x="1950" y="1152" width="153" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-progi"><bounds x="1946" y="1192" width="150" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Edit Sample -->
+ <element ref="squarebutton-grey" inputtag="C6" inputmask="0x01"><bounds x="2171" y="1240" width="145" height="107" /><animate name="led1" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-edit"><bounds x="2198" y="1152" width="93" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-samplej"><bounds x="2153" y="1192" width="198" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Edit Program -->
+ <element ref="squarebutton-grey" inputtag="C5" inputmask="0x01"><bounds x="2394" y="1240" width="145" height="107" /><animate name="led2" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-edit"><bounds x="2422" y="1152" width="93" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-progk"><bounds x="2394" y="1192" width="152" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Midi -->
+ <element ref="squarebutton-grey" inputtag="C4" inputmask="0x01"><bounds x="2612" y="1240" width="145" height="107" /><animate name="led3" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-midil"><bounds x="2625" y="1177" width="125" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Disk -->
+ <element ref="squarebutton-grey" inputtag="C3" inputmask="0x01"><bounds x="2830" y="1240" width="145" height="107" /><animate name="led4" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-diskm"><bounds x="2831" y="1177" width="145" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Tune Level -->
+ <element ref="squarebutton-grey" inputtag="C2" inputmask="0x01"><bounds x="3048" y="1240" width="145" height="107" /><animate name="led5" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-tune"><bounds x="3068" y="1152" width="103" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="text-leveln"><bounds x="3038" y="1192" width="167" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Utility -->
+ <element ref="squarebutton-grey" inputtag="C1" inputmask="0x01"><bounds x="3266" y="1240" width="145" height="107" /><animate name="led6" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-utilityo"><bounds x="3249" y="1177" width="185" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Help -->
+ <element ref="squarebutton-grey" inputtag="C0" inputmask="0x01"><bounds x="3484" y="1240" width="145" height="107" /><animate name="led7" /><color state="0" red="0.862" green="0.862" blue="0.862" /><color state="1" red="0.980" green="0.345" blue="0.294" /></element>
+ <element ref="text-helpp"><bounds x="3486" y="1177" width="142" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 7/T -->
+ <element ref="rectbutton-blue" inputtag="C5" inputmask="0x04"><bounds x="4297" y="918" width="145" height="76" /></element>
+ <element ref="text-7q"><bounds x="4330" y="869" width="80" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 8/U -->
+ <element ref="rectbutton-blue" inputtag="C4" inputmask="0x04"><bounds x="4517" y="918" width="145" height="76" /></element>
+ <element ref="text-8r"><bounds x="4550" y="869" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 9/V -->
+ <element ref="rectbutton-blue" inputtag="C3" inputmask="0x04"><bounds x="4728" y="918" width="145" height="76" /></element>
+ <element ref="text-9s"><bounds x="4763" y="869" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 4/T -->
+ <element ref="rectbutton-blue" inputtag="C5" inputmask="0x08"><bounds x="4302" y="1055" width="145" height="76" /></element>
+ <element ref="text-4t"><bounds x="4333" y="1002" width="80" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 5/U -->
+ <element ref="rectbutton-blue" inputtag="C4" inputmask="0x08"><bounds x="4520" y="1055" width="145" height="76" /></element>
+ <element ref="text-5u"><bounds x="4553" y="1002" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 6/V -->
+ <element ref="rectbutton-blue" inputtag="C3" inputmask="0x08"><bounds x="4733" y="1055" width="145" height="76" /></element>
+ <element ref="text-6v"><bounds x="4765" y="1002" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 1/W -->
+ <element ref="rectbutton-blue" inputtag="C0" inputmask="0x04"><bounds x="4307" y="1190" width="145" height="76" /></element>
+ <element ref="text-1w"><bounds x="4340" y="1140" width="80" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 2/X -->
+ <element ref="rectbutton-blue" inputtag="C1" inputmask="0x04"><bounds x="4525" y="1190" width="145" height="76" /></element>
+ <element ref="text-2x"><bounds x="4558" y="1140" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 3/Y -->
+ <element ref="rectbutton-blue" inputtag="C7" inputmask="0x04"><bounds x="4738" y="1190" width="145" height="76" /></element>
+ <element ref="text-3y"><bounds x="4772" y="1140" width="74" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- 0/Z -->
+ <element ref="rectbutton-blue" inputtag="C0" inputmask="0x08"><bounds x="4307" y="1330" width="145" height="76" /></element>
+ <element ref="text-0z"><bounds x="4340" y="1277" width="80" height="45" /><color red="0" green="0" blue="0" /></element>
+ <!-- Minus -->
+ <element ref="rectbutton-blue" inputtag="C7" inputmask="0x08"><bounds x="4530" y="1330" width="145" height="76" /></element>
+ <element ref="text-minus"><bounds x="4535" y="1286" width="195" height="50" /></element>
+ <!-- Plus -->
+ <element ref="rectbutton-blue" inputtag="C1" inputmask="0x08"><bounds x="4748" y="1330" width="145" height="76" /></element>
+ <element ref="text-plus"><bounds x="4750" y="1286" width="195" height="50" /></element>
+
+ <!-- Cursor Module -->
+ <element ref="text-cursor"><bounds x="3873" y="967" width="172" height="45" /><color red="0" green="0" blue="0" /></element>
+ <group ref="cursormodule"><bounds x="3750" y="1030" width="432" height="340" /></group>
+
+ </view>
+
+ <script><![CDATA[
+ file:set_resolve_tags_callback(
+ function()
+ local view = file.views["Default Layout"]
+ add_simplecounter_knob(view, "dataentry_knob", "DATAENTRY", 1.5)
+ end)
+
+
+ -----------------------------------------------------------------------
+ -- Slider and knob library starts.
+ -- Can be copied as-is to other layouts.
+ -----------------------------------------------------------------------
+ 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_vertical_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_simplecounter_knob(view, clickarea_id, port_name, scale)
+ table.insert(widgets, {
+ clickarea = get_layout_item(view, clickarea_id),
+ field = get_port_field(port_name),
+ is_knob = true,
+ scale = scale })
+ 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
+ if field == nil then
+ emu.print_error("Port: '" .. port_name .."' does not seem to be an IPT_ADJUSTER.")
+ return nil
+ end
+ return field
+ 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
+ pointers[id] = nil
+ 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_y = y,
+ start_value = widgets[i].field.user_value }
+ 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 Y
+ -- position. It is assumed the attached IO field is an IPT_ADJUSTER.
+
+ 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
+ local step_y = value_range / (widget.scale * widget.clickarea.bounds.height)
+ new_value = pointer.start_value + (pointer.start_y - y) * step_y
+ 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
+ widget.field.user_value = new_value
+ end
+
+ local function pointer_left(type, id, dev, x, y, up, cnt)
+ pointers[id] = nil
+ end
+
+ local function pointer_aborted(type, id, dev, x, y, up, cnt)
+ pointers[id] = nil
+ end
+
+ local function forget_pointers()
+ 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>