cmScore.h/c Major changes and additions to implement score attribute sets and score sections.

This commit is contained in:
kevin 2012-12-03 17:17:55 -08:00
parent ad22aa1110
commit d45fd52660
2 changed files with 849 additions and 85 deletions

File diff suppressed because it is too large Load Diff

View File

@ -34,35 +34,63 @@ extern "C" {
enum enum
{ {
kEvenScFl = 0x01, // This note is marked for evenness measurement kEvenScFl = 0x01, // This note is marked for evenness measurement
kDynScFl = 0x02, // This note is marked for dynamics measurement kDynScFl = 0x02, // This note is marked for dynamics measurement
kTempoScFl = 0x03, // This note is marked for tempo measurement kTempoScFl = 0x04, // This note is marked for tempo measurement
kSkipScFl = 0x04, // This isn't a real event (e.g. tied note) skip over it kSkipScFl = 0x08, // This isn't a real event (e.g. tied note) skip over it
kInvalidScFl = 0x08 // This note has a calculated time kInvalidScFl = 0x10 // This note has a calculated time
}; };
struct cmScoreLoc_str;
// The score can be divided into arbitrary non-overlapping sections.
typedef struct
{
const cmChar_t* label; // section label
struct cmScoreLoc_str* locPtr; // location where this section starts
unsigned begIndex; // score element index where this section starts
double evenCoeff; //
double dynCoeff; //
double tempoCeoff; //
} cmScoreSection_t;
typedef struct typedef struct
{ {
unsigned type; // Event type unsigned type; // Event type
double secs; // Time location in seconds double secs; // Time location in seconds
double durSecs; // Duration in seconds double durSecs; // Duration in seconds
unsigned index; // index of this event unsigned index; // Index of this event in the event array.
cmMidiByte_t pitch; // MIDI pitch of this note cmMidiByte_t pitch; // MIDI pitch of this note
unsigned flags; // Attribute flags for this event unsigned flags; // Attribute flags for this event
unsigned dynVal; // Dynamcis value pppp to ffff (1 to 11) for this note. unsigned dynVal; // Dynamcis value pppp to ffff (1 to 11) for this note.
unsigned barNumb; // bar number of this event unsigned barNumb; // Bar id of the measure containing this event.
unsigned barNoteIdx; // index of this note in this bar unsigned barNoteIdx; // Index of this note in this bar
unsigned csvRowNumb; // File row number (not index) from which this record originated
unsigned perfSmpIdx; // Time this event was performed or cmInvalidIdx if the event was not performed.
unsigned perfVel; // Velocity of the performed note or 0 if the note was not performed.
} cmScoreEvt_t; } cmScoreEvt_t;
typedef struct typedef struct cmScoreSet_str
{ {
double secs; // Time of this location unsigned typeFl; // See kXXXScFl flags above
unsigned evtCnt; // Count of events in evtArray[]. cmScoreEvt_t** eleArray; // Events that make up this set in time order
cmScoreEvt_t** evtArray; // Events which occur at this time. unsigned eleCnt; //
unsigned evtIdx; // Index into the master event array cmScoreSection_t** sectArray; // Array of pointers to sections to apply this set to
// (p->array[]) of the first event in this loc. unsigned sectCnt; //
unsigned barNumb; // Bar number this event is contained by. struct cmScoreSet_str* link; // cmScoreLoc_t setList link
} cmScoreSet_t;
// All events which are simultaneous are collected into a single
// cmScoreLoc_t record.
typedef struct cmScoreLoc_str
{
double secs; // Time of this location
unsigned evtCnt; // Count of events in evtArray[].
cmScoreEvt_t** evtArray; // Events which occur at this time.
unsigned barNumb; // Bar number this event is contained by.
cmScoreSet_t* setList; // Set's which end on this time location
cmScoreSection_t* begSectPtr; // NULL if this location does not start a section
} cmScoreLoc_t; } cmScoreLoc_t;
typedef void (*cmScCb_t)( void* arg, const void* data, unsigned byteCnt ); typedef void (*cmScCb_t)( void* arg, const void* data, unsigned byteCnt );
@ -85,6 +113,7 @@ extern "C" {
// Filename of last successfuly loaded score file. // Filename of last successfuly loaded score file.
const cmChar_t* cmScoreFileName( cmScH_t h ); const cmChar_t* cmScoreFileName( cmScH_t h );
// Validate the score handle
bool cmScoreIsValid( cmScH_t h ); bool cmScoreIsValid( cmScH_t h );
// Access the score data. // Access the score data.
@ -94,10 +123,18 @@ extern "C" {
// Access the score location data // Access the score location data
unsigned cmScoreLocCount( cmScH_t h ); unsigned cmScoreLocCount( cmScH_t h );
cmScoreLoc_t* cmScoreLoc( cmScH_t h, unsigned idx ); cmScoreLoc_t* cmScoreLoc( cmScH_t h, unsigned idx );
void cmScorePrintLoc( cmScH_t h );
// Make callbacks for all events in the score. The callbacks
// contain cmScMsg_t records serialized as a byte stream.
// Use cmScoreDecode() to convert the byte string to a
// cmScMsg_t record.
cmScRC_t cmScoreSeqNotify( cmScH_t h ); cmScRC_t cmScoreSeqNotify( cmScH_t h );
void cmScoreClearPerfInfo( cmScH_t h );
void cmScoreSetPerfEvent( cmScH_t h, unsigned locIdx, unsigned smpIdx, unsigned pitch, unsigned vel );
typedef enum typedef enum
{ {
kInvalidMsgScId, kInvalidMsgScId,
@ -112,17 +149,14 @@ extern "C" {
cmScoreEvt_t evt; // only used when typeId == kEventMsgScId cmScoreEvt_t evt; // only used when typeId == kEventMsgScId
} cmScMsg_t; } cmScMsg_t;
// Decode a serialized cmScMsg_t from a byte stream as passed to the
// cmScCb_t function.
cmScRC_t cmScoreDecode( const void* msg, unsigned msgByteCnt, cmScMsg_t* ); cmScRC_t cmScoreDecode( const void* msg, unsigned msgByteCnt, cmScMsg_t* );
void cmScorePrint( cmScH_t h, cmRpt_t* rpt ); void cmScorePrint( cmScH_t h, cmRpt_t* rpt );
cmScRC_t cmScoreSyncTimeLine( cmScH_t scH, cmTlH_t tlH, unsigned editDistWndCnt, cmReal_t maxNoteOffsetSecs );
cmScRC_t cmScoreSyncTimeLineTest( cmCtx_t* ctx, const cmChar_t* timeLineJsFn, const cmChar_t* scoreCsvFn );
void cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn ); void cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn );
void cmScoreFix( cmCtx_t* ctx );
#ifdef __cplusplus #ifdef __cplusplus
} }