/** * Copyright 2007 DFKI GmbH. * All Rights Reserved. Use is subject to license terms. * * This file is part of MARY TTS. * * MARY TTS is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package marytts.signalproc.sinusoidal.test; import java.io.File; import java.io.IOException; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import marytts.signalproc.analysis.PitchReaderWriter; import marytts.util.data.BufferedDoubleDataSource; import marytts.util.data.audio.DDSAudioInputStream; import marytts.util.math.MathUtils; import marytts.util.string.StringUtils; /** * All tester classes should be derived from this baseline class * * @author Oytun Türk */ public class BaseTester { public static double DEFAULT_ABS_MAX_VAL = 26000.0; public static float DEFAULT_AMP = 0.8f; public static float DEFAULT_DUR = 1.0f; public static int DEFAULT_FS = 16000; public static float DEFAULT_WINDOW_SIZE_FOR_PITCH_CONTOUR = 0.020f; public static float DEFAULT_SKIP_SIZE_FOR_PITCH_CONTOUR = 0.010f; public double[] signal; public int[] pitchMarks; public double[] f0s; public int fs; public float ws; // Window size in seconds public float ss; // Skip size in seconds public BaseTester() { ws = DEFAULT_WINDOW_SIZE_FOR_PITCH_CONTOUR; ss = DEFAULT_SKIP_SIZE_FOR_PITCH_CONTOUR; } public void write(String outWavFile) throws IOException { write(outWavFile, DEFAULT_ABS_MAX_VAL); } public void write(String outWavFile, double defaultAbsMaxVal) throws IOException { String outPtcFile = StringUtils.modifyExtension(outWavFile, ".ptc"); write(outWavFile, outPtcFile, defaultAbsMaxVal); } public void write(String outWavFile, String outPtcFile) throws IOException { write(outWavFile, outPtcFile, DEFAULT_ABS_MAX_VAL); } public void write(String outWavFile, String outPtcFile, double defaultAbsMaxVal) throws IOException { if (signal != null) { if (signal != null && (outWavFile != null && !outWavFile.equals(""))) { double maxVal = MathUtils.getAbsMax(signal); for (int i = 0; i < signal.length; i++) signal[i] *= (defaultAbsMaxVal / 32767.0) / maxVal; AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, fs, // samples per second 16, // bits per sample 1, // mono 2, // nr. of bytes per frame fs, // nr. of frames per second true); // big-endian; DDSAudioInputStream outputAudio = new DDSAudioInputStream(new BufferedDoubleDataSource(signal), format); AudioSystem.write(outputAudio, AudioFileFormat.Type.WAVE, new File(outWavFile)); } if (pitchMarks != null && (outPtcFile != null && !outWavFile.equals(""))) { PitchReaderWriter.write_pitch_file(outPtcFile, f0s, ws, ss, fs); // FileUtils.writeToBinaryFile(pitchMarks, outPtcFile); //Pitch mark file } } } }