libcm is a C development framework with an emphasis on audio signal processing applications.
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

cmScore.h 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #ifndef cmScore_h
  2. #define cmScore_h
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. enum
  7. {
  8. kOkScRC = cmOkRC,
  9. kCsvFailScRC,
  10. kSyntaxErrScRC,
  11. kInvalidIdxScRC,
  12. kTimeLineFailScRC,
  13. kInvalidDynRefCntScRC,
  14. kMidiFileFailScRC
  15. };
  16. enum
  17. {
  18. kInvalidEvtScId = 0,
  19. kTimeSigEvtScId,
  20. kKeySigEvtScId,
  21. kTempoEvtScId,
  22. kTrackEvtScId,
  23. kTextEvtScId,
  24. kEOTrackEvtScId,
  25. kCopyEvtScId,
  26. kBlankEvtScId,
  27. kBarEvtScId,
  28. kPgmEvtScId,
  29. kCtlEvtScId,
  30. kNonEvtScId
  31. };
  32. // Flags used by cmScoreEvt_t.flags
  33. enum
  34. {
  35. kEvenScFl = 0x01, // This note is marked for evenness measurement
  36. kDynScFl = 0x02, // This note is marked for dynamics measurement
  37. kTempoScFl = 0x04, // This note is marked for tempo measurement
  38. kSkipScFl = 0x08, // This isn't a real event (e.g. tied note) skip over it
  39. kGraceScFl = 0x10, // This is a grace note
  40. kInvalidScFl = 0x20 // This note has a calculated time
  41. };
  42. // Id's used by cmScoreSet_t.varId and as indexes into
  43. // cmScoreSection_t.vars[].
  44. enum
  45. {
  46. kEvenVarScId,
  47. kDynVarScId,
  48. kTempoVarScId,
  49. kScVarCnt
  50. };
  51. struct cmScoreLoc_str;
  52. struct cmScoreSet_str;
  53. // The score can be divided into arbitrary non-overlapping sections.
  54. typedef struct
  55. {
  56. const cmChar_t* label; // section label
  57. unsigned index; // index of this record in the internal section array
  58. struct cmScoreLoc_str* locPtr; // location where this section starts
  59. unsigned begEvtIndex; // score element index where this section starts
  60. unsigned setCnt; // Count of elements in setArray[]
  61. struct cmScoreSet_str** setArray; // Ptrs to sets which are applied to this section.
  62. double vars[ kScVarCnt ]; // Set to DBL_MAX by default.
  63. } cmScoreSection_t;
  64. typedef struct
  65. {
  66. unsigned type; // Event type
  67. double secs; // Time location in seconds
  68. double durSecs; // Duration in seconds
  69. unsigned index; // Index of this event in the event array.
  70. unsigned locIdx; // Index of the location containing this event
  71. cmMidiByte_t pitch; // MIDI pitch of this note
  72. unsigned flags; // Attribute flags for this event
  73. unsigned dynVal; // Dynamcis value pppp to ffff (1 to 11) for this note.
  74. double frac; // Note's time value for tempo and non-grace evenness notes.
  75. unsigned barNumb; // Bar id of the measure containing this event.
  76. unsigned barNoteIdx; // Index of this note in this bar
  77. unsigned csvRowNumb; // File row number (not index) from which this record originated
  78. unsigned perfSmpIdx; // Time this event was performed or cmInvalidIdx if the event was not performed.
  79. unsigned perfVel; // Velocity of the performed note or 0 if the note was not performed.
  80. unsigned perfDynLvl; // Index into dynamic level ref. array assoc'd with perfVel
  81. unsigned line; // Line number of this event in the score file.
  82. } cmScoreEvt_t;
  83. typedef struct cmScoreSet_str
  84. {
  85. unsigned varId; // See kXXXVarScId flags above
  86. cmScoreEvt_t** eleArray; // Events that make up this set in time order
  87. unsigned eleCnt; //
  88. cmScoreSection_t** sectArray; // Sections this set will be applied to
  89. unsigned sectCnt; //
  90. unsigned* symArray; // symArray[sectCnt] - symbol name of all variables represented by this set (e.g '1a-e', '1b-e', '2-t', etc)
  91. unsigned* costSymArray; // costSymArray[sectCnt] - same as symbols in symArray[] with 'c' prepended to front
  92. bool doneFl;
  93. double value;
  94. struct cmScoreSet_str* llink; // cmScoreLoc_t setList link
  95. } cmScoreSet_t;
  96. // All events which are simultaneous are collected into a single
  97. // cmScoreLoc_t record.
  98. typedef struct cmScoreLoc_str
  99. {
  100. unsigned index; // index of this location record
  101. double secs; // Time of this location
  102. unsigned evtCnt; // Count of events in evtArray[].
  103. cmScoreEvt_t** evtArray; // Events which occur at this time.
  104. unsigned barNumb; // Bar number this event is contained by.
  105. cmScoreSet_t* setList; // Set's which end on this time location (linked through cmScoreSet_t.llink)
  106. cmScoreSection_t* begSectPtr; // NULL if this location does not start a section
  107. } cmScoreLoc_t;
  108. typedef void (*cmScCb_t)( void* arg, const void* data, unsigned byteCnt );
  109. typedef cmRC_t cmScRC_t;
  110. typedef cmHandle_t cmScH_t;
  111. extern cmScH_t cmScNullHandle;
  112. const cmChar_t* cmScEvtTypeIdToLabel( unsigned id );
  113. const cmChar_t* cmScDynIdToLabel( unsigned id );
  114. // Initialize a score object from a CSV File generated from a score spreadsheet.
  115. // The dynRefArray[dynRefCnt] and cbFunc(cbArg) are optional if these
  116. // features are not used.
  117. // If provided the dynRefArray[] is copied into an internal array.
  118. // The physical array passed here therefore does not need to remain valid.
  119. // Set 'srate' to zero if the score will not be used to perform measurement calculations.
  120. // The symbol table is only necessary if valid symbols are to be assigned to the cmScoreSet_t.symArray[].
  121. cmScRC_t cmScoreInitialize( cmCtx_t* ctx, cmScH_t* hp, const cmChar_t* fn, double srate, const unsigned* dynRefArray, unsigned dynRefCnt, cmScCb_t cbFunc, void* cbArg, cmSymTblH_t stH );
  122. cmScRC_t cmScoreFinalize( cmScH_t* hp );
  123. // Filename of last successfuly loaded score file.
  124. const cmChar_t* cmScoreFileName( cmScH_t h );
  125. // Sample rate as set in cmScoreInitialize()
  126. double cmScoreSampleRate( cmScH_t h );
  127. // Validate the score handle
  128. bool cmScoreIsValid( cmScH_t h );
  129. // Access the score data.
  130. unsigned cmScoreEvtCount( cmScH_t h );
  131. cmScoreEvt_t* cmScoreEvt( cmScH_t h, unsigned idx );
  132. // Given a bar number return the associated 'bar' event record.
  133. cmScoreEvt_t* cmScoreBarEvt( cmScH_t h, unsigned barNumb );
  134. // Access section records
  135. unsigned cmScoreSectionCount( cmScH_t h );
  136. cmScoreSection_t* cmScoreSection( cmScH_t h, unsigned idx );
  137. // Access the score location data
  138. unsigned cmScoreLocCount( cmScH_t h );
  139. cmScoreLoc_t* cmScoreLoc( cmScH_t h, unsigned idx );
  140. void cmScorePrintLoc( cmScH_t h );
  141. // Return the location associated with a given score event.
  142. cmScoreLoc_t* cmScoreEvtLoc( cmScH_t h, const cmScoreEvt_t* evt );
  143. // Return the count of sets.
  144. unsigned cmScoreSetCount( cmScH_t h );
  145. // Make callbacks for all events in the score. The callbacks
  146. // contain cmScMsg_t records serialized as a byte stream.
  147. // Use cmScoreDecode() to convert the byte string to a
  148. // cmScMsg_t record.
  149. cmScRC_t cmScoreSeqNotify( cmScH_t h );
  150. void cmScoreClearPerfInfo( cmScH_t h );
  151. // Assign 'smpIdx' and 'vel' to the event matching 'pitch' at 'locIdx'
  152. // but do not trigger any variable calculations. Return true if as a
  153. // result of this call all events assigned to 'locIdx' have been received
  154. // otherwise return false.
  155. bool cmScoreSetPerfEvent( cmScH_t h, unsigned locIdx, unsigned smpIdx, unsigned pitch, unsigned vel );
  156. // Assign 'smpIdx' and 'vel' to the event matching 'pitch' at 'locIdx'
  157. // but and trigger any variable calculations which may happen on, or before, 'locIdx'.
  158. void cmScoreExecPerfEvent( cmScH_t h, unsigned locIdx, unsigned smpIdx, unsigned pitch, unsigned vel );
  159. // Assign 'value' to the section at, or before, 'locIdx'.
  160. void cmScoreSetPerfValue( cmScH_t h, unsigned locIdx, unsigned varId, double value );
  161. // Set the performed dynamic level of a score event.
  162. void cmScoreSetPerfDynLevel( cmScH_t h, unsigned evtIdx, unsigned dynLvl );
  163. typedef enum
  164. {
  165. kInvalidMsgScId,
  166. kBeginMsgScId,
  167. kEventMsgScId,
  168. kSectionMsgScId,
  169. kEndMsgScId,
  170. kVarMsgScId,
  171. kDynMsgScId
  172. } cmScMsgTypeId_t;
  173. typedef struct
  174. {
  175. unsigned varId; // see kXXXVarScId from cmScoreSet_t.varId
  176. double value; // value of a variable
  177. } cmScMeas_t;
  178. typedef struct
  179. {
  180. unsigned evtIdx;
  181. unsigned dynLvl;
  182. } cmScDyn_t;
  183. typedef struct
  184. {
  185. cmScMsgTypeId_t typeId;
  186. union
  187. {
  188. cmScoreEvt_t evt; // only used when typeId == kEventMsgScId
  189. cmScMeas_t meas; // only used when typeId == kVarMsgScId
  190. cmScoreSection_t sect; // only used when typeId == kSectionMsgScId
  191. cmScDyn_t dyn; // only used when typeId == kDynLvlMsgScId
  192. } u;
  193. } cmScMsg_t;
  194. // Decode a serialized cmScMsg_t from a byte stream as passed to the
  195. // cmScCb_t function.
  196. cmScRC_t cmScoreDecode( const void* msg, unsigned msgByteCnt, cmScMsg_t* );
  197. void cmScorePrint( cmScH_t h, cmRpt_t* rpt );
  198. // Generate a new score file from a MIDI file.
  199. cmScRC_t cmScoreFileFromMidi( cmCtx_t* ctx, const cmChar_t* midiFn, const cmChar_t* scoreFn );
  200. void cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn );
  201. #ifdef __cplusplus
  202. }
  203. #endif
  204. #endif