diff --git a/README.html b/README.html index d14f36a..024cc0d 100644 --- a/README.html +++ b/README.html @@ -1,693 +1,706 @@ - - - - - - - - - - SoundTouch library README - - - -
-

SoundTouch audio processing library v1.3.2pre -

-

SoundTouch library Copyright (c) Olli -Parviainen 2002-2008

-
-

1. Introduction

-

SoundTouch is an open-source audio -processing library that allows changing the sound tempo, pitch -and playback rate parameters independently from each other, i.e.:

- -

1.1 Contact information

-

Author email: oparviai 'at' iki.fi

-

SoundTouch WWW page: http://www.surina.net/soundtouch

-
-

2. Compiling SoundTouch

-

Before compiling, notice that you can choose the sample data format -if it's desirable to use floating point sample -data instead of 16bit integers. See section "sample data format" -for more information.

-

2.1. Building in Microsoft Windows

-

Project files for Microsoft Visual C++ 6.0 and Visual C++ .NET are -supplied with the source code package. Please notice that SoundTouch -library uses processor-specific optimiations for Pentium III and AMD -processors that require a processor pack upgrade for -the Visual Studio 6.0 to be installed in order to support these -optimiations. The processor pack upgrade can be downloaded from -Microsoft site at this URL:

-

-http://msdn.microsoft.com/vstudio/downloads/tools/ppack/default.aspx

-

If the above URL is unavailable or removed, go -to http://msdn.microsoft.com -and perform a search with keywords processor pack.

-

Visual Studio .NET supports required -instructions by default and thus doesn't require installing the -processor pack.

-

To build the binaries with Visual C++ 6.0 -compiler, either run "make-win.bat" script or open the -appropriate project files in source code directories with Visual -Studio. The final executable will appear under the "SoundTouch\bin" -directory. If using the Visual Studio IDE instead of the -make-win.bat script, directories bin and -lib have to be created manually to the SoundTouch -package root for the final executables. The make-win.bat script -creates these directories automatically. -

-

Also other C++ compilers than Visual C++ can be -used, but project or makefiles then have to be adapted accordingly. -Performance optimiations are written in Visual C++ compatible -syntax, they may or may not be compatible with other compilers. If -using GCC (Gnu C Compiler) compiler package such as DJGPP or Cygwin, -please see next chapter for instructions.

-

2.2. Building in Gnu platforms

-

The SoundTouch library can be compiled in -practically any platform supporting GNU compiler (GCC) tools. -SoundTouch have been tested with gcc version 3.3.4., but it -shouldn't be very specific about the gcc version. Assembler-level -performance optimiations for GNU platform are currently available in -x86 platforms only, they are automatically disabled and replaced with -standard C routines in other processor platforms.

-

To build and install the binaries, run the -following commands in SoundTouch/ directory:

- - - - - - - - - - - - - - - -
-
./configure  -
-
-

Configures the SoundTouch package for the local -environment.

-
-
make         -
-
-

Builds the SoundTouch library & -SoundStretch utility.

-
-
make install -
-
-

Installs the SoundTouch & BPM libraries -to /usr/local/lib and SoundStretch utility to /usr/local/bin. -Please notice that 'root' privileges may be required to install the -binaries to the destination locations.

-
-

NOTE: At the time of release the SoundTouch package has been -tested -to compile in GNU/Linux platform. However, in past it's happened that -new -gcc versions aren't necessarily compatible with the assembler setttings -used in the optimied routines. If you have problems getting the -SoundTouch library compiled, try the workaround of disabling the -optimiations by editing the file "include/STTypes.h" and removing -the following definition there:

-
-
#define ALLOW_OPTIMIZATIONS 1
-
-
-

3. About implementation & Usage tips

-

3.1. Supported sample data formats

-

The sample data format can be chosen -between 16bit signed integer and 32bit floating point values, the -default is 32bit floating point.

- -

-In Windows environment, the sample data format is chosen -in file "STTypes.h" by choosing one of the following -defines:

- -

-In GNU environment, the floating sample format is used by default, but -integer sample format can be chosen by giving the -following switch to the configure script: -

-
./configure --enable-integer-samples
-
- -

The sample data can have either single (mono) -or double (stereo) audio channel. Stereo data is interleaved so -that every other data value is for left channel and every second -for right channel. Notice that while it'd be possible in theory -to process stereo sound as two separate mono channels, this isn't -recommended because processing the channels separately would -result in losing the phase coherency between the channels, which -consequently would ruin the stereo effect.

-

Sample rates between 8000-48000H are -supported.

-

3.2. Processing latency

-

The processing and latency constraints of -the SoundTouch library are:

- -

3.3. About algorithms

-

SoundTouch provides three seemingly -independent effects: tempo, pitch and playback rate control. -These three controls are implemented as combination of two primary -effects, sample rate transposing and time-stretching.

-

Sample rate transposing affects -both the audio stream duration and pitch. It's implemented simply -by converting the original audio sample stream to the  desired -duration by interpolating from the original audio samples. In -SoundTouch, linear interpolation with anti-alias filtering is -used. Theoretically a higher-order interpolation provide better -result than 1st order linear interpolation, but in audio -application linear interpolation together with anti-alias -filtering performs subjectively about as well as higher-order -filtering would.

-

Time-stretching means changing -the audio stream duration without affecting it's pitch. SoundTouch -uses WSOLA-like time-stretching routines that operate in the time -domain. Compared to sample rate transposing, time-stretching is a -much heavier operation and also requires a longer processing -"window" of sound samples used by the -processing algorithm, thus increasing the algorithm input/output -latency. Typical i/o latency for the SoundTouch -time-stretch algorithm is around 100 ms.

-

Sample rate transposing and time-stretching -are then used together to produce the tempo, pitch and rate -controls:

- -

3.4 Tuning the algorithm parameters

-

The time-stretch algorithm has few -parameters that can be tuned to optimie sound quality for -certain application. The current default parameters have been -chosen by iterative if-then analysis (read: "trial and error") -to obtain best subjective sound quality in pop/rock music -processing, but in applications processing different kind of -sound the default parameter set may result into a sub-optimal -result.

-

The time-stretch algorithm default -parameter values are set by these #defines in file "TDStretch.h":

-
-
#define DEFAULT_SEQUENCE_MS     82
-#define DEFAULT_SEEKWINDOW_MS   28
-#define DEFAULT_OVERLAP_MS      12
-
-

These parameters affect to the time-stretch -algorithm as follows:

- -

Notice that these parameters can also be -set during execution time with functions "TDStretch::setParameters()" -and "SoundTouch::setSetting()".

-

The table below summaries how the -parameters can be adjusted for different applications:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter nameDefault value -magnitudeLarger value -affects...Smaller value -affects...MusicSpeechEffect in CPU burden
-
SEQUENCE_MS
-
Default value is relatively -large, chosen for slowing down music tempoLarger value is usually -better for slowing down tempo. Growing the value decelerates the -"echoing" artifact when slowing down the tempo.Smaller value might be better -for speeding up tempo. Reducing the value accelerates the "echoing" -artifact when slowing down the tempo Default value usually goodA smaller value than default -might be betterIncreasing the parameter -value reduces computation burden
-
SEEKWINDOW_MS
-
Default value is relatively -large, chosen for slowing down music tempoLarger value eases finding a -good mixing position, but may cause a "drifting" artifactSmaller reduce possibility to -find a good mixing position, but reduce the "drifting" artifact.Default value usually good, -unless a "drifting" artifact is disturbing.Default value usually goodIncreasing the parameter -value increases computation burden
-
OVERLAP_MS
-
Default value is relatively -large, chosen to suit with above parameters. If you reduce the "sequence -ms" setting, you might wish to try a smaller value.  Increasing the parameter -value increases computation burden
-

3.5 Performance Optimiations

-

General optimiations:

-

The time-stretch routine has a 'quick' mode -that substantially speeds up the algorithm but may degrade the -sound quality by a small amount. This mode is activated by -calling SoundTouch::setSetting() function with parameter  id -of SETTING_USE_QUICKSEEK and value "1", i.e.

-
-

setSetting(SETTING_USE_QUICKSEEK, 1);

-
-

CPU-specific optimiations:

- -
-

4. SoundStretch audio processing utility -

-

SoundStretch audio processing utility
-Copyright (c) Olli Parviainen 2002-2005

-

SoundStretch is a simple command-line -application that can change tempo, pitch and playback rates of -WAV sound files. This program is intended primarily to -demonstrate how the "SoundTouch" library can be used to -process sound in your own program, but it can as well be used for -processing sound files.

-

4.1. SoundStretch Usage Instructions

-

SoundStretch Usage syntax:

-
-
soundstretch infile.wav outfile.wav [switches]
-
-

Where:

- - - - - - - - - - - - - - - -
-
"infile.wav"
-
is the name of the input sound -data file (in .WAV audio file format).
-
"outfile.wav"
-
is the name of the output sound -file where the resulting sound is saved (in .WAV audio file format). -This parameter may be omitted if you  don't want to save the -output -(e.g. when only calculating BPM rate with '-bpm' switch).
-
 [switches]
-
Are one or more control -switches.
-

Available control switches are:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-tempo=n 
-
Change the sound tempo by n -percents (n = -95.0 .. +5000.0 %)
-
-pitch=n
-
Change the sound pitch by n -semitones (n = -60.0 .. + 60.0 semitones)
-
-rate=n
-
Change the sound playback rate by -n percents (n = -95.0 .. +5000.0 %)
-
-bpm=n
-
Detect the Beats-Per-Minute -(BPM) rate of the sound and adjust the tempo to meet 'n' BPMs. If this -switch is defined, the "-tempo=n" switch value is ignored. If "=n" is -omitted, i.e. switch "-bpm" is used alone, the program just calculates -and displays the BPM rate but doesn't adjust tempo according to the BPM -value.
-
-quick
-
Use quicker tempo change -algorithm. Gains speed but loses sound quality.
-
-naa
-
Don't use anti-alias -filtering in sample rate transposing. Gains speed but loses sound -quality.
-
-license
-
Displays the program license -text (LGPL)
-

Notes:

- -

4.2. SoundStretch usage examples

-

Example 1

-

The following command increases tempo of -the sound file "originalfile.wav" by 12.5% and saves -result to file "destinationfile.wav":

-
-
soundstretch originalfile.wav destinationfile.wav -tempo=12.5
-
-

Example 2

-

The following command decreases the sound -pitch (key) of the sound file "orig.wav" by two -semitones and saves the result to file "dest.wav":

-
-
soundstretch orig.wav dest.wav -pitch=-2
-
-

Example 3

-

The following command processes the file "orig.wav" by decreasing the sound tempo by 25.3% and -increasing the sound pitch (key) by 1.5 semitones. Result is -saved to file "dest.wav":

-
-
soundstretch orig.wav dest.wav -tempo=-25.3 -pitch=1.5
-
-

Example 4

-

The following command detects the BPM rate -of the file "orig.wav" and adjusts the tempo to match -100 beats per minute. Result is saved to file "dest.wav":

-
-
soundstretch orig.wav dest.wav -bpm=100
-
-
-

5. Change History

-

5.1. SoundTouch library Change History

- -

v1.3.2:

- - -

v1.3.1: -

- - -

v1.3.0: -

- -

v1.2.1:

- -

v1.2.0:

- -

v1.1.1:

- -

v1.01:

- -

v1.0:

- -

 

-

5.2. SoundStretch application Change -History

-

v1.3.0:

- -

v1.2.1:

- -

v1.2.0:

- -

v1.1.1:

- -

v1.1:

- -

v1.01:

- -
-

6. Acknowledgements

-

Kudos for these people who have submitted bugfixed since -SoundTouch v1.3.1:

- -

Moral greetings to all earlier contributors as well!

-
-

7. LICENSE

-

SoundTouch audio processing library
-Copyright (c) Olli Parviainen

-

This library 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; either version 2.1 of the License, or (at your option) -any later version.

-

This library 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 library; if not, -write to the Free Software Foundation, Inc., 59 Temple Place, -Suite 330, Boston, MA 02111-1307 USA

-
- - - + + + + + + + + + + SoundTouch library README + + + +
+

SoundTouch audio processing library v1.3.9 (1.4.0-pre) +

+

SoundTouch library Copyright (c) Olli +Parviainen 2002-2008

+
+

1. Introduction

+

SoundTouch is an open-source audio +processing library that allows changing the sound tempo, pitch +and playback rate parameters independently from each other, i.e.:

+ +

1.1 Contact information

+

Author email: oparviai 'at' iki.fi

+

SoundTouch WWW page: http://www.surina.net/soundtouch

+
+

2. Compiling SoundTouch

+

Before compiling, notice that you can choose the sample data format +if it's desirable to use floating point sample +data instead of 16bit integers. See section "sample data format" +for more information.

+

2.1. Building in Microsoft Windows

+

Project files for Microsoft Visual C++ 6.0 and Visual C++ .NET are +supplied with the source code package. Please notice that SoundTouch +library uses processor-specific optimiations for Pentium III and AMD +processors that require a processor pack upgrade for +the Visual Studio 6.0 to be installed in order to support these +optimiations. The processor pack upgrade can be downloaded from +Microsoft site at this URL:

+

+http://msdn.microsoft.com/vstudio/downloads/tools/ppack/default.aspx

+

If the above URL is unavailable or removed, go +to http://msdn.microsoft.com +and perform a search with keywords processor pack.

+

Visual Studio .NET supports required +instructions by default and thus doesn't require installing the +processor pack.

+

To build the binaries with Visual C++ 6.0 +compiler, either run "make-win.bat" script or open the +appropriate project files in source code directories with Visual +Studio. The final executable will appear under the "SoundTouch\bin" +directory. If using the Visual Studio IDE instead of the +make-win.bat script, directories bin and +lib have to be created manually to the SoundTouch +package root for the final executables. The make-win.bat script +creates these directories automatically. +

+

Also other C++ compilers than Visual C++ can be +used, but project or makefiles then have to be adapted accordingly. +Performance optimiations are written in Visual C++ compatible +syntax, they may or may not be compatible with other compilers. If +using GCC (Gnu C Compiler) compiler package such as DJGPP or Cygwin, +please see next chapter for instructions.

+

2.2. Building in Gnu platforms

+

The SoundTouch library can be compiled in +practically any platform supporting GNU compiler (GCC) tools. +SoundTouch have been tested with gcc version 3.3.4., but it +shouldn't be very specific about the gcc version. Assembler-level +performance optimiations for GNU platform are currently available in +x86 platforms only, they are automatically disabled and replaced with +standard C routines in other processor platforms.

+

To build and install the binaries, run the +following commands in SoundTouch/ directory:

+ + + + + + + + + + + + + + + +
+
./configure  -
+
+

Configures the SoundTouch package for the local +environment.

+
+
make         -
+
+

Builds the SoundTouch library & +SoundStretch utility.

+
+
make install -
+
+

Installs the SoundTouch & BPM libraries +to /usr/local/lib and SoundStretch utility to /usr/local/bin. +Please notice that 'root' privileges may be required to install the +binaries to the destination locations.

+
+

NOTE: At the time of release the SoundTouch package has been +tested +to compile in GNU/Linux platform. However, in past it's happened that +new +gcc versions aren't necessarily compatible with the assembler setttings +used in the optimied routines. If you have problems getting the +SoundTouch library compiled, try the workaround of disabling the +optimiations by editing the file "include/STTypes.h" and removing +the following definition there:

+
+
#define ALLOW_OPTIMIZATIONS 1
+
+
+

3. About implementation & Usage tips

+

3.1. Supported sample data formats

+

The sample data format can be chosen +between 16bit signed integer and 32bit floating point values, the +default is 32bit floating point.

+ +

+In Windows environment, the sample data format is chosen +in file "STTypes.h" by choosing one of the following +defines:

+ +

+In GNU environment, the floating sample format is used by default, but +integer sample format can be chosen by giving the +following switch to the configure script: +

+
./configure --enable-integer-samples
+
+ +

The sample data can have either single (mono) +or double (stereo) audio channel. Stereo data is interleaved so +that every other data value is for left channel and every second +for right channel. Notice that while it'd be possible in theory +to process stereo sound as two separate mono channels, this isn't +recommended because processing the channels separately would +result in losing the phase coherency between the channels, which +consequently would ruin the stereo effect.

+

Sample rates between 8000-48000H are +supported.

+

3.2. Processing latency

+

The processing and latency constraints of +the SoundTouch library are:

+ +

3.3. About algorithms

+

SoundTouch provides three seemingly +independent effects: tempo, pitch and playback rate control. +These three controls are implemented as combination of two primary +effects, sample rate transposing and time-stretching.

+

Sample rate transposing affects +both the audio stream duration and pitch. It's implemented simply +by converting the original audio sample stream to the  desired +duration by interpolating from the original audio samples. In +SoundTouch, linear interpolation with anti-alias filtering is +used. Theoretically a higher-order interpolation provide better +result than 1st order linear interpolation, but in audio +application linear interpolation together with anti-alias +filtering performs subjectively about as well as higher-order +filtering would.

+

Time-stretching means changing +the audio stream duration without affecting it's pitch. SoundTouch +uses WSOLA-like time-stretching routines that operate in the time +domain. Compared to sample rate transposing, time-stretching is a +much heavier operation and also requires a longer processing +"window" of sound samples used by the +processing algorithm, thus increasing the algorithm input/output +latency. Typical i/o latency for the SoundTouch +time-stretch algorithm is around 100 ms.

+

Sample rate transposing and time-stretching +are then used together to produce the tempo, pitch and rate +controls:

+ +

3.4 Tuning the algorithm parameters

+

The time-stretch algorithm has few +parameters that can be tuned to optimie sound quality for +certain application. The current default parameters have been +chosen by iterative if-then analysis (read: "trial and error") +to obtain best subjective sound quality in pop/rock music +processing, but in applications processing different kind of +sound the default parameter set may result into a sub-optimal +result.

+

The time-stretch algorithm default +parameter values are set by these #defines in file "TDStretch.h":

+
+
#define DEFAULT_SEQUENCE_MS     82
+#define DEFAULT_SEEKWINDOW_MS   28
+#define DEFAULT_OVERLAP_MS      12
+
+

These parameters affect to the time-stretch +algorithm as follows:

+ +

Notice that these parameters can also be +set during execution time with functions "TDStretch::setParameters()" +and "SoundTouch::setSetting()".

+

The table below summaries how the +parameters can be adjusted for different applications:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter nameDefault value +magnitudeLarger value +affects...Smaller value +affects...MusicSpeechEffect in CPU burden
+
SEQUENCE_MS
+
Default value is relatively +large, chosen for slowing down music tempoLarger value is usually +better for slowing down tempo. Growing the value decelerates the +"echoing" artifact when slowing down the tempo.Smaller value might be better +for speeding up tempo. Reducing the value accelerates the "echoing" +artifact when slowing down the tempo Default value usually goodA smaller value than default +might be betterIncreasing the parameter +value reduces computation burden
+
SEEKWINDOW_MS
+
Default value is relatively +large, chosen for slowing down music tempoLarger value eases finding a +good mixing position, but may cause a "drifting" artifactSmaller reduce possibility to +find a good mixing position, but reduce the "drifting" artifact.Default value usually good, +unless a "drifting" artifact is disturbing.Default value usually goodIncreasing the parameter +value increases computation burden
+
OVERLAP_MS
+
Default value is relatively +large, chosen to suit with above parameters. If you reduce the "sequence +ms" setting, you might wish to try a smaller value.  Increasing the parameter +value increases computation burden
+

3.5 Performance Optimiations

+

General optimiations:

+

The time-stretch routine has a 'quick' mode +that substantially speeds up the algorithm but may degrade the +sound quality by a small amount. This mode is activated by +calling SoundTouch::setSetting() function with parameter  id +of SETTING_USE_QUICKSEEK and value "1", i.e.

+
+

setSetting(SETTING_USE_QUICKSEEK, 1);

+
+

CPU-specific optimiations:

+ +
+

4. SoundStretch audio processing utility +

+

SoundStretch audio processing utility
+Copyright (c) Olli Parviainen 2002-2005

+

SoundStretch is a simple command-line +application that can change tempo, pitch and playback rates of +WAV sound files. This program is intended primarily to +demonstrate how the "SoundTouch" library can be used to +process sound in your own program, but it can as well be used for +processing sound files.

+

4.1. SoundStretch Usage Instructions

+

SoundStretch Usage syntax:

+
+
soundstretch infilename outfilename [switches]
+
+

Where:

+ + + + + + + + + + + + + + + +
+
"infilename"
+
Name of the input sound +data file (in .WAV audio file format). Give "stdin" as filename to use + standard input pipe.
+
"outfilename"
+
Name of the output sound +file where the resulting sound is saved (in .WAV audio file format). +This parameter may be omitted if you  don't want to save the +output +(e.g. when only calculating BPM rate with '-bpm' switch). Give "stdout" + as filename to use standard output pipe.
+
 [switches]
+
Are one or more control +switches.
+

Available control switches are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
-tempo=n 
+
Change the sound tempo by n +percents (n = -95.0 .. +5000.0 %)
+
-pitch=n
+
Change the sound pitch by n +semitones (n = -60.0 .. + 60.0 semitones)
+
-rate=n
+
Change the sound playback rate by +n percents (n = -95.0 .. +5000.0 %)
+
-bpm=n
+
Detect the Beats-Per-Minute +(BPM) rate of the sound and adjust the tempo to meet 'n' BPMs. When this switch is + applied, the "-tempo" switch is ignored. If "=n" is +omitted, i.e. switch "-bpm" is used alone, then the BPM rate is + estimated and displayed, but tempo not adjusted according to the BPM +value.
+
-quick
+
Use quicker tempo change +algorithm. Gains speed but loses sound quality.
+
-naa
+
Don't use anti-alias +filtering in sample rate transposing. Gains speed but loses sound +quality.
+
-license
+
Displays the program license +text (LGPL)
+

Notes:

+ +

4.2. SoundStretch usage examples

+

Example 1

+

The following command increases tempo of +the sound file "originalfile.wav" by 12.5% and stores result to file "destinationfile.wav":

+
+
soundstretch originalfile.wav destinationfile.wav -tempo=12.5
+
+

Example 2

+

The following command decreases the sound +pitch (key) of the sound file "orig.wav" by two +semitones and stores the result to file "dest.wav":

+
+
soundstretch orig.wav dest.wav -pitch=-2
+
+

Example 3

+

The following command processes the file "orig.wav" by decreasing the sound tempo by 25.3% and +increasing the sound pitch (key) by 1.5 semitones. Resulting .wav audio data is +directed to standard output pipe:

+
+
soundstretch orig.wav stdout -tempo=-25.3 -pitch=1.5
+
+

Example 4

+

The following command detects the BPM rate +of the file "orig.wav" and adjusts the tempo to match +100 beats per minute. Result is stored to file "dest.wav":

+
+
soundstretch orig.wav dest.wav -bpm=100
+
+

Example 5

+

The following command reads .wav sound data from standard input pipe and +estimates the BPM rate:

+
+
soundstretch stdin -bpm
+
+
+

5. Change History

+

5.1. SoundTouch library Change History

+ +

v1.3.9 (1.4.0 pre):

+ + +

v1.3.1: +

+ + +

v1.3.0: +

+ +

v1.2.1:

+ +

v1.2.0:

+ +

v1.1.1:

+ +

v1.01:

+ +

v1.0:

+ +

 

+

5.2. SoundStretch application Change +History

+ +

v1.3.9 (1.4.0 pre):

+ + +

v1.3.0:

+ +

v1.2.1:

+ +

v1.2.0:

+ +

v1.1.1:

+ +

v1.1:

+ +

v1.01:

+ +
+

6. Acknowledgements

+

Kudos for these people who have submitted bugfixed since +SoundTouch v1.3.1:

+ +

Moral greetings to all earlier contributors as well!

+
+

7. LICENSE

+

SoundTouch audio processing library
+Copyright (c) Olli Parviainen

+

This library 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; either version 2.1 of the License, or (at your option) +any later version.

+

This library 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 library; if not, +write to the Free Software Foundation, Inc., 59 Temple Place, +Suite 330, Boston, MA 02111-1307 USA

+
+ + + diff --git a/source/example/SoundStretch/RunParameters.cpp b/source/example/SoundStretch/RunParameters.cpp index fa33aab..0709216 100644 --- a/source/example/SoundStretch/RunParameters.cpp +++ b/source/example/SoundStretch/RunParameters.cpp @@ -77,7 +77,10 @@ static const char whatText[] = static const char usage[] = "Usage :\n" - " soundstretch infile.wav outfile.wav [switches]\n\n" + " soundstretch infilename outfilename [switches]\n" + "\n" + "To use standard input/output pipes, give 'stdin' and 'stdout' as filenames.\n" + "\n" "Available switches are:\n" " -tempo=n : Change sound tempo by n percents (n=-95..+5000 %)\n" " -pitch=n : Change sound pitch by n semitones (n=-60..+60 semitones)\n" diff --git a/source/example/SoundStretch/WavFile.cpp b/source/example/SoundStretch/WavFile.cpp index 0481627..7a7c506 100644 --- a/source/example/SoundStretch/WavFile.cpp +++ b/source/example/SoundStretch/WavFile.cpp @@ -140,8 +140,6 @@ const static char dataStr[] = "data"; WavInFile::WavInFile(const char *fileName) { - int hdrsOk; - // Try to open the file for reading fptr = fopen(fileName, "rb"); if (fptr == NULL) @@ -153,22 +151,45 @@ WavInFile::WavInFile(const char *fileName) throw runtime_error(msg); } + init(); +} + + +WavInFile::WavInFile(FILE *file) +{ + // Try to open the file for reading + fptr = file; + if (!file) + { + // didn't succeed + string msg = "Error : Unable to access input stream for reading"; + throw runtime_error(msg); + } + + init(); +} + + +/// Init the WAV file stream +void WavInFile::init() +{ + int hdrsOk; + + // assume file stream is already open + assert(fptr); + // Read the file headers hdrsOk = readWavHeaders(); if (hdrsOk != 0) { // Something didn't match in the wav file headers - string msg = "File \""; - msg += fileName; - msg += "\" is corrupt or not a WAV file"; + string msg = "Input file is corrupt or not a WAV file"; throw runtime_error(msg); } if (header.format.fixed != 1) { - string msg = "File \""; - msg += fileName; - msg += "\" uses unsupported encoding."; + string msg = "Input file uses unsupported encoding."; throw runtime_error(msg); } @@ -537,6 +558,21 @@ WavOutFile::WavOutFile(const char *fileName, int sampleRate, int bits, int chann } +WavOutFile::WavOutFile(FILE *file, int sampleRate, int bits, int channels) +{ + bytesWritten = 0; + fptr = file; + if (fptr == NULL) + { + string msg = "Error : Unable to access output file stream."; + throw runtime_error(msg); + } + + fillInHeader(sampleRate, bits, channels); + writeHeader(); +} + + WavOutFile::~WavOutFile() { diff --git a/source/example/SoundStretch/WavFile.h b/source/example/SoundStretch/WavFile.h index cb8e1fe..820327c 100644 --- a/source/example/SoundStretch/WavFile.h +++ b/source/example/SoundStretch/WavFile.h @@ -105,6 +105,9 @@ private: /// WAV header information WavHeader header; + /// Init the WAV file stream + void init(); + /// Read WAV file headers. /// \return zero if all ok, nonzero if file format is invalid. int readWavHeaders(); @@ -125,6 +128,8 @@ public: /// throws 'runtime_error' exception. WavInFile(const char *filename); + WavInFile(FILE *file); + /// Destructor: Closes the file. ~WavInFile(); @@ -222,6 +227,8 @@ public: int channels ///< Number of channels (1=mono, 2=stereo) ); + WavOutFile(FILE *file, int sampleRate, int bits, int channels); + /// Destructor: Finalizes & closes the WAV file. ~WavOutFile(); diff --git a/source/example/SoundStretch/main.cpp b/source/example/SoundStretch/main.cpp index 095dfc6..963c540 100644 --- a/source/example/SoundStretch/main.cpp +++ b/source/example/SoundStretch/main.cpp @@ -49,12 +49,25 @@ using namespace std; // Processing chunk size #define BUFF_SIZE 2048 +#if WIN32 + #include + #include + + // Macro for Win32 standard input/output stream support: Sets a file stream into binary mode + #define SET_STREAM_TO_BIN_MODE(f) (_setmode(fileno(f), _O_BINARY)) +#else + // Not needed for GNU environment... ? + #define SET_STREAM_TO_BIN_MODE(f) () +#endif + static const char _helloText[] = "\n" " SoundStretch v%s - Written by Olli Parviainen 2001 - 2008\n" "==================================================================\n" - "author e-mail: - WWW: http://www.surina.net/soundtouch\n" + "author e-mail: - WWW: http://www.surina.net/soundtouch\n" "\n" "This program is subject to (L)GPL license. Run \"soundstretch -license\" for\n" "more information.\n" @@ -64,8 +77,17 @@ static void openFiles(WavInFile **inFile, WavOutFile **outFile, const RunParamet { int bits, samplerate, channels; - // open input file... - *inFile = new WavInFile(params->inFileName); + if (strcmp(params->inFileName, "stdin") == 0) + { + // used 'stdin' as input file + SET_STREAM_TO_BIN_MODE(stdin); + *inFile = new WavInFile(stdin); + } + else + { + // open input file... + *inFile = new WavInFile(params->inFileName); + } // ... open output file with same sound parameters bits = (*inFile)->getNumBits(); @@ -74,7 +96,15 @@ static void openFiles(WavInFile **inFile, WavOutFile **outFile, const RunParamet if (params->outFileName) { - *outFile = new WavOutFile(params->outFileName, samplerate, bits, channels); + if (strcmp(params->outFileName, "stdout") == 0) + { + SET_STREAM_TO_BIN_MODE(stdout); + *outFile = new WavOutFile(stdout, samplerate, bits, channels); + } + else + { + *outFile = new WavOutFile(params->outFileName, samplerate, bits, channels); + } } else { @@ -107,27 +137,27 @@ static void setup(SoundTouch *pSoundTouch, const WavInFile *inFile, const RunPar if (params->outFileName) { #ifdef INTEGER_SAMPLES - printf("Uses 16bit integer sample type in processing.\n\n"); + fprintf(stderr, "Uses 16bit integer sample type in processing.\n\n"); #else #ifndef FLOAT_SAMPLES #error "Sampletype not defined" #endif - printf("Uses 32bit floating point sample type in processing.\n\n"); + fprintf(stderr, "Uses 32bit floating point sample type in processing.\n\n"); #endif // print processing information only if outFileName given i.e. some processing will happen - printf("Processing the file with the following changes:\n"); - printf(" tempo change = %+g %%\n", params->tempoDelta); - printf(" pitch change = %+g semitones\n", params->pitchDelta); - printf(" rate change = %+g %%\n\n", params->rateDelta); - printf("Working..."); + fprintf(stderr, "Processing the file with the following changes:\n"); + fprintf(stderr, " tempo change = %+g %%\n", params->tempoDelta); + fprintf(stderr, " pitch change = %+g semitones\n", params->pitchDelta); + fprintf(stderr, " rate change = %+g %%\n\n", params->rateDelta); + fprintf(stderr, "Working..."); } else { // outFileName not given - printf("Warning: output file name missing, won't output anything.\n\n"); + fprintf(stderr, "Warning: output file name missing, won't output anything.\n\n"); } - fflush(stdout); + fflush(stderr); } @@ -194,8 +224,8 @@ static void detectBPM(WavInFile *inFile, RunParameters *params) SAMPLETYPE sampleBuffer[BUFF_SIZE]; // detect bpm rate - printf("Detecting BPM rate..."); - fflush(stdout); + fprintf(stderr, "Detecting BPM rate..."); + fflush(stderr); nChannels = inFile->getNumChannels(); @@ -215,18 +245,18 @@ static void detectBPM(WavInFile *inFile, RunParameters *params) // Now the whole song data has been analyzed. Read the resulting bpm. bpmValue = bpm.getBpm(); - printf("Done!\n"); + fprintf(stderr, "Done!\n"); // rewind the file after bpm detection inFile->rewind(); if (bpmValue > 0) { - printf("Detected BPM rate %.1f\n\n", bpmValue); + fprintf(stderr, "Detected BPM rate %.1f\n\n", bpmValue); } else { - printf("Couldn't detect BPM rate.\n\n"); + fprintf(stderr, "Couldn't detect BPM rate.\n\n"); return; } @@ -234,7 +264,7 @@ static void detectBPM(WavInFile *inFile, RunParameters *params) { // adjust tempo to given bpm params->tempoDelta = (params->goalBPM / bpmValue - 1.0f) * 100.0f; - printf("The file will be converted to %.1f BPM\n\n", params->goalBPM); + fprintf(stderr, "The file will be converted to %.1f BPM\n\n", params->goalBPM); } } @@ -247,7 +277,7 @@ int main(const int nParams, const char *paramStr[]) RunParameters *params; SoundTouch SoundTouch; - printf(_helloText, SoundTouch::getVersionString()); + fprintf(stderr, _helloText, SoundTouch::getVersionString()); try { @@ -275,12 +305,12 @@ int main(const int nParams, const char *paramStr[]) delete outFile; delete params; - printf("Done!\n"); + fprintf(stderr, "Done!\n"); } catch (runtime_error &e) { // An exception occurred during processing, display an error message - printf("%s\n", e.what()); + fprintf(stderr, "%s\n", e.what()); return -1; }