summaryrefslogtreecommitdiff
path: root/muse2/muse/midi.cpp
diff options
context:
space:
mode:
authorRobert Jonsson <spamatica@gmail.com>2013-02-07 21:24:46 +0000
committerRobert Jonsson <spamatica@gmail.com>2013-02-07 21:24:46 +0000
commit902abc5f16e90a0c1097c3d6bc932ea53aaea142 (patch)
tree51acbd864bf273262c894a73f02ce25bd20075a7 /muse2/muse/midi.cpp
parent2f4156822ef88a9aef541547da5055561c4e6ab6 (diff)
metronome work
Diffstat (limited to 'muse2/muse/midi.cpp')
-rw-r--r--muse2/muse/midi.cpp97
1 files changed, 69 insertions, 28 deletions
diff --git a/muse2/muse/midi.cpp b/muse2/muse/midi.cpp
index 2751d562..8f5ed22c 100644
--- a/muse2/muse/midi.cpp
+++ b/muse2/muse/midi.cpp
@@ -1250,49 +1250,90 @@ void Audio::processMidi()
if (MusEGlobal::midiClickFlag)
md = MusEGlobal::midiPorts[MusEGlobal::clickPort].device();
if (MusEGlobal::song->click() && (isPlaying() || state == PRECOUNT)) {
- int bar, beat;
+ int bar, beat, z, n;
unsigned tick;
- bool isMeasure = false;
+ AudioTickSound audioTickSound = MusECore::beatSound;
while (midiClick < nextTickPos) {
if (isPlaying()) {
- AL::sigmap.tickValues(midiClick, &bar, &beat, &tick);
- isMeasure = beat == 0;
- }
+ AL::sigmap.tickValues(midiClick, &bar, &beat, &tick);
+ AL::sigmap.timesig(midiClick, z, n);
+
+ //n = 2;
+ if (tick == 0 && beat == 0) {
+ audioTickSound = MusECore::measureSound;
+ if (MusEGlobal::debugMsg)
+ printf("meas: midiClick %d nextPos %d bar %d beat %d tick %d z %d n %d div %d\n", midiClick, nextTickPos, bar, beat, tick, z, n, MusEGlobal::config.division);
+ }
+ else if (tick == unsigned(MusEGlobal::config.division - (MusEGlobal::config.division/(n*2)))) {
+ audioTickSound = MusECore::accent2Sound;
+ if (MusEGlobal::debugMsg)
+ printf("acc2: midiClick %d nextPos %d bar %d beat %d tick %d z %d n %d div %d\n", midiClick, nextTickPos, bar, beat, tick, z, n, MusEGlobal::config.division);
+ }
+ else if (tick == unsigned(MusEGlobal::config.division - (MusEGlobal::config.division/n))) {
+ audioTickSound = MusECore::accent1Sound;
+ if (MusEGlobal::debugMsg)
+ printf("acc1: midiClick %d nextPos %d bar %d beat %d tick %d z %d n %d div %d\n", midiClick, nextTickPos, bar, beat, tick, z, n, MusEGlobal::config.division);
+ } else {
+ if (MusEGlobal::debugMsg)
+ printf("beat: midiClick %d nextPos %d bar %d beat %d tick %d z %d n %d div %d\n", midiClick, nextTickPos, bar, beat, tick, z, n, MusEGlobal::config.division);
+ }
+ }
else if (state == PRECOUNT) {
- isMeasure = (clickno % clicksMeasure) == 0;
- }
+ if ((clickno % clicksMeasure) == 0) {
+ audioTickSound = MusECore::measureSound;
+ }
+ }
int evtime = extsync ? midiClick : MusEGlobal::tempomap.tick2frame(midiClick) + frameOffset; // p3.3.25
-
+
+ MusECore::MidiPlayEvent ev(evtime, MusEGlobal::clickPort, MusEGlobal::clickChan, MusECore::ME_NOTEON, MusEGlobal::beatClickNote, MusEGlobal::beatClickVelo);
+ if (audioTickSound == MusECore::measureSound) {
+ ev.setA(MusEGlobal::measureClickNote);
+ ev.setB(MusEGlobal::measureClickVelo);
+ }
+ if (audioTickSound == MusECore::accent1Sound) {
+ ev.setA(MusEGlobal::accentClick1);
+ ev.setB(MusEGlobal::accentClick1Velo);
+ }
+ if (audioTickSound == MusECore::accent2Sound) {
+ ev.setA(MusEGlobal::accentClick2);
+ ev.setB(MusEGlobal::accentClick2Velo);
+ }
if (md) {
- MusECore::MidiPlayEvent ev(evtime, MusEGlobal::clickPort, MusEGlobal::clickChan, MusECore::ME_NOTEON,
- MusEGlobal::beatClickNote, MusEGlobal::beatClickVelo);
-
- if (isMeasure) {
- ev.setA(MusEGlobal::measureClickNote);
- ev.setB(MusEGlobal::measureClickVelo);
- }
- md->addScheduledEvent(ev);
-
- ev.setB(0);
- ev.setTime(midiClick+10);
- md->addStuckNote(ev);
- }
+ md->addScheduledEvent(ev);
+ ev.setB(0);
+ ev.setTime(midiClick+10);
+ md->addStuckNote(ev);
+ }
if (MusEGlobal::audioClickFlag) {
- MusECore::MidiPlayEvent ev(evtime, 0, 0, MusECore::ME_NOTEON, 0, 0);
- ev.setA(isMeasure ? 0 : 1);
- metronome->addScheduledEvent(ev);
- // Built-in metronome synth does not use stuck notes...
- }
- if (isPlaying())
+ ev.setA(audioTickSound);
+ metronome->addScheduledEvent(ev);
+ // Built-in metronome synth does not use stuck notes...
+ }
+ if (isPlaying()) {
+ // State machine to select next midiClick position.
+ if (MusEGlobal::clickSamples == MusEGlobal::newSamples) {
+ if (tick == 0) {// ON key
+ midiClick = AL::sigmap.bar2tick(bar, beat, MusEGlobal::config.division - ((MusEGlobal::config.division/n)));
+ }
+ else if (tick >= unsigned(MusEGlobal::config.division - (MusEGlobal::config.division/(n*2)))) { // second accent tick
+ midiClick = AL::sigmap.bar2tick(bar, beat+1, 0);
+ }
+ else if (tick < unsigned(MusEGlobal::config.division - ((MusEGlobal::config.division/(n*2))))) { // first accent tick
+ midiClick = AL::sigmap.bar2tick(bar, beat, MusEGlobal::config.division - (MusEGlobal::config.division/(n*2)));
+ }
+ }
+ else {
midiClick = AL::sigmap.bar2tick(bar, beat+1, 0);
+ }
+ }
else if (state == PRECOUNT) {
midiClick += ticksBeat;
if (clickno)
--clickno;
else
state = START_PLAY;
- }
}
+ }
}
//