InputAction.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*
  2. * InputActions.h
  3. *
  4. * Created on: 5 déc. 2020
  5. * Author: fanch
  6. */
  7. #ifndef SRC_INPUTACTIONS_H_
  8. #define SRC_INPUTACTIONS_H_
  9. #include "InputAction.h"
  10. #include "MidiMessage.h"
  11. #include "MidiPort.h"
  12. /**
  13. * @brief Classe qui représente un message Midi prédéfinie avec des paramètres (channel, key, velocity)
  14. * soit défini en dure soit en reprennant les valeur du bouton.
  15. */
  16. class InputAction
  17. {
  18. public:
  19. InputAction() : m_name(""), m_message(new NoteOn(1,0,0)), m_current(new NoteOn(1,0,0))
  20. {
  21. m_key=-1;
  22. m_channel=-1;
  23. m_velocity=-1;
  24. }
  25. virtual ~InputAction(){
  26. if(m_message) delete m_message;
  27. if(m_current) delete m_current;
  28. }
  29. InputAction(const InputAction& c) : m_name(c.m_name)
  30. {
  31. this->operator=(c);
  32. }
  33. InputAction(const std::string& name, MidiMessage* m)
  34. {
  35. m_name=name;
  36. m_message=m_current=NULL;
  37. m_key=-1;
  38. m_channel=-1;
  39. m_velocity=-1;
  40. set_message(m);
  41. }
  42. InputAction(const std::string& name, Json::Value& v)
  43. {
  44. m_name=name;
  45. m_message=m_current=NULL;
  46. m_key=-1;
  47. m_channel=-1;
  48. m_velocity=-1;
  49. set_message(MidiMessage::parse(v), false);
  50. }
  51. const InputAction& operator=(const InputAction& c)
  52. {
  53. m_message=c.m_message->copy();
  54. m_current=c.m_current->copy();
  55. m_key=c.m_key;
  56. m_channel=c.m_channel;
  57. m_velocity=c.m_velocity;
  58. return *this;
  59. }
  60. void set_message(MidiMessage* m, bool copy=true)
  61. {
  62. if(m_message)
  63. {
  64. delete m_message;
  65. m_message=NULL;
  66. }
  67. if(m_current)
  68. {
  69. delete m_current;
  70. m_current=NULL;
  71. }
  72. m_current = m->copy();
  73. m_message = copy?m->copy():m;
  74. if(m_key>=0) set_key(m_key);
  75. if(m_channel>=0) set_channel(m_channel);
  76. if(m_velocity>=0) set_velocity(m_velocity);
  77. }
  78. void set_key(int k) {
  79. m_key=k;
  80. switch(m_message->type){
  81. case MidiMessage::NOTE_ON:
  82. case MidiMessage::CONTROLLER_CHANGE:
  83. case MidiMessage::NOTE_OFF:
  84. (dynamic_cast<Note*>(m_current))->key=k;
  85. break;
  86. }
  87. }
  88. void set_channel(int k) {
  89. m_channel=k;
  90. switch(m_message->type){
  91. case MidiMessage::NOTE_ON:
  92. case MidiMessage::CONTROLLER_CHANGE:
  93. case MidiMessage::NOTE_OFF:
  94. (dynamic_cast<Note*>(m_current))->channel=k;
  95. break;
  96. }
  97. }
  98. void set_velocity(int k) {
  99. m_velocity=k;
  100. switch(m_message->type){
  101. case MidiMessage::NOTE_ON:
  102. case MidiMessage::CONTROLLER_CHANGE:
  103. case MidiMessage::NOTE_OFF:
  104. (dynamic_cast<Note* >(m_current))->velocity=k;
  105. break;
  106. }
  107. }
  108. MidiMessage* get_message() const {return m_message; }
  109. const std::string& get_name() const {return m_name; }
  110. protected:
  111. std::string m_name;
  112. MidiMessage* m_message;
  113. MidiMessage* m_current;
  114. int m_channel;
  115. int m_key;
  116. int m_velocity;
  117. friend class PadDefinition;
  118. };
  119. class InputActionList : public std::vector<InputAction*>
  120. {
  121. public:
  122. InputActionList() : std::vector<InputAction*>(){}
  123. InputActionList(const std::string& n, InputAction* i) : std::vector<InputAction*>()
  124. {
  125. push_back(i);
  126. name=n;
  127. }
  128. InputActionList(const InputActionList& v) : std::vector<InputAction*>(){operator=(v);}
  129. InputActionList(const std::string& n, Json::Value& v) : std::vector<InputAction*>(){
  130. name=n;
  131. add(v);
  132. }
  133. void add(Json::Value& v){
  134. int s = v.size();
  135. if(s && v[0].isString())
  136. {
  137. push_back(new InputAction("", v));
  138. }else{
  139. for(int i=0; i<s; i++)
  140. push_back(new InputAction("", v[i]));
  141. }
  142. }
  143. virtual ~InputActionList()
  144. {
  145. clear();
  146. }
  147. void clear()
  148. {
  149. int s = size();
  150. for(int i=0; i<s; i++) delete at(i);
  151. std::vector<InputAction*>::clear();
  152. }
  153. const InputActionList& operator=(const InputActionList& l){
  154. std::vector<InputAction*>::operator=(l);
  155. name=l.name;
  156. return l;
  157. }
  158. MidiMessageList* get_messages()
  159. {
  160. m_midi.clear();
  161. for(int i=0; i<size(); i++)
  162. m_midi.push_back(at(i)->get_message());
  163. return &m_midi;
  164. }
  165. const std::string& get_name() const {return name;}
  166. std::string name;
  167. MidiMessageList m_midi;
  168. };
  169. #endif /* SRC_INPUTACTIONS_H_ */