diff --git a/.gitattributes b/.gitattributes
index 497d87f3591..9a8979dd92c 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -7255,6 +7255,8 @@ src/mess/machine/c64/mikro_assembler.c svneol=native#text/plain
src/mess/machine/c64/mikro_assembler.h svneol=native#text/plain
src/mess/machine/c64/multiscreen.c svneol=native#text/plain
src/mess/machine/c64/multiscreen.h svneol=native#text/plain
+src/mess/machine/c64/music64.c svneol=native#text/plain
+src/mess/machine/c64/music64.h svneol=native#text/plain
src/mess/machine/c64/neoram.c svneol=native#text/plain
src/mess/machine/c64/neoram.h svneol=native#text/plain
src/mess/machine/c64/ocean.c svneol=native#text/plain
diff --git a/hash/c64_cart.xml b/hash/c64_cart.xml
index bbe5b94f736..dc483cae2db 100644
--- a/hash/c64_cart.xml
+++ b/hash/c64_cart.xml
@@ -6932,4 +6932,16 @@
+
+ Wersiboard Music 64
+ 1985
+ Wersi
+
+
+
+
+
+
+
+
diff --git a/hash/c64_cass.xml b/hash/c64_cass.xml
index 4b145e1e0a7..d0230c2cb81 100644
--- a/hash/c64_cass.xml
+++ b/hash/c64_cass.xml
@@ -15,4 +15,43 @@
+
+ CMK 49 Computer Musical Keyboard
+ 198?
+ Siel
+
+
+
+
+
+
+
+
+
+
+ Mono-64
+ 198?
+ Novel International
+
+
+
+
+
+
+
+
+
+
+ Poly-64
+ 198?
+ Novel International
+
+
+
+
+
+
+
+
+
diff --git a/hash/c64_flop.xml b/hash/c64_flop.xml
index 2825037e75f..4d23f8d723e 100644
--- a/hash/c64_flop.xml
+++ b/hash/c64_flop.xml
@@ -1033,6 +1033,34 @@
+
+ Music 64
+ 198?
+ Novel International
+
+
+
+
+
+
+
+
+
+
+
+ CMK 49 Computer Musical Keyboard
+ 198?
+ Siel
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mess/machine/c64/music64.c b/src/mess/machine/c64/music64.c
new file mode 100644
index 00000000000..86c3ba848ae
--- /dev/null
+++ b/src/mess/machine/c64/music64.c
@@ -0,0 +1,239 @@
+/**********************************************************************
+
+ Wersi Wersiboard Music 64 / Siel CMK 49 Keyboard emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+**********************************************************************/
+
+/*
+5 PRINT "MUSIC 64 & CMK 49 TEST"
+6 PRINT " BY CARLO MERLANO"
+7 PRINT "PLAY THE MUSIC KEYBOARD!"
+8 F1=65.4:POKE 54296,15
+9 POKE 54277,25:POKE 54278,68
+10 IF PE=255 THEN POKE 54276,0
+20 FOR I=1 TO 8
+30 PO=57087+I:PE=PEEK(PO)
+40 IF PE<255 THEN GOSUB 100
+50 NEXT I
+60 GOTO 10
+100 KK=LOG(255-PE)/LOG(2)+8*I-7
+110 FKK=(2^(1/12))^(KK-1)*F1
+120 N=FKK*16.3835
+130 NHI=INT(N/256):NLO=N-NHI*256
+140 POKE 54276,17
+150 POKE 54273,NHI:POKE 54272,NLO
+160 I=0
+170 RETURN
+*/
+
+#include "music64.h"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type C64_MUSIC64 = &device_creator;
+
+
+//-------------------------------------------------
+// MACHINE_CONFIG_FRAGMENT( c64_music64 )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( c64_music64 )
+ MCFG_C64_PASSTHRU_EXPANSION_SLOT_ADD()
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor c64_music64_cartridge_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( c64_music64 );
+}
+
+
+//-------------------------------------------------
+// INPUT_PORTS( c64_music64 )
+//-------------------------------------------------
+
+static INPUT_PORTS_START( c64_music64 )
+ PORT_START("KB0")
+ 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("D")
+ 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( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F#2")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G2")
+
+ PORT_START("KB1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G#2")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A3")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A#3")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("B3")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C3")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C#3")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D3")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D#3")
+
+ PORT_START("KB2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("E3")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F3")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F#3")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G3")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G#3")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A4")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A#4")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("B4")
+
+ PORT_START("KB3")
+ 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( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F#4")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G4")
+
+ PORT_START("KB4")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G#4")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A5")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A#5")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("B5")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C5")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C#5")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D5")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D#5")
+
+ PORT_START("KB5")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("E5")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F#5")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G5")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G#5")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A6")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A#6")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("B6")
+
+ PORT_START("KB6")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C6")
+ PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor c64_music64_cartridge_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( c64_music64 );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// c64_music64_cartridge_device - constructor
+//-------------------------------------------------
+
+c64_music64_cartridge_device::c64_music64_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, C64_MUSIC64, "C64 Music 64 cartridge", tag, owner, clock, "c64_music64", __FILE__),
+ device_c64_expansion_card_interface(mconfig, *this),
+ m_exp(*this, C64_EXPANSION_SLOT_TAG),
+ m_kb0(*this, "KB0"),
+ m_kb1(*this, "KB1"),
+ m_kb2(*this, "KB2"),
+ m_kb3(*this, "KB3"),
+ m_kb4(*this, "KB4"),
+ m_kb5(*this, "KB5"),
+ m_kb6(*this, "KB6")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void c64_music64_cartridge_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void c64_music64_cartridge_device::device_reset()
+{
+}
+
+
+//-------------------------------------------------
+// c64_cd_r - cartridge data read
+//-------------------------------------------------
+
+UINT8 c64_music64_cartridge_device::c64_cd_r(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+{
+ data = m_exp->cd_r(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+
+ if (!io2)
+ {
+ switch (offset & 0x07)
+ {
+ case 0x00: data = m_kb0->read(); break;
+ case 0x01: data = m_kb1->read(); break;
+ case 0x02: data = m_kb2->read(); break;
+ case 0x03: data = m_kb3->read(); break;
+ case 0x04: data = m_kb4->read(); break;
+ case 0x05: data = m_kb5->read(); break;
+ case 0x06: data = m_kb6->read(); break;
+ }
+ }
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// c64_cd_w - cartridge data write
+//-------------------------------------------------
+
+void c64_music64_cartridge_device::c64_cd_w(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+{
+ m_exp->cd_w(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+}
+
+
+//-------------------------------------------------
+// c64_game_r - GAME read
+//-------------------------------------------------
+
+int c64_music64_cartridge_device::c64_game_r(offs_t offset, int sphi2, int ba, int rw, int hiram)
+{
+ return m_exp->game_r(offset, sphi2, ba, rw, hiram);
+}
+
+
+//-------------------------------------------------
+// c64_exrom_r - EXROM read
+//-------------------------------------------------
+
+int c64_music64_cartridge_device::c64_exrom_r(offs_t offset, int sphi2, int ba, int rw, int hiram)
+{
+ return m_exp->exrom_r(offset, sphi2, ba, rw, hiram);
+}
diff --git a/src/mess/machine/c64/music64.h b/src/mess/machine/c64/music64.h
new file mode 100644
index 00000000000..e5bcfdb46c6
--- /dev/null
+++ b/src/mess/machine/c64/music64.h
@@ -0,0 +1,65 @@
+/**********************************************************************
+
+ Wersi Wersiboard Music 64 / Siel CMK 49 Keyboard emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+**********************************************************************/
+
+#pragma once
+
+#ifndef __MUSIC64__
+#define __MUSIC64__
+
+#include "emu.h"
+#include "machine/c64/exp.h"
+#include "machine/cbmipt.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> c64_music64_cartridge_device
+
+class c64_music64_cartridge_device : public device_t,
+ public device_c64_expansion_card_interface
+{
+public:
+ // construction/destruction
+ c64_music64_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const;
+ virtual ioport_constructor device_input_ports() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_c64_expansion_card_interface overrides
+ virtual UINT8 c64_cd_r(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2);
+ virtual void c64_cd_w(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2);
+ virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw, int hiram);
+ virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw, int hiram);
+
+private:
+ required_device m_exp;
+ required_ioport m_kb0;
+ required_ioport m_kb1;
+ required_ioport m_kb2;
+ required_ioport m_kb3;
+ required_ioport m_kb4;
+ required_ioport m_kb5;
+ required_ioport m_kb6;
+};
+
+
+// device type definition
+extern const device_type C64_MUSIC64;
+
+
+#endif
diff --git a/src/mess/machine/cbmipt.c b/src/mess/machine/cbmipt.c
index 500a555dede..680a403ef03 100644
--- a/src/mess/machine/cbmipt.c
+++ b/src/mess/machine/cbmipt.c
@@ -1133,6 +1133,7 @@ SLOT_INTERFACE_START( c64_expansion_cards )
SLOT_INTERFACE("midipp", C64_MIDI_PASSPORT)
SLOT_INTERFACE("midisci", C64_MIDI_SCI)
SLOT_INTERFACE("midisiel", C64_MIDI_SIEL)
+ SLOT_INTERFACE("music64", C64_MUSIC64)
SLOT_INTERFACE("neoram", C64_NEORAM)
SLOT_INTERFACE("reu1700", C64_REU1700)
SLOT_INTERFACE("reu1750", C64_REU1750)
diff --git a/src/mess/machine/cbmipt.h b/src/mess/machine/cbmipt.h
index ed59cb998b8..890816577e7 100644
--- a/src/mess/machine/cbmipt.h
+++ b/src/mess/machine/cbmipt.h
@@ -42,6 +42,7 @@
#include "machine/c64/midi_siel.h"
#include "machine/c64/mikro_assembler.h"
#include "machine/c64/multiscreen.h"
+#include "machine/c64/music64.h"
#include "machine/c64/neoram.h"
#include "machine/c64/ocean.h"
#include "machine/c64/pagefox.h"
diff --git a/src/mess/mess.mak b/src/mess/mess.mak
index da48b085166..c06f009462c 100644
--- a/src/mess/mess.mak
+++ b/src/mess/mess.mak
@@ -1114,6 +1114,7 @@ $(MESSOBJ)/cbm.a: \
$(MESS_MACHINE)/c64/midi_siel.o \
$(MESS_MACHINE)/c64/mikro_assembler.o \
$(MESS_MACHINE)/c64/multiscreen.o \
+ $(MESS_MACHINE)/c64/music64.o \
$(MESS_MACHINE)/c64/neoram.o\
$(MESS_MACHINE)/c64/ocean.o \
$(MESS_MACHINE)/c64/pagefox.o \