Previous 199869 Revisions Next

r20256 Monday 14th January, 2013 at 03:10:52 UTC by R. Belmont
First pass on MIDI out support [R. Belmont]
[src/emu]emu.mak
[src/emu/imagedev]midiout.c* midiout.h*
[src/mess]mess.mak
[src/mess/drivers]esq5505.c
[src/mess/machine]midioutport.c* midioutport.h*
[src/osd]osdcore.h
[src/osd/portmedia]pmmidi.c

trunk/src/osd/osdcore.h
r20255r20256
897897void osd_close_midi_channel(osd_midi_device *dev);
898898bool osd_poll_midi_channel(osd_midi_device *dev);
899899int osd_read_midi_channel(osd_midi_device *dev, UINT8 *pOut);
900void osd_write_midi_channel(osd_midi_device *dev, UINT8 data);
900901
901902/***************************************************************************
902903    UNCATEGORIZED INTERFACES
trunk/src/osd/portmedia/pmmidi.c
r20255r20256
1616   PortMidiStream *pmStream;
1717   PmEvent rx_evBuf[20];      // up to 20 events
1818   #endif
19   UINT8 xmit_in[3]; // Pm_Messages mean we can at most have 3 residue bytes
19   UINT8 xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes
20   int xmit_cnt;
2021};
2122
2223void osd_list_midi_devices(void)
r20255r20256
234235   #endif
235236}
236237
238void osd_write_midi_channel(osd_midi_device *dev, UINT8 data)
239{
240   #ifndef DISABLE_MIDI
241   int bytes_needed = 0;
242
243   dev->xmit_in[dev->xmit_cnt++] = data;
244
245   // are we there yet?
246   switch ((dev->xmit_in[0]>>4) & 0xf)
247   {
248      case 0xc:   // 2-byte messages
249      case 0xd:
250         bytes_needed = 2;
251         break;
252
253      case 0xf:   // system common
254         switch (dev->xmit_in[0] & 0xf)
255         {
256            case 0:   // System Exclusive
257               printf("No SEx please!\n");
258               break;
259
260            case 7:   // End of System Exclusive
261               bytes_needed = 1;
262               break;
263
264            case 2:   // song pos
265            case 3:   // song select
266               bytes_needed = 3;
267               break;
268
269            default:   // all other defined Fx messages are 1 byte
270               bytes_needed = 1;
271               break;
272         }
273         break;
274
275      default:
276         bytes_needed = 3;
277         break;
278   }
279
280   if (dev->xmit_cnt == bytes_needed)
281   {
282      PmEvent ev;
283      ev.message = Pm_Message(dev->xmit_in[0], dev->xmit_in[1], dev->xmit_in[2]);
284      ev.timestamp = 0;   // use the current time
285      Pm_Write(dev->pmStream, &ev, 1);
286      dev->xmit_cnt = 0;
287   }
288
289   #endif
290}
291
237292void osd_init_midi(void)
238293{
239294   #ifndef DISABLE_MIDI
trunk/src/emu/emu.mak
r20255r20256
346346   $(EMUIMAGEDEV)/floppy.o     \
347347   $(EMUIMAGEDEV)/harddriv.o   \
348348   $(EMUIMAGEDEV)/midiin.o     \
349   $(EMUIMAGEDEV)/midiout.o     \
349350   $(EMUIMAGEDEV)/printer.o    \
350351   $(EMUIMAGEDEV)/serial.o     \
351352   $(EMUIMAGEDEV)/snapquik.o   \
trunk/src/emu/imagedev/midiout.c
r0r20256
1/*********************************************************************
2
3    midiout.c
4
5    MIDI Out image device and serial receiver
6
7*********************************************************************/
8
9#include "emu.h"
10#include "midiout.h"
11
12/***************************************************************************
13    IMPLEMENTATION
14***************************************************************************/
15
16const device_type MIDIOUT = &device_creator<midiout_device>;
17
18/*-------------------------------------------------
19    ctor
20-------------------------------------------------*/
21
22midiout_device::midiout_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
23   : device_t(mconfig, MIDIOUT, "MIDI Out image device", tag, owner, clock),
24   device_image_interface(mconfig, *this),
25      device_serial_interface(mconfig, *this)
26{
27}
28
29/*-------------------------------------------------
30    device_start
31-------------------------------------------------*/
32
33void midiout_device::device_start()
34{
35}
36
37void midiout_device::device_reset()
38{
39   // we don't Tx, we Rx at 31250 8-N-1
40   set_rcv_rate(31250);
41   set_tra_rate(0);
42   set_data_frame(8, 1, SERIAL_PARITY_NONE);
43}
44
45/*-------------------------------------------------
46    device_config_complete                                   
47-------------------------------------------------*/
48
49void midiout_device::device_config_complete(void)
50{
51   update_names();
52}
53
54/*-------------------------------------------------
55    call_load
56-------------------------------------------------*/
57
58bool midiout_device::call_load(void)
59{
60   m_midi = osd_open_midi_output(filename());
61
62   if (m_midi == NULL)
63   {
64      return IMAGE_INIT_FAIL;
65   }
66
67   return IMAGE_INIT_PASS;
68}
69
70/*-------------------------------------------------
71    call_unload
72-------------------------------------------------*/
73
74void midiout_device::call_unload(void)
75{
76   osd_close_midi_channel(m_midi);
77}
78
79void midiout_device::rcv_complete()    // Rx completed receiving byte
80{
81   receive_register_extract();
82   UINT8 data = get_received_char();
83
84   osd_write_midi_channel(m_midi, data);
85}
86
87void midiout_device::input_callback(UINT8 state)
88{
89}
90
trunk/src/emu/imagedev/midiout.h
r0r20256
1/*********************************************************************
2
3    midiout.h
4
5    MIDI Out image device
6
7*********************************************************************/
8
9#ifndef __MIDIOUT_H__
10#define __MIDIOUT_H__
11
12#include "image.h"
13
14/***************************************************************************
15    CONSTANTS
16***************************************************************************/
17
18
19#define MCFG_MIDIOUT_ADD(_tag) \
20   MCFG_DEVICE_ADD(_tag, MIDIOUT, 0)
21
22
23/***************************************************************************
24    TYPE DEFINITIONS
25***************************************************************************/
26
27class midiout_device :    public device_t,
28                  public device_image_interface,
29                  public device_serial_interface
30{
31public:
32   // construction/destruction
33   midiout_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
34
35   // image-level overrides
36   virtual bool call_load();
37   virtual void call_unload();
38
39   // image device
40   virtual iodevice_t image_type() const { return IO_MIDIOUT; }
41   virtual bool is_readable()  const { return 0; }
42   virtual bool is_writeable() const { return 1; }
43   virtual bool is_creatable() const { return 0; }
44   virtual bool must_be_loaded() const { return 0; }
45   virtual bool is_reset_on_load() const { return 0; }
46   virtual const char *file_extensions() const { return "mid"; }
47   virtual bool core_opens_image_file() const { return FALSE; }
48   virtual const option_guide *create_option_guide() const { return NULL; }
49
50   virtual void tx(UINT8 state) { check_for_start(state); }
51
52protected:
53   // device-level overrides
54   virtual void device_start();
55   virtual void device_reset();
56
57   virtual void device_config_complete();
58
59   // serial overrides
60   virtual void rcv_complete();    // Rx completed receiving byte
61   void input_callback(UINT8 state);
62
63private:
64   osd_midi_device *m_midi;
65};
66
67// device type definition
68extern const device_type MIDIOUT;
69
70// device iterator
71typedef device_type_iterator<&device_creator<midiout_device>, midiout_device> midiout_device_iterator;
72
73#endif /* __MIDIOUT_H__ */
trunk/src/mess/machine/midioutport.c
r0r20256
1/*********************************************************************
2
3    midioutport.c
4
5    MIDI Out serial port - glues the image device to the pluggable serial port
6
7*********************************************************************/
8
9#include "machine/midioutport.h"
10
11const device_type MIDIOUT_PORT = &device_creator<midiout_port_device>;
12
13midiout_port_device::midiout_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
14   : device_t(mconfig, MIDIOUT_PORT, "MIDI Out port", tag, owner, clock),
15      device_serial_port_interface(mconfig, *this),
16      m_midiout(*this, "midiout")
17{
18}
19
20static MACHINE_CONFIG_FRAGMENT(midiout_port_config)
21   MCFG_MIDIOUT_ADD("midiout")
22MACHINE_CONFIG_END
23
24machine_config_constructor midiout_port_device::device_mconfig_additions() const
25{
26   return MACHINE_CONFIG_NAME(midiout_port_config);
27}
trunk/src/mess/machine/midioutport.h
r0r20256
1/*********************************************************************
2
3    midioutport.h
4
5    MIDI Out serial port - glues the image device to the pluggable serial port
6
7*********************************************************************/
8
9#ifndef _MIDIOUTPORT_H_
10#define _MIDIOUTPORT_H_
11
12#include "emu.h"
13#include "machine/serial.h"
14#include "imagedev/midiout.h"
15
16class midiout_port_device :
17      public device_t,
18      public device_serial_port_interface
19{
20public:
21   midiout_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
22   virtual machine_config_constructor device_mconfig_additions() const;
23   DECLARE_WRITE_LINE_MEMBER( read ) { }
24   virtual void tx(UINT8 state) { m_midiout->tx(state); }
25protected:
26   virtual void device_start() { }
27   virtual void device_reset() { }
28   virtual void device_config_complete() { m_shortname = "midiout_port"; }
29private:
30   serial_port_device *m_owner;
31   required_device<midiout_device> m_midiout;
32};
33
34extern const device_type MIDIOUT_PORT;
35#endif
trunk/src/mess/drivers/esq5505.c
r20255r20256
110110#include "machine/esqpanel.h"
111111#include "machine/serial.h"
112112#include "machine/midiinport.h"
113#include "machine/midioutport.h"
113114
114115#define GENERIC (0)
115116#define EPS     (1)
r20255r20256
137138      m_epspanel(*this, "epspanel"),
138139      m_sq1panel(*this, "sq1panel"),
139140      m_panel(*this, "panel"),
140      m_dmac(*this, "mc68450")
141      m_dmac(*this, "mc68450"),
142      m_mdout(*this, "mdout")
141143   { }
142144
143145   required_device<m68000_device> m_maincpu;
r20255r20256
147149   optional_device<esqpanel2x40_sq1_device> m_sq1panel;
148150   optional_device<esqpanel2x40_device> m_panel;
149151   optional_device<hd63450_device> m_dmac;
152   required_device<serial_port_device> m_mdout;
150153
151154   virtual void machine_reset();
152155
r20255r20256
527530// MIDI send, we don't care yet
528531WRITE_LINE_MEMBER(esq5505_state::duart_tx_a)
529532{
533   m_mdout->tx(state);
530534}
531535
532536WRITE_LINE_MEMBER(esq5505_state::duart_tx_b)
r20255r20256
767771};
768772
769773static SLOT_INTERFACE_START(midiout_slot)
774   SLOT_INTERFACE("midiout", MIDIOUT_PORT)
770775SLOT_INTERFACE_END
771776
772777static const serial_port_interface midiout_intf =
r20255r20256
783788   MCFG_DUARTN68681_ADD("duart", 4000000, duart_config)
784789
785790   MCFG_SERIAL_PORT_ADD("mdin", midiin_intf, midiin_slot, "midiin", NULL)
786   MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, NULL, NULL)
791   MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, "midiout", NULL)
787792
788793   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
789794   MCFG_SOUND_ADD("ensoniq", ES5505, XTAL_10MHz)
r20255r20256
823828   MCFG_DUARTN68681_ADD("duart", 4000000, duart_config)
824829
825830   MCFG_SERIAL_PORT_ADD("mdin", midiin_intf, midiin_slot, "midiin", NULL)
826   MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, NULL, NULL)
831   MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, "midiout", NULL)
827832
828833   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
829834   MCFG_SOUND_ADD("ensoniq", ES5505, XTAL_30_4761MHz / 2)
trunk/src/mess/mess.mak
r20255r20256
558558   $(MESS_DEVICES)/sonydriv.o  \
559559   $(MESS_DEVICES)/appldriv.o  \
560560   $(MESS_MACHINE)/dp8390.o    \
561   $(MESS_MACHINE)/midiinport.o   \
562561   $(MESS_MACHINE)/ne1000.o    \
563562   $(MESS_MACHINE)/ne2000.o    \
564563   $(MESS_MACHINE)/3c503.o     \
565564   $(MESS_FORMATS)/z80bin.o    \
566565   $(MESS_MACHINE)/mb8795.o    \
566   $(MESS_MACHINE)/midiinport.o   \
567   $(MESS_MACHINE)/midioutport.o   \
567568   $(MESS_MACHINE)/null_modem.o    \
568569   $(MESS_MACHINE)/vcsctrl.o   \
569570   $(MESS_MACHINE)/vcs_joy.o   \

Previous 199869 Revisions Next


© 1997-2024 The MAME Team