void Formant_scatterPlot (Formant me, Graphics g, double tmin, double tmax, int iformant1, double fmin1, double fmax1, int iformant2, double fmin2, double fmax2, double size_mm, const char32 *mark, int garnish) { if (iformant1 < 1 || iformant2 < 1) return; if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } long itmin, itmax; if (! Sampled_getWindowSamples (me, tmin, tmax, & itmin, & itmax)) return; if (fmax1 == fmin1) Formant_getExtrema (me, iformant1, tmin, tmax, & fmin1, & fmax1); if (fmax1 == fmin1) return; if (fmax2 == fmin2) Formant_getExtrema (me, iformant2, tmin, tmax, & fmin2, & fmax2); if (fmax2 == fmin2) return; Graphics_setInner (g); Graphics_setWindow (g, fmin1, fmax1, fmin2, fmax2); for (long iframe = itmin; iframe <= itmax; iframe ++) { Formant_Frame frame = & my d_frames [iframe]; if (iformant1 > frame -> nFormants || iformant2 > frame -> nFormants) continue; double x = frame -> formant [iformant1]. frequency; double y = frame -> formant [iformant2]. frequency; if (x == 0.0 || y == 0.0) continue; Graphics_mark (g, x, y, size_mm, mark); } Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, 1, Melder_cat (U"%%F_", iformant1, U" (Hz)")); Graphics_textLeft (g, 1, Melder_cat (U"%%F_", iformant2, U" (Hz)")); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_marksLeft (g, 2, 1, 1, 0); } }
static void updateUndoAndRedoMenuItems (CategoriesEditor me) { const char32 *commandName; /* * Menu item `Undo`. */ bool undoItemIsSensitive = true; if (commandName = CommandHistory_commandName (my history.peek(), 0), ! commandName) { commandName = U"nothing"; undoItemIsSensitive = false; } GuiButton_setText (my undo, Melder_cat (U"Undo ", U"\"", commandName, U"\"")); GuiThing_setSensitive (my undo, undoItemIsSensitive); /* * Menu item `Redo`. */ bool redoItemIsSensitive = true; if (commandName = CommandHistory_commandName (my history.peek(), 1), ! commandName) { commandName = U"nothing"; redoItemIsSensitive = false; } GuiButton_setText (my redo, Melder_cat (U"Redo ", U"\"", commandName, U"\"")); GuiThing_setSensitive (my redo, redoItemIsSensitive); }
static void gui_button_cb_addTarget (ArtwordEditor me, GuiButtonEvent /* event */) { Artword artword = (Artword) my data; char32 *timeText = GuiText_getString (my time); double tim = Melder_atof (timeText); char32 *valueText = GuiText_getString (my value); double value = Melder_atof (valueText); ArtwordData a = & artword -> data [my feature]; int i = 1, oldCount = a -> numberOfTargets; Melder_free (timeText); Melder_free (valueText); Artword_setTarget (artword, my feature, tim, value); /* Optimization instead of "updateList (me)". */ if (tim < 0) tim = 0; if (tim > artword -> totalTime) tim = artword -> totalTime; while (tim != a -> times [i]) { i ++; Melder_assert (i <= a -> numberOfTargets); // can fail if tim is in an extended precision register } const char32 *itemText = Melder_cat (Melder_single (tim), U" ", Melder_single (value)); if (a -> numberOfTargets == oldCount) { GuiList_replaceItem (my list, itemText, i); } else { GuiList_insertItem (my list, itemText, i); } Graphics_updateWs (my graphics.get()); Editor_broadcastDataChanged (me); }
autoTable ERP_tabulate (ERP me, bool includeSampleNumbers, bool includeTime, int timeDecimals, int voltageDecimals, int units) { double voltageScaling = 1.0; const char32 *unitText = U"(V)"; if (units == 2) { voltageDecimals -= 6; voltageScaling = 1000000.0; unitText = U"(uV)"; } try { autoTable thee = Table_createWithoutColumnNames (my nx, includeSampleNumbers + includeTime + my ny); long icol = 0; if (includeSampleNumbers) Table_setColumnLabel (thee.get(), ++ icol, U"sample"); if (includeTime) Table_setColumnLabel (thee.get(), ++ icol, U"time(s)"); for (long ichan = 1; ichan <= my ny; ichan ++) { Table_setColumnLabel (thee.get(), ++ icol, Melder_cat (my channelNames [ichan], unitText)); } for (long isamp = 1; isamp <= my nx; isamp ++) { icol = 0; if (includeSampleNumbers) Table_setNumericValue (thee.get(), isamp, ++ icol, isamp); if (includeTime) Table_setStringValue (thee.get(), isamp, ++ icol, Melder_fixed (my x1 + (isamp - 1) * my dx, timeDecimals)); for (long ichan = 1; ichan <= my ny; ichan ++) { Table_setStringValue (thee.get(), isamp, ++ icol, Melder_fixed (voltageScaling * my z [ichan] [isamp], voltageDecimals)); } } return thee; } catch (MelderError) { Melder_throw (me, U": not converted to Table."); } }
Table Formant_downto_Table (Formant me, bool includeFrameNumbers, bool includeTimes, int timeDecimals, bool includeIntensity, int intensityDecimals, bool includeNumberOfFormants, int frequencyDecimals, bool includeBandwidths) { try { autoTable thee = Table_createWithoutColumnNames (my nx, includeFrameNumbers + includeTimes + includeIntensity + includeNumberOfFormants + my maxnFormants * (1 + includeBandwidths)); long icol = 0; if (includeFrameNumbers) Table_setColumnLabel (thee.peek(), ++ icol, U"frame"); if (includeTimes) Table_setColumnLabel (thee.peek(), ++ icol, U"time(s)"); if (includeIntensity) Table_setColumnLabel (thee.peek(), ++ icol, U"intensity"); if (includeNumberOfFormants) Table_setColumnLabel (thee.peek(), ++ icol, U"nformants"); for (long iformant = 1; iformant <= my maxnFormants; iformant ++) { Table_setColumnLabel (thee.peek(), ++ icol, Melder_cat (U"F", iformant, U"(Hz)")); if (includeBandwidths) { Table_setColumnLabel (thee.peek(), ++ icol, Melder_cat (U"B", iformant, U"(Hz)")); } } for (long iframe = 1; iframe <= my nx; iframe ++) { icol = 0; if (includeFrameNumbers) Table_setNumericValue (thee.peek(), iframe, ++ icol, iframe); if (includeTimes) Table_setStringValue (thee.peek(), iframe, ++ icol, Melder_fixed (my x1 + (iframe - 1) * my dx, timeDecimals)); Formant_Frame frame = & my d_frames [iframe]; if (includeIntensity) Table_setStringValue (thee.peek(), iframe, ++ icol, Melder_fixed (frame -> intensity, intensityDecimals)); if (includeNumberOfFormants) Table_setNumericValue (thee.peek(), iframe, ++ icol, frame -> nFormants); for (long iformant = 1; iformant <= frame -> nFormants; iformant ++) { Formant_Formant formant = & frame -> formant [iformant]; Table_setStringValue (thee.peek(), iframe, ++ icol, Melder_fixed (formant -> frequency, frequencyDecimals)); if (includeBandwidths) Table_setStringValue (thee.peek(), iframe, ++ icol, Melder_fixed (formant -> bandwidth, frequencyDecimals)); } for (long iformant = frame -> nFormants + 1; iformant <= my maxnFormants; iformant ++) { Table_setNumericValue (thee.peek(), iframe, ++ icol, NUMundefined); if (includeBandwidths) Table_setNumericValue (thee.peek(), iframe, ++ icol, NUMundefined); } } return thee.transfer(); } catch (MelderError) { Melder_throw (me, U": not converted to Table."); } }
void BandFilterSpectrogram_drawSpectrumAtNearestTimeSlice (BandFilterSpectrogram me, Graphics g, double time, double fmin, double fmax, double dBmin, double dBmax, int garnish) { if (time < my xmin || time > my xmax) { return; } if (fmin == 0 && fmax == 0) { // autoscaling fmin = my ymin; fmax = my ymax; } if (fmax <= fmin) { fmin = my ymin; fmax = my ymax; } long icol = Matrix_xToNearestColumn (me, time); icol = icol < 1 ? 1 : (icol > my nx ? my nx : icol); autoNUMvector<double> spectrum (1, my ny); for (long i = 1; i <= my ny; i++) { spectrum[i] = my v_getValueAtSample (icol, i, 1); // dB's } long iymin, iymax; if (Matrix_getWindowSamplesY (me, fmin, fmax, &iymin, &iymax) < 2) { // too few values return; } if (dBmin == dBmax) { // autoscaling dBmin = spectrum[iymin]; dBmax = dBmin; for (long i = iymin + 1; i <= iymax; i++) { if (spectrum[i] < dBmin) { dBmin = spectrum[i]; } else if (spectrum[i] > dBmax) { dBmax = spectrum[i]; } } if (dBmin == dBmax) { dBmin -= 1; dBmax += 1; } } Graphics_setWindow (g, fmin, fmax, dBmin, dBmax); Graphics_setInner (g); double x1 = my y1 + (iymin -1) * my dy, y1 = spectrum[iymin]; for (long i = iymin + 1; i <= iymax - 1; i++) { double x2 = my y1 + (i -1) * my dy, y2 = spectrum[i]; double xo1, yo1, xo2, yo2; if (NUMclipLineWithinRectangle (x1, y1, x2, y2, fmin, dBmin, fmax, dBmax, &xo1, &yo1, &xo2, &yo2)) { Graphics_line (g, xo1, yo1, xo2, yo2); } x1 = x2; y1 = y2; } Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_marksLeft (g, 2, 1, 1, 0); Graphics_textLeft (g, 1, U"Power (dB)"); Graphics_textBottom (g, 1, Melder_cat (U"Frequency (", my v_getFrequencyUnit (), U")")); } }
static void updateList (ArtwordEditor me) { Artword artword = (Artword) my data; ArtwordData a = & artword -> data [my feature]; GuiList_deleteAllItems (my list); for (int i = 1; i <= a -> numberOfTargets; i ++) { GuiList_insertItem (my list, Melder_cat (Melder_single (a -> times [i]), U" ", Melder_single (a -> targets [i])), i); } Graphics_updateWs (my graphics.get()); }
static void espeakdata_SetVoiceByName (const char *name, const char *variantName) { espeak_VOICE voice_selector; memset (& voice_selector, 0, sizeof voice_selector); voice_selector.name = Melder_peek32to8 (Melder_cat (Melder_peek8to32 (name), U"+", Melder_peek8to32 (variantName))); // include variant name in voice stack ?? if (LoadVoice (name, 1)) { LoadVoice (variantName, 2); DoVoiceChange (voice); SetVoiceStack (& voice_selector, variantName); } }
void _CollectionOfDaata_v_writeBinary (_CollectionOfDaata* me, FILE *f) { binputi4 (my size, f); for (long i = 1; i <= my size; i ++) { Daata thing = my at [i]; ClassInfo classInfo = thing -> classInfo; if (! Thing_isa (thing, classDaata) || ! Data_canWriteBinary (thing)) Melder_throw (U"Objects of class ", classInfo -> className, U" cannot be written."); binputw1 (classInfo -> version > 0 ? Melder_cat (classInfo -> className, U" ", classInfo -> version) : classInfo -> className, f); binputw2 (thing -> name, f); Data_writeBinary ((Daata) thing, f); } }
static void OTGrammarCandidate_init (OTGrammarCandidate me, int ncons, int v1, int v2) { my output = Melder_dup (Melder_cat (vowels [v1], U"t", vowels [v2])); my marks = NUMvector <int> (1, my numberOfConstraints = ncons); /* * Count vowel-gesture violations. */ countVowelViolations (my marks, ncons, v1); countVowelViolations (my marks, ncons, v2); /* * Count contour-gesture violations. */ if (isatr (v1) != isatr (v2)) my marks [5] ++; }
/* This routine is deprecated since praat-4.2.4 20040422 and will be removed in the future. */ void FFNet_drawWeightsToLayer (FFNet me, Graphics g, int layer, int scaling, int garnish) { if (layer < 1 || layer > my nLayers) { Melder_throw (U"Layer must be in [1,", my nLayers, U"]."); } autoMatrix weights = FFNet_weightsToMatrix (me, layer, 0); Matrix_scale (weights.peek(), scaling); Matrix_drawAsSquares (weights.peek(), g, 0.0, 0.0, 0.0, 0.0, 0); if (garnish) { double x1WC, x2WC, y1WC, y2WC; Graphics_inqWindow (g, & x1WC, & x2WC, & y1WC, & y2WC); Graphics_textBottom (g, false, Melder_cat (U"Units in layer ", layer, U" ->")); if (layer == 1) { Graphics_textLeft (g, false, U"Input units ->"); } else { Graphics_textLeft (g, false, Melder_cat (U"Units in layer ", layer - 1, U" ->")); } /* how do I find out the current settings ??? */ Graphics_setTextAlignment (g, Graphics_RIGHT, Graphics_HALF); Graphics_setInner (g); Graphics_text (g, 0.5, weights->ny, U"bias"); Graphics_unsetInner (g); } }
static void classMinimizer_afterHook (Minimizer me, Thing /* boss */) { if (my success || ! my gmonitor) { return; } if (my start == 1) { Minimizer_drawHistory (me, my gmonitor, 0, my maxNumOfIterations, 0.0, 1.1 * my history[1], 1); Graphics_textTop (my gmonitor, false, Melder_cat (U"Dimension of search space: ", my nParameters)); } Graphics_setInner (my gmonitor); Graphics_line (my gmonitor, my iteration, my history[my iteration], my iteration, my history[my iteration]); Graphics_unsetInner (my gmonitor); Melder_monitor ((double) (my iteration) / my maxNumOfIterations, U"Iterations: ", my iteration, U", Function calls: ", my funcCalls, U", Cost: ", my minimum); }
void Pitch_draw (Pitch me, Graphics g, double tmin, double tmax, double fmin, double fmax, bool garnish, bool speckle, int unit) { Graphics_setInner (g); Pitch_drawInside (me, g, tmin, tmax, fmin, fmax, speckle, unit); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, true, U"Time (s)"); Graphics_marksBottom (g, 2, true, true, false); Graphics_textLeft (g, true, Melder_cat (U"Pitch (", Function_getUnitText (me, Pitch_LEVEL_FREQUENCY, unit, Function_UNIT_TEXT_GRAPHICAL), U")")); if (Function_isUnitLogarithmic (me, Pitch_LEVEL_FREQUENCY, unit)) { Graphics_marksLeftLogarithmic (g, 6, true, true, false); } else { Graphics_marksLeft (g, 2, true, true, false); } } }
void ERP_drawChannel_number (ERP me, Graphics graphics, long channelNumber, double tmin, double tmax, double vmin, double vmax, bool garnish) { if (channelNumber < 1 || channelNumber > my ny) return; /* * Automatic domain. */ if (tmin == tmax) { tmin = my xmin; tmax = my xmax; } /* * Domain expressed in sample numbers. */ long ixmin, ixmax; Matrix_getWindowSamplesX (me, tmin, tmax, & ixmin, & ixmax); /* * Automatic vertical range. */ if (vmin == vmax) { Matrix_getWindowExtrema (me, ixmin, ixmax, channelNumber, channelNumber, & vmin, & vmax); if (vmin == vmax) { vmin -= 1.0; vmax += 1.0; } } /* * Set coordinates for drawing. */ Graphics_setInner (graphics); Graphics_setWindow (graphics, tmin, tmax, vmin, vmax); Graphics_function (graphics, my z [channelNumber], ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax)); Graphics_unsetInner (graphics); if (garnish) { Graphics_drawInnerBox (graphics); Graphics_textTop (graphics, true, Melder_cat (U"Channel ", my channelNames [channelNumber])); Graphics_textBottom (graphics, true, U"Time (s)"); Graphics_marksBottom (graphics, 2, true, true, false); if (0.0 > tmin && 0.0 < tmax) Graphics_markBottom (graphics, 0.0, true, true, true, nullptr); Graphics_markLeft (graphics, vmin, true, true, false, nullptr); Graphics_markLeft (graphics, vmax, true, true, false, nullptr); Graphics_markBottom (graphics, 0.0, true, true, true, nullptr); if (vmin != 0.0 && vmax != 0.0 && (vmin > 0.0) != (vmax > 0.0)) { Graphics_markLeft (graphics, 0.0, true, true, true, nullptr); } } }
void Data_writeToBinaryFile (Daata me, MelderFile file) { try { if (! Data_canWriteBinary (me)) Melder_throw (U"Objects of class ", my classInfo -> className, U" cannot be written to a generic binary file."); autoMelderFile mfile = MelderFile_create (file); if (fprintf (file -> filePointer, "ooBinaryFile") < 0) Melder_throw (U"Cannot write first bytes of file."); binputw1 ( my classInfo -> version > 0 ? Melder_cat (my classInfo -> className, U" ", my classInfo -> version) : my classInfo -> className, file -> filePointer); Data_writeBinary (me, file -> filePointer); mfile.close (); } catch (MelderError) { Melder_throw (me, U": not written to binary file ", file, U"."); } }
// xmin, xmax in hz versus bark/mel or lin void BandFilterSpectrogram_drawFrequencyScale (BandFilterSpectrogram me, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish) { if (xmin < 0 || xmax < 0 || ymin < 0 || ymax < 0) { Melder_warning (U"Frequencies must be >= 0."); return; } // scale is in hertz if (xmin >= xmax) { // autoscaling xmin = 0; xmax = my v_frequencyToHertz (my ymax); } if (ymin >= ymax) { // autoscaling ymin = my ymin; ymax = my ymax; } long n = 2000; Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); double dx = (xmax - xmin) / (n - 1); double x1 = xmin, y1 = my v_hertzToFrequency (x1); for (long i = 2; i <= n; i++) { double x2 = x1 + dx, y2 = my v_hertzToFrequency (x2); if (NUMdefined (y1) && NUMdefined (y2)) { double xo1, yo1, xo2, yo2; if (NUMclipLineWithinRectangle (x1, y1, x2, y2, xmin, ymin, xmax, ymax, &xo1, &yo1, &xo2, &yo2)) { Graphics_line (g, xo1, yo1, xo2, yo2); } } x1 = x2; y1 = y2; } Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_marksLeft (g, 2, 1, 1, 0); Graphics_textLeft (g, 1, Melder_cat (U"Frequency (", my v_getFrequencyUnit (), U")")); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_textBottom (g, 1, U"Frequency (Hz)"); } }
autoResultsMFC ExperimentMFC_extractResults (ExperimentMFC me) { try { if (my trial == 0 || my trial <= my numberOfTrials) Melder_warning (U"The experiment was not finished. Only the first ", my trial - 1 + my pausing, U" responses are valid."); autoResultsMFC thee = ResultsMFC_create (my numberOfTrials); for (long trial = 1; trial <= my numberOfTrials; trial ++) { char32 *pipe = my stimulus [my stimuli [trial]]. visibleText ? str32chr (my stimulus [my stimuli [trial]]. visibleText, U'|') : nullptr; thy result [trial]. stimulus = Melder_dup (Melder_cat (my stimulus [my stimuli [trial]]. name, pipe)); //if (my responses [trial] < 1) Melder_throw (U"No response for trial ", trial, U".") thy result [trial]. response = Melder_dup (my responses [trial] ? my response [my responses [trial]]. name : U""); thy result [trial]. goodness = my goodnesses [trial]; thy result [trial]. reactionTime = my reactionTimes [trial]; } return thee; } catch (MelderError) { Melder_throw (me, U": results not extracted."); } }
autoFileInMemorySet FileInMemorySet_createFromDirectoryContents (const char32 *dirpath, const char32 *fileGlobber) { try { structMelderDir parent { { 0 } }; Melder_pathToDir (dirpath, &parent); autoStrings thee = Strings_createAsFileList (Melder_cat (dirpath, U"/", fileGlobber)); if (thy numberOfStrings < 1) { Melder_throw (U"No files found."); } autoFileInMemorySet me = FileInMemorySet_create (); for (long i = 1; i <= thy numberOfStrings; i ++) { structMelderFile file = { 0 }; MelderDir_getFile (& parent, thy strings [i], & file); autoFileInMemory fim = FileInMemory_create (& file); my addItem_move (fim.move()); } return me; } catch (MelderError) { Melder_throw (U"FileInMemorySet not created from directory \"", dirpath, U"\" for files that match \"", fileGlobber, U"\"."); } }
void _CollectionOfDaata_v_writeText (_CollectionOfDaata* me, MelderFile file) { texputi4 (file, my size, U"size", 0,0,0,0,0); texputintro (file, U"item []: ", my size ? nullptr : U"(empty)", 0,0,0,0); for (long i = 1; i <= my size; i ++) { Daata thing = my at [i]; ClassInfo classInfo = thing -> classInfo; texputintro (file, U"item [", Melder_integer (i), U"]:", 0,0,0); if (! Thing_isa (thing, classDaata) || ! Data_canWriteText (thing)) Melder_throw (U"Objects of class ", classInfo -> className, U" cannot be written."); texputw2 (file, classInfo -> version > 0 ? Melder_cat (classInfo -> className, U" ", classInfo -> version) : classInfo -> className, U"class", 0,0,0,0,0); texputw2 (file, thing -> name, U"name", 0,0,0,0,0); Data_writeText (thing, file); texexdent (file); } texexdent (file); }
autoMovie Movie_openFromSoundFile (MelderFile file) { try { autoMovie me = Thing_new (Movie); autoSound sound = Sound_readFromSoundFile (file); autoMelderString fileNameHead; MelderString_copy (& fileNameHead, Melder_fileToPath (file)); char32 *extensionLocation = str32rchr (fileNameHead.string, U'.'); if (! extensionLocation) extensionLocation = & fileNameHead.string [fileNameHead.length]; *extensionLocation = U'\0'; fileNameHead.length = extensionLocation - fileNameHead.string; autoStrings strings = Strings_createAsFileList (Melder_cat (fileNameHead.string, U"*.png")); struct structMelderDir folder; MelderFile_getParentDir (file, & folder); Movie_init (me.peek(), sound.transfer(), Melder_dirToPath (& folder), strings.transfer()); return me; } catch (MelderError) { Melder_throw (U"Movie object not read from file ", file, U"."); } }
void TextGrid_Pitch_drawSeparately (TextGrid grid, Pitch pitch, Graphics g, double tmin, double tmax, double fmin, double fmax, bool showBoundaries, bool useTextStyles, bool garnish, bool speckle, int unit) { int ntier = grid -> tiers->size; if (tmax <= tmin) tmin = grid -> xmin, tmax = grid -> xmax; if (Function_isUnitLogarithmic (pitch, Pitch_LEVEL_FREQUENCY, unit)) { fmin = Function_convertStandardToSpecialUnit (pitch, fmin, Pitch_LEVEL_FREQUENCY, unit); fmax = Function_convertStandardToSpecialUnit (pitch, fmax, Pitch_LEVEL_FREQUENCY, unit); } if (unit == kPitch_unit_HERTZ_LOGARITHMIC) Pitch_draw (pitch, g, tmin, tmax, pow (10.0, fmin - 0.25 * (fmax - fmin) * ntier), pow (10.0, fmax), false, speckle, unit); else Pitch_draw (pitch, g, tmin, tmax, fmin - 0.25 * (fmax - fmin) * ntier, fmax, false, speckle, unit); TextGrid_Sound_draw (grid, nullptr, g, tmin, tmax, showBoundaries, useTextStyles, false); /* * Restore window for the sake of margin drawing. */ Graphics_setWindow (g, tmin, tmax, fmin - 0.25 * (fmax - fmin) * ntier, fmax); if (unit == kPitch_unit_HERTZ_LOGARITHMIC) fmin = pow (10, fmin), fmax = pow (10.0, fmax); if (garnish) { Graphics_drawInnerBox (g); if (unit == kPitch_unit_HERTZ_LOGARITHMIC) { Graphics_markLeftLogarithmic (g, fmin, true, true, false, nullptr); Graphics_markLeftLogarithmic (g, fmax, true, true, false, nullptr); autoMarks_logarithmic (g, fmin, fmax, false); } else if (unit == kPitch_unit_SEMITONES_100) { Graphics_markLeft (g, fmin, true, true, false, nullptr); Graphics_markLeft (g, fmax, true, true, false, nullptr); autoMarks_semitones (g, fmin, fmax, false); } else { Graphics_markLeft (g, fmin, true, true, false, nullptr); Graphics_markLeft (g, fmax, true, true, false, nullptr); autoMarks (g, fmin, fmax, false); } Graphics_textLeft (g, true, Melder_cat (U"Pitch (", Function_getUnitText (pitch, Pitch_LEVEL_FREQUENCY, unit, Function_UNIT_TEXT_GRAPHICAL), U")")); Graphics_textBottom (g, true, U"Time (s)"); Graphics_marksBottom (g, 2, true, true, false); } }
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."); } }
void BandFilterSpectrogram_paintImage (BandFilterSpectrogram me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum, int garnish) { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin - 0.49999 * my dx, xmax + 0.49999 * my dx, &ixmin, &ixmax); (void) Matrix_getWindowSamplesY (me, ymin - 0.49999 * my dy, ymax + 0.49999 * my dy, &iymin, &iymax); autoMatrix thee = Spectrogram_to_Matrix_dB ((Spectrogram) me, 4e-10, 10, -100); if (maximum <= minimum) { (void) Matrix_getWindowExtrema (thee.peek(), ixmin, ixmax, iymin, iymax, &minimum, &maximum); } if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } if (xmin >= xmax || ymin >= ymax) { return; } Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); Graphics_image (g, thy z, ixmin, ixmax, Sampled_indexToX (thee.peek(), ixmin - 0.5), Sampled_indexToX (thee.peek(), ixmax + 0.5), iymin, iymax, SampledXY_indexToY (thee.peek(), iymin - 0.5), SampledXY_indexToY (thee.peek(), iymax + 0.5), minimum, maximum); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_marksLeft (g, 2, 1, 1, 0); Graphics_textLeft (g, 1, Melder_cat (U"Frequency (", my v_getFrequencyUnit (), U")")); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_textBottom (g, 1, U"Time (s)"); } }
static void update (CategoriesEditor me, long from, long to, const long *select, long nSelect) { long size = ((Categories) my data) -> size; if (size == 0) { autoSimpleString str = SimpleString_create (CategoriesEditor_EMPTYLABEL); Collection_addItem_move ((Categories) my data, str.move()); update (me, 0, 0, nullptr, 0); return; } if (from == 0 && from == to) { from = 1; to = size; } if (from < 1 || from > size) { from = size; } if (to < 1 || to > size) { to = size; } if (from > to) { long ti = from; from = to; to = ti; } // Begin optimization: add the items from a table instead of separately. try { autostring32vector table (from, to); long itemCount = GuiList_getNumberOfItems (my list); for (long i = from; i <= to; i++) { char wcindex[20]; snprintf (wcindex,20, "%5ld ", i); table[i] = Melder_dup_f (Melder_cat (Melder_peek8to32 (wcindex), OrderedOfString_itemAtIndex_c ((OrderedOfString) my data, i))); } if (itemCount > size) { // some items have been removed from Categories? for (long j = itemCount; j > size; j --) { GuiList_deleteItem (my list, j); } itemCount = size; } if (to > itemCount) { for (long j = 1; j <= to - itemCount; j ++) { GuiList_insertItem (my list, table [itemCount + j], 0); } } if (from <= itemCount) { long n = (to < itemCount ? to : itemCount); for (long j = from; j <= n; j++) { GuiList_replaceItem (my list, table[j], j); } } } catch (MelderError) { throw; } // End of optimization // HIGHLIGHT GuiList_deselectAllItems (my list); if (size == 1) { /* the only item is always selected */ const char32 *catg = OrderedOfString_itemAtIndex_c ((OrderedOfString) my data, 1); GuiList_selectItem (my list, 1); updateWidgets (me); // instead of "notify". BUG? GuiText_setString (my text, catg); } else if (nSelect > 0) { // Select but postpone highlighting for (long i = 1; i <= nSelect; i++) { GuiList_selectItem (my list, select[i] > size ? size : select[i]); } } // VIEWPORT { long top = GuiList_getTopPosition (my list), bottom = GuiList_getBottomPosition (my list); long visible = bottom - top + 1; if (nSelect == 0) { top = my position - visible / 2; } else if (select[nSelect] < top) { // selection above visible area top = select[1]; } else if (select[1] > bottom) { // selection below visible area top = select[nSelect] - visible + 1; } else { long deltaTopPos = -1, nUpdate = to - from + 1; if ( (from == select[1] && to == select[nSelect]) || // Replace (nUpdate > 2 && nSelect == 1) /* Inserts */) { deltaTopPos = 0; } else if (nUpdate == nSelect + 1 && select[1] == from + 1) { // down deltaTopPos = 1; } top += deltaTopPos; } if (top + visible > size) { top = size - visible + 1; } if (top < 1) { top = 1; } GuiList_setTopPosition (my list, top); } }
OTGrammar OTGrammar_create_tongueRoot_grammar (int small_large, int equal_random_infant_Wolof) { try { int ncons = small_large == 1 ? 5 : 9, itab, v1, v2; autoOTGrammar me = Thing_new (OTGrammar); my constraints = NUMvector <structOTGrammarConstraint> (1, my numberOfConstraints = ncons); my constraints [1]. name = Melder_dup (U"*[rtr / hi]"); my constraints [2]. name = Melder_dup (U"*[atr / lo]"); my constraints [3]. name = Melder_dup (U"P\\s{ARSE}\n(rtr)"); my constraints [4]. name = Melder_dup (U"P\\s{ARSE}\n(atr)"); my constraints [5]. name = Melder_dup (U"*G\\s{ESTURE}\n(contour)"); if (ncons == 9) { my constraints [6]. name = Melder_dup (U"*[rtr / mid]"); my constraints [7]. name = Melder_dup (U"*[rtr / lo]"); my constraints [8]. name = Melder_dup (U"*[atr / mid]"); my constraints [9]. name = Melder_dup (U"*[atr / hi]"); } if (equal_random_infant_Wolof == 1) { // equal? for (long icons = 1; icons <= ncons; icons ++) my constraints [icons]. ranking = 100.0; } else if (equal_random_infant_Wolof == 2) { // random? for (long icons = 1; icons <= ncons; icons ++) my constraints [icons]. ranking = NUMrandomGauss (100.0, 10.0); } else if (equal_random_infant_Wolof == 3) { // infant (= cannot speak) ? for (long icons = 1; icons <= ncons; icons ++) my constraints [icons]. ranking = 100.0; // structural constraints my constraints [3]. ranking = 50.0; // faithfulness constraints my constraints [4]. ranking = 50.0; } else { // adult Wolof my constraints [1]. ranking = 100.0; my constraints [2]. ranking = 10.0; my constraints [3]. ranking = 50.0; my constraints [4]. ranking = 20.0; my constraints [5]. ranking = 30.0; if (ncons == 9) { my constraints [6]. ranking = 0.0; my constraints [7]. ranking = -10.0; my constraints [8]. ranking = 0.0; my constraints [9]. ranking = -10.0; } } if (ncons == 9) { my fixedRankings = NUMvector <structOTGrammarFixedRanking> (1, my numberOfFixedRankings = 4); my fixedRankings [1]. higher = 1, my fixedRankings [1]. lower = 6; my fixedRankings [2]. higher = 6, my fixedRankings [2]. lower = 7; my fixedRankings [3]. higher = 2, my fixedRankings [3]. lower = 8; my fixedRankings [4]. higher = 8, my fixedRankings [4]. lower = 9; } my tableaus = NUMvector <structOTGrammarTableau> (1, my numberOfTableaus = 36); itab = 1; for (v1 = 0; v1 < 6; v1 ++) for (v2 = 0; v2 < 6; v2 ++) { OTGrammarTableau tableau = & my tableaus [itab]; tableau -> input = Melder_dup (Melder_cat (vowels [v1], U"t", vowels [v2])); tableau -> candidates = NUMvector <structOTGrammarCandidate> (1, tableau -> numberOfCandidates = 4); /* * Generate the four tongue-root variants as output candidates. */ OTGrammarCandidate_init (& tableau -> candidates [1], ncons, v1, v2); /* Faithful: no PARSE constraints violated. */ OTGrammarCandidate_init (& tableau -> candidates [2], ncons, fliptr (v1), v2); /* First vowel flipped: violated one PARSE constraint. */ OTGrammarCandidate_init (& tableau -> candidates [3], ncons, v1, fliptr (v2)); /* Second vowel flipped. */ OTGrammarCandidate_init (& tableau -> candidates [4], ncons, fliptr (v1), fliptr (v2)); /* Both vowels flipped. */ /* * Count PARSE violations. */ if (isatr (v1)) { tableau -> candidates [2]. marks [4] ++; tableau -> candidates [4]. marks [4] ++; } else { tableau -> candidates [2]. marks [3] ++; tableau -> candidates [4]. marks [3] ++; } if (isatr (v2)) { tableau -> candidates [3]. marks [4] ++; tableau -> candidates [4]. marks [4] ++; } else { tableau -> candidates [3]. marks [3] ++; tableau -> candidates [4]. marks [3] ++; } itab ++; } OTGrammar_checkIndex (me.peek()); OTGrammar_newDisharmonies (me.peek(), 0.0); for (long icons = 1; icons <= my numberOfConstraints; icons ++) my constraints [icons]. plasticity = 1.0; return me.transfer(); } catch (MelderError) { Melder_throw (U"Tongue root grammar not created."); } }
static char32 *appendNumberToString (const char32 *s, long number, int asArray) { return Melder_dup ( asArray == 0 ? Melder_cat (s, number) : asArray == 1 ? Melder_cat (s, U"[", number, U"]") : Melder_cat (s, U"(", number, U")")); }
void MelSpectrogram_drawTriangularFilterFunctions (MelSpectrogram me, Graphics g, bool xIsHertz, int fromFilter, int toFilter, double zmin, double zmax, bool yscale_dB, double ymin, double ymax, int garnish) { double xmin = zmin, xmax = zmax; if (zmin >= zmax) { zmin = my ymin; zmax = my ymax; // mel xmin = xIsHertz ? my v_frequencyToHertz (zmin) : zmin; xmax = xIsHertz ? my v_frequencyToHertz (zmax) : zmax; } if (xIsHertz) { zmin = my v_hertzToFrequency (xmin); zmax = my v_hertzToFrequency (xmax); } if (ymin >= ymax) { ymin = yscale_dB ? -60 : 0; ymax = yscale_dB ? 0 : 1; } fromFilter = fromFilter <= 0 ? 1 : fromFilter; toFilter = toFilter <= 0 || toFilter > my ny ? my ny : toFilter; if (fromFilter > toFilter) { fromFilter = 1; toFilter = my ny; } long n = xIsHertz ? 1000 : 500; autoNUMvector<double> xz (1, n), xhz (1,n), y (1, n); Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); double dz = (zmax - zmin) / (n - 1); for (long iz = 1; iz <= n; iz++) { double f = zmin + (iz - 1) * dz; xz[iz] = f; xhz[iz] = my v_frequencyToHertz (f); // just in case we need the linear scale } for (long ifilter = fromFilter; ifilter <= toFilter; ifilter++) { double zc = Matrix_rowToY (me, ifilter), zl = zc - my dy, zh = zc + my dy; double xo1, yo1, xo2, yo2; if (yscale_dB) { for (long iz = 1; iz <= n; iz++) { double z = xz[iz]; double amp = NUMtriangularfilter_amplitude (zl, zc, zh, z); y[iz] = yscale_dB ? (amp > 0 ? 20 * log10 (amp) : ymin - 10) : amp; } double x1 = xIsHertz ? xhz[1] : xz[1], y1 = y[1]; if (NUMdefined (y1)) { for (long iz = 1; iz <= n; iz++) { double x2 = xIsHertz ? xhz[iz] : xz[iz], y2 = y[iz]; if (NUMdefined (y2)) { if (NUMclipLineWithinRectangle (x1, y1, x2, y2, xmin, ymin, xmax, ymax, &xo1, &yo1, &xo2, &yo2)) { Graphics_line (g, xo1, yo1, xo2, yo2); } } x1 = x2; y1 = y2; } } } else { double x1 = xIsHertz ? my v_frequencyToHertz (zl) : zl; double x2 = xIsHertz ? my v_frequencyToHertz (zc) : zc; if (NUMclipLineWithinRectangle (x1, 0, x2, 1, xmin, ymin, xmax, ymax, &xo1, &yo1, &xo2, &yo2)) { Graphics_line (g, xo1, yo1, xo2, yo2); } double x3 = xIsHertz ? my v_frequencyToHertz (zh) : zh; if (NUMclipLineWithinRectangle (x2, 1, x3, 0, xmin, ymin, xmax, ymax, &xo1, &yo1, &xo2, &yo2)) { Graphics_line (g, xo1, yo1, xo2, yo2); } } } Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_marksLeftEvery (g, 1, yscale_dB ? 10 : 0.5, 1, 1, 0); Graphics_textLeft (g, 1, yscale_dB ? U"Amplitude (dB)" : U"Amplitude"); Graphics_textBottom (g, 1, Melder_cat (U"Frequency (", ( xIsHertz ? U"Hz" : my v_getFrequencyUnit () ), U")")); } }
void BarkSpectrogram_drawSekeyHansonFilterFunctions (BarkSpectrogram me, Graphics g, bool xIsHertz, int fromFilter, int toFilter, double zmin, double zmax, bool yscale_dB, double ymin, double ymax, int garnish) { double xmin = zmin, xmax = zmax; if (zmin >= zmax) { zmin = my ymin; zmax = my ymax; xmin = xIsHertz ? my v_frequencyToHertz (zmin) : zmin; xmax = xIsHertz ? my v_frequencyToHertz (zmax) : zmax; } if (xIsHertz) { zmin = my v_hertzToFrequency (xmin); zmax = my v_hertzToFrequency (xmax); } if (ymin >= ymax) { ymin = yscale_dB ? -60 : 0; ymax = yscale_dB ? 0 : 1; } fromFilter = fromFilter <= 0 ? 1 : fromFilter; toFilter = toFilter <= 0 || toFilter > my ny ? my ny : toFilter; if (fromFilter > toFilter) { fromFilter = 1; toFilter = my ny; } long n = xIsHertz ? 1000 : 500; autoNUMvector<double> xz (1, n), xhz (1,n), y (1, n); Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); double dz = (zmax - zmin) / (n - 1); for (long iz = 1; iz <= n; iz++) { double f = zmin + (iz - 1) * dz; xz[iz] = f; xhz[iz] = my v_frequencyToHertz (f); // just in case we need the linear scale } for (long ifilter = fromFilter; ifilter <= toFilter; ifilter++) { double zMid = Matrix_rowToY (me, ifilter); for (long iz = 1; iz <= n; iz++) { double z = xz[iz] - (zMid - 0.215); double amp = 7 - 7.5 * z - 17.5 * sqrt (0.196 + z * z); y[iz] = yscale_dB ? amp : pow (10, amp / 10); } // the drawing double x1 = xIsHertz ? xhz[1] : xz[1], y1 = y[1]; for (long iz = 2; iz <= n; iz++) { double x2 = xIsHertz ? xhz[iz] : xz[iz], y2 = y[iz]; if (NUMdefined (x1) && NUMdefined (x2)) { double xo1, yo1, xo2, yo2; if (NUMclipLineWithinRectangle (x1, y1, x2, y2, xmin, ymin, xmax, ymax, &xo1, &yo1, &xo2, &yo2)) { Graphics_line (g, xo1, yo1, xo2, yo2); } } x1 = x2; y1 = y2; } } Graphics_unsetInner (g); if (garnish) { double distance = yscale_dB ? 10 : 0.5; Graphics_drawInnerBox (g); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_marksLeftEvery (g, 1, distance, 1, 1, 0); Graphics_textLeft (g, 1, yscale_dB ? U"Amplitude (dB)" : U"Amplitude"); Graphics_textBottom (g, 1, Melder_cat (U"Frequency (", xIsHertz ? U"Hz" : my v_getFrequencyUnit (), U")")); } }