summaryrefslogtreecommitdiff
path: root/muse2/muse/midiseq.cpp
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2012-03-15 18:21:23 +0000
committerFlorian Jung <flo@windfisch.org>2012-03-15 18:21:23 +0000
commit27b7bf6815cda7abb67026c37b3e44daee1803cb (patch)
tree0b9d1c0bc84ac7ff8032e707f2b5fb4e0aaabb5c /muse2/muse/midiseq.cpp
parent2d6f113a10eb485694e20a78500f650776d701e3 (diff)
merged with trunk
Diffstat (limited to 'muse2/muse/midiseq.cpp')
-rw-r--r--muse2/muse/midiseq.cpp201
1 files changed, 60 insertions, 141 deletions
diff --git a/muse2/muse/midiseq.cpp b/muse2/muse/midiseq.cpp
index 1e46db11..94335d99 100644
--- a/muse2/muse/midiseq.cpp
+++ b/muse2/muse/midiseq.cpp
@@ -31,6 +31,7 @@
#include <poll.h>
#include <math.h>
+#include "app.h"
#include "globals.h"
#include "midi.h"
#include "midiseq.h"
@@ -44,7 +45,6 @@
#include "synth.h"
#include "song.h"
#include "gconfig.h"
-#include <lo/lo_osc_types.h>
namespace MusEGlobal {
MusECore::MidiSeq* midiSeq;
@@ -57,7 +57,6 @@ int MidiSeq::ticker = 0;
void initMidiSequencer()
{
- //MusEGlobal::midiSeq = new MidiSeq(MusEGlobal::realTimeScheduling ? MusEGlobal::realTimePriority : 0, "Midi");
MusEGlobal::midiSeq = new MidiSeq("Midi");
}
@@ -80,19 +79,18 @@ void MidiSeq::processMsg(const ThreadMsg* m)
{
MusECore::AudioMsg* msg = (MusECore::AudioMsg*)m;
switch(msg->id) {
- // This does not appear to be used anymore. Was sent in Audio::process1,
+ // This does not appear to be used anymore. Was sent in Audio::process1, DELETETHIS 5 ??
// now Audio::processMidi is called directly. p4.0.15 Tim.
//case MusECore::MS_PROCESS:
// audio->processMidi();
// break;
- // Removed p4.0.34
- //case MusECore::SEQM_SEEK:
- // processSeek();
- // break;
- //case MusECore::MS_STOP:
- // processStop();
- // break;
+ case MusECore::SEQM_SEEK:
+ processSeek();
+ break;
+ case MusECore::MS_STOP:
+ processStop();
+ break;
case MusECore::MS_SET_RTC:
MusEGlobal::doSetuid();
@@ -102,8 +100,9 @@ void MidiSeq::processMsg(const ThreadMsg* m)
case MusECore::MS_UPDATE_POLL_FD:
updatePollFd();
break;
- // Moved into Song::processMsg p4.0.34
- /*
+
+
+ // Moved into Song::processMsg p4.0.34 ...
case MusECore::SEQM_ADD_TRACK:
MusEGlobal::song->insertTrack2(msg->track, msg->ival);
updatePollFd();
@@ -112,10 +111,10 @@ void MidiSeq::processMsg(const ThreadMsg* m)
MusEGlobal::song->cmdRemoveTrack(msg->track);
updatePollFd();
break;
- case MusECore::SEQM_CHANGE_TRACK:
- MusEGlobal::song->changeTrack((Track*)(msg->p1), (Track*)(msg->p2));
- updatePollFd();
- break;
+ //case MusECore::SEQM_CHANGE_TRACK: DELETETHIS 4
+ // MusEGlobal::song->changeTrack((Track*)(msg->p1), (Track*)(msg->p2));
+ // updatePollFd();
+ // break;
case MusECore::SEQM_ADD_PART:
MusEGlobal::song->cmdAddPart((Part*)msg->p1);
break;
@@ -123,10 +122,10 @@ void MidiSeq::processMsg(const ThreadMsg* m)
MusEGlobal::song->cmdRemovePart((Part*)msg->p1);
break;
case MusECore::SEQM_CHANGE_PART:
- //MusEGlobal::song->cmdChangePart((Part*)msg->p1, (Part*)msg->p2);
MusEGlobal::song->cmdChangePart((Part*)msg->p1, (Part*)msg->p2, msg->a, msg->b);
break;
- */
+
+
case MusECore::SEQM_SET_TRACK_OUT_CHAN:
{
MidiTrack* track = (MidiTrack*)(msg->p1);
@@ -158,29 +157,26 @@ void MidiSeq::processMsg(const ThreadMsg* m)
}
}
-#if 0
-// Removed p4.0.34
+#if 1 // DELETETHIS the #if and #endif?
//---------------------------------------------------------
// processStop
//---------------------------------------------------------
void MidiSeq::processStop()
{
- // p3.3.28
- // TODO Try to move this into Audio::stopRolling(). p4.0.22 // Done p4.0.34
- //playStateExt = false; // not playing
+ // TODO Try to move this into Audio::stopRolling().
+ playStateExt = false; // not playing
//
// clear Alsa midi device notes and stop stuck notes
- // Jack midi devices are handled in Audio::stopRolling()
//
for(iMidiDevice id = MusEGlobal::midiDevices.begin(); id != MusEGlobal::midiDevices.end(); ++id)
{
- //MidiDevice* md = *id;
+ //MidiDevice* md = *id; DELETETHIS 3
// Only ALSA devices are handled by this thread.
- if((*id)->deviceType() == MidiDevice::ALSA_MIDI) // p4.0.22
- (*id)->handleStop(); // p4.0.22
- /*
+ //if((*id)->deviceType() == MidiDevice::ALSA_MIDI)
+ (*id)->handleStop();
+ /* DELETETHIS 14
if (md->midiPort() == -1)
continue;
MPEventList* pel = md->playEvents();
@@ -199,18 +195,17 @@ void MidiSeq::processStop()
}
#endif
-#if 0
-// Removed p4.0.34
+#if 1 //DELETETHIS #if and #endif
//---------------------------------------------------------
// processSeek
//---------------------------------------------------------
void MidiSeq::processSeek()
{
- //int pos = MusEGlobal::audio->tickPos();
- // TODO Try to move this into MusEGlobal::audio::seek(). p4.0.22 Done p4.0.34
- //if (pos == 0 && !MusEGlobal::song->record())
- // MusEGlobal::audio->initDevices();
+ int pos = MusEGlobal::audio->tickPos();
+ // TODO Try to move this into MusEGlobal::audio::seek().
+ if (pos == 0 && !MusEGlobal::song->record())
+ MusEGlobal::audio->initDevices();
//---------------------------------------------------
// set all controller
@@ -218,11 +213,11 @@ void MidiSeq::processSeek()
for (iMidiDevice i = MusEGlobal::midiDevices.begin(); i != MusEGlobal::midiDevices.end(); ++i)
{
- //MidiDevice* md = *i;
+ //MidiDevice* md = *i; DELETETHIS 3
// Only ALSA devices are handled by this thread.
- if((*i)->deviceType() == MidiDevice::ALSA_MIDI) // p4.0.22
- (*i)->handleSeek(); // p4.0.22
- /*
+ //if((*i)->deviceType() == MidiDevice::ALSA_MIDI)
+ (*i)->handleSeek();
+ /* DELETETHIS 47
int port = md->midiPort();
if (port == -1)
continue;
@@ -278,13 +273,9 @@ void MidiSeq::processSeek()
// MidiSeq
//---------------------------------------------------------
-//MidiSeq::MidiSeq(int priority, const char* name)
-// : Thread(priority, name)
MidiSeq::MidiSeq(const char* name)
: Thread(name)
{
- // Changed by Tim. p3.3.17
- //prio = priority;
prio = 0;
idle = false;
@@ -352,7 +343,7 @@ signed int MidiSeq::selectTimer()
void MidiSeq::threadStart(void*)
{
- // Removed by Tim. p3.3.17
+ // Removed by Tim. p3.3.17 DELETETHIS 13
/*
struct sched_param rt_param;
memset(&rt_param, 0, sizeof(rt_param));
@@ -397,6 +388,7 @@ static void midiRead(void*, void* d)
dev->processInput();
}
+// DELETETHIS 12
//---------------------------------------------------------
// synthIRead
//---------------------------------------------------------
@@ -446,24 +438,13 @@ void MidiSeq::updatePollFd()
for (iMidiDevice imd = MusEGlobal::midiDevices.begin(); imd != MusEGlobal::midiDevices.end(); ++imd) {
MidiDevice* dev = *imd;
int port = dev->midiPort();
- //const QString name = dev->name();
if (port == -1)
continue;
if ((dev->rwFlags() & 0x2) || (MusEGlobal::extSyncFlag.value()
- //&& (rxSyncPort == port || rxSyncPort == -1))) {
- //&& (dev->syncInfo().MCIn()))) {
- && (MusEGlobal::midiPorts[port].syncInfo().MCIn()))) {
- if(dev->selectRfd() < 0){
- //fprintf(stderr, "WARNING: read-file-descriptor for {%s} is negative\n", name.toLatin1());
- }
+ && (MusEGlobal::midiPorts[port].syncInfo().MCIn())))
addPollFd(dev->selectRfd(), POLLIN, MusECore::midiRead, this, dev);
- }
- if (dev->bytesToWrite()){
- if(dev->selectWfd() < 0){
- //fprintf(stderr, "WARNING: write-file-descriptor for {%s} is negative\n", name.toLatin1());
- }
+ if (dev->bytesToWrite())
addPollFd(dev->selectWfd(), POLLOUT, MusECore::midiWrite, this, dev);
- }
}
// special handling for alsa midi:
// (one fd for all devices)
@@ -480,23 +461,19 @@ void MidiSeq::updatePollFd()
void MidiSeq::threadStop()
{
timer->stopTimer();
- //timer.stopTimer();
}
//---------------------------------------------------------
// setRtcTicks
-// return true on success
+// returns actual tick frequency
//---------------------------------------------------------
-bool MidiSeq::setRtcTicks()
+int MidiSeq::setRtcTicks()
{
+ int gotTicks = timer->setTimerFreq(MusEGlobal::config.rtcTicks);
- //timer.setTimerFreq(MusEGlobal::config.rtcTicks);
- //timer.startTimer();
- timer->setTimerFreq(MusEGlobal::config.rtcTicks);
timer->startTimer();
- realRtcTicks = MusEGlobal::config.rtcTicks;
- return true;
+ return gotTicks;
}
//---------------------------------------------------------
@@ -504,24 +481,20 @@ bool MidiSeq::setRtcTicks()
// return true on error
//---------------------------------------------------------
-//bool MidiSeq::start()
void MidiSeq::start(int priority)
{
- // Changed by Tim. p3.3.17
-
prio = priority;
- //timerFd = -1;
-
MusEGlobal::doSetuid();
- //timerFd = selectTimer();
- //timerFd = timer.initTimer();
- //printf("timerFd=%d\n",timerFd);
- setRtcTicks();
+ int gotTicks = setRtcTicks();
MusEGlobal::undoSetuid();
- //Thread::start();
Thread::start(priority);
- //return false;
+
+ if (gotTicks < 500) {
+ QMessageBox::warning( MusEGlobal::muse, QString("Bad timing"), QString("Timing source has a frequency below 500hz!\n" \
+ "This could lead to audible timing problems.\n" \
+ "Please see console output for any further error messages\n "));
+ }
}
//---------------------------------------------------------
@@ -530,6 +503,7 @@ void MidiSeq::start(int priority)
void MidiSeq::processMidiClock()
{
+ // DELETETHIS 30, maybe remove entire function?
// if (genMCSync) {
// MusEGlobal::midiPorts[txSyncPort].sendClock();
// }
@@ -584,10 +558,6 @@ void MidiSeq::midiTick(void* p, void*)
void MidiSeq::processTimerTick()
{
- // Disabled by Tim. p3.3.22
-// extern int watchMidi;
-// ++watchMidi; // make a simple watchdog happy
-
//---------------------------------------------------
// read elapsed rtc timer ticks
//---------------------------------------------------
@@ -596,14 +566,12 @@ void MidiSeq::processTimerTick()
unsigned long nn;
if (timerFd != -1) {
nn = timer->getTimerTicks();
- //nn = timer.getTimerTicks();
nn >>= 8;
}
- if (idle) {
-// printf("IDLE\n");
+ if (idle)
return;
- }
+
if (MusEGlobal::midiBusy) {
// we hit MusEGlobal::audio: MusEGlobal::midiSeq->msgProcess (actually this has been MusEGlobal::audio->processMidi for some time now - Tim)
// miss this timer tick
@@ -612,70 +580,32 @@ void MidiSeq::processTimerTick()
unsigned curFrame = MusEGlobal::audio->curFrame();
- // Keep the sync detectors running...
- // No, done in Song::beat(), (at the much slower heartbeat rate).
- //
- //for(int port = 0; port < MIDI_PORTS; ++port)
- //{
- // Must keep them running even if there's no device...
- //if(MusEGlobal::midiPorts[port].device())
- // MusEGlobal::midiPorts[port].syncInfo().setCurFrame(curFrame);
- //}
- //for(iMidiDevice imd = MusEGlobal::midiDevices.begin(); imd != MusEGlobal::midiDevices.end(); ++imd)
- // (*imd)->syncInfo().setCurFrame(curFrame);
-
if (!MusEGlobal::extSyncFlag.value()) {
- //int curTick = MusEGlobal::tempomap.frame2tick(curFrame);
- // Copied from Tempomap.
- //int curTick = lrint((double(curFrame)/double(MusEGlobal::sampleRate)) * MusEGlobal::tempomap.globalTempo() * MusEGlobal::config.division * 10000.0 / double(MusEGlobal::tempomap.tempo(MusEGlobal::song->cpos())));
- //int curTick = lrint((double(curFrame)/double(MusEGlobal::sampleRate)) * MusEGlobal::tempomap.globalTempo() * 240000.0 / double(MusEGlobal::tempomap.tempo(MusEGlobal::song->cpos())));
int curTick = lrint((double(curFrame)/double(MusEGlobal::sampleRate)) * double(MusEGlobal::tempomap.globalTempo()) * double(MusEGlobal::config.division) * 10000.0 / double(MusEGlobal::tempomap.tempo(MusEGlobal::song->cpos())));
- //int curTick = int((double(curFrame)/double(MusEGlobal::sampleRate)) * double(MusEGlobal::tempomap.globalTempo()) * double(MusEGlobal::config.division * 10000.0) / double(MusEGlobal::tempomap.tempo(MusEGlobal::song->cpos())));
-
-/* if ( midiClock > curTick + 100) // reinitialize
- {
- midiClock = curTick;
- }
- else if( curTick > midiClock + 100) // reinitialize
- {
- midiClock = curTick;
- }*/
if(midiClock > curTick)
midiClock = curTick;
int div = MusEGlobal::config.division/24;
if(curTick >= midiClock + div) {
- //if(curTick >= midiClock) {
- //processMidiClock();
int perr = (curTick - midiClock) / div;
- //int perr = curTick - midiClock;
bool used = false;
- //if(genMCSync)
- //{
- //MusEGlobal::midiPorts[txSyncPort].sendClock();
for(int port = 0; port < MIDI_PORTS; ++port)
{
MidiPort* mp = &MusEGlobal::midiPorts[port];
- // No device? Clock out not turned on?
- //MidiDevice* dev = mp->device();
- //if(!dev || !mp->syncInfo().MCOut())
+ // No device? Clock out not turned on? DELETETHIS 3
if(!mp->device() || !mp->syncInfo().MCOut())
continue;
- // Shall we check open flags?
- //if(!(dev->rwFlags() & 0x1) || !(dev->openFlags() & 1))
- //if(!(dev->openFlags() & 1))
- // continue;
-
used = true;
mp->sendClock();
}
+ // DELETETHIS 35 ??
/*
for(iMidiDevice imd = MusEGlobal::midiDevices.begin(); imd != MusEGlobal::midiDevices.end(); ++imd)
{
@@ -710,7 +640,7 @@ void MidiSeq::processTimerTick()
if(MusEGlobal::debugMsg && used && perr > 1)
printf("Dropped %d midi out clock(s). curTick:%d midiClock:%d div:%d\n", perr, curTick, midiClock, div);
- //}
+ //} DELETETHIS and maybe the below ???
// Increment as if we had caught the timer exactly on the mark, even if the timer
// has passed beyond the mark, or even beyond 2 * div.
@@ -732,25 +662,16 @@ void MidiSeq::processTimerTick()
//
// Using equalization periods...
midiClock += (perr * div);
- //midiClock += perr;
+ //midiClock += perr; DELETETHIS
//
- // No equalization periods... TODO:
+ // No equalization periods... TODO: or DELETETHIS?
//midiClock += (perr * div);
}
}
-// if (genMTCSync) {
- // printf("Midi Time Code Sync generation not impl.\n");
-// }
-
- // p3.3.25
- //int tickpos = MusEGlobal::audio->tickPos();
- //bool extsync = MusEGlobal::extSyncFlag.value();
- //
// play all events upto curFrame
- //
for (iMidiDevice id = MusEGlobal::midiDevices.begin(); id != MusEGlobal::midiDevices.end(); ++id) {
- //MidiDevice* md = *id;
+ //MidiDevice* md = *id; DELETETHIS 10
// Is it a Jack midi device? They are iterated in Audio::processMidi. p3.3.36
//MidiJackDevice* mjd = dynamic_cast<MidiJackDevice*>(md);
//if(mjd)
@@ -762,7 +683,7 @@ void MidiSeq::processTimerTick()
if((*id)->deviceType() == MidiDevice::ALSA_MIDI)
(*id)->processMidi();
- // Moved into MidiAlsaDevice. p4.0.34
+ // Moved into MidiAlsaDevice. p4.0.34 DELETETHIS 40
/*
int port = md->midiPort();
MidiPort* mp = port != -1 ? &MusEGlobal::midiPorts[port] : 0;
@@ -838,10 +759,8 @@ void MidiSeq::msgSetMidiDevice(MidiPort* port, MidiDevice* device)
Thread::sendMsg(&msg);
}
-// This does not appear to be used anymore. Was called in Audio::process1, now Audio::processMidi is called directly. p4.0.15 Tim.
-//void MidiSeq::msgProcess() { msgMsg(MusECore::MS_PROCESS); }
-//void MidiSeq::msgSeek() { msgMsg(MusECore::SEQM_SEEK); } // Removed p4.0.34
-//void MidiSeq::msgStop() { msgMsg(MusECore::MS_STOP); } //
+void MidiSeq::msgSeek() { msgMsg(MusECore::SEQM_SEEK); }
+void MidiSeq::msgStop() { msgMsg(MusECore::MS_STOP); }
void MidiSeq::msgSetRtc() { msgMsg(MusECore::MS_SET_RTC); }
void MidiSeq::msgUpdatePollFd() { msgMsg(MusECore::MS_UPDATE_POLL_FD); }