Atm_player.hpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #pragma once
  2. #include <Automaton.h>
  3. #if defined( _VARIANT_ARDUINO_DUE_X ) || defined( ARDUINO_FEATHER52 )
  4. #define ATM_PLAYER_DISABLE_TONE
  5. #endif
  6. class Atm_player : public Machine {
  7. public:
  8. enum { IDLE, START, SOUND, QUIET, NEXT, REPEAT, FINISH }; // STATES
  9. enum { EVT_START, EVT_STOP, EVT_TOGGLE, EVT_TIMER, EVT_EOPAT, EVT_REPEAT, ELSE }; // EVENTS
  10. Atm_player( void ) : Machine(){};
  11. Atm_player& begin( int pin = -1 );
  12. Atm_player& trace( Stream& stream );
  13. Atm_player& trigger( int event );
  14. int state( void );
  15. Atm_player& play( int* pat, int size );
  16. Atm_player& play( uint32_t* pat, int size );
  17. Atm_player& play( int freq, int period, int pause = 0 );
  18. Atm_player& repeat( uint16_t v = -1 );
  19. Atm_player& speed( float v );
  20. Atm_player& pitch( float v );
  21. Atm_player& start( void );
  22. Atm_player& stop( void );
  23. Atm_player& toggle( void );
  24. Atm_player& onFinish( Machine& machine, int event = 0 );
  25. Atm_player& onFinish( atm_cb_push_t callback, int idx = 0 );
  26. Atm_player& onNote( Machine& machine, int event = 0 );
  27. Atm_player& onNote( atm_cb_push_t callback, int idx = 0 );
  28. Atm_player& onNote( int sub, Machine& machine, int event = 0 );
  29. Atm_player& onNote( int sub, atm_cb_push_t callback, int idx = 0 );
  30. private:
  31. int pin;
  32. int* pattern16; // Can also be 32 bit on some hardware (teensy 3.x)
  33. uint32_t* pattern32;
  34. uint16_t patternsize;
  35. uint8_t patternwidth;
  36. int step;
  37. uint16_t repeatCount;
  38. float speedFactor, pitchFactor;
  39. int stub[3];
  40. atm_timer_millis timer;
  41. atm_counter counter_repeat;
  42. enum { ENT_IDLE, ENT_START, ENT_SOUND, ENT_QUIET, ENT_NEXT, ENT_REPEAT, ENT_FINISH }; // ACTIONS
  43. enum { ON_FINISH, ON_NOTE, CONN_MAX = 3 }; // CONNECTORS
  44. atm_connector connectors[CONN_MAX];
  45. int event( int id );
  46. void action( int id );
  47. };
  48. /*
  49. Automaton::ATML::begin - Automaton Markup Language
  50. <?xml version="1.0" encoding="UTF-8"?>
  51. <machines>
  52. <machine name="Atm_player">
  53. <states>
  54. <IDLE index="0" sleep="1" on_enter="ENT_IDLE">
  55. <EVT_START>START</EVT_START>
  56. <EVT_TOGGLE>START</EVT_TOGGLE>
  57. </IDLE>
  58. <START index="1" on_enter="ENT_START">
  59. <ELSE>SOUND</ELSE>
  60. </START>
  61. <SOUND index="2" on_enter="ENT_SOUND">
  62. <EVT_STOP>IDLE</EVT_STOP>
  63. <EVT_TOGGLE>IDLE</EVT_TOGGLE>
  64. <EVT_TIMER>QUIET</EVT_TIMER>
  65. </SOUND>
  66. <QUIET index="3" on_enter="ENT_QUIET">
  67. <EVT_STOP>IDLE</EVT_STOP>
  68. <EVT_TOGGLE>IDLE</EVT_TOGGLE>
  69. <EVT_TIMER>NEXT</EVT_TIMER>
  70. </QUIET>
  71. <NEXT index="4" on_enter="ENT_NEXT">
  72. <EVT_STOP>IDLE</EVT_STOP>
  73. <EVT_TOGGLE>IDLE</EVT_TOGGLE>
  74. <EVT_EOPAT>REPEAT</EVT_EOPAT>
  75. <ELSE>SOUND</ELSE>
  76. </NEXT>
  77. <REPEAT index="5" on_enter="ENT_REPEAT">
  78. <EVT_STOP>IDLE</EVT_STOP>
  79. <EVT_TOGGLE>IDLE</EVT_TOGGLE>
  80. <EVT_REPEAT>FINISH</EVT_REPEAT>
  81. <ELSE>START</ELSE>
  82. </REPEAT>
  83. <FINISH index="6" on_enter="ENT_FINISH">
  84. <EVT_REPEAT>IDLE</EVT_REPEAT>
  85. <ELSE>START</ELSE>
  86. </FINISH>
  87. </states>
  88. <events>
  89. <EVT_START index="0"/>
  90. <EVT_STOP index="1"/>
  91. <EVT_TOGGLE index="2"/>
  92. <EVT_TIMER index="3"/>
  93. <EVT_EOPAT index="4"/>
  94. <EVT_REPEAT index="5"/>
  95. </events>
  96. <connectors>
  97. <FINISH autostore="0" broadcast="0" dir="PUSH" slots="1"/>
  98. <NOTE autostore="0" broadcast="0" dir="PUSH" slots="2"/>
  99. </connectors>
  100. <methods>
  101. </methods>
  102. </machine>
  103. </machines>
  104. Automaton::ATML::end
  105. */