summaryrefslogtreecommitdiff
path: root/muse2/muse/synth.cpp
diff options
context:
space:
mode:
authorTim E. Real <termtech@rogers.com>2011-06-19 01:26:26 +0000
committerTim E. Real <termtech@rogers.com>2011-06-19 01:26:26 +0000
commit02941424387a064301372c12bda3e8c3ab3fee45 (patch)
treee4cdea4400d8a34060a1c4d2b32da8e7ef46ab90 /muse2/muse/synth.cpp
parent448d81436ed8c2bc501506c2663a9bdb8c0dd023 (diff)
Major work, all synthesizers. Other fixes. Please see ChangeLog.
Diffstat (limited to 'muse2/muse/synth.cpp')
-rw-r--r--muse2/muse/synth.cpp44
1 files changed, 43 insertions, 1 deletions
diff --git a/muse2/muse/synth.cpp b/muse2/muse/synth.cpp
index 4f43a02a..f8946a9f 100644
--- a/muse2/muse/synth.cpp
+++ b/muse2/muse/synth.cpp
@@ -36,6 +36,7 @@
#include "midictrl.h"
//#include "stringparam.h"
#include "popupmenu.h"
+#include "globaldefs.h"
std::vector<Synth*> synthis; // array of available synthis
@@ -429,10 +430,34 @@ bool SynthI::initInstance(Synth* s, const QString& instanceName)
cl->add(c);
}
+ // Restore the midi state...
EventList* iel = midiState();
if (!iel->empty()) {
for (iEvent i = iel->begin(); i != iel->end(); ++i) {
Event ev = i->second;
+
+ // p4.0.27 A kludge to support old midistates by wrapping them in the proper header.
+ if(ev.type() == Sysex && _tmpMidiStateVersion < SYNTH_MIDI_STATE_SAVE_VERSION)
+ {
+ int len = ev.dataLen();
+ if(len > 0)
+ {
+ const unsigned char* data = ev.data();
+ const unsigned char* hdr;
+ // Get the unique header for the synth.
+ int hdrsz = _sif->oldMidiStateHeader(&hdr);
+ if(hdrsz > 0)
+ {
+ int newlen = hdrsz + len;
+ unsigned char* d = new unsigned char[newlen];
+ memcpy(d, hdr, hdrsz);
+ memcpy(d + hdrsz, data, len);
+ ev.setData(d, newlen);
+ delete[] d;
+ }
+ }
+ }
+
MidiPlayEvent pev(0, 0, 0, ev);
if (_sif->putEvent(pev))
break; // try later
@@ -702,7 +727,8 @@ void MessSynthIF::write(int level, Xml& xml) const
const unsigned char* p;
_mess->getInitData(&len, &p);
if (len) {
- xml.tag(level++, "midistate");
+ ///xml.tag(level++, "midistate");
+ xml.tag(level++, "midistate version=\"%d\"", SYNTH_MIDI_STATE_SAVE_VERSION);
xml.nput(level++, "<event type=\"%d\"", Sysex);
xml.nput(" datalen=\"%d\">\n", len);
xml.nput(level, "");
@@ -816,6 +842,7 @@ void SynthI::read(Xml& xml)
if (initInstance(s, name()))
return;
song->insertTrack0(this, -1);
+
if (port != -1 && port < MIDI_PORTS)
midiPorts[port].setMidiDevice(this);
@@ -1033,3 +1060,18 @@ bool MessSynthIF::putEvent(const MidiPlayEvent& ev)
return true;
}
+//unsigned long MessSynthIF::uniqueID() const
+//{
+// return _mess ? _mess->uniqueID() : 0;
+//}
+
+//MidiPlayEvent& MessSynthIF::wrapOldMidiStateVersion(MidiPlayEvent& e) const
+//{
+// return _mess ? _mess->wrapOldMidiStateVersion(e) : e;
+//}
+
+int MessSynthIF::oldMidiStateHeader(const unsigned char** data) const
+{
+ return _mess ? _mess->oldMidiStateHeader(data) : 0;
+}
+