diff options
-rw-r--r-- | scripts/src/sound.lua | 12 | ||||
-rw-r--r-- | src/devices/sound/upd933.cpp | 531 | ||||
-rw-r--r-- | src/devices/sound/upd933.h | 96 | ||||
-rw-r--r-- | src/mame/casio/cz101.cpp | 403 | ||||
-rw-r--r-- | src/mame/casio/ra3.cpp | 79 | ||||
-rw-r--r-- | src/mame/casio/ra3.h | 44 | ||||
-rw-r--r-- | src/mame/layout/cz101.lay | 824 |
7 files changed, 1713 insertions, 276 deletions
diff --git a/scripts/src/sound.lua b/scripts/src/sound.lua index 4959be4e3a1..7cb136380c7 100644 --- a/scripts/src/sound.lua +++ b/scripts/src/sound.lua @@ -1466,6 +1466,18 @@ if (SOUNDS["LC82310"]~=null) then end --------------------------------------------------- +-- NEC uPD933 +--@src/devices/sound/upd933.h,SOUNDS["UPD933"] = true +--------------------------------------------------- + +if (SOUNDS["UPD933"]~=null) then + files { + MAME_DIR .. "src/devices/sound/upd933.cpp", + MAME_DIR .. "src/devices/sound/upd933.h", + } +end + +--------------------------------------------------- -- NEC uPD934G --@src/devices/sound/upd934g.h,SOUNDS["UPD934G"] = true --------------------------------------------------- diff --git a/src/devices/sound/upd933.cpp b/src/devices/sound/upd933.cpp new file mode 100644 index 00000000000..763caf45a4d --- /dev/null +++ b/src/devices/sound/upd933.cpp @@ -0,0 +1,531 @@ +// license:BSD-3-Clause +// copyright-holders:Devin Acker + +/*************************************************************************** + NEC/Casio uPD933 "Phase Distortion" synthesis chip +***************************************************************************/ + +#include "emu.h" +#include "upd933.h" + +#include <algorithm> +#include <cmath> + +DEFINE_DEVICE_TYPE(UPD933, upd933_device, "upd933", "NEC uPD933") + +upd933_device::upd933_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, UPD933, tag, owner, clock) + , device_sound_interface(mconfig, *this) + , m_irq_cb(*this) +{ +} + +/**************************************************************************/ +void upd933_device::device_start() +{ + m_stream = stream_alloc(0, 1, clock() / CLOCKS_PER_SAMPLE); + + for (int i = 0; i < 0x800; i++) + m_cosine[i] = 0xfff * (1 - cos(2.0 * M_PI * i / 0x7ff)) / 2; + + for (int i = 0; i < 0x80; i++) + { + // A4 is note 62, 442 Hz + const double freq = 442.0 * pow(2, (i - 62) / 12.0); + m_pitch[i] = (1 << PITCH_SHIFT) * (freq * 0x800 / 40000); + } + + for (int i = 0; i < 0x200; i++) + m_pitch_fine[i] = (1 << PITCH_FINE_SHIFT) * (pow(2, (double)i / (12.0 * 0x200)) - 1); + + // logarithmic volume curve, also scales 12-bit waveform to 13-bit range + // (also allows pitch modulation to cover the same spectrum with no extra scaling) + for (int i = 1; i < 0x200; i++) + m_volume[i] = pow(2 << VOLUME_SHIFT, (double)i / 0x1ff); + m_volume[0] = 0; + + m_cs = 1; + + save_item(NAME(m_irq_state)); + save_item(NAME(m_cs)); + save_item(NAME(m_sound_data)); + save_item(NAME(m_sound_data_pos)); + save_item(NAME(m_sound_regs)); + save_item(NAME(m_sample_count)); + save_item(NAME(m_last_sample)); + save_item(NAME(m_irq_data)); + + save_item(STRUCT_MEMBER(m_voice, m_wave)); + save_item(STRUCT_MEMBER(m_voice, m_window)); + save_item(STRUCT_MEMBER(m_voice, m_ring_mod)); + save_item(STRUCT_MEMBER(m_voice, m_pitch_mod)); + save_item(STRUCT_MEMBER(m_voice, m_mute_other)); + save_item(STRUCT_MEMBER(m_voice, m_pitch)); + save_item(STRUCT_MEMBER(m_voice, m_position)); + save_item(STRUCT_MEMBER(m_voice, m_pitch_step)); + save_item(STRUCT_MEMBER(m_voice, m_dcw_limit)); + save_item(STRUCT_MEMBER(m_voice, m_pm_level)); + + save_item(STRUCT_MEMBER(m_dca, m_direction)); + save_item(STRUCT_MEMBER(m_dca, m_sustain)); + save_item(STRUCT_MEMBER(m_dca, m_irq)); + save_item(STRUCT_MEMBER(m_dca, m_rate)); + save_item(STRUCT_MEMBER(m_dca, m_target)); + save_item(STRUCT_MEMBER(m_dca, m_current)); + + save_item(STRUCT_MEMBER(m_dcw, m_direction)); + save_item(STRUCT_MEMBER(m_dcw, m_sustain)); + save_item(STRUCT_MEMBER(m_dcw, m_irq)); + save_item(STRUCT_MEMBER(m_dcw, m_rate)); + save_item(STRUCT_MEMBER(m_dcw, m_target)); + save_item(STRUCT_MEMBER(m_dcw, m_current)); + + save_item(STRUCT_MEMBER(m_dco, m_direction)); + save_item(STRUCT_MEMBER(m_dco, m_sustain)); + save_item(STRUCT_MEMBER(m_dco, m_irq)); + save_item(STRUCT_MEMBER(m_dco, m_rate)); + save_item(STRUCT_MEMBER(m_dco, m_target)); + save_item(STRUCT_MEMBER(m_dco, m_current)); +} + +/**************************************************************************/ +void upd933_device::device_reset() +{ + m_irq_state = 0; + + m_sound_data[0] = m_sound_data[1] = 0; + m_sound_data_pos = 0; + std::fill(m_sound_regs.begin(), m_sound_regs.end(), 0); + + std::fill(m_voice.begin(), m_voice.end(), voice_t()); + std::fill(m_dca.begin(), m_dca.end(), env_t()); + std::fill(m_dco.begin(), m_dco.end(), env_t()); + std::fill(m_dcw.begin(), m_dcw.end(), env_t()); + + m_sample_count = 0; + m_last_sample = 0; + m_irq_data = 0; +} + +/**************************************************************************/ +void upd933_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock() / CLOCKS_PER_SAMPLE); +} + +/**************************************************************************/ +void upd933_device::cs_w(int state) +{ + m_stream->update(); + + if (!m_cs && state) + check_irq(); + m_cs = state; +} + +/**************************************************************************/ +void upd933_device::check_irq() +{ + for (int i = 0; i < 8; i++) + { + if (m_dca[i].m_irq) + { + m_irq_data = 1 | (i << 1); + break; + } + if (m_dcw[i].m_irq) + { + m_irq_data = 2 | (i << 2); + break; + } + if (m_dco[i].m_irq) + { + m_irq_data = 4 | (i << 3); + break; + } + } + + if (m_irq_data) + m_irq_cb(m_irq_state = 1); +} + +/**************************************************************************/ +u8 upd933_device::read() +{ + if (!machine().side_effects_disabled()) + m_stream->update(); + + return m_cs ? 0xff : m_irq_data; +} + +/**************************************************************************/ +void upd933_device::write(u8 data) +{ + if (m_cs) return; + + if (m_sound_data_pos >= 2) + { + m_stream->update(); + + m_irq_data = 0; + m_irq_cb(m_irq_state = 0); + + const u8 reg = m_sound_data[0]; + const u16 value = m_sound_regs[reg] = (m_sound_data[1] << 8) | data; + + // the low 3 bits of the register number determine which voice is controlled by per-voice registers... + const int vnum = reg & 7; + voice_t &voice = m_voice[vnum]; + // ...except for registers 68-6f, which control waveform for voice 'n', but modulation for voice 'n-2' + // (even though those two voices don't actually modulate each other...) + voice_t &mod_voice = m_voice[(vnum + 6) & 7]; + + m_sound_data_pos = 0; + switch (reg >> 3) + { + case 0x0: // 00-07: DCA step (volume envelope) + /* + msb lsb + n------- - direction (0 = up, 1 = down) + -nnnnnnn - rate + n------- - sustain flag + -nnnnnnn - level + */ + { + env_t &dca = m_dca[vnum]; + dca.m_direction = BIT(value, 15); + dca.m_rate = env_rate(BIT(value, 8, 7)); + dca.m_sustain = BIT(value, 7); + dca.m_target = BIT(value, 0, 7) << (ENV_DCA_SHIFT + 2); + dca.m_irq = false; + } + break; + + case 0x2: // 10-17: DCO step (pitch envelope) + /* + msb lsb + n------- - direction (0 = up, 1 = down) + -nnnnnnn - rate + n------- - sustain flag + -n------ - level units (1 = 2-semitone intervals, 0 = 6.25-cent intervals) + --nnnnnn - level + */ + { + env_t &dco = m_dco[vnum]; + dco.m_direction = BIT(value, 15); + dco.m_rate = env_rate(BIT(value, 8, 7)); + dco.m_sustain = BIT(value, 7); + dco.m_target = BIT(value, 0, 6) << (ENV_DCO_SHIFT + 5); + if (BIT(value, 6)) + dco.m_target <<= 5; + dco.m_irq = false; + } + break; + + case 0x4: // 20-27: DCW step (waveform envelope) + // same bits as DCA step + { + env_t &dcw = m_dcw[vnum]; + dcw.m_direction = BIT(value, 15); + dcw.m_rate = env_rate(BIT(value, 8, 7)); + dcw.m_sustain = BIT(value, 7); + dcw.m_target = BIT(value, 0, 7) << (ENV_DCW_SHIFT + 3); + dcw.m_irq = false; + } + break; + + case 0xc: // 60-67: pitch (in semitones, as 7.9 fixed point) + voice.m_pitch = value; + update_pitch_step(vnum); + break; + + case 0xd: // 68-6f: waveform + /* + msb lsb + nnn----- - first waveform + ---nnn-- - second waveform + ------n- - enable second + -------n nn------ - window function + --n----- - ring modulation enable + ---n---- - pitch modulation enable + ----n--- - pitch modulation source (0 = other voice, 1 = noise) + -----n-- - output (0 = normal, 1 = mute previous voice) + */ + voice.m_wave[0] = BIT(value, 13, 3); + if (BIT(value, 9)) + voice.m_wave[1] = BIT(value, 10, 3); + else + voice.m_wave[1] = voice.m_wave[0]; + voice.m_window = BIT(value, 6, 3); + // see earlier comment - these bits actually control a different voice + mod_voice.m_ring_mod = BIT(value, 5); + mod_voice.m_pitch_mod = BIT(value, 3, 2); + mod_voice.m_mute_other = BIT(value, 2); + break; + + case 0x13: // 98-9f + // unknown, but cz101 sets these to zero when starting a note, probably to reset the oscillator + voice.m_position = value << PITCH_SHIFT; + break; + + default: + logerror("%s: unknown sound reg write: %02x %04x\n", + machine().describe_context(), reg, value); + break; + } + } + else + { + m_sound_data[m_sound_data_pos++] = data; + } +} + +/**************************************************************************/ +u32 upd933_device::env_rate(u8 data) const +{ + return (8 | (data & 7)) << (data >> 3); +} + +/**************************************************************************/ +void upd933_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) +{ + for (int i = 0; i < outputs[0].samples(); i++) + { + s32 sample = 0; + + /* + Voices need to be processed in a certain order for modulation to work correctly, + i.e. to match each odd-numbered voice ("line 1") with the corresponding even-numbered one ("line 2"). + */ + static const int voice_map[] = {5, 0, 7, 2, 1, 4, 3, 6}; + for (int j : voice_map) + sample += update(j); + + outputs[0].put_int_clamp(i, sample, 1 << 15); + m_sample_count++; + + if (!m_irq_data && m_cs) + check_irq(); + } +} + +/**************************************************************************/ +s16 upd933_device::update(int vnum) +{ + voice_t &voice = m_voice[vnum]; + s16 sample = 0; + + const u16 pos = BIT(voice.m_position, PITCH_SHIFT, 11); + const u8 wave = BIT(voice.m_position, PITCH_SHIFT + 11); + + const u16 dcw = std::min(u16(m_dcw[vnum].m_current >> ENV_DCW_SHIFT), voice.m_dcw_limit); + const u16 pivot = 0x400 - dcw; + u16 phase = 0; + u16 window = 0; + + // + // apply transfer function + // + switch (voice.m_wave[wave] & 7) + { + case 0: // sawtooth - rises from [0, pivot) and falls from [pivot, 800) + if (pos < pivot) + phase = pos * 0x400 / pivot; + else + phase = 0x400 + (pos - pivot) * 0x400 / (0x800 - pivot); + break; + + case 1: // square - rises from [0, pivot), stays high from [pivot, 400), then inverts + if ((pos & 0x3ff) < pivot) + phase = (pos & 0x3ff) * 0x400 / pivot; + else + phase = 0x3ff; + + phase |= (pos & 0x400); + break; + + case 2: // pulse - rises & falls from [0, pivot*2), then stays low + if (pos < pivot * 2) + phase = pos * 0x800 / (pivot * 2); + else + phase = 0x7ff; + break; + + case 3: // silent (undocumented) + break; + + case 4: // double sine - rises & falls from [0, pivot), then again from [pivot, 800) + if (pos < pivot) + phase = pos * 0x800 / pivot; + else + phase = (pos - pivot) * 0x800 / (0x800 - pivot); + break; + + case 5: // saw pulse - rises from [0, 400), falls from [400, 400+pivot), then stays low + if (pos < 0x400) + phase = pos; + else if (pos < (pivot + 0x400)) + phase = 0x400 + (pos & 0x3ff) * 0x400 / pivot; + else + phase = 0x7ff; + break; + + case 6: // resonance + // this is a special case that just multiplies the frequency by the DCW level... + phase = pos + ((pos * dcw) >> 6); + // ...and hardsyncs to the fundamental frequency + phase &= 0x7ff; + break; + + case 7: // double pulse (undocumented) - same as regular pulse but double frequency + if ((pos & 0x3ff) < pivot) + phase = (pos & 0x3ff) * 0x400 / pivot; + else + phase = 0x7ff; + break; + } + + // + // apply window function + // + switch (voice.m_window & 7) + { + case 0: // none + break; + + case 1: // sawtooth - falls from [0, 800) + window = pos; + break; + + case 2: // triangle - rises from [0, 400), falls from [400, 800) + window = (pos & 0x3ff) * 2; + if (pos < 0x400) + window ^= 0x7fe; + break; + + case 3: // trapezoid - falls from [400, 800) + if (pos >= 0x400) + window = (pos & 0x3ff) * 2; + break; + + case 4: // pulse (undocumented) - falls from [0, 400) + if (pos < 0x400) + window = pos * 2; + else + window = 0x7ff; + break; + + default: // double saw (undocumented) - rises from [0, 400) and [400, 800) + window = (0x3ff ^ (pos & 0x3ff)) * 2; + break; + } + + sample = m_cosine[phase]; + if (window) + sample = ((s32)sample * (0x800 - window)) / 0x800; + + // center sample around zero, apply volume and ring mod + const u16 volume = m_dca[vnum].m_current >> ENV_DCA_SHIFT; + sample = ((s32)sample * m_volume[volume]) >> VOLUME_SHIFT; + sample -= m_volume[volume] / 2; + + if (voice.m_ring_mod) + sample = ((s32)sample * m_last_sample) / 0x1000; + + // 'mute' actually negates the other voice in a modulating pair + if (voice.m_mute_other) + sample -= m_last_sample; + + // + // update envelopes and pitch modulation, recalculate DCO pitch step if needed + // + const u32 old_dco = m_dco[vnum].m_current; + const s16 old_pm = voice.m_pm_level; + + m_dca[vnum].update(); + m_dcw[vnum].update(); + m_dco[vnum].update(); + + // pitch/noise modulation latches a new pitch multiplier every 8 samples + if (!(m_sample_count & 7)) + { + switch (voice.m_pitch_mod & 3) + { + default: + voice.m_pm_level = 0; + break; + + case 2: + // pitch modulated by other voice (normally unused, up to about +/- 7.5 semitones) + voice.m_pm_level = m_last_sample; + break; + + case 3: + // pitch modulated by noise (0 or 32 semitones above base pitch) + voice.m_pm_level = machine().rand() & (32 << NOTE_SHIFT); + break; + } + } + + if ((old_dco ^ m_dco[vnum].m_current) >> ENV_DCO_SHIFT + || old_pm != voice.m_pm_level) + update_pitch_step(vnum); + + voice.m_position += voice.m_pitch_step; + + m_last_sample = sample; + return sample; +} + +/**************************************************************************/ +void upd933_device::env_t::update() +{ + if (m_current != m_target) + { + if (!m_direction) // increasing + { + if (m_current > m_target + || m_target - m_current <= m_rate) + m_current = m_target; + else + m_current += m_rate; + } + else // decreasing + { + if (m_current < m_target + || m_current - m_target <= m_rate) + m_current = m_target; + else + m_current -= m_rate; + } + } + + if (!m_sustain && (m_current == m_target)) + m_irq = true; +} + +/**************************************************************************/ +void upd933_device::update_pitch_step(int vnum) +{ + voice_t &voice = m_voice[vnum]; + const s32 pitch = s32(voice.m_pitch + (m_dco[vnum].m_current >> ENV_DCO_SHIFT)) + voice.m_pm_level; + u32 step = 0; + + if (pitch > 0 && pitch < (1 << 16)) + { + const u8 note = pitch >> NOTE_SHIFT; + const u16 fine = pitch & ((1 << NOTE_SHIFT) - 1); + step = m_pitch[note]; + if (fine) + step += (step >> PITCH_FINE_SHIFT) * m_pitch_fine[fine]; + } + + voice.m_pitch_step = step; + + /* + The effective DCW envelope value is limited for higher pitch values. + This allows e.g. narrow pulse waves to remain correctly audible + and also prevents aliasing noise for extremely high pitch values. + */ + voice.m_dcw_limit = 0x400 - std::min(0x400U, (step >> (PITCH_SHIFT - 2))); +} diff --git a/src/devices/sound/upd933.h b/src/devices/sound/upd933.h new file mode 100644 index 00000000000..ecaa6045cf8 --- /dev/null +++ b/src/devices/sound/upd933.h @@ -0,0 +1,96 @@ +// license:BSD-3-Clause +// copyright-holders: Devin Acker + +/*************************************************************************** + NEC/Casio uPD933 "Phase Distortion" synthesis chip +***************************************************************************/ + +#ifndef MAME_SOUND_UPD933_H +#define MAME_SOUND_UPD933_H + +#pragma once + +#include <array> + +class upd933_device : public device_t, public device_sound_interface +{ +public: + upd933_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + + auto irq_cb() { return m_irq_cb.bind(); } + + int rq_r() const { return m_irq_state; } + void cs_w(int state); // chip select, active low + + void write(u8 data); + u8 read(); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_clock_changed() override; + + virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; + +private: + static constexpr unsigned NOTE_SHIFT = 9; + static constexpr unsigned PITCH_SHIFT = 20; + static constexpr unsigned PITCH_FINE_SHIFT = 12; + static constexpr unsigned VOLUME_SHIFT = 12; + + static constexpr unsigned ENV_DCA_SHIFT = 16; + static constexpr unsigned ENV_DCW_SHIFT = 16; + static constexpr unsigned ENV_DCO_SHIFT = 11; + + struct env_t + { + u8 m_direction = 0, m_sustain = 1, m_irq = 0; + u32 m_rate = 0, m_target = 0, m_current = 0; + + void update(); + }; + + struct voice_t + { + u8 m_wave[2] = {0}; + u8 m_window = 0, m_ring_mod = 0, m_pitch_mod = 0, m_mute_other = 0; + + u16 m_pitch = 0; + u32 m_position = 0, m_pitch_step = 0; + u16 m_dcw_limit = 0; + s16 m_pm_level = 0; + }; + + s16 update(int vnum); + void check_irq(); + + u32 env_rate(u8 data) const; + void update_pitch_step(int vnum); + + sound_stream *m_stream; + static constexpr unsigned CLOCKS_PER_SAMPLE = 112; + + devcb_write_line m_irq_cb; + u8 m_irq_state; + u8 m_cs; + + u16 m_cosine[0x800]; + u32 m_pitch[0x80]; + u16 m_pitch_fine[0x200]; + u16 m_volume[0x200]; + + u8 m_sound_data[2]; + u8 m_sound_data_pos; + std::array<u16, 256> m_sound_regs; + + u32 m_sample_count; + s16 m_last_sample; + u8 m_irq_data; + + std::array<voice_t, 8> m_voice; + std::array<env_t, 8> m_dca, m_dco, m_dcw; +}; + +DECLARE_DEVICE_TYPE(UPD933, upd933_device) + +#endif // MAME_SOUND_UPD933_H diff --git a/src/mame/casio/cz101.cpp b/src/mame/casio/cz101.cpp index 7c0567fa19f..38533cf2782 100644 --- a/src/mame/casio/cz101.cpp +++ b/src/mame/casio/cz101.cpp @@ -1,23 +1,41 @@ // license: BSD-3-Clause -// copyright-holders: Dirk Best +// copyright-holders: Dirk Best, Devin Acker /*************************************************************************** Casio CZ-101 Digital Synthesizer + Misc. notes: + + To run a (currently undumped) test/diagnostic/debug cartridge: + Hold "env step +", "env step -", "initialize", and "write" all at once, then press "load". + If a cartridge is inserted that begins with the 8 bytes "5a 96 5a 96 5a 96 5a 96", then + the CZ-101 firmware will copy the first 2kb of the cart to $8800-8fff and then call $8810. + This works even when the normal "cart detect" signal isn't present. + (Note that this will wipe out all patches saved to the internal RAM.) + + Unused input matrix bits: + Bit 7 of KC15 is normally unused, but if pulled low using a diode, then bits 2-5 of KC8 + (also normally unused) become DIP switches that override the normal MIDI "basic channel" + setting from the front panel (possibly planned for use on a screenless MIDI module). + ***************************************************************************/ #include "emu.h" +#include "ra3.h" #include "bus/midi/midiinport.h" #include "bus/midi/midioutport.h" #include "cpu/upd7810/upd7811.h" #include "machine/clock.h" +#include "machine/nvram.h" +#include "sound/upd933.h" #include "video/hd44780.h" #include "emupal.h" #include "screen.h" +#include "speaker.h" //#define VERBOSE 1 #include "logmacro.h" @@ -38,8 +56,13 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_hd44780(*this, "hd44780"), + m_upd933(*this, "upd933"), + m_cart(*this, "cart"), m_keys(*this, "kc%u", 0), m_leds(*this, "led_%u", 0U), + m_led_env(*this, "led_env%u.%u", 0U, 0U), + m_led_tone(*this, "led_tone%u.%u", 0U, 0U), + m_power(0), m_port_b(0), m_port_c(0), m_midi_rx(1) @@ -50,6 +73,8 @@ public: void cz101_palette(palette_device &palette) const; HD44780_PIXEL_UPDATE(lcd_pixel_update); + DECLARE_INPUT_CHANGED_MEMBER(power_w); + protected: virtual void machine_start() override; virtual void machine_reset() override; @@ -65,19 +90,20 @@ private: void led_3_w(uint8_t data); void led_4_w(uint8_t data); uint8_t keys_r(); - void sound_w(uint8_t data); required_device<upd7810_device> m_maincpu; required_device<hd44780_device> m_hd44780; + required_device<upd933_device> m_upd933; + required_device<casio_ra3_device> m_cart; required_ioport_array<16> m_keys; - output_finder<32> m_leds; + output_finder<16> m_leds; + output_finder<3, 4> m_led_env; + output_finder<3, 3> m_led_tone; + uint8_t m_power; uint8_t m_port_b; uint8_t m_port_c; uint8_t m_midi_rx; - - uint8_t m_sound_data[2]; - uint8_t m_sound_data_pos; }; @@ -87,15 +113,17 @@ private: void cz101_state::maincpu_map(address_map &map) { + map.unmap_value_high(); + map(0x0000, 0x7fff).rom().region("program", 0); - map(0x8000, 0x8fff).ram(); - map(0x9000, 0x97ff).noprw(); // rampack + map(0x8000, 0x8fff).ram().share("nvram"); + map(0x9000, 0x97ff).rw(m_cart, FUNC(casio_ra3_device::read), FUNC(casio_ra3_device::write)); map(0x9800, 0x9fff).w(FUNC(cz101_state::led_4_w)); map(0xa000, 0xa7ff).w(FUNC(cz101_state::led_3_w)); map(0xa800, 0xafff).w(FUNC(cz101_state::led_2_w)); map(0xb000, 0xb7ff).w(FUNC(cz101_state::led_1_w)); map(0xb800, 0xbfff).r(FUNC(cz101_state::keys_r)); - map(0xc000, 0xfeff).w(FUNC(cz101_state::sound_w)); + map(0xc000, 0xfeff).rw(m_upd933, FUNC(upd933_device::read), FUNC(upd933_device::write)); } @@ -105,153 +133,164 @@ void cz101_state::maincpu_map(address_map &map) static INPUT_PORTS_START( cz101 ) PORT_START("kc0") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C2") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C#2") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D2") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D#2") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E2") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C2") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C#2") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D2") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D#2") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("E2") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F2") PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("kc1") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F#2") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G2") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G#2") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A2") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A#2") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F#2") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G2") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G#2") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A2") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A#2") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("B2") PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("kc2") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C3") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C#3") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D3") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D#3") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E3") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C3") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C#3") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D3") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D#3") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("E3") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F3") PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("kc3") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F#3") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G3") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G#3") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A3") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A#3") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F#3") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G3") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G#3") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A3") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A#3") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("B3") PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("kc4") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C4") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C#4") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D4") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D#4") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E4") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C4") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C#4") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D4") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D#4") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("E4") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F4") PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("kc5") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F#4") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G4") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G#4") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A4") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A#4") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F#4") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G4") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G#4") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A4") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A#4") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("B4") PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("kc6") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C5") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C#5") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D5") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D#5") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E5") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C5") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C#5") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D5") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D#5") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("E5") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F5") PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("kc7") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F#5") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G5") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G#5") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A5") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A#5") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B5") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F#5") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G5") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G#5") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A5") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A#5") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("B5") PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("kc8") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C6") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C6") PORT_BIT(0xfe, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("kc9") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PORTMNT ON/OFF") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PORTMT TIME") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("VIBRATO ON/OFF") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BEND RANGE") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PRESET") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("INTERNAL") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CARTRIDGE") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("COMP/RECALL") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Portamento On/Off") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Portamento Time") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Vibrato On/Off") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Bend Range") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Preset") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Internal") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Cartridge") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Compare/Recall") PORT_START("kc10") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SOLO") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TONE MIX") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TRANSPOSE") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("WRITE") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MIDI") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PROTECT") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SELECT") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Solo") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Tone Mix") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Key Transpose") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Write") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("MIDI") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_TOGGLE PORT_NAME("Memory Protect") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Select") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_MEMORY_RESET) PORT_NAME("P (Reset RAM)") PORT_START("kc11") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TONE 1") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TONE 2") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TONE 3") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TONE 4") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TONE 5") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TONE 6") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TONE 7") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TONE 8") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Tone 1") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Tone 2") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Tone 3") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Tone 4") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Tone 5") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Tone 6") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Tone 7") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Tone 8") PORT_START("kc12") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SAVE") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LOAD") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"CURSOR \u9665") // ◁ - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"CURSOR \u9655") // ▷ - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"ENV \u9661") // ▽ - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"ENV \u9651") // △ - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ENV SUST.") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ENV END") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME(u8"Value \u25bd / Save") // ▽ + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME(u8"Value \u25b3 / Load") // △ + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME(u8"Cursor \u25c1") // ◁ + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME(u8"Cursor \u25b7") // ▷ + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_END) PORT_NAME(u8"Env. Step \u25bd") // ▽ + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_HOME) PORT_NAME(u8"Env. Step \u25b3") // △ + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_INSERT) PORT_NAME("Env. Point Sustain") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Env. Point End") PORT_START("kc13") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PACK DETECT") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("VIBRAT") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCO1 WAVE") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCO1 ENV") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCW1 KEY") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCW1 ENV") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCA1 KEY") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCA1 ENV") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("cart", casio_ra3_device, present) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Vibrato") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("DCO1 Wave Form") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("DCO1 Envelope") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("DCW1 Key Follow") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("DCW1 Envelope") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("DCA1 Key Follow") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("DCA1 Envelope") PORT_START("kc14") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("INITIALIZE") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("OCTAVE") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCO2 WAVE") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCO2 ENV") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCW2 KEY") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCW2 ENV") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCA2 KEY") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DCA2 ENV") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Initialize") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Octave") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("DCO2 Wave Form") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("DCO2 Envelope") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("DCW2 Key Follow") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("DCW2 Envelope") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("DCA2 Key Follow") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DCA2 Envelope") PORT_START("kc15") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DETUNE") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LINE SELECT") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RING") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NOISE") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"TUNE \u9661") // ▽ - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"TUNE \u9651") // △ - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("APO ON/OFF") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("Detune") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Line Select") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("Ring Modulation") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Noise Modulation") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME(u8"Master Tune \u25bd") // ▽ + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(u8"Master Tune \u25b3") // △ + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_TOGGLE PORT_NAME("Auto Power Off") PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_START("PB") + PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("upd933", upd933_device, rq_r) + PORT_BIT(0x60, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_POWER_OFF) PORT_NAME("Power") PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, cz101_state, power_w, 0) + PORT_START("AN1") - PORT_BIT(0xff, 0x7f, IPT_PADDLE) PORT_NAME("Pitch Wheel") PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_MINMAX(0x00, 0xff) + PORT_BIT(0xff, 0x7f, IPT_PADDLE) PORT_NAME("Pitch Wheel") PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_MINMAX(0x00, 0xff) PORT_CODE_DEC(JOYCODE_Y_DOWN_SWITCH) PORT_CODE_INC(JOYCODE_Y_UP_SWITCH) + + PORT_START("AN2") + PORT_CONFNAME(0xff, 0xff, "Battery Level") + PORT_CONFSETTING( 0xff, "Normal") + PORT_CONFSETTING( 0x00, "Low") INPUT_PORTS_END @@ -262,66 +301,68 @@ INPUT_PORTS_END void cz101_state::cz101_palette(palette_device &palette) const { palette.set_pen_color(0, rgb_t(138, 146, 148)); // background - palette.set_pen_color(1, rgb_t( 92, 83, 88)); // LCD pixel on + palette.set_pen_color(1, rgb_t( 63, 59, 62)); // LCD pixel on palette.set_pen_color(2, rgb_t(131, 136, 139)); // LCD pixel off } HD44780_PIXEL_UPDATE( cz101_state::lcd_pixel_update ) { // char size is 5x8 - if (x > 4 || y > 7) + if (!m_power || x > 4 || y > 7) return; if (line < 2 && pos < 16) bitmap.pix(1 + y + line*8 + line, 1 + pos*6 + x) = state ? 1 : 2; } +INPUT_CHANGED_MEMBER(cz101_state::power_w) +{ + if (!newval) + { + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + } + else + { + m_power = 1; + m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + } +} + void cz101_state::led_4_w(uint8_t data) { - m_leds[0] = BIT(~data, 7); - m_leds[1] = BIT(~data, 6); - m_leds[2] = BIT(~data, 5); - m_leds[3] = BIT(~data, 4); - m_leds[4] = BIT(~data, 3); - m_leds[5] = BIT(~data, 2); - m_leds[6] = BIT(~data, 1); - m_leds[7] = BIT(~data, 0); + if (!m_power) data = 0xff; + + for (int i = 0; i < 7; i++) + m_leds[i] = BIT(~data, i); } void cz101_state::led_3_w(uint8_t data) { - m_leds[8] = BIT(~data, 7); - m_leds[9] = BIT(~data, 6); - m_leds[10] = BIT(~data, 5); - m_leds[11] = BIT(~data, 4); - m_leds[12] = BIT(~data, 3); - m_leds[13] = BIT(~data, 2); - m_leds[14] = BIT(~data, 1); - m_leds[15] = BIT(~data, 0); + if (!m_power) data = 0xff; + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 4; j++) + m_led_env[i][j] = BIT(data, 4+i) & BIT(~data, j); } void cz101_state::led_2_w(uint8_t data) { - m_leds[16] = BIT(~data, 7); - m_leds[17] = BIT(~data, 6); - m_leds[18] = BIT(~data, 5); - m_leds[19] = BIT(~data, 4); - m_leds[20] = BIT(~data, 3); - m_leds[21] = BIT(~data, 2); - m_leds[22] = BIT(~data, 1); - m_leds[23] = BIT(~data, 0); + if (!m_power) data = 0xff; + + m_leds[7] = BIT(~data, 7); + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + m_led_tone[i][j] = BIT(data, 1+i) & BIT(~data, 4+j); } void cz101_state::led_1_w(uint8_t data) { - m_leds[24] = BIT(~data, 7); - m_leds[25] = BIT(~data, 6); - m_leds[26] = BIT(~data, 5); - m_leds[27] = BIT(~data, 4); - m_leds[28] = BIT(~data, 3); - m_leds[29] = BIT(~data, 2); - m_leds[30] = BIT(~data, 1); - m_leds[31] = BIT(~data, 0); + if (!m_power) data = 0xff; + + for (int i = 0; i < 8; i++) + m_leds[8+i] = BIT(~data, i); } uint8_t cz101_state::keys_r() @@ -329,19 +370,6 @@ uint8_t cz101_state::keys_r() return m_keys[m_port_b & 0x0f]->read(); } -void cz101_state::sound_w(uint8_t data) -{ - if (m_sound_data_pos >= 2) - { - logerror("sound reg write: %02x %02x %02x\n", m_sound_data[0], m_sound_data[1], data); - m_sound_data_pos = 0; - } - else - { - m_sound_data[m_sound_data_pos++] = data; - } -} - // 7------- power switch input (also connected to /NMI) // -6------ music lsi write enable // --5----- music lsi chip select @@ -352,14 +380,16 @@ void cz101_state::port_b_w(uint8_t data) { LOG("port_b_w: %02x\n", data); + m_upd933->cs_w(BIT(data, 5)); + m_port_b = data; } // 7------- lcd e // -6------ lcd rw // --5----- lcd rs -// ---4---- not used -// ----3--- power down detection output +// ---4---- not used / debug? (MIDI CC #7 writes data to port A and then toggles this bit) +// ----3--- power down output // -----2-- midi clock // ------1- midi input // -------0 midi output @@ -369,27 +399,40 @@ void cz101_state::port_c_w(uint8_t data) LOG("port_c_w: %02x\n", data); m_port_c = data; - m_hd44780->e_w(!BIT(data, 7)); - m_hd44780->rw_w(BIT(data, 6)); - m_hd44780->rs_w(BIT(data, 5)); + if (BIT(data, 3)) + { + m_hd44780->e_w(BIT(~data, 7)); + m_hd44780->rw_w(BIT(data, 6)); + m_hd44780->rs_w(BIT(data, 5)); + } + else + { + m_power = 0; + m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + m_hd44780->reset(); + m_upd933->reset(); + led_1_w(0xff); + led_2_w(0xff); + led_3_w(0xff); + led_4_w(0xff); + } } void cz101_state::machine_start() { m_leds.resolve(); + m_led_env.resolve(); + m_led_tone.resolve(); // register for save states + save_item(NAME(m_power)); save_item(NAME(m_port_b)); save_item(NAME(m_port_c)); save_item(NAME(m_midi_rx)); - save_item(NAME(m_sound_data)); - save_item(NAME(m_sound_data_pos)); } void cz101_state::machine_reset() { - m_sound_data[0] = m_sound_data[1] = 0; - m_sound_data_pos = 0; } @@ -399,18 +442,21 @@ void cz101_state::machine_reset() void cz101_state::cz101(machine_config &config) { - UPD7810(config, m_maincpu, 10_MHz_XTAL); // actually 7811, but internal ROM disabled + UPD7811(config, m_maincpu, 10_MHz_XTAL); m_maincpu->set_addrmap(AS_PROGRAM, &cz101_state::maincpu_map); m_maincpu->pa_in_cb().set(m_hd44780, FUNC(hd44780_device::db_r)); m_maincpu->pa_out_cb().set(m_hd44780, FUNC(hd44780_device::db_w)); - m_maincpu->pb_in_cb().set_constant(0x80); // TODO: power switch + m_maincpu->pb_in_cb().set_ioport("PB"); m_maincpu->pb_out_cb().set(FUNC(cz101_state::port_b_w)); m_maincpu->pc_out_cb().set(FUNC(cz101_state::port_c_w)); m_maincpu->an1_func().set_ioport("AN1"); - m_maincpu->set_pc_pullups(0x03); + m_maincpu->an2_func().set_ioport("AN2"); CLOCK(config, "midi_clock", 2_MHz_XTAL).signal_handler().set(m_maincpu, FUNC(upd7810_device::sck_w)); + NVRAM(config, "nvram"); // backed by external battery when RAM cartridge is inserted + CASIO_RA3(config, m_cart); + midi_port_device& mdin(MIDI_PORT(config, "mdin", midiin_slot, "midiin")); mdin.rxd_handler().set([this] (int state) { m_midi_rx = state; }); m_maincpu->rxd_func().set([this] () { return m_midi_rx; }); @@ -436,7 +482,11 @@ void cz101_state::cz101(machine_config &config) config.set_default_layout(layout_cz101); - //UPD933(config, "music", 8.96_MHz_XTAL / 2); + SPEAKER(config, "speaker").front_center(); + + UPD933(config, m_upd933, 8.96_MHz_XTAL / 2); + m_upd933->irq_cb().set_inputline(m_maincpu, UPD7810_INTF1); + m_upd933->add_route(0, "speaker", 1.0); } @@ -459,6 +509,9 @@ ROM_START( cz101 ) ROMX_LOAD("hn613256ps40.bin", 0x0000, 0x8000, CRC(c417bc57) SHA1(2aa5bfb76dc0a56797cf5dd547197816cedfa370), ROM_BIOS(0)) ROM_SYSTEM_BIOS(1, "v1", "Version I" ) ROMX_LOAD("hn613256pn26.bin", 0x0000, 0x8000, CRC(e6c7780e) SHA1(52ff2c280392e104e84b05288c2b952fc29b50f4), ROM_BIOS(1)) + + ROM_REGION(0x1000, "nvram", 0) + ROM_LOAD("init_ram.bin", 0x0000, 0x1000, CRC(11010fa5) SHA1(a5f33408cc2852c8429b828849675d231c370831)) ROM_END } // anonymous namespace @@ -469,4 +522,4 @@ ROM_END //************************************************************************** // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -CONS( 1984, cz101, 0, 0, cz101, cz101, cz101_state, empty_init, "Casio", "CZ-101", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +CONS( 1984, cz101, 0, 0, cz101, cz101, cz101_state, empty_init, "Casio", "CZ-101", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/casio/ra3.cpp b/src/mame/casio/ra3.cpp new file mode 100644 index 00000000000..64967093950 --- /dev/null +++ b/src/mame/casio/ra3.cpp @@ -0,0 +1,79 @@ +// license:BSD-3-Clause +// copyright-holders:Devin Acker +/********************************************************************* + Casio CZ-series RAM cartridges +*********************************************************************/ + +#include "emu.h" +#include "ra3.h" + +#include "emuopts.h" + +#include <algorithm> + +// device type definition +DEFINE_DEVICE_TYPE(CASIO_RA3, casio_ra3_device, "casio_ra3", "Casio RA-3 RAM cartridge") + +/**************************************************************************/ +casio_ra3_device::casio_ra3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, CASIO_RA3, tag, owner, clock) + , device_memcard_image_interface(mconfig, *this) +{ +} + +/**************************************************************************/ +void casio_ra3_device::device_start() +{ + m_ram.resize(0x1000, 0xff); + + save_item(NAME(m_ram)); +} + +/**************************************************************************/ +std::pair<std::error_condition, std::string> casio_ra3_device::call_load() +{ + const size_t size = m_ram.size(); + if (length() != size) + return std::make_pair(image_error::INVALIDLENGTH, std::string()); + + fseek(0, SEEK_SET); + const size_t ret = fread(m_ram.data(), size); + if (ret != size) + return std::make_pair(std::errc::io_error, "Error reading file"); + + return std::make_pair(std::error_condition(), std::string()); +} + +/**************************************************************************/ +void casio_ra3_device::call_unload() +{ + fseek(0, SEEK_SET); + fwrite(m_ram.data(), m_ram.size()); + std::fill(m_ram.begin(), m_ram.end(), 0xff); +} + +/**************************************************************************/ +std::pair<std::error_condition, std::string> casio_ra3_device::call_create(int format_type, util::option_resolution *format_options) +{ + std::fill(m_ram.begin(), m_ram.end(), 0xff); + + const size_t size = m_ram.size(); + const size_t ret = fwrite(m_ram.data(), size); + if (ret != size) + return std::make_pair(std::errc::io_error, "Error writing file"); + + return std::make_pair(std::error_condition(), std::string()); +} + +/**************************************************************************/ +u8 casio_ra3_device::read(offs_t offset) +{ + return m_ram[offset & 0xfff]; +} + +/**************************************************************************/ +void casio_ra3_device::write(offs_t offset, u8 data) +{ + if (is_loaded()) + m_ram[offset & 0xfff] = data; +} diff --git a/src/mame/casio/ra3.h b/src/mame/casio/ra3.h new file mode 100644 index 00000000000..48933c1e8a2 --- /dev/null +++ b/src/mame/casio/ra3.h @@ -0,0 +1,44 @@ +// license:BSD-3-Clause +// copyright-holders:Devin Acker +/********************************************************************* + Casio CZ-series RAM cartridges +*********************************************************************/ +#ifndef MAME_CASIO_RA3_H +#define MAME_CASIO_RA3_H + +#pragma once + +#include "imagedev/memcard.h" + +#include <vector> + +class casio_ra3_device : public device_t, public device_memcard_image_interface +{ +public: + casio_ra3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + virtual bool is_reset_on_load() const noexcept override { return false; } + virtual const char *file_extensions() const noexcept override { return "bin"; } + virtual const char *image_type_name() const noexcept override { return "cartridge"; } + virtual const char *image_brief_type_name() const noexcept override { return "cart"; } + + virtual std::pair<std::error_condition, std::string> call_load() override; + virtual void call_unload() override; + virtual std::pair<std::error_condition, std::string> call_create(int format_type, util::option_resolution *format_options) override; + + u8 read(offs_t offset); + void write(offs_t offset, u8 data); + + bool present() { return is_loaded(); } + +protected: + virtual void device_start() override; + +private: + std::vector<u8> m_ram; +}; + +// device type definition +DECLARE_DEVICE_TYPE(CASIO_RA3, casio_ra3_device) + +#endif // MAME_CASIO_RA3_H diff --git a/src/mame/layout/cz101.lay b/src/mame/layout/cz101.lay index 9b36ad9af63..4bdcaac94e6 100644 --- a/src/mame/layout/cz101.lay +++ b/src/mame/layout/cz101.lay @@ -4,114 +4,736 @@ license:CC0-1.0 --> <mamelayout version="2"> + <element name="bg"><rect><color red="0.1" green="0.1" blue="0.1" /></rect></element> + <element name="black"><rect><color red="0" green="0" blue="0" /></rect></element> + <element name="grey"><rect><color red="0.18" green="0.18" blue="0.18" /></rect></element> + <element name="white"><rect><color red="1" green="1" blue="1" /></rect></element> + <element name="blue"><rect><color red="0.29" green="0.38" blue="0.82" /></rect></element> + + <!-- text elements --> + <element name="effect"> + <rect><color red="0.18" green="0.18" blue="0.18" /></rect> + <text string="EFFECT"><color red="1" green="0.9" blue="0.4" /></text> + </element> + <element name="bend"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="BEND" /></element> + <element name="range"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="RANGE" /></element> + <element name="vibrato"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="VIBRATO" /></element> + <element name="on_off"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="ON/OFF" /></element> + <element name="portamento"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="PORTAMENTO" /></element> + <element name="time"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="TIME" /></element> + + <element name="programmer"> + <rect><color red="0.18" green="0.18" blue="0.18" /></rect> + <text string="PROGRAMMER"><color red="1" green="0.9" blue="0.4" /></text> + </element> + <element name="preset"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="PRESET" /></element> + <element name="internal"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="INTERNAL" /></element> + <element name="cartridge"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="CARTRIDGE" /></element> + <element name="memory"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="MEMORY" align="1" /></element> + <element name="compare"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="COMPARE" align="1" /></element> + <element name="recall"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="/RECALL" align="2" /></element> + + <element name="mono"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="MONO" align="2" /></element> + <element name="solo"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="SOLO" /></element> + <element name="tone_mix"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="TONE MIX" /></element> + <element name="key_transpose"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="KEY TRANSPOSE" align="1" /></element> + <element name="write"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="WRITE" /></element> + <element name="midi"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="MIDI" /></element> + + <element name="digital"><text string="DIGITAL SYNTHESIZER"><color red="0.29" green="0.38" blue="0.82" /></text></element> + <element name="data_entry"> + <rect><color red="0.18" green="0.18" blue="0.18" /></rect> + <text string="DATA ENTRY"><color red="1" green="0.9" blue="0.4" /></text> + </element> + <element name="value"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="VALUE" /></element> + <element name="cursor"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="CURSOR" /></element> + <element name="save"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="SAVE" /></element> + <element name="load"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="LOAD" /></element> + + <element name="parameter"> + <rect><color red="0.18" green="0.18" blue="0.18" /></rect> + <text string="PARAMETER"><color red="1" green="0.9" blue="0.4" /></text> + </element> + <element name="env_step"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="ENV STEP" /></element> + <element name="down"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="DOWN" /></element> + <element name="up"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="UP" /></element> + <element name="env_point"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="ENV POINT" /></element> + <element name="sustain"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="SUSTAIN" /></element> + <element name="end"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="END" /></element> + <element name="initialize"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="INITIALIZE" /></element> + <element name="octave"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="OCTAVE" /></element> + <element name="wave_form"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="WAVE FORM" /></element> + <element name="key_follow"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="KEY FOLLOW" /></element> + <element name="env"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="ENV" /></element> + <element name="detune"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="DETUNE" /></element> + <element name="line_select"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="LINE SELECT" /></element> + <element name="ring"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="RING" /></element> + <element name="noise"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="NOISE" /></element> + <element name="modulation"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="MODULATION" /></element> + + <element name="dco1"><rect><color red="0.29" green="0.38" blue="0.82" /></rect><text string="DCO 1" /></element> + <element name="dco2"><rect><color red="0.29" green="0.38" blue="0.82" /></rect><text string="DCO 2" /></element> + <element name="dcw1"><rect><color red="0.29" green="0.38" blue="0.82" /></rect><text string="DCW 1" /></element> + <element name="dcw2"><rect><color red="0.29" green="0.38" blue="0.82" /></rect><text string="DCW 2" /></element> + <element name="dca1"><rect><color red="0.29" green="0.38" blue="0.82" /></rect><text string="DCA 1" /></element> + <element name="dca2"><rect><color red="0.29" green="0.38" blue="0.82" /></rect><text string="DCA 2" /></element> + + <element name="line1"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="1" /></element> + <element name="line2"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="2" /></element> + <element name="line12"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="1+2'" /></element> + <element name="line11"><rect><color red="0.18" green="0.18" blue="0.18" /></rect><text string="1+1'" /></element> + + <element name="master_tune"><text string="MASTER TUNE"><color red="1" green="0.9" blue="0.4" /></text></element> + + <element name="power"> + <rect><color red="0.18" green="0.18" blue="0.18" /></rect> + <text string="POWER"><color red="1" green="0.9" blue="0.4" /></text> + </element> + + <!-- LED primitives --> <element name="led" defstate="0"> + <rect state="0"><color red="0.2" green="0" blue="0" /></rect> + <rect state="1"><color red="1" green="0.1" blue="0" /></rect> + </element> + + <element name="led_g" defstate="0"> + <rect state="0"><color red="0" green="0.2" blue="0" /></rect> + <rect state="1"><color red="0" green="1" blue="0.1" /></rect> + </element> + + <!-- button primitives --> + <element name="button_grey" defstate="0"> + <rect> + <color red="0.05" green="0.05" blue="0.05" /> + <bounds x="0" y="0" width="15" height="10" /> + </rect> <rect state="0"> - <color red="0" green="0.2" blue="0" /> + <color red="0.1" green="0.1" blue="0.1" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> </rect> <rect state="1"> - <color red="0" green="0.8" blue="0" /> + <color red="0.07" green="0.07" blue="0.07" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> </rect> </element> - <view name="Debugging Lamps"> - <bounds x="0" y="0" width="776" height="200" /> - <screen index="0"> - <bounds left="0" top="0" right="776" bottom="152" /> - </screen> - <element name="led_0" ref="led"> - <bounds x="10" y="160" width="10" height="10" /> - </element> - <element name="led_1" ref="led"> - <bounds x="30" y="160" width="10" height="10" /> - </element> - <element name="led_2" ref="led"> - <bounds x="50" y="160" width="10" height="10" /> - </element> - <element name="led_3" ref="led"> - <bounds x="70" y="160" width="10" height="10" /> - </element> - <element name="led_4" ref="led"> - <bounds x="90" y="160" width="10" height="10" /> - </element> - <element name="led_5" ref="led"> - <bounds x="110" y="160" width="10" height="10" /> - </element> - <element name="led_6" ref="led"> - <bounds x="130" y="160" width="10" height="10" /> - </element> - <element name="led_7" ref="led"> - <bounds x="150" y="160" width="10" height="10" /> - </element> - <element name="led_8" ref="led"> - <bounds x="170" y="160" width="10" height="10" /> - </element> - <element name="led_9" ref="led"> - <bounds x="190" y="160" width="10" height="10" /> - </element> - <element name="led_10" ref="led"> - <bounds x="210" y="160" width="10" height="10" /> - </element> - <element name="led_11" ref="led"> - <bounds x="230" y="160" width="10" height="10" /> - </element> - <element name="led_12" ref="led"> - <bounds x="250" y="160" width="10" height="10" /> - </element> - <element name="led_13" ref="led"> - <bounds x="270" y="160" width="10" height="10" /> - </element> - <element name="led_14" ref="led"> - <bounds x="290" y="160" width="10" height="10" /> - </element> - <element name="led_15" ref="led"> - <bounds x="310" y="160" width="10" height="10" /> - </element> - <element name="led_16" ref="led"> - <bounds x="330" y="160" width="10" height="10" /> - </element> - <element name="led_17" ref="led"> - <bounds x="350" y="160" width="10" height="10" /> - </element> - <element name="led_18" ref="led"> - <bounds x="370" y="160" width="10" height="10" /> - </element> - <element name="led_19" ref="led"> - <bounds x="390" y="160" width="10" height="10" /> - </element> - <element name="led_20" ref="led"> - <bounds x="410" y="160" width="10" height="10" /> - </element> - <element name="led_21" ref="led"> - <bounds x="430" y="160" width="10" height="10" /> - </element> - <element name="led_22" ref="led"> - <bounds x="450" y="160" width="10" height="10" /> - </element> - <element name="led_23" ref="led"> - <bounds x="470" y="160" width="10" height="10" /> - </element> - <element name="led_24" ref="led"> - <bounds x="10" y="180" width="10" height="10" /> - </element> - <element name="led_25" ref="led"> - <bounds x="30" y="180" width="10" height="10" /> - </element> - <element name="led_26" ref="led"> - <bounds x="50" y="180" width="10" height="10" /> - </element> - <element name="led_27" ref="led"> - <bounds x="70" y="180" width="10" height="10" /> - </element> - <element name="led_28" ref="led"> - <bounds x="90" y="180" width="10" height="10" /> - </element> - <element name="led_29" ref="led"> - <bounds x="110" y="180" width="10" height="10" /> - </element> - <element name="led_30" ref="led"> - <bounds x="130" y="180" width="10" height="10" /> + + <element name="button_down" defstate="0"> + <rect> + <color red="0.05" green="0.05" blue="0.05" /> + <bounds x="0" y="0" width="15" height="10" /> + </rect> + <rect state="0"> + <color red="0.1" green="0.1" blue="0.1" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <rect state="1"> + <color red="0.07" green="0.07" blue="0.07" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <image> + <bounds xc="7.5" yc="5" width="10" height="10" /> + <data><![CDATA[ + <?xml version="1.0" standalone="no"?> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" version="1.1"> + <polygon points="2,2 5,8 8,2" fill="none" stroke="white" stroke-width="0.4" /> + </svg> + ]]></data> + </image> + </element> + + <element name="button_up" defstate="0"> + <rect> + <color red="0.05" green="0.05" blue="0.05" /> + <bounds x="0" y="0" width="15" height="10" /> + </rect> + <rect state="0"> + <color red="0.1" green="0.1" blue="0.1" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <rect state="1"> + <color red="0.07" green="0.07" blue="0.07" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <image> + <bounds xc="7.5" yc="5" width="10" height="10" /> + <data><![CDATA[ + <?xml version="1.0" standalone="no"?> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" version="1.1"> + <polygon points="2,8 5,2 8,8" fill="none" stroke="white" stroke-width="0.4" /> + </svg> + ]]></data> + </image> + </element> + + <element name="button_left" defstate="0"> + <rect> + <color red="0.05" green="0.05" blue="0.05" /> + <bounds x="0" y="0" width="15" height="10" /> + </rect> + <rect state="0"> + <color red="0.1" green="0.1" blue="0.1" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <rect state="1"> + <color red="0.07" green="0.07" blue="0.07" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <image> + <bounds xc="7.5" yc="5" width="10" height="10" /> + <data><![CDATA[ + <?xml version="1.0" standalone="no"?> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" version="1.1"> + <polygon points="2,5 8,2 8,8" fill="none" stroke="white" stroke-width="0.4" /> + </svg> + ]]></data> + </image> + </element> + + <element name="button_right" defstate="0"> + <rect> + <color red="0.05" green="0.05" blue="0.05" /> + <bounds x="0" y="0" width="15" height="10" /> + </rect> + <rect state="0"> + <color red="0.1" green="0.1" blue="0.1" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <rect state="1"> + <color red="0.07" green="0.07" blue="0.07" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <image> + <bounds xc="7.5" yc="5" width="10" height="10" /> + <data><![CDATA[ + <?xml version="1.0" standalone="no"?> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" version="1.1"> + <polygon points="8,5 2,2 2,8" fill="none" stroke="white" stroke-width="0.4" /> + </svg> + ]]></data> + </image> + </element> + + <element name="button_grey_red" defstate="0"> + <rect> + <color red="0.05" green="0.05" blue="0.05" /> + <bounds x="0" y="0" width="15" height="10" /> + </rect> + <rect state="0"> + <color red="0.1" green="0.1" blue="0.1" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <rect state="0"> + <color red="0.6" green="0.1" blue="0" /> + <bounds xc="7.5" yc="5" width="11" height="6" /> + </rect> + <rect state="1"> + <color red="0.07" green="0.07" blue="0.07" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <rect state="1"> + <color red="0.4" green="0" blue="0" /> + <bounds xc="7.5" yc="5" width="11" height="6" /> + </rect> + </element> + + <element name="button_tone" defstate="0"> + <rect> + <color red="0.05" green="0.05" blue="0.05" /> + <bounds x="0" y="0" width="15" height="10" /> + </rect> + <rect state="0"> + <color red="0.9" green="0.9" blue="0.8" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <rect state="1"> + <color red="0.5" green="0.5" blue="0.42" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + </element> + + <repeat count="8"> + <param name="num" start="1" increment="1" /> + <param name="num2" start="9" increment="1" /> + + <element name="button_tone_~num~" defstate="0"> + <rect> + <color red="0.05" green="0.05" blue="0.05" /> + <bounds x="0" y="0" width="15" height="10" /> + </rect> + <rect state="0"> + <color red="0.9" green="0.9" blue="0.8" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <rect state="1"> + <color red="0.5" green="0.5" blue="0.42" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <text string="~num~"><bounds xc="7.5" yc="5" width="15" height="6" /><color red="0" green="0" blue="0" /></text> </element> - <element name="led_31" ref="led"> - <bounds x="150" y="180" width="10" height="10" /> + + <element name="num_~num2~"> + <rect><color red="0.29" green="0.38" blue="0.82" /></rect> + <text string="~num2~" /> </element> + </repeat> + + <element name="button_select" defstate="0"> + <rect> + <color red="0.05" green="0.05" blue="0.05" /> + <bounds x="0" y="0" width="15" height="10" /> + </rect> + <rect state="0"> + <color red="0.9" green="0.9" blue="0.8" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <rect state="1"> + <color red="0.5" green="0.5" blue="0.42" /> + <bounds xc="7.5" yc="5" width="13.5" height="8.5" /> + </rect> + <text string="SELECT"><bounds xc="7.5" yc="5" width="15" height="4" /><color red="0" green="0" blue="0" /></text> + </element> + + <element name="button_power" defstate="0"> + <rect> + <color red="0.05" green="0.05" blue="0.05" /> + <bounds x="0" y="0" width="11" height="22" /> + </rect> + <rect state="0"> + <color red="0.1" green="0.1" blue="0.1" /> + <bounds xc="5.5" yc="11" width="9" height="20" /> + </rect> + <rect state="0"> + <color red="0.6" green="0.1" blue="0" /> + <bounds xc="5.5" y="3" width="7" height="3" /> + </rect> + <rect state="1"> + <color red="0.07" green="0.07" blue="0.07" /> + <bounds xc="5.5" yc="11" width="9" height="20" /> + </rect> + <rect state="1"> + <color red="0.4" green="0" blue="0" /> + <bounds xc="5.5" y="3" width="7" height="3" /> + </rect> + </element> + + <!-- effect group --> + <group name="effect"> + <element ref="grey"><bounds x="0" y="0" width="64" height="93" /></element> + <element ref="white"><bounds x="1" y="1" width="0.75" height="85" /></element> + + <element ref="effect"><bounds xc="32" y="3" width="40" height="5" /></element> + + <element ref="button_grey" inputtag="kc9" inputmask="0x08"><bounds x="14" y="30" width="15" height="10" /></element> + <element ref="bend"><bounds xc="21.5" y="40" width="20" height="4" /></element> + <element ref="range"><bounds xc="21.5" y="44" width="20" height="4" /></element> + <element ref="led" name="led_14"><bounds x="38.5" y="25" width="6" height="3" /></element> + <element ref="button_grey" inputtag="kc9" inputmask="0x04"><bounds x="34" y="30" width="15" height="10" /></element> + <element ref="vibrato"><bounds xc="41.5" y="40" width="20" height="4" /></element> + <element ref="on_off"><bounds xc="41.5" y="44" width="20" height="4" /></element> + <element ref="button_grey" inputtag="kc9" inputmask="0x02"><bounds x="14" y="67" width="15" height="10" /></element> + <element ref="time"><bounds xc="21.5" y="77" width="20" height="4" /></element> + <element ref="led" name="led_15"><bounds x="38.5" y="62" width="6" height="3" /></element> + <element ref="button_grey" inputtag="kc9" inputmask="0x01"><bounds x="34" y="67" width="15" height="10" /></element> + <element ref="on_off"><bounds xc="41.5" y="77" width="20" height="4" /></element> + <element ref="portamento"><bounds xc="31.5" y="82" width="30" height="4" /></element> + </group> + + <!-- programmer group --> + <group name="programmer"> + <element ref="grey"><bounds x="0" y="0" width="174" height="93" /></element> + <element ref="white"><bounds x="1" y="1" width="0.75" height="85" /></element> + + <element ref="programmer"><bounds xc="87" y="3" width="64" height="5" /></element> + + <!-- preset, internal, cartridge, compare/recall --> + <element ref="white"><bounds x="46.5" y="28" width="0.75" height="6" /></element> + <element ref="white"><bounds x="66.5" y="28" width="0.75" height="6" /></element> + <element ref="white"><bounds x="46.5" yc="34" width="30" height="0.75" /></element> + + <element ref="led" name="led_11"><bounds x="23.5" y="12" width="6" height="3" /></element> + <element ref="button_grey" inputtag="kc9" inputmask="0x10"><bounds x="19" y="17" width="15" height="10" /></element> + <element ref="preset"><bounds xc="26.5" y="27" width="20" height="4" /></element> + <element ref="led" name="led_10"><bounds x="43.5" y="12" width="6" height="3" /></element> + <element ref="button_grey" inputtag="kc9" inputmask="0x20"><bounds x="39" y="17" width="15" height="10" /></element> + <element ref="internal"><bounds xc="46.5" y="27" width="20" height="4" /></element> + <element ref="led" name="led_9"><bounds x="63.5" y="12" width="6" height="3" /></element> + <element ref="button_grey" inputtag="kc9" inputmask="0x40"><bounds x="59" y="17" width="15" height="10" /></element> + <element ref="cartridge"><bounds xc="66.5" y="27" width="20" height="4" /></element> + <element ref="memory"><bounds x="79" y="31" width="20" height="4" /></element> + + <element ref="led" name="led_8"><bounds x="121.5" y="12" width="6" height="3" /></element> + <element ref="button_grey_red" inputtag="kc9" inputmask="0x80"><bounds x="117" y="17" width="15" height="10" /></element> + <element ref="compare"><bounds xc="124.5" y="27" width="20" height="4" /></element> + <element ref="recall"><bounds xc="124.5" y="31" width="20" height="4" /></element> + + <!-- tone select --> + <element ref="led" name="led_tone2.0"><bounds x="16.5" y="37" width="6" height="3" /></element> + <element ref="button_tone_1" inputtag="kc11" inputmask="0x01"><bounds x="12" y="42" width="15" height="10" /></element> + <element ref="num_9"><bounds xc="19.5" yc="55.5" width="13" height="4" /></element> + + <element ref="led" name="led_tone1.0"><bounds x="31.5" y="37" width="6" height="3" /></element> + <element ref="button_tone_2" inputtag="kc11" inputmask="0x02"><bounds x="27" y="42" width="15" height="10" /></element> + <element ref="num_10"><bounds xc="34.5" yc="55.5" width="13" height="4" /></element> + + <element ref="led" name="led_tone0.0"><bounds x="46.5" y="37" width="6" height="3" /></element> + <element ref="button_tone_3" inputtag="kc11" inputmask="0x04"><bounds x="42" y="42" width="15" height="10" /></element> + <element ref="num_11"><bounds xc="49.5" yc="55.5" width="13" height="4" /></element> + + <element ref="led" name="led_tone0.2"><bounds x="61.5" y="37" width="6" height="3" /></element> + <element ref="button_tone_4" inputtag="kc11" inputmask="0x08"><bounds x="57" y="42" width="15" height="10" /></element> + <element ref="num_12"><bounds xc="64.5" yc="55.5" width="13" height="4" /></element> + + <element ref="led" name="led_tone2.1"><bounds x="76.5" y="37" width="6" height="3" /></element> + <element ref="button_tone_5" inputtag="kc11" inputmask="0x10"><bounds x="72" y="42" width="15" height="10" /></element> + <element ref="num_13"><bounds xc="79.5" yc="55.5" width="13" height="4" /></element> + + <element ref="led" name="led_tone1.1"><bounds x="91.5" y="37" width="6" height="3" /></element> + <element ref="button_tone_6" inputtag="kc11" inputmask="0x20"><bounds x="87" y="42" width="15" height="10" /></element> + <element ref="num_14"><bounds xc="94.5" yc="55.5" width="13" height="4" /></element> + + <element ref="led" name="led_tone0.1"><bounds x="106.5" y="37" width="6" height="3" /></element> + <element ref="button_tone_7" inputtag="kc11" inputmask="0x40"><bounds x="102" y="42" width="15" height="10" /></element> + <element ref="num_15"><bounds xc="109.5" yc="55.5" width="13" height="4" /></element> + + <element ref="led" name="led_tone1.2"><bounds x="121.5" y="37" width="6" height="3" /></element> + <element ref="button_tone_8" inputtag="kc11" inputmask="0x80"><bounds x="117" y="42" width="15" height="10" /></element> + <element ref="num_16"><bounds xc="124.5" yc="55.5" width="13" height="4" /></element> + + <element ref="button_select" inputtag="kc10" inputmask="0x40"><bounds x="143" y="42" width="15" height="10" /></element> + <element ref="blue"><bounds x="133" y="53.5" width="24" height="4" /></element> + <element ref="led_g" name="led_7"><bounds x="147.5" y="54" width="6" height="3" /></element> + <element ref="white"><bounds left="13" right="157" top="58.5" bottom="59.25" /></element> + + <!-- solo/mix/transpose --> + <element ref="white"><bounds x="26.5" y="79" width="0.75" height="6" /></element> + <element ref="white"><bounds x="46.5" y="79" width="0.75" height="6" /></element> + <element ref="white"><bounds x="20" yc="85" width="27.25" height="0.75" /></element> + + <element ref="mono"><bounds x="3" y="82" width="15" height="4" /></element> + <element ref="led" name="led_13"><bounds x="23.5" y="62" width="6" height="3" /></element> + <element ref="button_grey" inputtag="kc10" inputmask="0x01"><bounds x="19" y="67" width="15" height="10" /></element> + <element ref="solo"><bounds xc="26.5" y="77" width="20" height="4" /></element> + <element ref="led" name="led_12"><bounds x="43.5" y="62" width="6" height="3" /></element> + <element ref="button_grey" inputtag="kc10" inputmask="0x02"><bounds x="39" y="67" width="15" height="10" /></element> + <element ref="tone_mix"><bounds xc="46.5" y="77" width="20" height="4" /></element> + <element ref="button_grey" inputtag="kc10" inputmask="0x04"><bounds x="59" y="67" width="15" height="10" /></element> + <element ref="key_transpose"><bounds x="58" y="77" width="30" height="4" /></element> + + <!-- write/midi --> + <element ref="button_grey_red" inputtag="kc10" inputmask="0x08"><bounds x="117" y="67" width="15" height="10" /></element> + <element ref="write"><bounds xc="124.5" y="77" width="20" height="4" /></element> + <element ref="button_grey" inputtag="kc10" inputmask="0x10"><bounds x="143" y="67" width="15" height="10" /></element> + <element ref="midi"><bounds xc="150.5" y="77" width="20" height="4" /></element> + </group> + + <!-- data entry group --> + <group name="data"> + <element ref="black"><bounds x="0" y="0" width="106" height="40" /></element> + <element ref="blue"><bounds xc="53" y="6" width="96" height="31" /></element> + <element ref="black"><bounds xc="53" y="6.75" width="94.5" height="29.5" /></element> + <screen index="0"><bounds xc="53" yc="20" width="85.5" height="16.5" /></screen> + + <element ref="grey"><bounds x="0" y="41" width="106" height="52" /></element> + + <element ref="digital"><bounds xc="53" y="30" width="64" height="5" /></element> + <element ref="data_entry"><bounds xc="53" y="82" width="64" height="5" /></element> + + <!-- value down/up --> + <element ref="value"><bounds xc="26.5" y="62" width="20" height="4" /></element> + <element ref="button_down" inputtag="kc12" inputmask="0x01"><bounds x="9" y="67" width="15" height="10" /></element> + <element ref="save"><bounds xc="16.5" y="77.5" width="10" height="3.5" /></element> + <element ref="button_up" inputtag="kc12" inputmask="0x02"><bounds x="29" y="67" width="15" height="10" /></element> + <element ref="load"><bounds xc="36.5" y="77.5" width="10" height="3.5" /></element> + + <!-- cursor left/right --> + <element ref="cursor"><bounds xc="79.5" y="62" width="20" height="4" /></element> + <element ref="button_left" inputtag="kc12" inputmask="0x04"><bounds x="62" y="67" width="15" height="10" /></element> + <element ref="button_right" inputtag="kc12" inputmask="0x08"><bounds x="82" y="67" width="15" height="10" /></element> + </group> + + <!-- parameter group --> + <group name="parameter"> + <element ref="grey"><bounds x="0" y="0" width="279" height="93" /></element> + + <element ref="parameter"><bounds xc="139.5" y="3" width="64" height="5" /></element> + + <!-- env step down/up --> + <element ref="env_step"><bounds xc="24.5" y="12" width="20" height="4" /></element> + <element ref="button_down" inputtag="kc12" inputmask="0x10"><bounds x="7" y="17" width="15" height="10" /></element> + <element ref="down"><bounds xc="14.5" y="27" width="20" height="4" /></element> + <element ref="button_up" inputtag="kc12" inputmask="0x20"><bounds x="27" y="17" width="15" height="10" /></element> + <element ref="up"><bounds xc="34.5" y="27" width="20" height="4" /></element> + + <!-- sustain/end --> + <element ref="env_point"><bounds xc="24.5" y="37" width="20" height="4" /></element> + <element ref="button_grey" inputtag="kc12" inputmask="0x40"><bounds x="7" y="42" width="15" height="10" /></element> + <element ref="sustain"><bounds xc="14.5" y="52" width="20" height="4" /></element> + <element ref="button_grey" inputtag="kc12" inputmask="0x80"><bounds x="27" y="42" width="15" height="10" /></element> + <element ref="end"><bounds xc="34.5" y="52" width="20" height="4" /></element> + + <!-- initialize --> + <element ref="button_grey_red" inputtag="kc14" inputmask="0x01"><bounds x="17" y="67" width="15" height="10" /></element> + <element ref="initialize"><bounds xc="24.5" y="77" width="20" height="4" /></element> + + <!-- vibrato, octave --> + <element ref="button_tone" inputtag="kc13" inputmask="0x02"><bounds x="53" y="30" width="15" height="10" /></element> + <element ref="vibrato"><bounds xc="60.5" y="40" width="20" height="4" /></element> + <element ref="button_tone" inputtag="kc14" inputmask="0x02"><bounds x="53" y="67" width="15" height="10" /></element> + <element ref="octave"><bounds xc="60.5" y="77" width="20" height="4" /></element> + + <!-- DCO 1 --> + <element ref="dco1"><bounds xc="95.5" y="15" width="40" height="5" /></element> + <element ref="led" name="led_env2.3"><bounds x="84.5" y="25" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc13" inputmask="0x04"><bounds x="80" y="30" width="15" height="10" /></element> + <element ref="wave_form"><bounds xc="87.5" y="40" width="20" height="4" /></element> + <element ref="led" name="led_env1.3"><bounds x="100.5" y="25" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc13" inputmask="0x08"><bounds x="96" y="30" width="15" height="10" /></element> + <element ref="env"><bounds xc="103.5" y="40" width="10" height="4" /></element> + + <!-- DCW 1 --> + <element ref="dcw1"><bounds xc="138.5" y="15" width="40" height="5" /></element> + <element ref="led" name="led_env0.3"><bounds x="127.5" y="25" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc13" inputmask="0x10"><bounds x="123" y="30" width="15" height="10" /></element> + <element ref="key_follow"><bounds xc="130.5" y="40" width="20" height="4" /></element> + <element ref="led" name="led_env2.2"><bounds x="143.5" y="25" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc13" inputmask="0x20"><bounds x="139" y="30" width="15" height="10" /></element> + <element ref="env"><bounds xc="146.5" y="40" width="10" height="4" /></element> + + <!-- DCA 1 --> + <element ref="dca1"><bounds xc="181.5" y="15" width="40" height="5" /></element> + <element ref="led" name="led_env1.2"><bounds x="170.5" y="25" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc13" inputmask="0x40"><bounds x="166" y="30" width="15" height="10" /></element> + <element ref="key_follow"><bounds xc="173.5" y="40" width="20" height="4" /></element> + <element ref="led" name="led_env0.2"><bounds x="186.5" y="25" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc13" inputmask="0x80"><bounds x="182" y="30" width="15" height="10" /></element> + <element ref="env"><bounds xc="189.5" y="40" width="10" height="4" /></element> + + <!-- DCO 2 --> + <element ref="dco2"><bounds xc="95.5" y="52" width="40" height="5" /></element> + <element ref="led" name="led_env2.1"><bounds x="84.5" y="62" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc14" inputmask="0x04"><bounds x="80" y="67" width="15" height="10" /></element> + <element ref="wave_form"><bounds xc="87.5" y="77" width="20" height="4" /></element> + <element ref="led" name="led_env1.1"><bounds x="100.5" y="62" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc14" inputmask="0x08"><bounds x="96" y="67" width="15" height="10" /></element> + <element ref="env"><bounds xc="103.5" y="77" width="10" height="4" /></element> + + <!-- DCW 2 --> + <element ref="dcw2"><bounds xc="138.5" y="52" width="40" height="5" /></element> + <element ref="led" name="led_env0.1"><bounds x="127.5" y="62" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc14" inputmask="0x10"><bounds x="123" y="67" width="15" height="10" /></element> + <element ref="key_follow"><bounds xc="130.5" y="77" width="20" height="4" /></element> + <element ref="led" name="led_env2.0"><bounds x="143.5" y="62" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc14" inputmask="0x20"><bounds x="139" y="67" width="15" height="10" /></element> + <element ref="env"><bounds xc="146.5" y="77" width="10" height="4" /></element> + + <!-- DCA 2 --> + <element ref="dca2"><bounds xc="181.5" y="52" width="40" height="5" /></element> + <element ref="led" name="led_env1.0"><bounds x="170.5" y="62" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc14" inputmask="0x40"><bounds x="166" y="67" width="15" height="10" /></element> + <element ref="key_follow"><bounds xc="173.5" y="77" width="20" height="4" /></element> + <element ref="led" name="led_env0.0"><bounds x="186.5" y="62" width="6" height="3" /></element> + <element ref="button_tone" inputtag="kc14" inputmask="0x80"><bounds x="182" y="67" width="15" height="10" /></element> + <element ref="env"><bounds xc="189.5" y="77" width="10" height="4" /></element> + + <!-- detune, line select --> + <element ref="white"><bounds xc="275" yc="45" width="0.75" height="37.75" /></element> + <element ref="white"><bounds left="261.5" right="275" yc="26.5" height="0.75" /></element> + <element ref="white"><bounds left="237.5" right="275" yc="63.5" height="0.75" /></element> + + <element ref="button_tone" inputtag="kc15" inputmask="0x01"><bounds x="212" y="30" width="15" height="10" /></element> + <element ref="detune"><bounds xc="219.5" y="40" width="20" height="4" /></element> + <element ref="line1"><bounds xc="243.5" y="20" width="10" height="4" /></element> + <element ref="led" name="led_6"><bounds x="240.5" y="25" width="6" height="3" /></element> + <element ref="line2"><bounds xc="252.5" y="20" width="10" height="4" /></element> + <element ref="led" name="led_5"><bounds x="249.5" y="25" width="6" height="3" /></element> + <element ref="line12"><bounds xc="261.5" y="20" width="10" height="4" /></element> + <element ref="led" name="led_4"><bounds x="258.5" y="25" width="6" height="3" /></element> + <element ref="line11"><bounds xc="270.5" y="20" width="10" height="4" /></element> + <element ref="led" name="led_3"><bounds x="267.5" y="25" width="6" height="3" /></element> + <element ref="button_grey_red" inputtag="kc15" inputmask="0x02"><bounds x="250" y="30" width="15" height="10" /></element> + <element ref="line_select"><bounds xc="257.5" y="40" width="20" height="4" /></element> + + <!-- ring/noise modulation --> + <element ref="led" name="led_1"><bounds x="234.5" y="62" width="6" height="3" /></element> + <element ref="button_grey" inputtag="kc15" inputmask="0x04"><bounds x="230" y="67" width="15" height="10" /></element> + <element ref="ring"><bounds xc="237.5" y="77" width="20" height="4" /></element> + <element ref="led" name="led_2"><bounds x="254.5" y="62" width="6" height="3" /></element> + <element ref="button_grey" inputtag="kc15" inputmask="0x08"><bounds x="250" y="67" width="15" height="10" /></element> + <element ref="noise"><bounds xc="257.5" y="77" width="20" height="4" /></element> + <element ref="modulation"><bounds xc="247.5" y="82" width="30" height="4" /></element> + </group> + + <!-- keyboard primitives --> + <element name="keyfill"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element> + <element name="whitekey" defstate="0"> + <rect state="0"><bounds x="0" y="0" width="79" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="1"><bounds x="0" y="0" width="79" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect> + </element> + <element name="whitekey-l" defstate="0"> + <rect state="0"><bounds x="0" y="0" width="45" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="0"><bounds x="0" y="252" width="79" height="172" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="1"><bounds x="0" y="0" width="45" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect> + <rect state="1"><bounds x="0" y="252" width="79" height="172" /><color red="0.9" green="0.9" blue="0.9" /></rect> + </element> + <element name="whitekey-m" defstate="0"> + <rect state="0"><bounds x="13" y="0" width="53" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="0"><bounds x="0" y="252" width="79" height="172" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="1"><bounds x="13" y="0" width="53" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect> + <rect state="1"><bounds x="0" y="252" width="79" height="172" /><color red="0.9" green="0.9" blue="0.9" /></rect> + </element> + <element name="whitekey-lm" defstate="0"> + <rect state="0"><bounds x="10" y="0" width="44" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="0"><bounds x="0" y="252" width="79" height="172" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="1"><bounds x="10" y="0" width="44" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect> + <rect state="1"><bounds x="0" y="252" width="79" height="172" /><color red="0.9" green="0.9" blue="0.9" /></rect> + </element> + <element name="whitekey-rm" defstate="0"> + <rect state="0"><bounds x="22" y="0" width="44" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="0"><bounds x="0" y="252" width="79" height="172" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="1"><bounds x="22" y="0" width="44" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect> + <rect state="1"><bounds x="0" y="252" width="79" height="172" /><color red="0.9" green="0.9" blue="0.9" /></rect> + </element> + <element name="whitekey-r" defstate="0"> + <rect state="0"><bounds x="34" y="0" width="45" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="0"><bounds x="0" y="252" width="79" height="172" /><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="1"><bounds x="34" y="0" width="45" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect> + <rect state="1"><bounds x="0" y="252" width="79" height="172" /><color red="0.9" green="0.9" blue="0.9" /></rect> + </element> + <element name="blackkey" defstate="0"> + <rect state="0"><bounds x="0" y="0" width="44" height="252" /><color red="0.0" green="0.0" blue="0.0" /></rect> + <rect state="0"><bounds x="4" y="0" width="36" height="248" /><color red="0.1" green="0.1" blue="0.1" /></rect> + <rect state="1"><bounds x="0" y="0" width="44" height="252" /><color red="0.1" green="0.1" blue="0.1" /></rect> + <rect state="1"><bounds x="4" y="0" width="36" height="248" /><color red="0.1" green="0.1" blue="0.1" /></rect> + </element> + + <!-- keyboard group --> + <group name="keyboard"> + <element ref="keyfill"><bounds x="72" y="98" width="2396" height="444" /></element> + + <!-- octave 1 --> + <element ref="blackkey" inputtag="kc0" inputmask="0x02"><bounds x="130" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc0" inputmask="0x08"><bounds x="233" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc1" inputmask="0x01"><bounds x="373" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc1" inputmask="0x04"><bounds x="467" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc1" inputmask="0x10"><bounds x="561" y="108" width="44" height="252" /></element> + <element ref="whitekey-l" inputtag="kc0" inputmask="0x01"><bounds x="82" y="108" width="79" height="424" /></element> + <element ref="whitekey-m" inputtag="kc0" inputmask="0x04"><bounds x="164" y="108" width="79" height="424" /></element> + <element ref="whitekey-r" inputtag="kc0" inputmask="0x10"><bounds x="246" y="108" width="79" height="424" /></element> + <element ref="whitekey-l" inputtag="kc0" inputmask="0x20"><bounds x="328" y="108" width="79" height="424" /></element> + <element ref="whitekey-lm" inputtag="kc1" inputmask="0x02"><bounds x="410" y="108" width="79" height="424" /></element> + <element ref="whitekey-rm" inputtag="kc1" inputmask="0x08"><bounds x="492" y="108" width="79" height="424" /></element> + <element ref="whitekey-r" inputtag="kc1" inputmask="0x20"><bounds x="574" y="108" width="79" height="424" /></element> + + <!-- octave 2 --> + <element ref="blackkey" inputtag="kc2" inputmask="0x02"><bounds x="704" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc2" inputmask="0x08"><bounds x="807" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc3" inputmask="0x01"><bounds x="947" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc3" inputmask="0x04"><bounds x="1041" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc3" inputmask="0x10"><bounds x="1135" y="108" width="44" height="252" /></element> + <element ref="whitekey-l" inputtag="kc2" inputmask="0x01"><bounds x="656" y="108" width="79" height="424" /></element> + <element ref="whitekey-m" inputtag="kc2" inputmask="0x04"><bounds x="738" y="108" width="79" height="424" /></element> + <element ref="whitekey-r" inputtag="kc2" inputmask="0x10"><bounds x="820" y="108" width="79" height="424" /></element> + <element ref="whitekey-l" inputtag="kc2" inputmask="0x20"><bounds x="902" y="108" width="79" height="424" /></element> + <element ref="whitekey-lm" inputtag="kc3" inputmask="0x02"><bounds x="984" y="108" width="79" height="424" /></element> + <element ref="whitekey-rm" inputtag="kc3" inputmask="0x08"><bounds x="1066" y="108" width="79" height="424" /></element> + <element ref="whitekey-r" inputtag="kc3" inputmask="0x20"><bounds x="1148" y="108" width="79" height="424" /></element> + + <!-- octave 3 --> + <element ref="blackkey" inputtag="kc4" inputmask="0x02"><bounds x="1278" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc4" inputmask="0x08"><bounds x="1381" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc5" inputmask="0x01"><bounds x="1521" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc5" inputmask="0x04"><bounds x="1615" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc5" inputmask="0x10"><bounds x="1709" y="108" width="44" height="252" /></element> + <element ref="whitekey-l" inputtag="kc4" inputmask="0x01"><bounds x="1230" y="108" width="79" height="424" /></element> + <element ref="whitekey-m" inputtag="kc4" inputmask="0x04"><bounds x="1312" y="108" width="79" height="424" /></element> + <element ref="whitekey-r" inputtag="kc4" inputmask="0x10"><bounds x="1394" y="108" width="79" height="424" /></element> + <element ref="whitekey-l" inputtag="kc4" inputmask="0x20"><bounds x="1476" y="108" width="79" height="424" /></element> + <element ref="whitekey-lm" inputtag="kc5" inputmask="0x02"><bounds x="1558" y="108" width="79" height="424" /></element> + <element ref="whitekey-rm" inputtag="kc5" inputmask="0x08"><bounds x="1640" y="108" width="79" height="424" /></element> + <element ref="whitekey-r" inputtag="kc5" inputmask="0x20"><bounds x="1722" y="108" width="79" height="424" /></element> + + <!-- octave 4 --> + <element ref="blackkey" inputtag="kc6" inputmask="0x02"><bounds x="1852" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc6" inputmask="0x08"><bounds x="1955" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc7" inputmask="0x01"><bounds x="2095" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc7" inputmask="0x04"><bounds x="2189" y="108" width="44" height="252" /></element> + <element ref="blackkey" inputtag="kc7" inputmask="0x10"><bounds x="2283" y="108" width="44" height="252" /></element> + <element ref="whitekey-l" inputtag="kc6" inputmask="0x01"><bounds x="1804" y="108" width="79" height="424" /></element> + <element ref="whitekey-m" inputtag="kc6" inputmask="0x04"><bounds x="1886" y="108" width="79" height="424" /></element> + <element ref="whitekey-r" inputtag="kc6" inputmask="0x10"><bounds x="1968" y="108" width="79" height="424" /></element> + <element ref="whitekey-l" inputtag="kc6" inputmask="0x20"><bounds x="2050" y="108" width="79" height="424" /></element> + <element ref="whitekey-lm" inputtag="kc7" inputmask="0x02"><bounds x="2132" y="108" width="79" height="424" /></element> + <element ref="whitekey-rm" inputtag="kc7" inputmask="0x08"><bounds x="2214" y="108" width="79" height="424" /></element> + <element ref="whitekey-r" inputtag="kc7" inputmask="0x20"><bounds x="2296" y="108" width="79" height="424" /></element> + + <!-- final key --> + <element ref="whitekey" inputtag="kc8" inputmask="0x01"><bounds x="2378" y="108" width="79" height="424" /></element> + </group> + + <group name="left"> + <group ref="effect"><bounds x="0" y="0" width="64" height="93" /></group> + <group ref="programmer"><bounds x="58" y="0" width="174" height="93" /></group> + <element ref="blue"><bounds left="1" right="231" top="88" bottom="91" /></element> + <group ref="data"><bounds x="234" y="0" width="106" height="93" /></group> + <element ref="blue"><bounds left="235" right="339" top="88" bottom="91" /></element> + </group> + + <group name="right"> + <group ref="parameter"><bounds x="0" y="0" width="278" height="93" /></group> + <element ref="blue"><bounds left="1" right="270" top="88" bottom="91" /></element> + </group> + + <group name="tune"> + <element ref="master_tune"><bounds xc="16.5" y="0" width="30" height="4" /></element> + <element ref="button_down" inputtag="kc15" inputmask="0x10"><bounds x="0" y="5" width="13" height="8" /></element> + <element ref="button_up" inputtag="kc15" inputmask="0x20"><bounds x="20" y="5" width="13" height="8" /></element> + </group> + + <group name="power"> + <element ref="led" name="led_0"><bounds xc="5.5" y="0" width="6" height="3" /></element> + <element ref="button_power" inputtag="PB" inputmask="0x80"><bounds x="0" y="15" width="11" height="22" /></element> + + <element ref="power"><bounds xc="5.5" y="38" width="20" height="5" /></element> + </group> + + <view name="Keyboard"> + <bounds x="0" y="0" width="656" height="202" /> + <element ref="bg"><bounds x="0" y="21" width="656" height="181" /></element> + <element ref="grey"><bounds x="0" y="23" width="200" height="179" /></element> + <element ref="grey"><bounds x="378" y="23" width="278" height="179" /></element> + + <group ref="left"><bounds x="36" y="23" width="340" height="93" /></group> + <group ref="right"><bounds x="378" y="23" width="278" height="93" /></group> + + <group ref="keyboard"><bounds xc="328" y="116" width="584" height="86" /></group> + + <group ref="tune"><bounds x="602" yc="10" width="33" height="13" /></group> + <group ref="power"><bounds xc="638" y="130" width="20" height="43" /></group> + </view> + + <view name="No Keyboard (Parameters at Bottom)"> + <bounds x="0" y="21" width="340" height="190" /> + <element ref="bg"><bounds x="0" y="21" width="340" height="190" /></element> + <element ref="grey"><bounds x="0" y="118" width="60" height="93" /></element> + + <group ref="left"><bounds x="0" y="23" width="340" height="93" /></group> + <group ref="right"><bounds x="62" y="118" width="278" height="93" /></group> + <group ref="power"><bounds xc="31" y="130" width="20" height="43" /></group> + + <element ref="black"><bounds x="0" y="195" width="60" height="16" /></element> + <group ref="tune"><bounds xc="32" yc="203" width="33" height="13" /></group> + </view> + + <view name="No Keyboard (Parameters at Top)"> + <bounds x="0" y="21" width="340" height="190" /> + <element ref="bg"><bounds x="0" y="21" width="340" height="190" /></element> + <element ref="grey"><bounds x="0" y="23" width="60" height="93" /></element> + + <group ref="left"><bounds x="0" y="118" width="340" height="93" /></group> + <group ref="right"><bounds x="62" y="23" width="278" height="93" /></group> + <group ref="power"><bounds xc="31" y="50" width="20" height="43" /></group> + + <element ref="black"><bounds x="0" y="20" width="60" height="16" /></element> + <group ref="tune"><bounds xc="32" yc="28" width="33" height="13" /></group> </view> </mamelayout> |