123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- #ifndef cmSdb_h
- #define cmSdb_h
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- /*
- The data for this object is stored in a CSV file with the following column syntax.
-
- Column Name Type Description
- ------ -------- ----- -----------------------------------------------------
- 1 uuid uint Unique integer identifier for this event
- 2 baseUuid uint uuid of channel 0 for this event
- 3 chIdx uint Channel index (stereo: 1=left 2=right)
- 4 obi uint Outer onset sample index into 'afn'.
- 5 ibi uint Inner onset sample index into 'afn'.
- 6 iei uint Inner offset sample index into 'afn'.
- 7 oei uint Outer offset sample index into 'afn'.
- 8 src text Source label for this event (e.g. mcgill, ui )
- 9 midi uint MIDI pitch number or -1 if the sample is not pitched
- 10 instr text Instrument label.
- 11 srate uint Sample rate of audio file reference by 'afn'.
- 10 chCnt uint Count of channels for this event.
- * notes text 0 or more free form double quoted text notes.
- * afn text File name of the audio file this event occurs in.
-
- Notes:
- #. Each event represents a mono audio signal. If the event is drawn
- from a multi-channel audio file then the 'chCnt' field will be
- greater than one. If 'chCnt' is greater than one then the associated
- samples can be found by collecting all events that share the
- same 'baseUuid'.
-
- #. There may be zero or more columns of 'notes'. If there are no
- notes then the 'afn' field is in column 11.
-
- #. The index values (chIdx,obi,ibi,iei,oei) as stored in the CSV file
- are 1 based. These values are decreased by 1 by the cmSdb CSV reader
- so that their cmSdb value is zero based. See cmSdbLoad().
-
- */
-
- enum
- {
- kOkSdbRC,
- kLHeapFailSdbRC,
- kCsvFailSdbRC,
- kSyntaxErrSdbRC,
- kInvalidRspIdxSdbRC,
- kChPairNotFoundSdbRC
- };
-
- typedef cmHandle_t cmSdbH_t;
- typedef cmHandle_t cmSdbResponseH_t;
-
- typedef cmRC_t cmSdbRC_t;
- extern cmSdbH_t cmSdbNullHandle_t;
- extern cmSdbResponseH_t cmSdbResponseNullHandle_t;
-
- typedef struct
- {
- unsigned uuid; // unique id of this sample
- unsigned baseUuid; // uuid of channel 0
- unsigned chIdx; // channel index (0=left,1=right)
- unsigned obi; // outer onset
- unsigned ibi; // inner onset
- unsigned iei; // inner offset
- unsigned oei; // outer offset
- unsigned midi; // MIDI pitch or -1 for unpitched instruments
- unsigned srate; // sample rate
- unsigned chCnt; // source channel count
- const cmChar_t* src; // sample source (e.g. mcgill, ui )
- const cmChar_t* instr; // instrument label
- const cmChar_t* afn; // audio file name
- const cmChar_t** notesV; // NULL terminated list of terms describing the event.
- } cmSdbEvent_t;
-
-
- cmSdbRC_t cmSdbCreate( cmCtx_t* ctx, cmSdbH_t* hp, const cmChar_t* audioDir, const cmChar_t* csvFn );
- cmSdbRC_t cmSdbDestroy( cmSdbH_t* hp );
-
- bool cmSdbIsValid( cmSdbH_t h );
-
- cmSdbRC_t cmSdbLoad( cmSdbH_t h, const cmChar_t* csvFn );
-
- // Select a set of events from the sample database.
- //
- // The possible selection criteria are:
- // sample rate
- // instrument label
- // source label
- // notes labels
- // event duration
- //
- // In order to match an event all active criteria
- // must match. In other words the match implies a
- // logical AND operation on each match criteria.
- // Each of the criteria can be made inactive by
- // specifying particular key values.
- // sample rate = 0
- // instrument label = NULL
- // source label = NULL
- // notes labels = NULL
- // event duration = minDurSec=0 maxDurSec=0
- //
- // For the text array arguments (instrV,srcV,notesV)
- // each element of the array is a key which is attempts to
- // match the associated field in each event record.
- // By default a match is triggered if the key text is identical to the
- // event field text. The match algorithm can be modified by
- // specifying a '*' as the first character in the key field.
- // In this case a the key need only be a substring of the
- // event field to trigger a match. For example "*viol"
- // will return events that match both "violin" and "viola".
- //
- // To specify a mismatch as a successful match
- // (i.e. to return events which do not match the key text)
- // prefix the key with a '!' character.
- //
- // Note that it is legal to specify both '!' and '*'. In
- // which case a match will be triggered by fields where
- // the key text is not a substring of the field text.
- //
- // All query response handles returned from this function
- // should eventualy be released by the application via a call to
- // cmSdbResponseFree().
- cmSdbRC_t cmSdbSelect(
- cmSdbH_t h,
- double srate, // event sample rate or 0 to ignore
- const cmChar_t** instrV, // array of instrument labels to match
- const cmChar_t** srcV, // array of 'src' labels to match
- const cmChar_t** notesV, // array of text 'notes' to match
- double minDurSec, // min event duration
- double maxDurSec, // max event duration or 0 to ignore
- unsigned minChCnt, // min ch cnt or 0 to ignore
- cmSdbResponseH_t* rhp );
-
- // Given the event 'ep' locate the channel pairs associated with that event.
- // The response handle returned from this function must be released
- // by a call to cmSdbResponseFree().
- cmSdbRC_t cmSdbSelectChPairs( cmSdbH_t h, const cmSdbEvent_t* ep, cmSdbResponseH_t* rhp );
-
- // Return the count of events in a query response.
- unsigned cmSdbResponseCount( cmSdbResponseH_t rh );
-
- // Return the event at 'index' in from a query response.
- // Legal 'index' range: 0<=index<=cmSdbResponseCount().
- const cmSdbEvent_t* cmSdbResponseEvent( cmSdbResponseH_t rh, unsigned index );
-
- // Return true if the 'rh' is a non-NULL query response handle.
- bool cmSdbResponseIsValid( cmSdbResponseH_t rh );
-
- // Release the resource held by a query response.
- cmSdbRC_t cmSdbResponseFree( cmSdbResponseH_t* rhp );
- void cmSdbResponsePrint( cmSdbResponseH_t rh, cmRpt_t* rpt );
-
- // Time align all channel pairs by setting the onset times to
- // the minimum time among all the pairs and the offset times to
- // the maximum among all the pairs.
- cmSdbRC_t cmSdbSyncChPairs( cmSdbH_t h );
-
- cmSdbRC_t cmSdbTest( cmCtx_t* ctx );
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif
|