BeatSequencePlayer.cpp 2.5 KB

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