Loading EEG/EEG.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -636,8 +636,7 @@ autoEEG EEGs_concatenate (OrderedOf<structEEG>* me) { Melder_throw (U"Cannot concatenate zero EEG objects."); EEG first = my at [1]; integer numberOfChannels = first -> numberOfChannels; autostring32vector channelNames; channelNames. copyFrom (first -> channelNames); autostring32vector channelNames = STRVECclone (first -> channelNames.get()); for (integer ieeg = 2; ieeg <= my size; ieeg ++) { EEG other = my at [ieeg]; if (other -> numberOfChannels != numberOfChannels) Loading Loading @@ -672,7 +671,7 @@ autoEEG EEG_extractPart (EEG me, double tmin, double tmax, bool preserveTimes) { try { autoEEG thee = Thing_new (EEG); thy numberOfChannels = my numberOfChannels; thy channelNames. copyFrom (my channelNames); thy channelNames = STRVECclone (my channelNames.get()); thy sound = Sound_extractPart (my sound.get(), tmin, tmax, kSound_windowShape::RECTANGULAR, 1.0, preserveTimes); thy textgrid = TextGrid_extractPart (my textgrid.get(), tmin, tmax, preserveTimes); thy xmin = thy textgrid -> xmin; Loading Loading @@ -724,7 +723,7 @@ autoEEG EEG_MixingMatrix_to_EEG_unmix (EEG me, MixingMatrix you) { his sound = Sound_MixingMatrix_unmix (my sound.get(), you); his textgrid = Data_copy (my textgrid.get()); his numberOfChannels = your numberOfColumns; his channelNames. copyFrom (your columnLabels); his channelNames = STRVECclone (your columnLabels.get()); return him; } Loading @@ -742,7 +741,7 @@ autoEEG EEG_MixingMatrix_to_EEG_mix (EEG me, MixingMatrix you) { his sound = Sound_MixingMatrix_mix (my sound.get(), you); his textgrid = Data_copy (my textgrid.get()); his numberOfChannels = your numberOfRows; his channelNames. copyFrom (your rowLabels); his channelNames = STRVECclone (your rowLabels.get()); return him; } Loading EEG/ERPTier.cpp +6 −7 Original line number Diff line number Diff line Loading @@ -47,10 +47,9 @@ Thing_implement (ERPTier, AnyTier, 0); integer ERPTier_getChannelNumber (ERPTier me, conststring32 channelName) { for (integer ichan = 1; ichan <= my numberOfChannels; ichan ++) { if (Melder_equ (my channelNames [ichan].get(), channelName)) { if (Melder_equ (my channelNames [ichan].get(), channelName)) return ichan; } } return 0; } Loading @@ -71,7 +70,7 @@ static autoERPTier EEG_PointProcess_to_ERPTier (EEG me, PointProcess events, dou Function_init (thee.get(), fromTime, toTime); thy numberOfChannels = my numberOfChannels - EEG_getNumberOfExtraSensors (me); Melder_assert (thy numberOfChannels > 0); thy channelNames. copyFrom (my channelNames); thy channelNames = STRVECclone (my channelNames.get()); integer numberOfEvents = events -> nt; double soundDuration = toTime - fromTime; double samplingPeriod = my sound -> dx; Loading Loading @@ -246,7 +245,7 @@ autoERP ERPTier_extractERP (ERPTier me, integer eventNumber) { newChannel [isample] = oldChannel [isample]; } } thy channelNames. copyFrom (my channelNames); thy channelNames = STRVECclone (my channelNames.get()); return thee; } catch (MelderError) { Melder_throw (me, U": ERP not extracted."); Loading Loading @@ -281,7 +280,7 @@ autoERP ERPTier_to_ERP_mean (ERPTier me) { } } Melder_assert (mean -> ny == my numberOfChannels); mean -> channelNames. copyFrom (my channelNames); mean -> channelNames = STRVECclone (my channelNames.get()); return mean; } catch (MelderError) { Melder_throw (me, U": mean not computed."); Loading @@ -298,7 +297,7 @@ autoERPTier ERPTier_extractEventsWhereColumn_number (ERPTier me, Table table, in autoERPTier thee = Thing_new (ERPTier); Function_init (thee.get(), my xmin, my xmax); thy numberOfChannels = my numberOfChannels; thy channelNames. copyFrom (my channelNames); thy channelNames = STRVECclone (my channelNames.get()); for (integer ievent = 1; ievent <= my points.size; ievent ++) { ERPPoint oldEvent = my points.at [ievent]; TableRow row = table -> rows.at [ievent]; Loading Loading @@ -327,7 +326,7 @@ autoERPTier ERPTier_extractEventsWhereColumn_string (ERPTier me, Table table, autoERPTier thee = Thing_new (ERPTier); Function_init (thee.get(), my xmin, my xmax); thy numberOfChannels = my numberOfChannels; thy channelNames. copyFrom (my channelNames); thy channelNames = STRVECclone (my channelNames.get()); for (integer ievent = 1; ievent <= my points.size; ievent ++) { ERPPoint oldEvent = my points.at [ievent]; TableRow row = table -> rows.at [ievent]; Loading LPC/Sound_and_LPC.cpp +9 −8 Original line number Diff line number Diff line Loading @@ -246,8 +246,10 @@ static int Sound_into_LPC_Frame_marple (Sound me, LPC_Frame thee, double tol1, d } e0 *= 2.0; if (e0 == 0.0) { m = 0; thy gain *= 0.5; /* because e0 is twice the energy */ thy nCoefficients = m; return 0; // warning no signal m = 0; thy gain *= 0.5; /* because e0 is twice the energy */ thy nCoefficients = m; return 0; // warning no signal } double q1 = 1.0 / e0; double q2 = q1 * x [1], q = q1 * x [1] * x [1], w = q1 * x [n] * x [n]; Loading Loading @@ -370,7 +372,7 @@ end: static autoLPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidth, double dt, double preEmphasisFrequency, int method, double tol1, double tol2) { double t1, samplingFrequency = 1.0 / my dx; double windowDuration = 2 * analysisWidth; /* gaussian window */ double windowDuration = 2.0 * analysisWidth; /* gaussian window */ integer numberOfFrames, frameErrorCount = 0; Melder_require (Melder_roundDown (windowDuration / my dx) > predictionOrder, U"Analysis window duration too short.\n For a prediction order of ", predictionOrder, Loading @@ -388,12 +390,12 @@ static autoLPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidt autoMelderProgress progress (U"LPC analysis"); if (preEmphasisFrequency < samplingFrequency / 2) { if (preEmphasisFrequency < samplingFrequency / 2.0) { Sound_preEmphasis (sound.get(), preEmphasisFrequency); } for (integer i = 1; i <= numberOfFrames; i ++) { LPC_Frame lpcframe = (LPC_Frame) & thy d_frames [i]; LPC_Frame lpcframe = & thy d_frames [i]; double t = Sampled_indexToX (thee.get(), i); LPC_Frame_init (lpcframe, predictionOrder); Sound_into_Sound (sound.get(), sframe.get(), t - windowDuration / 2); Loading @@ -416,10 +418,9 @@ static autoLPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidt frameErrorCount ++; } } if ((i % 10) == 1) { if (i % 10 == 1) Melder_progress ( (double) i / numberOfFrames, U"LPC analysis of frame ", i, U" out of ", numberOfFrames, U"."); } } return thee; } Loading artsynth/Artword.cpp +35 −35 Original line number Diff line number Diff line /* Artword.cpp * * Copyright (C) 1992-2009,2011,2015-2017 Paul Boersma * Copyright (C) 1992-2009,2011,2015-2018 Paul Boersma * * This code is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by Loading Loading @@ -49,10 +49,8 @@ autoArtword Artword_create (double totalTime) { void Artword_setDefault (Artword me, kArt_muscle muscle) { ArtwordData f = & my data [(int) muscle]; NUMvector_free <double> (f -> times, 1); NUMvector_free <double> (f -> targets, 1); f -> times = NUMvector <double> (1, 2); f -> targets = NUMvector <double> (1, 2); f -> times = VECzero (2); f -> targets = VECzero (2); f -> numberOfTargets = 2; f -> times [1] = 0.0; f -> targets [1] = 0.0; Loading @@ -61,49 +59,52 @@ void Artword_setDefault (Artword me, kArt_muscle muscle) { f -> _iTarget = 1; } static void ArtwordData_setTarget (ArtwordData me, double time, double target) { Melder_assert (my numberOfTargets >= 2); int32 insertionPosition = 1; // should be able to go up to 32768 while (insertionPosition <= my numberOfTargets && my times [insertionPosition] < time) insertionPosition ++; Melder_assert (insertionPosition <= my numberOfTargets); // can never insert past totalTime if (my times [insertionPosition] != time) { if (my numberOfTargets == INT16_MAX) Melder_throw (U"An Artword cannot have more than ", INT16_MAX, U" targets."); my times.insert (insertionPosition); my targets.insert (insertionPosition); my numberOfTargets ++; // maintain invariant } my targets [insertionPosition] = target; my times [insertionPosition] = time; } void Artword_setTarget (Artword me, kArt_muscle muscle, double time, double target) { try { Melder_assert ((int) muscle >= 1); Melder_assert ((int) muscle <= (int) kArt_muscle::MAX); Melder_assert (muscle <= kArt_muscle::MAX); ArtwordData f = & my data [(int) muscle]; Melder_assert (f -> numberOfTargets >= 2); int32 insertionPosition = 1; // should be able to go up to 32768 if (time < 0.0) time = 0.0; if (time > my totalTime) time = my totalTime; while (insertionPosition <= f -> numberOfTargets && f -> times [insertionPosition] < time) insertionPosition ++; Melder_assert (insertionPosition <= f -> numberOfTargets); // can never insert past totalTime if (f -> times [insertionPosition] != time) { if (f -> numberOfTargets == INT16_MAX) Melder_throw (U"An Artword cannot have more than ", INT16_MAX, U" targets."); integer numberOfTargets = f -> numberOfTargets; NUMvector_insert <double> (& f -> times, 1, & numberOfTargets, insertionPosition); numberOfTargets = f -> numberOfTargets; NUMvector_insert <double> (& f -> targets, 1, & numberOfTargets, insertionPosition); f -> numberOfTargets ++; } f -> targets [insertionPosition] = target; f -> times [insertionPosition] = time; ArtwordData_setTarget (& my data [(int) muscle], time, target); } catch (MelderError) { Melder_throw (me, U": target not set."); } } double Artword_getTarget (Artword me, kArt_muscle muscle, double time) { ArtwordData f = & my data [(int) muscle]; double *times = f -> times, *targets = f -> targets; int16 targetNumber = f -> _iTarget; static double ArtwordData_getTarget (ArtwordData me, double time) { int16 targetNumber = my _iTarget; if (! targetNumber) targetNumber = 1; while (time > times [targetNumber + 1] && targetNumber < f -> numberOfTargets - 1) while (time > my times [targetNumber + 1] && targetNumber < my numberOfTargets - 1) targetNumber ++; while (time < times [targetNumber] && targetNumber > 1) while (time < my times [targetNumber] && targetNumber > 1) targetNumber --; f -> _iTarget = targetNumber; Melder_assert (targetNumber > 0 && targetNumber < f -> numberOfTargets); return targets [targetNumber] + (time - times [targetNumber]) * (targets [targetNumber + 1] - targets [targetNumber]) / (times [targetNumber + 1] - times [targetNumber]); my _iTarget = targetNumber; Melder_assert (targetNumber > 0 && targetNumber < my numberOfTargets); return my targets [targetNumber] + (time - my times [targetNumber]) * (my targets [targetNumber + 1] - my targets [targetNumber]) / (my times [targetNumber + 1] - my times [targetNumber]); } double Artword_getTarget (Artword me, kArt_muscle muscle, double time) { return ArtwordData_getTarget (& my data [(int) muscle], time); } void Artword_removeTarget (Artword me, kArt_muscle muscle, int16 targetNumber) { Loading Loading @@ -133,8 +134,7 @@ void Artword_intoArt (Artword me, Art art, double time) { void Artword_draw (Artword me, Graphics g, kArt_muscle muscle, bool garnish) { int16 numberOfTargets = my data [(int) muscle]. numberOfTargets; if (numberOfTargets > 0) { autoNUMvector <double> x (1, numberOfTargets); autoNUMvector <double> y (1, numberOfTargets); auto x = VECraw (numberOfTargets), y = VECraw (numberOfTargets); Graphics_setInner (g); Graphics_setWindow (g, 0, my totalTime, -1.0, 1.0); for (int16 i = 1; i <= numberOfTargets; i ++) { Loading artsynth/Artword_def.h +3 −3 Original line number Diff line number Diff line /* Artword_def.h * * Copyright (C) 1992-2005,2008,2009,2011,2015-2017 Paul Boersma * Copyright (C) 1992-2005,2008,2009,2011,2015-2018 Paul Boersma * * This code is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by Loading @@ -21,8 +21,8 @@ oo_DEFINE_STRUCT (ArtwordData) oo_INT16 (numberOfTargets) oo_DOUBLE_VECTOR (targets, numberOfTargets) oo_DOUBLE_VECTOR (times, numberOfTargets) oo_VEC (targets, numberOfTargets) oo_VEC (times, numberOfTargets) #if oo_DECLARING oo_INT16 (_iTarget) Loading Loading
EEG/EEG.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -636,8 +636,7 @@ autoEEG EEGs_concatenate (OrderedOf<structEEG>* me) { Melder_throw (U"Cannot concatenate zero EEG objects."); EEG first = my at [1]; integer numberOfChannels = first -> numberOfChannels; autostring32vector channelNames; channelNames. copyFrom (first -> channelNames); autostring32vector channelNames = STRVECclone (first -> channelNames.get()); for (integer ieeg = 2; ieeg <= my size; ieeg ++) { EEG other = my at [ieeg]; if (other -> numberOfChannels != numberOfChannels) Loading Loading @@ -672,7 +671,7 @@ autoEEG EEG_extractPart (EEG me, double tmin, double tmax, bool preserveTimes) { try { autoEEG thee = Thing_new (EEG); thy numberOfChannels = my numberOfChannels; thy channelNames. copyFrom (my channelNames); thy channelNames = STRVECclone (my channelNames.get()); thy sound = Sound_extractPart (my sound.get(), tmin, tmax, kSound_windowShape::RECTANGULAR, 1.0, preserveTimes); thy textgrid = TextGrid_extractPart (my textgrid.get(), tmin, tmax, preserveTimes); thy xmin = thy textgrid -> xmin; Loading Loading @@ -724,7 +723,7 @@ autoEEG EEG_MixingMatrix_to_EEG_unmix (EEG me, MixingMatrix you) { his sound = Sound_MixingMatrix_unmix (my sound.get(), you); his textgrid = Data_copy (my textgrid.get()); his numberOfChannels = your numberOfColumns; his channelNames. copyFrom (your columnLabels); his channelNames = STRVECclone (your columnLabels.get()); return him; } Loading @@ -742,7 +741,7 @@ autoEEG EEG_MixingMatrix_to_EEG_mix (EEG me, MixingMatrix you) { his sound = Sound_MixingMatrix_mix (my sound.get(), you); his textgrid = Data_copy (my textgrid.get()); his numberOfChannels = your numberOfRows; his channelNames. copyFrom (your rowLabels); his channelNames = STRVECclone (your rowLabels.get()); return him; } Loading
EEG/ERPTier.cpp +6 −7 Original line number Diff line number Diff line Loading @@ -47,10 +47,9 @@ Thing_implement (ERPTier, AnyTier, 0); integer ERPTier_getChannelNumber (ERPTier me, conststring32 channelName) { for (integer ichan = 1; ichan <= my numberOfChannels; ichan ++) { if (Melder_equ (my channelNames [ichan].get(), channelName)) { if (Melder_equ (my channelNames [ichan].get(), channelName)) return ichan; } } return 0; } Loading @@ -71,7 +70,7 @@ static autoERPTier EEG_PointProcess_to_ERPTier (EEG me, PointProcess events, dou Function_init (thee.get(), fromTime, toTime); thy numberOfChannels = my numberOfChannels - EEG_getNumberOfExtraSensors (me); Melder_assert (thy numberOfChannels > 0); thy channelNames. copyFrom (my channelNames); thy channelNames = STRVECclone (my channelNames.get()); integer numberOfEvents = events -> nt; double soundDuration = toTime - fromTime; double samplingPeriod = my sound -> dx; Loading Loading @@ -246,7 +245,7 @@ autoERP ERPTier_extractERP (ERPTier me, integer eventNumber) { newChannel [isample] = oldChannel [isample]; } } thy channelNames. copyFrom (my channelNames); thy channelNames = STRVECclone (my channelNames.get()); return thee; } catch (MelderError) { Melder_throw (me, U": ERP not extracted."); Loading Loading @@ -281,7 +280,7 @@ autoERP ERPTier_to_ERP_mean (ERPTier me) { } } Melder_assert (mean -> ny == my numberOfChannels); mean -> channelNames. copyFrom (my channelNames); mean -> channelNames = STRVECclone (my channelNames.get()); return mean; } catch (MelderError) { Melder_throw (me, U": mean not computed."); Loading @@ -298,7 +297,7 @@ autoERPTier ERPTier_extractEventsWhereColumn_number (ERPTier me, Table table, in autoERPTier thee = Thing_new (ERPTier); Function_init (thee.get(), my xmin, my xmax); thy numberOfChannels = my numberOfChannels; thy channelNames. copyFrom (my channelNames); thy channelNames = STRVECclone (my channelNames.get()); for (integer ievent = 1; ievent <= my points.size; ievent ++) { ERPPoint oldEvent = my points.at [ievent]; TableRow row = table -> rows.at [ievent]; Loading Loading @@ -327,7 +326,7 @@ autoERPTier ERPTier_extractEventsWhereColumn_string (ERPTier me, Table table, autoERPTier thee = Thing_new (ERPTier); Function_init (thee.get(), my xmin, my xmax); thy numberOfChannels = my numberOfChannels; thy channelNames. copyFrom (my channelNames); thy channelNames = STRVECclone (my channelNames.get()); for (integer ievent = 1; ievent <= my points.size; ievent ++) { ERPPoint oldEvent = my points.at [ievent]; TableRow row = table -> rows.at [ievent]; Loading
LPC/Sound_and_LPC.cpp +9 −8 Original line number Diff line number Diff line Loading @@ -246,8 +246,10 @@ static int Sound_into_LPC_Frame_marple (Sound me, LPC_Frame thee, double tol1, d } e0 *= 2.0; if (e0 == 0.0) { m = 0; thy gain *= 0.5; /* because e0 is twice the energy */ thy nCoefficients = m; return 0; // warning no signal m = 0; thy gain *= 0.5; /* because e0 is twice the energy */ thy nCoefficients = m; return 0; // warning no signal } double q1 = 1.0 / e0; double q2 = q1 * x [1], q = q1 * x [1] * x [1], w = q1 * x [n] * x [n]; Loading Loading @@ -370,7 +372,7 @@ end: static autoLPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidth, double dt, double preEmphasisFrequency, int method, double tol1, double tol2) { double t1, samplingFrequency = 1.0 / my dx; double windowDuration = 2 * analysisWidth; /* gaussian window */ double windowDuration = 2.0 * analysisWidth; /* gaussian window */ integer numberOfFrames, frameErrorCount = 0; Melder_require (Melder_roundDown (windowDuration / my dx) > predictionOrder, U"Analysis window duration too short.\n For a prediction order of ", predictionOrder, Loading @@ -388,12 +390,12 @@ static autoLPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidt autoMelderProgress progress (U"LPC analysis"); if (preEmphasisFrequency < samplingFrequency / 2) { if (preEmphasisFrequency < samplingFrequency / 2.0) { Sound_preEmphasis (sound.get(), preEmphasisFrequency); } for (integer i = 1; i <= numberOfFrames; i ++) { LPC_Frame lpcframe = (LPC_Frame) & thy d_frames [i]; LPC_Frame lpcframe = & thy d_frames [i]; double t = Sampled_indexToX (thee.get(), i); LPC_Frame_init (lpcframe, predictionOrder); Sound_into_Sound (sound.get(), sframe.get(), t - windowDuration / 2); Loading @@ -416,10 +418,9 @@ static autoLPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidt frameErrorCount ++; } } if ((i % 10) == 1) { if (i % 10 == 1) Melder_progress ( (double) i / numberOfFrames, U"LPC analysis of frame ", i, U" out of ", numberOfFrames, U"."); } } return thee; } Loading
artsynth/Artword.cpp +35 −35 Original line number Diff line number Diff line /* Artword.cpp * * Copyright (C) 1992-2009,2011,2015-2017 Paul Boersma * Copyright (C) 1992-2009,2011,2015-2018 Paul Boersma * * This code is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by Loading Loading @@ -49,10 +49,8 @@ autoArtword Artword_create (double totalTime) { void Artword_setDefault (Artword me, kArt_muscle muscle) { ArtwordData f = & my data [(int) muscle]; NUMvector_free <double> (f -> times, 1); NUMvector_free <double> (f -> targets, 1); f -> times = NUMvector <double> (1, 2); f -> targets = NUMvector <double> (1, 2); f -> times = VECzero (2); f -> targets = VECzero (2); f -> numberOfTargets = 2; f -> times [1] = 0.0; f -> targets [1] = 0.0; Loading @@ -61,49 +59,52 @@ void Artword_setDefault (Artword me, kArt_muscle muscle) { f -> _iTarget = 1; } static void ArtwordData_setTarget (ArtwordData me, double time, double target) { Melder_assert (my numberOfTargets >= 2); int32 insertionPosition = 1; // should be able to go up to 32768 while (insertionPosition <= my numberOfTargets && my times [insertionPosition] < time) insertionPosition ++; Melder_assert (insertionPosition <= my numberOfTargets); // can never insert past totalTime if (my times [insertionPosition] != time) { if (my numberOfTargets == INT16_MAX) Melder_throw (U"An Artword cannot have more than ", INT16_MAX, U" targets."); my times.insert (insertionPosition); my targets.insert (insertionPosition); my numberOfTargets ++; // maintain invariant } my targets [insertionPosition] = target; my times [insertionPosition] = time; } void Artword_setTarget (Artword me, kArt_muscle muscle, double time, double target) { try { Melder_assert ((int) muscle >= 1); Melder_assert ((int) muscle <= (int) kArt_muscle::MAX); Melder_assert (muscle <= kArt_muscle::MAX); ArtwordData f = & my data [(int) muscle]; Melder_assert (f -> numberOfTargets >= 2); int32 insertionPosition = 1; // should be able to go up to 32768 if (time < 0.0) time = 0.0; if (time > my totalTime) time = my totalTime; while (insertionPosition <= f -> numberOfTargets && f -> times [insertionPosition] < time) insertionPosition ++; Melder_assert (insertionPosition <= f -> numberOfTargets); // can never insert past totalTime if (f -> times [insertionPosition] != time) { if (f -> numberOfTargets == INT16_MAX) Melder_throw (U"An Artword cannot have more than ", INT16_MAX, U" targets."); integer numberOfTargets = f -> numberOfTargets; NUMvector_insert <double> (& f -> times, 1, & numberOfTargets, insertionPosition); numberOfTargets = f -> numberOfTargets; NUMvector_insert <double> (& f -> targets, 1, & numberOfTargets, insertionPosition); f -> numberOfTargets ++; } f -> targets [insertionPosition] = target; f -> times [insertionPosition] = time; ArtwordData_setTarget (& my data [(int) muscle], time, target); } catch (MelderError) { Melder_throw (me, U": target not set."); } } double Artword_getTarget (Artword me, kArt_muscle muscle, double time) { ArtwordData f = & my data [(int) muscle]; double *times = f -> times, *targets = f -> targets; int16 targetNumber = f -> _iTarget; static double ArtwordData_getTarget (ArtwordData me, double time) { int16 targetNumber = my _iTarget; if (! targetNumber) targetNumber = 1; while (time > times [targetNumber + 1] && targetNumber < f -> numberOfTargets - 1) while (time > my times [targetNumber + 1] && targetNumber < my numberOfTargets - 1) targetNumber ++; while (time < times [targetNumber] && targetNumber > 1) while (time < my times [targetNumber] && targetNumber > 1) targetNumber --; f -> _iTarget = targetNumber; Melder_assert (targetNumber > 0 && targetNumber < f -> numberOfTargets); return targets [targetNumber] + (time - times [targetNumber]) * (targets [targetNumber + 1] - targets [targetNumber]) / (times [targetNumber + 1] - times [targetNumber]); my _iTarget = targetNumber; Melder_assert (targetNumber > 0 && targetNumber < my numberOfTargets); return my targets [targetNumber] + (time - my times [targetNumber]) * (my targets [targetNumber + 1] - my targets [targetNumber]) / (my times [targetNumber + 1] - my times [targetNumber]); } double Artword_getTarget (Artword me, kArt_muscle muscle, double time) { return ArtwordData_getTarget (& my data [(int) muscle], time); } void Artword_removeTarget (Artword me, kArt_muscle muscle, int16 targetNumber) { Loading Loading @@ -133,8 +134,7 @@ void Artword_intoArt (Artword me, Art art, double time) { void Artword_draw (Artword me, Graphics g, kArt_muscle muscle, bool garnish) { int16 numberOfTargets = my data [(int) muscle]. numberOfTargets; if (numberOfTargets > 0) { autoNUMvector <double> x (1, numberOfTargets); autoNUMvector <double> y (1, numberOfTargets); auto x = VECraw (numberOfTargets), y = VECraw (numberOfTargets); Graphics_setInner (g); Graphics_setWindow (g, 0, my totalTime, -1.0, 1.0); for (int16 i = 1; i <= numberOfTargets; i ++) { Loading
artsynth/Artword_def.h +3 −3 Original line number Diff line number Diff line /* Artword_def.h * * Copyright (C) 1992-2005,2008,2009,2011,2015-2017 Paul Boersma * Copyright (C) 1992-2005,2008,2009,2011,2015-2018 Paul Boersma * * This code is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by Loading @@ -21,8 +21,8 @@ oo_DEFINE_STRUCT (ArtwordData) oo_INT16 (numberOfTargets) oo_DOUBLE_VECTOR (targets, numberOfTargets) oo_DOUBLE_VECTOR (times, numberOfTargets) oo_VEC (targets, numberOfTargets) oo_VEC (times, numberOfTargets) #if oo_DECLARING oo_INT16 (_iTarget) Loading