/[svn]/linuxsampler/trunk/src/drivers/midi/MidiInputDeviceCoreMidi.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/drivers/midi/MidiInputDeviceCoreMidi.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 509 by letz, Tue May 3 16:55:28 2005 UTC revision 1149 by schoenebeck, Sat Apr 7 22:32:47 2007 UTC
# Line 1  Line 1 
1  /***************************************************************************  /***************************************************************************
2   *                                                                         *   *                                                                         *
3   *   LinuxSampler - modular, streaming capable sampler                     *   *   Copyright (C) 2004, 2005 Grame                                        *
4   *                                                                         *   *   Copyright (C) 2005 - 2007 Christian Schoenebeck                       *
  *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *  
  *   Copyright (C) 2004 Grame                                                                                      *  
5   *                                                                         *   *                                                                         *
6   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
7   *   it under the terms of the GNU General Public License as published by  *   *   it under the terms of the GNU General Public License as published by  *
# Line 28  namespace LinuxSampler { Line 26  namespace LinuxSampler {
26    
27          int MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::pPortID = 0;          int MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::pPortID = 0;
28    
29          MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::ParameterName::ParameterName(MidiInputPort* pPort) throw (LinuxSamplerException) : MidiInputPort::ParameterName(pPort, "Port " + ToString(pPort->GetPortNumber())) {          MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::ParameterName::ParameterName(MidiInputPort* pPort) throw (Exception) : MidiInputPort::ParameterName(pPort, "Port " + ToString(pPort->GetPortNumber())) {
30          OnSetValue(ValueAsString()); // initialize port name          OnSetValue(ValueAsString()); // initialize port name
31      }      }
32    
33      void MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::ParameterName::OnSetValue(String s) throw (LinuxSamplerException) {      void MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::ParameterName::OnSetValue(String s) throw (Exception) {
34            
35      }        }
36            
37          // *************** ParameterCoreMidiBindings ***************          // *************** ParameterCoreMidiBindings ***************
38          // *          // *
39    
# Line 56  namespace LinuxSampler { Line 54  namespace LinuxSampler {
54                  return res;                  return res;
55      }      }
56    
57      void MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::ParameterCoreMidiBindings::OnSetValue(std::vector<String> vS) throw (LinuxSamplerException) {      void MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::ParameterCoreMidiBindings::OnSetValue(std::vector<String> vS) throw (Exception) {
58          // to finish          // to finish
59      }      }
60    
# Line 66  namespace LinuxSampler { Line 64  namespace LinuxSampler {
64    
65      MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::MidiInputPortCoreMidi(MidiInputDeviceCoreMidi* pDevice) throw (MidiInputException) : MidiInputPort(pDevice, -1) {      MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::MidiInputPortCoreMidi(MidiInputDeviceCoreMidi* pDevice) throw (MidiInputException) : MidiInputPort(pDevice, -1) {
66          // create CoreMidi virtual destination          // create CoreMidi virtual destination
67                    
68                  MIDIDestinationCreate(pDevice->hCoreMidiClient, CFSTR("LinuxSampler_in"), ReadProc, this, &pDestination);                  MIDIDestinationCreate(pDevice->hCoreMidiClient, CFSTR("LinuxSampler_in"), ReadProc, this, &pDestination);
69                  if (!pDestination) throw MidiInputException("Error creating CoreMidi virtual destination");                  if (!pDestination) throw MidiInputException("Error creating CoreMidi virtual destination");
70                  this->portNumber = pPortID++;                  this->portNumber = pPortID++;
71                    
72          Parameters["NAME"]      = new ParameterName(this);          Parameters["NAME"]      = new ParameterName(this);
73          Parameters["CORE_MIDI_BINDINGS"] = new ParameterCoreMidiBindings(this);          Parameters["CORE_MIDI_BINDINGS"] = new ParameterCoreMidiBindings(this);
74      }      }
# Line 78  namespace LinuxSampler { Line 76  namespace LinuxSampler {
76      MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::~MidiInputPortCoreMidi() {      MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::~MidiInputPortCoreMidi() {
77                  MIDIEndpointDispose(pDestination);                  MIDIEndpointDispose(pDestination);
78      }      }
79            
80          void MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::ReadProc(const MIDIPacketList* pktlist, void* refCon, void* connRefCon)          void MidiInputDeviceCoreMidi::MidiInputPortCoreMidi::ReadProc(const MIDIPacketList* pktlist, void* refCon, void* connRefCon)
81          {          {
82                  MidiInputPortCoreMidi* port = (MidiInputPortCoreMidi*)refCon;                  MidiInputPortCoreMidi* port = (MidiInputPortCoreMidi*)refCon;
83                  MIDIPacket *packet = (MIDIPacket *)pktlist->packet;                      MIDIPacket *packet = (MIDIPacket *)pktlist->packet;
84    
85                  for (unsigned int i = 0; i < pktlist->numPackets; ++i) {                  for (unsigned int i = 0; i < pktlist->numPackets; ++i) {
86                    
87                          int cin = packet->data[0] & 0xF0;                          int cin = packet->data[0] & 0xF0;
88                            
89                          // To be checked : several events per packet                          // To be checked : several events per packet
90                    
91                          switch(cin) { // status byte                          switch(cin) { // status byte
92                            
93                                  case 0xB0:                                  case 0xB0:
94                                          port->DispatchControlChange(packet->data[1],packet->data[2],packet->data[0]&0x0F);                                          if (packet->data[1] == 0)
95                                                    port->DispatchBankSelectMsb(packet->data[2],packet->data[0]&0x0F);
96                                            else if (packet->data[1] == 32)
97                                                    port->DispatchBankSelectLsb(packet->data[2],packet->data[0]&0x0F);
98                                            else
99                                                    port->DispatchControlChange(packet->data[1],packet->data[2],packet->data[0]&0x0F);
100                                          break;                                          break;
101                                            
102                                    case 0xD0:
103                                            port->DispatchControlChange(128,packet->data[1],packet->data[0]&0x0F);
104                                            break;
105    
106                                  case 0xE0:                                  case 0xE0:
107                                          port->DispatchPitchbend(packet->data[1],packet->data[0]&0x0F);                                          port->DispatchPitchbend(packet->data[1],packet->data[0]&0x0F);
108                                          break;                                          break;
# Line 109  namespace LinuxSampler { Line 116  namespace LinuxSampler {
116                                                  }                                                  }
117                                          }                                          }
118                                          break;                                          break;
119                                    
120                                  case 0x80:                                  case 0x80:
121                                          if (packet->data[1] < 0x80) {                                          if (packet->data[1] < 0x80) {
122                                                  port->DispatchNoteOff(packet->data[1],packet->data[2],packet->data[0]&0x0F);                                                  port->DispatchNoteOff(packet->data[1],packet->data[2],packet->data[0]&0x0F);
123                                          }                                          }
124                                          break;                                          break;
125    
126                                    case 0xC0:
127                                            if (packet->data[1] < 0x80) {
128                                                    port->DispatchProgramChange(packet->data[1], packet->data[0] & 0x0F);
129                                            }
130                                            break;
131                          }                          }
132                            
133                          packet = MIDIPacketNext(packet);                          packet = MIDIPacketNext(packet);
134                  }                        }
135          }          }
136    
137      MidiInputDeviceCoreMidi::MidiInputDeviceCoreMidi(std::map<String,DeviceCreationParameter*> Parameters) : MidiInputDevice(Parameters)  
138    // *************** MidiInputDeviceCoreMidi ***************
139    // *
140    
141        MidiInputDeviceCoreMidi::MidiInputDeviceCoreMidi(std::map<String,DeviceCreationParameter*> Parameters, void* pSampler) : MidiInputDevice(Parameters, pSampler)
142          {          {
143                  MIDIClientCreate(CFSTR("LinuxSampler"), NotifyProc, NULL, &hCoreMidiClient);                  MIDIClientCreate(CFSTR("LinuxSampler"), NotifyProc, NULL, &hCoreMidiClient);
144                  if (!hCoreMidiClient) throw MidiInputException("Error opening CoreMidi client");                  if (!hCoreMidiClient) throw MidiInputException("Error opening CoreMidi client");
145                  AcquirePorts(((DeviceCreationParameterInt*)Parameters["PORTS"])->ValueAsInt());                  AcquirePorts(((DeviceCreationParameterInt*)Parameters["PORTS"])->ValueAsInt());
146          }          }
147    
148      MidiInputDeviceCoreMidi::~MidiInputDeviceCoreMidi()      MidiInputDeviceCoreMidi::~MidiInputDeviceCoreMidi()
149          {          {
150                  if (hCoreMidiClient) {                  if (hCoreMidiClient) {
151                          MIDIClientDispose(hCoreMidiClient);                          MIDIClientDispose(hCoreMidiClient);
152                  }                  }
153      }      }
154            
155          MidiInputDeviceCoreMidi::MidiInputPortCoreMidi* MidiInputDeviceCoreMidi::CreateMidiPort() {          MidiInputDeviceCoreMidi::MidiInputPortCoreMidi* MidiInputDeviceCoreMidi::CreateMidiPort() {
156                  return new MidiInputPortCoreMidi(this);                  return new MidiInputPortCoreMidi(this);
157      }      }
158            
159          String MidiInputDeviceCoreMidi::Name() {          String MidiInputDeviceCoreMidi::Name() {
160              return "COREMIDI";              return "COREMIDI";
161      }      }
# Line 146  namespace LinuxSampler { Line 163  namespace LinuxSampler {
163          String MidiInputDeviceCoreMidi::Driver() {          String MidiInputDeviceCoreMidi::Driver() {
164              return Name();              return Name();
165      }      }
166            
167           String MidiInputDeviceCoreMidi::Description() {           String MidiInputDeviceCoreMidi::Description() {
168              return "Apple CoreMidi";              return "Apple CoreMidi";
169      }      }
170    
171      String MidiInputDeviceCoreMidi::Version() {      String MidiInputDeviceCoreMidi::Version() {
172              String s = "$Revision: 1.5 $";              String s = "$Revision: 1.9 $";
173              return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword              return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword
174      }      }
175    
# Line 163  namespace LinuxSampler { Line 180  namespace LinuxSampler {
180                          printf("kMIDIMsgSetupChanged\n");                          printf("kMIDIMsgSetupChanged\n");
181                  }                  }
182          }          }
183            
184    
185  } // namespace LinuxSampler  } // namespace LinuxSampler

Legend:
Removed from v.509  
changed lines
  Added in v.1149

  ViewVC Help
Powered by ViewVC