summaryrefslogtreecommitdiff
path: root/muse2/muse/midiseq.cpp
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2012-07-01 16:42:16 +0000
committerFlorian Jung <flo@windfisch.org>2012-07-01 16:42:16 +0000
commit9c4664d162c537ba4dd4fd8220971c0fb727103a (patch)
tree37a28b7cd4e4d8984ad4934a4884cd7b4da0505c /muse2/muse/midiseq.cpp
parente87fedf1be804f7ec774071d844b1f163be30b96 (diff)
final merge
Diffstat (limited to 'muse2/muse/midiseq.cpp')
-rw-r--r--muse2/muse/midiseq.cpp74
1 files changed, 73 insertions, 1 deletions
diff --git a/muse2/muse/midiseq.cpp b/muse2/muse/midiseq.cpp
index 300382e9..2cfc1917 100644
--- a/muse2/muse/midiseq.cpp
+++ b/muse2/muse/midiseq.cpp
@@ -287,6 +287,18 @@ MidiSeq::MidiSeq(const char* name)
lastTempo = 0;
storedtimediffs = 0;
playStateExt = false; // not playing
+
+ _clockAveragerStages = new int[16]; // Max stages is 16!
+ setSyncRecFilterPreset(MusEGlobal::syncRecFilterPreset);
+
+ for(int i = 0; i < _clockAveragerPoles; ++i)
+ {
+ _avgClkDiffCounter[i] = 0;
+ _averagerFull[i] = false;
+ }
+ _tempoQuantizeAmount = 1.0;
+ _lastRealTempo = 0.0;
+
MusEGlobal::doSetuid();
timerFd=selectTimer();
MusEGlobal::undoSetuid();
@@ -300,6 +312,7 @@ MidiSeq::MidiSeq(const char* name)
MidiSeq::~MidiSeq()
{
delete timer;
+ delete _clockAveragerStages;
}
//---------------------------------------------------------
@@ -505,11 +518,70 @@ void MidiSeq::checkAndReportTimingResolution()
"Timing source frequency is %1hz, which is below the recommended minimum: 500hz!\n" \
"This could lead to audible timing problems for MIDI.\n" \
"Please see the FAQ on http://muse-sequencer.org for remedies.\n" \
- "Also please check console output for any further error messages\n ")).arg(freq) );
+ "Also please check console output for any further error messages.\n ")).arg(freq) );
}
}
//---------------------------------------------------------
+// setSyncRecFilterPreset
+// To be called in realtime thread only.
+//---------------------------------------------------------
+void MidiSeq::setSyncRecFilterPreset(MidiSyncInfo::SyncRecFilterPresetType type)
+{
+ _syncRecFilterPreset = type;
+ alignAllTicks();
+
+ switch(_syncRecFilterPreset)
+ {
+ // NOTE: Max _clockAveragerPoles is 16 and maximum stages is 48 per pole !
+ case MidiSyncInfo::NONE:
+ _clockAveragerPoles = 0;
+ _preDetect = false;
+ break;
+ case MidiSyncInfo::TINY:
+ _clockAveragerPoles = 2;
+ _clockAveragerStages[0] = 4;
+ _clockAveragerStages[1] = 4;
+ _preDetect = false;
+ break;
+ case MidiSyncInfo::SMALL:
+ _clockAveragerPoles = 3;
+ _clockAveragerStages[0] = 12;
+ _clockAveragerStages[1] = 8;
+ _clockAveragerStages[2] = 4;
+ _preDetect = false;
+ break;
+ case MidiSyncInfo::MEDIUM:
+ _clockAveragerPoles = 3;
+ _clockAveragerStages[0] = 28;
+ _clockAveragerStages[1] = 12;
+ _clockAveragerStages[2] = 8;
+ _preDetect = false;
+ break;
+ case MidiSyncInfo::LARGE:
+ _clockAveragerPoles = 4;
+ _clockAveragerStages[0] = 48;
+ _clockAveragerStages[1] = 48;
+ _clockAveragerStages[2] = 48;
+ _clockAveragerStages[3] = 48;
+ _preDetect = false;
+ break;
+ case MidiSyncInfo::LARGE_WITH_PRE_DETECT:
+ _clockAveragerPoles = 4;
+ _clockAveragerStages[0] = 8;
+ _clockAveragerStages[1] = 48;
+ _clockAveragerStages[2] = 48;
+ _clockAveragerStages[3] = 48;
+ _preDetect = true;
+ break;
+
+ default:
+ printf("MidiSeq::setSyncRecFilterPreset unknown preset type:%d\n", (int)type);
+ }
+}
+
+
+//---------------------------------------------------------
// processMidiClock
//---------------------------------------------------------