BeatSequencePlayer.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "BeatSequencePlayer.h"
  2. namespace midi {
  3. BeatSequencePlayer::BeatSequencePlayer()
  4. : BeatSequencePlayer(0)
  5. {
  6. }
  7. BeatSequencePlayer::BeatSequencePlayer(Output* out)
  8. : BeatSequencePlayer(out)
  9. {
  10. }
  11. BeatSequencePlayer::BeatSequencePlayer(Output* out, const BeatSequence* seq)
  12. : looping(false), nextBeat(0),
  13. clock(&beat, (void*)this), sequence(seq), output(out)
  14. {
  15. }
  16. bool BeatSequencePlayer::getLooping()
  17. {
  18. looping_mutex.lock();
  19. bool l = looping;
  20. looping_mutex.unlock();
  21. return l;
  22. }
  23. void BeatSequencePlayer::setLooping(bool l)
  24. {
  25. looping_mutex.lock();
  26. looping = l;
  27. looping_mutex.unlock();
  28. }
  29. BeatSequencePlayer::BeatIndex BeatSequencePlayer::getNextBeat()
  30. {
  31. nextBeat_mutex.lock();
  32. BeatIndex n = nextBeat;
  33. nextBeat_mutex.unlock();
  34. return n;
  35. }
  36. BeatSequencePlayer::Bpm BeatSequencePlayer::getBpm()
  37. {
  38. return clock.getBpm();
  39. }
  40. void BeatSequencePlayer::setBpm(Bpm bpm)
  41. {
  42. clock.setBpm(bpm);
  43. }
  44. void BeatSequencePlayer::setNextBeat(BeatIndex n)
  45. {
  46. nextBeat_mutex.lock();
  47. nextBeat = n;
  48. nextBeat_mutex.unlock();
  49. }
  50. void BeatSequencePlayer::play()
  51. {
  52. setLooping(false);
  53. start();
  54. }
  55. void BeatSequencePlayer::loop()
  56. {
  57. setLooping(true);
  58. start();
  59. }
  60. void BeatSequencePlayer::start()
  61. {
  62. clock.start();
  63. }
  64. void BeatSequencePlayer::stop()
  65. {
  66. clock.stop();
  67. }
  68. bool BeatSequencePlayer::isPlaying()
  69. {
  70. return clock.isRunning();
  71. }
  72. void BeatSequencePlayer::beforeBeat(BeatIndex beat)
  73. {
  74. }
  75. void BeatSequencePlayer::afterBeat(BeatIndex beat)
  76. {
  77. }
  78. void BeatSequencePlayer::beat(void* data)
  79. {
  80. BeatSequencePlayer& player = *(BeatSequencePlayer*)data;
  81. if(player.sequence) {
  82. BeatIndex beat = player.getNextBeat();
  83. if(beat >= player.sequence->size()) {
  84. if(player.getLooping() && player.sequence->size() > 0) {
  85. beat = 0;
  86. } else {
  87. player.clock.stop();
  88. }
  89. }
  90. if(beat < player.sequence->size()) {
  91. player.beforeBeat(beat);
  92. const BeatSequence& seq = *player.sequence;
  93. const MessageList& messages = seq[beat];
  94. player.output->sendMessages(messages);
  95. if(beat + 1 == player.sequence->size()) {
  96. if(player.getLooping()) {
  97. player.setNextBeat(0);
  98. } else {
  99. player.clock.stop();
  100. }
  101. } else {
  102. player.setNextBeat(beat + 1);
  103. }
  104. player.afterBeat(beat);
  105. }
  106. } else {
  107. if(!player.getLooping()) {
  108. player.clock.stop();
  109. }
  110. }
  111. }
  112. } // namespace