Browse Source

Send time info to midisequencer

tags/1.9.6
falkTX 10 years ago
parent
commit
46b012dde4
2 changed files with 89 additions and 15 deletions
  1. +56
    -12
      source/native-plugins/midi-sequencer.cpp
  2. +33
    -3
      source/native-plugins/resources/midiseq-ui

+ 56
- 12
source/native-plugins/midi-sequencer.cpp View File

@@ -32,6 +32,7 @@ public:
fWasPlayingBefore(false),
fInEvents(),
fMidiOut(this),
fTimeInfo(),
leakDetector_MidiSequencerPlugin()
{
// TEST SONG (unsorted to test RtList API)
@@ -125,6 +126,8 @@ public:
fMidiOut.addNote(2304*m, 0, 64, 90, 650*m);
fMidiOut.addNote(3072*m, 0, 62, 90, 325*m);
fMidiOut.addNote(3456*m, 0, 62, 90, 325*m);

carla_zeroStruct(fTimeInfo);
}

protected:
@@ -137,25 +140,31 @@ protected:

if (fWantInEvents)
{
RawMidiEvent rawMidiEvent;

for (uint32_t i=0; i < midiEventCount; ++i)
if (midiEventCount > 0)
{
const NativeMidiEvent* const midiEvent = &midiEvents[i];
RawMidiEvent rawMidiEvent;

for (uint32_t i=0; i < midiEventCount; ++i)
{
const NativeMidiEvent* const midiEvent = &midiEvents[i];

rawMidiEvent.data[0] = midiEvent->data[0];
rawMidiEvent.data[1] = midiEvent->data[1];
rawMidiEvent.data[2] = midiEvent->data[2];
rawMidiEvent.data[3] = midiEvent->data[3];
rawMidiEvent.size = midiEvent->size;
rawMidiEvent.time = timePos->playing ? timePos->frame + midiEvent->time : 0;
rawMidiEvent.data[0] = midiEvent->data[0];
rawMidiEvent.data[1] = midiEvent->data[1];
rawMidiEvent.data[2] = midiEvent->data[2];
rawMidiEvent.data[3] = midiEvent->data[3];
rawMidiEvent.size = midiEvent->size;
rawMidiEvent.time = timePos->playing ? timePos->frame + midiEvent->time : 0;

fInEvents.appendRT(rawMidiEvent);
fInEvents.appendRT(rawMidiEvent);
}
}

fInEvents.trySplice();
}

if (const NativeTimeInfo* const timeInfo = getTimeInfo())
fTimeInfo = *timeInfo;

if (timePos->playing)
{
fMidiOut.play(timePos->frame, frames);
@@ -195,6 +204,40 @@ protected:
_sendEventsToUI();
}

void uiIdle() override
{
NativePluginAndUiClass::uiIdle();

// send transport
if (isPipeRunning())
{
char strBuf[0xff+1];
strBuf[0xff] = '\0';

const CarlaMutexLocker cml(getPipeLock());
const ScopedLocale csl;

writeAndFixMessage("transport");
writeMessage(fTimeInfo.playing ? "true\n" : "false\n");

if (fTimeInfo.bbt.valid)
{
std::sprintf(strBuf, P_UINT64 ":%i:%i:%i\n", fTimeInfo.frame, fTimeInfo.bbt.bar, fTimeInfo.bbt.beat, fTimeInfo.bbt.tick);
writeMessage(strBuf);
std::sprintf(strBuf, "%f:%f:%f\n", fTimeInfo.bbt.beatsPerMinute, fTimeInfo.bbt.beatsPerBar, fTimeInfo.bbt.beatType);
writeMessage(strBuf);
}
else
{
std::sprintf(strBuf, P_UINT64 ":0:0:0\n", fTimeInfo.frame);
writeMessage(strBuf);
writeMessage("120.0:4.0:4.0\n");
}

flushMessages();
}
}

// -------------------------------------------------------------------
// Plugin state calls

@@ -345,7 +388,8 @@ private:

} fInEvents;

MidiPattern fMidiOut;
MidiPattern fMidiOut;
NativeTimeInfo fTimeInfo;

void _sendEventsToUI() const noexcept
{


+ 33
- 3
source/native-plugins/resources/midiseq-ui View File

@@ -280,14 +280,28 @@ class piano_roll(ExternalUI, QGraphicsView):
self.marquee_select = False
self.insert_mode = False
self.place_ghost = False
self.draw_piano()
self.draw_header()
self.draw_grid()

# to be filled with note-on events, while waiting for their matching note-off
self.fPendingNoteOns = [] # (channel, note, velocity, time)

# transport info
self.fTransportInfo = {
"playing": False,
"frame": 0,
"bar": 0,
"beat": 0,
"tick": 0,
"bpm": 120.0,
"sigNum": 4.0,
"sigDenom": 4.0
}

self.fIdleTimer = self.startTimer(30)

self.draw_piano()
self.draw_header()
self.draw_grid()

self.setWindowTitle(self.fUiName)
self.ready()

@@ -363,6 +377,22 @@ class piano_roll(ExternalUI, QGraphicsView):

self.handleMidiEvent(time, size, data)

elif msg == "transport":
playing = bool(self.readlineblock() == "true")
frame, bar, beat, tick = [int(i) for i in self.readlineblock().split(":")]
bpm, sigNum, sigDenom = [float(i) for i in self.readlineblock().split(":")]

self.fTransportInfo = {
"playing": playing,
"frame": frame,
"bar": bar,
"beat": beat,
"tick": tick,
"bpm": bpm,
"sigNum": sigNum,
"sigDenom": sigDenom
}

elif msg == "show":
self.uiShow()



Loading…
Cancel
Save