123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #include "BeatSequencePlayer.h"
- namespace midi {
- BeatSequencePlayer::BeatSequencePlayer()
- : BeatSequencePlayer(0)
- {
- }
- BeatSequencePlayer::BeatSequencePlayer(Output* out)
- : BeatSequencePlayer(out)
- {
- }
- BeatSequencePlayer::BeatSequencePlayer(Output* out, const BeatSequence* seq)
- : looping(false), nextBeat(0),
- clock(&beat, (void*)this), sequence(seq), output(out)
- {
- }
- bool BeatSequencePlayer::getLooping()
- {
- looping_mutex.lock();
- bool l = looping;
- looping_mutex.unlock();
- return l;
- }
- void BeatSequencePlayer::setLooping(bool l)
- {
- looping_mutex.lock();
- looping = l;
- looping_mutex.unlock();
- }
- BeatSequencePlayer::BeatIndex BeatSequencePlayer::getNextBeat()
- {
- nextBeat_mutex.lock();
- BeatIndex n = nextBeat;
- nextBeat_mutex.unlock();
- return n;
- }
- BeatSequencePlayer::Bpm BeatSequencePlayer::getBpm()
- {
- return clock.getBpm();
- }
- void BeatSequencePlayer::setBpm(Bpm bpm)
- {
- clock.setBpm(bpm);
- }
- void BeatSequencePlayer::setNextBeat(BeatIndex n)
- {
- nextBeat_mutex.lock();
- nextBeat = n;
- nextBeat_mutex.unlock();
- }
- void BeatSequencePlayer::play()
- {
- setLooping(false);
- start();
- }
- void BeatSequencePlayer::loop()
- {
- setLooping(true);
- start();
- }
- void BeatSequencePlayer::start()
- {
- clock.start();
- }
- void BeatSequencePlayer::stop()
- {
- clock.stop();
- }
- bool BeatSequencePlayer::isPlaying()
- {
- return clock.isRunning();
- }
- void BeatSequencePlayer::beforeBeat(BeatIndex beat)
- {
- }
- void BeatSequencePlayer::afterBeat(BeatIndex beat)
- {
- }
- void BeatSequencePlayer::beat(void* data)
- {
- BeatSequencePlayer& player = *(BeatSequencePlayer*)data;
- if(player.sequence) {
- BeatIndex beat = player.getNextBeat();
- if(beat >= player.sequence->size()) {
- if(player.getLooping() && player.sequence->size() > 0) {
- beat = 0;
- } else {
- player.clock.stop();
- }
- }
- if(beat < player.sequence->size()) {
- player.beforeBeat(beat);
- const BeatSequence& seq = *player.sequence;
- const MessageList& messages = seq[beat];
- player.output->sendMessages(messages);
- if(beat + 1 == player.sequence->size()) {
- if(player.getLooping()) {
- player.setNextBeat(0);
- } else {
- player.clock.stop();
- }
- } else {
- player.setNextBeat(beat + 1);
- }
-
- player.afterBeat(beat);
- }
- } else {
- if(!player.getLooping()) {
- player.clock.stop();
- }
- }
- }
- } // namespace
|