static autoDaata bdfFileRecognizer (int nread, const char * /* header */, MelderFile file) { const char32 *fileName = MelderFile_name (file); bool isBdfFile = Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".bdf") || Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".BDF"); bool isEdfFile = Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".edf") || Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".EDF"); if (nread < 512 || (! isBdfFile && ! isEdfFile)) return autoDaata (); return EEG_readFromBdfFile (file); }
DIRECT (ERPTier_help) Melder_help (U"ERPTier"); END /***** file recognizers *****/ static Any bdfFileRecognizer (int nread, const char *header, MelderFile file) { (void) header; const char32 *fileName = MelderFile_name (file); bool isBdfFile = Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".bdf") || Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".BDF"); bool isEdfFile = Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".edf") || Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".EDF"); if (nread < 512 || (! isBdfFile && ! isEdfFile)) return NULL; return EEG_readFromBdfFile (file); }
static void print (void *void_me, Graphics graphics) { iam (Manual); ManPages manPages = (ManPages) my data; long numberOfPages = manPages -> pages.size, savePage = my path; my ps = graphics; Graphics_setDollarSignIsCode (my ps, true); Graphics_setAtSignIsLink (my ps, true); my printing = true; HyperPage_initSheetOfPaper ((HyperPage) me); for (long ipage = 1; ipage <= numberOfPages; ipage ++) { ManPage page = manPages -> pages.at [ipage]; if (my printPagesStartingWith == nullptr || Melder_stringMatchesCriterion (page -> title, kMelder_string_STARTS_WITH, my printPagesStartingWith)) { ManPage_Paragraph par; my path = ipage; my paragraphs = page -> paragraphs; my numberOfParagraphs = 0; par = my paragraphs; while ((par ++) -> type) my numberOfParagraphs ++; Melder_free (my currentPageTitle); my currentPageTitle = Melder_dup_f (page -> title); my v_goToPage_i (ipage); my v_draw (); my v_goToPage_i (savePage); } } my printing = false; my printPagesStartingWith = nullptr; }
ERPTier ERPTier_extractEventsWhereColumn_string (ERPTier me, Table table, long columnNumber, int which_Melder_STRING, const wchar_t *criterion) { try { Table_checkSpecifiedColumnNumberWithinRange (table, columnNumber); if (my events -> size != table -> rows -> size) Melder_throw (me, " & ", table, ": the number of rows in the table (", table -> rows -> size, ") doesn't match the number of events (", my events -> size, ")."); autoERPTier thee = Thing_new (ERPTier); Function_init (thee.peek(), my xmin, my xmax); thy numberOfChannels = my numberOfChannels; thy channelNames = NUMvector <wchar_t *> (1, thy numberOfChannels); for (long ichan = 1; ichan <= thy numberOfChannels; ichan ++) { thy channelNames [ichan] = Melder_wcsdup (my channelNames [ichan]); } thy events = SortedSetOfDouble_create (); for (long ievent = 1; ievent <= my events -> size; ievent ++) { ERPPoint oldEvent = my event (ievent); TableRow row = table -> row (ievent); if (Melder_stringMatchesCriterion (row -> cells [columnNumber]. string, which_Melder_STRING, criterion)) { autoERPPoint newEvent = Data_copy (oldEvent); Collection_addItem (thy events, newEvent.transfer()); } } if (thy events -> size == 0) { Melder_warning ("No event matches criterion."); } return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": events not extracted."); } }
autoERPTier ERPTier_extractEventsWhereColumn_string (ERPTier me, Table table, long columnNumber, int which_Melder_STRING, const char32 *criterion) { try { Table_checkSpecifiedColumnNumberWithinRange (table, columnNumber); if (my points.size != table -> rows.size) Melder_throw (me, U" & ", table, U": the number of rows in the table (", table -> rows.size, U") doesn't match the number of events (", my points.size, U")."); autoERPTier thee = Thing_new (ERPTier); Function_init (thee.get(), my xmin, my xmax); thy numberOfChannels = my numberOfChannels; thy channelNames = NUMvector <char32 *> (1, thy numberOfChannels); for (long ichan = 1; ichan <= thy numberOfChannels; ichan ++) { thy channelNames [ichan] = Melder_dup (my channelNames [ichan]); } for (long ievent = 1; ievent <= my points.size; ievent ++) { ERPPoint oldEvent = my points.at [ievent]; TableRow row = table -> rows.at [ievent]; if (Melder_stringMatchesCriterion (row -> cells [columnNumber]. string, which_Melder_STRING, criterion)) { autoERPPoint newEvent = Data_copy (oldEvent); thy points. addItem_move (newEvent.move()); } } if (thy points.size == 0) { Melder_warning (U"No event matches criterion."); } return thee; } catch (MelderError) { Melder_throw (me, U": events not extracted."); } }
TableOfReal TableOfReal_extractRowsWhereLabel (TableOfReal me, int which_Melder_STRING, const wchar_t *criterion) { try { long n = 0; for (long irow = 1; irow <= my numberOfRows; irow ++) { if (Melder_stringMatchesCriterion (my rowLabels [irow], which_Melder_STRING, criterion)) { n ++; } } if (n == 0) Melder_throw (L"No row matches this criterion."); autoTableOfReal thee = TableOfReal_create (n, my numberOfColumns); copyColumnLabels (me, thee.peek()); n = 0; for (long irow = 1; irow <= my numberOfRows; irow ++) if (Melder_stringMatchesCriterion (my rowLabels [irow], which_Melder_STRING, criterion)) copyRow (me, irow, thee.peek(), ++ n); return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": rows not extracted."); } }
TableOfReal TableOfReal_extractColumnsWhereLabel (TableOfReal me, int which_Melder_STRING, const wchar_t *criterion) { try { long n = 0; for (long icol = 1; icol <= my numberOfColumns; icol ++) { if (Melder_stringMatchesCriterion (my columnLabels [icol], which_Melder_STRING, criterion)) { n ++; } } if (n == 0) Melder_throw ("No column matches this criterion."); autoTableOfReal thee = TableOfReal_create (my numberOfRows, n); copyRowLabels (me, thee.peek()); n = 0; for (long icol = 1; icol <= my numberOfColumns; icol ++) { if (Melder_stringMatchesCriterion (my columnLabels [icol], which_Melder_STRING, criterion)) { copyColumn (me, icol, thee.peek(), ++ n); } } return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": columns not extracted."); } }
autoSoundList TextGrid_Sound_extractIntervalsWhere (TextGrid me, Sound sound, long tierNumber, int comparison_Melder_STRING, const char32 *text, bool preserveTimes) { try { IntervalTier tier = TextGrid_checkSpecifiedTierIsIntervalTier (me, tierNumber); autoSoundList list = SoundList_create (); long count = 0; for (long iseg = 1; iseg <= tier -> intervals.size; iseg ++) { TextInterval segment = tier -> intervals.at [iseg]; if (Melder_stringMatchesCriterion (segment -> text, comparison_Melder_STRING, text)) { autoSound interval = Sound_extractPart (sound, segment -> xmin, segment -> xmax, kSound_windowShape_RECTANGULAR, 1.0, preserveTimes); Thing_setName (interval.get(), Melder_cat (sound -> name ? sound -> name : U"", U"_", text, U"_", ++ count)); list -> addItem_move (interval.move()); } } if (list->size == 0) Melder_warning (U"No label that ", kMelder_string_getText (comparison_Melder_STRING), U" the text \"", text, U"\" was found."); return list; } catch (MelderError) { Melder_throw (me, U" & ", sound, U": intervals not extracted."); } }
Collection TextGrid_Sound_extractIntervalsWhere (TextGrid me, Sound sound, long tierNumber, int comparison_Melder_STRING, const wchar_t *text, int preserveTimes) { try { IntervalTier tier = TextGrid_checkSpecifiedTierIsIntervalTier (me, tierNumber); autoCollection collection = Collection_create (NULL, tier -> intervals -> size); long count = 0; for (long iseg = 1; iseg <= tier -> intervals -> size; iseg ++) { TextInterval segment = (TextInterval) tier -> intervals -> item [iseg]; if (Melder_stringMatchesCriterion (segment -> text, comparison_Melder_STRING, text)) { autoSound interval = Sound_extractPart (sound, segment -> xmin, segment -> xmax, kSound_windowShape_RECTANGULAR, 1.0, preserveTimes); wchar_t name [1000]; swprintf (name, 1000, L"%ls_%ls_%ld", sound -> name ? sound -> name : L"", text, ++ count); Thing_setName (interval.peek(), name); Collection_addItem (collection.peek(), interval.transfer()); } } if (collection -> size == 0) Melder_warning ("No label that ", kMelder_string_getText (comparison_Melder_STRING), " the text \"", text, "\" was found."); return collection.transfer(); } catch (MelderError) { Melder_throw (me, " & ", sound, ": intervals not extracted."); } }