15 Commits
4.3.1 ... 4.4.4

Author SHA1 Message Date
Gary Scavone
18730391e8 Release 4.4.4 tarball 2013-09-29 23:51:11 +02:00
Stephen Sinclair
899303d7c4 Merge 4.4.4 into releases 2013-09-29 23:50:23 +02:00
Gary Scavone
f13d5bb3cd Release 4.4.3 tarball 2013-09-29 23:49:37 +02:00
Stephen Sinclair
cfdfe7736a Merge 4.4.3 into releases 2013-09-29 23:49:08 +02:00
Gary Scavone
7fcf920d3e Release 4.4.2 tarball 2013-09-29 23:48:48 +02:00
Stephen Sinclair
c37de52787 Merge 4.4.2 into releases 2013-09-29 23:48:01 +02:00
Gary Scavone
5a8a65870f Release 4.4.1 tarball 2013-09-29 23:47:43 +02:00
Stephen Sinclair
9af41126cb Merge 4.4.1 into releases 2013-09-29 23:46:44 +02:00
Gary Scavone
d2ed001eb5 Release 4.4.0 tarball 2013-09-29 23:44:33 +02:00
Stephen Sinclair
3706458166 Merge 4.4.0 into releases 2013-09-29 23:42:55 +02:00
Gary Scavone
fc877b87bf Version 4.4.4 2013-09-29 23:22:28 +02:00
Gary Scavone
0aec39260a Version 4.4.3 2013-09-29 23:21:29 +02:00
Gary Scavone
baca57040b Version 4.4.2 2013-09-29 23:15:24 +02:00
Gary Scavone
b6a2202011 Version 4.4.1 2013-09-29 23:14:45 +02:00
Gary Scavone
eccd8c9981 Version 4.4.0 2013-09-29 23:11:39 +02:00
1874 changed files with 100193 additions and 65486 deletions

10
INSTALL
View File

@@ -1,8 +1,8 @@
The Synthesis ToolKit in C++ (STK)
By Perry R. Cook and Gary P. Scavone, 1995-2007.
By Perry R. Cook and Gary P. Scavone, 1995-2012.
The Synthesis ToolKit in C++ can be used in a variety of ways, depending on your particular needs. Some people just choose the classes they need for a particular project and copy those to their project directory. Others like to compile and link to a library of object files. STK was not designed with one particular style of use in mind.
The Synthesis ToolKit in C++ can be used in a variety of ways, depending on your particular needs. Some people simmply choose the classes they need for a particular project and copy those to their project directory. Others like to compile and link to a library of object files. STK was not designed with one particular style of use in mind.
To configure and compile (on Unix systems and MinGW):
@@ -25,7 +25,7 @@ Several options can be passed to configure, including:
--with-asio = choose ASIO API support (windows only)
--with-ds = choose DirectSound API support (windows only)
It is now possible to specify more than one audio API where supported. Note however that the ALSA library is required in order to compile the RtMidi class, even if the "--with-oss" option is provided (only the OSS audio API will be used, not the OSS MIDI API). Typing "./configure --help" will display all the available options. In addition, it is possible to specify the RAWWAVES and INCLUDE paths to configure as (ex. to set to /home/gary/rawwaves and /home/gary/include):
It is now possible to specify more than one audio and MIDI API where supported. Note, however, that the ALSA library is required in order to compile the RtMidi class in Linux if the "--with-oss" option is provided (only the OSS audio API will be used, not the OSS MIDI API). Typing "./configure --help" will display all the available options. In addition, it is possible to specify the RAWWAVES and INCLUDE paths to configure as (ex. to set to /home/me/rawwaves and /home/me/include):
./configure RAWWAVE_PATH='$(HOME)/rawwaves/'
./configure INCLUDE_PATH='$(HOME)/include/'
@@ -36,9 +36,7 @@ If you wish to use a different compiler than that selected by configure, specify
./configure CXX=CC
In addition, a linux RPM is available from the Planet CCRMA WWW site (http://ccrma.stanford.edu/planetccrma/software/).
For Windows Users:
MinGW support is provided in the configure script. In addition, Visual C++ project files are included for each of the example STK projects.
MinGW support is provided in the configure script. In addition, Visual C++ 6.0 project files are included for each of the example STK projects, though these may not work with more recent versions of Visual Studio.

30
Makefile.in Normal file
View File

@@ -0,0 +1,30 @@
### Do not edit -- Generated by 'configure --with-whatever' from Makefile.in
RM = /bin/rm
all :
cd src && $(MAKE)
cd projects/demo && $(MAKE) libdemo
cd projects/effects && $(MAKE) libeffects
cd projects/ragamatic && $(MAKE) libragamat
cd projects/eguitar && $(MAKE) libeguitar
cd projects/examples && $(MAKE) -f libMakefile
clean :
$(RM) -f *~
cd src && $(MAKE) clean
cd projects/demo && $(MAKE) clean
cd projects/effects && $(MAKE) clean
cd projects/ragamatic && $(MAKE) clean
cd projects/eguitar && $(MAKE) clean
cd projects/examples && $(MAKE) clean
distclean: clean
$(RM) -rf config.log config.status autom4te.cache Makefile
cd src && $(MAKE) distclean
cd projects/demo && $(MAKE) distclean
cd projects/effects && $(MAKE) distclean
cd projects/ragamatic && $(MAKE) distclean
cd projects/eguitar && $(MAKE) distclean
cd projects/examples && $(MAKE) distclean

46
README
View File

@@ -1,6 +1,6 @@
The Synthesis ToolKit in C++ (STK)
By Perry R. Cook and Gary P. Scavone, 1995-2007.
By Perry R. Cook and Gary P. Scavone, 1995-2012.
This distribution of the Synthesis ToolKit in C++ (STK) contains the following:
@@ -23,20 +23,18 @@ programming language. STK was designed to facilitate rapid
development of music synthesis and audio processing software, with an
emphasis on cross-platform functionality, realtime control, ease of
use, and educational example code. The Synthesis ToolKit is extremely
portable (it's mostly platform-independent C and C++ code), and it's
portable (most classes are platform-independent C++ code), and it's
completely user-extensible (all source included, no unusual libraries,
and no hidden drivers). We like to think that this increases the
chances that our programs will still work in another 5-10 years. In
fact, the ToolKit has been working continuously for nearly 10 years
now. STK currently runs with "realtime" support (audio and MIDI) on
Linux, Macintosh OS X, and Windows computer platforms. Generic,
non-realtime support has been tested under NeXTStep, Sun, and other
platforms and should work with any standard C++ compiler.
chances that our programs will still work in another 5-10 years. STK
currently runs with "realtime" support (audio and MIDI) on Linux,
Macintosh OS X, and Windows computer platforms. Generic, non-realtime
support has been tested under NeXTStep, Sun, and other platforms and
should work with any standard C++ compiler.
The Synthesis ToolKit is free for non-commercial use. The only parts
of the Synthesis ToolKit that are platform-dependent concern real-time
audio and MIDI input and output, and that is taken care of with a few
special classes. The interface for MIDI input and the simple Tcl/Tk
The only classes of the Synthesis ToolKit that are platform-dependent
concern sockets, threads, mutexes, and real-time audio and MIDI input
and output. The interface for MIDI input and the simple Tcl/Tk
graphical user interfaces (GUIs) provided is the same, so it's easy to
experiment in real time using either the GUIs or MIDI. The Synthesis
ToolKit can generate simultaneous SND (AU), WAV, AIFF, and MAT-file
@@ -81,7 +79,8 @@ Despite being available in one form or another since 1996, we still
consider STK to be alpha software. We attempt to maintain backward
compatability but changes are sometimes made in an effort to improve
the overall design or performance of the software. Please read the
Release Notes to see what has changed since the last release.
"Release Notes" in the /doc directory to see what has changed since
the last release.
A new StkFrames class has been created to facilitate the handling and
passing of multichannel, vectorized audio data. All STK classes have
@@ -95,12 +94,12 @@ messages. In most cases, this should eliminate the use of the
Md2Skini program.
Realtime audio input capabilities were added to STK with release 3.0,
though the behavior of such is very hardware dependent. Under Linux,
Macintosh OS-X, and Irix, audio input and output are possible with
very low latency. Using the Windoze DirectSound API, minimum
dependable output sound latency seems to be around 20 milliseconds or
so, while input sound latency is on the order of a hundred
milliseconds or more!
though the behavior of such is very hardware dependent. Under Linux
and Macintosh OS-X, audio input and output are possible with very low
latency. Using the Windoze DirectSound API, minimum dependable output
sound latency seems to be around 20 milliseconds or so, while input
sound latency is generally higher. Performance with the ASIO audio
API on Windoze provides much better performance.
As mentioned above, it is possible to record the audio ouput of an STK
program to .snd, .wav, .raw, .aif, and .mat (Matlab MAT-file) output
@@ -111,7 +110,7 @@ generic C++ compiler.
For those who wish to make a library from the core STK classes, the
configure script generates a Makefile in the src directory that will
accomplish that (Linux, SGI, and Macintosh OS X only).
accomplish that.
DISCLAIMER:
@@ -130,7 +129,7 @@ for free, primarily for academic purposes, so if you use it, pass it
on with this documentation, and for free.
If you make a million dollars with it, it would be nice if you would
share. If you make compositions with it, put us in the program notes.
share. If you make compositions with it, put us in the program notes.
Some of the concepts are covered by various patents, some known to us
and likely others which are unknown. Many of the ones known to us are
@@ -146,7 +145,7 @@ LICENSE:
STK WWW site: http://ccrma.stanford.edu/software/stk/
The Synthesis ToolKit in C++ (STK)
Copyright (c) 1995-2007 Perry R. Cook and Gary P. Scavone
Copyright (c) 1995-2012 Perry R. Cook and Gary P. Scavone
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -216,6 +215,3 @@ The answers lie below.
6) More rationalizations to follow . . .

189
bin/treesed Executable file
View File

@@ -0,0 +1,189 @@
#!/usr/bin/perl
# treesed
# Written January 1996 by Rick Jansen (rick@sara.nl)
# URL: http://www.sara.nl/rick
# usage: treesed pattern1 pattern2 -tree
# treesed pattern1 pattern2 -files file1 file2 ...
# example: treesed href HREF -files *.html
# Treesed searches for pattern1 and replaces pattern1 by pattern2
# if pattern2 supplied. If only pattern1 given treesed just searches.
# Treesed will search in all files and subdirectories of the current
# directory
#--------------------------------------------------------
# Parameters
$DoEdit=0;
$search_pattern = $ARGV[0];
$search_pattern =~ s/(\W)/\\$1/g; # escape regexp chars
shift;
while ($#ARGV >= 0) {
if ($ARGV[0] eq '-files') {
@temp_ls = @ARGV[1 .. $#ARGV];
# Get list of files, skip dirs
foreach $file (@ARGV[1 .. $#ARGV]) {
if (-f $file) {
push(@ls, $file);
}
}
last;
}
elsif ($ARGV[0] eq '-tree') {
&Get_LS;
last;
}
if (! -f $ARGV[0]) {
if (defined($replacement_pattern)) {
print "usage: treesed pattern1 <pattern2> -tree/-files <files>\n";
exit(1);
}
$replacement_pattern = $ARGV[0];
#$replacement_pattern =~ s/(\W)/\\$1/g; # escape regexp chars
$DoEdit=1;
shift;
}
}
# No files?
if ($#ls < 0) {
print "xx No input files\n";
exit(1);
}
print "search_pattern: $search_pattern\n";
print "replacement_pattern: $replacement_pattern\n";
if ($DoEdit) {
print "\n** EDIT MODE!\n\n"; }
else {
print "\n** Search mode\n\n";
}
#foreach $file (@ls) {
# print "$file \n";
#}
#--------------------------------------------------------
# Search list of files for pattern
$linepos=0;
$| = 1; # Force flush after every write
foreach $file (@ls) {
#print "$file\n";
print '.';
$linepos++;
if ($linepos > 50) {
$linepos=0;
print "\n";
}
if (!open(FILE, $file)) {
print "\nCould not open $file\n";
next;
}
$Found = 0;
$Count = 0;
$lineno = 0;
@lines = ();
while (<FILE>) {
$lineno++;
if (/$search_pattern/i) {
#print;
$Count++;
$Found = 1;
push(@lines, $lineno);
}
}
close(FILE);
if ($Found) {
print "\n$file: $Count lines on: @lines\n";
}
if ($Found && $DoEdit) { &Edit($file); }
}
$| = 0;
print "\n";
exit(0);
#--------------------------------------------------------
# Edit file
sub Edit {
# Replace $ARGV[0] with $ARGV[1] in $file
local($file) = @_;
local($bakfile) = $file.'.'.$$;
# First create backup
open(FILE, $file) || die "Could not open $file for read\n";
open(BAKFILE, ">$bakfile") || die "Could not open $bakfile for backup\n";
while (<FILE>) {
print BAKFILE;
}
close(BAKFILE);
close(FILE);
# Now replace $ARGV[0] by $ARGV[1] in the backupfile,
# result into $file
open(BAKFILE, $bakfile) || die "Could not open $bakfile for read\n";
open(FILE,">$file") || die "Could not open $file for write\n";
$Count=0;
while (<BAKFILE>) {
if (/$search_pattern/i) { $Count++; }
s/$search_pattern/$replacement_pattern/gi;
print FILE;
}
close(BAKFILE);
close(FILE);
print
"\nReplaced $search_pattern by $replacement_pattern on $Count lines in $file\n";
} #sub Edit
#--------------------------------------------------------
sub Get_LS {
# Get a list of full path names into array @ls
local(@localls)=`ls -R1`;
local($item,$Dir);
#print "localls: @localls\n";
$Dir='';
foreach $item (@localls) {
#print "$item\n";
if ($item =~ /:$/) {
$Dir=$item;
chop($Dir);
$Dir =~ s/:$/\//;
}
else {
chop($item);
$item = $Dir.$item;
if ($item !~ /^\s*$/) { push(@ls, $item); }
}
}
@localls=();
} # sub Get_LS

View File

@@ -3,7 +3,7 @@
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc.
timestamp='2001-04-20'
timestamp='2004-02-26'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by

View File

@@ -3,7 +3,7 @@
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc.
timestamp='2001-04-20'
timestamp='2004-02-26'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software

6996
configure vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,15 +1,19 @@
# Process this file with autoconf to produce a configure script.
AC_INIT(STK, 4.3, gary@music.mcgill.ca, stk)
AC_INIT(STK, 4.4, gary@music.mcgill.ca, stk)
AC_CONFIG_AUX_DIR(config)
AC_CONFIG_SRCDIR(src/Stk.cpp)
AC_CONFIG_FILES(src/Makefile projects/demo/Makefile projects/effects/Makefile projects/ragamatic/Makefile projects/examples/Makefile projects/examples/libMakefile)
AC_CONFIG_FILES(Makefile src/Makefile projects/demo/Makefile projects/effects/Makefile projects/ragamatic/Makefile projects/examples/Makefile projects/examples/libMakefile projects/eguitar/Makefile)
# Fill GXX with something before test.
AC_SUBST( GXX, ["no"] )
# Checks for programs.
AC_PROG_CC
AC_PROG_CXX(g++ CC c++ cxx)
AC_PROG_CXX
AC_PROG_RANLIB
AC_PATH_PROG(AR, ar, no)
if [[ $AR = "no" ]] ; then
AC_MSG_ERROR("Could not find ar - needed to create a library");
fi
# Checks for header files.
AC_HEADER_STDC
@@ -36,127 +40,146 @@ AC_MSG_RESULT($INCLUDE_PATH)
# Check for realtime support disable
AC_MSG_CHECKING(whether to compile realtime support)
AC_ARG_ENABLE(realtime, [ --disable-realtime = only compile generic non-realtime classes], [AC_SUBST( realtime, [no] ) AC_SUBST( sound_api, [] )], [AC_SUBST( realtime, [yes] ) ] )
AC_ARG_ENABLE(realtime,
[ --disable-realtime = only compile generic non-realtime classes],
realtime=$enableval)
if test "$realtime" = "no"; then
AC_SUBST( sound_api, [] )
else
AC_SUBST( realtime, [yes] )
fi
AC_MSG_RESULT($realtime)
# Check for math library
AC_CHECK_LIB(m, cos, , AC_MSG_ERROR(math library is needed!))
# Checks for functions
if test $realtime = yes; then
AC_CHECK_FUNCS(select socket)
AC_CHECK_FUNC(gettimeofday, [cflags=$cflags" -DHAVE_GETTIMEOFDAY"], )
fi
# Check for debug
AC_MSG_CHECKING(whether to compile debug version)
AC_ARG_ENABLE(debug,
[ --enable-debug = enable various debug output],
[AC_SUBST( debug, ["-D_STK_DEBUG_ -D__RTAUDIO_DEBUG__"] ) AC_SUBST( cflags, ["-g -O2"] ) AC_SUBST( object_path, [Debug] ) AC_MSG_RESULT(yes)],
[AC_SUBST( debug, [] ) AC_SUBST( cflags, [-O3] ) AC_SUBST( object_path, [Release] ) AC_MSG_RESULT(no)])
[ --enable-debug = enable various debug output],
debug=$enableval)
if test "$debug" = "yes"; then
AC_SUBST( cppflag, ["-D_STK_DEBUG_ -D__RTAUDIO_DEBUG__ -D__RTMIDI_DEBUG__"] )
AC_SUBST( cxxflag, ["-g"] )
AC_SUBST( object_path, [Debug] )
else
AC_SUBST( debug, [no] )
AC_SUBST( cppflag, [] )
AC_SUBST( cxxflag, [-O3] )
AC_SUBST( object_path, [Release] )
fi
AC_MSG_RESULT($debug)
# Checks for functions
if test $realtime = yes; then
AC_CHECK_FUNCS(select socket)
AC_CHECK_FUNC(gettimeofday, [cppflag="$cppflag -DHAVE_GETTIMEOFDAY"], )
fi
# For -I and -D flags
CPPFLAGS="$CPPFLAGS $cppflag"
# For debugging and optimization ... overwrite default because it has both -g and -O2
echo "$CXXFLAGS"
CXXFLAGS="$cxxflag"
# Check compiler and use -Wall if gnu.
if test $GXX = "yes" ; then
AC_SUBST( warn, ["-Wall -g -D__GXX__"] )
if [test $GXX = "yes" ;] then
AC_SUBST( cxxflag, [-Wall] )
fi
CXXFLAGS="$CXXFLAGS $cxxflag"
AC_CANONICAL_HOST
AC_SUBST( sharedlib, ["libstk.so"] )
AC_SUBST( sharedname, ["libstk.so.\$(RELEASE)"] )
AC_SUBST( libflags, ["-shared -Wl,-soname,\$(SHAREDLIB).\$(MAJOR) -o \$(SHAREDLIB).\$(RELEASE)"] )
case $host in
*-apple*)
AC_SUBST( sharedlib, ["libstk.dylib"] )
AC_SUBST( sharedname, ["libstk.\$(RELEASE).dylib"] )
AC_SUBST( libflags, ["-dynamiclib -o libstk.\$(RELEASE).dylib"] )
esac
if test $realtime = yes; then
# Checks for package options and external software
AC_CANONICAL_HOST
AC_MSG_CHECKING(for audio API)
case $host in
*-*-linux*)
AC_SUBST( sound_api, [_NO_API_] )
AC_ARG_WITH(jack, [ --with-jack = choose JACK server support (mac and linux only)], [
api="$api -D__UNIX_JACK__"
AC_MSG_RESULT(using JACK)
AC_CHECK_LIB(jack, jack_client_open, , AC_MSG_ERROR(JACK support requires the jack library!))
AC_CHECK_LIB(asound, snd_pcm_open, , AC_MSG_ERROR(Jack support also requires the asound library!))], )
# Look for ALSA library because we need it for RtMidi
AC_CHECK_LIB(asound, snd_pcm_open, , AC_MSG_ERROR(STK in Linux requires the ALSA asound library for RtMidi!))
audio_apis="-D__LINUX_ALSASEQ__"
# Look for Jack flag
AC_ARG_WITH(jack, [ --with-jack = choose JACK server support (linux only)], [AC_SUBST( sound_api, [-D__UNIX_JACK__] ) AC_MSG_RESULT(using JACK)] , )
if [test $sound_api = -D__UNIX_JACK__;] then
TEMP_LIBS=$LIBS
AC_CHECK_LIB(jack, jack_client_new, , AC_MSG_ERROR(JACK support requires the jack library!))
LIBS="`pkg-config --cflags --libs jack` $TEMP_LIBS -lasound"
audio_apis="-D__UNIX_JACK__ $audio_apis"
fi
# Look for Alsa flag
AC_ARG_WITH(alsa, [ --with-alsa = choose native ALSA API support (linux only)], [AC_SUBST( sound_api, [-D__LINUX_ALSA__] ) AC_MSG_RESULT(using ALSA)], )
if test $sound_api = -D__LINUX_ALSA__; then
audio_apis="-D__LINUX_ALSA__ $audio_apis"
fi
# Look for ALSA flag
AC_ARG_WITH(alsa, [ --with-alsa = choose native ALSA API support (linux only)], [
api="$api -D__LINUX_ALSA__"
AC_MSG_RESULT(using ALSA)
AC_CHECK_LIB(asound, snd_pcm_open, , AC_MSG_ERROR(ALSA support requires the asound library!))], )
# Look for OSS flag
AC_ARG_WITH(oss, [ --with-oss = choose OSS API support (linux only)], [AC_SUBST( sound_api, [-D__LINUX_OSS__] ) AC_MSG_RESULT(using OSS)], )
if test $sound_api = -D__LINUX_OSS__; then
audio_apis="-D__LINUX_OSS__ $audio_apis"
fi
AC_ARG_WITH(oss, [ --with-oss = choose OSS API support (linux only)], [
api="$api -D__LINUX_OSS__ -D__LINUX_ALSA__"
AC_MSG_RESULT(using OSS)
AC_CHECK_LIB(asound, snd_pcm_open, , AC_MSG_ERROR(OSS support requires ALSA for RtMidi!))], )
# If no audio api flags specified, use ALSA
if [test $sound_api = _NO_API_;] then
if [test "$api" == "";] then
AC_MSG_RESULT(using ALSA)
audio_apis="-D__LINUX_ALSA__ $audio_apis"
AC_SUBST( api, [-D__LINUX_ALSA__] )
AC_CHECK_LIB(asound, snd_pcm_open, , AC_MSG_ERROR(ALSA support requires the asound library!))
fi
AC_CHECK_LIB(pthread, pthread_create, , AC_MSG_ERROR(realtime support requires the pthread library!))
;;
*-apple*)
AC_SUBST( sound_api, [_NO_API_] )
# Look for JACK flag
AC_ARG_WITH(jack, [ --with-jack = choose JACK server support (unix only)], [AC_SUBST( sound_api, [-D__UNIX_JACK__] ) AC_MSG_RESULT(using JACK)], )
if [test $sound_api = -D__UNIX_JACK__;] then
AC_CHECK_LIB(jack, jack_client_new, , AC_MSG_ERROR(JACK support requires the jack library!))
audio_apis="-D__UNIX_JACK__"
fi
AC_ARG_WITH(jack, [ --with-jack = choose JACK server support (unix only)], [
api="$api -D__UNIX_JACK__"
AC_MSG_RESULT(using JACK)
AC_CHECK_LIB(jack, jack_client_new, , AC_MSG_ERROR(JACK support requires the jack library!))], )
# Look for Core flag
AC_ARG_WITH(core, [ --with-core = choose CoreAudio API support (mac only)], [AC_SUBST( sound_api, [-D__MACOSX_CORE__] ) AC_MSG_RESULT(using CoreAudio)], )
if test $sound_api = -D__MACOSX_CORE__; then
AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [], [AC_MSG_ERROR(CoreAudio header files not found!)] )
AC_SUBST( frameworks, ["-framework CoreAudio -framework CoreFoundation -framework CoreMidi"] )
audio_apis="-D__MACOSX_CORE__ $audio_apis"
fi
AC_ARG_WITH(core, [ --with-core = choose CoreAudio API support (mac only)], [
api="$api -D__MACOSX_CORE__"
AC_MSG_RESULT(using CoreAudio)
AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [], [AC_MSG_ERROR(CoreAudio header files not found!)] )
LIBS="$LIBS -framework CoreAudio -framework CoreFoundation -framework CoreMidi" ], )
# If no audio api flags specified, use CoreAudio
if [test $sound_api = _NO_API_;] then
AC_SUBST( sound_api, [-D__MACOSX_CORE__] )
if [test "$api" == ""; ] then
AC_SUBST( api, [-D__MACOSX_CORE__] )
AC_MSG_RESULT(using CoreAudio)
AC_CHECK_HEADER(CoreAudio/CoreAudio.h,
[AC_SUBST( audio_apis, [-D__MACOSX_CORE__] )],
[AC_MSG_ERROR(CoreAudio header files not found!)] )
AC_SUBST( frameworks, ["-framework CoreAudio -framework CoreFoundation -framework CoreMidi"] )
[],
[AC_MSG_ERROR(CoreAudio header files not found!)] )
AC_SUBST( LIBS, ["-framework CoreAudio -framework CoreFoundation -framework CoreMidi"] )
fi
AC_CHECK_LIB(pthread, pthread_create, , AC_MSG_ERROR(realtime support requires the pthread library!))
AC_CHECK_LIB(pthread, pthread_create, , AC_MSG_ERROR(RtAudio requires the pthread library!))
;;
*-mingw32*)
AC_SUBST( sound_api, [_NO_API_] )
AC_ARG_WITH(asio, [ --with-asio = choose ASIO API support (windoze only)], [AC_SUBST( sound_api, [-D__WINDOWS_ASIO__] ) AC_MSG_RESULT(using ASIO)], )
if [test $sound_api = -D__WINDOWS_ASIO__;] then
audio_apis="-D__WINDOWS_ASIO__"
AC_SUBST( objects, ["asio.o asiodrivers.o asiolist.o iasiothiscallresolver.o"] )
fi
AC_ARG_WITH(asio, [ --with-asio = choose ASIO API support (windoze only)], [
api="$api -D__WINDOWS_ASIO__"
AC_MSG_RESULT(using ASIO)
AC_SUBST( objects, ["asio.o asiodrivers.o asiolist.o iasiothiscallresolver.o"] ) ], )
# Look for DirectSound flag
AC_ARG_WITH(ds, [ --with-ds = choose DirectSound API support (windoze only)], [AC_SUBST( sound_api, [-D__WINDOWS_DS__] ) AC_MSG_RESULT(using DirectSound)], )
if test $sound_api = -D__WINDOWS_DS__; then
audio_apis="-D__WINDOWS_DS__ $audio_apis"
LIBS="-ldsound $LIBS"
fi
AC_ARG_WITH(ds, [ --with-ds = choose DirectSound API support (windoze only)], [
api="$api -D__WINDOWS_DS__"
AC_MSG_RESULT(using DirectSound)
LIBS="-ldsound -lwinmm $LIBS" ], )
# If no audio api flags specified, use DirectSound
if [test $sound_api = _NO_API_;] then
AC_SUBST( sound_api, [-D__WINDOWS_DS__] )
if [test "$api" == "";] then
AC_SUBST( api, [-D__WINDOWS_DS__] )
AC_MSG_RESULT(using DirectSound)
audio_apis="-D__WINDOWS_DS__"
LIBS="-ldsound $LIBS"
LIBS="-ldsound -lwinmm $LIBS"
fi
audio_apis="-D__WINDOWS_MM__ $audio_apis"
api="$api -D__WINDOWS_MM__"
LIBS="-lole32 -lwinmm -lWsock32 $LIBS"
;;
@@ -165,10 +188,8 @@ if test $realtime = yes; then
AC_MSG_ERROR(Unknown system type for realtime support ... try --disable-realtime argument!)
;;
esac
CPPFLAGS="$CPPFLAGS $api"
fi
# Checks for library functions.
AC_PROG_GCC_TRADITIONAL
AC_CHECK_FUNCS(strstr)
AC_OUTPUT

View File

@@ -1,19 +1,13 @@
The Synthesis ToolKit in C++ (STK)
By Perry R. Cook and Gary P. Scavone, 1995-2007.
By Perry R. Cook and Gary P. Scavone, 1995-2012.
Please read the file README and INSTALL for more general STK information.
Realtime audio support for Linux currently includes the Advanced Linux Sound Architecture (ALSA), the JACK low-latency audio server, and/or Open Sound System (OSS version 4.0 and higher only) APIs. One or more APIs are selected during compilation using the __LINUX_ALSA__, __UNIX_JACK__, and/or __LINUX_OSS__ definitions. Because the ALSA library is now integrated into the standard Linux kernel, it is the default audio/MIDI API with STK versions 4.2 and higher. The __LINUX_ALSASEQ__ definition is required to compile RtMidi with ALSA sequencer support. Native OSS MIDI support no longer exists in RtMidi. If the __LINUX_OSS__ preprocessor definition is specified, only OSS audio support will be compiled and RtMidi will still be compiled using the ALSA API. For this reason, STK now requires the asound library for realtime support. Realtime programs must also link with the pthread library. The OSS audio API can be selected by passing the "--with-oss" option to configure.
Realtime audio support for Linux currently includes the Advanced Linux Sound Architecture (ALSA), the JACK low-latency audio server, and/or Open Sound System (OSS version 4.0 and higher only) APIs. That said, the OSS API support has not been tested in several years and is not considered a high priority. One or more APIs are selected during compilation using the __LINUX_ALSA__, __UNIX_JACK__, and/or __LINUX_OSS__ definitions. Because the ALSA library is now integrated into the standard Linux kernel, it is the default audio/MIDI API with STK versions 4.2 and higher.
STK should compile without much trouble under Linux. Since all Linux distributions typically include the GNU makefile utilities, you should be able to use the default Makefile. Typing "make" will initiate the compilation process.
Realtime MIDI support Linux currently includes the Jack and ALSA sequencer support. Native OSS MIDI support no longer exists in RtMidi. If the __LINUX_OSS__ preprocessor definition is specified, only OSS audio support will be compiled and RtMidi will still be compiled using the ALSA API. For this reason, STK now requires the asound library for realtime support (unless only using the Jack API). Realtime programs must also link with the pthread library.
MIDIATOR SERIAL PORT MIDI SUPPORT:
MIDIator support has been removed from RtMidi with STK versions 4.2 and higher. If you really need it, you can contact us to get an old distribution.
NOTE REGARDING PTHREADS:
There haven't been any problems with threads since the old days of RedHat Linux 5.0. STK uses the MIT pthreads API.
STK should compile without much trouble under Linux. Since all Linux distributions typically include the GNU makefile utilities, you should be able to use the default Makefiles. Typing "make" in a project directory will initiate the compilation process (after initially running the configure script in the top-level directory).

View File

@@ -1,21 +1,16 @@
The Synthesis ToolKit in C++ (STK)
By Perry R. Cook and Gary P. Scavone, 1995-2007.
By Perry R. Cook and Gary P. Scavone, 1995-2012.
Please read the file README and INSTALL for more general STK information.
The default realtime support for Macintosh OS X uses the CoreAudio HAL API and is specified during compilation using the __MACOSX_CORE__ preprocessor definition. There is also support for the JACK low-latency audio server using the __UNIX_JACK__ preprocessor definition.
It is necessary to install the OS X developer kit in order to compile STK. STK was successfully tested on OS X versions 10.4.
The internal Macintosh audio hardware typically supports a sample rate of 44100 Hz only. The default STK sample rate is now 44100 Hz and all current example programs use this rate. However, it is possible to manually override this value in some programs from the command-line. The default sample rate is set in Stk.h. In addition, the RT_BUFFER_SIZE, specified in Stk.h, could be increased (to a higher power of two) for more robust performance.
There is a potential conflict between the STK Delay class and a Delay() function declared in OSUtils.h (which is included via <CoreServices/CoreServices.h>). In general, this conflict can be avoided via the use of a namespace (an explicit Delay::Delay declaration), though this made the Windows Visual C++ compiler barf. If you use STK classes within a project that includes the OSUtils.h file, you will likely need to make changes in STK classes that use the Delay class.
The default realtime support for Macintosh OS X uses the CoreAudio HAL API and is specified during compilation using the __MACOSX_CORE__ preprocessor definition. There is also support for the JACK audio server using the __UNIX_JACK__ preprocessor definition.
It is necessary to install the OS X developer kit (or the command line tools) in order to compile STK. STK was successfully tested on the latest version of OS X.
Tcl/Tk on OS X:
The tcl/tk interpreter does not ship by default with OS X, but must be downloaded from the internet. The latest Tcl/Tk Aqua distribution (http://www.apple.com/downloads/macosx/unix_open_source/tcltk.html) has been successfully tested on 10.2 and 10.3 systems. The default installation will place a link to the wish interpretor at /usr/bin/wish.
I think that tcl/tk interpreter is now included in the XCode package, since I haven't had to download it for several years now.
It appears that socket support in Tcl/Tk on OS X uses the Nagle algorithm, which produces poor response between changes made in the tcl/tk script and the resulting audio updates. Note that this is only a problem when using a socket connection from a Tcl/Tk script.

View File

@@ -1,7 +0,0 @@
The Synthesis ToolKit in C++ (STK)
By Perry R. Cook and Gary P. Scavone, 1995-2007.
Please read the file README and INSTALL for more general STK information.
STK has always worked under NeXTStep without realtime audio or MIDI support. In general, STK should compile in this way using any generic C++ compiler. C++ exception handling was added to STK with release 3.2. We managed to get a version of gcc compiled for NeXTStep that can deal with C++ exceptions.

View File

@@ -1,15 +1,7 @@
The Synthesis ToolKit in C++ (STK)
By Perry R. Cook and Gary P. Scavone, 1995-2007.
By Perry R. Cook and Gary P. Scavone, 1995-2012.
Please read the file README and INSTALL for more general STK information.
The project Makefiles are created by configure. If you have trouble running "make", try invoking "gmake" (for GNU make). If that doesn't work, try to download the GNU Makefile utilities from the Internet.
With STK version 4.3, realtime support for IRIX has been discontinued due to the inability to test it. If you need realtime support on an SGI, go back to version 4.2.1. Release 4.0 of STK is confirmed to compile (with various warnings) using CC version 7.30.
The __IRIX_AL__ and __IRIX_MD__ preprocessor definitions are required for realtime audio and MIDI support.
NOTE REGARDING PTHREADS:
Since release 3.1, STK has used the pthread API under Irix. It appears that pthread functionality is standard on SGI, so this change shouldn't cause any problems. If I'm wrong, let me know!
Since STK version 4.3, realtime support for IRIX has been discontinued due to an inability to test it. If you need realtime support on an SGI, go back to version 4.2.1. Release 4.0 of STK is confirmed to compile (with various warnings) using CC version 7.30.

View File

@@ -1,19 +1,18 @@
The Synthesis ToolKit in C++ (STK)
By Perry R. Cook and Gary P. Scavone, 1995-2007.
By Perry R. Cook and Gary P. Scavone, 1995-2012.
Please read the file README for more general STK information.
DirectX and WindowsNT Issues:
-----------------------------
The configure script supports MinGW. As well, STK is distributed with Visual C++ .NET project and workspace files (though these may no longer work with current versions of Visual Studio). It no longer compiles with Visual C++ 6.0.
STK is currently distributed with Visual C++ .NET project and workspace files. It no longer compiles with Visual C++ 6.0. I gave up attempting to fix all the problems created by such a bad compiler. This version of STK has been tested using Visual C++ .NET. As well, the configure script now supprots MinGW.
With Windows XP/7, piping works as under unix. Simply fire up the script files (ex. StkDemo.bat) by either double-clicking on them or from within a shell.
IMPORTANT VC++ NOTE: When compiling "release" versions of STK programs, link to the release multithreaded library. When compiling "debug" versions, link to the debug multithreaded library. Compiler errors will result otherwise. Also, the Microsoft folk are up to their old habits of trying to change standards. The .NET compiler will complain about cerr for some reason.
IMPORTANT VC++ NOTE: When compiling "release" versions of STK programs, link to the release multithreaded library. When compiling "debug" versions, link to the debug multithreaded library. Compiler errors will result otherwise.
Both the DirectSound and Steinberg ASIO audio APIs are supported for realtime audio input/output. The Visual C++ project files included with this distribution are configured to use the DirectSound API. In order to use the ASIO API, it is necessary to change the preprocessor definition from __WINDOWS_DS__ to __WINDOWS_ASIO__, as well as include all the files in the /src/include/ directory (i.e. asio.h, asio.cpp, ...). If you have a good quality soundcard and a native ASIO driver (not emulated), you are likely to get much better input/output response using that.
When using the DirectSound API for audio input, latency is typically pretty horrendous (should we be surprised?). Also, there is a slight chance you don't have DirectSoundCapture support on your computer. If not, you should download the DirectX 6.0 (or higher) runtime libraries from Microsoft's WWW site (http://www.microsoft.com/directx/download.asp) in order to run the pre-compiled STK executables for Windoze. The last time I checked, there was no DirectSoundCapture support for WindowsNT ... you'll have to switch to Windows 2000 or XP or use an ASIO driver. I stopped supporting the WinMM audio output code with release 3.2.
When using the DirectSound API for audio input, latency can be high. If you experience realtime audio "stuttering", you should experiment with different "buffer size" and "number of buffers" values.
Realtime MIDI input/output is supported by RtMidi using the winmm.lib API and requires the __WINDOWS_MM__ preprocessor definition.
@@ -33,42 +32,4 @@ Visual C++ workspaces have been created for the various STK projects. Everythin
Remember that items 1-5 above need to be done for each project and for each configuration. There might be an easy way to make global changes, but I couldn't figure it out.
To use the Tcl/Tk GUIs, you will have to install Tcl/Tk. I got version 8.0 and it works very well (and installed easily). The distribution is available on the WWW and is free.
In order for socketing to work, it is necessary to have the TCP protocol installed on your computer. This can be done from the "Network" control panel.
Finally, to use it all -
WINDOWS XP/2000:
There is a big advantage in using Windows XP/2000 over 95/98 with STK in that piping works, just as under unix. Also, the scheduler in 2000/XP seems to be much better, so socketed messages don't get clumped together like they do in Windows 95/98. Simply fire up a script file (ex. StkDemo.bat) by either double-clicking on it or typing it within a shell.
WINDOWS 95/98:
PLAY SKINI SCOREFILES IN REALTIME:
demo Clarinet -or -if scores/streetsf.ski
USE TCL/TK GUIs FOR REALTIME CONTROL:
1. Open a DOS console window and start syntmono (eg. demo Clarinet -or -is).
2. Double click on a Tcl/Tk file in the tcl/ subdirectory of the demo directory (eg. Demo.tcl) from the Windows Explorer to start the GUI. Select the "communications" menu item and "Socket" and make the connection.
3. Start moving the sliders to control the instrument.
USE REALTIME MIDI INPUT FOR CONTROL:
1. Open a DOS console window and start syntmono with MIDI input (eg. demo Clarinet -or -im).
This assumes you already have MIDI setup correctly for your computer.
WINDOWS NT ONLY:
Realtime piping seems to work under WindowsNT in much the same way as on Unix platforms. Thus, it is possible to pipe realtime control data to syntmono under WindowsNT as well. Note, however, that the DirectSoundCapture API does not exist for WindowsNT, so it is necessary to use an ASIO audio driver and the STK ASIO support.
To use the Tcl/Tk GUIs, you will have to install Tcl/Tk.

View File

@@ -1,6 +1,57 @@
The Synthesis ToolKit in C++ (STK)
By Perry R. Cook and Gary P. Scavone, 1995-2007.
By Perry R. Cook and Gary P. Scavone, 1995-2012.
v4.4.4: (24 August 2012)
- new FreeVerb class (thanks to Greg Burlet)
- new Guitar class
- new electric guitar project
- cleaned / revised Shakers class
- updated versions of RtAudio and RtMidi
- bug fix in LentPitShift
- bug fix in Echo constructor
- bug fix in FileWvIn (file size when chunking)
- bug fix in StkFrames copy constructor
v4.4.3: (30 August 2011)
- changed SINT24 to be lower 3 bytes of 32-bit word
- bug fixes to vectorized tick functions in Effects classes
- updated versions of RtAudio and RtMidi
- fix to ADSR bugs
- updates to the internal argument checking and reporting scheme
- updates to Bowed class (thanks to Esteban Maestre!)
- fixes for 24-bit support in FileRead and FileWrite
- added WAVE_FORMAT_EXTENSIBLE support in FileWrite
- added sample rate variable reading and writing for MAT-files in FileRead and FileWrite
v4.4.2: (4 February 2011)
- added various header file includes for newer compilers
- new LentPitShift class (thanks to Francois Germain)
- added "addTo" function to Delay class
- updates to RtAudio and RtMidi
- bug fixes in Voicer class (thanks Richard Dobson!)
- bug fixes in Granulate class
- added Makefile.in to compile library and all projects, as well as clean and distclean all
v4.4.1: (3 June 2010)
- added multi-channel/frame tick() virtual function to WvIn and WvOut abstract base classes (required update to RtWvOut class)
- updated configure script to select g++ compiler by default
- in demo.cpp: removed voicer grouping for messages, fixing polyphony when messages are on the same MIDI/SKINI channel
- updates to RtAudio and RtMidi
v4.4: (30 April 2010)
- all classes embedded in the "stk" namespace (except RtAudio, RtMidi, and RtError)
- class WaveLoop renamed FileLoop
- significant efficiency improvements via code restructuring and inlining
- some class source (.cpp) files deleted as part of inlining (Generator, Filter, Function, WvIn, WvOut, Effect, Instrmnt, BowTable, ReedTable, JetTable, Vector3D)
- updates to RtAudio and RtMidi
- previous "tickFrame()" functions renamed "tick" for more consistent API
- more consistent and scalable approach to multichannel data and computations
- multichannel support added to Granulate class
- Filter class made abstract. New Iir and Fir classes made for non-order-specific filtering.
- new TapDelay class
- SubNoise class deleted (same as sub-sampled "ticking" of Noise class)
v4.3.1: (7 December 2007)
- further headerless file support in FileRead
@@ -14,6 +65,7 @@ v4.3.0: (13 August 2007)
- an official MIT-like license
- new functionality to automatically update class data when the STK sample rate changes (partly implemented)
- updates for new RtAudio version 4.0
- removed RtDuplex class, users should use RtAudio directly with a callback function
- bug fix in interpolate() function in Stk.h for non-interleaved data
- fixes / improvements to the Granulate class
- fix in Whistle when doing animation

File diff suppressed because it is too large Load Diff

View File

@@ -37,26 +37,26 @@ STK compiles with realtime support on the following flavors of the Unix operatin
<TR>
<TD>Linux</TD>
<TD>ALSA</TD>
<TD>__LINUX_ALSA__, __LINUX_ALSASEQ__, __LITTLE_ENDIAN__</TD>
<TD>__LINUX_ALSA__, __LITTLE_ENDIAN__</TD>
<TD><TT>asound, pthread</TT></TD>
</TR>
<TR>
<TD>Linux</TD>
<TD>OSS (version 4.0 only, use ALSA for MIDI support)</TD>
<TD>__LINUX_OSS__, __LINUX_ALSASEQ__, __LITTLE_ENDIAN__</TD>
<TD>__LINUX_OSS__, __LINUX_ALSA__, __LITTLE_ENDIAN__</TD>
<TD><TT>asound, pthread</TT></TD>
</TR>
<TR>
<TD>Linux and Macintosh OS-X</TD>
<TD>Jack (audio only, use ALSA for MIDI support)</TD>
<TD>__UNIX_JACK__, __LINUX_ALSASEQ__, __LITTLE_ENDIAN__</TD>
<TD>Jack</TD>
<TD>__UNIX_JACK__, __LITTLE_ENDIAN__</TD>
<TD><TT>asound, pthread, jack</TT></TD>
</TR>
<TR>
<TD>Macintosh OS X</TD>
<TD>CoreAudio</TD>
<TD>__MACOSX_CORE__</TD>
<TD><TT>pthread, CoreAudio, CoreMIDI, CoreFoundation</TT></TD>
<TD><TT>pthread, CoreAudio, CoreMidi, CoreFoundation</TT></TD>
</TR>
</TABLE>
</CENTER>
@@ -69,13 +69,11 @@ a particular program into a project directory. Taking the
would be necessary to set up a directory that includes the files
<TT>sineosc.cpp</TT>, the rawwave file <TT>sinewave.raw</TT> in a
subdirectory called <TT>rawwaves</TT>, and the header and source files
for the classes Stk, FileRead, FileWrite, WvIn, FileWvIn, WaveLoop,
WvOut, and FileWvOut. The program could then be compiled on a
little-endian system, such as a PC running Linux, using the GNU g++
compiler as follows:
\code
g++ -Wall -D__LITTLE_ENDIAN__ -o sineosc Stk.cpp FileRead.cpp FileWrite.cpp WvIn.cpp FileWvIn.cpp WaveLoop.cpp WvOut.cpp FileWvOut.cpp sineosc.cpp
\endcode
for the classes Stk, FileRead, FileWrite, FileWvIn, FileLoop, and
FileWvOut. The program could then be compiled on a little-endian
system, such as a PC running Linux, using the GNU g++ compiler as
follows:
\code g++ -Wall -D__LITTLE_ENDIAN__ -o sineosc Stk.cpp FileRead.cpp FileWrite.cpp FileWvIn.cpp FileLoop.cpp FileWvOut.cpp sineosc.cpp \endcode
Note that the <TT>sineosc.cpp</TT> example does not make use of realtime audio or MIDI input/output classes. For programs using any of the STK realtime classes mentioned above, it is necessary to specify an audio/MIDI API preprocessor definition and link with the appropriate libraries or frameworks.
@@ -95,7 +93,7 @@ g++ -Wall -D__LITTLE_ENDIAN__ -I/usr/include/stk -o sineosc sineosc.cpp -lstk
With the header files in a standard search path, it is possible to modify the <TT>\#include</TT> statements in the <TT>sineosc.cpp</TT> program as follows:
\code
#include "stk/WaveLoop.h"
#include "stk/FileLoop.h"
#include "stk/FileWvOut.h"
\endcode
@@ -117,7 +115,7 @@ includes the necessary ToolKit files from the distribution
<TT>src</TT> and <TT>include</TT> directories. For the example
program from the previous tutorial chapter, create a VC++ console
application project, add the Stk, FileRead, FileWrite, WvIn, FileWvIn,
WaveLoop, WvOut, and FileWvOut class files, as well as
FileLoop, WvOut, and FileWvOut class files, as well as
<TT>sineosc.cpp</TT>, and make sure the <TT>sinewave.raw</TT> file is
in the subdirectory <TT>rawwaves</TT>.

View File

@@ -19,9 +19,20 @@ NoteOff 1.000000 2 69.0 64.0
MIDI messages are easily represented within the SKINI protocol.
The class Messager can be used to acquire and parse MIDI messages from a MIDI device and SKINI messages from STDIN and socket connections. Incoming messages are acquired asynchronously and saved to an internal message queue of Skini::Message types (MIDI messages are converted to the Skini:Message format). The user then uses the Messager:popMessage() function to retrieve incoming control messages. This function does not block, instead returning a message type of zero when no more messages are in the queue. Many of the example programs included with the ToolKit distribution use a Messager instance to accept control input from the accompanying tcl/tk graphical user interfaces, from external MIDI devices, or from SKINI scorefiles.
The class stk::Messager can be used to acquire and parse MIDI messages
from a MIDI device and SKINI messages from STDIN and socket
connections. Incoming messages are acquired asynchronously and saved
to an internal message queue of stk::Skini::Message types (MIDI
messages are converted to the stk::Skini:Message format). The user
then uses the stk::Messager:popMessage() function to retrieve incoming
control messages. This function does not block, instead returning a
message type of zero when no more messages are in the queue. Many of
the example programs included with the ToolKit distribution use a
stk::Messager instance to accept control input from the accompanying tcl/tk
graphical user interfaces, from external MIDI devices, or from SKINI
scorefiles.
In the following example, we'll modify the <TT>bethree.cpp</TT> program from the previous tutorial chapter and incorporate a Messager class to allow control via SKINI messages read from a SKINI file.
In the following example, we'll modify the <TT>bethree.cpp</TT> program from the previous tutorial chapter and incorporate a stk::Messager class to allow control via SKINI messages read from a SKINI file.
\include controlbee.cpp
@@ -37,7 +48,7 @@ controlbee scores/bookert.ski
Only a few basic SKINI message type case statements are included in this example. It is easy to extend the program to support a much more elaborate set of instrument control parameters.
This example could also be easily extended to accept "realtime" control input messages via pipe, socket or MIDI connections. The Messager class provides Messager::startStdInput(), Messager::startSocketInput(), and Messager::startMidiInput() functions for this purpose.
This example could also be easily extended to accept "realtime" control input messages via pipe, socket or MIDI connections. The stk::Messager class provides stk::Messager::startStdInput(), stk::Messager::startSocketInput(), and stk::Messager::startMidiInput() functions for this purpose.
[<A HREF="tutorial.html">Main tutorial page</A>] &nbsp; [<A HREF="multichannel.html">Next tutorial</A>]
*/

View File

@@ -11,8 +11,8 @@ invoked automatically by the audio system controller (RtAudio) when
new data is needed and it is necessary to compute a full audio buffer
of samples at that time (see \ref callback for further information).
The previous section described the use of the RtWvOut class for
realtime audio output. The RtWvOut::tick() function writes data to a
The previous section described the use of the stk::RtWvOut class for
realtime audio output. The stk::RtWvOut::tick() function writes data to a
large ring-buffer, from which data is periodically written to the
computer's audio hardware via an underlying callback routine.

View File

@@ -1,16 +1,78 @@
/*! \page download Download, Release Notes, and Bug Fixes
\section down Download Version 4.3.1 (7 December 2007):
\section down Download Version 4.4.4 (24 August 2012):
<UL>
<LI><A HREF="http://ccrma.stanford.edu/software/stk/release/stk-4.3.1.tar.gz">Source distribution</A></LI>
<LI><A HREF="http://ccrma.stanford.edu/planetccrma/software/">Linux RPMs from Planet CCRMA</A></LI>
<LI><A HREF="http://ccrma.stanford.edu/software/stk/release/stk-4.4.4.tar.gz">Source distribution</A></LI>
</UL>
\section notes Release Notes:
\subsection v4dot3dot0 Version 4.3.1
\subsection v4dot4dot4 Version 4.4.4
<ul>
<li>New FreeVerb class (thanks to Greg Burlet)</li>
<li>New Guitar class</li>
<li>New electric guitar project</li>
<li>Updated versions of RtAudio and RtMidi</li>
<li>Cleaned / revised Shakers class</li>
<li>Bug fix in LentPitShift</li>
<li>Bug fix in Echo constructor</li>
<li>Bug fix in FileWvIn (file size when chunking)</li>
<li>Bug fix in StkFrames copy constructor</li>
</ul>
\subsection v4dot4dot3 Version 4.4.3
<ul>
<li>Changed SINT24 to be lower 3 bytes of 32-bit word.</li>
<li>Bug fixes to vectorized tick functions in Effects classes.</li>
<li>Updated versions of RtAudio and RtMidi.</li>
<li>Bug fixes in ADSR and Envelope classes.</li>
<li>Updates to the internal argument checking and reporting scheme.</li>
<li>Updates to Bowed class (thanks to Esteban Maestre!).</li>
<li>Fixes for 24-bit support in FileRead and FileWrite.</li>
<li>Added WAVE_FORMAT_EXTENSIBLE support in FileWrite.</li>
<li>Added sample rate variable reading and writing for MAT-files in FileRead and FileWrite.</li>
</ul>
\subsection v4dot4dot2 Version 4.4.2
<ul>
<li>Added various header file includes for newer compilers.</li>
<li>Updates to RtAudio and RtMidi.</li>
<li>New LentPitShift class (thanks to Francois Germain).</li>
<li>Bug fixes in Voicer class (thanks Richard Dobson!).</li>
<li>Added Makefile.in to compile library and all projects, as well as clean and distclean.</li>
</ul>
\subsection v4dot4dot1 Version 4.4.1
<ul>
<li>Added multi-channel/frame tick() virtual function to WvIn and WvOut abstract base classes (required update to RtWvOut class).</li>
<li>Updated configure script to select g++ compiler by default.</li>
<li>In demo.cpp: removed voicer grouping for messages, fixing polyphony when messages are on the same MIDI/SKINI channel.</li>
<li>Updates to RtAudio and RtMidi.</li>
</ul>
\subsection v4dot4dot0 Version 4.4.0
<ul>
<li>All classes embedded in the "stk" namespace (except RtAudio, RtMidi, and RtError).</li>
<li>Class WaveLoop renamed FileLoop.</li>
<li>Significant efficiency improvements via code restructuring and inlining.</li>
<li>Some class source (.cpp) files deleted as part of inlining (Generator, Filter, Function, WvIn, WvOut, Effect, Instrmnt, BowTable, ReedTable, JetTable, Vector3D).</li>
<li>Updates to RtAudio and RtMidi.</li>
<li>Previous "tickFrame()" functions renamed "tick" for more consistent API.</li>
<li>More consistent and scalable approach to multichannel data and computations.</li>
<li>Multichannel support added to Granulate class.</li>
<li>Filter class made abstract. New Iir and Fir classes made for non-order-specific filtering.</li>
<li>New TapDelay class.</li>
<li>SubNoise class deleted (same as sub-sampled "ticking" of Noise class).</li>
</ul>
\subsection v4dot3dot1 Version 4.3.1
<ul>
<li>Further headerless file support in FileRead.</li>
@@ -20,13 +82,13 @@
<li>Changes to channel assignment in demo.cpp.</li>
</ul>
\subsection v4dot3dot0 Version 4.3.0
<ul>
<li>An official MIT-like license.</li>
<li>New functionality to automatically update class data when the STK sample rate changes (partly implemented).</li>
<li>Updates for new RtAudio version 4.0.</li>
<li>Removed RtDuplex class, users should use RtAudio directly with a callback function.</li>
<li>Bug fix in interpolate() function in Stk.h for non-interleaved data.</li>
<li>Fixes / improvements to the Granulate class.</li>
<li>Fix in Whistle when doing animation.</li>

View File

@@ -2,8 +2,6 @@
- \ref license
- \ref filerate
- \ref computesample
- \ref tickframe
- \ref endianness
- \ref xwindows
@@ -26,7 +24,7 @@ work with any standard C++ compiler.
STK WWW site: http://ccrma.stanford.edu/software/stk/
The Synthesis ToolKit in C++ (STK)
Copyright (c) 1995-2007 Perry R. Cook and Gary P. Scavone
Copyright (c) 1995-2012 Perry R. Cook and Gary P. Scavone
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -65,21 +63,13 @@ Stk::setSampleRate( sampleRate ); // set a new STK sample rate based o
With version 4.3 and higher of STK, the FileWvIn class will be notified of a sample rate change and it will automatically adjust its read rate accordingly. Previous versions of STK did not perform this change and thus, the read rate could end up being incorrect. If you do not want FileWvIn to perform this automatic adjustment, you can call the \c ignoreSampleRateChange() function for a given class instance.
\section tickframe What is the difference between the tick() and tickFrame() functions?
\e tickFrame() functions are provided in classes that can handle multi-channel data. A <i>sample frame</i> of audio data represents a single "slice" in time across many audio channels. The WvIn and WvOut subclasses are the primary classes in STK that currently implement the \e tickFrame() functions. \e tick() functions are used for monophonic classes. Note, however, that the WvIn and WvOut classes also implement \e tick() functions though their behavior is dependent on the number of channels you are working with. For example, if using the FileWvIn class with a monophonic soundfile, then there is no difference between the \e tick() and \e tickFrame() functions (aside from the format of their arguments). But if you have a multi-channel file open, then the single value returned from the tick() function is an average of all the samples in the multi-channel sample frame.
\section computesample Hey, why was the tick() function replaced by computeSample() in various STK classes?
C++ doesn't like overloaded virtual functions. All STK classes that implement a single-sample \e tick() function also provide an overloaded version that takes an StkFrames argument (for vectorized computations). Further, many STK classes inherit from abstract base classes (Instrmnt, Generator, ...) and it is most convenient to define functionality common to all subclasses (like the \e tick() function that takes an StkFrames argument) in only the base class. So, to get around the overloaded virtual function problem, STK now uses the \e computeSample() function as a non-overloaded virtual function that is implemented in all subclasses (it essentially replaces the \e tick() function). Note, however, that the overloaded \e tick() functions are still available to the user ... they are implemented in the base classes.
\section endianness Why does the sound I generated with STK sound like *&#@!?
If the resultant sound generated by an STK program sounds like noise (and you're not doing an MLS experiment), the problem is likely related to the byte "endianness" of your computer. By default, STK assumes "big endian" byte order. If you are working with STK classes on a PC (Windows or Linux), you \e must define the <TT>__LITTLE_ENDIAN__</TT> preprocessor definition \e before compiling. If after reading this you realize you need to make this change, do not forget to recompile all STK classes from scratch.
\section xwindows Why do I get a Tk display error message?
The following error will be printed to your terminal window if you attempt to start an STK tcl/tk interface without the X Server first running:
The following error may be printed to your terminal window (depending on the version of the tcl/tk interpreter you are running) if you attempt to start an STK tcl/tk interface without the X Server first running:
\code
Application initialization failed: this isn't a Tk applicationcouldn't connect to display ":0.0"

View File

@@ -1,9 +1,10 @@
/*! \page filtering Using Filters
In this section, we demonstrate the use of a few of the STK filter classes. The Filter class provides functionality to implement a generalized digital filter of any type, similar to the \c filter function in Matlab. In this example, we create a Filter instance and initialize it with specific numerator and denominator coefficients. We then compute its impulse response for 20 samples.
In this section, we demonstrate the use of a few of the STK filter classes. The stk::Iir class provides functionality to implement a generalized infinite impulse response (IIR) digital filter, similar to the \c filter function in Matlab. In this example, we create an stk::Iir instance and initialize it with specific numerator and denominator coefficients. We then compute its impulse response for 20 samples.
\code
#include "Filter.h"
#include "Iir.h"
using namespace stk;
int main()
{
@@ -16,7 +17,7 @@ int main()
denominator.push_back( 0.3 );
denominator.push_back( -0.5 );
Filter filter( numerator, denominator );
Iir filter( numerator, denominator );
filter.tick( output );
for ( unsigned int i=0; i<output.size(); i++ ) {
@@ -27,22 +28,23 @@ int main()
}
\endcode
The Filter class implements the standard difference equation
The stk::Iir class implements the standard difference equation
\code
a[0]*y[n] = b[0]*x[n] + ... + b[nb]*x[n-nb] - a[1]*y[n-1] - ... - a[na]*y[n-na],
\endcode
where "b" values are numerator coefficients and "a" values are denominator coefficients. Note that if the first denominator coefficient is not 1.0, the Filter class automatically normalizes all filter coefficients by that value. The coefficient values are passed to the Filter class via a C++ <a href="http://www.roguewave.com/support/docs/sourcepro/stdlibref/vector.html">vector</a>, a container object provided by the C++ Standard Library.
where "b" values are numerator coefficients and "a" values are denominator coefficients. Note that if the first denominator coefficient is not 1.0, the Iir class automatically normalizes all filter coefficients by that value. The coefficient values are passed to the Iir class via a C++ <a href="http://www.roguewave.com/support/docs/sourcepro/stdlibref/vector.html">vector</a>, a container object provided by the C++ Standard Library.
Most STK classes use more specific types of digital filters, such as the OneZero, OnePole, TwoPole, or BiQuad varieties. These classes inherit from the Filter class and provide specific functionality particular to their use, as well as functions to independently control individual coefficient values.
Most STK classes use more specific types of digital filters, such as the stk::OneZero, stk::OnePole, stk::TwoPole, or stk::BiQuad varieties. These classes inherit from the stk::Filter abstract base class and provide specific functionality particular to their use, as well as functions to independently control individual coefficient values.
\section reson Resonances:
The STK BiQuad and TwoPole classes provide functionality for creating resonance filters. The following example demonstrates how to create a resonance centered at 440 Hz that is used to filter the output of a Noise generator.
The STK stk::BiQuad and stk::TwoPole classes provide functionality for creating resonance filters. The following example demonstrates how to create a resonance centered at 440 Hz that is used to filter the output of a stk::Noise generator.
\code
#include "BiQuad.h"
#include "Noise.h"
using namespace stk;
int main()
{
@@ -61,11 +63,12 @@ int main()
}
\endcode
By passing a boolian value of \c true as the third argument to the BiQuad::setResonance() function, the filter coefficients are automatically scaled to achieve unity gain at the resonance peak frequency. The previous code could be easily modified for "vector-based" calculations:
By passing a boolian value of \c true as the third argument to the stk::BiQuad::setResonance() function, the filter coefficients are automatically scaled to achieve unity gain at the resonance peak frequency. The previous code could be easily modified for "vector-based" calculations:
\code
#include "BiQuad.h"
#include "Noise.h"
using namespace stk;
int main()
{

View File

@@ -2,7 +2,7 @@
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>

View File

@@ -1,15 +1,16 @@
/*! \page fundamentals STK Fundamentals
The Synthesis ToolKit is implemented in the C++ programming language. STK does not attempt to provide a new programming environment or paradigm but rather provides a set of objects that can be used within a normal C++ programming framework. Therefore, it is expected that users of STK will have some familiarity with C/C++ programming concepts. That said, the STK classes do have some particular idiosyncrasies that we will mention here.
The Synthesis ToolKit is implemented in the C++ programming language. STK does not attempt to provide a new programming environment or paradigm but rather provides a set of objects that can be used within a normal C++ programming framework. Therefore, it is expected that users of STK will have some familiarity with C/C++ programming concepts. That said, the STK classes do have some particular idiosyncrasies that we will mention here. Starting with STK version 4.4, all STK classes except RtAudio, RtMidi, and RtError are defined within the stk namespace.
\section Signal Computations:
Audio and control signals throughout STK use a floating-point data type, <tt>StkFloat</tt>, the exact precision of which can be controlled via a typedef statement in Stk.h. By default, an StkFloat is a double-precision floating-point value. Thus, the ToolKit can use any normalization scheme desired. The base instruments and algorithms are implemented with a general audio sample dynamic maximum of +/-1.0.
In general, the computation and/or passing of values is performed on a "single-sample" basis. For example, the Noise class outputs random floating-point numbers in the range +/-1.0. The computation of such values occurs in the Noise::tick() function. The following program will generate 20 random floating-point (<tt>StkFloat</tt>) values in the range -1.0 to +1.0:
In general, the computation and/or passing of values is performed on a "single-sample" basis. For example, the stk::Noise class outputs random floating-point numbers in the range +/-1.0. The computation of such values occurs in the stk::Noise::tick() function. The following program will generate 20 random floating-point (<tt>StkFloat</tt>) values in the range -1.0 to +1.0:
\code
#include "Noise.h"
using namespace stk;
int main()
{
@@ -29,6 +30,7 @@ Nearly all STK classes implement <TT>tick()</TT> functions that take and/or retu
\code
#include "Noise.h"
using namespace stk;
int main()
{
@@ -44,19 +46,19 @@ int main()
}
\endcode
In this way, it might be possible to achieve improved processing efficiency using vectorized computations. The StkFrames class is a relatively new addition to the ToolKit to provide a general "mechanism" for handling and passing vectorized, multi-channel audio data. The StkFrames "type" provides functions to set and/or determine the number of audio channels and sample frames it holds, as well as the format (interleaved or non-interleaved) of its data. Further, the StkFrames class provides data interpolation and subscripting functionality by frame/channel values.
In this way, it might be possible to achieve improved processing efficiency using vectorized computations. The StkFrames class is a relatively new addition to the ToolKit to provide a general "mechanism" for handling and passing vectorized, multi-channel audio data. The StkFrames "type" provides functions to set and/or determine the number of audio channels and sample frames it holds. Further, the StkFrames class provides data interpolation and subscripting functionality by frame/channel values.
\section STK Inheritance:
Nearly all STK classes inherit from the Stk abstract base class, which provides common functionality related to error reporting, sample rate control, and byte swapping. Several other base classes exist that roughly group many of the classes according to function as follows:
- Generator: source signal unit generator classes [Envelope, ADSR, Asymp, Noise, SubNoise, Modulate, SingWave, SineWave Blit, BlitSaw, BlitSquare, Granulate]
- Filter: digital filtering classes [OneZero, OnePole, PoleZero, TwoZero, TwoPole, BiQuad, FormSwep, Delay, DelayL, DelayA]
- Function: input to output function mappings [BowTable, JetTable, ReedTable]
- Instrmnt: sound synthesis algorithms, including physical, FM, modal, and particle models
- Effect: sound processing effect classes [Echo, Chorus, PitShift, PRCRev, JCRev, NRev]
- WvOut: audio data output classes [FileWvOut, RtWvOut, InetWvOut]
- WvIn: audio data input classes [FileWvIn, WaveLoop, RtWvIn, InetWvIn]
- stk::Generator: source signal unit generator classes [stk::Envelope, stk::ADSR, stk::Asymp, stk::Noise, stk::SubNoise, stk::Modulate, stk::SingWave, stk::SineWave, stk::Blit, stk::BlitSaw, stk::BlitSquare, stk::Granulate]
- stk::Filter: digital filtering classes [stk::OneZero, stk::OnePole, stk::PoleZero, stk::TwoZero, stk::TwoPole, stk::BiQuad, stk::FormSwep, stk::Delay, stk::DelayL, stk::DelayA, stk::TapDelay]
- stk::Function: input to output function mappings [stk::BowTable, stk::JetTable, stk::ReedTable]
- stk::Instrmnt: sound synthesis algorithms, including physical, FM, modal, and particle models
- stk::Effect: sound processing effect classes [stk::Echo, stk::Chorus, stk::PitShift, stk::PRCRev, stk::JCRev, stk::NRev]
- stk::WvOut: audio data output classes [stk::FileWvOut, stk::RtWvOut, stk::InetWvOut]
- stk::WvIn: audio data input classes [stk::FileWvIn, stk::FileLoop, stk::RtWvIn, stk::InetWvIn]
[<A HREF="tutorial.html">Main tutorial page</A>] &nbsp; [<A HREF="hello.html">Next tutorial</A>]

View File

@@ -3,24 +3,25 @@
We'll continue our introduction to the Synthesis ToolKit with a simple
sine-wave oscillator program. STK provides two different classes for
sine-wave generation. We will first look at a generic waveform
oscillator class, WaveLoop, that can load a variety of common file
oscillator class, stk::FileLoop, that can load a variety of common file
types. In this example, we load a sine "table" from an STK RAW file
(defined as monophonic, 16-bit, big-endian data). We use the class
FileWvOut to write the result to a 16-bit, WAV formatted audio file.
stk::FileWvOut to write the result to a 16-bit, WAV formatted audio file.
\code
// sineosc.cpp
#include "WaveLoop.h"
#include "FileLoop.h"
#include "FileWvOut.h"
using namespace stk;
int main()
{
// Set the global sample rate before creating class instances.
Stk::setSampleRate( 44100.0 );
WaveLoop input;
FileLoop input;
FileWvOut output;
// Load the sine wave file.
@@ -39,29 +40,37 @@ int main()
}
\endcode
WaveLoop is a subclass of FileWvIn, which supports WAV, SND (AU),
AIFF, MAT-file (Matlab), and RAW file formats with 8-, 16-, and 32-bit
integer and 32- and 64-bit floating-point data types. FileWvIn
provides interpolating, read-once ("oneshot") functionality, as well
as methods for setting the read rate and read position.
stk::FileLoop is a subclass of stk::FileWvIn, which supports WAV, SND
(AU), AIFF, MAT-file (Matlab), and RAW file formats with 8-, 16-, and
32-bit integer and 32- and 64-bit floating-point data types.
stk::FileWvIn provides interpolating, read-once ("oneshot")
functionality, as well as methods for setting the read rate and read
position.
FileWvIn provides a "tick level" and interpolating interface to the
FileRead class. Likewise, FileWvOut provides a "tick level" interface
to the FileWrite class. FileRead and FileWrite both support WAV,
SND(AU), AIFF, MAT-file (Matlab), and RAW file formats with 8-, 16-,
and 32-bit integer and 32- and 64-bit floating-point data types.
FileWvOut does not currently offer data interpolation functionality.
stk::FileWvIn provides a "tick level" and interpolating interface to
the stk::FileRead class. Likewise, stk::FileWvOut provides a "tick
level" interface to the stk::FileWrite class. stk::FileRead and
FileWrite both support WAV, SND(AU), AIFF, MAT-file (Matlab), and RAW
file formats with 8-, 16-, and 32-bit integer and 32- and 64-bit
floating-point data types. stk::FileWvOut does not currently offer
data interpolation functionality.
The WvIn and WvOut parent classes and all subclasses support
multi-channel sample frames. To distinguish single-sample frame
operations from multi-channel frame operations, these classes also
implement <TT>tickFrame()</TT> functions. When a <TT>tick()</TT>
method is called for multi-channel data, frame averages are returned
or the input sample is distributed across all channels of a sample
frame.
A number of STK parent classes, including stk::WvIn, stk::WvOut,
stk::Instrmnt, stk::Generator, and stk::Effect, (and some or all of
their subclasses) support multi-channel sample frames. If a
single-sample version of the <TT>tick()</TT> function is called for
these classes, a full sample frame is computed but only a single value
is either input and/or output. For example, if the single-sample
<TT>tick()</TT> function is called for subclasses of stk::WvOut, the
sample argument is written to all channels in the one computed frame.
For classes returning values, an optional \c channel argument
specifies which channel value is returned from the computed frame (the
default is always channel 0). To input and/or output multichannel data
to these classes, the overloaded <TT>tick()</TT> functions taking
StkFrames reference arguments should be used.
Nearly all STK classes inherit from the Stk base class. Stk provides
a static sample rate that is queried by subclasses as needed.
Nearly all STK classes inherit from the stk::Stk base class. Stk
provides a static sample rate that is queried by subclasses as needed.
Because many classes use the current sample rate value during
instantiation, it is important that the desired value be set at the
beginning of a program. The default STK sample rate is 44100 Hz.
@@ -75,7 +84,11 @@ rewritten as shown below.
\include sineosc.cpp
In this particular case, we simply exit the program if an error occurs (an error message is automatically printed to stderr). A more refined program might attempt to recover from or fix a particular problem and, if successful, continue processing. See the \ref classes to determine which constructors and functions can throw an error.
In this particular case, we simply exit the program if an error occurs
(an error message is automatically printed to stderr). A more refined
program might attempt to recover from or fix a particular problem and,
if successful, continue processing. See the \ref classes to determine
which constructors and functions can throw an error.
[<A HREF="fundamentals.html">Main tutorial page</A>] &nbsp; [<A HREF="compile.html">Next tutorial</A>]
*/

View File

@@ -1,4 +1,4 @@
/*! \mainpage <I>The Synthesis ToolKit in C++ (STK)</I>
/*! \mainpage The Synthesis ToolKit in C++ (STK)
\htmlonly
<BODY BGCOLOR="white">
@@ -15,7 +15,7 @@ portable (it's mostly platform-independent C and C++ code), and it's
completely user-extensible (all source included, no unusual libraries,
and no hidden drivers). We like to think that this increases the
chances that our programs will still work in another 5-10 years. In
fact, the ToolKit has been working continuously for about 10 years
fact, the ToolKit has been working continuously for nearly 15 years
now. STK currently runs with realtime support (audio and MIDI) on
Linux, Macintosh OS X, and Windows computer platforms. Generic,
non-realtime support has been tested under NeXTStep, Sun, and other

View File

@@ -18,9 +18,9 @@ Here's a link to a book that includes an chapter on STK.
<H4>What is the <I>Synthesis ToolKit</I>?</H4>
The Synthesis ToolKit in C++ (STK) is a set of open source audio signal processing and algorithmic synthesis classes written in the C++ programming language. STK was designed to facilitate rapid development of music synthesis and audio processing software, with an emphasis on cross-platform functionality, realtime control, ease of use, and educational example code. The Synthesis ToolKit is extremely portable (it's mostly platform-independent C and C++ code), and it's completely user-extensible (all source included, no unusual libraries, and no hidden drivers). We like to think that this increases the chances that our programs will still work in another 5-10 years. In fact, the ToolKit has been working continuously for nearly 10 years now. STK currently runs with realtime support (audio and MIDI) on Linux, Macintosh OS X, and Windows computer platforms. Generic, non-realtime support has been tested under NeXTStep, Sun, and other platforms and should work with any standard C++ compiler.
The Synthesis ToolKit in C++ (STK) is a set of open source audio signal processing and algorithmic synthesis classes written in the C++ programming language. STK was designed to facilitate rapid development of music synthesis and audio processing software, with an emphasis on cross-platform functionality, realtime control, ease of use, and educational example code. The Synthesis ToolKit is extremely portable (it's mostly platform-independent C and C++ code), and it's completely user-extensible (all source included, no unusual libraries, and no hidden drivers). We like to think that this increases the chances that our programs will still work in another 5-10 years. In fact, the ToolKit has been working continuously for nearly 15 years now. STK currently runs with realtime support (audio and MIDI) on Linux, Macintosh OS X, and Windows computer platforms. Generic, non-realtime support has been tested under NeXTStep, Sun, and other platforms and should work with any standard C++ compiler.
The Synthesis ToolKit is free for non-commercial use. The only parts of the Synthesis ToolKit that are platform-dependent concern real-time audio and MIDI input and output, and that is taken care of with a few special classes. The interface for MIDI input and the simple <A HREF="http://dev.scriptics.com">Tcl/Tk</A> graphical user interfaces (GUIs) provided is the same, so it's easy to experiment in real time using either the GUIs or MIDI. The Synthesis ToolKit can generate simultaneous SND (AU), WAV, AIFF, and MAT-file output soundfile formats (as well as realtime sound output), so you can view your results using one of a large variety of sound/signal analysis tools already available (e.g. <A HREF="http://www-ccrma.stanford.edu/software/snd/">Snd</A>, Cool Edit, Matlab).
The Synthesis ToolKit is free. The only parts of the Synthesis ToolKit that are platform-dependent concern real-time audio and MIDI input and output, and that is taken care of with a few special classes. The interface for MIDI input and the simple <A HREF="http://dev.scriptics.com">Tcl/Tk</A> graphical user interfaces (GUIs) provided is the same, so it's easy to experiment in real time using either the GUIs or MIDI. The Synthesis ToolKit can generate simultaneous SND (AU), WAV, AIFF, and MAT-file output soundfile formats (as well as realtime sound output), so you can view your results using one of a large variety of sound/signal analysis tools already available (e.g. <A HREF="http://www-ccrma.stanford.edu/software/snd/">Snd</A>, Cool Edit, Matlab).
<H4>What the <I>Synthesis ToolKit</I> is not.</H4>

View File

@@ -1,6 +1,6 @@
/*! \page instruments Instruments
The ToolKit comes with a wide variety of synthesis algorithms, all of which inherit from the Instrmnt class. In this example, we'll fire up an instance of the BeeThree FM synthesis class and show how its frequency can be modified over time.
The ToolKit comes with a wide variety of synthesis algorithms, all of which inherit from the stk::Instrmnt class. In this example, we'll fire up an instance of the stk::BeeThree FM synthesis class and show how its frequency can be modified over time.
\include bethree.cpp
@@ -10,7 +10,7 @@ with any other STK instrument class. It should be noted, however,
that a few classes do not respond to the setFrequency() function
(e.g., Shakers, Drummer).
The noteOn() function initiates an instrument attack. Instruments that are continuously excited (e.g., Clarinet, BeeThree) will continue to sound until stopped with a noteOff(). Impulsively excited instrument sounds (e.g., Plucked, Wurley) typically decay within a few seconds time, requiring subsequent noteOn() messages for re-attack.
The noteOn() function initiates an instrument attack. Instruments that are continuously excited (e.g., stk::Clarinet, stk::BeeThree) will continue to sound until stopped with a noteOff(). Impulsively excited instrument sounds (e.g., stk::Plucked, stk::Wurley) typically decay within a few seconds time, requiring subsequent noteOn() messages for re-attack.
Instrument parameters can be precisely controlled as demonstrated above. A more flexible approach to instrument control, allowing arbitrary scorefile or realtime updates, is described in the next tutorial chapter.

View File

@@ -1,8 +1,10 @@
/*! \page links Miscellaneous Links
- <A HREF="http://music.mcgill.ca/~gary/rtaudio/">The %RtAudio WWW site</A>
- <A HREF="http://www.music.mcgill.ca/~gary/rtaudio/">The %RtAudio WWW site</A>
- <A HREF="http://music.mcgill.ca/~gary/rtmidi/">The %RtMidi WWW site</A>
- <A HREF="http://www.music.mcgill.ca/~gary/rtmidi/">The %RtMidi WWW site</A>
- <A HREF="http://momu.stanford.edu/stk/">MoMu-Stk: A lightly modified version of STK that supports the iPhone platform (iPhone, iPad, iPod Touches)</A>
- <A HREF="http://ccrma.stanford.edu/~woony/software/stkx/">StkX: A Cocoa STK Framework for Mac OS X by Woon Seung Yeo</A>
@@ -10,20 +12,14 @@
- <A HREF="http://chuck.cs.princeton.edu/">ChucK: Concurrent, On-the-fly Audio Programming Language</A> using STK unit generators
- <A HREF="http://www.music.princeton.edu/paul/stkugens.tar.gz">Paul Lansky's port of STK to SuperCollider</A>
- <A HREF="http://kern.humdrum.net/">Kern Scores: A Library of Electronic Musical Scores</A> (with automatic conversion to SKINI format)
- <A HREF="http://kern.ccarh.org">Kern Scores: A Library of Electronic Musical Scores</A> (with automatic conversion to SKINI format)
- <A HREF="http://stk.sapp.org/midi2skini">MIDI to SKINI file converter</A> by Craig Sapp
- <A HREF="http://stk.sapp.org/kern2skini">Kern Score to SKINI file converter</A> by Craig Sapp
- <A HREF="http://www.artassault.org/software/software.html">Calico - A Polyphonic Score File Parser for STK</A> by Greg Kellum
- <A HREF="http://extra.humdrum.org/example/kern2skini/">Kern Score to SKINI file converter</A> by Craig Sapp
- <A HREF="http://www.music.columbia.edu/PeRColate/">PeRColate: A Port of STK for Max/MSP</A>
- <A HREF="http://mathmorphs.swiki.net/32/">A Partial Port of STK to Squeak</A>
- <a href="http://airy.andre.online.fr/AU/index.html">AUStk: a demo of integration of STK instruments into an AudioUnit</a> by Airy Andre
*/

View File

@@ -1,22 +1,25 @@
/*! \page multichannel Multi-Channel I/O
The ToolKit WvIn and WvOut classes (and their subclasses) support multi-channel audio data input and output. A set of interleaved audio samples representing a single time "slice" is referred to as a <I>sample frame</I>. At a sample rate of 44.1 kHz, a four-channel audio stream will have 44100 sample frames per second and a total of 176400 individual samples per second.
The ToolKit stk::WvIn and stk::WvOut classes (and their subclasses) support multi-channel audio data input and output. Several other abstract base classes, such as stk::Instrmnt, stk::Generator, and stk::Effect, also support multi-channel computations though not all of their subclasses produce or take multi-channel data. A set of interleaved audio samples representing a single time "slice" is referred to as a <I>sample frame</I>. At a sample rate of 44.1 kHz, a four-channel audio stream will have 44100 sample frames per second and a total of 176400 individual samples per second.
Most STK classes process single-sample data streams via their
<TT>tick()</TT> function. In order to distinguish single-sample and
sample frame calculations, the WvIn and WvOut classes implement both
<TT>tick()</TT> and <TT>tickFrame()</TT> functions. The
<TT>tickFrame()</TT> functions take or return a reference to an StkFrames object
representing one or more sample frames. For single-channel
streams, the <TT>tick()</TT> and <TT>tickFrame()</TT> functions
produce equivalent results. When <TT>tick()</TT> is called for a
multi-channel stream, however, the function either returns a sample
frame average (WvIn) or writes a single sample argument to all
channels (WvOut).
<TT>tick()</TT> function. For classes supporting multi-channel data,
one must distinguish the <TT>tick()</TT> functions taking or producing
single \c StkFloat arguments from those taking stk::StkFrames& arguments. If
a single-sample version of the <TT>tick()</TT> function is called for
these classes, a full sample frame is computed but only a single value
is either input and/or output. For example, if the single-sample
<TT>tick()</TT> function is called for subclasses of WvOut, the sample
argument is written to all channels in the one computed frame. For
classes returning values, an optional \c channel argument specifies
which channel value is returned from the computed frame (the default
is always channel 0). To input and/or output multichannel data to
these classes, the overloaded <TT>tick()</TT> functions taking
StkFrames reference arguments should be used.
Multi-channel support for realtime audio input and output is dependent on the audio device(s) available on your system.
The following example demonstrates the use of the FileWvOut class for
The following example demonstrates the use of the stk::FileWvOut class for
creating a four channel, 16-bit AIFF formatted audio file. We will
use four sinewaves of different frequencies for the first two seconds
and then a single sinewave for the last two seconds.

View File

@@ -1,10 +1,10 @@
/*! \page polyvoices Voice Management
The previous tutorial chapters were concerned only with monophonic ToolKit instrument playback and control. At this point, it should be relatively clear that one can instantiate multiple instruments and perhaps sum together their outputs or even direct their outputs to separate channels. It is less clear how one might go about controlling a group of instruments. The Voicer class is designed to serve just this purpose.
The previous tutorial chapters were concerned only with monophonic ToolKit instrument playback and control. At this point, it should be relatively clear that one can instantiate multiple instruments and perhaps sum together their outputs or even direct their outputs to separate channels. It is less clear how one might go about controlling a group of instruments. The stk::Voicer class is designed to serve just this purpose.
The STK Voicer class is a relatively simple voice manager. The user can dynamically add and delete instruments to/from its "control", with the option of controlling specific instruments via unique note tags and/or grouping sets of instruments via a "channel" number. All sounding instrument outputs are summed and returned via the <TT>tick()</TT> function. The Voicer class responds to noteOn, noteOff, setFrequency, pitchBend, and controlChange messages, automatically assigning incoming messages to the voices in its control. When all voices are sounding and a new noteOn is encountered, the Voicer interrupts the oldest sounding voice. The user is responsible for creating and deleting all instrument instances.
The stk::Voicer class is a relatively simple voice manager. The user can dynamically add and delete instruments to/from its "control", with the option of controlling specific instruments via unique note tags and/or grouping sets of instruments via a "group" number. All sounding instrument outputs are summed and returned via the <TT>tick()</TT> function. The stk::Voicer class responds to noteOn, noteOff, setFrequency, pitchBend, and controlChange messages, automatically assigning incoming messages to the voices in its control. When all voices are sounding and a new noteOn is encountered, the stk::Voicer interrupts the oldest sounding voice. The user is responsible for creating and deleting all instrument instances.
In the following example, we modify the <TT>controlbee.cpp</TT> program to make use of three BeeThree instruments, all controlled using a Voicer.
In the following example, we modify the <TT>controlbee.cpp</TT> program to make use of three stk::BeeThree instruments, all controlled using a stk::Voicer.
\include threebees.cpp
@@ -16,7 +16,7 @@ threebees < scores/bachfugue.ski
For more fun, surf to <A HREF="http://kern.humdrum.net/">Kern Scores</A> for a huge assortment of other scorefiles that can be downloaded in the SKINI format.
Another easy extension would be to add the \c Messager::startMidiInput() function to the program and then play the instruments via a MIDI keyboard.
Another easy extension would be to add the \c stk::Messager::startMidiInput() function to the program and then play the instruments via a MIDI keyboard.
[<A HREF="tutorial.html">Main tutorial page</A>]
*/

View File

@@ -2,36 +2,36 @@
In this section, we modify the <TT>sineosc.cpp</TT> program in order
to send the output to the default audio playback device on your
computer system. We also make use of the SineWave class as a
sine-wave oscillator. SineWave computes an internal, static sine-wave
computer system. We also make use of the stk::SineWave class as a
sine-wave oscillator. stk::SineWave computes an internal, static sine-wave
table when its first instance is created. Subsequent instances make
use of the same table. The default table length, specified in
SineWave.h, is 2048 samples.
\include rtsine.cpp
The class RtWvOut is a protected subclass of WvOut. A number of
The class stk::RtWvOut is a protected subclass of stk::WvOut. A number of
optional constructor arguments can be used to fine tune its
performance for a given system. RtWvOut provides a "single-sample",
blocking interface to the RtAudio class. Note that RtWvOut (as well
as the RtWvIn class described below) makes use of RtAudio's callback
performance for a given system. stk::RtWvOut provides a "single-sample",
blocking interface to the RtAudio class. Note that stk::RtWvOut (as well
as the stk::RtWvIn class described below) makes use of RtAudio's callback
input/output functionality by creating a large ring-buffer into which
data is written. These classes should not be used when low-latency
and robust performance is necessary
Though not used here, an RtWvIn class exists as well that can be used
Though not used here, an stk::RtWvIn class exists as well that can be used
to read realtime audio data from an input device. See the
<TT>record.cpp</TT> example program in the <TT>examples</TT> project
for more information.
It may be possible to use an instance of RtWvOut and an instance of
RtWvIn to simultaneously read and write realtime audio to and from a
It may be possible to use an instance of stk::RtWvOut and an instance of
stk::RtWvIn to simultaneously read and write realtime audio to and from a
hardware device or devices. However, it is recommended to instead use
a single instance of RtAudio to achieve this behavior, as described in the next section.
See the <TT>effects</TT> project or the <TT>duplex.cpp</TT> example
program in the <TT>examples</TT> project for more information.
When using any realtime STK class (RtAudio, RtWvOut, RtWvIn, RtDuplex, RtMidi, InetWvIn, InetWvOut, Socket, UdpSocket, TcpServer, TcpClient, and Thread), it is necessary to specify an audio/MIDI API preprocessor definition and link with the appropriate libraries or frameworks. For example, the above program could be compiled on a Linux system using the GNU g++ compiler and the ALSA audio API as follows (assuming all necessary files exist in the project directory):
When using any realtime STK class (RtAudio, stk::RtWvOut, stk::RtWvIn, RtMidi, stk::InetWvIn, stk::InetWvOut, stk::Socket, stk::UdpSocket, stk::TcpServer, stk::TcpClient, and stk::Thread), it is necessary to specify an audio/MIDI API preprocessor definition and link with the appropriate libraries or frameworks. For example, the above program could be compiled on a Linux system using the GNU g++ compiler and the ALSA audio API as follows (assuming all necessary files exist in the project directory):
\code
g++ -Wall -D__LINUX_ALSA__ -D__LITTLE_ENDIAN__ -o rtsine Stk.cpp Generator.cpp SineWave.cpp WvOut.cpp \

View File

@@ -15,28 +15,21 @@
<B>Macintosh OS X (specific):</B>
<UL>
<LI>A C++ compiler does install by default with OS X. It is necessary to download the Developer Kit from the Apple WWW site in order to compile STK or load it from the installation CD-ROM.</LI>
<LI><B>IMPORTANT:</B>The internal Macintosh audio hardware typically supports a sample rate of 44100 Hz only. The default STK sample rate is now 44100 Hz, but there may be programs that change that value before execution. Check the program code if you have sample rate conflicts. Many of the example project programs allow the sample rate to be specified via the command line.</LI>
<LI>A C++ compiler is not installed by default with OS X. It is necessary to download the Developer Kit from the Apple WWW site in order to compile STK or load it from the installation CD-ROM.</LI>
<LI>If you experience frequent audio input/output "glitches", try increasing the RT_BUFFER_SIZE specified in Stk.h.</LI>
<LI>The tcl/tk interpreter does not ship by default with OS X, but must be downloaded from the internet. The latest Tcl/Tk Aqua distribution (http://www.apple.com/downloads/macosx/unix_open_source/tcltk.html) has been successfully tested on 10.2 and 10.3 systems. The default installation will place a link to the wish interpretor at /usr/bin/wish.
<LI>The tcl/tk interpreter does not ship by default with OS X and must be downloaded from the internet. The latest Tcl/Tk Aqua distribution (http://www.apple.com/downloads/macosx/unix_open_source/tcltk.html) has been successfully tested on 10.2 and 10.3 systems. The default installation will place a link to the wish interpretor at /usr/bin/wish.
It appears that socket support in Tcl/Tk uses the Nagle algorithm, which produces poor response between changes made in the tcl/tk script and the resulting audio updates. Note that this is only a problem when using a socket connection from a Tcl/Tk script.</LI>
</UL>
<B>Windows95/98/2000/XP (specific):</B>
<B>Windows95/98/2000/XP/7 (specific):</B>
<UL>
<LI>A soundcard to use realtime audio input/output capabilities. In order to use the <I><B>effects</B></I> project, the soundcard and drivers must support full duplex mode.</LI>
<LI><A HREF="http://www.microsoft.com/directx/">DirectX</A> 5.0 (or higher) runtime libraries to use the precompiled binaries.</LI>
<LI>Visual C++ .NET for compiling (though a precompiled distribution is available).</LI>
<LI><A HREF="http://www.microsoft.com/directx/">DirectX</A> 5.0 (or higher) runtime libraries.</LI>
<LI>For compiling the source (if not already in your system): <UL><LI><A HREF="Misc/dsound.h">dsound.h</A> header file (DirectX 6.1) - put somewhere in your header search path</LI><LI><A HREF="Misc/dsound.lib">dsound.lib</A> library file (DirectX 6.1) - put somewhere in your library search path</LI></UL></LI>
</UL>
<B>WindowsNT (specific):</B>
<UL>
<LI>DirectX support for NT is inadequate, so it is not possible to use STK under WindowsNT with realtime DirectX support. It may be possible to use STK under WindowsNT with realtime ASIO support, though this has not been tested.</LI>
</UL>
<P>
*/

View File

@@ -2,6 +2,7 @@
- \ref directory
- \ref compiling
- \ref debug
- \ref control
- \ref voices
- \ref nort
@@ -37,17 +38,17 @@ This release of STK comes with four separate "project" directories:
<LI> The <I><B>ragamatic</B></I> project is just cool. Fire it up and be enlightened.<P></LI>
<LI> The <I><B>eguitar</B></I> project demonstrates how to make an electric guitar with feedback and distortion.<P></LI>
<LI> The <I><B>examples</B></I> project contains several simple programs that demonstrate audio input/output, including the audio internet streaming classes, as well as most of the tutorial programs.</LI>
</OL>
\section compiling Compiling:
<UL>
<LI><B>Windows95/98/2000/XP:</B> Realtime support is available using either DirectSound or ASIO audio drivers. For DirectSound support, use the <TT>__WINDOWS_DS__</TT> preprocessor definition and link with the <TT>dsound.lib</TT>, <TT>winmm.lib</TT>, and <TT>Wsock32.lib</TT> libraries. For ASIO support, use the <TT>__WINDOWS_ASIO__</TT> preprocessor definition, include all the files in the <TT>src/asio/</TT> directory (i.e. <TT>asio.h,cpp</TT>, <TT>asiodrivers.h,cpp</TT>, ...), and link with the <TT>winmm.lib</TT>, and <TT>Wsock32.lib</TT> libraries. In addition, the <TT>__LITTLE_ENDIAN__</TT> and <TT>__WINDOWS_MM__</TT> preprocessor definitions are necessary for all Windows systems (RtMidi uses the Windows MultiMedia MIDI API). A distribution of the release is available with precompiled binaries (using DirectSound) for all the projects. In order for these binaries to function properly, your system must have the DirectX 5.0 (or higher) runtime libraries installed (available from <A HREF="http://www.microsoft.com/directx/">Microsoft</A>). Further, the <I><B>effects</B></I> project requires that your soundcard and drivers provide full duplex mode capabilities. Visual C++ .NET project files are provided in each project directory as well should you wish to compile your own binaries. It is important to link with the non-debug libraries when compiling "release" program versions and debug libraries when compiling "debug" program versions.</LI>
<LI><B>Windows95/98/2000/XP/7:</B> Realtime support is available using either DirectSound or ASIO audio drivers. For DirectSound support, use the <TT>__WINDOWS_DS__</TT> preprocessor definition and link with the <TT>dsound.lib</TT>, <TT>winmm.lib</TT>, and <TT>Wsock32.lib</TT> libraries. For ASIO support, use the <TT>__WINDOWS_ASIO__</TT> preprocessor definition, include all the files in the <TT>src/asio/</TT> directory (i.e. <TT>asio.h,cpp</TT>, <TT>asiodrivers.h,cpp</TT>, ...), and link with the <TT>winmm.lib</TT>, and <TT>Wsock32.lib</TT> libraries. In addition, the <TT>__LITTLE_ENDIAN__</TT> and <TT>__WINDOWS_MM__</TT> preprocessor definitions are necessary for all Windows systems (RtMidi uses the Windows MultiMedia MIDI API). Fairly old Visual C++ project files are provided in each project directory, though they may not work on newer versions of MSVS. As well, the MinGW compiler is supported (see below). It is important to link with the non-debug libraries when compiling "release" program versions and debug libraries when compiling "debug" program versions.</LI>
<LI><B>WindowsNT:</B> DirectX support for NT is inadequate, so it is not possible to use STK under WindowsNT with realtime DirectX support. It may be possible to use STK under WindowsNT with realtime ASIO support, though this has not been tested.</LI>
<LI><B>Unix Systems:</B> A GNU <TT>configure</TT> shell script is included in the distribution for unix-based systems. From the top-level distribution directory, type <TT>'./configure'</TT> and the script will create <TT>Makefiles</TT> in each project directory specific to the characteristics of the host computer. Then from within any given project directory (example <TT>demo</TT>), type <TT>'make'</TT> to compile the project. In addition, an STK library can be compiled from within the <TT>src</TT> directory.
<LI><B>Unix (and MinGW) Systems:</B> A GNU <TT>configure</TT> shell script is included in the distribution for unix-based systems. From the top-level distribution directory, type <TT>'./configure'</TT> and the script will create <TT>Makefiles</TT> in each project directory specific to the characteristics of the host computer. Then from within any given project directory (example <TT>demo</TT>), type <TT>'make'</TT> to compile the project. In addition, an STK library can be compiled from within the <TT>src</TT> directory.
Several options can be supplied to the <TT>configure</TT> script to customize the build behavior:
<UL>
@@ -77,6 +78,9 @@ For those who wish to create their own system-specific <TT>Makefiles</TT>:
<LI><B>Generic (non-realtime):</B> Most STK classes are operating system <I>independent</I> and can be compiled using any current C++ compiler. STK assumes big-endian host byte order by default, so if your system is little-endian (i.e. Intel processor), you must provide the <TT>__LITTLE_ENDIAN__</TT> preprocessor definition to your compiler. The <I><B>demo</B></I> project will compile without realtime support, allowing the use of SKINI scorefiles for input control and output to a variety of soundfile formats. The following classes <I>cannot</I> be used without realtime support: RtAudio, RtWvIn, RtWvOut, RtDuplex, RtMidi, Socket, Thread, Mutex, TcpWvIn, TcpWvOut. Because of this, it is not possible to compile the <I><B>effects</B></I>, <I><B>ragamatic</B></I>, and most of the <I><B>examples</B></I> projects for non-realtime use.</LI>
</UL>
\section debug Debugging:
When developing applications with STK, it is recommended that you define the preprocessor definition <TT>_STK_DEBUG_</TT> when compiling (or specify the <TT>--enable-debug</TT> option to the <TT>configure</TT> script). This will enable all levels of function argument and error checking within the STK classes. Without this definition, argument checking does not occur in functions that are expected to be called frequently in an iterative manner.
\section control Control Data:
@@ -85,7 +89,6 @@ All STK programs in this distribution take input control data in the form of <A
<OL>
<LI>Redirect or pipe SKINI scorefiles to an executable.</LI>
<LI>Pipe realtime SKINI input messages to an executable (not possible under Windows95/98).</LI>
<LI>Socket realtime SKINI input messages to an executable.</LI>
<LI>Acquire realtime MIDI messages from a MIDI port on your computer.</LI>
</OL>
@@ -156,12 +159,11 @@ where instruments include those described above and flags can be any or all of:
<LI><I>-om \<file name\></I> for MAT-file output,</LI>
<LI><I>-if \<file name\></I> for a SKINI formatted control file,</LI>
<LI><I>-ip</I> for realtime SKINI control input via piping,</LI>
<LI><I>-is \<port\></I> for realtime SKINI control input via socketing (with an optional port number),</LI>
<LI><I>-im \<port\></I> for MIDI control input (with optional port, -1 = virtual port where possible),</LI>
<LI><I>-s RATE</I> to specify a sample rate,</LI>
<LI><I>-n NUMBER</I> to specify multivoice polyphony</LI>
</UL>
The <i>-ip</i> and <i>-is</i> flags must be used when piping or socketing realtime SKINI control data to an STK program. The <i>-im</i> flag must be used to read MIDI control input from your MIDI port. Note that you can use all three input types simultaneously.
The <i>-ip</i> flag must be used when piping realtime SKINI control data to an STK program. The <i>-im</i> flag must be used to read MIDI control input from your MIDI port. Note that you can use both input types simultaneously.
Assuming a successful compilation of the <I><B>demo</B></I> program, typing:
@@ -180,16 +182,6 @@ There are a number of <A HREF="http://dev.scriptics.com">Tcl/Tk</A> GUIs supplie
wish < tcl/Physical.tcl | demo Clarinet -or -ip
\endcode
On WindowsXX and Unix platforms, the following operations are necessary to establish a socket connection between the Tcl/Tk GUI and the STK program:
<OL>
<LI>Open a DOS shell and start the STK program with the <I>-is</I> flag (ex. <I><B>demo Clarinet -or -is</B></I>).</LI>
<LI>Open the Tcl/Tk GUI (e.g. tcl/Physical.tcl) by double-clicking on it, or type <TT>wish < tcl/Physical.tcl</TT> in another DOS shell.</LI>
<LI>Establish the socket connection by selecting <I>Socket</I> under the Communications menu item in the Tcl/Tk GUI.</LI>
</OL>
Note that it is possible to specify a hostname when establishing the socket connection from the socket client. Thus, the STK socket server program and the Tcl/Tk GUI need not necessarily reside on the same computer.
\section midi Realtime MIDI Control Input:
On all supported realtime platforms, you can direct realtime MIDI input to the STK Clarinet by typing:

View File

@@ -1,14 +1,11 @@
STK: A ToolKit of Audio Synthesis Classes and Instruments in C++
By Perry R. Cook and Gary P. Scavone, 1995-2007.
By Perry R. Cook and Gary P. Scavone, 1995-2012.
STK Classes - See the HTML documentation in the html directory for complete information.
.- Generator - (Modulate, Noise, SingWave, Envelope, SineWave, Blit, BlitSaw, BlitSquare, Granulate)
| | |
| SubNoise ADSR
| Asymp
.- Generator - (Modulate, Noise, SingWave, Envelope, ADSR, Asymp, SineWave, Blit, BlitSaw, BlitSquare, Granulate)
|
|- Function - (BowTable, JetTable, ReedTable)
|
@@ -16,29 +13,28 @@ STK Classes - See the HTML documentation in the html directory for complete info
|
|- WvIn - (FileWvIn, RtWvIn, InetWvIn)
| |
| WaveLoop
| FileLoop
|
|- WvOut - (FileWvOut, RtWvOut, TcpWvOut)
|
|- Filter - (OnePole, OneZero, Delay, TwoPole, TwoZero, PoleZero, Biquad)
| | |
| DelayL FormSwep
| DelayA
|- Filter - (OnePole, OneZero, TwoPole, TwoZero, PoleZero, Biquad, FormSwep, Delay, DelayL, DelayA, TapDelay)
|
|- RtAudio, RtMidi, RtDuplex, Socket, Thread, Mutex
| |
Stk -| UdpSocket
| TcpServer
| TcpClient
|- RtAudio, RtMidi, Socket, Thread, Mutex
| |
Stk -| UdpSocket
| TcpServer
| TcpClient
|
|- StkFrames
|
|- Effect - (Echo, Chorus, PitShift, PRCRev, JCRev, NRev)
|- Effect - (Echo, Chorus, PitShift, LentPitShift, PRCRev, JCRev, NRev, FreeVerb)
|
|- Voicer, Message, Skini, MidiFileIn, Phonemes, Sphere, Vector3D
|
|- Messager
|
|- Twang, Guitar
|
| .- FM - (HevyMetl, PercFlut, Rhodey, Wurley, TubeBell, BeeThree, FMVoices)
| |
| |- Modal - ModalBar
@@ -49,7 +45,7 @@ Stk -| UdpSocket
| |
| |- Resonate
| |
| |- PluckedTwo - Mandolin
| |- Mandolin
.- Instrmnt -|
|- Drummer
|
@@ -68,34 +64,33 @@ Stk -| UdpSocket
Master Class: Stk.cpp Sample rate, byte-swapping, error handling functionality
Sources: Generator.cpp Abstract base class for various source signal classes
Function.cpp Abstract base class for various input/output mapping classes
Sources: Generator.h Abstract base class for various source signal classes
Function.h Abstract base class for various input/output mapping classes
Envelope.cpp Linearly goes to target by rate
ADSR.cpp ADSR flavor of Envelope
ADSR.cpp ADSR envelope
Asymp.cpp Exponentially approaches target
Noise.cpp Random number generator
SubNoise.cpp Random numbers each N samples
SineWave.cpp Sinusoidal oscillator with internally computed static table
Blit.cpp Bandlimited impulse train
BlitSaw.cpp Bandlimited sawtooth generator
BlitSquare.cpp Bandlimited square wave generator
Granulate.cpp Granular synthesis class that processes a monophonic audio file
FileRead.cpp Audio file input class (no internal data storage) for RAW, WAV, SND (AU), AIFF, MAT-file files
WvIn.cpp Abstract base class for audio data input classes
WvIn.h Abstract base class for audio data input classes
FileWvIn.cpp Audio file input interface class with interpolation
WaveLoop.cpp Wavetable looping (subclass of FileWvIn)
FileLoop.cpp Wavetable looping (subclass of FileWvIn)
RtWvIn.cpp Realtime audio input class (subclass of WvIn)
InetWvIn.cpp Audio streaming (socket server) input class (subclass of WvIn)
Sinks: FileWrite.cpp Audio file output class (no internal data storage) for RAW, WAV, SND (AU), AIFF, MAT-file files
WvOut.cpp Abstract base class for audio data output classes
WvOut.h Abstract base class for audio data output classes
FileWvOut.cpp Audio file output interface class to FileWrite
RtWvOut.cpp Realtime audio output class (subclass of WvOut)
InetWvOut.cpp Audio streaming (socket client) output class (subclass of WvOut)
Duplex: RtDuplex.cpp Synchronous realtime audio input/output class (blocking)
Filters: Filter.cpp Filter master class
Filters: Filter.h Filter master class
Iir.h General infinite-impulse response filter
Fir.h General finite-impulse response filter
OneZero.cpp One zero filter
OnePole.cpp One pole filter
PoleZero.cpp One pole/one zero filter
@@ -104,15 +99,16 @@ Filters: Filter.cpp Filter master class
BiQuad.cpp Two pole/two zero filter
FormSwep.cpp Sweepable biquad filter (goes to target by rate)
Delay.cpp Non-interpolating delay line class
DelayL.cpp Linearly interpolating delay line (subclass of Delay)
DelayA.cpp Allpass interpolating delay line (subclass of Delay)
DelayL.cpp Linearly interpolating delay line
DelayA.cpp Allpass interpolating delay line
TapDelay.cpp Multi-tap non-interpolating delay line class
Non-Linear: JetTabl.cpp Cubic jet non-linearity
BowTabl.cpp x^(-3) Bow non-linearity
ReedTabl.cpp One breakpoint saturating reed non-linearity
Non-Linear: JetTabl.h Cubic jet non-linearity
BowTabl.h x^(-3) Bow non-linearity
ReedTabl.h One breakpoint saturating reed non-linearity
Derived: Modulate.cpp Periodic and random vibrato: WvIn, SubNoise, OnePole
SingWave.cpp Looping wave table with randomness: Modulate, WaveLoop, Envelope
Derived: Modulate.cpp Periodic and random vibrato: WvIn, Noise, OnePole
SingWave.cpp Looping wave table with randomness: Modulate, FileLoop, Envelope
********** INSTRUMENTS AND ALGORITHMS **************
@@ -121,45 +117,48 @@ Each class is listed either with some of the unit generators it uses,
or in terms of the algorithm it implements. All inherit from Instrmnt,
which inherits from Stk.
Simple.cpp Simple Instrument Pulse oscillator + resonant filtered noise
Plucked.cpp Basic Plucked String DelayA, OneZero, OnePole, Noise
StifKarp.cpp Plucked String with Stiffness DelayA, DelayL, OneZero, BiQuad, Noise
PluckTwo.cpp Not So Basic Pluck DelayL, DlineA, OneZero
Mandolin.cpp Commuted Mandolin <<flavor of PluckTwo>>
Bowed.cpp So So Bowed String DelayL, BowTabl, OnePole, BiQuad, WaveLoop, ADSR
Brass.cpp Not So Bad Brass Instrument DelayA, BiQuad, PoleZero, ADSR, WaveLoop
Clarinet.cpp Pretty Good Clarinet DelayL, ReedTabl, OneZero, Envelope, Noise, WaveLoop
BlowHole.cpp Clarinet w/ Tone & Vent Holes DelayL, ReedTabl, OneZero, Envelope, Noise, WaveLoop, PoleZero
Saxofony.cpp A Faux Saxophone DelayL, ReedTabl, OneZero, Envelope, Noise, WaveLoop
Flute.cpp Pretty Good Flute JetTabl, DelayL, OnePole, PoleZero, Noise, ADSR, WaveLoop
BlowBotl.cpp Blown Bottle JetTabl, BiQuad, PoleZero, Noise, ADSR, WaveLoop
BandedWG.cpp Banded Waveguide Meta-Object Delay, BowTabl, ADSR, BiQuad
Modal.cpp N Resonances Envelope, WaveLoop, BiQuad, OnePole
ModalBar.cpp Various presets 4 Resonance Models
FM.cpp N Operator FM Master ADSR, WaveLoop, TwoZero
HevyMetl.cpp Distorted FM Synthesizer 3 Cascade with FB Modulator
PercFlut.cpp Percussive Flute 3 Cascade Operators
Rhodey.cpp Rhodes-Like Electric Piano 2 Parallel Simple FMs
Wurley.cpp Wurlitzer Electric Piano 2 Parallel Simple FMs
TubeBell.cpp Classic FM Bell 2 Parallel Simple FMs
FMVoices.cpp 3 Formant FM Voice 3 Carriers Share 1 Modulator
VoicForm.cpp 4 Formant Voice Synthesis FormSwep, SingWave, OnePole, OneZero, Envelope, Noise
BeeThree.cpp Cheezy Additive Organ 4 Oscillators Additive
Sampler.cpp Sampling Synthesizer 5 each ADSR, WvIn, WaveLoop, OnePole
Moog.cpp Swept Filter Sampler with Swept Filter
Resonate.cpp Filtered Noise ADSR, BiQuad, Noise
Drummer.cpp Drum Synthesizer Bunch of WvIns, and OnePole
Shakers.cpp PhISM statistical model for shakers and real-world sound effects
Mesh2D.cpp Two-dimensional, rectilinear digital waveguide mesh.
Whistle.cpp Hybrid physical/spectral model of a police whistle.
Simple.cpp Simple Instrument Pulse oscillator + resonant filtered noise
Plucked.cpp Basic Plucked String DelayA, OneZero, OnePole, Noise
Twang.cpp Not So Basic Pluck DelayL, DlineA, Fir, allows commuted synthesis
Mandolin.cpp Commuted Mandolin 2 Twangs
Guitar.cpp N-String Guitar N Twangs, bridge coupling, allows feedback and body filter
StifKarp.cpp Plucked String with Stiffness DelayA, DelayL, OneZero, BiQuad, Noise
Bowed.cpp So So Bowed String DelayL, BowTabl, OnePole, BiQuad, WaveLoop, ADSR
Brass.cpp Not So Bad Brass Instrument DelayA, BiQuad, PoleZero, ADSR, WaveLoop
Clarinet.cpp Pretty Good Clarinet DelayL, ReedTabl, OneZero, Envelope, Noise, WaveLoop
BlowHole.cpp Clarinet w/ Tone & Vent Holes DelayL, ReedTabl, OneZero, Envelope, Noise, WaveLoop, PoleZero
Saxofony.cpp A Faux Saxophone DelayL, ReedTabl, OneZero, Envelope, Noise, WaveLoop
Flute.cpp Pretty Good Flute JetTabl, DelayL, OnePole, PoleZero, Noise, ADSR, WaveLoop
BlowBotl.cpp Blown Bottle JetTabl, BiQuad, PoleZero, Noise, ADSR, WaveLoop
BandedWG.cpp Banded Waveguide Meta-Object Delay, BowTabl, ADSR, BiQuad
Modal.cpp N Resonances Envelope, WaveLoop, BiQuad, OnePole
ModalBar.cpp Various presets 4 Resonance Models
FM.cpp N Operator FM Master ADSR, WaveLoop, TwoZero
HevyMetl.cpp Distorted FM Synthesizer 3 Cascade with FB Modulator
PercFlut.cpp Percussive Flute 3 Cascade Operators
Rhodey.cpp Rhodes-Like Electric Piano 2 Parallel Simple FMs
Wurley.cpp Wurlitzer Electric Piano 2 Parallel Simple FMs
TubeBell.cpp Classic FM Bell 2 Parallel Simple FMs
FMVoices.cpp 3 Formant FM Voice 3 Carriers Share 1 Modulator
VoicForm.cpp 4 Formant Voice Synthesis FormSwep, SingWave, OnePole, OneZero, Envelope, Noise
BeeThree.cpp Cheezy Additive Organ 4 Oscillators Additive
Sampler.cpp Sampling Synthesizer 5 each ADSR, WvIn, WaveLoop, OnePole
Moog.cpp Swept Filter Sampler with Swept Filter
Resonate.cpp Filtered Noise ADSR, BiQuad, Noise
Drummer.cpp Drum Synthesizer Bunch of WvIns, and OnePole
Shakers.cpp PhISM statistical model for shakers and real-world sound effects
Mesh2D.cpp Two-dimensional, rectilinear digital waveguide mesh.
Whistle.cpp Hybrid physical/spectral model of a police whistle.
Effect.cpp Effects Processor Base Class
JCRev.cpp Chowning Reverberator 3 series allpass units, 4 parallel combs, 2 stereo delays
NRev.cpp Another famous CCRMA Reverb 8 allpass, 6 parallel comb filters
PRCRev.cpp Dirt Cheap Reverb by Cook 2 allpass, 2 comb filters
Flanger.cpp Flanger Effects Processor DelayL, WaveLoop
Chorus.cpp Chorus Effects Processor DelayL, WaveLoop
PitShift.cpp Cheap Pitch Shifter DelayL
Effect.h Effects Processor Base Class
JCRev.cpp Chowning Reverberator 3 series allpass units, 4 parallel combs, 2 stereo delays
NRev.cpp Another famous CCRMA Reverb 8 allpass, 6 parallel comb filters
PRCRev.cpp Dirt Cheap Reverb by Cook 2 allpass, 2 comb filters
FreeVerb.cpp Jezar at Dreampoint's FreeVerb 4 allpass, 8 lowpass comb filters
Flanger.cpp Flanger Effects Processor DelayL, WaveLoop
Chorus.cpp Chorus Effects Processor DelayL, WaveLoop
PitShift.cpp Cheap Pitch Shifter DelayL
LentPitShift.cpp Pitch Shifter based Lent Algorithm
*********** OTHER SUPPORT CLASSES AND FILES **************

View File

@@ -1,78 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>ADSR.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00016"></a>00016 <span class="comment">/***************************************************/</span>
<a name="l00017"></a>00017
<a name="l00018"></a>00018 <span class="preprocessor">#ifndef STK_ADSR_H</span>
<a name="l00019"></a>00019 <span class="preprocessor"></span><span class="preprocessor">#define STK_ADSR_H</span>
<a name="l00020"></a>00020 <span class="preprocessor"></span>
<a name="l00021"></a>00021 <span class="preprocessor">#include "Envelope.h"</span>
<a name="l00022"></a>00022
<a name="l00023"></a><a class="code" href="classADSR.html">00023</a> <span class="keyword">class </span><a class="code" href="classADSR.html">ADSR</a> : <span class="keyword">public</span> <a class="code" href="classEnvelope.html">Envelope</a>
<a name="l00024"></a>00024 {
<a name="l00025"></a>00025 <span class="keyword">public</span>:
<a name="l00026"></a>00026
<a name="l00028"></a>00028 <span class="keyword">enum</span> { ATTACK, DECAY, SUSTAIN, RELEASE, DONE };
<a name="l00029"></a>00029
<a name="l00031"></a>00031 <a class="code" href="classADSR.html#a0">ADSR</a>(<span class="keywordtype">void</span>);
<a name="l00032"></a>00032
<a name="l00034"></a>00034 <a class="code" href="classADSR.html#a1">~ADSR</a>(<span class="keywordtype">void</span>);
<a name="l00035"></a>00035
<a name="l00037"></a>00037 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a2">keyOn</a>(<span class="keywordtype">void</span>);
<a name="l00038"></a>00038
<a name="l00040"></a>00040 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a3">keyOff</a>(<span class="keywordtype">void</span>);
<a name="l00041"></a>00041
<a name="l00043"></a>00043 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a4">setAttackRate</a>(StkFloat rate);
<a name="l00044"></a>00044
<a name="l00046"></a>00046 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a5">setDecayRate</a>(StkFloat rate);
<a name="l00047"></a>00047
<a name="l00049"></a>00049 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a6">setSustainLevel</a>(StkFloat level);
<a name="l00050"></a>00050
<a name="l00052"></a>00052 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a7">setReleaseRate</a>(StkFloat rate);
<a name="l00053"></a>00053
<a name="l00055"></a>00055 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a8">setAttackTime</a>(StkFloat time);
<a name="l00056"></a>00056
<a name="l00058"></a>00058 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a9">setDecayTime</a>(StkFloat time);
<a name="l00059"></a>00059
<a name="l00061"></a>00061 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a10">setReleaseTime</a>(StkFloat time);
<a name="l00062"></a>00062
<a name="l00064"></a>00064 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a11">setAllTimes</a>(StkFloat aTime, StkFloat dTime, StkFloat sLevel, StkFloat rTime);
<a name="l00065"></a>00065
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a12">setTarget</a>(StkFloat target);
<a name="l00068"></a>00068
<a name="l00070"></a>00070 <span class="keywordtype">int</span> <a class="code" href="classADSR.html#a13">getState</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00071"></a>00071
<a name="l00073"></a>00073 <span class="keywordtype">void</span> <a class="code" href="classADSR.html#a14">setValue</a>(StkFloat value);
<a name="l00074"></a>00074
<a name="l00075"></a>00075 <span class="keyword">protected</span>:
<a name="l00076"></a>00076
<a name="l00077"></a>00077 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00078"></a>00078 <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00079"></a>00079
<a name="l00080"></a>00080 StkFloat attackRate_;
<a name="l00081"></a>00081 StkFloat decayRate_;
<a name="l00082"></a>00082 StkFloat sustainLevel_;
<a name="l00083"></a>00083 StkFloat releaseRate_;
<a name="l00084"></a>00084 };
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,164 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>ADSR.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_ADSR_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_ADSR_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Generator.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a><a class="code" href="namespacestk.html">00006</a> <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00022"></a>00022 <span class="comment">/***************************************************/</span>
<a name="l00023"></a>00023
<a name="l00024"></a><a class="code" href="classstk_1_1ADSR.html">00024</a> <span class="keyword">class </span><a class="code" href="classstk_1_1ADSR.html" title="STK ADSR envelope class.">ADSR</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Generator.html" title="STK abstract unit generator parent class.">Generator</a>
<a name="l00025"></a>00025 {
<a name="l00026"></a>00026 <span class="keyword">public</span>:
<a name="l00027"></a>00027
<a name="l00029"></a>00029 <span class="keyword">enum</span> {
<a name="l00030"></a><a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa9518c737b76795fa49f997c09e074c8e">00030</a> <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa9518c737b76795fa49f997c09e074c8e">ATTACK</a>,
<a name="l00031"></a><a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa75e1deeb861fe2989250b1977018cacf">00031</a> <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa75e1deeb861fe2989250b1977018cacf">DECAY</a>,
<a name="l00032"></a><a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa139dc35648a28ddc99a7a606e185f6ad">00032</a> <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa139dc35648a28ddc99a7a606e185f6ad">SUSTAIN</a>,
<a name="l00033"></a><a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa7efc189b0b53e581201fd64f357a1756">00033</a> <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa7efc189b0b53e581201fd64f357a1756">RELEASE</a>,
<a name="l00034"></a><a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa1ed3238253daecbdba14da71759392d8">00034</a> <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa1ed3238253daecbdba14da71759392d8">IDLE</a>
<a name="l00035"></a>00035 };
<a name="l00036"></a>00036
<a name="l00038"></a>00038 <a class="code" href="classstk_1_1ADSR.html#ac7473272021307b0dcf1ef602143e144" title="Default constructor.">ADSR</a>( <span class="keywordtype">void</span> );
<a name="l00039"></a>00039
<a name="l00041"></a>00041 <a class="code" href="classstk_1_1ADSR.html#a714f0b9deb325050eba819bc1fe22127" title="Class destructor.">~ADSR</a>( <span class="keywordtype">void</span> );
<a name="l00042"></a>00042
<a name="l00044"></a>00044 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#aad03e82009a20cfb49c1f04bae791631" title="Set target = 1, state = ADSR::ATTACK.">keyOn</a>( <span class="keywordtype">void</span> );
<a name="l00045"></a>00045
<a name="l00047"></a>00047 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#a9400e04b313ab8900a3ba9b693f448e6" title="Set target = 0, state = ADSR::RELEASE.">keyOff</a>( <span class="keywordtype">void</span> );
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#aff18347235fd52ce307c4b5de18a9c62" title="Set the attack rate (gain / sample).">setAttackRate</a>( StkFloat rate );
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#ae0af300e39f83f79776c04a3e83a85b1" title="Set the target value for the attack (default = 1.0).">setAttackTarget</a>( StkFloat target );
<a name="l00054"></a>00054
<a name="l00056"></a>00056 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#a285f500b1e149aed48dba2a155b95cdd" title="Set the decay rate (gain / sample).">setDecayRate</a>( StkFloat rate );
<a name="l00057"></a>00057
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#a85138fb6bbcc7b7cd85ec8449d68f7d8" title="Set the sustain level.">setSustainLevel</a>( StkFloat level );
<a name="l00060"></a>00060
<a name="l00062"></a>00062 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#a29da04231df73c2968c0e9387b43be6e" title="Set the release rate (gain / sample).">setReleaseRate</a>( StkFloat rate );
<a name="l00063"></a>00063
<a name="l00065"></a>00065 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#a48885319b8175cd4d6312fdf7980f116" title="Set the attack rate based on a time duration (seconds).">setAttackTime</a>( StkFloat time );
<a name="l00066"></a>00066
<a name="l00068"></a>00068 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#a450703c45384ae27eb766551843ce82d" title="Set the decay rate based on a time duration (seconds).">setDecayTime</a>( StkFloat time );
<a name="l00069"></a>00069
<a name="l00071"></a>00071 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#a91c14442557cb65286a327f8b297237a" title="Set the release rate based on a time duration (seconds).">setReleaseTime</a>( StkFloat time );
<a name="l00072"></a>00072
<a name="l00074"></a>00074 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#a3567b02a0e8ab82d18eb949d362f9708" title="Set sustain level and attack, decay, and release time durations (seconds).">setAllTimes</a>( StkFloat aTime, StkFloat dTime, StkFloat sLevel, StkFloat rTime );
<a name="l00075"></a>00075
<a name="l00077"></a>00077 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#a428eebd510e464ccd7bb4e5728f80d63" title="Set a sustain target value and attack or decay from current value to target.">setTarget</a>( StkFloat target );
<a name="l00078"></a>00078
<a name="l00080"></a><a class="code" href="classstk_1_1ADSR.html#a87f9918cfa4104a841dc5b44f26f8904">00080</a> <span class="keywordtype">int</span> <a class="code" href="classstk_1_1ADSR.html#a87f9918cfa4104a841dc5b44f26f8904" title="Return the current envelope state (ATTACK, DECAY, SUSTAIN, RELEASE, IDLE).">getState</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> state_; };
<a name="l00081"></a>00081
<a name="l00083"></a>00083 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1ADSR.html#aa99bf5fca3885bf8d99a3edc4072a4b5" title="Set to state = ADSR::SUSTAIN with current and target values of value.">setValue</a>( StkFloat value );
<a name="l00084"></a>00084
<a name="l00086"></a><a class="code" href="classstk_1_1ADSR.html#aedbcb85346c354139f139b3232f36f39">00086</a> StkFloat <a class="code" href="classstk_1_1ADSR.html#aedbcb85346c354139f139b3232f36f39" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00087"></a>00087
<a name="l00089"></a>00089 StkFloat <a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">void</span> );
<a name="l00090"></a>00090
<a name="l00092"></a>00092
<a name="l00099"></a>00099 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00100"></a>00100
<a name="l00101"></a>00101 <span class="keyword">protected</span>:
<a name="l00102"></a>00102
<a name="l00103"></a>00103 <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00104"></a>00104
<a name="l00105"></a>00105 <span class="keywordtype">int</span> state_;
<a name="l00106"></a>00106 StkFloat value_;
<a name="l00107"></a>00107 StkFloat target_;
<a name="l00108"></a>00108 StkFloat attackRate_;
<a name="l00109"></a>00109 StkFloat decayRate_;
<a name="l00110"></a>00110 StkFloat releaseRate_;
<a name="l00111"></a>00111 StkFloat releaseTime_;
<a name="l00112"></a>00112 StkFloat sustainLevel_;
<a name="l00113"></a>00113 };
<a name="l00114"></a>00114
<a name="l00115"></a><a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975">00115</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975" title="Compute and return one output sample.">ADSR :: tick</a>( <span class="keywordtype">void</span> )
<a name="l00116"></a>00116 {
<a name="l00117"></a>00117 <span class="keywordflow">switch</span> ( state_ ) {
<a name="l00118"></a>00118
<a name="l00119"></a>00119 <span class="keywordflow">case</span> <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa9518c737b76795fa49f997c09e074c8e">ATTACK</a>:
<a name="l00120"></a>00120 value_ += attackRate_;
<a name="l00121"></a>00121 <span class="keywordflow">if</span> ( value_ &gt;= target_ ) {
<a name="l00122"></a>00122 value_ = target_;
<a name="l00123"></a>00123 target_ = sustainLevel_;
<a name="l00124"></a>00124 state_ = <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa75e1deeb861fe2989250b1977018cacf">DECAY</a>;
<a name="l00125"></a>00125 }
<a name="l00126"></a>00126 lastFrame_[0] = value_;
<a name="l00127"></a>00127 <span class="keywordflow">break</span>;
<a name="l00128"></a>00128
<a name="l00129"></a>00129 <span class="keywordflow">case</span> <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa75e1deeb861fe2989250b1977018cacf">DECAY</a>:
<a name="l00130"></a>00130 <span class="keywordflow">if</span> ( value_ &gt; sustainLevel_ ) {
<a name="l00131"></a>00131 value_ -= decayRate_;
<a name="l00132"></a>00132 <span class="keywordflow">if</span> ( value_ &lt;= sustainLevel_ ) {
<a name="l00133"></a>00133 value_ = sustainLevel_;
<a name="l00134"></a>00134 state_ = <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa139dc35648a28ddc99a7a606e185f6ad">SUSTAIN</a>;
<a name="l00135"></a>00135 }
<a name="l00136"></a>00136 }
<a name="l00137"></a>00137 <span class="keywordflow">else</span> {
<a name="l00138"></a>00138 value_ += decayRate_; <span class="comment">// attack target &lt; sustain level</span>
<a name="l00139"></a>00139 <span class="keywordflow">if</span> ( value_ &gt;= sustainLevel_ ) {
<a name="l00140"></a>00140 value_ = sustainLevel_;
<a name="l00141"></a>00141 state_ = <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa139dc35648a28ddc99a7a606e185f6ad">SUSTAIN</a>;
<a name="l00142"></a>00142 }
<a name="l00143"></a>00143 }
<a name="l00144"></a>00144 lastFrame_[0] = value_;
<a name="l00145"></a>00145 <span class="keywordflow">break</span>;
<a name="l00146"></a>00146
<a name="l00147"></a>00147 <span class="keywordflow">case</span> <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa7efc189b0b53e581201fd64f357a1756">RELEASE</a>:
<a name="l00148"></a>00148 value_ -= releaseRate_;
<a name="l00149"></a>00149 <span class="keywordflow">if</span> ( value_ &lt;= 0.0 ) {
<a name="l00150"></a>00150 value_ = 0.0;
<a name="l00151"></a>00151 state_ = <a class="code" href="classstk_1_1ADSR.html#ae1cdd1f2886d69a76fcd5b1e0e9154baa1ed3238253daecbdba14da71759392d8">IDLE</a>;
<a name="l00152"></a>00152 }
<a name="l00153"></a>00153 lastFrame_[0] = value_;
<a name="l00154"></a>00154
<a name="l00155"></a>00155 }
<a name="l00156"></a>00156
<a name="l00157"></a>00157 <span class="keywordflow">return</span> value_;
<a name="l00158"></a>00158 }
<a name="l00159"></a>00159
<a name="l00160"></a><a class="code" href="classstk_1_1ADSR.html#a97a617c65e62aadb4f88bd10cf437a6a">00160</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975" title="Compute and return one output sample.">ADSR :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00161"></a>00161 {
<a name="l00162"></a>00162 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00163"></a>00163 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00164"></a>00164 oStream_ &lt;&lt; <span class="stringliteral">&quot;ADSR::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00165"></a>00165 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00166"></a>00166 }
<a name="l00167"></a>00167 <span class="preprocessor">#endif</span>
<a name="l00168"></a>00168 <span class="preprocessor"></span>
<a name="l00169"></a>00169 StkFloat *samples = &amp;frames[channel];
<a name="l00170"></a>00170 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00171"></a>00171 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00172"></a>00172 *samples = <a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975" title="Compute and return one output sample.">ADSR::tick</a>();
<a name="l00173"></a>00173
<a name="l00174"></a>00174 <span class="keywordflow">return</span> frames;
<a name="l00175"></a>00175 }
<a name="l00176"></a>00176
<a name="l00177"></a>00177 } <span class="comment">// stk namespace</span>
<a name="l00178"></a>00178
<a name="l00179"></a>00179 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,61 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Asymp.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00024"></a>00024 <span class="comment">/***************************************************/</span>
<a name="l00025"></a>00025
<a name="l00026"></a>00026 <span class="preprocessor">#ifndef STK_ASYMP_H</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#define STK_ASYMP_H</span>
<a name="l00028"></a>00028 <span class="preprocessor"></span>
<a name="l00029"></a>00029 <span class="preprocessor">#include "Envelope.h"</span>
<a name="l00030"></a>00030
<a name="l00031"></a>00031 <span class="keyword">const</span> StkFloat TARGET_THRESHOLD = 0.000001;
<a name="l00032"></a>00032
<a name="l00033"></a><a class="code" href="classAsymp.html">00033</a> <span class="keyword">class </span><a class="code" href="classAsymp.html">Asymp</a> : <span class="keyword">public</span> <a class="code" href="classEnvelope.html">Envelope</a>
<a name="l00034"></a>00034 {
<a name="l00035"></a>00035 <span class="keyword">public</span>:
<a name="l00036"></a>00036
<a name="l00038"></a>00038 <a class="code" href="classAsymp.html#a0">Asymp</a>(<span class="keywordtype">void</span>);
<a name="l00039"></a>00039
<a name="l00041"></a>00041 <a class="code" href="classAsymp.html#a1">~Asymp</a>(<span class="keywordtype">void</span>);
<a name="l00042"></a>00042
<a name="l00044"></a>00044 <span class="keywordtype">void</span> <a class="code" href="classAsymp.html#a2">keyOn</a>(<span class="keywordtype">void</span>);
<a name="l00045"></a>00045
<a name="l00047"></a>00047 <span class="keywordtype">void</span> <a class="code" href="classAsymp.html#a3">keyOff</a>(<span class="keywordtype">void</span>);
<a name="l00048"></a>00048
<a name="l00050"></a>00050
<a name="l00056"></a>00056 <span class="keywordtype">void</span> <a class="code" href="classAsymp.html#a4">setTau</a>(StkFloat tau);
<a name="l00057"></a>00057
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classAsymp.html#a5">setTime</a>(StkFloat time);
<a name="l00060"></a>00060
<a name="l00062"></a>00062 <span class="keywordtype">void</span> <a class="code" href="classAsymp.html#a6">setTarget</a>(StkFloat target);
<a name="l00063"></a>00063
<a name="l00064"></a>00064 <span class="keyword">protected</span>:
<a name="l00065"></a>00065
<a name="l00066"></a>00066 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00067"></a>00067 <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00068"></a>00068
<a name="l00069"></a>00069 StkFloat factor_;
<a name="l00070"></a>00070 StkFloat constant_;
<a name="l00071"></a>00071 };
<a name="l00072"></a>00072
<a name="l00073"></a>00073 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,124 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Asymp.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_ASYMP_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_ASYMP_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Generator.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00031"></a>00031 <span class="comment">/***************************************************/</span>
<a name="l00032"></a>00032
<a name="l00033"></a>00033 <span class="keyword">const</span> StkFloat TARGET_THRESHOLD = 0.000001;
<a name="l00034"></a>00034
<a name="l00035"></a><a class="code" href="classstk_1_1Asymp.html">00035</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Asymp.html" title="STK asymptotic curve envelope class.">Asymp</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Generator.html" title="STK abstract unit generator parent class.">Generator</a>
<a name="l00036"></a>00036 {
<a name="l00037"></a>00037 <span class="keyword">public</span>:
<a name="l00038"></a>00038
<a name="l00040"></a>00040 <a class="code" href="classstk_1_1Asymp.html#ad8ea9fc5621a1d8b81001d459de265a0" title="Default constructor.">Asymp</a>( <span class="keywordtype">void</span> );
<a name="l00041"></a>00041
<a name="l00043"></a>00043 <a class="code" href="classstk_1_1Asymp.html#ad869abbd938c263a2c177de636f5a57c" title="Class destructor.">~Asymp</a>( <span class="keywordtype">void</span> );
<a name="l00044"></a>00044
<a name="l00046"></a>00046 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Asymp.html#a51f0aad846eb6bda4c20eb63534786e2" title="Set target = 1.">keyOn</a>( <span class="keywordtype">void</span> );
<a name="l00047"></a>00047
<a name="l00049"></a>00049 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Asymp.html#a082e765dc3bd6b452e92b602af7a1042" title="Set target = 0.">keyOff</a>( <span class="keywordtype">void</span> );
<a name="l00050"></a>00050
<a name="l00052"></a>00052
<a name="l00058"></a>00058 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Asymp.html#aebd8ebaf6f6c9570d3ee78e1bcbbcbd2" title="Set the asymptotic rate via the time factor tau (must be &amp;gt; 0).">setTau</a>( StkFloat tau );
<a name="l00059"></a>00059
<a name="l00061"></a>00061 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Asymp.html#aca998e9c4ae86b4958da59fc9433268c" title="Set the asymptotic rate based on a time duration (must be &amp;gt; 0).">setTime</a>( StkFloat time );
<a name="l00062"></a>00062
<a name="l00064"></a>00064 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Asymp.html#afa6fcf4bf3060c0c6092701e409d5fbf" title="Set the asymptotic rate such that the target value is perceptually reached (to within...">setT60</a>( StkFloat t60 );
<a name="l00065"></a>00065
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Asymp.html#a7b0f7025ba5f268f1e5ce097b209f0ec" title="Set the target value.">setTarget</a>( StkFloat target );
<a name="l00068"></a>00068
<a name="l00070"></a>00070 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Asymp.html#a81881bb8aca615f69bbbfd56267f971c" title="Set current and target values to value.">setValue</a>( StkFloat value );
<a name="l00071"></a>00071
<a name="l00073"></a><a class="code" href="classstk_1_1Asymp.html#aaba01ef0ac1a493a14a73c3b29259bde">00073</a> <span class="keywordtype">int</span> <a class="code" href="classstk_1_1Asymp.html#aaba01ef0ac1a493a14a73c3b29259bde" title="Return the current envelope state (0 = at target, 1 otherwise).">getState</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> state_; };
<a name="l00074"></a>00074
<a name="l00076"></a><a class="code" href="classstk_1_1Asymp.html#aeb868c171e07206e2d5d30f8ce8f4436">00076</a> StkFloat <a class="code" href="classstk_1_1Asymp.html#aeb868c171e07206e2d5d30f8ce8f4436" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00077"></a>00077
<a name="l00079"></a>00079 StkFloat <a class="code" href="classstk_1_1Asymp.html#a64df3b44aa1033b642d7a8a93659580e" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">void</span> );
<a name="l00080"></a>00080
<a name="l00082"></a>00082
<a name="l00089"></a>00089 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Asymp.html#a64df3b44aa1033b642d7a8a93659580e" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00090"></a>00090
<a name="l00091"></a>00091 <span class="keyword">protected</span>:
<a name="l00092"></a>00092
<a name="l00093"></a>00093 <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00094"></a>00094
<a name="l00095"></a>00095 StkFloat value_;
<a name="l00096"></a>00096 StkFloat target_;
<a name="l00097"></a>00097 StkFloat factor_;
<a name="l00098"></a>00098 StkFloat constant_;
<a name="l00099"></a>00099 <span class="keywordtype">int</span> state_;
<a name="l00100"></a>00100 };
<a name="l00101"></a>00101
<a name="l00102"></a><a class="code" href="classstk_1_1Asymp.html#a64df3b44aa1033b642d7a8a93659580e">00102</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Asymp.html#a64df3b44aa1033b642d7a8a93659580e" title="Compute and return one output sample.">Asymp :: tick</a>( <span class="keywordtype">void</span> )
<a name="l00103"></a>00103 {
<a name="l00104"></a>00104 <span class="keywordflow">if</span> ( state_ ) {
<a name="l00105"></a>00105
<a name="l00106"></a>00106 value_ = factor_ * value_ + constant_;
<a name="l00107"></a>00107
<a name="l00108"></a>00108 <span class="comment">// Check threshold.</span>
<a name="l00109"></a>00109 <span class="keywordflow">if</span> ( target_ &gt; value_ ) {
<a name="l00110"></a>00110 <span class="keywordflow">if</span> ( target_ - value_ &lt;= TARGET_THRESHOLD ) {
<a name="l00111"></a>00111 value_ = target_;
<a name="l00112"></a>00112 state_ = 0;
<a name="l00113"></a>00113 }
<a name="l00114"></a>00114 }
<a name="l00115"></a>00115 <span class="keywordflow">else</span> {
<a name="l00116"></a>00116 <span class="keywordflow">if</span> ( value_ - target_ &lt;= TARGET_THRESHOLD ) {
<a name="l00117"></a>00117 value_ = target_;
<a name="l00118"></a>00118 state_ = 0;
<a name="l00119"></a>00119 }
<a name="l00120"></a>00120 }
<a name="l00121"></a>00121 lastFrame_[0] = value_;
<a name="l00122"></a>00122 }
<a name="l00123"></a>00123
<a name="l00124"></a>00124 <span class="keywordflow">return</span> value_;
<a name="l00125"></a>00125 }
<a name="l00126"></a>00126
<a name="l00127"></a><a class="code" href="classstk_1_1Asymp.html#a2647bc013816f026915b1e92ddd6a322">00127</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Asymp.html#a64df3b44aa1033b642d7a8a93659580e" title="Compute and return one output sample.">Asymp :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00128"></a>00128 {
<a name="l00129"></a>00129 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00130"></a>00130 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00131"></a>00131 oStream_ &lt;&lt; <span class="stringliteral">&quot;Asymp::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00132"></a>00132 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00133"></a>00133 }
<a name="l00134"></a>00134 <span class="preprocessor">#endif</span>
<a name="l00135"></a>00135 <span class="preprocessor"></span>
<a name="l00136"></a>00136 StkFloat *samples = &amp;frames[channel];
<a name="l00137"></a>00137 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00138"></a>00138 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00139"></a>00139 *samples = <a class="code" href="classstk_1_1Asymp.html#a64df3b44aa1033b642d7a8a93659580e" title="Compute and return one output sample.">Asymp::tick</a>();
<a name="l00140"></a>00140
<a name="l00141"></a>00141 <span class="keywordflow">return</span> frames;
<a name="l00142"></a>00142 }
<a name="l00143"></a>00143
<a name="l00144"></a>00144 } <span class="comment">// stk namespace</span>
<a name="l00145"></a>00145
<a name="l00146"></a>00146 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,93 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>BandedWG.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00030"></a>00030 <span class="comment">/***************************************************/</span>
<a name="l00031"></a>00031
<a name="l00032"></a>00032 <span class="preprocessor">#ifndef STK_BANDEDWG_H</span>
<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define STK_BANDEDWG_H</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span>
<a name="l00035"></a>00035 <span class="keyword">const</span> <span class="keywordtype">int</span> MAX_BANDED_MODES = 20;
<a name="l00036"></a>00036
<a name="l00037"></a>00037 <span class="preprocessor">#include "Instrmnt.h"</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include "DelayL.h"</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include "BowTable.h"</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include "ADSR.h"</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include "BiQuad.h"</span>
<a name="l00042"></a>00042
<a name="l00043"></a><a class="code" href="classBandedWG.html">00043</a> <span class="keyword">class </span><a class="code" href="classBandedWG.html">BandedWG</a> : <span class="keyword">public</span> <a class="code" href="classInstrmnt.html">Instrmnt</a>
<a name="l00044"></a>00044 {
<a name="l00045"></a>00045 <span class="keyword">public</span>:
<a name="l00047"></a>00047 <a class="code" href="classBandedWG.html#a0">BandedWG</a>();
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <a class="code" href="classBandedWG.html#a1">~BandedWG</a>();
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classBandedWG.html#a2">clear</a>();
<a name="l00054"></a>00054
<a name="l00056"></a>00056 <span class="keywordtype">void</span> <a class="code" href="classBandedWG.html#a3">setStrikePosition</a>(StkFloat position);
<a name="l00057"></a>00057
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classBandedWG.html#a4">setPreset</a>(<span class="keywordtype">int</span> preset);
<a name="l00060"></a>00060
<a name="l00062"></a>00062 <span class="keywordtype">void</span> <a class="code" href="classBandedWG.html#a5">setFrequency</a>(StkFloat frequency);
<a name="l00063"></a>00063
<a name="l00065"></a>00065 <span class="keywordtype">void</span> <a class="code" href="classBandedWG.html#a6">startBowing</a>(StkFloat amplitude, StkFloat rate);
<a name="l00066"></a>00066
<a name="l00068"></a>00068 <span class="keywordtype">void</span> <a class="code" href="classBandedWG.html#a7">stopBowing</a>(StkFloat rate);
<a name="l00069"></a>00069
<a name="l00071"></a>00071 <span class="keywordtype">void</span> <a class="code" href="classBandedWG.html#a8">pluck</a>(StkFloat amp);
<a name="l00072"></a>00072
<a name="l00074"></a>00074 <span class="keywordtype">void</span> <a class="code" href="classBandedWG.html#a9">noteOn</a>(StkFloat frequency, StkFloat amplitude);
<a name="l00075"></a>00075
<a name="l00077"></a>00077 <span class="keywordtype">void</span> <a class="code" href="classBandedWG.html#a10">noteOff</a>(StkFloat amplitude);
<a name="l00078"></a>00078
<a name="l00080"></a>00080 <span class="keywordtype">void</span> <a class="code" href="classBandedWG.html#a11">controlChange</a>(<span class="keywordtype">int</span> number, StkFloat value);
<a name="l00081"></a>00081
<a name="l00082"></a>00082 <span class="keyword">protected</span>:
<a name="l00083"></a>00083
<a name="l00084"></a>00084 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="keywordtype">bool</span> doPluck_;
<a name="l00087"></a>00087 <span class="keywordtype">bool</span> trackVelocity_;
<a name="l00088"></a>00088 <span class="keywordtype">int</span> nModes_;
<a name="l00089"></a>00089 <span class="keywordtype">int</span> presetModes_;
<a name="l00090"></a>00090 <a class="code" href="classBowTable.html">BowTable</a> bowTable_;
<a name="l00091"></a>00091 <a class="code" href="classADSR.html">ADSR</a> adsr_;
<a name="l00092"></a>00092 <a class="code" href="classBiQuad.html">BiQuad</a> bandpass_[MAX_BANDED_MODES];
<a name="l00093"></a>00093 <a class="code" href="classDelayL.html">DelayL</a> delay_[MAX_BANDED_MODES];
<a name="l00094"></a>00094 StkFloat maxVelocity_;
<a name="l00095"></a>00095 StkFloat modes_[MAX_BANDED_MODES];
<a name="l00096"></a>00096 StkFloat frequency_;
<a name="l00097"></a>00097 StkFloat baseGain_;
<a name="l00098"></a>00098 StkFloat gains_[MAX_BANDED_MODES];
<a name="l00099"></a>00099 StkFloat basegains_[MAX_BANDED_MODES];
<a name="l00100"></a>00100 StkFloat excitation_[MAX_BANDED_MODES];
<a name="l00101"></a>00101 StkFloat integrationConstant_;
<a name="l00102"></a>00102 StkFloat velocityInput_;
<a name="l00103"></a>00103 StkFloat bowVelocity_;
<a name="l00104"></a>00104 StkFloat bowTarget_;
<a name="l00105"></a>00105 StkFloat bowPosition_;
<a name="l00106"></a>00106 StkFloat strikeAmp_;
<a name="l00107"></a>00107 <span class="keywordtype">int</span> strikePosition_;
<a name="l00108"></a>00108
<a name="l00109"></a>00109 };
<a name="l00110"></a>00110
<a name="l00111"></a>00111 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,129 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>BandedWG.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BANDEDWG_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BANDEDWG_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Instrmnt.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;DelayL.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;BowTable.h&quot;</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;ADSR.h&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;BiQuad.h&quot;</span>
<a name="l00009"></a>00009
<a name="l00010"></a>00010 <span class="keyword">namespace </span>stk {
<a name="l00011"></a>00011
<a name="l00012"></a>00012 <span class="comment">/***************************************************/</span>
<a name="l00041"></a>00041 <span class="comment">/***************************************************/</span>
<a name="l00042"></a>00042
<a name="l00043"></a>00043 <span class="keyword">const</span> <span class="keywordtype">int</span> MAX_BANDED_MODES = 20;
<a name="l00044"></a>00044
<a name="l00045"></a><a class="code" href="classstk_1_1BandedWG.html">00045</a> <span class="keyword">class </span><a class="code" href="classstk_1_1BandedWG.html" title="Banded waveguide modeling class.">BandedWG</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00046"></a>00046 {
<a name="l00047"></a>00047 <span class="keyword">public</span>:
<a name="l00049"></a>00049 <a class="code" href="classstk_1_1BandedWG.html#ad449f248adaa49344c2bd25be4a7872d" title="Class constructor.">BandedWG</a>( <span class="keywordtype">void</span> );
<a name="l00050"></a>00050
<a name="l00052"></a>00052 <a class="code" href="classstk_1_1BandedWG.html#ac4044055c28bad672c9537b985d18289" title="Class destructor.">~BandedWG</a>( <span class="keywordtype">void</span> );
<a name="l00053"></a>00053
<a name="l00055"></a>00055 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BandedWG.html#a182dbf5d75aebf5714bd6df15b0df90c" title="Reset and clear all internal state.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00056"></a>00056
<a name="l00058"></a>00058 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BandedWG.html#a4394ee4cd1c84a8b3f92713e60715c4d" title="Set strike position (0.0 - 1.0).">setStrikePosition</a>( StkFloat position );
<a name="l00059"></a>00059
<a name="l00061"></a>00061 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BandedWG.html#ab1e3a367eef86e6cb372b4ee232e1804" title="Select a preset.">setPreset</a>( <span class="keywordtype">int</span> preset );
<a name="l00062"></a>00062
<a name="l00064"></a>00064 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BandedWG.html#acf104d4ed663b5f0cd034c8025f4d420" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00065"></a>00065
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BandedWG.html#a37b20c2554e7100241a99758f5a4433e" title="Apply bow velocity/pressure to instrument with given amplitude and rate of increase...">startBowing</a>( StkFloat amplitude, StkFloat rate );
<a name="l00068"></a>00068
<a name="l00070"></a>00070 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BandedWG.html#aa14786c32af030311e2118db3b68a892" title="Decrease bow velocity/breath pressure with given rate of decrease.">stopBowing</a>( StkFloat rate );
<a name="l00071"></a>00071
<a name="l00073"></a>00073 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BandedWG.html#a271573afaa2dc655446482bad6745cc1" title="Pluck the instrument with given amplitude.">pluck</a>( StkFloat amp );
<a name="l00074"></a>00074
<a name="l00076"></a>00076 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BandedWG.html#a8f334ae49b7baf561d74a0b6ec3c4f9a" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00077"></a>00077
<a name="l00079"></a>00079 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BandedWG.html#ac9c3c3ec0e821b1a080774bb55d3b881" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00080"></a>00080
<a name="l00082"></a>00082 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BandedWG.html#a16baac1cc6612332d6d0aa40a661c137" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value );
<a name="l00083"></a>00083
<a name="l00085"></a>00085 StkFloat <a class="code" href="classstk_1_1BandedWG.html#a44f37146d33354afb085806bd8340497" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00086"></a>00086
<a name="l00088"></a>00088
<a name="l00095"></a>00095 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BandedWG.html#a44f37146d33354afb085806bd8340497" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00096"></a>00096
<a name="l00097"></a>00097 <span class="keyword">protected</span>:
<a name="l00098"></a>00098
<a name="l00099"></a>00099 <span class="keywordtype">bool</span> doPluck_;
<a name="l00100"></a>00100 <span class="keywordtype">bool</span> trackVelocity_;
<a name="l00101"></a>00101 <span class="keywordtype">int</span> nModes_;
<a name="l00102"></a>00102 <span class="keywordtype">int</span> presetModes_;
<a name="l00103"></a>00103 <a class="code" href="classstk_1_1BowTable.html" title="STK bowed string table class.">BowTable</a> bowTable_;
<a name="l00104"></a>00104 <a class="code" href="classstk_1_1ADSR.html" title="STK ADSR envelope class.">ADSR</a> adsr_;
<a name="l00105"></a>00105 <a class="code" href="classstk_1_1BiQuad.html" title="STK biquad (two-pole, two-zero) filter class.">BiQuad</a> bandpass_[MAX_BANDED_MODES];
<a name="l00106"></a>00106 <a class="code" href="classstk_1_1DelayL.html" title="STK linear interpolating delay line class.">DelayL</a> delay_[MAX_BANDED_MODES];
<a name="l00107"></a>00107 StkFloat maxVelocity_;
<a name="l00108"></a>00108 StkFloat modes_[MAX_BANDED_MODES];
<a name="l00109"></a>00109 StkFloat frequency_;
<a name="l00110"></a>00110 StkFloat baseGain_;
<a name="l00111"></a>00111 StkFloat gains_[MAX_BANDED_MODES];
<a name="l00112"></a>00112 StkFloat basegains_[MAX_BANDED_MODES];
<a name="l00113"></a>00113 StkFloat excitation_[MAX_BANDED_MODES];
<a name="l00114"></a>00114 StkFloat integrationConstant_;
<a name="l00115"></a>00115 StkFloat velocityInput_;
<a name="l00116"></a>00116 StkFloat bowVelocity_;
<a name="l00117"></a>00117 StkFloat bowTarget_;
<a name="l00118"></a>00118 StkFloat bowPosition_;
<a name="l00119"></a>00119 StkFloat strikeAmp_;
<a name="l00120"></a>00120 <span class="keywordtype">int</span> strikePosition_;
<a name="l00121"></a>00121
<a name="l00122"></a>00122 };
<a name="l00123"></a>00123
<a name="l00124"></a><a class="code" href="classstk_1_1BandedWG.html#a6c2ebb66862b173c4835add6847801c9">00124</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BandedWG.html#a44f37146d33354afb085806bd8340497" title="Compute and return one output sample.">BandedWG :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00125"></a>00125 {
<a name="l00126"></a>00126 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00127"></a>00127 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00128"></a>00128 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels ) {
<a name="l00129"></a>00129 oStream_ &lt;&lt; <span class="stringliteral">&quot;BandedWG::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00130"></a>00130 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00131"></a>00131 }
<a name="l00132"></a>00132 <span class="preprocessor">#endif</span>
<a name="l00133"></a>00133 <span class="preprocessor"></span>
<a name="l00134"></a>00134 StkFloat *samples = &amp;frames[channel];
<a name="l00135"></a>00135 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00136"></a>00136 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00137"></a>00137 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00138"></a>00138 *samples++ = <a class="code" href="classstk_1_1BandedWG.html#a44f37146d33354afb085806bd8340497" title="Compute and return one output sample.">tick</a>();
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140 <span class="keywordflow">else</span> {
<a name="l00141"></a>00141 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00142"></a>00142 *samples++ = <a class="code" href="classstk_1_1BandedWG.html#a44f37146d33354afb085806bd8340497" title="Compute and return one output sample.">tick</a>();
<a name="l00143"></a>00143 <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00144"></a>00144 *samples++ = lastFrame_[j];
<a name="l00145"></a>00145 }
<a name="l00146"></a>00146 }
<a name="l00147"></a>00147
<a name="l00148"></a>00148 <span class="keywordflow">return</span> frames;
<a name="l00149"></a>00149 }
<a name="l00150"></a>00150
<a name="l00151"></a>00151 } <span class="comment">// stk namespace</span>
<a name="l00152"></a>00152
<a name="l00153"></a>00153 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,46 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>BeeThree.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00033"></a>00033 <span class="comment">/***************************************************/</span>
<a name="l00034"></a>00034
<a name="l00035"></a>00035 <span class="preprocessor">#ifndef STK_BEETHREE_H</span>
<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#define STK_BEETHREE_H</span>
<a name="l00037"></a>00037 <span class="preprocessor"></span>
<a name="l00038"></a>00038 <span class="preprocessor">#include "FM.h"</span>
<a name="l00039"></a>00039
<a name="l00040"></a><a class="code" href="classBeeThree.html">00040</a> <span class="keyword">class </span><a class="code" href="classBeeThree.html">BeeThree</a> : <span class="keyword">public</span> <a class="code" href="classFM.html">FM</a>
<a name="l00041"></a>00041 {
<a name="l00042"></a>00042 <span class="keyword">public</span>:
<a name="l00044"></a>00044
<a name="l00047"></a>00047 <a class="code" href="classBeeThree.html#a0">BeeThree</a>();
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <a class="code" href="classBeeThree.html#a1">~BeeThree</a>();
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classBeeThree.html#a2">noteOn</a>(StkFloat frequency, StkFloat amplitude);
<a name="l00054"></a>00054
<a name="l00055"></a>00055 <span class="keyword">protected</span>:
<a name="l00056"></a>00056
<a name="l00057"></a>00057 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00058"></a>00058 };
<a name="l00059"></a>00059
<a name="l00060"></a>00060 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,107 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>BeeThree.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BEETHREE_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BEETHREE_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;FM.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00040"></a>00040 <span class="comment">/***************************************************/</span>
<a name="l00041"></a>00041
<a name="l00042"></a><a class="code" href="classstk_1_1BeeThree.html">00042</a> <span class="keyword">class </span><a class="code" href="classstk_1_1BeeThree.html" title="STK Hammond-oid organ FM synthesis instrument.">BeeThree</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1FM.html" title="STK abstract FM synthesis base class.">FM</a>
<a name="l00043"></a>00043 {
<a name="l00044"></a>00044 <span class="keyword">public</span>:
<a name="l00046"></a>00046
<a name="l00049"></a>00049 <a class="code" href="classstk_1_1BeeThree.html#ab4534210b85a2c4798bf1c88b348c20a" title="Class constructor.">BeeThree</a>( <span class="keywordtype">void</span> );
<a name="l00050"></a>00050
<a name="l00052"></a>00052 <a class="code" href="classstk_1_1BeeThree.html#af2a0c982731438cf6200b3e5642a288d" title="Class destructor.">~BeeThree</a>( <span class="keywordtype">void</span> );
<a name="l00053"></a>00053
<a name="l00055"></a>00055 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BeeThree.html#a480c0fe8d4c2df9c00b82b192dd7eae4" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00056"></a>00056
<a name="l00058"></a>00058 StkFloat <a class="code" href="classstk_1_1BeeThree.html#a4649b9471bde3b978c20fcafcbef0fc7" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00059"></a>00059
<a name="l00061"></a>00061
<a name="l00068"></a>00068 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BeeThree.html#a4649b9471bde3b978c20fcafcbef0fc7" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00069"></a>00069
<a name="l00070"></a>00070 <span class="keyword">protected</span>:
<a name="l00071"></a>00071
<a name="l00072"></a>00072 };
<a name="l00073"></a>00073
<a name="l00074"></a><a class="code" href="classstk_1_1BeeThree.html#a4649b9471bde3b978c20fcafcbef0fc7">00074</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1BeeThree.html#a4649b9471bde3b978c20fcafcbef0fc7" title="Compute and return one output sample.">BeeThree :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00075"></a>00075 {
<a name="l00076"></a>00076 <span class="keyword">register</span> StkFloat temp;
<a name="l00077"></a>00077
<a name="l00078"></a>00078 <span class="keywordflow">if</span> ( modDepth_ &gt; 0.0 ) {
<a name="l00079"></a>00079 temp = 1.0 + ( modDepth_ * vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>() * 0.1 );
<a name="l00080"></a>00080 waves_[0]-&gt;setFrequency( baseFrequency_ * temp * ratios_[0] );
<a name="l00081"></a>00081 waves_[1]-&gt;setFrequency( baseFrequency_ * temp * ratios_[1] );
<a name="l00082"></a>00082 waves_[2]-&gt;setFrequency( baseFrequency_ * temp * ratios_[2] );
<a name="l00083"></a>00083 waves_[3]-&gt;setFrequency( baseFrequency_ * temp * ratios_[3] );
<a name="l00084"></a>00084 }
<a name="l00085"></a>00085
<a name="l00086"></a>00086 waves_[3]-&gt;addPhaseOffset( twozero_.<a class="code" href="classstk_1_1TwoZero.html#ae9808b0152902d0067ea24ccfba0b4ba" title="Return the last computed output value.">lastOut</a>() );
<a name="l00087"></a>00087 temp = control1_ * 2.0 * gains_[3] * adsr_[3]-&gt;tick() * waves_[3]-&gt;tick();
<a name="l00088"></a>00088 twozero_.<a class="code" href="classstk_1_1TwoZero.html#acf92a66aeb2024cfcdb9d71ecadf3d82" title="Input one sample to the filter and return one output.">tick</a>( temp );
<a name="l00089"></a>00089
<a name="l00090"></a>00090 temp += control2_ * 2.0 * gains_[2] * adsr_[2]-&gt;tick() * waves_[2]-&gt;tick();
<a name="l00091"></a>00091 temp += gains_[1] * adsr_[1]-&gt;tick() * waves_[1]-&gt;tick();
<a name="l00092"></a>00092 temp += gains_[0] * adsr_[0]-&gt;tick() * waves_[0]-&gt;tick();
<a name="l00093"></a>00093
<a name="l00094"></a>00094 lastFrame_[0] = temp * 0.125;
<a name="l00095"></a>00095 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00096"></a>00096 }
<a name="l00097"></a>00097
<a name="l00098"></a><a class="code" href="classstk_1_1BeeThree.html#a30520efff3fac0674d3c7ab95ac35999">00098</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BeeThree.html#a4649b9471bde3b978c20fcafcbef0fc7" title="Compute and return one output sample.">BeeThree :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00099"></a>00099 {
<a name="l00100"></a>00100 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00101"></a>00101 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00102"></a>00102 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels ) {
<a name="l00103"></a>00103 oStream_ &lt;&lt; <span class="stringliteral">&quot;BeeThree::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00104"></a>00104 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00105"></a>00105 }
<a name="l00106"></a>00106 <span class="preprocessor">#endif</span>
<a name="l00107"></a>00107 <span class="preprocessor"></span>
<a name="l00108"></a>00108 StkFloat *samples = &amp;frames[channel];
<a name="l00109"></a>00109 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00110"></a>00110 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00111"></a>00111 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00112"></a>00112 *samples++ = <a class="code" href="classstk_1_1BeeThree.html#a4649b9471bde3b978c20fcafcbef0fc7" title="Compute and return one output sample.">tick</a>();
<a name="l00113"></a>00113 }
<a name="l00114"></a>00114 <span class="keywordflow">else</span> {
<a name="l00115"></a>00115 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00116"></a>00116 *samples++ = <a class="code" href="classstk_1_1BeeThree.html#a4649b9471bde3b978c20fcafcbef0fc7" title="Compute and return one output sample.">tick</a>();
<a name="l00117"></a>00117 <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00118"></a>00118 *samples++ = lastFrame_[j];
<a name="l00119"></a>00119 }
<a name="l00120"></a>00120 }
<a name="l00121"></a>00121
<a name="l00122"></a>00122 <span class="keywordflow">return</span> frames;
<a name="l00123"></a>00123 }
<a name="l00124"></a>00124
<a name="l00125"></a>00125 } <span class="comment">// stk namespace</span>
<a name="l00126"></a>00126
<a name="l00127"></a>00127 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,105 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>BiQuad.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00013"></a>00013 <span class="comment">/***************************************************/</span>
<a name="l00014"></a>00014
<a name="l00015"></a>00015 <span class="preprocessor">#ifndef STK_BIQUAD_H</span>
<a name="l00016"></a>00016 <span class="preprocessor"></span><span class="preprocessor">#define STK_BIQUAD_H</span>
<a name="l00017"></a>00017 <span class="preprocessor"></span>
<a name="l00018"></a>00018 <span class="preprocessor">#include "Filter.h"</span>
<a name="l00019"></a>00019
<a name="l00020"></a><a class="code" href="classBiQuad.html">00020</a> <span class="keyword">class </span><a class="code" href="classBiQuad.html">BiQuad</a> : <span class="keyword">protected</span> <a class="code" href="classFilter.html">Filter</a>
<a name="l00021"></a>00021 {
<a name="l00022"></a>00022 <span class="keyword">public</span>:
<a name="l00023"></a>00023
<a name="l00025"></a>00025 <a class="code" href="classBiQuad.html#a0">BiQuad</a>();
<a name="l00026"></a>00026
<a name="l00028"></a>00028 <span class="keyword">virtual</span> <a class="code" href="classBiQuad.html#a1">~BiQuad</a>();
<a name="l00029"></a>00029
<a name="l00031"></a><a class="code" href="classBiQuad.html#a2">00031</a> <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a2">ignoreSampleRateChange</a>( <span class="keywordtype">bool</span> ignore = <span class="keyword">true</span> ) { ignoreSampleRateChange_ = ignore; };
<a name="l00032"></a>00032
<a name="l00034"></a>00034 <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a3">clear</a>(<span class="keywordtype">void</span>);
<a name="l00035"></a>00035
<a name="l00037"></a>00037 <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a4">setB0</a>(StkFloat b0);
<a name="l00038"></a>00038
<a name="l00040"></a>00040 <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a5">setB1</a>(StkFloat b1);
<a name="l00041"></a>00041
<a name="l00043"></a>00043 <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a6">setB2</a>(StkFloat b2);
<a name="l00044"></a>00044
<a name="l00046"></a>00046 <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a7">setA1</a>(StkFloat a1);
<a name="l00047"></a>00047
<a name="l00049"></a>00049 <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a8">setA2</a>(StkFloat a2);
<a name="l00050"></a>00050
<a name="l00052"></a>00052
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a9">setResonance</a>(StkFloat frequency, StkFloat radius, <span class="keywordtype">bool</span> normalize = <span class="keyword">false</span>);
<a name="l00064"></a>00064
<a name="l00066"></a>00066
<a name="l00072"></a>00072 <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a10">setNotch</a>(StkFloat frequency, StkFloat radius);
<a name="l00073"></a>00073
<a name="l00075"></a>00075
<a name="l00081"></a>00081 <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a11">setEqualGainZeroes</a>();
<a name="l00082"></a>00082
<a name="l00084"></a>00084
<a name="l00088"></a>00088 <span class="keywordtype">void</span> <a class="code" href="classBiQuad.html#a12">setGain</a>(StkFloat gain);
<a name="l00089"></a>00089
<a name="l00091"></a>00091 StkFloat <a class="code" href="classBiQuad.html#a13">getGain</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00092"></a>00092
<a name="l00094"></a>00094 StkFloat <a class="code" href="classBiQuad.html#a14">lastOut</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00095"></a>00095
<a name="l00097"></a>00097 <span class="keyword">virtual</span> StkFloat <a class="code" href="classBiQuad.html#a15">tick</a>(StkFloat sample);
<a name="l00098"></a>00098
<a name="l00100"></a>00100
<a name="l00106"></a>00106 <span class="keyword">virtual</span> <a class="code" href="classStkFrames.html">StkFrames</a>&amp; <a class="code" href="classBiQuad.html#a15">tick</a>( <a class="code" href="classStkFrames.html">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00107"></a>00107
<a name="l00108"></a>00108 <span class="keyword">protected</span>:
<a name="l00109"></a>00109
<a name="l00110"></a>00110 <span class="comment">// This function must be implemented in all subclasses. It is used</span>
<a name="l00111"></a>00111 <span class="comment">// to get around a C++ problem with overloaded virtual functions.</span>
<a name="l00112"></a>00112 <span class="keyword">virtual</span> StkFloat computeSample( StkFloat input );
<a name="l00113"></a>00113 <span class="keyword">virtual</span> <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00114"></a>00114 };
<a name="l00115"></a>00115
<a name="l00116"></a>00116 <span class="keyword">inline</span> StkFloat BiQuad :: computeSample( StkFloat input )
<a name="l00117"></a>00117 {
<a name="l00118"></a>00118 inputs_[0] = gain_ * input;
<a name="l00119"></a>00119 outputs_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
<a name="l00120"></a>00120 outputs_[0] -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
<a name="l00121"></a>00121 inputs_[2] = inputs_[1];
<a name="l00122"></a>00122 inputs_[1] = inputs_[0];
<a name="l00123"></a>00123 outputs_[2] = outputs_[1];
<a name="l00124"></a>00124 outputs_[1] = outputs_[0];
<a name="l00125"></a>00125
<a name="l00126"></a>00126 <span class="keywordflow">return</span> outputs_[0];
<a name="l00127"></a>00127 }
<a name="l00128"></a>00128
<a name="l00129"></a><a class="code" href="classBiQuad.html#a15">00129</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classBiQuad.html#a15">BiQuad :: tick</a>( StkFloat input )
<a name="l00130"></a>00130 {
<a name="l00131"></a>00131 <span class="keywordflow">return</span> this-&gt;computeSample( input );
<a name="l00132"></a>00132 }
<a name="l00133"></a>00133
<a name="l00134"></a><a class="code" href="classBiQuad.html#a16">00134</a> <span class="keyword">inline</span> <a class="code" href="classStkFrames.html">StkFrames</a>&amp; <a class="code" href="classBiQuad.html#a15">BiQuad :: tick</a>( <a class="code" href="classStkFrames.html">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00135"></a>00135 {
<a name="l00136"></a>00136 <span class="keywordflow">return</span> <a class="code" href="classFilter.html#a10">Filter::tick</a>( frames, channel );
<a name="l00137"></a>00137 }
<a name="l00138"></a>00138
<a name="l00139"></a>00139 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,148 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>BiQuad.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BIQUAD_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BIQUAD_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Filter.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00018"></a>00018 <span class="comment">/***************************************************/</span>
<a name="l00019"></a>00019
<a name="l00020"></a><a class="code" href="classstk_1_1BiQuad.html">00020</a> <span class="keyword">class </span><a class="code" href="classstk_1_1BiQuad.html" title="STK biquad (two-pole, two-zero) filter class.">BiQuad</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Filter.html" title="STK abstract filter class.">Filter</a>
<a name="l00021"></a>00021 {
<a name="l00022"></a>00022 <span class="keyword">public</span>:
<a name="l00023"></a>00023
<a name="l00025"></a>00025 <a class="code" href="classstk_1_1BiQuad.html#a91aab9d1b4833e156edcf59cbe276e3f" title="Default constructor creates a second-order pass-through filter.">BiQuad</a>();
<a name="l00026"></a>00026
<a name="l00028"></a>00028 <a class="code" href="classstk_1_1BiQuad.html#ad7e81be1c4e5c5ab69474f6df2610984" title="Class destructor.">~BiQuad</a>();
<a name="l00029"></a>00029
<a name="l00031"></a><a class="code" href="classstk_1_1BiQuad.html#aab468cd1aa79b95442b15bb04d8bb211">00031</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BiQuad.html#aab468cd1aa79b95442b15bb04d8bb211" title="A function to enable/disable the automatic updating of class data when the STK sample...">ignoreSampleRateChange</a>( <span class="keywordtype">bool</span> ignore = <span class="keyword">true</span> ) { ignoreSampleRateChange_ = ignore; };
<a name="l00032"></a>00032
<a name="l00034"></a>00034 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BiQuad.html#aeed58196cf798f664cddbb9a8564c7b5" title="Set all filter coefficients.">setCoefficients</a>( StkFloat b0, StkFloat b1, StkFloat b2, StkFloat a1, StkFloat a2, <span class="keywordtype">bool</span> clearState = <span class="keyword">false</span> );
<a name="l00035"></a>00035
<a name="l00037"></a><a class="code" href="classstk_1_1BiQuad.html#a26ee25d08116b20f326001166f087853">00037</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BiQuad.html#a26ee25d08116b20f326001166f087853" title="Set the b[0] coefficient value.">setB0</a>( StkFloat b0 ) { b_[0] = b0; };
<a name="l00038"></a>00038
<a name="l00040"></a><a class="code" href="classstk_1_1BiQuad.html#add364ed410b3ed2a2b29b8a5fea127c8">00040</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BiQuad.html#add364ed410b3ed2a2b29b8a5fea127c8" title="Set the b[1] coefficient value.">setB1</a>( StkFloat b1 ) { b_[1] = b1; };
<a name="l00041"></a>00041
<a name="l00043"></a><a class="code" href="classstk_1_1BiQuad.html#a208a654dd3393ed0b2b86ad56d9cf3e1">00043</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BiQuad.html#a208a654dd3393ed0b2b86ad56d9cf3e1" title="Set the b[2] coefficient value.">setB2</a>( StkFloat b2 ) { b_[2] = b2; };
<a name="l00044"></a>00044
<a name="l00046"></a><a class="code" href="classstk_1_1BiQuad.html#a1c9799e47163fe8a59fd85196c089cb3">00046</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BiQuad.html#a1c9799e47163fe8a59fd85196c089cb3" title="Set the a[1] coefficient value.">setA1</a>( StkFloat a1 ) { a_[1] = a1; };
<a name="l00047"></a>00047
<a name="l00049"></a><a class="code" href="classstk_1_1BiQuad.html#ae28afd560df11435ea54f128d23b9383">00049</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BiQuad.html#ae28afd560df11435ea54f128d23b9383" title="Set the a[2] coefficient value.">setA2</a>( StkFloat a2 ) { a_[2] = a2; };
<a name="l00050"></a>00050
<a name="l00052"></a>00052
<a name="l00065"></a>00065 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BiQuad.html#a55aaa01fd4156f1fac1168f526e3d969" title="Sets the filter coefficients for a resonance at frequency (in Hz).">setResonance</a>( StkFloat frequency, StkFloat radius, <span class="keywordtype">bool</span> normalize = <span class="keyword">false</span> );
<a name="l00066"></a>00066
<a name="l00068"></a>00068
<a name="l00075"></a>00075 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BiQuad.html#ae10a26fc319ba357bc92df4e528c2d8f" title="Set the filter coefficients for a notch at frequency (in Hz).">setNotch</a>( StkFloat frequency, StkFloat radius );
<a name="l00076"></a>00076
<a name="l00078"></a>00078
<a name="l00084"></a>00084 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BiQuad.html#a28881f5876ce5bdcc846367cca9363f7" title="Sets the filter zeroes for equal resonance gain.">setEqualGainZeroes</a>( <span class="keywordtype">void</span> );
<a name="l00085"></a>00085
<a name="l00087"></a><a class="code" href="classstk_1_1BiQuad.html#a412f224363b1a222423ecf0cd7be9063">00087</a> StkFloat <a class="code" href="classstk_1_1BiQuad.html#a412f224363b1a222423ecf0cd7be9063" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00088"></a>00088
<a name="l00090"></a>00090 StkFloat <a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635" title="Input one sample to the filter and return a reference to one output.">tick</a>( StkFloat input );
<a name="l00091"></a>00091
<a name="l00093"></a>00093
<a name="l00101"></a>00101 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635" title="Input one sample to the filter and return a reference to one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00102"></a>00102
<a name="l00104"></a>00104
<a name="l00112"></a>00112 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635" title="Input one sample to the filter and return a reference to one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> &amp;oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel = 0 );
<a name="l00113"></a>00113
<a name="l00114"></a>00114 <span class="keyword">protected</span>:
<a name="l00115"></a>00115
<a name="l00116"></a>00116 <span class="keyword">virtual</span> <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00117"></a>00117 };
<a name="l00118"></a>00118
<a name="l00119"></a><a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635">00119</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635" title="Input one sample to the filter and return a reference to one output.">BiQuad :: tick</a>( StkFloat input )
<a name="l00120"></a>00120 {
<a name="l00121"></a>00121 inputs_[0] = gain_ * input;
<a name="l00122"></a>00122 lastFrame_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
<a name="l00123"></a>00123 lastFrame_[0] -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
<a name="l00124"></a>00124 inputs_[2] = inputs_[1];
<a name="l00125"></a>00125 inputs_[1] = inputs_[0];
<a name="l00126"></a>00126 outputs_[2] = outputs_[1];
<a name="l00127"></a>00127 outputs_[1] = lastFrame_[0];
<a name="l00128"></a>00128
<a name="l00129"></a>00129 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00130"></a>00130 }
<a name="l00131"></a>00131
<a name="l00132"></a><a class="code" href="classstk_1_1BiQuad.html#af903e41217838470a5f267a20b905a12">00132</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635" title="Input one sample to the filter and return a reference to one output.">BiQuad :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00133"></a>00133 {
<a name="l00134"></a>00134 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00135"></a>00135 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00136"></a>00136 oStream_ &lt;&lt; <span class="stringliteral">&quot;BiQuad::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00137"></a>00137 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00138"></a>00138 }
<a name="l00139"></a>00139 <span class="preprocessor">#endif</span>
<a name="l00140"></a>00140 <span class="preprocessor"></span>
<a name="l00141"></a>00141 StkFloat *samples = &amp;frames[channel];
<a name="l00142"></a>00142 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00143"></a>00143 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00144"></a>00144 inputs_[0] = gain_ * *samples;
<a name="l00145"></a>00145 *samples = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
<a name="l00146"></a>00146 *samples -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
<a name="l00147"></a>00147 inputs_[2] = inputs_[1];
<a name="l00148"></a>00148 inputs_[1] = inputs_[0];
<a name="l00149"></a>00149 outputs_[2] = outputs_[1];
<a name="l00150"></a>00150 outputs_[1] = *samples;
<a name="l00151"></a>00151 }
<a name="l00152"></a>00152
<a name="l00153"></a>00153 lastFrame_[0] = outputs_[1];
<a name="l00154"></a>00154 <span class="keywordflow">return</span> frames;
<a name="l00155"></a>00155 }
<a name="l00156"></a>00156
<a name="l00157"></a><a class="code" href="classstk_1_1BiQuad.html#ac9836f0e074ea9516727f27eb9b411aa">00157</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635" title="Input one sample to the filter and return a reference to one output.">BiQuad :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel )
<a name="l00158"></a>00158 {
<a name="l00159"></a>00159 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00160"></a>00160 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( iChannel &gt;= iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() || oChannel &gt;= oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00161"></a>00161 oStream_ &lt;&lt; <span class="stringliteral">&quot;BiQuad::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00162"></a>00162 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00163"></a>00163 }
<a name="l00164"></a>00164 <span class="preprocessor">#endif</span>
<a name="l00165"></a>00165 <span class="preprocessor"></span>
<a name="l00166"></a>00166 StkFloat *iSamples = &amp;iFrames[iChannel];
<a name="l00167"></a>00167 StkFloat *oSamples = &amp;oFrames[oChannel];
<a name="l00168"></a>00168 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iHop = iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(), oHop = oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00169"></a>00169 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;iFrames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, iSamples += iHop, oSamples += oHop ) {
<a name="l00170"></a>00170 inputs_[0] = gain_ * *iSamples;
<a name="l00171"></a>00171 *oSamples = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
<a name="l00172"></a>00172 *oSamples -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
<a name="l00173"></a>00173 inputs_[2] = inputs_[1];
<a name="l00174"></a>00174 inputs_[1] = inputs_[0];
<a name="l00175"></a>00175 outputs_[2] = outputs_[1];
<a name="l00176"></a>00176 outputs_[1] = *oSamples;
<a name="l00177"></a>00177 }
<a name="l00178"></a>00178
<a name="l00179"></a>00179 lastFrame_[0] = outputs_[1];
<a name="l00180"></a>00180 <span class="keywordflow">return</span> iFrames;
<a name="l00181"></a>00181 }
<a name="l00182"></a>00182
<a name="l00183"></a>00183 } <span class="comment">// stk namespace</span>
<a name="l00184"></a>00184
<a name="l00185"></a>00185 <span class="preprocessor">#endif</span>
<a name="l00186"></a>00186 <span class="preprocessor"></span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,61 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>BlitSaw.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00020"></a>00020 <span class="comment">/***************************************************/</span>
<a name="l00021"></a>00021
<a name="l00022"></a>00022 <span class="preprocessor">#ifndef STK_BLITSAW_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span><span class="preprocessor">#define STK_BLITSAW_H</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "Generator.h"</span>
<a name="l00026"></a>00026
<a name="l00027"></a><a class="code" href="classBlitSaw.html">00027</a> <span class="keyword">class </span><a class="code" href="classBlitSaw.html">BlitSaw</a>: <span class="keyword">public</span> <a class="code" href="classGenerator.html">Generator</a>
<a name="l00028"></a>00028 {
<a name="l00029"></a>00029 <span class="keyword">public</span>:
<a name="l00031"></a>00031 <a class="code" href="classBlitSaw.html#a0">BlitSaw</a>( StkFloat frequency = 220.0 );
<a name="l00032"></a>00032
<a name="l00034"></a>00034 <a class="code" href="classBlitSaw.html#a1">~BlitSaw</a>();
<a name="l00035"></a>00035
<a name="l00037"></a>00037 <span class="keywordtype">void</span> <a class="code" href="classBlitSaw.html#a2">reset</a>();
<a name="l00038"></a>00038
<a name="l00040"></a>00040 <span class="keywordtype">void</span> <a class="code" href="classBlitSaw.html#a3">setFrequency</a>( StkFloat frequency );
<a name="l00041"></a>00041
<a name="l00043"></a>00043
<a name="l00055"></a>00055 <span class="keywordtype">void</span> <a class="code" href="classBlitSaw.html#a4">setHarmonics</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics = 0 );
<a name="l00056"></a>00056
<a name="l00057"></a>00057 <span class="keyword">protected</span>:
<a name="l00058"></a>00058
<a name="l00059"></a>00059 <span class="keywordtype">void</span> updateHarmonics( <span class="keywordtype">void</span> );
<a name="l00060"></a>00060 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00061"></a>00061
<a name="l00062"></a>00062 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics_;
<a name="l00063"></a>00063 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_;
<a name="l00064"></a>00064 StkFloat rate_;
<a name="l00065"></a>00065 StkFloat phase_;
<a name="l00066"></a>00066 StkFloat p_;
<a name="l00067"></a>00067 StkFloat C2_;
<a name="l00068"></a>00068 StkFloat a_;
<a name="l00069"></a>00069 StkFloat state_;
<a name="l00070"></a>00070
<a name="l00071"></a>00071 };
<a name="l00072"></a>00072
<a name="l00073"></a>00073 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,129 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>BlitSaw.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BLITSAW_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BLITSAW_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Generator.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &lt;limits&gt;</span>
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="keyword">namespace </span>stk {
<a name="l00009"></a>00009
<a name="l00010"></a>00010 <span class="comment">/***************************************************/</span>
<a name="l00029"></a>00029 <span class="comment">/***************************************************/</span>
<a name="l00030"></a>00030
<a name="l00031"></a><a class="code" href="classstk_1_1BlitSaw.html">00031</a> <span class="keyword">class </span><a class="code" href="classstk_1_1BlitSaw.html" title="STK band-limited sawtooth wave class.">BlitSaw</a>: <span class="keyword">public</span> <a class="code" href="classstk_1_1Generator.html" title="STK abstract unit generator parent class.">Generator</a>
<a name="l00032"></a>00032 {
<a name="l00033"></a>00033 <span class="keyword">public</span>:
<a name="l00035"></a>00035 <a class="code" href="classstk_1_1BlitSaw.html#a8a245ef05cc58c521edaded5c6cdd5ee" title="Class constructor.">BlitSaw</a>( StkFloat frequency = 220.0 );
<a name="l00036"></a>00036
<a name="l00038"></a>00038 <a class="code" href="classstk_1_1BlitSaw.html#a24cd2cc9852ce73252a99f7eff63879b" title="Class destructor.">~BlitSaw</a>();
<a name="l00039"></a>00039
<a name="l00041"></a>00041 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlitSaw.html#a3010cf9a0905368b857df2d332968036" title="Resets the oscillator state and phase to 0.">reset</a>();
<a name="l00042"></a>00042
<a name="l00044"></a>00044 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlitSaw.html#afa6f1103a61221eebf5f49f3a7df4145" title="Set the sawtooth oscillator rate in terms of a frequency in Hz.">setFrequency</a>( StkFloat frequency );
<a name="l00045"></a>00045
<a name="l00047"></a>00047
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlitSaw.html#a8abd2b9a5b8d26926a383c1e56605545" title="Set the number of harmonics generated in the signal.">setHarmonics</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics = 0 );
<a name="l00060"></a>00060
<a name="l00062"></a><a class="code" href="classstk_1_1BlitSaw.html#a254758ecd4166cc4e7d6fced5650a198">00062</a> StkFloat <a class="code" href="classstk_1_1BlitSaw.html#a254758ecd4166cc4e7d6fced5650a198" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00063"></a>00063
<a name="l00065"></a>00065 StkFloat <a class="code" href="classstk_1_1BlitSaw.html#a03536a1f1823ea41649b4a62ba98007c" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">void</span> );
<a name="l00066"></a>00066
<a name="l00068"></a>00068
<a name="l00075"></a>00075 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BlitSaw.html#a03536a1f1823ea41649b4a62ba98007c" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00076"></a>00076
<a name="l00077"></a>00077 <span class="keyword">protected</span>:
<a name="l00078"></a>00078
<a name="l00079"></a>00079 <span class="keywordtype">void</span> updateHarmonics( <span class="keywordtype">void</span> );
<a name="l00080"></a>00080
<a name="l00081"></a>00081 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics_;
<a name="l00082"></a>00082 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_;
<a name="l00083"></a>00083 StkFloat rate_;
<a name="l00084"></a>00084 StkFloat phase_;
<a name="l00085"></a>00085 StkFloat p_;
<a name="l00086"></a>00086 StkFloat C2_;
<a name="l00087"></a>00087 StkFloat a_;
<a name="l00088"></a>00088 StkFloat state_;
<a name="l00089"></a>00089
<a name="l00090"></a>00090 };
<a name="l00091"></a>00091
<a name="l00092"></a><a class="code" href="classstk_1_1BlitSaw.html#a03536a1f1823ea41649b4a62ba98007c">00092</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1BlitSaw.html#a03536a1f1823ea41649b4a62ba98007c" title="Compute and return one output sample.">BlitSaw :: tick</a>( <span class="keywordtype">void</span> )
<a name="l00093"></a>00093 {
<a name="l00094"></a>00094 <span class="comment">// The code below implements the BLIT algorithm of Stilson and</span>
<a name="l00095"></a>00095 <span class="comment">// Smith, followed by a summation and filtering operation to produce</span>
<a name="l00096"></a>00096 <span class="comment">// a sawtooth waveform. After experimenting with various approaches</span>
<a name="l00097"></a>00097 <span class="comment">// to calculate the average value of the BLIT over one period, I</span>
<a name="l00098"></a>00098 <span class="comment">// found that an estimate of C2_ = 1.0 / period (in samples) worked</span>
<a name="l00099"></a>00099 <span class="comment">// most consistently. A &quot;leaky integrator&quot; is then applied to the</span>
<a name="l00100"></a>00100 <span class="comment">// difference of the BLIT output and C2_. (GPS - 1 October 2005)</span>
<a name="l00101"></a>00101
<a name="l00102"></a>00102 <span class="comment">// A fully optimized version of this code would replace the two sin </span>
<a name="l00103"></a>00103 <span class="comment">// calls with a pair of fast sin oscillators, for which stable fast </span>
<a name="l00104"></a>00104 <span class="comment">// two-multiply algorithms are well known. In the spirit of STK,</span>
<a name="l00105"></a>00105 <span class="comment">// which favors clarity over performance, the optimization has </span>
<a name="l00106"></a>00106 <span class="comment">// not been made here.</span>
<a name="l00107"></a>00107
<a name="l00108"></a>00108 <span class="comment">// Avoid a divide by zero, or use of a denormalized divisor </span>
<a name="l00109"></a>00109 <span class="comment">// at the sinc peak, which has a limiting value of m_ / p_.</span>
<a name="l00110"></a>00110 StkFloat tmp, denominator = sin( phase_ );
<a name="l00111"></a>00111 <span class="keywordflow">if</span> ( fabs(denominator) &lt;= std::numeric_limits&lt;StkFloat&gt;::epsilon() )
<a name="l00112"></a>00112 tmp = a_;
<a name="l00113"></a>00113 <span class="keywordflow">else</span> {
<a name="l00114"></a>00114 tmp = sin( m_ * phase_ );
<a name="l00115"></a>00115 tmp /= p_ * denominator;
<a name="l00116"></a>00116 }
<a name="l00117"></a>00117
<a name="l00118"></a>00118 tmp += state_ - C2_;
<a name="l00119"></a>00119 state_ = tmp * 0.995;
<a name="l00120"></a>00120
<a name="l00121"></a>00121 phase_ += rate_;
<a name="l00122"></a>00122 <span class="keywordflow">if</span> ( phase_ &gt;= PI ) phase_ -= PI;
<a name="l00123"></a>00123
<a name="l00124"></a>00124 lastFrame_[0] = tmp;
<a name="l00125"></a>00125 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00126"></a>00126 }
<a name="l00127"></a>00127
<a name="l00128"></a><a class="code" href="classstk_1_1BlitSaw.html#ab53f6ba99ef5c4f8982f6c0f07bf2e1d">00128</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BlitSaw.html#a03536a1f1823ea41649b4a62ba98007c" title="Compute and return one output sample.">BlitSaw :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00129"></a>00129 {
<a name="l00130"></a>00130 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00131"></a>00131 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00132"></a>00132 oStream_ &lt;&lt; <span class="stringliteral">&quot;BlitSaw::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00133"></a>00133 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00134"></a>00134 }
<a name="l00135"></a>00135 <span class="preprocessor">#endif</span>
<a name="l00136"></a>00136 <span class="preprocessor"></span>
<a name="l00137"></a>00137
<a name="l00138"></a>00138 StkFloat *samples = &amp;frames[channel];
<a name="l00139"></a>00139 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00140"></a>00140 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00141"></a>00141 *samples = <a class="code" href="classstk_1_1BlitSaw.html#a03536a1f1823ea41649b4a62ba98007c" title="Compute and return one output sample.">BlitSaw::tick</a>();
<a name="l00142"></a>00142
<a name="l00143"></a>00143 <span class="keywordflow">return</span> frames;
<a name="l00144"></a>00144 }
<a name="l00145"></a>00145
<a name="l00146"></a>00146 } <span class="comment">// stk namespace</span>
<a name="l00147"></a>00147
<a name="l00148"></a>00148 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,66 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>BlitSquare.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00031"></a>00031 <span class="comment">/***************************************************/</span>
<a name="l00032"></a>00032
<a name="l00033"></a>00033 <span class="preprocessor">#ifndef STK_BLITSQUARE_H</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#define STK_BLITSQUARE_H</span>
<a name="l00035"></a>00035 <span class="preprocessor"></span>
<a name="l00036"></a>00036 <span class="preprocessor">#include "Generator.h"</span>
<a name="l00037"></a>00037
<a name="l00038"></a><a class="code" href="classBlitSquare.html">00038</a> <span class="keyword">class </span><a class="code" href="classBlitSquare.html">BlitSquare</a>: <span class="keyword">public</span> <a class="code" href="classGenerator.html">Generator</a>
<a name="l00039"></a>00039 {
<a name="l00040"></a>00040 <span class="keyword">public</span>:
<a name="l00042"></a>00042 <a class="code" href="classBlitSquare.html#a0">BlitSquare</a>( StkFloat frequency = 220.0 );
<a name="l00043"></a>00043
<a name="l00045"></a>00045 <a class="code" href="classBlitSquare.html#a1">~BlitSquare</a>();
<a name="l00046"></a>00046
<a name="l00048"></a>00048 <span class="keywordtype">void</span> <a class="code" href="classBlitSquare.html#a2">reset</a>();
<a name="l00049"></a>00049
<a name="l00051"></a>00051
<a name="l00054"></a><a class="code" href="classBlitSquare.html#a3">00054</a> <span class="keywordtype">void</span> <a class="code" href="classBlitSquare.html#a3">setPhase</a>( StkFloat phase ) { phase_ = PI * phase; };
<a name="l00055"></a>00055
<a name="l00057"></a>00057
<a name="l00060"></a><a class="code" href="classBlitSquare.html#a4">00060</a> StkFloat <a class="code" href="classBlitSquare.html#a4">getPhase</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> phase_ / PI; };
<a name="l00061"></a>00061
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classBlitSquare.html#a5">setFrequency</a>( StkFloat frequency );
<a name="l00064"></a>00064
<a name="l00066"></a>00066
<a name="l00078"></a>00078 <span class="keywordtype">void</span> <a class="code" href="classBlitSquare.html#a6">setHarmonics</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics = 0 );
<a name="l00079"></a>00079
<a name="l00080"></a>00080 <span class="keyword">protected</span>:
<a name="l00081"></a>00081
<a name="l00082"></a>00082 <span class="keywordtype">void</span> updateHarmonics( <span class="keywordtype">void</span> );
<a name="l00083"></a>00083 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00084"></a>00084
<a name="l00085"></a>00085 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics_;
<a name="l00086"></a>00086 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_;
<a name="l00087"></a>00087 StkFloat rate_;
<a name="l00088"></a>00088 StkFloat phase_;
<a name="l00089"></a>00089 StkFloat p_;
<a name="l00090"></a>00090 StkFloat a_;
<a name="l00091"></a>00091 StkFloat lastBlitOutput_;
<a name="l00092"></a>00092 StkFloat dcbState_;
<a name="l00093"></a>00093 };
<a name="l00094"></a>00094
<a name="l00095"></a>00095 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,134 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>BlitSquare.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BLITSQUARE_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BLITSQUARE_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Generator.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &lt;limits&gt;</span>
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="keyword">namespace </span>stk {
<a name="l00009"></a>00009
<a name="l00010"></a>00010 <span class="comment">/***************************************************/</span>
<a name="l00040"></a>00040 <span class="comment">/***************************************************/</span>
<a name="l00041"></a>00041
<a name="l00042"></a><a class="code" href="classstk_1_1BlitSquare.html">00042</a> <span class="keyword">class </span><a class="code" href="classstk_1_1BlitSquare.html" title="STK band-limited square wave class.">BlitSquare</a>: <span class="keyword">public</span> <a class="code" href="classstk_1_1Generator.html" title="STK abstract unit generator parent class.">Generator</a>
<a name="l00043"></a>00043 {
<a name="l00044"></a>00044 <span class="keyword">public</span>:
<a name="l00046"></a>00046 <a class="code" href="classstk_1_1BlitSquare.html#a2cb3aee415a6ee75fa85b01e4e85d70b" title="Default constructor that initializes BLIT frequency to 220 Hz.">BlitSquare</a>( StkFloat frequency = 220.0 );
<a name="l00047"></a>00047
<a name="l00049"></a>00049 <a class="code" href="classstk_1_1BlitSquare.html#a4bc6e424ca1631f353f55846084634ef" title="Class destructor.">~BlitSquare</a>();
<a name="l00050"></a>00050
<a name="l00052"></a>00052 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlitSquare.html#a8f6dbe07d7f64b24cc9a41f6208dd6c4" title="Resets the oscillator state and phase to 0.">reset</a>();
<a name="l00053"></a>00053
<a name="l00055"></a>00055
<a name="l00058"></a><a class="code" href="classstk_1_1BlitSquare.html#aeface58980a3ec865131f3cad59bbbef">00058</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlitSquare.html#aeface58980a3ec865131f3cad59bbbef" title="Set the phase of the signal.">setPhase</a>( StkFloat phase ) { phase_ = PI * phase; };
<a name="l00059"></a>00059
<a name="l00061"></a>00061
<a name="l00064"></a><a class="code" href="classstk_1_1BlitSquare.html#abbda8cb84bcd36fc6d96130e9832a6af">00064</a> StkFloat <a class="code" href="classstk_1_1BlitSquare.html#abbda8cb84bcd36fc6d96130e9832a6af" title="Get the current phase of the signal.">getPhase</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> phase_ / PI; };
<a name="l00065"></a>00065
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlitSquare.html#a8d0d8e0a12987ebccc56c09c7e7dbd6a" title="Set the impulse train rate in terms of a frequency in Hz.">setFrequency</a>( StkFloat frequency );
<a name="l00068"></a>00068
<a name="l00070"></a>00070
<a name="l00082"></a>00082 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlitSquare.html#a94521b4224d0873f5e783c721c123b21" title="Set the number of harmonics generated in the signal.">setHarmonics</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics = 0 );
<a name="l00083"></a>00083
<a name="l00085"></a><a class="code" href="classstk_1_1BlitSquare.html#a77972e4e1c53600bf80cf692601ccae1">00085</a> StkFloat <a class="code" href="classstk_1_1BlitSquare.html#a77972e4e1c53600bf80cf692601ccae1" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00086"></a>00086
<a name="l00088"></a>00088 StkFloat <a class="code" href="classstk_1_1BlitSquare.html#a04366d55cecb4c8a726ea0519683d817" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">void</span> );
<a name="l00089"></a>00089
<a name="l00091"></a>00091
<a name="l00098"></a>00098 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BlitSquare.html#a04366d55cecb4c8a726ea0519683d817" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00099"></a>00099
<a name="l00100"></a>00100 <span class="keyword">protected</span>:
<a name="l00101"></a>00101
<a name="l00102"></a>00102 <span class="keywordtype">void</span> updateHarmonics( <span class="keywordtype">void</span> );
<a name="l00103"></a>00103
<a name="l00104"></a>00104 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics_;
<a name="l00105"></a>00105 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_;
<a name="l00106"></a>00106 StkFloat rate_;
<a name="l00107"></a>00107 StkFloat phase_;
<a name="l00108"></a>00108 StkFloat p_;
<a name="l00109"></a>00109 StkFloat a_;
<a name="l00110"></a>00110 StkFloat lastBlitOutput_;
<a name="l00111"></a>00111 StkFloat dcbState_;
<a name="l00112"></a>00112 };
<a name="l00113"></a>00113
<a name="l00114"></a><a class="code" href="classstk_1_1BlitSquare.html#a04366d55cecb4c8a726ea0519683d817">00114</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1BlitSquare.html#a04366d55cecb4c8a726ea0519683d817" title="Compute and return one output sample.">BlitSquare :: tick</a>( <span class="keywordtype">void</span> )
<a name="l00115"></a>00115 {
<a name="l00116"></a>00116 StkFloat temp = lastBlitOutput_;
<a name="l00117"></a>00117
<a name="l00118"></a>00118 <span class="comment">// A fully optimized version of this would replace the two sin calls</span>
<a name="l00119"></a>00119 <span class="comment">// with a pair of fast sin oscillators, for which stable fast </span>
<a name="l00120"></a>00120 <span class="comment">// two-multiply algorithms are well known. In the spirit of STK,</span>
<a name="l00121"></a>00121 <span class="comment">// which favors clarity over performance, the optimization has </span>
<a name="l00122"></a>00122 <span class="comment">// not been made here.</span>
<a name="l00123"></a>00123
<a name="l00124"></a>00124 <span class="comment">// Avoid a divide by zero, or use of a denomralized divisor</span>
<a name="l00125"></a>00125 <span class="comment">// at the sinc peak, which has a limiting value of 1.0.</span>
<a name="l00126"></a>00126 StkFloat denominator = sin( phase_ );
<a name="l00127"></a>00127 <span class="keywordflow">if</span> ( fabs( denominator ) &lt; std::numeric_limits&lt;StkFloat&gt;::epsilon() ) {
<a name="l00128"></a>00128 <span class="comment">// Inexact comparison safely distinguishes betwen *close to zero*, and *close to PI*.</span>
<a name="l00129"></a>00129 <span class="keywordflow">if</span> ( phase_ &lt; 0.1f || phase_ &gt; TWO_PI - 0.1f )
<a name="l00130"></a>00130 lastBlitOutput_ = a_;
<a name="l00131"></a>00131 <span class="keywordflow">else</span>
<a name="l00132"></a>00132 lastBlitOutput_ = -a_;
<a name="l00133"></a>00133 }
<a name="l00134"></a>00134 <span class="keywordflow">else</span> {
<a name="l00135"></a>00135 lastBlitOutput_ = sin( m_ * phase_ );
<a name="l00136"></a>00136 lastBlitOutput_ /= p_ * denominator;
<a name="l00137"></a>00137 }
<a name="l00138"></a>00138
<a name="l00139"></a>00139 lastBlitOutput_ += temp;
<a name="l00140"></a>00140
<a name="l00141"></a>00141 <span class="comment">// Now apply DC blocker.</span>
<a name="l00142"></a>00142 lastFrame_[0] = lastBlitOutput_ - dcbState_ + 0.999 * lastFrame_[0];
<a name="l00143"></a>00143 dcbState_ = lastBlitOutput_;
<a name="l00144"></a>00144
<a name="l00145"></a>00145 phase_ += rate_;
<a name="l00146"></a>00146 <span class="keywordflow">if</span> ( phase_ &gt;= TWO_PI ) phase_ -= TWO_PI;
<a name="l00147"></a>00147
<a name="l00148"></a>00148 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00149"></a>00149 }
<a name="l00150"></a>00150
<a name="l00151"></a><a class="code" href="classstk_1_1BlitSquare.html#a7df894d40b3d6effbb2a09819356258d">00151</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BlitSquare.html#a04366d55cecb4c8a726ea0519683d817" title="Compute and return one output sample.">BlitSquare :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00152"></a>00152 {
<a name="l00153"></a>00153 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00154"></a>00154 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00155"></a>00155 oStream_ &lt;&lt; <span class="stringliteral">&quot;BlitSquare::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00156"></a>00156 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00157"></a>00157 }
<a name="l00158"></a>00158 <span class="preprocessor">#endif</span>
<a name="l00159"></a>00159 <span class="preprocessor"></span>
<a name="l00160"></a>00160 StkFloat *samples = &amp;frames[channel];
<a name="l00161"></a>00161 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00162"></a>00162 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00163"></a>00163 *samples = <a class="code" href="classstk_1_1BlitSquare.html#a04366d55cecb4c8a726ea0519683d817" title="Compute and return one output sample.">BlitSquare::tick</a>();
<a name="l00164"></a>00164
<a name="l00165"></a>00165 <span class="keywordflow">return</span> frames;
<a name="l00166"></a>00166 }
<a name="l00167"></a>00167
<a name="l00168"></a>00168 } <span class="comment">// stk namespace</span>
<a name="l00169"></a>00169
<a name="l00170"></a>00170 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,64 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Blit.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00022"></a>00022 <span class="comment">/***************************************************/</span>
<a name="l00023"></a>00023
<a name="l00024"></a>00024 <span class="preprocessor">#ifndef STK_BLIT_H</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define STK_BLIT_H</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "Generator.h"</span>
<a name="l00028"></a>00028
<a name="l00029"></a><a class="code" href="classBlit.html">00029</a> <span class="keyword">class </span><a class="code" href="classBlit.html">Blit</a>: <span class="keyword">public</span> <a class="code" href="classGenerator.html">Generator</a>
<a name="l00030"></a>00030 {
<a name="l00031"></a>00031 <span class="keyword">public</span>:
<a name="l00033"></a>00033 <a class="code" href="classBlit.html#a0">Blit</a>( StkFloat frequency = 220.0 );
<a name="l00034"></a>00034
<a name="l00036"></a>00036 <a class="code" href="classBlit.html#a1">~Blit</a>();
<a name="l00037"></a>00037
<a name="l00039"></a>00039 <span class="keywordtype">void</span> <a class="code" href="classBlit.html#a2">reset</a>();
<a name="l00040"></a>00040
<a name="l00042"></a>00042
<a name="l00045"></a><a class="code" href="classBlit.html#a3">00045</a> <span class="keywordtype">void</span> <a class="code" href="classBlit.html#a3">setPhase</a>( StkFloat phase ) { phase_ = PI * phase; };
<a name="l00046"></a>00046
<a name="l00048"></a>00048
<a name="l00051"></a><a class="code" href="classBlit.html#a4">00051</a> StkFloat <a class="code" href="classBlit.html#a4">getPhase</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> phase_ / PI; };
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <span class="keywordtype">void</span> <a class="code" href="classBlit.html#a5">setFrequency</a>( StkFloat frequency );
<a name="l00055"></a>00055
<a name="l00057"></a>00057
<a name="l00069"></a>00069 <span class="keywordtype">void</span> <a class="code" href="classBlit.html#a6">setHarmonics</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics = 0 );
<a name="l00070"></a>00070
<a name="l00071"></a>00071 <span class="keyword">protected</span>:
<a name="l00072"></a>00072
<a name="l00073"></a>00073 <span class="keywordtype">void</span> updateHarmonics( <span class="keywordtype">void</span> );
<a name="l00074"></a>00074 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00075"></a>00075
<a name="l00076"></a>00076 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics_;
<a name="l00077"></a>00077 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_;
<a name="l00078"></a>00078 StkFloat rate_;
<a name="l00079"></a>00079 StkFloat phase_;
<a name="l00080"></a>00080 StkFloat p_;
<a name="l00081"></a>00081
<a name="l00082"></a>00082 };
<a name="l00083"></a>00083
<a name="l00084"></a>00084 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,124 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Blit.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BLIT_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BLIT_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Generator.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &lt;limits&gt;</span>
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="keyword">namespace </span>stk {
<a name="l00009"></a>00009
<a name="l00010"></a>00010 <span class="comment">/***************************************************/</span>
<a name="l00031"></a>00031 <span class="comment">/***************************************************/</span>
<a name="l00032"></a>00032
<a name="l00033"></a><a class="code" href="classstk_1_1Blit.html">00033</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Blit.html" title="STK band-limited impulse train class.">Blit</a>: <span class="keyword">public</span> <a class="code" href="classstk_1_1Generator.html" title="STK abstract unit generator parent class.">Generator</a>
<a name="l00034"></a>00034 {
<a name="l00035"></a>00035 <span class="keyword">public</span>:
<a name="l00037"></a>00037 <a class="code" href="classstk_1_1Blit.html#a63c5e6dca28aa3b3c01808e049f3da33" title="Default constructor that initializes BLIT frequency to 220 Hz.">Blit</a>( StkFloat frequency = 220.0 );
<a name="l00038"></a>00038
<a name="l00040"></a>00040 <a class="code" href="classstk_1_1Blit.html#abed25206cc6cdb5fa8d667e7db0056a9" title="Class destructor.">~Blit</a>();
<a name="l00041"></a>00041
<a name="l00043"></a>00043 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Blit.html#abbe50319cd6ed762c15e148a8abb4920" title="Resets the oscillator state and phase to 0.">reset</a>();
<a name="l00044"></a>00044
<a name="l00046"></a>00046
<a name="l00049"></a><a class="code" href="classstk_1_1Blit.html#a58e2197cedfc366145b729256bf365cb">00049</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Blit.html#a58e2197cedfc366145b729256bf365cb" title="Set the phase of the signal.">setPhase</a>( StkFloat phase ) { phase_ = PI * phase; };
<a name="l00050"></a>00050
<a name="l00052"></a>00052
<a name="l00055"></a><a class="code" href="classstk_1_1Blit.html#a01fb40970e8905e47b7f39a1fb01589f">00055</a> StkFloat <a class="code" href="classstk_1_1Blit.html#a01fb40970e8905e47b7f39a1fb01589f" title="Get the current phase of the signal.">getPhase</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> phase_ / PI; };
<a name="l00056"></a>00056
<a name="l00058"></a>00058 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Blit.html#a5571562e489947c4beccc206ecccfbdd" title="Set the impulse train rate in terms of a frequency in Hz.">setFrequency</a>( StkFloat frequency );
<a name="l00059"></a>00059
<a name="l00061"></a>00061
<a name="l00073"></a>00073 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Blit.html#a5a1fd506ab12ae614afaf0e402d24d30" title="Set the number of harmonics generated in the signal.">setHarmonics</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics = 0 );
<a name="l00074"></a>00074
<a name="l00076"></a><a class="code" href="classstk_1_1Blit.html#a530af82a27731734af4f4b58bce283de">00076</a> StkFloat <a class="code" href="classstk_1_1Blit.html#a530af82a27731734af4f4b58bce283de" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00077"></a>00077
<a name="l00079"></a>00079 StkFloat <a class="code" href="classstk_1_1Blit.html#a528b8dc95499b11d6173cf065d62c717" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">void</span> );
<a name="l00080"></a>00080
<a name="l00082"></a>00082
<a name="l00089"></a>00089 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Blit.html#a528b8dc95499b11d6173cf065d62c717" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00090"></a>00090
<a name="l00091"></a>00091 <span class="keyword">protected</span>:
<a name="l00092"></a>00092
<a name="l00093"></a>00093 <span class="keywordtype">void</span> updateHarmonics( <span class="keywordtype">void</span> );
<a name="l00094"></a>00094
<a name="l00095"></a>00095 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nHarmonics_;
<a name="l00096"></a>00096 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_;
<a name="l00097"></a>00097 StkFloat rate_;
<a name="l00098"></a>00098 StkFloat phase_;
<a name="l00099"></a>00099 StkFloat p_;
<a name="l00100"></a>00100
<a name="l00101"></a>00101 };
<a name="l00102"></a>00102
<a name="l00103"></a><a class="code" href="classstk_1_1Blit.html#a528b8dc95499b11d6173cf065d62c717">00103</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Blit.html#a528b8dc95499b11d6173cf065d62c717" title="Compute and return one output sample.">Blit :: tick</a>( <span class="keywordtype">void</span> )
<a name="l00104"></a>00104 {
<a name="l00105"></a>00105 <span class="comment">// The code below implements the SincM algorithm of Stilson and</span>
<a name="l00106"></a>00106 <span class="comment">// Smith with an additional scale factor of P / M applied to</span>
<a name="l00107"></a>00107 <span class="comment">// normalize the output.</span>
<a name="l00108"></a>00108
<a name="l00109"></a>00109 <span class="comment">// A fully optimized version of this code would replace the two sin</span>
<a name="l00110"></a>00110 <span class="comment">// calls with a pair of fast sin oscillators, for which stable fast</span>
<a name="l00111"></a>00111 <span class="comment">// two-multiply algorithms are well known. In the spirit of STK,</span>
<a name="l00112"></a>00112 <span class="comment">// which favors clarity over performance, the optimization has not</span>
<a name="l00113"></a>00113 <span class="comment">// been made here.</span>
<a name="l00114"></a>00114
<a name="l00115"></a>00115 <span class="comment">// Avoid a divide by zero at the sinc peak, which has a limiting</span>
<a name="l00116"></a>00116 <span class="comment">// value of 1.0.</span>
<a name="l00117"></a>00117 StkFloat tmp, denominator = sin( phase_ );
<a name="l00118"></a>00118 <span class="keywordflow">if</span> ( denominator &lt;= std::numeric_limits&lt;StkFloat&gt;::epsilon() )
<a name="l00119"></a>00119 tmp = 1.0;
<a name="l00120"></a>00120 <span class="keywordflow">else</span> {
<a name="l00121"></a>00121 tmp = sin( m_ * phase_ );
<a name="l00122"></a>00122 tmp /= m_ * denominator;
<a name="l00123"></a>00123 }
<a name="l00124"></a>00124
<a name="l00125"></a>00125 phase_ += rate_;
<a name="l00126"></a>00126 <span class="keywordflow">if</span> ( phase_ &gt;= PI ) phase_ -= PI;
<a name="l00127"></a>00127
<a name="l00128"></a>00128 lastFrame_[0] = tmp;
<a name="l00129"></a>00129 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00130"></a>00130 }
<a name="l00131"></a>00131
<a name="l00132"></a><a class="code" href="classstk_1_1Blit.html#a20a3634131ff890641931c1d04df19ad">00132</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Blit.html#a528b8dc95499b11d6173cf065d62c717" title="Compute and return one output sample.">Blit :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00133"></a>00133 {
<a name="l00134"></a>00134 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00135"></a>00135 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00136"></a>00136 oStream_ &lt;&lt; <span class="stringliteral">&quot;Blit::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00137"></a>00137 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00138"></a>00138 }
<a name="l00139"></a>00139 <span class="preprocessor">#endif</span>
<a name="l00140"></a>00140 <span class="preprocessor"></span>
<a name="l00141"></a>00141 StkFloat *samples = &amp;frames[channel];
<a name="l00142"></a>00142 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00143"></a>00143 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00144"></a>00144 *samples = <a class="code" href="classstk_1_1Blit.html#a528b8dc95499b11d6173cf065d62c717" title="Compute and return one output sample.">Blit::tick</a>();
<a name="l00145"></a>00145
<a name="l00146"></a>00146 <span class="keywordflow">return</span> frames;
<a name="l00147"></a>00147 }
<a name="l00148"></a>00148
<a name="l00149"></a>00149 } <span class="comment">// stk namespace</span>
<a name="l00150"></a>00150
<a name="l00151"></a>00151 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,76 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>BlowBotl.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00017"></a>00017 <span class="comment">/***************************************************/</span>
<a name="l00018"></a>00018
<a name="l00019"></a>00019 <span class="preprocessor">#ifndef STK_BLOWBOTL_H</span>
<a name="l00020"></a>00020 <span class="preprocessor"></span><span class="preprocessor">#define STK_BLOWBOTL_H</span>
<a name="l00021"></a>00021 <span class="preprocessor"></span>
<a name="l00022"></a>00022 <span class="preprocessor">#include "Instrmnt.h"</span>
<a name="l00023"></a>00023 <span class="preprocessor">#include "JetTable.h"</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include "BiQuad.h"</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "PoleZero.h"</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include "Noise.h"</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "ADSR.h"</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "SineWave.h"</span>
<a name="l00029"></a>00029
<a name="l00030"></a><a class="code" href="classBlowBotl.html">00030</a> <span class="keyword">class </span><a class="code" href="classBlowBotl.html">BlowBotl</a> : <span class="keyword">public</span> <a class="code" href="classInstrmnt.html">Instrmnt</a>
<a name="l00031"></a>00031 {
<a name="l00032"></a>00032 <span class="keyword">public</span>:
<a name="l00034"></a>00034
<a name="l00037"></a>00037 <a class="code" href="classBlowBotl.html#a0">BlowBotl</a>();
<a name="l00038"></a>00038
<a name="l00040"></a>00040 <a class="code" href="classBlowBotl.html#a1">~BlowBotl</a>();
<a name="l00041"></a>00041
<a name="l00043"></a>00043 <span class="keywordtype">void</span> <a class="code" href="classBlowBotl.html#a2">clear</a>();
<a name="l00044"></a>00044
<a name="l00046"></a>00046 <span class="keywordtype">void</span> <a class="code" href="classBlowBotl.html#a3">setFrequency</a>(StkFloat frequency);
<a name="l00047"></a>00047
<a name="l00049"></a>00049 <span class="keywordtype">void</span> <a class="code" href="classBlowBotl.html#a4">startBlowing</a>(StkFloat amplitude, StkFloat rate);
<a name="l00050"></a>00050
<a name="l00052"></a>00052 <span class="keywordtype">void</span> <a class="code" href="classBlowBotl.html#a5">stopBlowing</a>(StkFloat rate);
<a name="l00053"></a>00053
<a name="l00055"></a>00055 <span class="keywordtype">void</span> <a class="code" href="classBlowBotl.html#a6">noteOn</a>(StkFloat frequency, StkFloat amplitude);
<a name="l00056"></a>00056
<a name="l00058"></a>00058 <span class="keywordtype">void</span> <a class="code" href="classBlowBotl.html#a7">noteOff</a>(StkFloat amplitude);
<a name="l00059"></a>00059
<a name="l00061"></a>00061 <span class="keywordtype">void</span> <a class="code" href="classBlowBotl.html#a8">controlChange</a>(<span class="keywordtype">int</span> number, StkFloat value);
<a name="l00062"></a>00062
<a name="l00063"></a>00063 <span class="keyword">protected</span>:
<a name="l00064"></a>00064
<a name="l00065"></a>00065 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00066"></a>00066
<a name="l00067"></a>00067 <a class="code" href="classJetTable.html">JetTable</a> jetTable_;
<a name="l00068"></a>00068 <a class="code" href="classBiQuad.html">BiQuad</a> resonator_;
<a name="l00069"></a>00069 <a class="code" href="classPoleZero.html">PoleZero</a> dcBlock_;
<a name="l00070"></a>00070 <a class="code" href="classNoise.html">Noise</a> noise_;
<a name="l00071"></a>00071 <a class="code" href="classADSR.html">ADSR</a> adsr_;
<a name="l00072"></a>00072 <a class="code" href="classSineWave.html">SineWave</a> vibrato_;
<a name="l00073"></a>00073 StkFloat maxPressure_;
<a name="l00074"></a>00074 StkFloat noiseGain_;
<a name="l00075"></a>00075 StkFloat vibratoGain_;
<a name="l00076"></a>00076 StkFloat outputGain_;
<a name="l00077"></a>00077
<a name="l00078"></a>00078 };
<a name="l00079"></a>00079
<a name="l00080"></a>00080 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,134 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>BlowBotl.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BLOWBOTL_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BLOWBOTL_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Instrmnt.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;JetTable.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;BiQuad.h&quot;</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;PoleZero.h&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;Noise.h&quot;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &quot;ADSR.h&quot;</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include &quot;SineWave.h&quot;</span>
<a name="l00011"></a>00011
<a name="l00012"></a>00012 <span class="keyword">namespace </span>stk {
<a name="l00013"></a>00013
<a name="l00014"></a>00014 <span class="comment">/***************************************************/</span>
<a name="l00030"></a>00030 <span class="comment">/***************************************************/</span>
<a name="l00031"></a>00031
<a name="l00032"></a><a class="code" href="classstk_1_1BlowBotl.html">00032</a> <span class="keyword">class </span><a class="code" href="classstk_1_1BlowBotl.html" title="STK blown bottle instrument class.">BlowBotl</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00033"></a>00033 {
<a name="l00034"></a>00034 <span class="keyword">public</span>:
<a name="l00036"></a>00036
<a name="l00039"></a>00039 <a class="code" href="classstk_1_1BlowBotl.html#aa505b4fc32ffe974b5840163395c321c" title="Class constructor.">BlowBotl</a>( <span class="keywordtype">void</span> );
<a name="l00040"></a>00040
<a name="l00042"></a>00042 <a class="code" href="classstk_1_1BlowBotl.html#adae826b0487471da1779761b0f885cb8" title="Class destructor.">~BlowBotl</a>( <span class="keywordtype">void</span> );
<a name="l00043"></a>00043
<a name="l00045"></a>00045 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowBotl.html#a271161f45e0a706d8ccd299f9aaf2ada" title="Reset and clear all internal state.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00046"></a>00046
<a name="l00048"></a>00048 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowBotl.html#a75b679cd641bb4bae9bc4ac3021a03e3" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00049"></a>00049
<a name="l00051"></a>00051 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowBotl.html#a926d428669edf9c87a1f88faf01550c4" title="Apply breath velocity to instrument with given amplitude and rate of increase.">startBlowing</a>( StkFloat amplitude, StkFloat rate );
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowBotl.html#a91a174c3501aafbbfe6841f6915fe4f3" title="Decrease breath velocity with given rate of decrease.">stopBlowing</a>( StkFloat rate );
<a name="l00055"></a>00055
<a name="l00057"></a>00057 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowBotl.html#afaf3f964cbdf99eddd7af99626169c02" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00058"></a>00058
<a name="l00060"></a>00060 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowBotl.html#a132c87a453ecf25301243dc62f57f587" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00061"></a>00061
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowBotl.html#a21a4b2aaaac7afcc67b4abe5ed833bfd" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value );
<a name="l00064"></a>00064
<a name="l00066"></a>00066 StkFloat <a class="code" href="classstk_1_1BlowBotl.html#a68501c2422994c8dca50086b3d944119" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00067"></a>00067
<a name="l00069"></a>00069
<a name="l00076"></a>00076 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BlowBotl.html#a68501c2422994c8dca50086b3d944119" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00077"></a>00077
<a name="l00078"></a>00078 <span class="keyword">protected</span>:
<a name="l00079"></a>00079
<a name="l00080"></a>00080 <a class="code" href="classstk_1_1JetTable.html" title="STK jet table class.">JetTable</a> jetTable_;
<a name="l00081"></a>00081 <a class="code" href="classstk_1_1BiQuad.html" title="STK biquad (two-pole, two-zero) filter class.">BiQuad</a> resonator_;
<a name="l00082"></a>00082 <a class="code" href="classstk_1_1PoleZero.html" title="STK one-pole, one-zero filter class.">PoleZero</a> dcBlock_;
<a name="l00083"></a>00083 <a class="code" href="classstk_1_1Noise.html" title="STK noise generator.">Noise</a> noise_;
<a name="l00084"></a>00084 <a class="code" href="classstk_1_1ADSR.html" title="STK ADSR envelope class.">ADSR</a> adsr_;
<a name="l00085"></a>00085 <a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> vibrato_;
<a name="l00086"></a>00086 StkFloat maxPressure_;
<a name="l00087"></a>00087 StkFloat noiseGain_;
<a name="l00088"></a>00088 StkFloat vibratoGain_;
<a name="l00089"></a>00089 StkFloat outputGain_;
<a name="l00090"></a>00090
<a name="l00091"></a>00091 };
<a name="l00092"></a>00092
<a name="l00093"></a><a class="code" href="classstk_1_1BlowBotl.html#a68501c2422994c8dca50086b3d944119">00093</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1BlowBotl.html#a68501c2422994c8dca50086b3d944119" title="Compute and return one output sample.">BlowBotl :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00094"></a>00094 {
<a name="l00095"></a>00095 StkFloat breathPressure;
<a name="l00096"></a>00096 StkFloat randPressure;
<a name="l00097"></a>00097 StkFloat pressureDiff;
<a name="l00098"></a>00098
<a name="l00099"></a>00099 <span class="comment">// Calculate the breath pressure (envelope + vibrato)</span>
<a name="l00100"></a>00100 breathPressure = maxPressure_ * adsr_.<a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975" title="Compute and return one output sample.">tick</a>();
<a name="l00101"></a>00101 breathPressure += vibratoGain_ * vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>();
<a name="l00102"></a>00102
<a name="l00103"></a>00103 pressureDiff = breathPressure - resonator_.<a class="code" href="classstk_1_1BiQuad.html#a412f224363b1a222423ecf0cd7be9063" title="Return the last computed output value.">lastOut</a>();
<a name="l00104"></a>00104
<a name="l00105"></a>00105 randPressure = noiseGain_ * noise_.<a class="code" href="classstk_1_1Noise.html#a8ac40f69475eb744e803d557e8438a6d" title="Compute and return one output sample.">tick</a>();
<a name="l00106"></a>00106 randPressure *= breathPressure;
<a name="l00107"></a>00107 randPressure *= (1.0 + pressureDiff);
<a name="l00108"></a>00108
<a name="l00109"></a>00109 resonator_.<a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635" title="Input one sample to the filter and return a reference to one output.">tick</a>( breathPressure + randPressure - ( jetTable_.<a class="code" href="classstk_1_1JetTable.html#a3fb5333e6305abdeee7cd83a10ef76b6" title="Take one sample input and map to one sample of output.">tick</a>( pressureDiff ) * pressureDiff ) );
<a name="l00110"></a>00110 lastFrame_[0] = 0.2 * outputGain_ * dcBlock_.<a class="code" href="classstk_1_1PoleZero.html#a1a29ac6f3a2b75e71693c73554599228" title="Input one sample to the filter and return one output.">tick</a>( pressureDiff );
<a name="l00111"></a>00111
<a name="l00112"></a>00112 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00113"></a>00113 }
<a name="l00114"></a>00114
<a name="l00115"></a><a class="code" href="classstk_1_1BlowBotl.html#a49e1f536d821a8b2bf133533cb4bc93e">00115</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BlowBotl.html#a68501c2422994c8dca50086b3d944119" title="Compute and return one output sample.">BlowBotl :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00116"></a>00116 {
<a name="l00117"></a>00117 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00118"></a>00118 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00119"></a>00119 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels ) {
<a name="l00120"></a>00120 oStream_ &lt;&lt; <span class="stringliteral">&quot;BlowBotl::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00121"></a>00121 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00122"></a>00122 }
<a name="l00123"></a>00123 <span class="preprocessor">#endif</span>
<a name="l00124"></a>00124 <span class="preprocessor"></span>
<a name="l00125"></a>00125 StkFloat *samples = &amp;frames[channel];
<a name="l00126"></a>00126 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00127"></a>00127 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00128"></a>00128 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00129"></a>00129 *samples++ = <a class="code" href="classstk_1_1BlowBotl.html#a68501c2422994c8dca50086b3d944119" title="Compute and return one output sample.">tick</a>();
<a name="l00130"></a>00130 }
<a name="l00131"></a>00131 <span class="keywordflow">else</span> {
<a name="l00132"></a>00132 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00133"></a>00133 *samples++ = <a class="code" href="classstk_1_1BlowBotl.html#a68501c2422994c8dca50086b3d944119" title="Compute and return one output sample.">tick</a>();
<a name="l00134"></a>00134 <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00135"></a>00135 *samples++ = lastFrame_[j];
<a name="l00136"></a>00136 }
<a name="l00137"></a>00137 }
<a name="l00138"></a>00138
<a name="l00139"></a>00139 <span class="keywordflow">return</span> frames;
<a name="l00140"></a>00140 }
<a name="l00141"></a>00141
<a name="l00142"></a>00142 } <span class="comment">// stk namespace</span>
<a name="l00143"></a>00143
<a name="l00144"></a>00144 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,86 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>BlowHole.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00034"></a>00034 <span class="comment">/***************************************************/</span>
<a name="l00035"></a>00035
<a name="l00036"></a>00036 <span class="preprocessor">#ifndef STK_BLOWHOLE_H</span>
<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define STK_BLOWHOLE_H</span>
<a name="l00038"></a>00038 <span class="preprocessor"></span>
<a name="l00039"></a>00039 <span class="preprocessor">#include "Instrmnt.h"</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include "DelayL.h"</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include "ReedTable.h"</span>
<a name="l00042"></a>00042 <span class="preprocessor">#include "OneZero.h"</span>
<a name="l00043"></a>00043 <span class="preprocessor">#include "PoleZero.h"</span>
<a name="l00044"></a>00044 <span class="preprocessor">#include "Envelope.h"</span>
<a name="l00045"></a>00045 <span class="preprocessor">#include "Noise.h"</span>
<a name="l00046"></a>00046 <span class="preprocessor">#include "SineWave.h"</span>
<a name="l00047"></a>00047
<a name="l00048"></a><a class="code" href="classBlowHole.html">00048</a> <span class="keyword">class </span><a class="code" href="classBlowHole.html">BlowHole</a> : <span class="keyword">public</span> <a class="code" href="classInstrmnt.html">Instrmnt</a>
<a name="l00049"></a>00049 {
<a name="l00050"></a>00050 <span class="keyword">public</span>:
<a name="l00052"></a>00052
<a name="l00055"></a>00055 <a class="code" href="classBlowHole.html#a0">BlowHole</a>(StkFloat lowestFrequency);
<a name="l00056"></a>00056
<a name="l00058"></a>00058 <a class="code" href="classBlowHole.html#a1">~BlowHole</a>();
<a name="l00059"></a>00059
<a name="l00061"></a>00061 <span class="keywordtype">void</span> <a class="code" href="classBlowHole.html#a2">clear</a>();
<a name="l00062"></a>00062
<a name="l00064"></a>00064 <span class="keywordtype">void</span> <a class="code" href="classBlowHole.html#a3">setFrequency</a>(StkFloat frequency);
<a name="l00065"></a>00065
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classBlowHole.html#a4">setTonehole</a>(StkFloat newValue);
<a name="l00068"></a>00068
<a name="l00070"></a>00070 <span class="keywordtype">void</span> <a class="code" href="classBlowHole.html#a5">setVent</a>(StkFloat newValue);
<a name="l00071"></a>00071
<a name="l00073"></a>00073 <span class="keywordtype">void</span> <a class="code" href="classBlowHole.html#a6">startBlowing</a>(StkFloat amplitude, StkFloat rate);
<a name="l00074"></a>00074
<a name="l00076"></a>00076 <span class="keywordtype">void</span> <a class="code" href="classBlowHole.html#a7">stopBlowing</a>(StkFloat rate);
<a name="l00077"></a>00077
<a name="l00079"></a>00079 <span class="keywordtype">void</span> <a class="code" href="classBlowHole.html#a8">noteOn</a>(StkFloat frequency, StkFloat amplitude);
<a name="l00080"></a>00080
<a name="l00082"></a>00082 <span class="keywordtype">void</span> <a class="code" href="classBlowHole.html#a9">noteOff</a>(StkFloat amplitude);
<a name="l00083"></a>00083
<a name="l00085"></a>00085 <span class="keywordtype">void</span> <a class="code" href="classBlowHole.html#a10">controlChange</a>(<span class="keywordtype">int</span> number, StkFloat value);
<a name="l00086"></a>00086
<a name="l00087"></a>00087 <span class="keyword">protected</span>:
<a name="l00088"></a>00088
<a name="l00089"></a>00089 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00090"></a>00090
<a name="l00091"></a>00091 <a class="code" href="classDelayL.html">DelayL</a> delays_[3];
<a name="l00092"></a>00092 <a class="code" href="classReedTable.html">ReedTable</a> reedTable_;
<a name="l00093"></a>00093 <a class="code" href="classOneZero.html">OneZero</a> filter_;
<a name="l00094"></a>00094 <a class="code" href="classPoleZero.html">PoleZero</a> tonehole_;
<a name="l00095"></a>00095 <a class="code" href="classPoleZero.html">PoleZero</a> vent_;
<a name="l00096"></a>00096 <a class="code" href="classEnvelope.html">Envelope</a> envelope_;
<a name="l00097"></a>00097 <a class="code" href="classNoise.html">Noise</a> noise_;
<a name="l00098"></a>00098 <a class="code" href="classSineWave.html">SineWave</a> vibrato_;
<a name="l00099"></a>00099 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> length_;
<a name="l00100"></a>00100 StkFloat scatter_;
<a name="l00101"></a>00101 StkFloat thCoeff_;
<a name="l00102"></a>00102 StkFloat rhGain_;
<a name="l00103"></a>00103 StkFloat outputGain_;
<a name="l00104"></a>00104 StkFloat noiseGain_;
<a name="l00105"></a>00105 StkFloat vibratoGain_;
<a name="l00106"></a>00106
<a name="l00107"></a>00107 };
<a name="l00108"></a>00108
<a name="l00109"></a>00109 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,156 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>BlowHole.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BLOWHOLE_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BLOWHOLE_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Instrmnt.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;DelayL.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;ReedTable.h&quot;</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;OneZero.h&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;PoleZero.h&quot;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &quot;Envelope.h&quot;</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include &quot;Noise.h&quot;</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &quot;SineWave.h&quot;</span>
<a name="l00012"></a>00012
<a name="l00013"></a>00013 <span class="keyword">namespace </span>stk {
<a name="l00014"></a>00014
<a name="l00015"></a>00015 <span class="comment">/***************************************************/</span>
<a name="l00048"></a>00048 <span class="comment">/***************************************************/</span>
<a name="l00049"></a>00049
<a name="l00050"></a><a class="code" href="classstk_1_1BlowHole.html">00050</a> <span class="keyword">class </span><a class="code" href="classstk_1_1BlowHole.html" title="STK clarinet physical model with one register hole and one tonehole.">BlowHole</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00051"></a>00051 {
<a name="l00052"></a>00052 <span class="keyword">public</span>:
<a name="l00054"></a>00054
<a name="l00057"></a>00057 <a class="code" href="classstk_1_1BlowHole.html#a7f0aed9f79544d930c7f91dfa3e0efd9" title="Class constructor.">BlowHole</a>( StkFloat lowestFrequency );
<a name="l00058"></a>00058
<a name="l00060"></a>00060 <a class="code" href="classstk_1_1BlowHole.html#a691a14023e9283d12b0105dd886fba86" title="Class destructor.">~BlowHole</a>( <span class="keywordtype">void</span> );
<a name="l00061"></a>00061
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowHole.html#a43b829201197f2d0f0e8a72072e6798a" title="Reset and clear all internal state.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00064"></a>00064
<a name="l00066"></a>00066 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowHole.html#a023aa77cd11c9dc3a8013242ff92f982" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00067"></a>00067
<a name="l00069"></a>00069 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowHole.html#aaacb152624133d82e311b9e0b8218289" title="Set the tonehole state (0.0 = closed, 1.0 = fully open).">setTonehole</a>( StkFloat newValue );
<a name="l00070"></a>00070
<a name="l00072"></a>00072 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowHole.html#a11c8a4a8483acf0f3e73c1d00008daff" title="Set the register hole state (0.0 = closed, 1.0 = fully open).">setVent</a>( StkFloat newValue );
<a name="l00073"></a>00073
<a name="l00075"></a>00075 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowHole.html#a1be64a601f2fbc8e9efaec5a53c55866" title="Apply breath pressure to instrument with given amplitude and rate of increase.">startBlowing</a>( StkFloat amplitude, StkFloat rate );
<a name="l00076"></a>00076
<a name="l00078"></a>00078 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowHole.html#aeb4dfd7d75b1996e15833c0928ed39c4" title="Decrease breath pressure with given rate of decrease.">stopBlowing</a>( StkFloat rate );
<a name="l00079"></a>00079
<a name="l00081"></a>00081 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowHole.html#a67e071cb26c1bba35e32f168d59b9be1" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00082"></a>00082
<a name="l00084"></a>00084 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowHole.html#abc3743ac2c8a9620c44cca41ce73e5b0" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00085"></a>00085
<a name="l00087"></a>00087 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BlowHole.html#a0d8ad0201c455894acb1416ffb21614b" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value );
<a name="l00088"></a>00088
<a name="l00090"></a>00090 StkFloat <a class="code" href="classstk_1_1BlowHole.html#a3438c72b975481dae7d51f33f6f6fd94" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00091"></a>00091
<a name="l00093"></a>00093
<a name="l00100"></a>00100 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BlowHole.html#a3438c72b975481dae7d51f33f6f6fd94" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00101"></a>00101
<a name="l00102"></a>00102 <span class="keyword">protected</span>:
<a name="l00103"></a>00103
<a name="l00104"></a>00104 <a class="code" href="classstk_1_1DelayL.html" title="STK linear interpolating delay line class.">DelayL</a> delays_[3];
<a name="l00105"></a>00105 <a class="code" href="classstk_1_1ReedTable.html" title="STK reed table class.">ReedTable</a> reedTable_;
<a name="l00106"></a>00106 <a class="code" href="classstk_1_1OneZero.html" title="STK one-zero filter class.">OneZero</a> filter_;
<a name="l00107"></a>00107 <a class="code" href="classstk_1_1PoleZero.html" title="STK one-pole, one-zero filter class.">PoleZero</a> tonehole_;
<a name="l00108"></a>00108 <a class="code" href="classstk_1_1PoleZero.html" title="STK one-pole, one-zero filter class.">PoleZero</a> vent_;
<a name="l00109"></a>00109 <a class="code" href="classstk_1_1Envelope.html" title="STK linear line envelope class.">Envelope</a> envelope_;
<a name="l00110"></a>00110 <a class="code" href="classstk_1_1Noise.html" title="STK noise generator.">Noise</a> noise_;
<a name="l00111"></a>00111 <a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> vibrato_;
<a name="l00112"></a>00112
<a name="l00113"></a>00113 StkFloat scatter_;
<a name="l00114"></a>00114 StkFloat thCoeff_;
<a name="l00115"></a>00115 StkFloat rhGain_;
<a name="l00116"></a>00116 StkFloat outputGain_;
<a name="l00117"></a>00117 StkFloat noiseGain_;
<a name="l00118"></a>00118 StkFloat vibratoGain_;
<a name="l00119"></a>00119 };
<a name="l00120"></a>00120
<a name="l00121"></a><a class="code" href="classstk_1_1BlowHole.html#a3438c72b975481dae7d51f33f6f6fd94">00121</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1BlowHole.html#a3438c72b975481dae7d51f33f6f6fd94" title="Compute and return one output sample.">BlowHole :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00122"></a>00122 {
<a name="l00123"></a>00123 StkFloat pressureDiff;
<a name="l00124"></a>00124 StkFloat breathPressure;
<a name="l00125"></a>00125 StkFloat temp;
<a name="l00126"></a>00126
<a name="l00127"></a>00127 <span class="comment">// Calculate the breath pressure (envelope + noise + vibrato)</span>
<a name="l00128"></a>00128 breathPressure = envelope_.<a class="code" href="classstk_1_1Envelope.html#a8de91b9caf10a03f52bd2247648c4601" title="Compute and return one output sample.">tick</a>();
<a name="l00129"></a>00129 breathPressure += breathPressure * noiseGain_ * noise_.<a class="code" href="classstk_1_1Noise.html#a8ac40f69475eb744e803d557e8438a6d" title="Compute and return one output sample.">tick</a>();
<a name="l00130"></a>00130 breathPressure += breathPressure * vibratoGain_ * vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>();
<a name="l00131"></a>00131
<a name="l00132"></a>00132 <span class="comment">// Calculate the differential pressure = reflected - mouthpiece pressures</span>
<a name="l00133"></a>00133 pressureDiff = delays_[0].<a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9" title="Return the last computed output value.">lastOut</a>() - breathPressure;
<a name="l00134"></a>00134
<a name="l00135"></a>00135 <span class="comment">// Do two-port junction scattering for register vent</span>
<a name="l00136"></a>00136 StkFloat pa = breathPressure + pressureDiff * reedTable_.<a class="code" href="classstk_1_1ReedTable.html#a3c1607ed5712e2ab010d8c5e55e431f2" title="Take one sample input and map to one sample of output.">tick</a>( pressureDiff );
<a name="l00137"></a>00137 StkFloat pb = delays_[1].<a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9" title="Return the last computed output value.">lastOut</a>();
<a name="l00138"></a>00138 vent_.<a class="code" href="classstk_1_1PoleZero.html#a1a29ac6f3a2b75e71693c73554599228" title="Input one sample to the filter and return one output.">tick</a>( pa+pb );
<a name="l00139"></a>00139
<a name="l00140"></a>00140 lastFrame_[0] = delays_[0].<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( vent_.<a class="code" href="classstk_1_1PoleZero.html#a03edf036d1619bb5d33bb41701833232" title="Return the last computed output value.">lastOut</a>()+pb );
<a name="l00141"></a>00141 lastFrame_[0] *= outputGain_;
<a name="l00142"></a>00142
<a name="l00143"></a>00143 <span class="comment">// Do three-port junction scattering (under tonehole)</span>
<a name="l00144"></a>00144 pa += vent_.<a class="code" href="classstk_1_1PoleZero.html#a03edf036d1619bb5d33bb41701833232" title="Return the last computed output value.">lastOut</a>();
<a name="l00145"></a>00145 pb = delays_[2].<a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9" title="Return the last computed output value.">lastOut</a>();
<a name="l00146"></a>00146 StkFloat pth = tonehole_.<a class="code" href="classstk_1_1PoleZero.html#a03edf036d1619bb5d33bb41701833232" title="Return the last computed output value.">lastOut</a>();
<a name="l00147"></a>00147 temp = scatter_ * (pa + pb - 2 * pth);
<a name="l00148"></a>00148
<a name="l00149"></a>00149 delays_[2].<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( filter_.<a class="code" href="classstk_1_1OneZero.html#a9f52fa395257b15cb7351c6ccb2199da" title="Input one sample to the filter and return one output.">tick</a>(pa + temp) * -0.95 );
<a name="l00150"></a>00150 delays_[1].<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( pb + temp );
<a name="l00151"></a>00151 tonehole_.<a class="code" href="classstk_1_1PoleZero.html#a1a29ac6f3a2b75e71693c73554599228" title="Input one sample to the filter and return one output.">tick</a>( pa + pb - pth + temp );
<a name="l00152"></a>00152
<a name="l00153"></a>00153 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00154"></a>00154 }
<a name="l00155"></a>00155
<a name="l00156"></a><a class="code" href="classstk_1_1BlowHole.html#ad220cd597fa5f6edd043c0783bdc2ec7">00156</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BlowHole.html#a3438c72b975481dae7d51f33f6f6fd94" title="Compute and return one output sample.">BlowHole :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00157"></a>00157 {
<a name="l00158"></a>00158 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00159"></a>00159 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00160"></a>00160 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels ) {
<a name="l00161"></a>00161 oStream_ &lt;&lt; <span class="stringliteral">&quot;BlowHole::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00162"></a>00162 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00163"></a>00163 }
<a name="l00164"></a>00164 <span class="preprocessor">#endif</span>
<a name="l00165"></a>00165 <span class="preprocessor"></span>
<a name="l00166"></a>00166 StkFloat *samples = &amp;frames[channel];
<a name="l00167"></a>00167 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00168"></a>00168 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00169"></a>00169 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00170"></a>00170 *samples++ = <a class="code" href="classstk_1_1BlowHole.html#a3438c72b975481dae7d51f33f6f6fd94" title="Compute and return one output sample.">tick</a>();
<a name="l00171"></a>00171 }
<a name="l00172"></a>00172 <span class="keywordflow">else</span> {
<a name="l00173"></a>00173 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00174"></a>00174 *samples++ = <a class="code" href="classstk_1_1BlowHole.html#a3438c72b975481dae7d51f33f6f6fd94" title="Compute and return one output sample.">tick</a>();
<a name="l00175"></a>00175 <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00176"></a>00176 *samples++ = lastFrame_[j];
<a name="l00177"></a>00177 }
<a name="l00178"></a>00178 }
<a name="l00179"></a>00179
<a name="l00180"></a>00180 <span class="keywordflow">return</span> frames;
<a name="l00181"></a>00181 }
<a name="l00182"></a>00182
<a name="l00183"></a>00183 } <span class="comment">// stk namespace</span>
<a name="l00184"></a>00184
<a name="l00185"></a>00185 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,53 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>BowTable.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00010"></a>00010 <span class="comment">/***************************************************/</span>
<a name="l00011"></a>00011
<a name="l00012"></a>00012 <span class="preprocessor">#ifndef STK_BOWTABL_H</span>
<a name="l00013"></a>00013 <span class="preprocessor"></span><span class="preprocessor">#define STK_BOWTABL_H</span>
<a name="l00014"></a>00014 <span class="preprocessor"></span>
<a name="l00015"></a>00015 <span class="preprocessor">#include "Function.h"</span>
<a name="l00016"></a>00016
<a name="l00017"></a><a class="code" href="classBowTable.html">00017</a> <span class="keyword">class </span><a class="code" href="classBowTable.html">BowTable</a> : <span class="keyword">public</span> <a class="code" href="classFunction.html">Function</a>
<a name="l00018"></a>00018 {
<a name="l00019"></a>00019 <span class="keyword">public</span>:
<a name="l00021"></a>00021 <a class="code" href="classBowTable.html#a0">BowTable</a>();
<a name="l00022"></a>00022
<a name="l00024"></a>00024 <a class="code" href="classBowTable.html#a1">~BowTable</a>();
<a name="l00025"></a>00025
<a name="l00027"></a>00027
<a name="l00033"></a>00033 <span class="keywordtype">void</span> <a class="code" href="classBowTable.html#a2">setOffset</a>(StkFloat offset);
<a name="l00034"></a>00034
<a name="l00036"></a>00036
<a name="l00040"></a>00040 <span class="keywordtype">void</span> <a class="code" href="classBowTable.html#a3">setSlope</a>(StkFloat slope);
<a name="l00041"></a>00041
<a name="l00042"></a>00042 <span class="keyword">protected</span>:
<a name="l00043"></a>00043
<a name="l00044"></a>00044 StkFloat computeSample( StkFloat input );
<a name="l00045"></a>00045
<a name="l00046"></a>00046 StkFloat offset_;
<a name="l00047"></a>00047 StkFloat slope_;
<a name="l00048"></a>00048
<a name="l00049"></a>00049 };
<a name="l00050"></a>00050
<a name="l00051"></a>00051 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,134 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>BowTable.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BOWTABL_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BOWTABL_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Function.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00006"></a>00006
<a name="l00007"></a>00007 <span class="keyword">namespace </span>stk {
<a name="l00008"></a>00008
<a name="l00009"></a>00009 <span class="comment">/***************************************************/</span>
<a name="l00020"></a>00020 <span class="comment">/***************************************************/</span>
<a name="l00021"></a>00021
<a name="l00022"></a><a class="code" href="classstk_1_1BowTable.html">00022</a> <span class="keyword">class </span><a class="code" href="classstk_1_1BowTable.html" title="STK bowed string table class.">BowTable</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Function.html" title="STK abstract function parent class.">Function</a>
<a name="l00023"></a>00023 {
<a name="l00024"></a>00024 <span class="keyword">public</span>:
<a name="l00026"></a><a class="code" href="classstk_1_1BowTable.html#a25d0985fd6821a7e1608af1e8f51952a">00026</a> <a class="code" href="classstk_1_1BowTable.html#a25d0985fd6821a7e1608af1e8f51952a" title="Default constructor.">BowTable</a>( <span class="keywordtype">void</span> ) : offset_(0.0), slope_(0.1), minOutput_(0.01), maxOutput_(0.98) {};
<a name="l00027"></a>00027
<a name="l00029"></a>00029
<a name="l00035"></a><a class="code" href="classstk_1_1BowTable.html#a9adcc3c36085b73d3b877828071a3b2c">00035</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BowTable.html#a9adcc3c36085b73d3b877828071a3b2c" title="Set the table offset value.">setOffset</a>( StkFloat offset ) { offset_ = offset; };
<a name="l00036"></a>00036
<a name="l00038"></a>00038
<a name="l00042"></a><a class="code" href="classstk_1_1BowTable.html#ad8391e46941ff9f49b78bf4f77c35143">00042</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BowTable.html#ad8391e46941ff9f49b78bf4f77c35143" title="Set the table slope value.">setSlope</a>( StkFloat slope ) { slope_ = slope; };
<a name="l00043"></a>00043
<a name="l00045"></a><a class="code" href="classstk_1_1BowTable.html#a9540d5c56cfd4556ab25c25f0612b25d">00045</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BowTable.html#a9540d5c56cfd4556ab25c25f0612b25d" title="Set the minimum table output value (0.0 - 1.0).">setMinOutput</a>( StkFloat minimum ) { minOutput_ = minimum; };
<a name="l00046"></a>00046
<a name="l00048"></a><a class="code" href="classstk_1_1BowTable.html#a634d5063eba886445f4057c823b00ff7">00048</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1BowTable.html#a634d5063eba886445f4057c823b00ff7" title="Set the maximum table output value (0.0 - 1.0).">setMaxOutput</a>( StkFloat maximum ) { maxOutput_ = maximum; };
<a name="l00049"></a>00049
<a name="l00051"></a>00051 StkFloat <a class="code" href="classstk_1_1BowTable.html#a8dc58c69ecda1471dce6d142cb5f4b19" title="Take one sample input and map to one sample of output.">tick</a>( StkFloat input );
<a name="l00052"></a>00052
<a name="l00054"></a>00054
<a name="l00062"></a>00062 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BowTable.html#a8dc58c69ecda1471dce6d142cb5f4b19" title="Take one sample input and map to one sample of output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00063"></a>00063
<a name="l00065"></a>00065
<a name="l00073"></a>00073 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BowTable.html#a8dc58c69ecda1471dce6d142cb5f4b19" title="Take one sample input and map to one sample of output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> &amp;oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel = 0 );
<a name="l00074"></a>00074
<a name="l00075"></a>00075 <span class="keyword">protected</span>:
<a name="l00076"></a>00076
<a name="l00077"></a>00077 StkFloat offset_;
<a name="l00078"></a>00078 StkFloat slope_;
<a name="l00079"></a>00079 StkFloat minOutput_;
<a name="l00080"></a>00080 StkFloat maxOutput_;
<a name="l00081"></a>00081
<a name="l00082"></a>00082 };
<a name="l00083"></a>00083
<a name="l00084"></a><a class="code" href="classstk_1_1BowTable.html#a8dc58c69ecda1471dce6d142cb5f4b19">00084</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1BowTable.html#a8dc58c69ecda1471dce6d142cb5f4b19" title="Take one sample input and map to one sample of output.">BowTable :: tick</a>( StkFloat input )
<a name="l00085"></a>00085 {
<a name="l00086"></a>00086 <span class="comment">// The input represents differential string vs. bow velocity.</span>
<a name="l00087"></a>00087 StkFloat sample = input + offset_; <span class="comment">// add bias to input</span>
<a name="l00088"></a>00088 sample *= slope_; <span class="comment">// then scale it</span>
<a name="l00089"></a>00089 lastFrame_[0] = (StkFloat) fabs( (<span class="keywordtype">double</span>) sample ) + (StkFloat) 0.75;
<a name="l00090"></a>00090 lastFrame_[0] = (StkFloat) pow( lastFrame_[0], (StkFloat) -4.0 );
<a name="l00091"></a>00091
<a name="l00092"></a>00092 <span class="comment">// Set minimum threshold</span>
<a name="l00093"></a>00093 <span class="keywordflow">if</span> ( lastFrame_[0] &lt; minOutput_ ) lastFrame_[0] = minOutput_;
<a name="l00094"></a>00094
<a name="l00095"></a>00095 <span class="comment">// Set maximum threshold</span>
<a name="l00096"></a>00096 <span class="keywordflow">if</span> ( lastFrame_[0] &gt; maxOutput_ ) lastFrame_[0] = maxOutput_;
<a name="l00097"></a>00097
<a name="l00098"></a>00098 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00099"></a>00099 }
<a name="l00100"></a>00100
<a name="l00101"></a><a class="code" href="classstk_1_1BowTable.html#a8ad2766def014b62dcbbd8765e133246">00101</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BowTable.html#a8dc58c69ecda1471dce6d142cb5f4b19" title="Take one sample input and map to one sample of output.">BowTable :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00102"></a>00102 {
<a name="l00103"></a>00103 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00104"></a>00104 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00105"></a>00105 oStream_ &lt;&lt; <span class="stringliteral">&quot;BowTable::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00106"></a>00106 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00107"></a>00107 }
<a name="l00108"></a>00108 <span class="preprocessor">#endif</span>
<a name="l00109"></a>00109 <span class="preprocessor"></span>
<a name="l00110"></a>00110 StkFloat *samples = &amp;frames[channel];
<a name="l00111"></a>00111 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00112"></a>00112 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00113"></a>00113 *samples = *samples + offset_;
<a name="l00114"></a>00114 *samples *= slope_;
<a name="l00115"></a>00115 *samples = (StkFloat) fabs( (<span class="keywordtype">double</span>) *samples ) + 0.75;
<a name="l00116"></a>00116 *samples = (StkFloat) pow( *samples, (StkFloat) -4.0 );
<a name="l00117"></a>00117 <span class="keywordflow">if</span> ( *samples &gt; 1.0) *samples = 1.0;
<a name="l00118"></a>00118 }
<a name="l00119"></a>00119
<a name="l00120"></a>00120 lastFrame_[0] = *(samples-hop);
<a name="l00121"></a>00121 <span class="keywordflow">return</span> frames;
<a name="l00122"></a>00122 }
<a name="l00123"></a>00123
<a name="l00124"></a><a class="code" href="classstk_1_1BowTable.html#aaf72f823f210b18f417337ac7181cde5">00124</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1BowTable.html#a8dc58c69ecda1471dce6d142cb5f4b19" title="Take one sample input and map to one sample of output.">BowTable :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel )
<a name="l00125"></a>00125 {
<a name="l00126"></a>00126 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00127"></a>00127 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( iChannel &gt;= iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() || oChannel &gt;= oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00128"></a>00128 oStream_ &lt;&lt; <span class="stringliteral">&quot;BowTable::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00129"></a>00129 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00130"></a>00130 }
<a name="l00131"></a>00131 <span class="preprocessor">#endif</span>
<a name="l00132"></a>00132 <span class="preprocessor"></span>
<a name="l00133"></a>00133 StkFloat *iSamples = &amp;iFrames[iChannel];
<a name="l00134"></a>00134 StkFloat *oSamples = &amp;oFrames[oChannel];
<a name="l00135"></a>00135 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iHop = iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(), oHop = oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00136"></a>00136 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;iFrames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, iSamples += iHop, oSamples += oHop ) {
<a name="l00137"></a>00137 *oSamples = *iSamples + offset_;
<a name="l00138"></a>00138 *oSamples *= slope_;
<a name="l00139"></a>00139 *oSamples = (StkFloat) fabs( (<span class="keywordtype">double</span>) *oSamples ) + 0.75;
<a name="l00140"></a>00140 *oSamples = (StkFloat) pow( *oSamples, (StkFloat) -4.0 );
<a name="l00141"></a>00141 <span class="keywordflow">if</span> ( *oSamples &gt; 1.0) *oSamples = 1.0;
<a name="l00142"></a>00142 }
<a name="l00143"></a>00143
<a name="l00144"></a>00144 lastFrame_[0] = *(oSamples-oHop);
<a name="l00145"></a>00145 <span class="keywordflow">return</span> iFrames;
<a name="l00146"></a>00146 }
<a name="l00147"></a>00147
<a name="l00148"></a>00148 } <span class="comment">// stk namespace</span>
<a name="l00149"></a>00149
<a name="l00150"></a>00150 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,78 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Bowed.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00022"></a>00022 <span class="comment">/***************************************************/</span>
<a name="l00023"></a>00023
<a name="l00024"></a>00024 <span class="preprocessor">#ifndef STK_BOWED_H</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define STK_BOWED_H</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "Instrmnt.h"</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "DelayL.h"</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include "BowTable.h"</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include "OnePole.h"</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include "BiQuad.h"</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include "SineWave.h"</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include "ADSR.h"</span>
<a name="l00034"></a>00034
<a name="l00035"></a><a class="code" href="classBowed.html">00035</a> <span class="keyword">class </span><a class="code" href="classBowed.html">Bowed</a> : <span class="keyword">public</span> <a class="code" href="classInstrmnt.html">Instrmnt</a>
<a name="l00036"></a>00036 {
<a name="l00037"></a>00037 <span class="keyword">public</span>:
<a name="l00039"></a>00039 <a class="code" href="classBowed.html#a0">Bowed</a>(StkFloat lowestFrequency);
<a name="l00040"></a>00040
<a name="l00042"></a>00042 <a class="code" href="classBowed.html#a1">~Bowed</a>();
<a name="l00043"></a>00043
<a name="l00045"></a>00045 <span class="keywordtype">void</span> <a class="code" href="classBowed.html#a2">clear</a>();
<a name="l00046"></a>00046
<a name="l00048"></a>00048 <span class="keywordtype">void</span> <a class="code" href="classBowed.html#a3">setFrequency</a>(StkFloat frequency);
<a name="l00049"></a>00049
<a name="l00051"></a>00051 <span class="keywordtype">void</span> <a class="code" href="classBowed.html#a4">setVibrato</a>(StkFloat gain);
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <span class="keywordtype">void</span> <a class="code" href="classBowed.html#a5">startBowing</a>(StkFloat amplitude, StkFloat rate);
<a name="l00055"></a>00055
<a name="l00057"></a>00057 <span class="keywordtype">void</span> <a class="code" href="classBowed.html#a6">stopBowing</a>(StkFloat rate);
<a name="l00058"></a>00058
<a name="l00060"></a>00060 <span class="keywordtype">void</span> <a class="code" href="classBowed.html#a7">noteOn</a>(StkFloat frequency, StkFloat amplitude);
<a name="l00061"></a>00061
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classBowed.html#a8">noteOff</a>(StkFloat amplitude);
<a name="l00064"></a>00064
<a name="l00066"></a>00066 <span class="keywordtype">void</span> <a class="code" href="classBowed.html#a9">controlChange</a>(<span class="keywordtype">int</span> number, StkFloat value);
<a name="l00067"></a>00067
<a name="l00068"></a>00068 <span class="keyword">protected</span>:
<a name="l00069"></a>00069
<a name="l00070"></a>00070 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00071"></a>00071
<a name="l00072"></a>00072 <a class="code" href="classDelayL.html">DelayL</a> neckDelay_;
<a name="l00073"></a>00073 <a class="code" href="classDelayL.html">DelayL</a> bridgeDelay_;
<a name="l00074"></a>00074 <a class="code" href="classBowTable.html">BowTable</a> bowTable_;
<a name="l00075"></a>00075 <a class="code" href="classOnePole.html">OnePole</a> stringFilter_;
<a name="l00076"></a>00076 <a class="code" href="classBiQuad.html">BiQuad</a> bodyFilter_;
<a name="l00077"></a>00077 <a class="code" href="classSineWave.html">SineWave</a> vibrato_;
<a name="l00078"></a>00078 <a class="code" href="classADSR.html">ADSR</a> adsr_;
<a name="l00079"></a>00079 StkFloat maxVelocity_;
<a name="l00080"></a>00080 StkFloat baseDelay_;
<a name="l00081"></a>00081 StkFloat vibratoGain_;
<a name="l00082"></a>00082 StkFloat betaRatio_;
<a name="l00083"></a>00083
<a name="l00084"></a>00084 };
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,140 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Bowed.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BOWED_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BOWED_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Instrmnt.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;DelayL.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;BowTable.h&quot;</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;OnePole.h&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;BiQuad.h&quot;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &quot;SineWave.h&quot;</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include &quot;ADSR.h&quot;</span>
<a name="l00011"></a>00011
<a name="l00012"></a>00012 <span class="keyword">namespace </span>stk {
<a name="l00013"></a>00013
<a name="l00014"></a>00014 <span class="comment">/***************************************************/</span>
<a name="l00038"></a>00038 <span class="comment">/***************************************************/</span>
<a name="l00039"></a>00039
<a name="l00040"></a><a class="code" href="classstk_1_1Bowed.html">00040</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Bowed.html" title="STK bowed string instrument class.">Bowed</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00041"></a>00041 {
<a name="l00042"></a>00042 <span class="keyword">public</span>:
<a name="l00044"></a>00044 <a class="code" href="classstk_1_1Bowed.html#a1b442f60bbec3d07d2dd322ff761c767" title="Class constructor, taking the lowest desired playing frequency.">Bowed</a>( StkFloat lowestFrequency = 8.0 );
<a name="l00045"></a>00045
<a name="l00047"></a>00047 <a class="code" href="classstk_1_1Bowed.html#a8067e4808bf7576922be4698f853c96c" title="Class destructor.">~Bowed</a>( <span class="keywordtype">void</span> );
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Bowed.html#a8d522c36a35b86f90a06cf135fc83b11" title="Reset and clear all internal state.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Bowed.html#a02dbcfbd0766fee8a2e75a8df809e62c" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00054"></a>00054
<a name="l00056"></a><a class="code" href="classstk_1_1Bowed.html#a7cf229e206a61259d381cf153a1c5096">00056</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Bowed.html#a7cf229e206a61259d381cf153a1c5096" title="Set vibrato gain.">setVibrato</a>( StkFloat gain ) { vibratoGain_ = gain; };
<a name="l00057"></a>00057
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Bowed.html#a519d511ddcc1cf23e897aeacdfe45020" title="Apply breath pressure to instrument with given amplitude and rate of increase.">startBowing</a>( StkFloat amplitude, StkFloat rate );
<a name="l00060"></a>00060
<a name="l00062"></a>00062 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Bowed.html#aae2a57d8e23536fd37a00af1fe07f21c" title="Decrease breath pressure with given rate of decrease.">stopBowing</a>( StkFloat rate );
<a name="l00063"></a>00063
<a name="l00065"></a>00065 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Bowed.html#a4ebaf6bd27d90975e7b0aea0ee727dc1" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00066"></a>00066
<a name="l00068"></a>00068 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Bowed.html#ab86db568328b51e4adfae8b62987fc85" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00069"></a>00069
<a name="l00071"></a>00071 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Bowed.html#ad066af9bb1340b6fcf9002d6922021f4" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value );
<a name="l00072"></a>00072
<a name="l00074"></a>00074 StkFloat <a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00075"></a>00075
<a name="l00077"></a>00077
<a name="l00084"></a>00084 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="keyword">protected</span>:
<a name="l00087"></a>00087
<a name="l00088"></a>00088 <a class="code" href="classstk_1_1DelayL.html" title="STK linear interpolating delay line class.">DelayL</a> neckDelay_;
<a name="l00089"></a>00089 <a class="code" href="classstk_1_1DelayL.html" title="STK linear interpolating delay line class.">DelayL</a> bridgeDelay_;
<a name="l00090"></a>00090 <a class="code" href="classstk_1_1BowTable.html" title="STK bowed string table class.">BowTable</a> bowTable_;
<a name="l00091"></a>00091 <a class="code" href="classstk_1_1OnePole.html" title="STK one-pole filter class.">OnePole</a> stringFilter_;
<a name="l00092"></a>00092 <a class="code" href="classstk_1_1BiQuad.html" title="STK biquad (two-pole, two-zero) filter class.">BiQuad</a> bodyFilters_[6];
<a name="l00093"></a>00093 <a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> vibrato_;
<a name="l00094"></a>00094 <a class="code" href="classstk_1_1ADSR.html" title="STK ADSR envelope class.">ADSR</a> adsr_;
<a name="l00095"></a>00095
<a name="l00096"></a>00096 <span class="keywordtype">bool</span> bowDown_;
<a name="l00097"></a>00097 StkFloat maxVelocity_;
<a name="l00098"></a>00098 StkFloat baseDelay_;
<a name="l00099"></a>00099 StkFloat vibratoGain_;
<a name="l00100"></a>00100 StkFloat betaRatio_;
<a name="l00101"></a>00101
<a name="l00102"></a>00102 };
<a name="l00103"></a>00103
<a name="l00104"></a><a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750">00104</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">Bowed :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00105"></a>00105 {
<a name="l00106"></a>00106 StkFloat bowVelocity = maxVelocity_ * adsr_.<a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975" title="Compute and return one output sample.">tick</a>();
<a name="l00107"></a>00107 StkFloat bridgeReflection = -stringFilter_.<a class="code" href="classstk_1_1OnePole.html#a3c83b6d43f76bec06f11caa9de76881e" title="Input one sample to the filter and return one output.">tick</a>( bridgeDelay_.<a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9" title="Return the last computed output value.">lastOut</a>() );
<a name="l00108"></a>00108 StkFloat nutReflection = -neckDelay_.<a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9" title="Return the last computed output value.">lastOut</a>();
<a name="l00109"></a>00109 StkFloat stringVelocity = bridgeReflection + nutReflection;
<a name="l00110"></a>00110 StkFloat deltaV = bowVelocity - stringVelocity; <span class="comment">// Differential velocity</span>
<a name="l00111"></a>00111
<a name="l00112"></a>00112 StkFloat newVelocity = 0.0;
<a name="l00113"></a>00113 <span class="keywordflow">if</span> ( bowDown_ )
<a name="l00114"></a>00114 newVelocity = deltaV * bowTable_.<a class="code" href="classstk_1_1BowTable.html#a8dc58c69ecda1471dce6d142cb5f4b19" title="Take one sample input and map to one sample of output.">tick</a>( deltaV ); <span class="comment">// Non-Linear bow function</span>
<a name="l00115"></a>00115 neckDelay_.<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( bridgeReflection + newVelocity); <span class="comment">// Do string propagations</span>
<a name="l00116"></a>00116 bridgeDelay_.<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>(nutReflection + newVelocity);
<a name="l00117"></a>00117
<a name="l00118"></a>00118 <span class="keywordflow">if</span> ( vibratoGain_ &gt; 0.0 ) {
<a name="l00119"></a>00119 neckDelay_.<a class="code" href="classstk_1_1DelayL.html#a80dd30628502a7c3b37ff045176eb91f" title="Set the delay-line length.">setDelay</a>( (baseDelay_ * (1.0 - betaRatio_) ) +
<a name="l00120"></a>00120 (baseDelay_ * vibratoGain_ * vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>()) );
<a name="l00121"></a>00121 }
<a name="l00122"></a>00122
<a name="l00123"></a>00123 lastFrame_[0] = 0.1248 * bodyFilters_[5].<a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635" title="Input one sample to the filter and return a reference to one output.">tick</a>( bodyFilters_[4].<a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">tick</a>( bodyFilters_[3].<a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">tick</a>( bodyFilters_[2].<a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">tick</a>( bodyFilters_[1].<a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">tick</a>( bodyFilters_[0].<a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">tick</a>( bridgeDelay_.<a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9" title="Return the last computed output value.">lastOut</a>() ) ) ) ) ) );
<a name="l00124"></a>00124
<a name="l00125"></a>00125 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00126"></a>00126 }
<a name="l00127"></a>00127
<a name="l00128"></a><a class="code" href="classstk_1_1Bowed.html#ab7985e95058016201d16f3717039e1cd">00128</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">Bowed :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00129"></a>00129 {
<a name="l00130"></a>00130 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00131"></a>00131 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00132"></a>00132 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels ) {
<a name="l00133"></a>00133 oStream_ &lt;&lt; <span class="stringliteral">&quot;Bowed::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00134"></a>00134 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00135"></a>00135 }
<a name="l00136"></a>00136 <span class="preprocessor">#endif</span>
<a name="l00137"></a>00137 <span class="preprocessor"></span>
<a name="l00138"></a>00138 StkFloat *samples = &amp;frames[channel];
<a name="l00139"></a>00139 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00140"></a>00140 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00141"></a>00141 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00142"></a>00142 *samples++ = <a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">tick</a>();
<a name="l00143"></a>00143 }
<a name="l00144"></a>00144 <span class="keywordflow">else</span> {
<a name="l00145"></a>00145 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00146"></a>00146 *samples++ = <a class="code" href="classstk_1_1Bowed.html#a4d583369f0b22335fff8cee3ce6f2750" title="Compute and return one output sample.">tick</a>();
<a name="l00147"></a>00147 <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00148"></a>00148 *samples++ = lastFrame_[j];
<a name="l00149"></a>00149 }
<a name="l00150"></a>00150 }
<a name="l00151"></a>00151
<a name="l00152"></a>00152 <span class="keywordflow">return</span> frames;
<a name="l00153"></a>00153 }
<a name="l00154"></a>00154
<a name="l00155"></a>00155 } <span class="comment">// stk namespace</span>
<a name="l00156"></a>00156
<a name="l00157"></a>00157 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,77 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Brass.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00021"></a>00021 <span class="comment">/***************************************************/</span>
<a name="l00022"></a>00022
<a name="l00023"></a>00023 <span class="preprocessor">#ifndef STK_BRASS_H</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span><span class="preprocessor">#define STK_BRASS_H</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span>
<a name="l00026"></a>00026 <span class="preprocessor">#include "Instrmnt.h"</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "DelayA.h"</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "BiQuad.h"</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include "PoleZero.h"</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include "ADSR.h"</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include "SineWave.h"</span>
<a name="l00032"></a>00032
<a name="l00033"></a><a class="code" href="classBrass.html">00033</a> <span class="keyword">class </span><a class="code" href="classBrass.html">Brass</a>: <span class="keyword">public</span> <a class="code" href="classInstrmnt.html">Instrmnt</a>
<a name="l00034"></a>00034 {
<a name="l00035"></a>00035 <span class="keyword">public</span>:
<a name="l00037"></a>00037
<a name="l00040"></a>00040 <a class="code" href="classBrass.html#a0">Brass</a>(StkFloat lowestFrequency);
<a name="l00041"></a>00041
<a name="l00043"></a>00043 <a class="code" href="classBrass.html#a1">~Brass</a>();
<a name="l00044"></a>00044
<a name="l00046"></a>00046 <span class="keywordtype">void</span> <a class="code" href="classBrass.html#a2">clear</a>();
<a name="l00047"></a>00047
<a name="l00049"></a>00049 <span class="keywordtype">void</span> <a class="code" href="classBrass.html#a3">setFrequency</a>(StkFloat frequency);
<a name="l00050"></a>00050
<a name="l00052"></a>00052 <span class="keywordtype">void</span> <a class="code" href="classBrass.html#a4">setLip</a>(StkFloat frequency);
<a name="l00053"></a>00053
<a name="l00055"></a>00055 <span class="keywordtype">void</span> <a class="code" href="classBrass.html#a5">startBlowing</a>(StkFloat amplitude, StkFloat rate);
<a name="l00056"></a>00056
<a name="l00058"></a>00058 <span class="keywordtype">void</span> <a class="code" href="classBrass.html#a6">stopBlowing</a>(StkFloat rate);
<a name="l00059"></a>00059
<a name="l00061"></a>00061 <span class="keywordtype">void</span> <a class="code" href="classBrass.html#a7">noteOn</a>(StkFloat frequency, StkFloat amplitude);
<a name="l00062"></a>00062
<a name="l00064"></a>00064 <span class="keywordtype">void</span> <a class="code" href="classBrass.html#a8">noteOff</a>(StkFloat amplitude);
<a name="l00065"></a>00065
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classBrass.html#a9">controlChange</a>(<span class="keywordtype">int</span> number, StkFloat value);
<a name="l00068"></a>00068
<a name="l00069"></a>00069 <span class="keyword">protected</span>:
<a name="l00070"></a>00070
<a name="l00071"></a>00071 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00072"></a>00072
<a name="l00073"></a>00073 <a class="code" href="classDelayA.html">DelayA</a> delayLine_;
<a name="l00074"></a>00074 <a class="code" href="classBiQuad.html">BiQuad</a> lipFilter_;
<a name="l00075"></a>00075 <a class="code" href="classPoleZero.html">PoleZero</a> dcBlock_;
<a name="l00076"></a>00076 <a class="code" href="classADSR.html">ADSR</a> adsr_;
<a name="l00077"></a>00077 <a class="code" href="classSineWave.html">SineWave</a> vibrato_;
<a name="l00078"></a>00078 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> length_;
<a name="l00079"></a>00079 StkFloat lipTarget_;
<a name="l00080"></a>00080 StkFloat slideTarget_;
<a name="l00081"></a>00081 StkFloat vibratoGain_;
<a name="l00082"></a>00082 StkFloat maxPressure_;
<a name="l00083"></a>00083
<a name="l00084"></a>00084 };
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,132 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Brass.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_BRASS_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_BRASS_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Instrmnt.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;DelayA.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;BiQuad.h&quot;</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;PoleZero.h&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;ADSR.h&quot;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &quot;SineWave.h&quot;</span>
<a name="l00010"></a>00010
<a name="l00011"></a>00011 <span class="keyword">namespace </span>stk {
<a name="l00012"></a>00012
<a name="l00013"></a>00013 <span class="comment">/***************************************************/</span>
<a name="l00033"></a>00033 <span class="comment">/***************************************************/</span>
<a name="l00034"></a>00034
<a name="l00035"></a><a class="code" href="classstk_1_1Brass.html">00035</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Brass.html" title="STK simple brass instrument class.">Brass</a>: <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00036"></a>00036 {
<a name="l00037"></a>00037 <span class="keyword">public</span>:
<a name="l00039"></a>00039
<a name="l00042"></a>00042 <a class="code" href="classstk_1_1Brass.html#a5bf59263a54250be84c027198c7d2d1d" title="Class constructor, taking the lowest desired playing frequency.">Brass</a>( StkFloat lowestFrequency = 8.0 );
<a name="l00043"></a>00043
<a name="l00045"></a>00045 <a class="code" href="classstk_1_1Brass.html#a474528a75bd4fb88cdb9c783d73df8f6" title="Class destructor.">~Brass</a>( );
<a name="l00046"></a>00046
<a name="l00048"></a>00048 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a64e48334efdc8f2508c29c5ea4281f2d" title="Reset and clear all internal state.">clear</a>( );
<a name="l00049"></a>00049
<a name="l00051"></a>00051 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a5e99e7fee1b92138566a46c828df93e8" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a2e1a150328504050499c5cb9fa0e536f" title="Set the lips frequency.">setLip</a>( StkFloat frequency );
<a name="l00055"></a>00055
<a name="l00057"></a>00057 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a02533e02818e2848fb6480106a54ce94" title="Apply breath pressure to instrument with given amplitude and rate of increase.">startBlowing</a>( StkFloat amplitude, StkFloat rate );
<a name="l00058"></a>00058
<a name="l00060"></a>00060 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a8bf1624aca6283fafb830a3f22546199" title="Decrease breath pressure with given rate of decrease.">stopBlowing</a>( StkFloat rate );
<a name="l00061"></a>00061
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#ae74eba698f27abd43e66e825f5ce72da" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00064"></a>00064
<a name="l00066"></a>00066 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a32e2a6d2c9285bb5cf033d8a6b90e3c9" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00067"></a>00067
<a name="l00069"></a>00069 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Brass.html#a4d75ac361d11fcc870a330d393dbad80" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value );
<a name="l00070"></a>00070
<a name="l00072"></a>00072 StkFloat <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00073"></a>00073
<a name="l00075"></a>00075
<a name="l00082"></a>00082 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00083"></a>00083
<a name="l00084"></a>00084 <span class="keyword">protected</span>:
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <a class="code" href="classstk_1_1DelayA.html" title="STK allpass interpolating delay line class.">DelayA</a> delayLine_;
<a name="l00087"></a>00087 <a class="code" href="classstk_1_1BiQuad.html" title="STK biquad (two-pole, two-zero) filter class.">BiQuad</a> lipFilter_;
<a name="l00088"></a>00088 <a class="code" href="classstk_1_1PoleZero.html" title="STK one-pole, one-zero filter class.">PoleZero</a> dcBlock_;
<a name="l00089"></a>00089 <a class="code" href="classstk_1_1ADSR.html" title="STK ADSR envelope class.">ADSR</a> adsr_;
<a name="l00090"></a>00090 <a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> vibrato_;
<a name="l00091"></a>00091
<a name="l00092"></a>00092 StkFloat lipTarget_;
<a name="l00093"></a>00093 StkFloat slideTarget_;
<a name="l00094"></a>00094 StkFloat vibratoGain_;
<a name="l00095"></a>00095 StkFloat maxPressure_;
<a name="l00096"></a>00096
<a name="l00097"></a>00097 };
<a name="l00098"></a>00098
<a name="l00099"></a><a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321">00099</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" title="Compute and return one output sample.">Brass :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00100"></a>00100 {
<a name="l00101"></a>00101 StkFloat breathPressure = maxPressure_ * adsr_.<a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975" title="Compute and return one output sample.">tick</a>();
<a name="l00102"></a>00102 breathPressure += vibratoGain_ * vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>();
<a name="l00103"></a>00103
<a name="l00104"></a>00104 StkFloat mouthPressure = 0.3 * breathPressure;
<a name="l00105"></a>00105 StkFloat borePressure = 0.85 * delayLine_.<a class="code" href="classstk_1_1DelayA.html#a4372d0e178af1cb6ca465affddfb1566" title="Return the last computed output value.">lastOut</a>();
<a name="l00106"></a>00106 StkFloat deltaPressure = mouthPressure - borePressure; <span class="comment">// Differential pressure.</span>
<a name="l00107"></a>00107 deltaPressure = lipFilter_.<a class="code" href="classstk_1_1BiQuad.html#a648086962c3cddcaa09c46a002c3e635" title="Input one sample to the filter and return a reference to one output.">tick</a>( deltaPressure ); <span class="comment">// Force - &gt; position.</span>
<a name="l00108"></a>00108 deltaPressure *= deltaPressure; <span class="comment">// Basic position to area mapping.</span>
<a name="l00109"></a>00109 <span class="keywordflow">if</span> ( deltaPressure &gt; 1.0 ) deltaPressure = 1.0; <span class="comment">// Non-linear saturation.</span>
<a name="l00110"></a>00110
<a name="l00111"></a>00111 <span class="comment">// The following input scattering assumes the mouthPressure = area.</span>
<a name="l00112"></a>00112 lastFrame_[0] = deltaPressure * mouthPressure + ( 1.0 - deltaPressure) * borePressure;
<a name="l00113"></a>00113 lastFrame_[0] = delayLine_.<a class="code" href="classstk_1_1DelayA.html#ae602abe91560fb5f141db52333359b74" title="Input one sample to the filter and return one output.">tick</a>( dcBlock_.<a class="code" href="classstk_1_1PoleZero.html#a1a29ac6f3a2b75e71693c73554599228" title="Input one sample to the filter and return one output.">tick</a>( lastFrame_[0] ) );
<a name="l00114"></a>00114
<a name="l00115"></a>00115 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00116"></a>00116 }
<a name="l00117"></a>00117
<a name="l00118"></a><a class="code" href="classstk_1_1Brass.html#a10334fc5573b68f2b5c2819bdba786b8">00118</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" title="Compute and return one output sample.">Brass :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00119"></a>00119 {
<a name="l00120"></a>00120 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00121"></a>00121 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00122"></a>00122 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels ) {
<a name="l00123"></a>00123 oStream_ &lt;&lt; <span class="stringliteral">&quot;Brass::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00124"></a>00124 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00125"></a>00125 }
<a name="l00126"></a>00126 <span class="preprocessor">#endif</span>
<a name="l00127"></a>00127 <span class="preprocessor"></span>
<a name="l00128"></a>00128 StkFloat *samples = &amp;frames[channel];
<a name="l00129"></a>00129 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00130"></a>00130 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00131"></a>00131 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00132"></a>00132 *samples++ = <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" title="Compute and return one output sample.">tick</a>();
<a name="l00133"></a>00133 }
<a name="l00134"></a>00134 <span class="keywordflow">else</span> {
<a name="l00135"></a>00135 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00136"></a>00136 *samples++ = <a class="code" href="classstk_1_1Brass.html#a4af1b7c4c1b374b65e04ccaa90886321" title="Compute and return one output sample.">tick</a>();
<a name="l00137"></a>00137 <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00138"></a>00138 *samples++ = lastFrame_[j];
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140 }
<a name="l00141"></a>00141
<a name="l00142"></a>00142 <span class="keywordflow">return</span> frames;
<a name="l00143"></a>00143 }
<a name="l00144"></a>00144
<a name="l00145"></a>00145 } <span class="comment">// stk namespace</span>
<a name="l00146"></a>00146
<a name="l00147"></a>00147 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,59 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Chorus.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00009"></a>00009 <span class="comment">/***************************************************/</span>
<a name="l00010"></a>00010
<a name="l00011"></a>00011 <span class="preprocessor">#ifndef STK_CHORUS_H</span>
<a name="l00012"></a>00012 <span class="preprocessor"></span><span class="preprocessor">#define STK_CHORUS_H</span>
<a name="l00013"></a>00013 <span class="preprocessor"></span>
<a name="l00014"></a>00014 <span class="preprocessor">#include "Effect.h"</span>
<a name="l00015"></a>00015 <span class="preprocessor">#include "DelayL.h"</span>
<a name="l00016"></a>00016 <span class="preprocessor">#include "SineWave.h"</span>
<a name="l00017"></a>00017
<a name="l00018"></a><a class="code" href="classChorus.html">00018</a> <span class="keyword">class </span><a class="code" href="classChorus.html">Chorus</a> : <span class="keyword">public</span> <a class="code" href="classEffect.html">Effect</a>
<a name="l00019"></a>00019 {
<a name="l00020"></a>00020 <span class="keyword">public</span>:
<a name="l00022"></a>00022
<a name="l00025"></a>00025 <a class="code" href="classChorus.html#a0">Chorus</a>( StkFloat baseDelay = 6000 );
<a name="l00026"></a>00026
<a name="l00028"></a>00028 <a class="code" href="classChorus.html#a1">~Chorus</a>();
<a name="l00029"></a>00029
<a name="l00031"></a>00031 <span class="keywordtype">void</span> <a class="code" href="classChorus.html#a2">clear</a>();
<a name="l00032"></a>00032
<a name="l00034"></a>00034 <span class="keywordtype">void</span> <a class="code" href="classChorus.html#a3">setModDepth</a>(StkFloat depth);
<a name="l00035"></a>00035
<a name="l00037"></a>00037 <span class="keywordtype">void</span> <a class="code" href="classChorus.html#a4">setModFrequency</a>(StkFloat frequency);
<a name="l00038"></a>00038
<a name="l00039"></a>00039 <span class="keyword">protected</span>:
<a name="l00040"></a>00040
<a name="l00041"></a>00041 StkFloat computeSample( StkFloat input );
<a name="l00042"></a>00042
<a name="l00043"></a>00043 <a class="code" href="classDelayL.html">DelayL</a> delayLine_[2];
<a name="l00044"></a>00044 <a class="code" href="classSineWave.html">SineWave</a> mods_[2];
<a name="l00045"></a>00045 StkFloat baseLength_;
<a name="l00046"></a>00046 StkFloat modDepth_;
<a name="l00047"></a>00047
<a name="l00048"></a>00048 };
<a name="l00049"></a>00049
<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
<a name="l00051"></a>00051 <span class="preprocessor"></span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,149 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Chorus.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_CHORUS_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_CHORUS_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Effect.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;DelayL.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;SineWave.h&quot;</span>
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="keyword">namespace </span>stk {
<a name="l00009"></a>00009
<a name="l00010"></a>00010 <span class="comment">/***************************************************/</span>
<a name="l00019"></a>00019 <span class="comment">/***************************************************/</span>
<a name="l00020"></a>00020
<a name="l00021"></a><a class="code" href="classstk_1_1Chorus.html">00021</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Chorus.html" title="STK chorus effect class.">Chorus</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Effect.html" title="STK abstract effects parent class.">Effect</a>
<a name="l00022"></a>00022 {
<a name="l00023"></a>00023 <span class="keyword">public</span>:
<a name="l00025"></a>00025
<a name="l00028"></a>00028 <a class="code" href="classstk_1_1Chorus.html#a529f668e66188ae5a42e4cc30779059f" title="Class constructor, taking the median desired delay length.">Chorus</a>( StkFloat baseDelay = 6000 );
<a name="l00029"></a>00029
<a name="l00031"></a>00031 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Chorus.html#a63acbdd04d13110712c36a5cac5d972d" title="Reset and clear all internal state.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00032"></a>00032
<a name="l00034"></a>00034 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Chorus.html#acb3a55518c919dafa6c19698c1ab3389" title="Set modulation depth in range 0.0 - 1.0.">setModDepth</a>( StkFloat depth );
<a name="l00035"></a>00035
<a name="l00037"></a>00037 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Chorus.html#aa4372095b8526d62ff9cfbdb03f21c4d" title="Set modulation frequency.">setModFrequency</a>( StkFloat frequency );
<a name="l00038"></a>00038
<a name="l00040"></a>00040
<a name="l00048"></a>00048 StkFloat <a class="code" href="classstk_1_1Chorus.html#aabcc110787ec3b443c21845b2f06bb3c" title="Return the specified channel value of the last computed stereo frame.">lastOut</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00049"></a>00049
<a name="l00051"></a>00051
<a name="l00058"></a>00058 StkFloat <a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">tick</a>( StkFloat input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00059"></a>00059
<a name="l00061"></a>00061
<a name="l00070"></a>00070 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00071"></a>00071
<a name="l00073"></a>00073
<a name="l00082"></a>00082 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> &amp;oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel = 0 );
<a name="l00083"></a>00083
<a name="l00084"></a>00084 <span class="keyword">protected</span>:
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <a class="code" href="classstk_1_1DelayL.html" title="STK linear interpolating delay line class.">DelayL</a> delayLine_[2];
<a name="l00087"></a>00087 <a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> mods_[2];
<a name="l00088"></a>00088 StkFloat baseLength_;
<a name="l00089"></a>00089 StkFloat modDepth_;
<a name="l00090"></a>00090
<a name="l00091"></a>00091 };
<a name="l00092"></a>00092
<a name="l00093"></a><a class="code" href="classstk_1_1Chorus.html#aabcc110787ec3b443c21845b2f06bb3c">00093</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Chorus.html#aabcc110787ec3b443c21845b2f06bb3c" title="Return the specified channel value of the last computed stereo frame.">Chorus :: lastOut</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00094"></a>00094 {
<a name="l00095"></a>00095 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00096"></a>00096 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; 1 ) {
<a name="l00097"></a>00097 oStream_ &lt;&lt; <span class="stringliteral">&quot;Chorus::lastOut(): channel argument must be less than 2!&quot;</span>;
<a name="l00098"></a>00098 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00099"></a>00099 }
<a name="l00100"></a>00100 <span class="preprocessor">#endif</span>
<a name="l00101"></a>00101 <span class="preprocessor"></span>
<a name="l00102"></a>00102 <span class="keywordflow">return</span> lastFrame_[channel];
<a name="l00103"></a>00103 }
<a name="l00104"></a>00104
<a name="l00105"></a><a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf">00105</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">Chorus :: tick</a>( StkFloat input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00106"></a>00106 {
<a name="l00107"></a>00107 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00108"></a>00108 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; 1 ) {
<a name="l00109"></a>00109 oStream_ &lt;&lt; <span class="stringliteral">&quot;Chorus::tick(): channel argument must be less than 2!&quot;</span>;
<a name="l00110"></a>00110 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00111"></a>00111 }
<a name="l00112"></a>00112 <span class="preprocessor">#endif</span>
<a name="l00113"></a>00113 <span class="preprocessor"></span>
<a name="l00114"></a>00114 delayLine_[0].<a class="code" href="classstk_1_1DelayL.html#a80dd30628502a7c3b37ff045176eb91f" title="Set the delay-line length.">setDelay</a>( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].<a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">tick</a>() ) );
<a name="l00115"></a>00115 delayLine_[1].<a class="code" href="classstk_1_1DelayL.html#a80dd30628502a7c3b37ff045176eb91f" title="Set the delay-line length.">setDelay</a>( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].<a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">tick</a>() ) );
<a name="l00116"></a>00116 lastFrame_[0] = effectMix_ * ( delayLine_[0].<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( input ) - input ) + input;
<a name="l00117"></a>00117 lastFrame_[1] = effectMix_ * ( delayLine_[1].<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( input ) - input ) + input;
<a name="l00118"></a>00118 <span class="keywordflow">return</span> lastFrame_[channel];
<a name="l00119"></a>00119 }
<a name="l00120"></a>00120
<a name="l00121"></a><a class="code" href="classstk_1_1Chorus.html#aef55c6fb93a1d00498ae436868f84501">00121</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">Chorus :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00122"></a>00122 {
<a name="l00123"></a>00123 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00124"></a>00124 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - 1 ) {
<a name="l00125"></a>00125 oStream_ &lt;&lt; <span class="stringliteral">&quot;Chorus::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00126"></a>00126 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00127"></a>00127 }
<a name="l00128"></a>00128 <span class="preprocessor">#endif</span>
<a name="l00129"></a>00129 <span class="preprocessor"></span>
<a name="l00130"></a>00130 StkFloat *samples = &amp;frames[channel];
<a name="l00131"></a>00131 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - 1;
<a name="l00132"></a>00132 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00133"></a>00133 delayLine_[0].<a class="code" href="classstk_1_1DelayL.html#a80dd30628502a7c3b37ff045176eb91f" title="Set the delay-line length.">setDelay</a>( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].<a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">tick</a>() ) );
<a name="l00134"></a>00134 delayLine_[1].<a class="code" href="classstk_1_1DelayL.html#a80dd30628502a7c3b37ff045176eb91f" title="Set the delay-line length.">setDelay</a>( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].<a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">tick</a>() ) );
<a name="l00135"></a>00135 *samples = effectMix_ * ( delayLine_[0].<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( *samples ) - *samples ) + *samples;
<a name="l00136"></a>00136 samples++;
<a name="l00137"></a>00137 *samples = effectMix_ * ( delayLine_[1].<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( *samples ) - *samples ) + *samples;
<a name="l00138"></a>00138 }
<a name="l00139"></a>00139
<a name="l00140"></a>00140 lastFrame_[0] = *(samples-hop);
<a name="l00141"></a>00141 lastFrame_[1] = *(samples-hop+1);
<a name="l00142"></a>00142 <span class="keywordflow">return</span> frames;
<a name="l00143"></a>00143 }
<a name="l00144"></a>00144
<a name="l00145"></a><a class="code" href="classstk_1_1Chorus.html#abdb8802a83f6b89716316399138e3032">00145</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">Chorus :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel )
<a name="l00146"></a>00146 {
<a name="l00147"></a>00147 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00148"></a>00148 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( iChannel &gt;= iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() || oChannel &gt;= oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - 1 ) {
<a name="l00149"></a>00149 oStream_ &lt;&lt; <span class="stringliteral">&quot;Chorus::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00150"></a>00150 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00151"></a>00151 }
<a name="l00152"></a>00152 <span class="preprocessor">#endif</span>
<a name="l00153"></a>00153 <span class="preprocessor"></span>
<a name="l00154"></a>00154 StkFloat *iSamples = &amp;iFrames[iChannel];
<a name="l00155"></a>00155 StkFloat *oSamples = &amp;oFrames[oChannel];
<a name="l00156"></a>00156 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iHop = iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(), oHop = oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00157"></a>00157 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;iFrames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, iSamples += iHop, oSamples += oHop ) {
<a name="l00158"></a>00158 delayLine_[0].<a class="code" href="classstk_1_1DelayL.html#a80dd30628502a7c3b37ff045176eb91f" title="Set the delay-line length.">setDelay</a>( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].<a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">tick</a>() ) );
<a name="l00159"></a>00159 delayLine_[1].<a class="code" href="classstk_1_1DelayL.html#a80dd30628502a7c3b37ff045176eb91f" title="Set the delay-line length.">setDelay</a>( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].<a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">tick</a>() ) );
<a name="l00160"></a>00160 *oSamples = effectMix_ * ( delayLine_[0].<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( *iSamples ) - *iSamples ) + *iSamples;
<a name="l00161"></a>00161 *(oSamples+1) = effectMix_ * ( delayLine_[1].<a class="code" href="classstk_1_1Chorus.html#a31d5c48d5b4a030040f6bb6b5e2c99cf" title="Input one sample to the effect and return the specified channel value of the computed...">tick</a>( *iSamples ) - *iSamples ) + *iSamples;
<a name="l00162"></a>00162 }
<a name="l00163"></a>00163
<a name="l00164"></a>00164 lastFrame_[0] = *(oSamples-oHop);
<a name="l00165"></a>00165 lastFrame_[1] = *(oSamples-oHop+1);
<a name="l00166"></a>00166 <span class="keywordflow">return</span> iFrames;
<a name="l00167"></a>00167 }
<a name="l00168"></a>00168
<a name="l00169"></a>00169 } <span class="comment">// stk namespace</span>
<a name="l00170"></a>00170
<a name="l00171"></a>00171 <span class="preprocessor">#endif</span>
<a name="l00172"></a>00172 <span class="preprocessor"></span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,76 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Clarinet.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00023"></a>00023 <span class="comment">/***************************************************/</span>
<a name="l00024"></a>00024
<a name="l00025"></a>00025 <span class="preprocessor">#ifndef STK_CLARINET_H</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define STK_CLARINET_H</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "Instrmnt.h"</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include "DelayL.h"</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include "ReedTable.h"</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include "OneZero.h"</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include "Envelope.h"</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include "Noise.h"</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include "SineWave.h"</span>
<a name="l00035"></a>00035
<a name="l00036"></a><a class="code" href="classClarinet.html">00036</a> <span class="keyword">class </span><a class="code" href="classClarinet.html">Clarinet</a> : <span class="keyword">public</span> <a class="code" href="classInstrmnt.html">Instrmnt</a>
<a name="l00037"></a>00037 {
<a name="l00038"></a>00038 <span class="keyword">public</span>:
<a name="l00040"></a>00040
<a name="l00043"></a>00043 <a class="code" href="classClarinet.html#a0">Clarinet</a>(StkFloat lowestFrequency);
<a name="l00044"></a>00044
<a name="l00046"></a>00046 <a class="code" href="classClarinet.html#a1">~Clarinet</a>();
<a name="l00047"></a>00047
<a name="l00049"></a>00049 <span class="keywordtype">void</span> <a class="code" href="classClarinet.html#a2">clear</a>();
<a name="l00050"></a>00050
<a name="l00052"></a>00052 <span class="keywordtype">void</span> <a class="code" href="classClarinet.html#a3">setFrequency</a>(StkFloat frequency);
<a name="l00053"></a>00053
<a name="l00055"></a>00055 <span class="keywordtype">void</span> <a class="code" href="classClarinet.html#a4">startBlowing</a>(StkFloat amplitude, StkFloat rate);
<a name="l00056"></a>00056
<a name="l00058"></a>00058 <span class="keywordtype">void</span> <a class="code" href="classClarinet.html#a5">stopBlowing</a>(StkFloat rate);
<a name="l00059"></a>00059
<a name="l00061"></a>00061 <span class="keywordtype">void</span> <a class="code" href="classClarinet.html#a6">noteOn</a>(StkFloat frequency, StkFloat amplitude);
<a name="l00062"></a>00062
<a name="l00064"></a>00064 <span class="keywordtype">void</span> <a class="code" href="classClarinet.html#a7">noteOff</a>(StkFloat amplitude);
<a name="l00065"></a>00065
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classClarinet.html#a8">controlChange</a>(<span class="keywordtype">int</span> number, StkFloat value);
<a name="l00068"></a>00068
<a name="l00069"></a>00069 <span class="keyword">protected</span>:
<a name="l00070"></a>00070
<a name="l00071"></a>00071 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00072"></a>00072
<a name="l00073"></a>00073 <a class="code" href="classDelayL.html">DelayL</a> delayLine_;
<a name="l00074"></a>00074 <a class="code" href="classReedTable.html">ReedTable</a> reedTable_;
<a name="l00075"></a>00075 <a class="code" href="classOneZero.html">OneZero</a> filter_;
<a name="l00076"></a>00076 <a class="code" href="classEnvelope.html">Envelope</a> envelope_;
<a name="l00077"></a>00077 <a class="code" href="classNoise.html">Noise</a> noise_;
<a name="l00078"></a>00078 <a class="code" href="classSineWave.html">SineWave</a> vibrato_;
<a name="l00079"></a>00079 <span class="keywordtype">long</span> length_;
<a name="l00080"></a>00080 StkFloat outputGain_;
<a name="l00081"></a>00081 StkFloat noiseGain_;
<a name="l00082"></a>00082 StkFloat vibratoGain_;
<a name="l00083"></a>00083
<a name="l00084"></a>00084 };
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,136 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Clarinet.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_CLARINET_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_CLARINET_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Instrmnt.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;DelayL.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;ReedTable.h&quot;</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;OneZero.h&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;Envelope.h&quot;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &quot;Noise.h&quot;</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include &quot;SineWave.h&quot;</span>
<a name="l00011"></a>00011
<a name="l00012"></a>00012 <span class="keyword">namespace </span>stk {
<a name="l00013"></a>00013
<a name="l00014"></a>00014 <span class="comment">/***************************************************/</span>
<a name="l00036"></a>00036 <span class="comment">/***************************************************/</span>
<a name="l00037"></a>00037
<a name="l00038"></a><a class="code" href="classstk_1_1Clarinet.html">00038</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Clarinet.html" title="STK clarinet physical model class.">Clarinet</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00039"></a>00039 {
<a name="l00040"></a>00040 <span class="keyword">public</span>:
<a name="l00042"></a>00042
<a name="l00045"></a>00045 <a class="code" href="classstk_1_1Clarinet.html#aad5cf9fb562ee87f2dc0aed0b4cd6c5b" title="Class constructor, taking the lowest desired playing frequency.">Clarinet</a>( StkFloat lowestFrequency = 8.0 );
<a name="l00046"></a>00046
<a name="l00048"></a>00048 <a class="code" href="classstk_1_1Clarinet.html#a5166db9f4cf180fa189ba2e135affe34" title="Class destructor.">~Clarinet</a>( <span class="keywordtype">void</span> );
<a name="l00049"></a>00049
<a name="l00051"></a>00051 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Clarinet.html#a7eae4377eb4178067c2dba704032a2d1" title="Reset and clear all internal state.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Clarinet.html#af7c1cda6af97908c9b81b1be0c2a896d" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00055"></a>00055
<a name="l00057"></a>00057 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Clarinet.html#a0e4d016135c3ee291f4d74e9b030caee" title="Apply breath pressure to instrument with given amplitude and rate of increase.">startBlowing</a>( StkFloat amplitude, StkFloat rate );
<a name="l00058"></a>00058
<a name="l00060"></a>00060 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Clarinet.html#ae33627365f66f30c3685dc72cd7fadce" title="Decrease breath pressure with given rate of decrease.">stopBlowing</a>( StkFloat rate );
<a name="l00061"></a>00061
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Clarinet.html#a35f9158176c1b654c74bdf6f1296df67" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00064"></a>00064
<a name="l00066"></a>00066 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Clarinet.html#a501413064397d1650e18edac92a98b2e" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00067"></a>00067
<a name="l00069"></a>00069 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Clarinet.html#a63582205ab940101f5f9419fc717ff78" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value );
<a name="l00070"></a>00070
<a name="l00072"></a>00072 StkFloat <a class="code" href="classstk_1_1Clarinet.html#a4cd08bca954ad434bc636eda957ca8d5" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00073"></a>00073
<a name="l00075"></a>00075
<a name="l00082"></a>00082 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Clarinet.html#a4cd08bca954ad434bc636eda957ca8d5" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00083"></a>00083
<a name="l00084"></a>00084 <span class="keyword">protected</span>:
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <a class="code" href="classstk_1_1DelayL.html" title="STK linear interpolating delay line class.">DelayL</a> delayLine_;
<a name="l00087"></a>00087 <a class="code" href="classstk_1_1ReedTable.html" title="STK reed table class.">ReedTable</a> reedTable_;
<a name="l00088"></a>00088 <a class="code" href="classstk_1_1OneZero.html" title="STK one-zero filter class.">OneZero</a> filter_;
<a name="l00089"></a>00089 <a class="code" href="classstk_1_1Envelope.html" title="STK linear line envelope class.">Envelope</a> envelope_;
<a name="l00090"></a>00090 <a class="code" href="classstk_1_1Noise.html" title="STK noise generator.">Noise</a> noise_;
<a name="l00091"></a>00091 <a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> vibrato_;
<a name="l00092"></a>00092
<a name="l00093"></a>00093 StkFloat outputGain_;
<a name="l00094"></a>00094 StkFloat noiseGain_;
<a name="l00095"></a>00095 StkFloat vibratoGain_;
<a name="l00096"></a>00096 };
<a name="l00097"></a>00097
<a name="l00098"></a><a class="code" href="classstk_1_1Clarinet.html#a4cd08bca954ad434bc636eda957ca8d5">00098</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Clarinet.html#a4cd08bca954ad434bc636eda957ca8d5" title="Compute and return one output sample.">Clarinet :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00099"></a>00099 {
<a name="l00100"></a>00100 StkFloat pressureDiff;
<a name="l00101"></a>00101 StkFloat breathPressure;
<a name="l00102"></a>00102
<a name="l00103"></a>00103 <span class="comment">// Calculate the breath pressure (envelope + noise + vibrato)</span>
<a name="l00104"></a>00104 breathPressure = envelope_.<a class="code" href="classstk_1_1Envelope.html#a8de91b9caf10a03f52bd2247648c4601" title="Compute and return one output sample.">tick</a>();
<a name="l00105"></a>00105 breathPressure += breathPressure * noiseGain_ * noise_.<a class="code" href="classstk_1_1Noise.html#a8ac40f69475eb744e803d557e8438a6d" title="Compute and return one output sample.">tick</a>();
<a name="l00106"></a>00106 breathPressure += breathPressure * vibratoGain_ * vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>();
<a name="l00107"></a>00107
<a name="l00108"></a>00108 <span class="comment">// Perform commuted loss filtering.</span>
<a name="l00109"></a>00109 pressureDiff = -0.95 * filter_.<a class="code" href="classstk_1_1OneZero.html#a9f52fa395257b15cb7351c6ccb2199da" title="Input one sample to the filter and return one output.">tick</a>( delayLine_.<a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9" title="Return the last computed output value.">lastOut</a>() );
<a name="l00110"></a>00110
<a name="l00111"></a>00111 <span class="comment">// Calculate pressure difference of reflected and mouthpiece pressures.</span>
<a name="l00112"></a>00112 pressureDiff = pressureDiff - breathPressure;
<a name="l00113"></a>00113
<a name="l00114"></a>00114 <span class="comment">// Perform non-linear scattering using pressure difference in reed function.</span>
<a name="l00115"></a>00115 lastFrame_[0] = delayLine_.<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>(breathPressure + pressureDiff * reedTable_.<a class="code" href="classstk_1_1ReedTable.html#a3c1607ed5712e2ab010d8c5e55e431f2" title="Take one sample input and map to one sample of output.">tick</a>(pressureDiff));
<a name="l00116"></a>00116
<a name="l00117"></a>00117 <span class="comment">// Apply output gain.</span>
<a name="l00118"></a>00118 lastFrame_[0] *= outputGain_;
<a name="l00119"></a>00119
<a name="l00120"></a>00120 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00121"></a>00121 }
<a name="l00122"></a>00122
<a name="l00123"></a><a class="code" href="classstk_1_1Clarinet.html#a059174eb1ab84e306bfad1d8b5833548">00123</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Clarinet.html#a4cd08bca954ad434bc636eda957ca8d5" title="Compute and return one output sample.">Clarinet :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00124"></a>00124 {
<a name="l00125"></a>00125 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00126"></a>00126 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00127"></a>00127 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels ) {
<a name="l00128"></a>00128 oStream_ &lt;&lt; <span class="stringliteral">&quot;Clarinet::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00129"></a>00129 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00130"></a>00130 }
<a name="l00131"></a>00131 <span class="preprocessor">#endif</span>
<a name="l00132"></a>00132 <span class="preprocessor"></span>
<a name="l00133"></a>00133 StkFloat *samples = &amp;frames[channel];
<a name="l00134"></a>00134 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00135"></a>00135 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00136"></a>00136 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00137"></a>00137 *samples++ = <a class="code" href="classstk_1_1Clarinet.html#a4cd08bca954ad434bc636eda957ca8d5" title="Compute and return one output sample.">tick</a>();
<a name="l00138"></a>00138 }
<a name="l00139"></a>00139 <span class="keywordflow">else</span> {
<a name="l00140"></a>00140 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00141"></a>00141 *samples++ = <a class="code" href="classstk_1_1Clarinet.html#a4cd08bca954ad434bc636eda957ca8d5" title="Compute and return one output sample.">tick</a>();
<a name="l00142"></a>00142 <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00143"></a>00143 *samples++ = lastFrame_[j];
<a name="l00144"></a>00144 }
<a name="l00145"></a>00145 }
<a name="l00146"></a>00146
<a name="l00147"></a>00147 <span class="keywordflow">return</span> frames;
<a name="l00148"></a>00148 }
<a name="l00149"></a>00149
<a name="l00150"></a>00150 } <span class="comment">// stk namespace</span>
<a name="l00151"></a>00151
<a name="l00152"></a>00152 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,122 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Cubic.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_CUBIC_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_CUBIC_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Function.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00006"></a>00006
<a name="l00007"></a>00007 <span class="keyword">namespace </span>stk {
<a name="l00008"></a>00008
<a name="l00009"></a>00009 <span class="comment">/***************************************************/</span>
<a name="l00027"></a>00027 <span class="comment">/***************************************************/</span>
<a name="l00028"></a>00028
<a name="l00029"></a><a class="code" href="classstk_1_1Cubic.html">00029</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Cubic.html" title="STK cubic non-linearity class.">Cubic</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Function.html" title="STK abstract function parent class.">Function</a>
<a name="l00030"></a>00030 {
<a name="l00031"></a>00031 <span class="keyword">public</span>:
<a name="l00033"></a><a class="code" href="classstk_1_1Cubic.html#a2059a20146f6d7ec0854dc860ca90895">00033</a> <a class="code" href="classstk_1_1Cubic.html#a2059a20146f6d7ec0854dc860ca90895" title="Default constructor.">Cubic</a>( <span class="keywordtype">void</span> ) : a1_(0.5), a2_(0.5), a3_(0.5), gain_(1.0), threshold_(1.0) {};
<a name="l00034"></a>00034
<a name="l00036"></a><a class="code" href="classstk_1_1Cubic.html#af4604c69f138415f9b9ee6944d2b54ef">00036</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Cubic.html#af4604c69f138415f9b9ee6944d2b54ef" title="Set the a1 coefficient value.">setA1</a>( StkFloat a1 ) { a1_ = a1; };
<a name="l00037"></a>00037
<a name="l00039"></a><a class="code" href="classstk_1_1Cubic.html#afa16d53e6a720936543d0e0ea778f0eb">00039</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Cubic.html#afa16d53e6a720936543d0e0ea778f0eb" title="Set the a2 coefficient value.">setA2</a>( StkFloat a2 ) { a2_ = a2; };
<a name="l00040"></a>00040
<a name="l00042"></a><a class="code" href="classstk_1_1Cubic.html#add4a05676471c4c09b76f5fe430b80fa">00042</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Cubic.html#add4a05676471c4c09b76f5fe430b80fa" title="Set the a3 coefficient value.">setA3</a>( StkFloat a3 ) { a3_ = a3; };
<a name="l00043"></a>00043
<a name="l00045"></a><a class="code" href="classstk_1_1Cubic.html#a3eca8ac3f81301592476aad7a2e1ec50">00045</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Cubic.html#a3eca8ac3f81301592476aad7a2e1ec50" title="Set the gain value.">setGain</a>( StkFloat gain ) { gain_ = gain; };
<a name="l00046"></a>00046
<a name="l00048"></a><a class="code" href="classstk_1_1Cubic.html#a10ba2b5c858fc2d656d49c676d5561b4">00048</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Cubic.html#a10ba2b5c858fc2d656d49c676d5561b4" title="Set the threshold value.">setThreshold</a>( StkFloat threshold ) { threshold_ = threshold; };
<a name="l00049"></a>00049
<a name="l00051"></a>00051 StkFloat <a class="code" href="classstk_1_1Cubic.html#a24e2270a347e0a6721bc0f7e0040117c" title="Input one sample to the function and return one output.">tick</a>( StkFloat input );
<a name="l00052"></a>00052
<a name="l00054"></a>00054
<a name="l00062"></a>00062 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Cubic.html#a24e2270a347e0a6721bc0f7e0040117c" title="Input one sample to the function and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00063"></a>00063
<a name="l00065"></a>00065
<a name="l00073"></a>00073 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Cubic.html#a24e2270a347e0a6721bc0f7e0040117c" title="Input one sample to the function and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> &amp;oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel = 0 );
<a name="l00074"></a>00074
<a name="l00075"></a>00075 <span class="keyword">protected</span>:
<a name="l00076"></a>00076
<a name="l00077"></a>00077 StkFloat a1_;
<a name="l00078"></a>00078 StkFloat a2_;
<a name="l00079"></a>00079 StkFloat a3_;
<a name="l00080"></a>00080 StkFloat gain_;
<a name="l00081"></a>00081 StkFloat threshold_;
<a name="l00082"></a>00082 };
<a name="l00083"></a>00083
<a name="l00084"></a><a class="code" href="classstk_1_1Cubic.html#a24e2270a347e0a6721bc0f7e0040117c">00084</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Cubic.html#a24e2270a347e0a6721bc0f7e0040117c" title="Input one sample to the function and return one output.">Cubic :: tick</a>( StkFloat input )
<a name="l00085"></a>00085 {
<a name="l00086"></a>00086 StkFloat inSquared = input * input;
<a name="l00087"></a>00087 StkFloat inCubed = inSquared * input;
<a name="l00088"></a>00088
<a name="l00089"></a>00089 lastFrame_[0] = gain_ * (a1_ * input + a2_ * inSquared + a3_ * inCubed);
<a name="l00090"></a>00090
<a name="l00091"></a>00091 <span class="comment">// Apply threshold if we are out of range.</span>
<a name="l00092"></a>00092 <span class="keywordflow">if</span> ( fabs( lastFrame_[0] ) &gt; threshold_ ) {
<a name="l00093"></a>00093 lastFrame_[0] = ( lastFrame_[0] &lt; 0 ? -threshold_ : threshold_ );
<a name="l00094"></a>00094 }
<a name="l00095"></a>00095
<a name="l00096"></a>00096 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00097"></a>00097 }
<a name="l00098"></a>00098
<a name="l00099"></a><a class="code" href="classstk_1_1Cubic.html#af3e8a1d6ffe5e9788d841343bd5722cc">00099</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Cubic.html#a24e2270a347e0a6721bc0f7e0040117c" title="Input one sample to the function and return one output.">Cubic :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00100"></a>00100 {
<a name="l00101"></a>00101 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00102"></a>00102 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00103"></a>00103 oStream_ &lt;&lt; <span class="stringliteral">&quot;Cubic::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00104"></a>00104 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00105"></a>00105 }
<a name="l00106"></a>00106 <span class="preprocessor">#endif</span>
<a name="l00107"></a>00107 <span class="preprocessor"></span>
<a name="l00108"></a>00108 StkFloat *samples = &amp;frames[channel];
<a name="l00109"></a>00109 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00110"></a>00110 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00111"></a>00111 *samples = <a class="code" href="classstk_1_1Cubic.html#a24e2270a347e0a6721bc0f7e0040117c" title="Input one sample to the function and return one output.">tick</a>( *samples );
<a name="l00112"></a>00112
<a name="l00113"></a>00113 lastFrame_[0] = *(samples-hop);
<a name="l00114"></a>00114 <span class="keywordflow">return</span> frames;
<a name="l00115"></a>00115 }
<a name="l00116"></a>00116
<a name="l00117"></a><a class="code" href="classstk_1_1Cubic.html#aef7887fe7e5131ce48c8488a21d295b9">00117</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Cubic.html#a24e2270a347e0a6721bc0f7e0040117c" title="Input one sample to the function and return one output.">Cubic :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel )
<a name="l00118"></a>00118 {
<a name="l00119"></a>00119 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00120"></a>00120 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( iChannel &gt;= iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() || oChannel &gt;= oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00121"></a>00121 oStream_ &lt;&lt; <span class="stringliteral">&quot;Cubic::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00122"></a>00122 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00123"></a>00123 }
<a name="l00124"></a>00124 <span class="preprocessor">#endif</span>
<a name="l00125"></a>00125 <span class="preprocessor"></span>
<a name="l00126"></a>00126 StkFloat *iSamples = &amp;iFrames[iChannel];
<a name="l00127"></a>00127 StkFloat *oSamples = &amp;oFrames[oChannel];
<a name="l00128"></a>00128 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iHop = iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(), oHop = oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00129"></a>00129 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;iFrames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, iSamples += iHop, oSamples += oHop )
<a name="l00130"></a>00130 *oSamples = <a class="code" href="classstk_1_1Cubic.html#a24e2270a347e0a6721bc0f7e0040117c" title="Input one sample to the function and return one output.">tick</a>( *iSamples );
<a name="l00131"></a>00131
<a name="l00132"></a>00132 lastFrame_[0] = *(oSamples-oHop);
<a name="l00133"></a>00133 <span class="keywordflow">return</span> iFrames;
<a name="l00134"></a>00134 }
<a name="l00135"></a>00135
<a name="l00136"></a>00136 } <span class="comment">// stk namespace</span>
<a name="l00137"></a>00137
<a name="l00138"></a>00138 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,63 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>DelayA.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00020"></a>00020 <span class="comment">/***************************************************/</span>
<a name="l00021"></a>00021
<a name="l00022"></a>00022 <span class="preprocessor">#ifndef STK_DELAYA_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span><span class="preprocessor">#define STK_DELAYA_H</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "Delay.h"</span>
<a name="l00026"></a>00026
<a name="l00027"></a><a class="code" href="classDelayA.html">00027</a> <span class="keyword">class </span><a class="code" href="classDelayA.html">DelayA</a> : <span class="keyword">public</span> <a class="code" href="classDelay.html">Delay</a>
<a name="l00028"></a>00028 {
<a name="l00029"></a>00029 <span class="keyword">public</span>:
<a name="l00030"></a>00030
<a name="l00032"></a>00032 <a class="code" href="classDelayA.html#a0">DelayA</a>();
<a name="l00033"></a>00033
<a name="l00035"></a>00035
<a name="l00040"></a>00040 <a class="code" href="classDelayA.html#a0">DelayA</a>(StkFloat delay, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> maxDelay);
<a name="l00041"></a>00041
<a name="l00043"></a>00043 <a class="code" href="classDelayA.html#a2">~DelayA</a>();
<a name="l00044"></a>00044
<a name="l00046"></a>00046 <span class="keywordtype">void</span> <a class="code" href="classDelayA.html#a3">clear</a>();
<a name="l00047"></a>00047
<a name="l00049"></a>00049
<a name="l00052"></a>00052 <span class="keywordtype">void</span> <a class="code" href="classDelayA.html#a4">setDelay</a>(StkFloat delay);
<a name="l00053"></a>00053
<a name="l00055"></a>00055 StkFloat <a class="code" href="classDelayA.html#a5">getDelay</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00056"></a>00056
<a name="l00058"></a>00058
<a name="l00061"></a>00061 StkFloat <a class="code" href="classDelayA.html#a6">nextOut</a>(<span class="keywordtype">void</span>);
<a name="l00062"></a>00062
<a name="l00063"></a>00063 <span class="keyword">protected</span>:
<a name="l00064"></a>00064
<a name="l00065"></a>00065 StkFloat computeSample( StkFloat input );
<a name="l00066"></a>00066
<a name="l00067"></a>00067 StkFloat alpha_;
<a name="l00068"></a>00068 StkFloat coeff_;
<a name="l00069"></a>00069 StkFloat apInput_;
<a name="l00070"></a>00070 StkFloat nextOutput_;
<a name="l00071"></a>00071 <span class="keywordtype">bool</span> doNextOut_;
<a name="l00072"></a>00072 };
<a name="l00073"></a>00073
<a name="l00074"></a>00074 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,168 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>DelayA.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_DELAYA_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_DELAYA_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Filter.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00026"></a>00026 <span class="comment">/***************************************************/</span>
<a name="l00027"></a>00027
<a name="l00028"></a><a class="code" href="classstk_1_1DelayA.html">00028</a> <span class="keyword">class </span><a class="code" href="classstk_1_1DelayA.html" title="STK allpass interpolating delay line class.">DelayA</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Filter.html" title="STK abstract filter class.">Filter</a>
<a name="l00029"></a>00029 {
<a name="l00030"></a>00030 <span class="keyword">public</span>:
<a name="l00031"></a>00031
<a name="l00033"></a>00033
<a name="l00038"></a>00038 <a class="code" href="classstk_1_1DelayA.html#a9beb31f924bca961df99c1ea7789c42d" title="Default constructor creates a delay-line with maximum length of 4095 samples and...">DelayA</a>( StkFloat delay = 0.5, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> maxDelay = 4095 );
<a name="l00039"></a>00039
<a name="l00041"></a>00041 <a class="code" href="classstk_1_1DelayA.html#ab6f2ee45d350b4bb3515fcdaf25a986a" title="Class destructor.">~DelayA</a>();
<a name="l00042"></a>00042
<a name="l00044"></a>00044 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1DelayA.html#ae5e59f497eb84280fd94d60257ffae69" title="Clears all internal states of the delay line.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00045"></a>00045
<a name="l00047"></a><a class="code" href="classstk_1_1DelayA.html#a6ac5c818b6669bf904a4a5a81358bd28">00047</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="classstk_1_1DelayA.html#a6ac5c818b6669bf904a4a5a81358bd28" title="Get the maximum delay-line length.">getMaximumDelay</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() - 1; };
<a name="l00048"></a>00048
<a name="l00050"></a>00050
<a name="l00057"></a>00057 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1DelayA.html#ab10bb5eb8316ce8b3c6667bdf4c98389" title="Set the maximum delay-line length.">setMaximumDelay</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay );
<a name="l00058"></a>00058
<a name="l00060"></a>00060
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1DelayA.html#a83ddc9bdf2f5059159160fdac0e25eda" title="Set the delay-line length.">setDelay</a>( StkFloat delay );
<a name="l00064"></a>00064
<a name="l00066"></a><a class="code" href="classstk_1_1DelayA.html#a363d9ccc50acbd1f3bb533aa1ab3d9c7">00066</a> StkFloat <a class="code" href="classstk_1_1DelayA.html#a363d9ccc50acbd1f3bb533aa1ab3d9c7" title="Return the current delay-line length.">getDelay</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> delay_; };
<a name="l00067"></a>00067
<a name="l00069"></a>00069
<a name="l00074"></a>00074 StkFloat <a class="code" href="classstk_1_1DelayA.html#aab723097f4634b23b0cd4ba8762271dc" title="Return the value at tapDelay samples from the delay-line input.">tapOut</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> tapDelay );
<a name="l00075"></a>00075
<a name="l00077"></a>00077 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1DelayA.html#adf33f950e60d31d355ea865ae3efd44e" title="Set the value at tapDelay samples from the delay-line input.">tapIn</a>( StkFloat value, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> tapDelay );
<a name="l00078"></a>00078
<a name="l00080"></a><a class="code" href="classstk_1_1DelayA.html#a4372d0e178af1cb6ca465affddfb1566">00080</a> StkFloat <a class="code" href="classstk_1_1DelayA.html#a4372d0e178af1cb6ca465affddfb1566" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00081"></a>00081
<a name="l00083"></a>00083
<a name="l00086"></a>00086 StkFloat <a class="code" href="classstk_1_1DelayA.html#a08c8ade17cea4a54844f90d976b14314" title="Return the value which will be output by the next call to tick().">nextOut</a>( <span class="keywordtype">void</span> );
<a name="l00087"></a>00087
<a name="l00089"></a>00089 StkFloat <a class="code" href="classstk_1_1DelayA.html#ae602abe91560fb5f141db52333359b74" title="Input one sample to the filter and return one output.">tick</a>( StkFloat input );
<a name="l00090"></a>00090
<a name="l00092"></a>00092
<a name="l00100"></a>00100 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1DelayA.html#ae602abe91560fb5f141db52333359b74" title="Input one sample to the filter and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00101"></a>00101
<a name="l00103"></a>00103
<a name="l00111"></a>00111 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1DelayA.html#ae602abe91560fb5f141db52333359b74" title="Input one sample to the filter and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> &amp;oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel = 0 );
<a name="l00112"></a>00112
<a name="l00113"></a>00113 <span class="keyword">protected</span>:
<a name="l00114"></a>00114
<a name="l00115"></a>00115 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> inPoint_;
<a name="l00116"></a>00116 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> outPoint_;
<a name="l00117"></a>00117 StkFloat delay_;
<a name="l00118"></a>00118 StkFloat alpha_;
<a name="l00119"></a>00119 StkFloat coeff_;
<a name="l00120"></a>00120 StkFloat apInput_;
<a name="l00121"></a>00121 StkFloat nextOutput_;
<a name="l00122"></a>00122 <span class="keywordtype">bool</span> doNextOut_;
<a name="l00123"></a>00123 };
<a name="l00124"></a>00124
<a name="l00125"></a><a class="code" href="classstk_1_1DelayA.html#a08c8ade17cea4a54844f90d976b14314">00125</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1DelayA.html#a08c8ade17cea4a54844f90d976b14314" title="Return the value which will be output by the next call to tick().">DelayA :: nextOut</a>( <span class="keywordtype">void</span> )
<a name="l00126"></a>00126 {
<a name="l00127"></a>00127 <span class="keywordflow">if</span> ( doNextOut_ ) {
<a name="l00128"></a>00128 <span class="comment">// Do allpass interpolation delay.</span>
<a name="l00129"></a>00129 nextOutput_ = -coeff_ * lastFrame_[0];
<a name="l00130"></a>00130 nextOutput_ += apInput_ + ( coeff_ * inputs_[outPoint_] );
<a name="l00131"></a>00131 doNextOut_ = <span class="keyword">false</span>;
<a name="l00132"></a>00132 }
<a name="l00133"></a>00133
<a name="l00134"></a>00134 <span class="keywordflow">return</span> nextOutput_;
<a name="l00135"></a>00135 }
<a name="l00136"></a>00136
<a name="l00137"></a><a class="code" href="classstk_1_1DelayA.html#ae602abe91560fb5f141db52333359b74">00137</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1DelayA.html#ae602abe91560fb5f141db52333359b74" title="Input one sample to the filter and return one output.">DelayA :: tick</a>( StkFloat input )
<a name="l00138"></a>00138 {
<a name="l00139"></a>00139 inputs_[inPoint_++] = input * gain_;
<a name="l00140"></a>00140
<a name="l00141"></a>00141 <span class="comment">// Increment input pointer modulo length.</span>
<a name="l00142"></a>00142 <span class="keywordflow">if</span> ( inPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() )
<a name="l00143"></a>00143 inPoint_ = 0;
<a name="l00144"></a>00144
<a name="l00145"></a>00145 lastFrame_[0] = <a class="code" href="classstk_1_1DelayA.html#a08c8ade17cea4a54844f90d976b14314" title="Return the value which will be output by the next call to tick().">nextOut</a>();
<a name="l00146"></a>00146 doNextOut_ = <span class="keyword">true</span>;
<a name="l00147"></a>00147
<a name="l00148"></a>00148 <span class="comment">// Save the allpass input and increment modulo length.</span>
<a name="l00149"></a>00149 apInput_ = inputs_[outPoint_++];
<a name="l00150"></a>00150 <span class="keywordflow">if</span> ( outPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() )
<a name="l00151"></a>00151 outPoint_ = 0;
<a name="l00152"></a>00152
<a name="l00153"></a>00153 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00154"></a>00154 }
<a name="l00155"></a>00155
<a name="l00156"></a><a class="code" href="classstk_1_1DelayA.html#a57c568d56e5ed35926cfc23f83d48d98">00156</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1DelayA.html#ae602abe91560fb5f141db52333359b74" title="Input one sample to the filter and return one output.">DelayA :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00157"></a>00157 {
<a name="l00158"></a>00158 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00159"></a>00159 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00160"></a>00160 oStream_ &lt;&lt; <span class="stringliteral">&quot;DelayA::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00161"></a>00161 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00162"></a>00162 }
<a name="l00163"></a>00163 <span class="preprocessor">#endif</span>
<a name="l00164"></a>00164 <span class="preprocessor"></span>
<a name="l00165"></a>00165 StkFloat *samples = &amp;frames[channel];
<a name="l00166"></a>00166 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00167"></a>00167 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00168"></a>00168 inputs_[inPoint_++] = *samples * gain_;
<a name="l00169"></a>00169 <span class="keywordflow">if</span> ( inPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) inPoint_ = 0;
<a name="l00170"></a>00170 *samples = <a class="code" href="classstk_1_1DelayA.html#a08c8ade17cea4a54844f90d976b14314" title="Return the value which will be output by the next call to tick().">nextOut</a>();
<a name="l00171"></a>00171 lastFrame_[0] = *samples;
<a name="l00172"></a>00172 doNextOut_ = <span class="keyword">true</span>;
<a name="l00173"></a>00173 apInput_ = inputs_[outPoint_++];
<a name="l00174"></a>00174 <span class="keywordflow">if</span> ( outPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) outPoint_ = 0;
<a name="l00175"></a>00175 }
<a name="l00176"></a>00176
<a name="l00177"></a>00177 <span class="keywordflow">return</span> frames;
<a name="l00178"></a>00178 }
<a name="l00179"></a>00179
<a name="l00180"></a><a class="code" href="classstk_1_1DelayA.html#a94a2998c9b2d1697ed9a747973be0a89">00180</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1DelayA.html#ae602abe91560fb5f141db52333359b74" title="Input one sample to the filter and return one output.">DelayA :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel )
<a name="l00181"></a>00181 {
<a name="l00182"></a>00182 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00183"></a>00183 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( iChannel &gt;= iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() || oChannel &gt;= oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00184"></a>00184 oStream_ &lt;&lt; <span class="stringliteral">&quot;DelayA::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00185"></a>00185 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00186"></a>00186 }
<a name="l00187"></a>00187 <span class="preprocessor">#endif</span>
<a name="l00188"></a>00188 <span class="preprocessor"></span>
<a name="l00189"></a>00189 StkFloat *iSamples = &amp;iFrames[iChannel];
<a name="l00190"></a>00190 StkFloat *oSamples = &amp;oFrames[oChannel];
<a name="l00191"></a>00191 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iHop = iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(), oHop = oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00192"></a>00192 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;iFrames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, iSamples += iHop, oSamples += oHop ) {
<a name="l00193"></a>00193 inputs_[inPoint_++] = *iSamples * gain_;
<a name="l00194"></a>00194 <span class="keywordflow">if</span> ( inPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) inPoint_ = 0;
<a name="l00195"></a>00195 *oSamples = <a class="code" href="classstk_1_1DelayA.html#a08c8ade17cea4a54844f90d976b14314" title="Return the value which will be output by the next call to tick().">nextOut</a>();
<a name="l00196"></a>00196 lastFrame_[0] = *oSamples;
<a name="l00197"></a>00197 doNextOut_ = <span class="keyword">true</span>;
<a name="l00198"></a>00198 apInput_ = inputs_[outPoint_++];
<a name="l00199"></a>00199 <span class="keywordflow">if</span> ( outPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) outPoint_ = 0;
<a name="l00200"></a>00200 }
<a name="l00201"></a>00201
<a name="l00202"></a>00202 <span class="keywordflow">return</span> iFrames;
<a name="l00203"></a>00203 }
<a name="l00204"></a>00204
<a name="l00205"></a>00205 } <span class="comment">// stk namespace</span>
<a name="l00206"></a>00206
<a name="l00207"></a>00207 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,60 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>DelayL.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00023"></a>00023 <span class="comment">/***************************************************/</span>
<a name="l00024"></a>00024
<a name="l00025"></a>00025 <span class="preprocessor">#ifndef STK_DELAYL_H</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define STK_DELAYL_H</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "Delay.h"</span>
<a name="l00029"></a>00029
<a name="l00030"></a><a class="code" href="classDelayL.html">00030</a> <span class="keyword">class </span><a class="code" href="classDelayL.html">DelayL</a> : <span class="keyword">public</span> <a class="code" href="classDelay.html">Delay</a>
<a name="l00031"></a>00031 {
<a name="l00032"></a>00032 <span class="keyword">public</span>:
<a name="l00033"></a>00033
<a name="l00035"></a>00035 <a class="code" href="classDelayL.html#a0">DelayL</a>();
<a name="l00036"></a>00036
<a name="l00038"></a>00038
<a name="l00043"></a>00043 <a class="code" href="classDelayL.html#a0">DelayL</a>(StkFloat delay, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> maxDelay);
<a name="l00044"></a>00044
<a name="l00046"></a>00046 <a class="code" href="classDelayL.html#a2">~DelayL</a>();
<a name="l00047"></a>00047
<a name="l00049"></a>00049
<a name="l00052"></a>00052 <span class="keywordtype">void</span> <a class="code" href="classDelayL.html#a3">setDelay</a>(StkFloat delay);
<a name="l00053"></a>00053
<a name="l00055"></a>00055 StkFloat <a class="code" href="classDelayL.html#a4">getDelay</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00056"></a>00056
<a name="l00058"></a>00058
<a name="l00061"></a>00061 StkFloat <a class="code" href="classDelayL.html#a5">nextOut</a>(<span class="keywordtype">void</span>);
<a name="l00062"></a>00062
<a name="l00063"></a>00063 <span class="keyword">protected</span>:
<a name="l00064"></a>00064
<a name="l00065"></a>00065 StkFloat computeSample( StkFloat input );
<a name="l00066"></a>00066
<a name="l00067"></a>00067 StkFloat alpha_;
<a name="l00068"></a>00068 StkFloat omAlpha_;
<a name="l00069"></a>00069 StkFloat nextOutput_;
<a name="l00070"></a>00070 <span class="keywordtype">bool</span> doNextOut_;
<a name="l00071"></a>00071 };
<a name="l00072"></a>00072
<a name="l00073"></a>00073 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,166 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>DelayL.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_DELAYL_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_DELAYL_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Filter.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00025"></a>00025 <span class="comment">/***************************************************/</span>
<a name="l00026"></a>00026
<a name="l00027"></a><a class="code" href="classstk_1_1DelayL.html">00027</a> <span class="keyword">class </span><a class="code" href="classstk_1_1DelayL.html" title="STK linear interpolating delay line class.">DelayL</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Filter.html" title="STK abstract filter class.">Filter</a>
<a name="l00028"></a>00028 {
<a name="l00029"></a>00029 <span class="keyword">public</span>:
<a name="l00030"></a>00030
<a name="l00032"></a>00032
<a name="l00037"></a>00037 <a class="code" href="classstk_1_1DelayL.html#ad60f2222397e19fe524fc3b76b59b846" title="Default constructor creates a delay-line with maximum length of 4095 samples and...">DelayL</a>( StkFloat delay = 0.0, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> maxDelay = 4095 );
<a name="l00038"></a>00038
<a name="l00040"></a>00040 <a class="code" href="classstk_1_1DelayL.html#a8f9b49c7b098d9e379baf44b0c345457" title="Class destructor.">~DelayL</a>();
<a name="l00041"></a>00041
<a name="l00043"></a><a class="code" href="classstk_1_1DelayL.html#acbcb8326db134a26fdad5f16f1a0ba7e">00043</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="classstk_1_1DelayL.html#acbcb8326db134a26fdad5f16f1a0ba7e" title="Get the maximum delay-line length.">getMaximumDelay</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() - 1; };
<a name="l00044"></a>00044
<a name="l00046"></a>00046
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1DelayL.html#a18b40806591654a9c9c32603990fce40" title="Set the maximum delay-line length.">setMaximumDelay</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay );
<a name="l00054"></a>00054
<a name="l00056"></a>00056
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1DelayL.html#a80dd30628502a7c3b37ff045176eb91f" title="Set the delay-line length.">setDelay</a>( StkFloat delay );
<a name="l00060"></a>00060
<a name="l00062"></a><a class="code" href="classstk_1_1DelayL.html#aaf2d5ef7dba47ff1fb279c327021beb0">00062</a> StkFloat <a class="code" href="classstk_1_1DelayL.html#aaf2d5ef7dba47ff1fb279c327021beb0" title="Return the current delay-line length.">getDelay</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> delay_; };
<a name="l00063"></a>00063
<a name="l00065"></a>00065
<a name="l00070"></a>00070 StkFloat <a class="code" href="classstk_1_1DelayL.html#ad16a1f176e93a9beb8e685aafa32579e" title="Return the value at tapDelay samples from the delay-line input.">tapOut</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> tapDelay );
<a name="l00071"></a>00071
<a name="l00073"></a>00073 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1DelayL.html#a984843567ba3de6543bd13c23457f495" title="Set the value at tapDelay samples from the delay-line input.">tapIn</a>( StkFloat value, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> tapDelay );
<a name="l00074"></a>00074
<a name="l00076"></a><a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9">00076</a> StkFloat <a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00077"></a>00077
<a name="l00079"></a>00079
<a name="l00082"></a>00082 StkFloat <a class="code" href="classstk_1_1DelayL.html#abfe69d19690fab75b6026dab96870fb8" title="Return the value which will be output by the next call to tick().">nextOut</a>( <span class="keywordtype">void</span> );
<a name="l00083"></a>00083
<a name="l00085"></a>00085 StkFloat <a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( StkFloat input );
<a name="l00086"></a>00086
<a name="l00088"></a>00088
<a name="l00096"></a>00096 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00097"></a>00097
<a name="l00099"></a>00099
<a name="l00107"></a>00107 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> &amp;oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel = 0 );
<a name="l00108"></a>00108
<a name="l00109"></a>00109 <span class="keyword">protected</span>:
<a name="l00110"></a>00110
<a name="l00111"></a>00111 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> inPoint_;
<a name="l00112"></a>00112 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> outPoint_;
<a name="l00113"></a>00113 StkFloat delay_;
<a name="l00114"></a>00114 StkFloat alpha_;
<a name="l00115"></a>00115 StkFloat omAlpha_;
<a name="l00116"></a>00116 StkFloat nextOutput_;
<a name="l00117"></a>00117 <span class="keywordtype">bool</span> doNextOut_;
<a name="l00118"></a>00118 };
<a name="l00119"></a>00119
<a name="l00120"></a><a class="code" href="classstk_1_1DelayL.html#abfe69d19690fab75b6026dab96870fb8">00120</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1DelayL.html#abfe69d19690fab75b6026dab96870fb8" title="Return the value which will be output by the next call to tick().">DelayL :: nextOut</a>( <span class="keywordtype">void</span> )
<a name="l00121"></a>00121 {
<a name="l00122"></a>00122 <span class="keywordflow">if</span> ( doNextOut_ ) {
<a name="l00123"></a>00123 <span class="comment">// First 1/2 of interpolation</span>
<a name="l00124"></a>00124 nextOutput_ = inputs_[outPoint_] * omAlpha_;
<a name="l00125"></a>00125 <span class="comment">// Second 1/2 of interpolation</span>
<a name="l00126"></a>00126 <span class="keywordflow">if</span> (outPoint_+1 &lt; inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>())
<a name="l00127"></a>00127 nextOutput_ += inputs_[outPoint_+1] * alpha_;
<a name="l00128"></a>00128 <span class="keywordflow">else</span>
<a name="l00129"></a>00129 nextOutput_ += inputs_[0] * alpha_;
<a name="l00130"></a>00130 doNextOut_ = <span class="keyword">false</span>;
<a name="l00131"></a>00131 }
<a name="l00132"></a>00132
<a name="l00133"></a>00133 <span class="keywordflow">return</span> nextOutput_;
<a name="l00134"></a>00134 }
<a name="l00135"></a>00135
<a name="l00136"></a><a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f">00136</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">DelayL :: tick</a>( StkFloat input )
<a name="l00137"></a>00137 {
<a name="l00138"></a>00138 inputs_[inPoint_++] = input * gain_;
<a name="l00139"></a>00139
<a name="l00140"></a>00140 <span class="comment">// Increment input pointer modulo length.</span>
<a name="l00141"></a>00141 <span class="keywordflow">if</span> ( inPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() )
<a name="l00142"></a>00142 inPoint_ = 0;
<a name="l00143"></a>00143
<a name="l00144"></a>00144 lastFrame_[0] = <a class="code" href="classstk_1_1DelayL.html#abfe69d19690fab75b6026dab96870fb8" title="Return the value which will be output by the next call to tick().">nextOut</a>();
<a name="l00145"></a>00145 doNextOut_ = <span class="keyword">true</span>;
<a name="l00146"></a>00146
<a name="l00147"></a>00147 <span class="comment">// Increment output pointer modulo length.</span>
<a name="l00148"></a>00148 <span class="keywordflow">if</span> ( ++outPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() )
<a name="l00149"></a>00149 outPoint_ = 0;
<a name="l00150"></a>00150
<a name="l00151"></a>00151 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00152"></a>00152 }
<a name="l00153"></a>00153
<a name="l00154"></a><a class="code" href="classstk_1_1DelayL.html#acdc5d41de53c53d9d4b39ee8a46fb96c">00154</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">DelayL :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00155"></a>00155 {
<a name="l00156"></a>00156 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00157"></a>00157 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00158"></a>00158 oStream_ &lt;&lt; <span class="stringliteral">&quot;DelayL::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00159"></a>00159 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00160"></a>00160 }
<a name="l00161"></a>00161 <span class="preprocessor">#endif</span>
<a name="l00162"></a>00162 <span class="preprocessor"></span>
<a name="l00163"></a>00163 StkFloat *samples = &amp;frames[channel];
<a name="l00164"></a>00164 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00165"></a>00165 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00166"></a>00166 inputs_[inPoint_++] = *samples * gain_;
<a name="l00167"></a>00167 <span class="keywordflow">if</span> ( inPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) inPoint_ = 0;
<a name="l00168"></a>00168 *samples = <a class="code" href="classstk_1_1DelayL.html#abfe69d19690fab75b6026dab96870fb8" title="Return the value which will be output by the next call to tick().">nextOut</a>();
<a name="l00169"></a>00169 doNextOut_ = <span class="keyword">true</span>;
<a name="l00170"></a>00170 <span class="keywordflow">if</span> ( ++outPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) outPoint_ = 0;
<a name="l00171"></a>00171 }
<a name="l00172"></a>00172
<a name="l00173"></a>00173 lastFrame_[0] = *(samples-hop);
<a name="l00174"></a>00174 <span class="keywordflow">return</span> frames;
<a name="l00175"></a>00175 }
<a name="l00176"></a>00176
<a name="l00177"></a><a class="code" href="classstk_1_1DelayL.html#a56ee486fb01fbf45d5a3dbad754a838e">00177</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">DelayL :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel )
<a name="l00178"></a>00178 {
<a name="l00179"></a>00179 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00180"></a>00180 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( iChannel &gt;= iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() || oChannel &gt;= oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00181"></a>00181 oStream_ &lt;&lt; <span class="stringliteral">&quot;DelayL::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00182"></a>00182 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00183"></a>00183 }
<a name="l00184"></a>00184 <span class="preprocessor">#endif</span>
<a name="l00185"></a>00185 <span class="preprocessor"></span>
<a name="l00186"></a>00186 StkFloat *iSamples = &amp;iFrames[iChannel];
<a name="l00187"></a>00187 StkFloat *oSamples = &amp;oFrames[oChannel];
<a name="l00188"></a>00188 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iHop = iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(), oHop = oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00189"></a>00189 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;iFrames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, iSamples += iHop, oSamples += oHop ) {
<a name="l00190"></a>00190 inputs_[inPoint_++] = *iSamples * gain_;
<a name="l00191"></a>00191 <span class="keywordflow">if</span> ( inPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) inPoint_ = 0;
<a name="l00192"></a>00192 *oSamples = <a class="code" href="classstk_1_1DelayL.html#abfe69d19690fab75b6026dab96870fb8" title="Return the value which will be output by the next call to tick().">nextOut</a>();
<a name="l00193"></a>00193 doNextOut_ = <span class="keyword">true</span>;
<a name="l00194"></a>00194 <span class="keywordflow">if</span> ( ++outPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) outPoint_ = 0;
<a name="l00195"></a>00195 }
<a name="l00196"></a>00196
<a name="l00197"></a>00197 lastFrame_[0] = *(oSamples-oHop);
<a name="l00198"></a>00198 <span class="keywordflow">return</span> iFrames;
<a name="l00199"></a>00199 }
<a name="l00200"></a>00200
<a name="l00201"></a>00201 } <span class="comment">// stk namespace</span>
<a name="l00202"></a>00202
<a name="l00203"></a>00203 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,79 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Delay.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00019"></a>00019 <span class="comment">/***************************************************/</span>
<a name="l00020"></a>00020
<a name="l00021"></a>00021 <span class="preprocessor">#ifndef STK_DELAY_H</span>
<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define STK_DELAY_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
<a name="l00024"></a>00024 <span class="preprocessor">#include "Filter.h"</span>
<a name="l00025"></a>00025
<a name="l00026"></a><a class="code" href="classDelay.html">00026</a> <span class="keyword">class </span><a class="code" href="classDelay.html">Delay</a> : <span class="keyword">protected</span> <a class="code" href="classFilter.html">Filter</a>
<a name="l00027"></a>00027 {
<a name="l00028"></a>00028 <span class="keyword">public</span>:
<a name="l00029"></a>00029
<a name="l00031"></a>00031 <a class="code" href="classDelay.html#a0">Delay</a>();
<a name="l00032"></a>00032
<a name="l00034"></a>00034
<a name="l00039"></a>00039 <a class="code" href="classDelay.html#a0">Delay</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> maxDelay);
<a name="l00040"></a>00040
<a name="l00042"></a>00042 <span class="keyword">virtual</span> <a class="code" href="classDelay.html#a2">~Delay</a>();
<a name="l00043"></a>00043
<a name="l00045"></a>00045 <span class="keywordtype">void</span> <a class="code" href="classDelay.html#a3">clear</a>();
<a name="l00046"></a>00046
<a name="l00048"></a>00048
<a name="l00055"></a>00055 <span class="keywordtype">void</span> <a class="code" href="classDelay.html#a4">setMaximumDelay</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay);
<a name="l00056"></a>00056
<a name="l00058"></a>00058
<a name="l00061"></a>00061 <span class="keywordtype">void</span> <a class="code" href="classDelay.html#a5">setDelay</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay);
<a name="l00062"></a>00062
<a name="l00064"></a>00064 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="classDelay.html#a6">getDelay</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00065"></a>00065
<a name="l00067"></a>00067 StkFloat <a class="code" href="classDelay.html#a7">energy</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00068"></a>00068
<a name="l00070"></a>00070
<a name="l00075"></a>00075 StkFloat <a class="code" href="classDelay.html#a8">contentsAt</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> tapDelay);
<a name="l00076"></a>00076
<a name="l00078"></a>00078 StkFloat <a class="code" href="classDelay.html#a9">lastOut</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00079"></a>00079
<a name="l00081"></a>00081
<a name="l00084"></a>00084 <span class="keyword">virtual</span> StkFloat <a class="code" href="classDelay.html#a10">nextOut</a>(<span class="keywordtype">void</span>);
<a name="l00085"></a>00085
<a name="l00087"></a>00087 <span class="keyword">virtual</span> StkFloat <a class="code" href="classDelay.html#a11">tick</a>(StkFloat sample);
<a name="l00088"></a>00088
<a name="l00090"></a>00090
<a name="l00096"></a>00096 <span class="keyword">virtual</span> <a class="code" href="classStkFrames.html">StkFrames</a>&amp; <a class="code" href="classDelay.html#a11">tick</a>( <a class="code" href="classStkFrames.html">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00097"></a>00097
<a name="l00098"></a>00098 <span class="keyword">protected</span>:
<a name="l00099"></a>00099
<a name="l00100"></a>00100 <span class="comment">// This function must be implemented in all subclasses. It is used</span>
<a name="l00101"></a>00101 <span class="comment">// to get around a C++ problem with overloaded virtual functions.</span>
<a name="l00102"></a>00102 <span class="keyword">virtual</span> StkFloat computeSample( StkFloat input );
<a name="l00103"></a>00103
<a name="l00104"></a>00104 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> inPoint_;
<a name="l00105"></a>00105 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> outPoint_;
<a name="l00106"></a>00106 StkFloat delay_;
<a name="l00107"></a>00107 };
<a name="l00108"></a>00108
<a name="l00109"></a>00109 <span class="preprocessor">#endif</span>
<a name="l00110"></a>00110 <span class="preprocessor"></span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,148 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Delay.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_DELAY_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_DELAY_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Filter.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00022"></a>00022 <span class="comment">/***************************************************/</span>
<a name="l00023"></a>00023
<a name="l00024"></a><a class="code" href="classstk_1_1Delay.html">00024</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Delay.html" title="STK non-interpolating delay line class.">Delay</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Filter.html" title="STK abstract filter class.">Filter</a>
<a name="l00025"></a>00025 {
<a name="l00026"></a>00026 <span class="keyword">public</span>:
<a name="l00027"></a>00027
<a name="l00029"></a>00029
<a name="l00034"></a>00034 <a class="code" href="classstk_1_1Delay.html#a9644532bfea44fae046e54f2509cf1ef" title="The default constructor creates a delay-line with maximum length of 4095 samples...">Delay</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> maxDelay = 4095 );
<a name="l00035"></a>00035
<a name="l00037"></a>00037 <a class="code" href="classstk_1_1Delay.html#a24b6ed6c7c5fc6d15935ec2a118b6b4f" title="Class destructor.">~Delay</a>();
<a name="l00038"></a>00038
<a name="l00040"></a><a class="code" href="classstk_1_1Delay.html#a31d348fd15e5b6e23f2984b75968a3ec">00040</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="classstk_1_1Delay.html#a31d348fd15e5b6e23f2984b75968a3ec" title="Get the maximum delay-line length.">getMaximumDelay</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() - 1; };
<a name="l00041"></a>00041
<a name="l00043"></a>00043
<a name="l00050"></a>00050 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Delay.html#a0cf4c8da14bd4105eef06e35caaf1532" title="Set the maximum delay-line length.">setMaximumDelay</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay );
<a name="l00051"></a>00051
<a name="l00053"></a>00053
<a name="l00056"></a>00056 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Delay.html#a5eaeed55ea0c7b30ed66fedd6ef52fc2" title="Set the delay-line length.">setDelay</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay );
<a name="l00057"></a>00057
<a name="l00059"></a><a class="code" href="classstk_1_1Delay.html#a7ae307dc997ff07ff986ca5c4d287441">00059</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="classstk_1_1Delay.html#a7ae307dc997ff07ff986ca5c4d287441" title="Return the current delay-line length.">getDelay</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> delay_; };
<a name="l00060"></a>00060
<a name="l00062"></a>00062
<a name="l00067"></a>00067 StkFloat <a class="code" href="classstk_1_1Delay.html#a4d5e5bab50e4fa062bd3f0e9e2fd19db" title="Return the value at tapDelay samples from the delay-line input.">tapOut</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> tapDelay );
<a name="l00068"></a>00068
<a name="l00070"></a>00070 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Delay.html#abd0b93da7a12eca94c1e68ec3b3774f1" title="Set the value at tapDelay samples from the delay-line input.">tapIn</a>( StkFloat value, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> tapDelay );
<a name="l00071"></a>00071
<a name="l00073"></a>00073
<a name="l00078"></a>00078 StkFloat <a class="code" href="classstk_1_1Delay.html#a80f143ab956c9d3b1721958ece6da65e" title="Sum the provided value into the delay line at tapDelay samples from the input.">addTo</a>( StkFloat value, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> tapDelay );
<a name="l00079"></a>00079
<a name="l00081"></a><a class="code" href="classstk_1_1Delay.html#a7b563a37eec1773e8e82f9e328aed9b2">00081</a> StkFloat <a class="code" href="classstk_1_1Delay.html#a7b563a37eec1773e8e82f9e328aed9b2" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00082"></a>00082
<a name="l00084"></a>00084
<a name="l00087"></a><a class="code" href="classstk_1_1Delay.html#a2433e3246551f4fdf1366884cd2ae426">00087</a> StkFloat <a class="code" href="classstk_1_1Delay.html#a2433e3246551f4fdf1366884cd2ae426" title="Return the value that will be output by the next call to tick().">nextOut</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> inputs_[outPoint_]; };
<a name="l00088"></a>00088
<a name="l00090"></a>00090 StkFloat <a class="code" href="classstk_1_1Delay.html#a240830690cd8fa26e0604fd82c65dda1" title="Calculate and return the signal energy in the delay-line.">energy</a>( <span class="keywordtype">void</span> ) <span class="keyword">const</span>;
<a name="l00091"></a>00091
<a name="l00093"></a>00093 StkFloat <a class="code" href="classstk_1_1Delay.html#aa1a929e0e324417b8a55cbf8770532e9" title="Input one sample to the filter and return one output.">tick</a>( StkFloat input );
<a name="l00094"></a>00094
<a name="l00096"></a>00096
<a name="l00104"></a>00104 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Delay.html#aa1a929e0e324417b8a55cbf8770532e9" title="Input one sample to the filter and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00105"></a>00105
<a name="l00107"></a>00107
<a name="l00115"></a>00115 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Delay.html#aa1a929e0e324417b8a55cbf8770532e9" title="Input one sample to the filter and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> &amp;oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel = 0 );
<a name="l00116"></a>00116
<a name="l00117"></a>00117 <span class="keyword">protected</span>:
<a name="l00118"></a>00118
<a name="l00119"></a>00119 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> inPoint_;
<a name="l00120"></a>00120 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> outPoint_;
<a name="l00121"></a>00121 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay_;
<a name="l00122"></a>00122 };
<a name="l00123"></a>00123
<a name="l00124"></a><a class="code" href="classstk_1_1Delay.html#aa1a929e0e324417b8a55cbf8770532e9">00124</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Delay.html#aa1a929e0e324417b8a55cbf8770532e9" title="Input one sample to the filter and return one output.">Delay :: tick</a>( StkFloat input )
<a name="l00125"></a>00125 {
<a name="l00126"></a>00126 inputs_[inPoint_++] = input * gain_;
<a name="l00127"></a>00127
<a name="l00128"></a>00128 <span class="comment">// Check for end condition</span>
<a name="l00129"></a>00129 <span class="keywordflow">if</span> ( inPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() )
<a name="l00130"></a>00130 inPoint_ = 0;
<a name="l00131"></a>00131
<a name="l00132"></a>00132 <span class="comment">// Read out next value</span>
<a name="l00133"></a>00133 lastFrame_[0] = inputs_[outPoint_++];
<a name="l00134"></a>00134
<a name="l00135"></a>00135 <span class="keywordflow">if</span> ( outPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() )
<a name="l00136"></a>00136 outPoint_ = 0;
<a name="l00137"></a>00137
<a name="l00138"></a>00138 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140
<a name="l00141"></a><a class="code" href="classstk_1_1Delay.html#a93fe8e45acb933889be812f35810f977">00141</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Delay.html#aa1a929e0e324417b8a55cbf8770532e9" title="Input one sample to the filter and return one output.">Delay :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00142"></a>00142 {
<a name="l00143"></a>00143 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00144"></a>00144 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00145"></a>00145 oStream_ &lt;&lt; <span class="stringliteral">&quot;Delay::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00146"></a>00146 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00147"></a>00147 }
<a name="l00148"></a>00148 <span class="preprocessor">#endif</span>
<a name="l00149"></a>00149 <span class="preprocessor"></span>
<a name="l00150"></a>00150 StkFloat *samples = &amp;frames[channel];
<a name="l00151"></a>00151 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00152"></a>00152 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00153"></a>00153 inputs_[inPoint_++] = *samples * gain_;
<a name="l00154"></a>00154 <span class="keywordflow">if</span> ( inPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) inPoint_ = 0;
<a name="l00155"></a>00155 *samples = inputs_[outPoint_++];
<a name="l00156"></a>00156 <span class="keywordflow">if</span> ( outPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) outPoint_ = 0;
<a name="l00157"></a>00157 }
<a name="l00158"></a>00158
<a name="l00159"></a>00159 lastFrame_[0] = *(samples-hop);
<a name="l00160"></a>00160 <span class="keywordflow">return</span> frames;
<a name="l00161"></a>00161 }
<a name="l00162"></a>00162
<a name="l00163"></a><a class="code" href="classstk_1_1Delay.html#ade0d544e45e535fd792fe70a2a22da6f">00163</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Delay.html#aa1a929e0e324417b8a55cbf8770532e9" title="Input one sample to the filter and return one output.">Delay :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel )
<a name="l00164"></a>00164 {
<a name="l00165"></a>00165 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00166"></a>00166 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( iChannel &gt;= iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() || oChannel &gt;= oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00167"></a>00167 oStream_ &lt;&lt; <span class="stringliteral">&quot;Delay::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00168"></a>00168 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00169"></a>00169 }
<a name="l00170"></a>00170 <span class="preprocessor">#endif</span>
<a name="l00171"></a>00171 <span class="preprocessor"></span>
<a name="l00172"></a>00172 StkFloat *iSamples = &amp;iFrames[iChannel];
<a name="l00173"></a>00173 StkFloat *oSamples = &amp;oFrames[oChannel];
<a name="l00174"></a>00174 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iHop = iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(), oHop = oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00175"></a>00175 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;iFrames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, iSamples += iHop, oSamples += oHop ) {
<a name="l00176"></a>00176 inputs_[inPoint_++] = *iSamples * gain_;
<a name="l00177"></a>00177 <span class="keywordflow">if</span> ( inPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) inPoint_ = 0;
<a name="l00178"></a>00178 *oSamples = inputs_[outPoint_++];
<a name="l00179"></a>00179 <span class="keywordflow">if</span> ( outPoint_ == inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>() ) outPoint_ = 0;
<a name="l00180"></a>00180 }
<a name="l00181"></a>00181
<a name="l00182"></a>00182 lastFrame_[0] = *(oSamples-oHop);
<a name="l00183"></a>00183 <span class="keywordflow">return</span> iFrames;
<a name="l00184"></a>00184 }
<a name="l00185"></a>00185
<a name="l00186"></a>00186 } <span class="comment">// stk namespace</span>
<a name="l00187"></a>00187
<a name="l00188"></a>00188 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,60 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Drummer.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00016"></a>00016 <span class="comment">/***************************************************/</span>
<a name="l00017"></a>00017
<a name="l00018"></a>00018 <span class="preprocessor">#ifndef STK_DRUMMER_H</span>
<a name="l00019"></a>00019 <span class="preprocessor"></span><span class="preprocessor">#define STK_DRUMMER_H</span>
<a name="l00020"></a>00020 <span class="preprocessor"></span>
<a name="l00021"></a>00021 <span class="preprocessor">#include "Instrmnt.h"</span>
<a name="l00022"></a>00022 <span class="preprocessor">#include "FileWvIn.h"</span>
<a name="l00023"></a>00023 <span class="preprocessor">#include "OnePole.h"</span>
<a name="l00024"></a>00024
<a name="l00025"></a>00025 <span class="keyword">const</span> <span class="keywordtype">int</span> DRUM_NUMWAVES = 11;
<a name="l00026"></a>00026 <span class="keyword">const</span> <span class="keywordtype">int</span> DRUM_POLYPHONY = 4;
<a name="l00027"></a>00027
<a name="l00028"></a><a class="code" href="classDrummer.html">00028</a> <span class="keyword">class </span><a class="code" href="classDrummer.html">Drummer</a> : <span class="keyword">public</span> <a class="code" href="classInstrmnt.html">Instrmnt</a>
<a name="l00029"></a>00029 {
<a name="l00030"></a>00030 <span class="keyword">public</span>:
<a name="l00032"></a>00032
<a name="l00035"></a>00035 <a class="code" href="classDrummer.html#a0">Drummer</a>();
<a name="l00036"></a>00036
<a name="l00038"></a>00038 <a class="code" href="classDrummer.html#a1">~Drummer</a>();
<a name="l00039"></a>00039
<a name="l00041"></a>00041
<a name="l00047"></a>00047 <span class="keywordtype">void</span> <a class="code" href="classDrummer.html#a2">noteOn</a>(StkFloat instrument, StkFloat amplitude);
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <span class="keywordtype">void</span> <a class="code" href="classDrummer.html#a3">noteOff</a>(StkFloat amplitude);
<a name="l00051"></a>00051
<a name="l00052"></a>00052 <span class="keyword">protected</span>:
<a name="l00053"></a>00053
<a name="l00054"></a>00054 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00055"></a>00055
<a name="l00056"></a>00056 <a class="code" href="classFileWvIn.html">FileWvIn</a> waves_[DRUM_POLYPHONY];
<a name="l00057"></a>00057 <a class="code" href="classOnePole.html">OnePole</a> filters_[DRUM_POLYPHONY];
<a name="l00058"></a>00058 std::vector&lt;int&gt; soundOrder_;
<a name="l00059"></a>00059 std::vector&lt;int&gt; soundNumber_;
<a name="l00060"></a>00060 <span class="keywordtype">int</span> nSounding_;
<a name="l00061"></a>00061 };
<a name="l00062"></a>00062
<a name="l00063"></a>00063 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,121 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Drummer.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_DRUMMER_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_DRUMMER_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Instrmnt.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;FileWvIn.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;OnePole.h&quot;</span>
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="keyword">namespace </span>stk {
<a name="l00009"></a>00009
<a name="l00010"></a>00010 <span class="comment">/***************************************************/</span>
<a name="l00025"></a>00025 <span class="comment">/***************************************************/</span>
<a name="l00026"></a>00026
<a name="l00027"></a>00027 <span class="keyword">const</span> <span class="keywordtype">int</span> DRUM_NUMWAVES = 11;
<a name="l00028"></a>00028 <span class="keyword">const</span> <span class="keywordtype">int</span> DRUM_POLYPHONY = 4;
<a name="l00029"></a>00029
<a name="l00030"></a><a class="code" href="classstk_1_1Drummer.html">00030</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Drummer.html" title="STK drum sample player class.">Drummer</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00031"></a>00031 {
<a name="l00032"></a>00032 <span class="keyword">public</span>:
<a name="l00034"></a>00034
<a name="l00037"></a>00037 <a class="code" href="classstk_1_1Drummer.html#af5262dd2b29ae453323c0a514d79d26a" title="Class constructor.">Drummer</a>( <span class="keywordtype">void</span> );
<a name="l00038"></a>00038
<a name="l00040"></a>00040 <a class="code" href="classstk_1_1Drummer.html#a365fb4b2c501129f2efd6edfad1f5453" title="Class destructor.">~Drummer</a>( <span class="keywordtype">void</span> );
<a name="l00041"></a>00041
<a name="l00043"></a>00043
<a name="l00049"></a>00049 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Drummer.html#a5ea03a0ef9a3db02942799b5cbca2ea2" title="Start a note with the given drum type and amplitude.">noteOn</a>( StkFloat instrument, StkFloat amplitude );
<a name="l00050"></a>00050
<a name="l00052"></a>00052 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Drummer.html#aa735313fbdf7f1201fcb167874ecc7cc" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00053"></a>00053
<a name="l00055"></a>00055 StkFloat <a class="code" href="classstk_1_1Drummer.html#ad65c63bfad0ffac03db7f56cf706e4ba" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00056"></a>00056
<a name="l00058"></a>00058
<a name="l00065"></a>00065 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Drummer.html#ad65c63bfad0ffac03db7f56cf706e4ba" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00066"></a>00066
<a name="l00067"></a>00067 <span class="keyword">protected</span>:
<a name="l00068"></a>00068
<a name="l00069"></a>00069 <a class="code" href="classstk_1_1FileWvIn.html" title="STK audio file input class.">FileWvIn</a> waves_[DRUM_POLYPHONY];
<a name="l00070"></a>00070 <a class="code" href="classstk_1_1OnePole.html" title="STK one-pole filter class.">OnePole</a> filters_[DRUM_POLYPHONY];
<a name="l00071"></a>00071 std::vector&lt;int&gt; soundOrder_;
<a name="l00072"></a>00072 std::vector&lt;int&gt; soundNumber_;
<a name="l00073"></a>00073 <span class="keywordtype">int</span> nSounding_;
<a name="l00074"></a>00074 };
<a name="l00075"></a>00075
<a name="l00076"></a><a class="code" href="classstk_1_1Drummer.html#ad65c63bfad0ffac03db7f56cf706e4ba">00076</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Drummer.html#ad65c63bfad0ffac03db7f56cf706e4ba" title="Compute and return one output sample.">Drummer :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00077"></a>00077 {
<a name="l00078"></a>00078 lastFrame_[0] = 0.0;
<a name="l00079"></a>00079 <span class="keywordflow">if</span> ( nSounding_ == 0 ) <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00080"></a>00080
<a name="l00081"></a>00081 <span class="keywordflow">for</span> ( <span class="keywordtype">int</span> i=0; i&lt;DRUM_POLYPHONY; i++ ) {
<a name="l00082"></a>00082 <span class="keywordflow">if</span> ( soundOrder_[i] &gt;= 0 ) {
<a name="l00083"></a>00083 <span class="keywordflow">if</span> ( waves_[i].isFinished() ) {
<a name="l00084"></a>00084 <span class="comment">// Re-order the list.</span>
<a name="l00085"></a>00085 <span class="keywordflow">for</span> ( <span class="keywordtype">int</span> j=0; j&lt;DRUM_POLYPHONY; j++ ) {
<a name="l00086"></a>00086 <span class="keywordflow">if</span> ( soundOrder_[j] &gt; soundOrder_[i] )
<a name="l00087"></a>00087 soundOrder_[j] -= 1;
<a name="l00088"></a>00088 }
<a name="l00089"></a>00089 soundOrder_[i] = -1;
<a name="l00090"></a>00090 nSounding_--;
<a name="l00091"></a>00091 }
<a name="l00092"></a>00092 <span class="keywordflow">else</span>
<a name="l00093"></a>00093 lastFrame_[0] += filters_[i].<a class="code" href="classstk_1_1OnePole.html#a3c83b6d43f76bec06f11caa9de76881e" title="Input one sample to the filter and return one output.">tick</a>( waves_[i].<a class="code" href="classstk_1_1Drummer.html#ad65c63bfad0ffac03db7f56cf706e4ba" title="Compute and return one output sample.">tick</a>() );
<a name="l00094"></a>00094 }
<a name="l00095"></a>00095 }
<a name="l00096"></a>00096
<a name="l00097"></a>00097 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00098"></a>00098 }
<a name="l00099"></a>00099
<a name="l00100"></a><a class="code" href="classstk_1_1Drummer.html#ad186a954527a518c47467e6caaa2e2f5">00100</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Drummer.html#ad65c63bfad0ffac03db7f56cf706e4ba" title="Compute and return one output sample.">Drummer :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00101"></a>00101 {
<a name="l00102"></a>00102 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00103"></a>00103 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00104"></a>00104 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels ) {
<a name="l00105"></a>00105 oStream_ &lt;&lt; <span class="stringliteral">&quot;Drummer::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00106"></a>00106 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00107"></a>00107 }
<a name="l00108"></a>00108 <span class="preprocessor">#endif</span>
<a name="l00109"></a>00109 <span class="preprocessor"></span>
<a name="l00110"></a>00110 StkFloat *samples = &amp;frames[channel];
<a name="l00111"></a>00111 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00112"></a>00112 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00113"></a>00113 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00114"></a>00114 *samples++ = <a class="code" href="classstk_1_1Drummer.html#ad65c63bfad0ffac03db7f56cf706e4ba" title="Compute and return one output sample.">tick</a>();
<a name="l00115"></a>00115 }
<a name="l00116"></a>00116 <span class="keywordflow">else</span> {
<a name="l00117"></a>00117 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00118"></a>00118 *samples++ = <a class="code" href="classstk_1_1Drummer.html#ad65c63bfad0ffac03db7f56cf706e4ba" title="Compute and return one output sample.">tick</a>();
<a name="l00119"></a>00119 <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00120"></a>00120 *samples++ = lastFrame_[j];
<a name="l00121"></a>00121 }
<a name="l00122"></a>00122 }
<a name="l00123"></a>00123
<a name="l00124"></a>00124 <span class="keywordflow">return</span> frames;
<a name="l00125"></a>00125 }
<a name="l00126"></a>00126
<a name="l00127"></a>00127
<a name="l00128"></a>00128 } <span class="comment">// stk namespace</span>
<a name="l00129"></a>00129
<a name="l00130"></a>00130 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,56 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Echo.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00009"></a>00009 <span class="comment">/***************************************************/</span>
<a name="l00010"></a>00010
<a name="l00011"></a>00011 <span class="preprocessor">#ifndef STK_ECHO_H</span>
<a name="l00012"></a>00012 <span class="preprocessor"></span><span class="preprocessor">#define STK_ECHO_H</span>
<a name="l00013"></a>00013 <span class="preprocessor"></span>
<a name="l00014"></a>00014 <span class="preprocessor">#include "Effect.h"</span>
<a name="l00015"></a>00015 <span class="preprocessor">#include "Delay.h"</span>
<a name="l00016"></a>00016
<a name="l00017"></a><a class="code" href="classEcho.html">00017</a> <span class="keyword">class </span><a class="code" href="classEcho.html">Echo</a> : <span class="keyword">public</span> <a class="code" href="classEffect.html">Effect</a>
<a name="l00018"></a>00018 {
<a name="l00019"></a>00019 <span class="keyword">public</span>:
<a name="l00021"></a>00021
<a name="l00024"></a>00024 <a class="code" href="classEcho.html#a0">Echo</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> maximumDelay = (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) <a class="code" href="classStk.html#e0">Stk::sampleRate</a>() );
<a name="l00025"></a>00025
<a name="l00027"></a>00027 <a class="code" href="classEcho.html#a1">~Echo</a>();
<a name="l00028"></a>00028
<a name="l00030"></a>00030 <span class="keywordtype">void</span> <a class="code" href="classEcho.html#a2">clear</a>();
<a name="l00031"></a>00031
<a name="l00033"></a>00033 <span class="keywordtype">void</span> <a class="code" href="classEcho.html#a3">setMaximumDelay</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay );
<a name="l00034"></a>00034
<a name="l00036"></a>00036 <span class="keywordtype">void</span> <a class="code" href="classEcho.html#a4">setDelay</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay );
<a name="l00037"></a>00037
<a name="l00038"></a>00038 <span class="keyword">protected</span>:
<a name="l00039"></a>00039
<a name="l00040"></a>00040 StkFloat computeSample( StkFloat input );
<a name="l00041"></a>00041
<a name="l00042"></a>00042 <a class="code" href="classDelay.html">Delay</a> delayLine_;
<a name="l00043"></a>00043 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> length_;
<a name="l00044"></a>00044
<a name="l00045"></a>00045 };
<a name="l00046"></a>00046
<a name="l00047"></a>00047 <span class="preprocessor">#endif</span>
<a name="l00048"></a>00048 <span class="preprocessor"></span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,113 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Echo.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_ECHO_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_ECHO_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Effect.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;Delay.h&quot;</span>
<a name="l00006"></a>00006
<a name="l00007"></a>00007 <span class="keyword">namespace </span>stk {
<a name="l00008"></a>00008
<a name="l00009"></a>00009 <span class="comment">/***************************************************/</span>
<a name="l00017"></a>00017 <span class="comment">/***************************************************/</span>
<a name="l00018"></a>00018
<a name="l00019"></a><a class="code" href="classstk_1_1Echo.html">00019</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Echo.html" title="STK echo effect class.">Echo</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Effect.html" title="STK abstract effects parent class.">Effect</a>
<a name="l00020"></a>00020 {
<a name="l00021"></a>00021 <span class="keyword">public</span>:
<a name="l00023"></a>00023
<a name="l00026"></a>00026 <a class="code" href="classstk_1_1Echo.html#a5f3320986d5c9b02ad10663ff11b6505" title="Class constructor, taking the longest desired delay length (one second default value)...">Echo</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> maximumDelay = (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) <a class="code" href="classstk_1_1Stk.html#a5fbe37000a611ce56075ee7d8936472d" title="Static method that returns the current STK sample rate.">Stk::sampleRate</a>() );
<a name="l00027"></a>00027
<a name="l00029"></a>00029 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Echo.html#a253e0f8e4c628b431fdfcb6d880548c2" title="Reset and clear all internal state.">clear</a>();
<a name="l00030"></a>00030
<a name="l00032"></a>00032 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Echo.html#a421a6f5f06f8e7df09edd179d397da7d" title="Set the maximum delay line length in samples.">setMaximumDelay</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay );
<a name="l00033"></a>00033
<a name="l00035"></a>00035 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Echo.html#ae58ea12a2864481cb7049c10810867ce" title="Set the delay line length in samples.">setDelay</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> delay );
<a name="l00036"></a>00036
<a name="l00038"></a><a class="code" href="classstk_1_1Echo.html#a00a2a5949133a06680b026db7b21cc51">00038</a> StkFloat <a class="code" href="classstk_1_1Echo.html#a00a2a5949133a06680b026db7b21cc51" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00039"></a>00039
<a name="l00041"></a>00041 StkFloat <a class="code" href="classstk_1_1Echo.html#a4cfb2c2dd350717cd8151749d3a32f91" title="Input one sample to the effect and return one output.">tick</a>( StkFloat input );
<a name="l00042"></a>00042
<a name="l00044"></a>00044
<a name="l00052"></a>00052 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Echo.html#a4cfb2c2dd350717cd8151749d3a32f91" title="Input one sample to the effect and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00053"></a>00053
<a name="l00055"></a>00055
<a name="l00063"></a>00063 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Echo.html#a4cfb2c2dd350717cd8151749d3a32f91" title="Input one sample to the effect and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> &amp;oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel = 0 );
<a name="l00064"></a>00064
<a name="l00065"></a>00065 <span class="keyword">protected</span>:
<a name="l00066"></a>00066
<a name="l00067"></a>00067 <a class="code" href="classstk_1_1Delay.html" title="STK non-interpolating delay line class.">Delay</a> delayLine_;
<a name="l00068"></a>00068 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> length_;
<a name="l00069"></a>00069
<a name="l00070"></a>00070 };
<a name="l00071"></a>00071
<a name="l00072"></a><a class="code" href="classstk_1_1Echo.html#a4cfb2c2dd350717cd8151749d3a32f91">00072</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Echo.html#a4cfb2c2dd350717cd8151749d3a32f91" title="Input one sample to the effect and return one output.">Echo :: tick</a>( StkFloat input )
<a name="l00073"></a>00073 {
<a name="l00074"></a>00074 lastFrame_[0] = effectMix_ * ( delayLine_.<a class="code" href="classstk_1_1Delay.html#aa1a929e0e324417b8a55cbf8770532e9" title="Input one sample to the filter and return one output.">tick</a>( input ) - input ) + input;
<a name="l00075"></a>00075 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00076"></a>00076 }
<a name="l00077"></a>00077
<a name="l00078"></a><a class="code" href="classstk_1_1Echo.html#aefe863b7aa43d6a94c2a56bd31a30e7d">00078</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Echo.html#a4cfb2c2dd350717cd8151749d3a32f91" title="Input one sample to the effect and return one output.">Echo :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00079"></a>00079 {
<a name="l00080"></a>00080 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00082"></a>00082 oStream_ &lt;&lt; <span class="stringliteral">&quot;Echo::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00083"></a>00083 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00084"></a>00084 }
<a name="l00085"></a>00085 <span class="preprocessor">#endif</span>
<a name="l00086"></a>00086 <span class="preprocessor"></span>
<a name="l00087"></a>00087 StkFloat *samples = &amp;frames[channel];
<a name="l00088"></a>00088 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00089"></a>00089 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00090"></a>00090 *samples = effectMix_ * ( delayLine_.<a class="code" href="classstk_1_1Delay.html#aa1a929e0e324417b8a55cbf8770532e9" title="Input one sample to the filter and return one output.">tick</a>( *samples ) - *samples ) + *samples;
<a name="l00091"></a>00091 }
<a name="l00092"></a>00092
<a name="l00093"></a>00093 lastFrame_[0] = *(samples-hop);
<a name="l00094"></a>00094 <span class="keywordflow">return</span> frames;
<a name="l00095"></a>00095 }
<a name="l00096"></a>00096
<a name="l00097"></a><a class="code" href="classstk_1_1Echo.html#a1778a7da06b222afbe9281c886f678d8">00097</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Echo.html#a4cfb2c2dd350717cd8151749d3a32f91" title="Input one sample to the effect and return one output.">Echo :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel )
<a name="l00098"></a>00098 {
<a name="l00099"></a>00099 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00100"></a>00100 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( iChannel &gt;= iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() || oChannel &gt;= oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00101"></a>00101 oStream_ &lt;&lt; <span class="stringliteral">&quot;Echo::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00102"></a>00102 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00103"></a>00103 }
<a name="l00104"></a>00104 <span class="preprocessor">#endif</span>
<a name="l00105"></a>00105 <span class="preprocessor"></span>
<a name="l00106"></a>00106 StkFloat *iSamples = &amp;iFrames[iChannel];
<a name="l00107"></a>00107 StkFloat *oSamples = &amp;oFrames[oChannel];
<a name="l00108"></a>00108 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iHop = iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(), oHop = oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00109"></a>00109 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;iFrames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, iSamples += iHop, oSamples += oHop ) {
<a name="l00110"></a>00110 *oSamples = effectMix_ * ( delayLine_.<a class="code" href="classstk_1_1Delay.html#aa1a929e0e324417b8a55cbf8770532e9" title="Input one sample to the filter and return one output.">tick</a>( *iSamples ) - *iSamples ) + *iSamples;
<a name="l00111"></a>00111 }
<a name="l00112"></a>00112
<a name="l00113"></a>00113 lastFrame_[0] = *(oSamples-oHop);
<a name="l00114"></a>00114 <span class="keywordflow">return</span> iFrames;
<a name="l00115"></a>00115 }
<a name="l00116"></a>00116
<a name="l00117"></a>00117 } <span class="comment">// stk namespace</span>
<a name="l00118"></a>00118
<a name="l00119"></a>00119 <span class="preprocessor">#endif</span>
<a name="l00120"></a>00120 <span class="preprocessor"></span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,69 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Effect.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00010"></a>00010 <span class="comment">/***************************************************/</span>
<a name="l00011"></a>00011
<a name="l00012"></a>00012 <span class="preprocessor">#include "Stk.h"</span>
<a name="l00013"></a>00013
<a name="l00014"></a>00014 <span class="preprocessor">#ifndef STK_EFFECT_H</span>
<a name="l00015"></a>00015 <span class="preprocessor"></span><span class="preprocessor">#define STK_EFFECT_H</span>
<a name="l00016"></a>00016 <span class="preprocessor"></span>
<a name="l00017"></a><a class="code" href="classEffect.html">00017</a> <span class="keyword">class </span><a class="code" href="classEffect.html">Effect</a> : <span class="keyword">public</span> <a class="code" href="classStk.html">Stk</a>
<a name="l00018"></a>00018 {
<a name="l00019"></a>00019 <span class="keyword">public</span>:
<a name="l00021"></a>00021 <a class="code" href="classEffect.html#a0">Effect</a>();
<a name="l00022"></a>00022
<a name="l00024"></a>00024 <span class="keyword">virtual</span> <a class="code" href="classEffect.html#a1">~Effect</a>();
<a name="l00025"></a>00025
<a name="l00027"></a>00027 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classEffect.html#a2">clear</a>() = 0;
<a name="l00028"></a>00028
<a name="l00030"></a>00030 <span class="keywordtype">void</span> <a class="code" href="classEffect.html#a3">setEffectMix</a>(StkFloat mix);
<a name="l00031"></a>00031
<a name="l00033"></a>00033 StkFloat <a class="code" href="classEffect.html#a4">lastOut</a>() <span class="keyword">const</span>;
<a name="l00034"></a>00034
<a name="l00036"></a>00036 StkFloat <a class="code" href="classEffect.html#a5">lastOutLeft</a>() <span class="keyword">const</span>;
<a name="l00037"></a>00037
<a name="l00039"></a>00039 StkFloat <a class="code" href="classEffect.html#a6">lastOutRight</a>() <span class="keyword">const</span>;
<a name="l00040"></a>00040
<a name="l00042"></a>00042 StkFloat <a class="code" href="classEffect.html#a7">tick</a>( StkFloat input );
<a name="l00043"></a>00043
<a name="l00045"></a>00045
<a name="l00051"></a>00051 <a class="code" href="classStkFrames.html">StkFrames</a>&amp; <a class="code" href="classEffect.html#a7">tick</a>( <a class="code" href="classStkFrames.html">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00052"></a>00052
<a name="l00053"></a>00053 <span class="keyword">protected</span>:
<a name="l00054"></a>00054
<a name="l00055"></a>00055 <span class="comment">// This abstract function must be implemented in all subclasses.</span>
<a name="l00056"></a>00056 <span class="comment">// It is used to get around a C++ problem with overloaded virtual</span>
<a name="l00057"></a>00057 <span class="comment">// functions.</span>
<a name="l00058"></a>00058 <span class="keyword">virtual</span> StkFloat computeSample( StkFloat input ) = 0;
<a name="l00059"></a>00059
<a name="l00060"></a>00060 <span class="comment">// Returns true if argument value is prime.</span>
<a name="l00061"></a>00061 <span class="keywordtype">bool</span> isPrime( <span class="keywordtype">int</span> number );
<a name="l00062"></a>00062
<a name="l00063"></a>00063 StkFloat lastOutput_[2];
<a name="l00064"></a>00064 StkFloat effectMix_;
<a name="l00065"></a>00065
<a name="l00066"></a>00066 };
<a name="l00067"></a>00067
<a name="l00068"></a>00068 <span class="preprocessor">#endif</span>
<a name="l00069"></a>00069 <span class="preprocessor"></span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,89 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Effect.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_EFFECT_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_EFFECT_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Stk.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00006"></a>00006
<a name="l00007"></a>00007 <span class="keyword">namespace </span>stk {
<a name="l00008"></a>00008
<a name="l00009"></a>00009 <span class="comment">/***************************************************/</span>
<a name="l00019"></a>00019 <span class="comment">/***************************************************/</span>
<a name="l00020"></a>00020
<a name="l00021"></a><a class="code" href="classstk_1_1Effect.html">00021</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Effect.html" title="STK abstract effects parent class.">Effect</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Stk.html" title="STK base class.">Stk</a>
<a name="l00022"></a>00022 {
<a name="l00023"></a>00023 <span class="keyword">public</span>:
<a name="l00025"></a><a class="code" href="classstk_1_1Effect.html#af6eb27819aed132dd1edf2ce9640893e">00025</a> <a class="code" href="classstk_1_1Effect.html#af6eb27819aed132dd1edf2ce9640893e" title="Class constructor.">Effect</a>( <span class="keywordtype">void</span> ) { lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#a386e1b86cf48f7a8117313f9e41fc0fe" title="Resize self to represent the specified number of channels and frames.">resize</a>( 1, 1, 0.0 ); };
<a name="l00026"></a>00026
<a name="l00028"></a><a class="code" href="classstk_1_1Effect.html#abfdef9ce644c251607acfd183e3d7f7b">00028</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classstk_1_1Effect.html#abfdef9ce644c251607acfd183e3d7f7b" title="Return the number of output channels for the class.">channelsOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(); };
<a name="l00029"></a>00029
<a name="l00031"></a><a class="code" href="classstk_1_1Effect.html#a3d7e2b8942bf7adcc71dfc6dccbb7aa0">00031</a> <span class="keyword">const</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Effect.html#a3d7e2b8942bf7adcc71dfc6dccbb7aa0" title="Return an StkFrames reference to the last output sample frame.">lastFrame</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_; };
<a name="l00032"></a>00032
<a name="l00034"></a>00034 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Effect.html#a0598128d1edc97729951310cc5df5171" title="Reset and clear all internal state.">clear</a>() = 0;
<a name="l00035"></a>00035
<a name="l00037"></a>00037 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Effect.html#ab4facbc9b317f18c139577e52fd69c3d" title="Set the mixture of input and &amp;quot;effected&amp;quot; levels in the output (0.0 = input...">setEffectMix</a>( StkFloat mix );
<a name="l00038"></a>00038
<a name="l00039"></a>00039 <span class="keyword">protected</span>:
<a name="l00040"></a>00040
<a name="l00041"></a>00041 <span class="comment">// Returns true if argument value is prime.</span>
<a name="l00042"></a>00042 <span class="keywordtype">bool</span> isPrime( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> number );
<a name="l00043"></a>00043
<a name="l00044"></a>00044 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> lastFrame_;
<a name="l00045"></a>00045 StkFloat effectMix_;
<a name="l00046"></a>00046
<a name="l00047"></a>00047 };
<a name="l00048"></a>00048
<a name="l00049"></a><a class="code" href="classstk_1_1Effect.html#ab4facbc9b317f18c139577e52fd69c3d">00049</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Effect.html#ab4facbc9b317f18c139577e52fd69c3d" title="Set the mixture of input and &amp;quot;effected&amp;quot; levels in the output (0.0 = input...">Effect :: setEffectMix</a>( StkFloat mix )
<a name="l00050"></a>00050 {
<a name="l00051"></a>00051 <span class="keywordflow">if</span> ( mix &lt; 0.0 ) {
<a name="l00052"></a>00052 oStream_ &lt;&lt; <span class="stringliteral">&quot;Effect::setEffectMix: mix parameter is less than zero ... setting to zero!&quot;</span>;
<a name="l00053"></a>00053 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::WARNING );
<a name="l00054"></a>00054 effectMix_ = 0.0;
<a name="l00055"></a>00055 }
<a name="l00056"></a>00056 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( mix &gt; 1.0 ) {
<a name="l00057"></a>00057 oStream_ &lt;&lt; <span class="stringliteral">&quot;Effect::setEffectMix: mix parameter is greater than 1.0 ... setting to one!&quot;</span>;
<a name="l00058"></a>00058 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::WARNING );
<a name="l00059"></a>00059 effectMix_ = 1.0;
<a name="l00060"></a>00060 }
<a name="l00061"></a>00061 <span class="keywordflow">else</span>
<a name="l00062"></a>00062 effectMix_ = mix;
<a name="l00063"></a>00063 }
<a name="l00064"></a>00064
<a name="l00065"></a>00065 <span class="keyword">inline</span> <span class="keywordtype">bool</span> Effect :: isPrime( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> number )
<a name="l00066"></a>00066 {
<a name="l00067"></a>00067 <span class="keywordflow">if</span> ( number == 2 ) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00068"></a>00068 <span class="keywordflow">if</span> ( number &amp; 1 ) {
<a name="l00069"></a>00069 <span class="keywordflow">for</span> ( <span class="keywordtype">int</span> i=3; i&lt;(int)sqrt((<span class="keywordtype">double</span>)number)+1; i+=2 )
<a name="l00070"></a>00070 <span class="keywordflow">if</span> ( (number % i) == 0 ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00071"></a>00071 <span class="keywordflow">return</span> <span class="keyword">true</span>; <span class="comment">// prime</span>
<a name="l00072"></a>00072 }
<a name="l00073"></a>00073 <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// even</span>
<a name="l00074"></a>00074 }
<a name="l00075"></a>00075
<a name="l00076"></a>00076 } <span class="comment">// stk namespace</span>
<a name="l00077"></a>00077
<a name="l00078"></a>00078 <span class="preprocessor">#endif</span>
<a name="l00079"></a>00079 <span class="preprocessor"></span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,68 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Envelope.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00014"></a>00014 <span class="comment">/***************************************************/</span>
<a name="l00015"></a>00015
<a name="l00016"></a>00016 <span class="preprocessor">#ifndef STK_ENVELOPE_H</span>
<a name="l00017"></a>00017 <span class="preprocessor"></span><span class="preprocessor">#define STK_ENVELOPE_H</span>
<a name="l00018"></a>00018 <span class="preprocessor"></span>
<a name="l00019"></a>00019 <span class="preprocessor">#include "Generator.h"</span>
<a name="l00020"></a>00020
<a name="l00021"></a><a class="code" href="classEnvelope.html">00021</a> <span class="keyword">class </span><a class="code" href="classEnvelope.html">Envelope</a> : <span class="keyword">public</span> <a class="code" href="classGenerator.html">Generator</a>
<a name="l00022"></a>00022 {
<a name="l00023"></a>00023 <span class="keyword">public</span>:
<a name="l00024"></a>00024
<a name="l00026"></a>00026 <a class="code" href="classEnvelope.html#a0">Envelope</a>(<span class="keywordtype">void</span>);
<a name="l00027"></a>00027
<a name="l00029"></a>00029 <a class="code" href="classEnvelope.html#a0">Envelope</a>( <span class="keyword">const</span> <a class="code" href="classEnvelope.html">Envelope</a>&amp; e );
<a name="l00030"></a>00030
<a name="l00032"></a>00032 <span class="keyword">virtual</span> <a class="code" href="classEnvelope.html#a2">~Envelope</a>(<span class="keywordtype">void</span>);
<a name="l00033"></a>00033
<a name="l00035"></a>00035 <a class="code" href="classEnvelope.html">Envelope</a>&amp; <a class="code" href="classEnvelope.html#a3">operator= </a>( <span class="keyword">const</span> <a class="code" href="classEnvelope.html">Envelope</a>&amp; e );
<a name="l00036"></a>00036
<a name="l00038"></a>00038 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classEnvelope.html#a4">keyOn</a>(<span class="keywordtype">void</span>);
<a name="l00039"></a>00039
<a name="l00041"></a>00041 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classEnvelope.html#a5">keyOff</a>(<span class="keywordtype">void</span>);
<a name="l00042"></a>00042
<a name="l00044"></a>00044 <span class="keywordtype">void</span> <a class="code" href="classEnvelope.html#a6">setRate</a>(StkFloat rate);
<a name="l00045"></a>00045
<a name="l00047"></a>00047 <span class="keywordtype">void</span> <a class="code" href="classEnvelope.html#a7">setTime</a>(StkFloat time);
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classEnvelope.html#a8">setTarget</a>(StkFloat target);
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classEnvelope.html#a9">setValue</a>(StkFloat value);
<a name="l00054"></a>00054
<a name="l00056"></a>00056 <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="classEnvelope.html#a10">getState</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00057"></a>00057
<a name="l00058"></a>00058 <span class="keyword">protected</span>:
<a name="l00059"></a>00059
<a name="l00060"></a>00060 <span class="keyword">virtual</span> StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00061"></a>00061 <span class="keyword">virtual</span> <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00062"></a>00062
<a name="l00063"></a>00063 StkFloat value_;
<a name="l00064"></a>00064 StkFloat target_;
<a name="l00065"></a>00065 StkFloat rate_;
<a name="l00066"></a>00066 <span class="keywordtype">int</span> state_;
<a name="l00067"></a>00067 };
<a name="l00068"></a>00068
<a name="l00069"></a>00069 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,120 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Envelope.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_ENVELOPE_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_ENVELOPE_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Generator.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00019"></a>00019 <span class="comment">/***************************************************/</span>
<a name="l00020"></a>00020
<a name="l00021"></a><a class="code" href="classstk_1_1Envelope.html">00021</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Envelope.html" title="STK linear line envelope class.">Envelope</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Generator.html" title="STK abstract unit generator parent class.">Generator</a>
<a name="l00022"></a>00022 {
<a name="l00023"></a>00023 <span class="keyword">public</span>:
<a name="l00024"></a>00024
<a name="l00026"></a>00026 <a class="code" href="classstk_1_1Envelope.html#a86ea29237a8d94c109388654703a0039" title="Default constructor.">Envelope</a>( <span class="keywordtype">void</span> );
<a name="l00027"></a>00027
<a name="l00029"></a>00029 <a class="code" href="classstk_1_1Envelope.html#a64365d24b6cdd3ea3bdcaa1abcbcb60a" title="Class destructor.">~Envelope</a>( <span class="keywordtype">void</span> );
<a name="l00030"></a>00030
<a name="l00032"></a>00032 <a class="code" href="classstk_1_1Envelope.html" title="STK linear line envelope class.">Envelope</a>&amp; <a class="code" href="classstk_1_1Envelope.html#a42a1acf6a4606163056ad7d4122d2281" title="Assignment operator.">operator= </a>( <span class="keyword">const</span> <a class="code" href="classstk_1_1Envelope.html" title="STK linear line envelope class.">Envelope</a>&amp; e );
<a name="l00033"></a>00033
<a name="l00035"></a><a class="code" href="classstk_1_1Envelope.html#a18cf8f21ef70227bd5cd17f53752bd0f">00035</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Envelope.html#a18cf8f21ef70227bd5cd17f53752bd0f" title="Set target = 1.">keyOn</a>( <span class="keywordtype">void</span> ) { this-&gt;<a class="code" href="classstk_1_1Envelope.html#a5269bc5dc1d56161ab82b677b5462a3e" title="Set the target value.">setTarget</a>( 1.0 ); };
<a name="l00036"></a>00036
<a name="l00038"></a><a class="code" href="classstk_1_1Envelope.html#a9dbefb15f8d64aac3969f77d38791774">00038</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Envelope.html#a9dbefb15f8d64aac3969f77d38791774" title="Set target = 0.">keyOff</a>( <span class="keywordtype">void</span> ) { this-&gt;<a class="code" href="classstk_1_1Envelope.html#a5269bc5dc1d56161ab82b677b5462a3e" title="Set the target value.">setTarget</a>( 0.0 ); };
<a name="l00039"></a>00039
<a name="l00041"></a>00041
<a name="l00044"></a>00044 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Envelope.html#ade99b5c7cb974f71f1d2919868d774a0" title="Set the rate.">setRate</a>( StkFloat rate );
<a name="l00045"></a>00045
<a name="l00047"></a>00047
<a name="l00051"></a>00051 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Envelope.html#adeeb1676f9111980a0c1a48a6780c8f7" title="Set the rate based on a positive time duration (seconds).">setTime</a>( StkFloat time );
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Envelope.html#a5269bc5dc1d56161ab82b677b5462a3e" title="Set the target value.">setTarget</a>( StkFloat target );
<a name="l00055"></a>00055
<a name="l00057"></a>00057 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Envelope.html#ab8164a90c57616dc8bd55a6e5ba02fb6" title="Set current and target values to value.">setValue</a>( StkFloat value );
<a name="l00058"></a>00058
<a name="l00060"></a><a class="code" href="classstk_1_1Envelope.html#addb2084add959a65733805bc2c1c39a9">00060</a> <span class="keywordtype">int</span> <a class="code" href="classstk_1_1Envelope.html#addb2084add959a65733805bc2c1c39a9" title="Return the current envelope state (0 = at target, 1 otherwise).">getState</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> state_; };
<a name="l00061"></a>00061
<a name="l00063"></a><a class="code" href="classstk_1_1Envelope.html#a31044eab6eaf668ba7e74ea17bed109d">00063</a> StkFloat <a class="code" href="classstk_1_1Envelope.html#a31044eab6eaf668ba7e74ea17bed109d" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00064"></a>00064
<a name="l00066"></a>00066 StkFloat <a class="code" href="classstk_1_1Envelope.html#a8de91b9caf10a03f52bd2247648c4601" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">void</span> );
<a name="l00067"></a>00067
<a name="l00069"></a>00069
<a name="l00076"></a>00076 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Envelope.html#a8de91b9caf10a03f52bd2247648c4601" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00077"></a>00077
<a name="l00078"></a>00078 <span class="keyword">protected</span>:
<a name="l00079"></a>00079
<a name="l00080"></a>00080 <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00081"></a>00081
<a name="l00082"></a>00082 StkFloat value_;
<a name="l00083"></a>00083 StkFloat target_;
<a name="l00084"></a>00084 StkFloat rate_;
<a name="l00085"></a>00085 <span class="keywordtype">int</span> state_;
<a name="l00086"></a>00086 };
<a name="l00087"></a>00087
<a name="l00088"></a><a class="code" href="classstk_1_1Envelope.html#a8de91b9caf10a03f52bd2247648c4601">00088</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Envelope.html#a8de91b9caf10a03f52bd2247648c4601" title="Compute and return one output sample.">Envelope :: tick</a>( <span class="keywordtype">void</span> )
<a name="l00089"></a>00089 {
<a name="l00090"></a>00090 <span class="keywordflow">if</span> ( state_ ) {
<a name="l00091"></a>00091 <span class="keywordflow">if</span> ( target_ &gt; value_ ) {
<a name="l00092"></a>00092 value_ += rate_;
<a name="l00093"></a>00093 <span class="keywordflow">if</span> ( value_ &gt;= target_ ) {
<a name="l00094"></a>00094 value_ = target_;
<a name="l00095"></a>00095 state_ = 0;
<a name="l00096"></a>00096 }
<a name="l00097"></a>00097 }
<a name="l00098"></a>00098 <span class="keywordflow">else</span> {
<a name="l00099"></a>00099 value_ -= rate_;
<a name="l00100"></a>00100 <span class="keywordflow">if</span> ( value_ &lt;= target_ ) {
<a name="l00101"></a>00101 value_ = target_;
<a name="l00102"></a>00102 state_ = 0;
<a name="l00103"></a>00103 }
<a name="l00104"></a>00104 }
<a name="l00105"></a>00105 lastFrame_[0] = value_;
<a name="l00106"></a>00106 }
<a name="l00107"></a>00107
<a name="l00108"></a>00108 <span class="keywordflow">return</span> value_;
<a name="l00109"></a>00109 }
<a name="l00110"></a>00110
<a name="l00111"></a><a class="code" href="classstk_1_1Envelope.html#a9341c9dea4fd54c360a4a23254319cf7">00111</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Envelope.html#a8de91b9caf10a03f52bd2247648c4601" title="Compute and return one output sample.">Envelope :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00112"></a>00112 {
<a name="l00113"></a>00113 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00114"></a>00114 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00115"></a>00115 oStream_ &lt;&lt; <span class="stringliteral">&quot;Envelope::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00116"></a>00116 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00117"></a>00117 }
<a name="l00118"></a>00118 <span class="preprocessor">#endif</span>
<a name="l00119"></a>00119 <span class="preprocessor"></span>
<a name="l00120"></a>00120 StkFloat *samples = &amp;frames[channel];
<a name="l00121"></a>00121 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00122"></a>00122 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00123"></a>00123 *samples = <a class="code" href="classstk_1_1Envelope.html#a8de91b9caf10a03f52bd2247648c4601" title="Compute and return one output sample.">tick</a>();
<a name="l00124"></a>00124
<a name="l00125"></a>00125 <span class="keywordflow">return</span> frames;
<a name="l00126"></a>00126 }
<a name="l00127"></a>00127
<a name="l00128"></a>00128 } <span class="comment">// stk namespace</span>
<a name="l00129"></a>00129
<a name="l00130"></a>00130 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,54 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>FMVoices.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00031"></a>00031 <span class="comment">/***************************************************/</span>
<a name="l00032"></a>00032
<a name="l00033"></a>00033 <span class="preprocessor">#ifndef STK_FMVOICES_H</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#define STK_FMVOICES_H</span>
<a name="l00035"></a>00035 <span class="preprocessor"></span>
<a name="l00036"></a>00036 <span class="preprocessor">#include "FM.h"</span>
<a name="l00037"></a>00037
<a name="l00038"></a><a class="code" href="classFMVoices.html">00038</a> <span class="keyword">class </span><a class="code" href="classFMVoices.html">FMVoices</a> : <span class="keyword">public</span> <a class="code" href="classFM.html">FM</a>
<a name="l00039"></a>00039 {
<a name="l00040"></a>00040 <span class="keyword">public</span>:
<a name="l00042"></a>00042
<a name="l00045"></a>00045 <a class="code" href="classFMVoices.html#a0">FMVoices</a>();
<a name="l00046"></a>00046
<a name="l00048"></a>00048 <a class="code" href="classFMVoices.html#a1">~FMVoices</a>();
<a name="l00049"></a>00049
<a name="l00051"></a>00051 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classFMVoices.html#a2">setFrequency</a>(StkFloat frequency);
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <span class="keywordtype">void</span> <a class="code" href="classFMVoices.html#a3">noteOn</a>(StkFloat frequency, StkFloat amplitude);
<a name="l00055"></a>00055
<a name="l00057"></a>00057 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classFMVoices.html#a4">controlChange</a>(<span class="keywordtype">int</span> number, StkFloat value);
<a name="l00058"></a>00058
<a name="l00059"></a>00059 <span class="keyword">protected</span>:
<a name="l00060"></a>00060
<a name="l00061"></a>00061 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00062"></a>00062
<a name="l00063"></a>00063 <span class="keywordtype">int</span> currentVowel_;
<a name="l00064"></a>00064 StkFloat tilt_[3];
<a name="l00065"></a>00065 StkFloat mods_[3];
<a name="l00066"></a>00066 };
<a name="l00067"></a>00067
<a name="l00068"></a>00068 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,115 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>FMVoices.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FMVOICES_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FMVOICES_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;FM.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00038"></a>00038 <span class="comment">/***************************************************/</span>
<a name="l00039"></a>00039
<a name="l00040"></a><a class="code" href="classstk_1_1FMVoices.html">00040</a> <span class="keyword">class </span><a class="code" href="classstk_1_1FMVoices.html" title="STK singing FM synthesis instrument.">FMVoices</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1FM.html" title="STK abstract FM synthesis base class.">FM</a>
<a name="l00041"></a>00041 {
<a name="l00042"></a>00042 <span class="keyword">public</span>:
<a name="l00044"></a>00044
<a name="l00047"></a>00047 <a class="code" href="classstk_1_1FMVoices.html#a27d5570c83cad660a53f04d86d01c888" title="Class constructor.">FMVoices</a>( <span class="keywordtype">void</span> );
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <a class="code" href="classstk_1_1FMVoices.html#a8ff218d379ec020a38e1bc7203409e37" title="Class destructor.">~FMVoices</a>( <span class="keywordtype">void</span> );
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FMVoices.html#af47a92f6892f3a5bef5226d4772fc8cb" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00054"></a>00054
<a name="l00056"></a>00056 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FMVoices.html#af2fd5dd9af61db94ff1cb556e8e5cf4c" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00057"></a>00057
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FMVoices.html#a24e17888ff4e01edff96d81461d670a8" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value );
<a name="l00060"></a>00060
<a name="l00062"></a>00062 StkFloat <a class="code" href="classstk_1_1FMVoices.html#a31111029e36d00230586250df7b4d887" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00063"></a>00063
<a name="l00065"></a>00065
<a name="l00072"></a>00072 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1FMVoices.html#a31111029e36d00230586250df7b4d887" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00073"></a>00073
<a name="l00074"></a>00074 <span class="keyword">protected</span>:
<a name="l00075"></a>00075
<a name="l00076"></a>00076 <span class="keywordtype">int</span> currentVowel_;
<a name="l00077"></a>00077 StkFloat tilt_[3];
<a name="l00078"></a>00078 StkFloat mods_[3];
<a name="l00079"></a>00079 };
<a name="l00080"></a>00080
<a name="l00081"></a><a class="code" href="classstk_1_1FMVoices.html#a31111029e36d00230586250df7b4d887">00081</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1FMVoices.html#a31111029e36d00230586250df7b4d887" title="Compute and return one output sample.">FMVoices :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00082"></a>00082 {
<a name="l00083"></a>00083 <span class="keyword">register</span> StkFloat temp, temp2;
<a name="l00084"></a>00084
<a name="l00085"></a>00085 temp = gains_[3] * adsr_[3]-&gt;tick() * waves_[3]-&gt;tick();
<a name="l00086"></a>00086 temp2 = vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>() * modDepth_ * 0.1;
<a name="l00087"></a>00087
<a name="l00088"></a>00088 waves_[0]-&gt;setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[0]);
<a name="l00089"></a>00089 waves_[1]-&gt;setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[1]);
<a name="l00090"></a>00090 waves_[2]-&gt;setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[2]);
<a name="l00091"></a>00091 waves_[3]-&gt;setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[3]);
<a name="l00092"></a>00092
<a name="l00093"></a>00093 waves_[0]-&gt;addPhaseOffset(temp * mods_[0]);
<a name="l00094"></a>00094 waves_[1]-&gt;addPhaseOffset(temp * mods_[1]);
<a name="l00095"></a>00095 waves_[2]-&gt;addPhaseOffset(temp * mods_[2]);
<a name="l00096"></a>00096 waves_[3]-&gt;addPhaseOffset( twozero_.<a class="code" href="classstk_1_1TwoZero.html#ae9808b0152902d0067ea24ccfba0b4ba" title="Return the last computed output value.">lastOut</a>() );
<a name="l00097"></a>00097 twozero_.<a class="code" href="classstk_1_1TwoZero.html#acf92a66aeb2024cfcdb9d71ecadf3d82" title="Input one sample to the filter and return one output.">tick</a>( temp );
<a name="l00098"></a>00098 temp = gains_[0] * tilt_[0] * adsr_[0]-&gt;tick() * waves_[0]-&gt;tick();
<a name="l00099"></a>00099 temp += gains_[1] * tilt_[1] * adsr_[1]-&gt;tick() * waves_[1]-&gt;tick();
<a name="l00100"></a>00100 temp += gains_[2] * tilt_[2] * adsr_[2]-&gt;tick() * waves_[2]-&gt;tick();
<a name="l00101"></a>00101
<a name="l00102"></a>00102 lastFrame_[0] = temp * 0.33;
<a name="l00103"></a>00103 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00104"></a>00104 }
<a name="l00105"></a>00105
<a name="l00106"></a><a class="code" href="classstk_1_1FMVoices.html#abad16be89b38d4618a07c5d71ab49e26">00106</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1FMVoices.html#a31111029e36d00230586250df7b4d887" title="Compute and return one output sample.">FMVoices :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00107"></a>00107 {
<a name="l00108"></a>00108 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00109"></a>00109 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00110"></a>00110 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels ) {
<a name="l00111"></a>00111 oStream_ &lt;&lt; <span class="stringliteral">&quot;FMVoices::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00112"></a>00112 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00113"></a>00113 }
<a name="l00114"></a>00114 <span class="preprocessor">#endif</span>
<a name="l00115"></a>00115 <span class="preprocessor"></span>
<a name="l00116"></a>00116 StkFloat *samples = &amp;frames[channel];
<a name="l00117"></a>00117 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00118"></a>00118 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00119"></a>00119 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00120"></a>00120 *samples++ = <a class="code" href="classstk_1_1FMVoices.html#a31111029e36d00230586250df7b4d887" title="Compute and return one output sample.">tick</a>();
<a name="l00121"></a>00121 }
<a name="l00122"></a>00122 <span class="keywordflow">else</span> {
<a name="l00123"></a>00123 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00124"></a>00124 *samples++ = <a class="code" href="classstk_1_1FMVoices.html#a31111029e36d00230586250df7b4d887" title="Compute and return one output sample.">tick</a>();
<a name="l00125"></a>00125 <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00126"></a>00126 *samples++ = lastFrame_[j];
<a name="l00127"></a>00127 }
<a name="l00128"></a>00128 }
<a name="l00129"></a>00129
<a name="l00130"></a>00130 <span class="keywordflow">return</span> frames;
<a name="l00131"></a>00131 }
<a name="l00132"></a>00132
<a name="l00133"></a>00133 } <span class="comment">// stk namespace</span>
<a name="l00134"></a>00134
<a name="l00135"></a>00135 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,90 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>FM.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00024"></a>00024 <span class="comment">/***************************************************/</span>
<a name="l00025"></a>00025
<a name="l00026"></a>00026 <span class="preprocessor">#ifndef STK_FM_H</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#define STK_FM_H</span>
<a name="l00028"></a>00028 <span class="preprocessor"></span>
<a name="l00029"></a>00029 <span class="preprocessor">#include "Instrmnt.h"</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include "ADSR.h"</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include "WaveLoop.h"</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include "SineWave.h"</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include "TwoZero.h"</span>
<a name="l00034"></a>00034
<a name="l00035"></a><a class="code" href="classFM.html">00035</a> <span class="keyword">class </span><a class="code" href="classFM.html">FM</a> : <span class="keyword">public</span> <a class="code" href="classInstrmnt.html">Instrmnt</a>
<a name="l00036"></a>00036 {
<a name="l00037"></a>00037 <span class="keyword">public</span>:
<a name="l00039"></a>00039
<a name="l00042"></a>00042 <a class="code" href="classFM.html#a0">FM</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> operators = 4 );
<a name="l00043"></a>00043
<a name="l00045"></a>00045 <span class="keyword">virtual</span> <a class="code" href="classFM.html#a1">~FM</a>();
<a name="l00046"></a>00046
<a name="l00048"></a>00048 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a2">clear</a>();
<a name="l00049"></a>00049
<a name="l00051"></a>00051 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a3">loadWaves</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> **filenames);
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classFM.html#a4">setFrequency</a>(StkFloat frequency);
<a name="l00055"></a>00055
<a name="l00057"></a>00057 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a5">setRatio</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> waveIndex, StkFloat ratio);
<a name="l00058"></a>00058
<a name="l00060"></a>00060 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a6">setGain</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> waveIndex, StkFloat gain);
<a name="l00061"></a>00061
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a7">setModulationSpeed</a>(StkFloat mSpeed);
<a name="l00064"></a>00064
<a name="l00066"></a>00066 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a8">setModulationDepth</a>(StkFloat mDepth);
<a name="l00067"></a>00067
<a name="l00069"></a>00069 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a9">setControl1</a>(StkFloat cVal);
<a name="l00070"></a>00070
<a name="l00072"></a>00072 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a10">setControl2</a>(StkFloat cVal);
<a name="l00073"></a>00073
<a name="l00075"></a>00075 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a11">keyOn</a>();
<a name="l00076"></a>00076
<a name="l00078"></a>00078 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a12">keyOff</a>();
<a name="l00079"></a>00079
<a name="l00081"></a>00081 <span class="keywordtype">void</span> <a class="code" href="classFM.html#a13">noteOff</a>(StkFloat amplitude);
<a name="l00082"></a>00082
<a name="l00084"></a>00084 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classFM.html#a14">controlChange</a>(<span class="keywordtype">int</span> number, StkFloat value);
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="keyword">protected</span>:
<a name="l00087"></a>00087
<a name="l00088"></a>00088 <span class="keyword">virtual</span> StkFloat computeSample( <span class="keywordtype">void</span> ) = 0;
<a name="l00089"></a>00089
<a name="l00090"></a>00090 std::vector&lt;ADSR *&gt; adsr_;
<a name="l00091"></a>00091 std::vector&lt;WaveLoop *&gt; waves_;
<a name="l00092"></a>00092 <a class="code" href="classSineWave.html">SineWave</a> vibrato_;
<a name="l00093"></a>00093 <a class="code" href="classTwoZero.html">TwoZero</a> twozero_;
<a name="l00094"></a>00094 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nOperators_;
<a name="l00095"></a>00095 StkFloat baseFrequency_;
<a name="l00096"></a>00096 std::vector&lt;StkFloat&gt; ratios_;
<a name="l00097"></a>00097 std::vector&lt;StkFloat&gt; gains_;
<a name="l00098"></a>00098 StkFloat modDepth_;
<a name="l00099"></a>00099 StkFloat control1_;
<a name="l00100"></a>00100 StkFloat control2_;
<a name="l00101"></a>00101 StkFloat fmGains_[100];
<a name="l00102"></a>00102 StkFloat fmSusLevels_[16];
<a name="l00103"></a>00103 StkFloat fmAttTimes_[32];
<a name="l00104"></a>00104
<a name="l00105"></a>00105 };
<a name="l00106"></a>00106
<a name="l00107"></a>00107 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,99 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>FM.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FM_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FM_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Instrmnt.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;ADSR.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;FileLoop.h&quot;</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;SineWave.h&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;TwoZero.h&quot;</span>
<a name="l00009"></a>00009
<a name="l00010"></a>00010 <span class="keyword">namespace </span>stk {
<a name="l00011"></a>00011
<a name="l00012"></a>00012 <span class="comment">/***************************************************/</span>
<a name="l00035"></a>00035 <span class="comment">/***************************************************/</span>
<a name="l00036"></a>00036
<a name="l00037"></a><a class="code" href="classstk_1_1FM.html">00037</a> <span class="keyword">class </span><a class="code" href="classstk_1_1FM.html" title="STK abstract FM synthesis base class.">FM</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00038"></a>00038 {
<a name="l00039"></a>00039 <span class="keyword">public</span>:
<a name="l00041"></a>00041
<a name="l00044"></a>00044 <a class="code" href="classstk_1_1FM.html#af4732c22ce00743e1f751880fa07aa15" title="Class constructor, taking the number of wave/envelope operators to control.">FM</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> operators = 4 );
<a name="l00045"></a>00045
<a name="l00047"></a>00047 <span class="keyword">virtual</span> <a class="code" href="classstk_1_1FM.html#aaba7e8bff02d105e146f8b62b20a27b9" title="Class destructor.">~FM</a>( <span class="keywordtype">void</span> );
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#ac5697f9929afd43379e8720f2f271b2d" title="Reset and clear all wave and envelope states.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#a0a32c8327e842bb71ce945024d583941" title="Load the rawwave filenames in waves.">loadWaves</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> **filenames );
<a name="l00054"></a>00054
<a name="l00056"></a>00056 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#a8182c605d51ec623f90f4e07c2b90891" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00057"></a>00057
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#a58f0898b677750a259036f628ec1a91b" title="Set the frequency ratio for the specified wave.">setRatio</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> waveIndex, StkFloat ratio );
<a name="l00060"></a>00060
<a name="l00062"></a>00062 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#a65a8c54556f0c288871876ffad4d9eef" title="Set the gain for the specified wave.">setGain</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> waveIndex, StkFloat gain );
<a name="l00063"></a>00063
<a name="l00065"></a><a class="code" href="classstk_1_1FM.html#a33e5d60131014a12a435c0ef20d104b6">00065</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#a33e5d60131014a12a435c0ef20d104b6" title="Set the modulation speed in Hz.">setModulationSpeed</a>( StkFloat mSpeed ) { vibrato_.<a class="code" href="classstk_1_1SineWave.html#a1047a43714bc2e40c7e31e8f7e34adbc" title="Set the data interpolation rate based on a looping frequency.">setFrequency</a>( mSpeed ); };
<a name="l00066"></a>00066
<a name="l00068"></a><a class="code" href="classstk_1_1FM.html#a11584256f23153551bc13b59518b415a">00068</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#a11584256f23153551bc13b59518b415a" title="Set the modulation depth.">setModulationDepth</a>( StkFloat mDepth ) { modDepth_ = mDepth; };
<a name="l00069"></a>00069
<a name="l00071"></a><a class="code" href="classstk_1_1FM.html#a0425269a8fc0cc6bb7471d65b54b8a1a">00071</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#a0425269a8fc0cc6bb7471d65b54b8a1a" title="Set the value of control1.">setControl1</a>( StkFloat cVal ) { control1_ = cVal * 2.0; };
<a name="l00072"></a>00072
<a name="l00074"></a><a class="code" href="classstk_1_1FM.html#ad7e7d7067c8893040ef3bdf8a1fbe9ca">00074</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#ad7e7d7067c8893040ef3bdf8a1fbe9ca" title="Set the value of control1.">setControl2</a>( StkFloat cVal ) { control2_ = cVal * 2.0; };
<a name="l00075"></a>00075
<a name="l00077"></a>00077 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#afc46280177d770404919f20ccf88e4ff" title="Start envelopes toward &amp;quot;on&amp;quot; targets.">keyOn</a>( <span class="keywordtype">void</span> );
<a name="l00078"></a>00078
<a name="l00080"></a>00080 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#a7235e94a153df135330a591511269f7c" title="Start envelopes toward &amp;quot;off&amp;quot; targets.">keyOff</a>( <span class="keywordtype">void</span> );
<a name="l00081"></a>00081
<a name="l00083"></a>00083 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#a56cc61b1923dba2ff80859df4904d4f9" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00084"></a>00084
<a name="l00086"></a>00086 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FM.html#a1db9d177363fb7d8dedb20fa0c9104f1" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value );
<a name="l00087"></a>00087
<a name="l00089"></a>00089 <span class="keyword">virtual</span> StkFloat <a class="code" href="classstk_1_1FM.html#a81f351fd8732fd6e686735b7b45a4241" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ) = 0;
<a name="l00090"></a>00090
<a name="l00092"></a>00092
<a name="l00099"></a>00099 <span class="keyword">virtual</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1FM.html#a81f351fd8732fd6e686735b7b45a4241" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 ) = 0;
<a name="l00100"></a>00100
<a name="l00101"></a>00101 <span class="keyword">protected</span>:
<a name="l00102"></a>00102
<a name="l00103"></a>00103 std::vector&lt;ADSR *&gt; adsr_;
<a name="l00104"></a>00104 std::vector&lt;FileLoop *&gt; waves_;
<a name="l00105"></a>00105 <a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> vibrato_;
<a name="l00106"></a>00106 <a class="code" href="classstk_1_1TwoZero.html" title="STK two-zero filter class.">TwoZero</a> twozero_;
<a name="l00107"></a>00107 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nOperators_;
<a name="l00108"></a>00108 StkFloat baseFrequency_;
<a name="l00109"></a>00109 std::vector&lt;StkFloat&gt; ratios_;
<a name="l00110"></a>00110 std::vector&lt;StkFloat&gt; gains_;
<a name="l00111"></a>00111 StkFloat modDepth_;
<a name="l00112"></a>00112 StkFloat control1_;
<a name="l00113"></a>00113 StkFloat control2_;
<a name="l00114"></a>00114 StkFloat fmGains_[100];
<a name="l00115"></a>00115 StkFloat fmSusLevels_[16];
<a name="l00116"></a>00116 StkFloat fmAttTimes_[32];
<a name="l00117"></a>00117
<a name="l00118"></a>00118 };
<a name="l00119"></a>00119
<a name="l00120"></a>00120 } <span class="comment">// stk namespace</span>
<a name="l00121"></a>00121
<a name="l00122"></a>00122 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,97 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>FileLoop.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FILELOOP_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILELOOP_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;FileWvIn.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00024"></a>00024 <span class="comment">/***************************************************/</span>
<a name="l00025"></a>00025
<a name="l00026"></a><a class="code" href="classstk_1_1FileLoop.html">00026</a> <span class="keyword">class </span><a class="code" href="classstk_1_1FileLoop.html" title="STK file looping / oscillator class.">FileLoop</a> : <span class="keyword">protected</span> <a class="code" href="classstk_1_1FileWvIn.html" title="STK audio file input class.">FileWvIn</a>
<a name="l00027"></a>00027 {
<a name="l00028"></a>00028 <span class="keyword">public</span>:
<a name="l00030"></a>00030 <a class="code" href="classstk_1_1FileLoop.html#a0d977aae11d75d0327057add00fa7f84" title="Default constructor.">FileLoop</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkThreshold = 1000000, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkSize = 1024 );
<a name="l00031"></a>00031
<a name="l00033"></a>00033 <a class="code" href="classstk_1_1FileLoop.html#a0d977aae11d75d0327057add00fa7f84" title="Default constructor.">FileLoop</a>( std::string fileName, <span class="keywordtype">bool</span> raw = <span class="keyword">false</span>, <span class="keywordtype">bool</span> doNormalize = <span class="keyword">true</span>,
<a name="l00034"></a>00034 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkThreshold = 1000000, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkSize = 1024 );
<a name="l00035"></a>00035
<a name="l00037"></a>00037 <a class="code" href="classstk_1_1FileLoop.html#ab6f0e0f9a5cc9c99627d0e12db007905" title="Class destructor.">~FileLoop</a>( <span class="keywordtype">void</span> );
<a name="l00038"></a>00038
<a name="l00040"></a>00040
<a name="l00049"></a>00049 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileLoop.html#a5905940c0dd046a95ca9c2a1d72983de" title="Open the specified file and load its data.">openFile</a>( std::string fileName, <span class="keywordtype">bool</span> raw = <span class="keyword">false</span>, <span class="keywordtype">bool</span> doNormalize = <span class="keyword">true</span> );
<a name="l00050"></a>00050
<a name="l00052"></a><a class="code" href="classstk_1_1FileLoop.html#a51688a9e84b2f9e5a9c4e62588b65c52">00052</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileLoop.html#a51688a9e84b2f9e5a9c4e62588b65c52" title="Close a file if one is open.">closeFile</a>( <span class="keywordtype">void</span> ) { <a class="code" href="classstk_1_1FileLoop.html#a51688a9e84b2f9e5a9c4e62588b65c52" title="Close a file if one is open.">FileWvIn::closeFile</a>(); };
<a name="l00053"></a>00053
<a name="l00055"></a><a class="code" href="classstk_1_1FileLoop.html#a2c539902d697d0b87334ca7dc4f3ce69">00055</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileLoop.html#a2c539902d697d0b87334ca7dc4f3ce69" title="Clear outputs and reset time (file) pointer to zero.">reset</a>( <span class="keywordtype">void</span> ) { <a class="code" href="classstk_1_1FileLoop.html#a2c539902d697d0b87334ca7dc4f3ce69" title="Clear outputs and reset time (file) pointer to zero.">FileWvIn::reset</a>(); };
<a name="l00056"></a>00056
<a name="l00058"></a><a class="code" href="classstk_1_1FileLoop.html#a9f3c514ce166068197684a21d31c3a76">00058</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classstk_1_1FileLoop.html#a9f3c514ce166068197684a21d31c3a76" title="Return the number of audio channels in the data or stream.">channelsOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(); };
<a name="l00059"></a>00059
<a name="l00061"></a>00061
<a name="l00065"></a><a class="code" href="classstk_1_1FileLoop.html#a7c4a3d5c427154bf653f86a53e900b8b">00065</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileLoop.html#a7c4a3d5c427154bf653f86a53e900b8b" title="Normalize data to a maximum of +-1.0.">normalize</a>( <span class="keywordtype">void</span> ) { <a class="code" href="classstk_1_1FileLoop.html#a7c4a3d5c427154bf653f86a53e900b8b" title="Normalize data to a maximum of +-1.0.">FileWvIn::normalize</a>( 1.0 ); };
<a name="l00066"></a>00066
<a name="l00068"></a>00068
<a name="l00072"></a><a class="code" href="classstk_1_1FileLoop.html#aa1ac0c8d19f412f66f5fdb89854e2833">00072</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileLoop.html#aa1ac0c8d19f412f66f5fdb89854e2833" title="Normalize data to a maximum of +-peak.">normalize</a>( StkFloat peak ) { <a class="code" href="classstk_1_1FileLoop.html#a7c4a3d5c427154bf653f86a53e900b8b" title="Normalize data to a maximum of +-1.0.">FileWvIn::normalize</a>( peak ); };
<a name="l00073"></a>00073
<a name="l00075"></a><a class="code" href="classstk_1_1FileLoop.html#ad86d4f64c44a6f2488779fef24fc1ee7">00075</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="classstk_1_1FileLoop.html#ad86d4f64c44a6f2488779fef24fc1ee7" title="Return the file size in sample frames.">getSize</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data_.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); };
<a name="l00076"></a>00076
<a name="l00078"></a>00078
<a name="l00083"></a><a class="code" href="classstk_1_1FileLoop.html#aa18006c800c7dac1ddd277c987fe0003">00083</a> StkFloat <a class="code" href="classstk_1_1FileLoop.html#aa18006c800c7dac1ddd277c987fe0003" title="Return the input file sample rate in Hz (not the data read rate).">getFileRate</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data_.<a class="code" href="classstk_1_1StkFrames.html#a4dbbcbdc8db39a803e0861976f7f3522" title="Return the sample rate associated with the StkFrames data.">dataRate</a>(); };
<a name="l00084"></a>00084
<a name="l00086"></a>00086
<a name="l00089"></a>00089 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileLoop.html#a13e1f693bc8a29d9051a400087347a3c" title="Set the data read rate in samples. The rate can be negative.">setRate</a>( StkFloat rate );
<a name="l00090"></a>00090
<a name="l00092"></a>00092
<a name="l00098"></a><a class="code" href="classstk_1_1FileLoop.html#aec8f94d8514b266acd83106ed0f24ead">00098</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileLoop.html#aec8f94d8514b266acd83106ed0f24ead" title="Set the data interpolation rate based on a looping frequency.">setFrequency</a>( StkFloat frequency ) { this-&gt;<a class="code" href="classstk_1_1FileLoop.html#a13e1f693bc8a29d9051a400087347a3c" title="Set the data read rate in samples. The rate can be negative.">setRate</a>( file_.<a class="code" href="classstk_1_1FileRead.html#a6a83d925dd5bd18c4299ea42cc0ea488" title="Return the file size in sample frames.">fileSize</a>() * frequency / <a class="code" href="classstk_1_1Stk.html#a5fbe37000a611ce56075ee7d8936472d" title="Static method that returns the current STK sample rate.">Stk::sampleRate</a>() ); };
<a name="l00099"></a>00099
<a name="l00101"></a>00101 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileLoop.html#a1986db79fd04b93f4d10b8cdf75bca34" title="Increment the read pointer by time samples, modulo file size.">addTime</a>( StkFloat time );
<a name="l00102"></a>00102
<a name="l00104"></a>00104
<a name="l00109"></a>00109 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileLoop.html#a8e24d6f9292a9443fbc21e4e8797f482" title="Increment current read pointer by angle, relative to a looping frequency.">addPhase</a>( StkFloat angle );
<a name="l00110"></a>00110
<a name="l00112"></a>00112
<a name="l00117"></a>00117 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileLoop.html#afe462794ba202dd879d29c39e76ae111" title="Add a phase offset to the current read pointer.">addPhaseOffset</a>( StkFloat angle );
<a name="l00118"></a>00118
<a name="l00120"></a>00120
<a name="l00129"></a><a class="code" href="classstk_1_1FileLoop.html#a826b6dd0968c5abd1020a9fe629a4ffd">00129</a> StkFloat <a class="code" href="classstk_1_1FileLoop.html#a826b6dd0968c5abd1020a9fe629a4ffd" title="Return the specified channel value of the last computed frame.">lastOut</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 ) { <span class="keywordflow">return</span> <a class="code" href="classstk_1_1FileLoop.html#a826b6dd0968c5abd1020a9fe629a4ffd" title="Return the specified channel value of the last computed frame.">FileWvIn::lastOut</a>( channel ); };
<a name="l00130"></a>00130
<a name="l00132"></a>00132
<a name="l00141"></a>00141 StkFloat <a class="code" href="classstk_1_1FileLoop.html#a037b31918134ed1839a8b48de774ab95" title="Compute a sample frame and return the specified channel value.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00142"></a>00142
<a name="l00144"></a>00144
<a name="l00153"></a>00153 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1FileLoop.html#a037b31918134ed1839a8b48de774ab95" title="Compute a sample frame and return the specified channel value.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames );
<a name="l00154"></a>00154
<a name="l00155"></a>00155 <span class="keyword">protected</span>:
<a name="l00156"></a>00156
<a name="l00157"></a>00157 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> firstFrame_;
<a name="l00158"></a>00158 StkFloat phaseOffset_;
<a name="l00159"></a>00159
<a name="l00160"></a>00160 };
<a name="l00161"></a>00161
<a name="l00162"></a>00162 } <span class="comment">// stk namespace</span>
<a name="l00163"></a>00163
<a name="l00164"></a>00164 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,88 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>FileRead.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00030"></a>00030 <span class="comment">/***************************************************/</span>
<a name="l00031"></a>00031
<a name="l00032"></a>00032 <span class="preprocessor">#ifndef STK_FILEREAD_H</span>
<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILEREAD_H</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span>
<a name="l00035"></a>00035 <span class="preprocessor">#include "Stk.h"</span>
<a name="l00036"></a>00036
<a name="l00037"></a><a class="code" href="classFileRead.html">00037</a> <span class="keyword">class </span><a class="code" href="classFileRead.html">FileRead</a> : <span class="keyword">public</span> <a class="code" href="classStk.html">Stk</a>
<a name="l00038"></a>00038 {
<a name="l00039"></a>00039 <span class="keyword">public</span>:
<a name="l00041"></a>00041 <a class="code" href="classFileRead.html#a0">FileRead</a>();
<a name="l00042"></a>00042
<a name="l00044"></a>00044
<a name="l00050"></a>00050 <a class="code" href="classFileRead.html#a0">FileRead</a>( std::string fileName, <span class="keywordtype">bool</span> typeRaw = <span class="keyword">false</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = 1,
<a name="l00051"></a>00051 StkFormat format = <a class="code" href="classStk.html#s1">STK_SINT16</a>, StkFloat rate = 22050.0 );
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <a class="code" href="classFileRead.html#a2">~FileRead</a>();
<a name="l00055"></a>00055
<a name="l00057"></a>00057
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classFileRead.html#a3">open</a>( std::string fileName, <span class="keywordtype">bool</span> typeRaw = <span class="keyword">false</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = 1,
<a name="l00064"></a>00064 StkFormat format = <a class="code" href="classStk.html#s1">STK_SINT16</a>, StkFloat rate = 22050.0 );
<a name="l00065"></a>00065
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classFileRead.html#a4">close</a>( <span class="keywordtype">void</span> );
<a name="l00068"></a>00068
<a name="l00070"></a>00070 <span class="keywordtype">bool</span> <a class="code" href="classFileRead.html#a5">isOpen</a>( <span class="keywordtype">void</span> );
<a name="l00071"></a>00071
<a name="l00073"></a><a class="code" href="classFileRead.html#a6">00073</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="classFileRead.html#a6">fileSize</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> fileSize_; };
<a name="l00074"></a>00074
<a name="l00076"></a><a class="code" href="classFileRead.html#a7">00076</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classFileRead.html#a7">channels</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> channels_; };
<a name="l00077"></a>00077
<a name="l00079"></a>00079
<a name="l00084"></a><a class="code" href="classFileRead.html#a8">00084</a> StkFloat <a class="code" href="classFileRead.html#a8">fileRate</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> fileRate_; };
<a name="l00085"></a>00085
<a name="l00087"></a>00087
<a name="l00099"></a>00099 <span class="keywordtype">void</span> <a class="code" href="classFileRead.html#a9">read</a>( <a class="code" href="classStkFrames.html">StkFrames</a>&amp; buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> startFrame = 0, <span class="keywordtype">bool</span> doNormalize = <span class="keyword">true</span> );
<a name="l00100"></a>00100
<a name="l00101"></a>00101 <span class="keyword">protected</span>:
<a name="l00102"></a>00102
<a name="l00103"></a>00103 <span class="comment">// Get STK RAW file information.</span>
<a name="l00104"></a>00104 <span class="keywordtype">bool</span> getRawInfo( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels,
<a name="l00105"></a>00105 StkFormat format, StkFloat rate );
<a name="l00106"></a>00106
<a name="l00107"></a>00107 <span class="comment">// Get WAV file header information.</span>
<a name="l00108"></a>00108 <span class="keywordtype">bool</span> getWavInfo( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00109"></a>00109
<a name="l00110"></a>00110 <span class="comment">// Get SND (AU) file header information.</span>
<a name="l00111"></a>00111 <span class="keywordtype">bool</span> getSndInfo( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00112"></a>00112
<a name="l00113"></a>00113 <span class="comment">// Get AIFF file header information.</span>
<a name="l00114"></a>00114 <span class="keywordtype">bool</span> getAifInfo( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00115"></a>00115
<a name="l00116"></a>00116 <span class="comment">// Get MAT-file header information.</span>
<a name="l00117"></a>00117 <span class="keywordtype">bool</span> getMatInfo( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00118"></a>00118
<a name="l00119"></a>00119 FILE *fd_;
<a name="l00120"></a>00120 <span class="keywordtype">bool</span> byteswap_;
<a name="l00121"></a>00121 <span class="keywordtype">bool</span> wavFile_;
<a name="l00122"></a>00122 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fileSize_;
<a name="l00123"></a>00123 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> dataOffset_;
<a name="l00124"></a>00124 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels_;
<a name="l00125"></a>00125 StkFormat dataType_;
<a name="l00126"></a>00126 StkFloat fileRate_;
<a name="l00127"></a>00127 };
<a name="l00128"></a>00128
<a name="l00129"></a>00129 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,99 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>FileRead.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FILEREAD_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILEREAD_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Stk.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00039"></a>00039 <span class="comment">/***************************************************/</span>
<a name="l00040"></a>00040
<a name="l00041"></a><a class="code" href="classstk_1_1FileRead.html">00041</a> <span class="keyword">class </span><a class="code" href="classstk_1_1FileRead.html" title="STK audio file input class.">FileRead</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Stk.html" title="STK base class.">Stk</a>
<a name="l00042"></a>00042 {
<a name="l00043"></a>00043 <span class="keyword">public</span>:
<a name="l00045"></a>00045 <a class="code" href="classstk_1_1FileRead.html#a9b8c55af1ca997dd3b808afcc54f3089" title="Default constructor.">FileRead</a>( <span class="keywordtype">void</span> );
<a name="l00046"></a>00046
<a name="l00048"></a>00048
<a name="l00054"></a>00054 <a class="code" href="classstk_1_1FileRead.html#a9b8c55af1ca997dd3b808afcc54f3089" title="Default constructor.">FileRead</a>( std::string fileName, <span class="keywordtype">bool</span> typeRaw = <span class="keyword">false</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = 1,
<a name="l00055"></a>00055 StkFormat <a class="code" href="classstk_1_1FileRead.html#a6852b303c34f01967be2a7a69221ef0b" title="Return the data format of the file.">format</a> = <a class="code" href="classstk_1_1Stk.html#a5a807971b7fc3c8985d97823be079a7b">STK_SINT16</a>, StkFloat rate = 22050.0 );
<a name="l00056"></a>00056
<a name="l00058"></a>00058 <a class="code" href="classstk_1_1FileRead.html#a24802c0e1846ea9f420f40293af4cde4" title="Class destructor.">~FileRead</a>( <span class="keywordtype">void</span> );
<a name="l00059"></a>00059
<a name="l00061"></a>00061
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileRead.html#acc11b53871e05af1b0342e2cc1fc3157" title="Open the specified file and determine its formatting.">open</a>( std::string fileName, <span class="keywordtype">bool</span> typeRaw = <span class="keyword">false</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = 1,
<a name="l00068"></a>00068 StkFormat <a class="code" href="classstk_1_1FileRead.html#a6852b303c34f01967be2a7a69221ef0b" title="Return the data format of the file.">format</a> = <a class="code" href="classstk_1_1Stk.html#a5a807971b7fc3c8985d97823be079a7b">STK_SINT16</a>, StkFloat rate = 22050.0 );
<a name="l00069"></a>00069
<a name="l00071"></a>00071 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileRead.html#a56d09169c0cca8623823579c7f80808a" title="If a file is open, close it.">close</a>( <span class="keywordtype">void</span> );
<a name="l00072"></a>00072
<a name="l00074"></a>00074 <span class="keywordtype">bool</span> <a class="code" href="classstk_1_1FileRead.html#a3f30ed2a9f45493f0369aa2edbf38f70" title="Returns true if a file is currently open.">isOpen</a>( <span class="keywordtype">void</span> );
<a name="l00075"></a>00075
<a name="l00077"></a><a class="code" href="classstk_1_1FileRead.html#a6a83d925dd5bd18c4299ea42cc0ea488">00077</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="classstk_1_1FileRead.html#a6a83d925dd5bd18c4299ea42cc0ea488" title="Return the file size in sample frames.">fileSize</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> fileSize_; };
<a name="l00078"></a>00078
<a name="l00080"></a><a class="code" href="classstk_1_1FileRead.html#a4c0c35f1817a4984b325967f1e7bcd81">00080</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classstk_1_1FileRead.html#a4c0c35f1817a4984b325967f1e7bcd81" title="Return the number of audio channels in the file.">channels</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> channels_; };
<a name="l00081"></a>00081
<a name="l00083"></a><a class="code" href="classstk_1_1FileRead.html#a6852b303c34f01967be2a7a69221ef0b">00083</a> StkFormat <a class="code" href="classstk_1_1FileRead.html#a6852b303c34f01967be2a7a69221ef0b" title="Return the data format of the file.">format</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> dataType_; };
<a name="l00084"></a>00084
<a name="l00086"></a>00086
<a name="l00091"></a><a class="code" href="classstk_1_1FileRead.html#a7d6ba525b2f8ae693d953cb7f4b7c199">00091</a> StkFloat <a class="code" href="classstk_1_1FileRead.html#a7d6ba525b2f8ae693d953cb7f4b7c199" title="Return the file sample rate in Hz.">fileRate</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> fileRate_; };
<a name="l00092"></a>00092
<a name="l00094"></a>00094
<a name="l00106"></a>00106 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileRead.html#a8eefe5d1479789c02ac2dfa76ba143f8" title="Read sample frames from the file into an StkFrames object.">read</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> startFrame = 0, <span class="keywordtype">bool</span> doNormalize = <span class="keyword">true</span> );
<a name="l00107"></a>00107
<a name="l00108"></a>00108 <span class="keyword">protected</span>:
<a name="l00109"></a>00109
<a name="l00110"></a>00110 <span class="comment">// Get STK RAW file information.</span>
<a name="l00111"></a>00111 <span class="keywordtype">bool</span> getRawInfo( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels,
<a name="l00112"></a>00112 StkFormat <a class="code" href="classstk_1_1FileRead.html#a6852b303c34f01967be2a7a69221ef0b" title="Return the data format of the file.">format</a>, StkFloat rate );
<a name="l00113"></a>00113
<a name="l00114"></a>00114 <span class="comment">// Get WAV file header information.</span>
<a name="l00115"></a>00115 <span class="keywordtype">bool</span> getWavInfo( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00116"></a>00116
<a name="l00117"></a>00117 <span class="comment">// Get SND (AU) file header information.</span>
<a name="l00118"></a>00118 <span class="keywordtype">bool</span> getSndInfo( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00119"></a>00119
<a name="l00120"></a>00120 <span class="comment">// Get AIFF file header information.</span>
<a name="l00121"></a>00121 <span class="keywordtype">bool</span> getAifInfo( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00122"></a>00122
<a name="l00123"></a>00123 <span class="comment">// Get MAT-file header information.</span>
<a name="l00124"></a>00124 <span class="keywordtype">bool</span> getMatInfo( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00125"></a>00125
<a name="l00126"></a>00126 <span class="comment">// Helper function for MAT-file parsing.</span>
<a name="l00127"></a>00127 <span class="keywordtype">bool</span> findNextMatArray( SINT32 *chunkSize, SINT32 *rows, SINT32 *columns, SINT32 *nametype );
<a name="l00128"></a>00128
<a name="l00129"></a>00129 FILE *fd_;
<a name="l00130"></a>00130 <span class="keywordtype">bool</span> byteswap_;
<a name="l00131"></a>00131 <span class="keywordtype">bool</span> wavFile_;
<a name="l00132"></a>00132 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> fileSize_;
<a name="l00133"></a>00133 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> dataOffset_;
<a name="l00134"></a>00134 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels_;
<a name="l00135"></a>00135 StkFormat dataType_;
<a name="l00136"></a>00136 StkFloat fileRate_;
<a name="l00137"></a>00137 };
<a name="l00138"></a>00138
<a name="l00139"></a>00139 } <span class="comment">// stk namespace</span>
<a name="l00140"></a>00140
<a name="l00141"></a>00141 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,99 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>FileWrite.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00022"></a>00022 <span class="comment">/***************************************************/</span>
<a name="l00023"></a>00023
<a name="l00024"></a>00024 <span class="preprocessor">#ifndef STK_FILEWRITE_H</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILEWRITE_H</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "Stk.h"</span>
<a name="l00028"></a>00028
<a name="l00029"></a><a class="code" href="classFileWrite.html">00029</a> <span class="keyword">class </span><a class="code" href="classFileWrite.html">FileWrite</a> : <span class="keyword">public</span> <a class="code" href="classStk.html">Stk</a>
<a name="l00030"></a>00030 {
<a name="l00031"></a>00031 <span class="keyword">public</span>:
<a name="l00032"></a>00032
<a name="l00033"></a>00033 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> FILE_TYPE;
<a name="l00034"></a>00034
<a name="l00035"></a><a class="code" href="classFileWrite.html#s0">00035</a> <span class="keyword">static</span> <span class="keyword">const</span> FILE_TYPE <a class="code" href="classFileWrite.html#s0">FILE_RAW</a>;
<a name="l00036"></a><a class="code" href="classFileWrite.html#s1">00036</a> <span class="keyword">static</span> <span class="keyword">const</span> FILE_TYPE <a class="code" href="classFileWrite.html#s1">FILE_WAV</a>;
<a name="l00037"></a><a class="code" href="classFileWrite.html#s2">00037</a> <span class="keyword">static</span> <span class="keyword">const</span> FILE_TYPE <a class="code" href="classFileWrite.html#s2">FILE_SND</a>;
<a name="l00038"></a><a class="code" href="classFileWrite.html#s3">00038</a> <span class="keyword">static</span> <span class="keyword">const</span> FILE_TYPE <a class="code" href="classFileWrite.html#s3">FILE_AIF</a>;
<a name="l00039"></a><a class="code" href="classFileWrite.html#s4">00039</a> <span class="keyword">static</span> <span class="keyword">const</span> FILE_TYPE <a class="code" href="classFileWrite.html#s4">FILE_MAT</a>;
<a name="l00041"></a>00041
<a name="l00042"></a>00042 <a class="code" href="classFileWrite.html#a0">FileWrite</a>();
<a name="l00043"></a>00043
<a name="l00045"></a>00045
<a name="l00048"></a>00048 <a class="code" href="classFileWrite.html#a0">FileWrite</a>( std::string fileName, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = 1, FILE_TYPE type = <a class="code" href="classFileWrite.html#s1">FILE_WAV</a>, Stk::StkFormat format = <a class="code" href="classStk.html#s1">STK_SINT16</a> );
<a name="l00049"></a>00049
<a name="l00051"></a>00051 <span class="keyword">virtual</span> <a class="code" href="classFileWrite.html#a2">~FileWrite</a>();
<a name="l00052"></a>00052
<a name="l00054"></a>00054
<a name="l00057"></a>00057 <span class="keywordtype">void</span> <a class="code" href="classFileWrite.html#a3">open</a>( std::string fileName, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = 1,
<a name="l00058"></a>00058 FileWrite::FILE_TYPE type = <a class="code" href="classFileWrite.html#s1">FILE_WAV</a>, Stk::StkFormat format = <a class="code" href="classStk.html#s1">STK_SINT16</a> );
<a name="l00059"></a>00059
<a name="l00061"></a>00061 <span class="keywordtype">void</span> <a class="code" href="classFileWrite.html#a4">close</a>( <span class="keywordtype">void</span> );
<a name="l00062"></a>00062
<a name="l00064"></a>00064 <span class="keywordtype">bool</span> <a class="code" href="classFileWrite.html#a5">isOpen</a>( <span class="keywordtype">void</span> );
<a name="l00065"></a>00065
<a name="l00067"></a>00067
<a name="l00072"></a>00072 <span class="keywordtype">void</span> <a class="code" href="classFileWrite.html#a6">write</a>( <a class="code" href="classStkFrames.html">StkFrames</a>&amp; buffer );
<a name="l00073"></a>00073
<a name="l00074"></a>00074 <span class="keyword">protected</span>:
<a name="l00075"></a>00075
<a name="l00076"></a>00076 <span class="comment">// Write STK RAW file header.</span>
<a name="l00077"></a>00077 <span class="keywordtype">bool</span> setRawFile( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00078"></a>00078
<a name="l00079"></a>00079 <span class="comment">// Write WAV file header.</span>
<a name="l00080"></a>00080 <span class="keywordtype">bool</span> setWavFile( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00081"></a>00081
<a name="l00082"></a>00082 <span class="comment">// Close WAV file, updating the header.</span>
<a name="l00083"></a>00083 <span class="keywordtype">void</span> closeWavFile( <span class="keywordtype">void</span> );
<a name="l00084"></a>00084
<a name="l00085"></a>00085 <span class="comment">// Write SND (AU) file header.</span>
<a name="l00086"></a>00086 <span class="keywordtype">bool</span> setSndFile( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00087"></a>00087
<a name="l00088"></a>00088 <span class="comment">// Close SND file, updating the header.</span>
<a name="l00089"></a>00089 <span class="keywordtype">void</span> closeSndFile( <span class="keywordtype">void</span> );
<a name="l00090"></a>00090
<a name="l00091"></a>00091 <span class="comment">// Write AIFF file header.</span>
<a name="l00092"></a>00092 <span class="keywordtype">bool</span> setAifFile( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00093"></a>00093
<a name="l00094"></a>00094 <span class="comment">// Close AIFF file, updating the header.</span>
<a name="l00095"></a>00095 <span class="keywordtype">void</span> closeAifFile( <span class="keywordtype">void</span> );
<a name="l00096"></a>00096
<a name="l00097"></a>00097 <span class="comment">// Write MAT-file header.</span>
<a name="l00098"></a>00098 <span class="keywordtype">bool</span> setMatFile( <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName );
<a name="l00099"></a>00099
<a name="l00100"></a>00100 <span class="comment">// Close MAT-file, updating the header.</span>
<a name="l00101"></a>00101 <span class="keywordtype">void</span> closeMatFile( <span class="keywordtype">void</span> );
<a name="l00102"></a>00102
<a name="l00103"></a>00103 FILE *fd_;
<a name="l00104"></a>00104 FILE_TYPE fileType_;
<a name="l00105"></a>00105 StkFormat dataType_;
<a name="l00106"></a>00106 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels_;
<a name="l00107"></a>00107 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> frameCounter_;
<a name="l00108"></a>00108 <span class="keywordtype">bool</span> byteswap_;
<a name="l00109"></a>00109
<a name="l00110"></a>00110 };
<a name="l00111"></a>00111
<a name="l00112"></a>00112 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,105 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>FileWrite.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FILEWRITE_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILEWRITE_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Stk.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00029"></a>00029 <span class="comment">/***************************************************/</span>
<a name="l00030"></a>00030
<a name="l00031"></a><a class="code" href="classstk_1_1FileWrite.html">00031</a> <span class="keyword">class </span><a class="code" href="classstk_1_1FileWrite.html" title="STK audio file output class.">FileWrite</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Stk.html" title="STK base class.">Stk</a>
<a name="l00032"></a>00032 {
<a name="l00033"></a>00033 <span class="keyword">public</span>:
<a name="l00034"></a>00034
<a name="l00035"></a>00035 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> FILE_TYPE;
<a name="l00036"></a>00036
<a name="l00037"></a><a class="code" href="classstk_1_1FileWrite.html#ac9e286cfc8037327eef493439e78f31e">00037</a> <span class="keyword">static</span> <span class="keyword">const</span> FILE_TYPE <a class="code" href="classstk_1_1FileWrite.html#ac9e286cfc8037327eef493439e78f31e">FILE_RAW</a>;
<a name="l00038"></a><a class="code" href="classstk_1_1FileWrite.html#a800875bbcac8f137ed94f5606d55f8c6">00038</a> <span class="keyword">static</span> <span class="keyword">const</span> FILE_TYPE <a class="code" href="classstk_1_1FileWrite.html#a800875bbcac8f137ed94f5606d55f8c6">FILE_WAV</a>;
<a name="l00039"></a><a class="code" href="classstk_1_1FileWrite.html#a1ae24c549fc9fa2c8ef4a6ff94ccc345">00039</a> <span class="keyword">static</span> <span class="keyword">const</span> FILE_TYPE <a class="code" href="classstk_1_1FileWrite.html#a1ae24c549fc9fa2c8ef4a6ff94ccc345">FILE_SND</a>;
<a name="l00040"></a><a class="code" href="classstk_1_1FileWrite.html#a678074f8bfa198627ed8ee9f52a42c0e">00040</a> <span class="keyword">static</span> <span class="keyword">const</span> FILE_TYPE <a class="code" href="classstk_1_1FileWrite.html#a678074f8bfa198627ed8ee9f52a42c0e">FILE_AIF</a>;
<a name="l00041"></a><a class="code" href="classstk_1_1FileWrite.html#ad06e073000f613c43c48707c724d104e">00041</a> <span class="keyword">static</span> <span class="keyword">const</span> FILE_TYPE <a class="code" href="classstk_1_1FileWrite.html#ad06e073000f613c43c48707c724d104e">FILE_MAT</a>;
<a name="l00043"></a>00043
<a name="l00044"></a>00044 <a class="code" href="classstk_1_1FileWrite.html#ab362583b465c41ac0b411722621e9d3d" title="Default constructor.">FileWrite</a>( <span class="keywordtype">void</span> );
<a name="l00045"></a>00045
<a name="l00047"></a>00047
<a name="l00050"></a>00050 <a class="code" href="classstk_1_1FileWrite.html#ab362583b465c41ac0b411722621e9d3d" title="Default constructor.">FileWrite</a>( std::string fileName, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = 1, FILE_TYPE type = <a class="code" href="classstk_1_1FileWrite.html#a800875bbcac8f137ed94f5606d55f8c6">FILE_WAV</a>, Stk::StkFormat format = <a class="code" href="classstk_1_1Stk.html#a5a807971b7fc3c8985d97823be079a7b">STK_SINT16</a> );
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keyword">virtual</span> <a class="code" href="classstk_1_1FileWrite.html#ac4da2511c8d0640ec5484f88bd704747" title="Class destructor.">~FileWrite</a>();
<a name="l00054"></a>00054
<a name="l00056"></a>00056
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWrite.html#a7575ddb275c902207b7b6518bb5a4ed9" title="Create a file of the specified type and name and output samples to it in the given...">open</a>( std::string fileName, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = 1,
<a name="l00060"></a>00060 FileWrite::FILE_TYPE type = <a class="code" href="classstk_1_1FileWrite.html#a800875bbcac8f137ed94f5606d55f8c6">FILE_WAV</a>, Stk::StkFormat format = <a class="code" href="classstk_1_1Stk.html#a5a807971b7fc3c8985d97823be079a7b">STK_SINT16</a> );
<a name="l00061"></a>00061
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWrite.html#a99a19988a4dd8d608b74421cfb6cbc69" title="If a file is open, write out samples in the queue and then close it.">close</a>( <span class="keywordtype">void</span> );
<a name="l00064"></a>00064
<a name="l00066"></a>00066 <span class="keywordtype">bool</span> <a class="code" href="classstk_1_1FileWrite.html#a636436624aa39eb5ba3401a9279a173e" title="Returns true if a file is currently open.">isOpen</a>( <span class="keywordtype">void</span> );
<a name="l00067"></a>00067
<a name="l00069"></a>00069
<a name="l00074"></a>00074 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWrite.html#ad33ca8e729c14296af6dce457445832e" title="Write sample frames from the StkFrames object to the file.">write</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; buffer );
<a name="l00075"></a>00075
<a name="l00076"></a>00076 <span class="keyword">protected</span>:
<a name="l00077"></a>00077
<a name="l00078"></a>00078 <span class="comment">// Write STK RAW file header.</span>
<a name="l00079"></a>00079 <span class="keywordtype">bool</span> setRawFile( std::string fileName );
<a name="l00080"></a>00080
<a name="l00081"></a>00081 <span class="comment">// Write WAV file header.</span>
<a name="l00082"></a>00082 <span class="keywordtype">bool</span> setWavFile( std::string fileName );
<a name="l00083"></a>00083
<a name="l00084"></a>00084 <span class="comment">// Close WAV file, updating the header.</span>
<a name="l00085"></a>00085 <span class="keywordtype">void</span> closeWavFile( <span class="keywordtype">void</span> );
<a name="l00086"></a>00086
<a name="l00087"></a>00087 <span class="comment">// Write SND (AU) file header.</span>
<a name="l00088"></a>00088 <span class="keywordtype">bool</span> setSndFile( std::string fileName );
<a name="l00089"></a>00089
<a name="l00090"></a>00090 <span class="comment">// Close SND file, updating the header.</span>
<a name="l00091"></a>00091 <span class="keywordtype">void</span> closeSndFile( <span class="keywordtype">void</span> );
<a name="l00092"></a>00092
<a name="l00093"></a>00093 <span class="comment">// Write AIFF file header.</span>
<a name="l00094"></a>00094 <span class="keywordtype">bool</span> setAifFile( std::string fileName );
<a name="l00095"></a>00095
<a name="l00096"></a>00096 <span class="comment">// Close AIFF file, updating the header.</span>
<a name="l00097"></a>00097 <span class="keywordtype">void</span> closeAifFile( <span class="keywordtype">void</span> );
<a name="l00098"></a>00098
<a name="l00099"></a>00099 <span class="comment">// Write MAT-file header.</span>
<a name="l00100"></a>00100 <span class="keywordtype">bool</span> setMatFile( std::string fileName );
<a name="l00101"></a>00101
<a name="l00102"></a>00102 <span class="comment">// Close MAT-file, updating the header.</span>
<a name="l00103"></a>00103 <span class="keywordtype">void</span> closeMatFile( <span class="keywordtype">void</span> );
<a name="l00104"></a>00104
<a name="l00105"></a>00105 FILE *fd_;
<a name="l00106"></a>00106 FILE_TYPE fileType_;
<a name="l00107"></a>00107 StkFormat dataType_;
<a name="l00108"></a>00108 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channels_;
<a name="l00109"></a>00109 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> frameCounter_;
<a name="l00110"></a>00110 <span class="keywordtype">bool</span> byteswap_;
<a name="l00111"></a>00111
<a name="l00112"></a>00112 };
<a name="l00113"></a>00113
<a name="l00114"></a>00114 } <span class="comment">// stk namespace</span>
<a name="l00115"></a>00115
<a name="l00116"></a>00116 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,92 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>FileWvIn.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00032"></a>00032 <span class="comment">/***************************************************/</span>
<a name="l00033"></a>00033
<a name="l00034"></a>00034 <span class="preprocessor">#ifndef STK_FILEWVIN_H</span>
<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILEWVIN_H</span>
<a name="l00036"></a>00036 <span class="preprocessor"></span>
<a name="l00037"></a>00037 <span class="preprocessor">#include "WvIn.h"</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include "FileRead.h"</span>
<a name="l00039"></a>00039
<a name="l00040"></a><a class="code" href="classFileWvIn.html">00040</a> <span class="keyword">class </span><a class="code" href="classFileWvIn.html">FileWvIn</a> : <span class="keyword">public</span> <a class="code" href="classWvIn.html">WvIn</a>
<a name="l00041"></a>00041 {
<a name="l00042"></a>00042 <span class="keyword">public</span>:
<a name="l00044"></a>00044 <a class="code" href="classFileWvIn.html#a0">FileWvIn</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkThreshold = 1000000, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkSize = 1024 );
<a name="l00045"></a>00045
<a name="l00047"></a>00047
<a name="l00051"></a>00051 <a class="code" href="classFileWvIn.html#a0">FileWvIn</a>( std::string fileName, <span class="keywordtype">bool</span> raw = <span class="keyword">false</span>, <span class="keywordtype">bool</span> doNormalize = <span class="keyword">true</span>,
<a name="l00052"></a>00052 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkThreshold = 1000000, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkSize = 1024 );
<a name="l00053"></a>00053
<a name="l00055"></a>00055 <span class="keyword">virtual</span> <a class="code" href="classFileWvIn.html#a2">~FileWvIn</a>();
<a name="l00056"></a>00056
<a name="l00058"></a>00058
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classFileWvIn.html#a3">openFile</a>( std::string fileName, <span class="keywordtype">bool</span> raw = <span class="keyword">false</span>, <span class="keywordtype">bool</span> doNormalize = <span class="keyword">true</span> );
<a name="l00068"></a>00068
<a name="l00070"></a>00070 <span class="keywordtype">void</span> <a class="code" href="classFileWvIn.html#a4">closeFile</a>( <span class="keywordtype">void</span> );
<a name="l00071"></a>00071
<a name="l00073"></a>00073 <span class="keywordtype">void</span> <a class="code" href="classFileWvIn.html#a5">reset</a>( <span class="keywordtype">void</span> );
<a name="l00074"></a>00074
<a name="l00076"></a>00076
<a name="l00080"></a>00080 <span class="keywordtype">void</span> <a class="code" href="classFileWvIn.html#a6">normalize</a>( <span class="keywordtype">void</span> );
<a name="l00081"></a>00081
<a name="l00083"></a>00083
<a name="l00087"></a>00087 <span class="keywordtype">void</span> <a class="code" href="classFileWvIn.html#a6">normalize</a>( StkFloat peak );
<a name="l00088"></a>00088
<a name="l00090"></a><a class="code" href="classFileWvIn.html#a8">00090</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="classFileWvIn.html#a8">getSize</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data_.<a class="code" href="classStkFrames.html#a13">frames</a>(); };
<a name="l00091"></a>00091
<a name="l00093"></a>00093
<a name="l00098"></a><a class="code" href="classFileWvIn.html#a9">00098</a> StkFloat <a class="code" href="classFileWvIn.html#a9">getFileRate</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data_.<a class="code" href="classStkFrames.html#a15">dataRate</a>(); };
<a name="l00099"></a>00099
<a name="l00101"></a><a class="code" href="classFileWvIn.html#a10">00101</a> <span class="keywordtype">bool</span> <a class="code" href="classFileWvIn.html#a10">isFinished</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> finished_; };
<a name="l00102"></a>00102
<a name="l00104"></a>00104
<a name="l00107"></a>00107 <span class="keywordtype">void</span> <a class="code" href="classFileWvIn.html#a11">setRate</a>( StkFloat rate );
<a name="l00108"></a>00108
<a name="l00110"></a>00110
<a name="l00113"></a>00113 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classFileWvIn.html#a12">addTime</a>( StkFloat time );
<a name="l00114"></a>00114
<a name="l00116"></a>00116
<a name="l00122"></a><a class="code" href="classFileWvIn.html#a13">00122</a> <span class="keywordtype">void</span> <a class="code" href="classFileWvIn.html#a13">setInterpolate</a>( <span class="keywordtype">bool</span> doInterpolate ) { interpolate_ = doInterpolate; };
<a name="l00123"></a>00123
<a name="l00124"></a>00124 StkFloat lastOut( <span class="keywordtype">void</span> ) <span class="keyword">const</span>;
<a name="l00125"></a>00125
<a name="l00126"></a>00126 <span class="keyword">protected</span>:
<a name="l00127"></a>00127
<a name="l00128"></a>00128 <span class="keyword">virtual</span> <span class="keywordtype">void</span> computeFrame( <span class="keywordtype">void</span> );
<a name="l00129"></a>00129 <span class="keyword">virtual</span> <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00130"></a>00130
<a name="l00131"></a>00131 <a class="code" href="classFileRead.html">FileRead</a> file_;
<a name="l00132"></a>00132 <span class="keywordtype">bool</span> finished_;
<a name="l00133"></a>00133 <span class="keywordtype">bool</span> interpolate_;
<a name="l00134"></a>00134 <span class="keywordtype">bool</span> normalizing_;
<a name="l00135"></a>00135 <span class="keywordtype">bool</span> chunking_;
<a name="l00136"></a>00136 StkFloat time_;
<a name="l00137"></a>00137 StkFloat rate_;
<a name="l00138"></a>00138 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkThreshold_;
<a name="l00139"></a>00139 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkSize_;
<a name="l00140"></a>00140 <span class="keywordtype">long</span> chunkPointer_;
<a name="l00141"></a>00141
<a name="l00142"></a>00142 };
<a name="l00143"></a>00143
<a name="l00144"></a>00144 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,119 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>FileWvIn.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FILEWVIN_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILEWVIN_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;WvIn.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;FileRead.h&quot;</span>
<a name="l00006"></a>00006
<a name="l00007"></a>00007 <span class="keyword">namespace </span>stk {
<a name="l00008"></a>00008
<a name="l00009"></a>00009 <span class="comment">/***************************************************/</span>
<a name="l00040"></a>00040 <span class="comment">/***************************************************/</span>
<a name="l00041"></a>00041
<a name="l00042"></a><a class="code" href="classstk_1_1FileWvIn.html">00042</a> <span class="keyword">class </span><a class="code" href="classstk_1_1FileWvIn.html" title="STK audio file input class.">FileWvIn</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1WvIn.html" title="STK audio input abstract base class.">WvIn</a>
<a name="l00043"></a>00043 {
<a name="l00044"></a>00044 <span class="keyword">public</span>:
<a name="l00046"></a>00046 <a class="code" href="classstk_1_1FileWvIn.html#a0562e85c4cb0d1565d9697da966add94" title="Default constructor.">FileWvIn</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkThreshold = 1000000, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkSize = 1024 );
<a name="l00047"></a>00047
<a name="l00049"></a>00049
<a name="l00053"></a>00053 <a class="code" href="classstk_1_1FileWvIn.html#a0562e85c4cb0d1565d9697da966add94" title="Default constructor.">FileWvIn</a>( std::string fileName, <span class="keywordtype">bool</span> raw = <span class="keyword">false</span>, <span class="keywordtype">bool</span> doNormalize = <span class="keyword">true</span>,
<a name="l00054"></a>00054 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkThreshold = 1000000, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkSize = 1024 );
<a name="l00055"></a>00055
<a name="l00057"></a>00057 <a class="code" href="classstk_1_1FileWvIn.html#ad63f10df8795ce5cb6348b0bb1ad884e" title="Class destructor.">~FileWvIn</a>( <span class="keywordtype">void</span> );
<a name="l00058"></a>00058
<a name="l00060"></a>00060
<a name="l00069"></a>00069 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvIn.html#a7986664cd986cbacf4fb19e5c77deda1" title="Open the specified file and load its data.">openFile</a>( std::string fileName, <span class="keywordtype">bool</span> raw = <span class="keyword">false</span>, <span class="keywordtype">bool</span> doNormalize = <span class="keyword">true</span> );
<a name="l00070"></a>00070
<a name="l00072"></a>00072 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvIn.html#ae586a93b45a979881d9bd6fc1cb364cb" title="Close a file if one is open.">closeFile</a>( <span class="keywordtype">void</span> );
<a name="l00073"></a>00073
<a name="l00075"></a>00075 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvIn.html#ac7dfd47e46a083d434e63c9d1b8c3d28" title="Clear outputs and reset time (file) pointer to zero.">reset</a>( <span class="keywordtype">void</span> );
<a name="l00076"></a>00076
<a name="l00078"></a>00078
<a name="l00082"></a>00082 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvIn.html#aaecd1950fca3a5513e0efe4e86754b11" title="Normalize data to a maximum of +-1.0.">normalize</a>( <span class="keywordtype">void</span> );
<a name="l00083"></a>00083
<a name="l00085"></a>00085
<a name="l00089"></a>00089 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvIn.html#aaecd1950fca3a5513e0efe4e86754b11" title="Normalize data to a maximum of +-1.0.">normalize</a>( StkFloat peak );
<a name="l00090"></a>00090
<a name="l00092"></a><a class="code" href="classstk_1_1FileWvIn.html#aa8ef94c3ed01af0efc9e968f09207a26">00092</a> <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="classstk_1_1FileWvIn.html#aa8ef94c3ed01af0efc9e968f09207a26" title="Return the file size in sample frames.">getSize</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> file_.<a class="code" href="classstk_1_1FileRead.html#a6a83d925dd5bd18c4299ea42cc0ea488" title="Return the file size in sample frames.">fileSize</a>(); };
<a name="l00093"></a>00093
<a name="l00095"></a>00095
<a name="l00100"></a><a class="code" href="classstk_1_1FileWvIn.html#a867b7b7fdb60e5194e25d7a85a26ec0b">00100</a> <span class="keyword">virtual</span> StkFloat <a class="code" href="classstk_1_1FileWvIn.html#a867b7b7fdb60e5194e25d7a85a26ec0b" title="Return the input file sample rate in Hz (not the data read rate).">getFileRate</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data_.<a class="code" href="classstk_1_1StkFrames.html#a4dbbcbdc8db39a803e0861976f7f3522" title="Return the sample rate associated with the StkFrames data.">dataRate</a>(); };
<a name="l00101"></a>00101
<a name="l00103"></a><a class="code" href="classstk_1_1FileWvIn.html#aa45344366bca49f71c7153ac5b296e91">00103</a> <span class="keywordtype">bool</span> <a class="code" href="classstk_1_1FileWvIn.html#aa45344366bca49f71c7153ac5b296e91" title="Query whether a file is open.">isOpen</a>( <span class="keywordtype">void</span> ) { <span class="keywordflow">return</span> file_.<a class="code" href="classstk_1_1FileRead.html#a3f30ed2a9f45493f0369aa2edbf38f70" title="Returns true if a file is currently open.">isOpen</a>(); };
<a name="l00104"></a>00104
<a name="l00106"></a><a class="code" href="classstk_1_1FileWvIn.html#aca9ad0c12af3323e7bbf877513b0d10b">00106</a> <span class="keywordtype">bool</span> <a class="code" href="classstk_1_1FileWvIn.html#aca9ad0c12af3323e7bbf877513b0d10b" title="Query whether reading is complete.">isFinished</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> finished_; };
<a name="l00107"></a>00107
<a name="l00109"></a>00109
<a name="l00112"></a>00112 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvIn.html#aacd97ad5f30f9cdc8201b4244aa69901" title="Set the data read rate in samples. The rate can be negative.">setRate</a>( StkFloat rate );
<a name="l00113"></a>00113
<a name="l00115"></a>00115
<a name="l00118"></a>00118 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvIn.html#ab2ccf7cc65c36a1ecfbb3b7d5707ea48" title="Increment the read pointer by time samples.">addTime</a>( StkFloat time );
<a name="l00119"></a>00119
<a name="l00121"></a>00121
<a name="l00127"></a><a class="code" href="classstk_1_1FileWvIn.html#a129c1e0b51497e6b09ad6aa37ad4d969">00127</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvIn.html#a129c1e0b51497e6b09ad6aa37ad4d969" title="Turn linear interpolation on/off.">setInterpolate</a>( <span class="keywordtype">bool</span> doInterpolate ) { interpolate_ = doInterpolate; };
<a name="l00128"></a>00128
<a name="l00130"></a>00130
<a name="l00139"></a>00139 StkFloat <a class="code" href="classstk_1_1FileWvIn.html#ad17c12e8d51f90f59f0d0c9f6d626608" title="Return the specified channel value of the last computed frame.">lastOut</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00140"></a>00140
<a name="l00142"></a>00142
<a name="l00151"></a>00151 <span class="keyword">virtual</span> StkFloat <a class="code" href="classstk_1_1FileWvIn.html#ada668a0bc0bf89e155ef341de00babc2" title="Compute a sample frame and return the specified channel value.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00152"></a>00152
<a name="l00154"></a>00154
<a name="l00162"></a>00162 <span class="keyword">virtual</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1FileWvIn.html#ada668a0bc0bf89e155ef341de00babc2" title="Compute a sample frame and return the specified channel value.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames );
<a name="l00163"></a>00163
<a name="l00164"></a>00164 <span class="keyword">protected</span>:
<a name="l00165"></a>00165
<a name="l00166"></a>00166 <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00167"></a>00167
<a name="l00168"></a>00168 <a class="code" href="classstk_1_1FileRead.html" title="STK audio file input class.">FileRead</a> file_;
<a name="l00169"></a>00169 <span class="keywordtype">bool</span> finished_;
<a name="l00170"></a>00170 <span class="keywordtype">bool</span> interpolate_;
<a name="l00171"></a>00171 <span class="keywordtype">bool</span> normalizing_;
<a name="l00172"></a>00172 <span class="keywordtype">bool</span> chunking_;
<a name="l00173"></a>00173 StkFloat time_;
<a name="l00174"></a>00174 StkFloat rate_;
<a name="l00175"></a>00175 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkThreshold_;
<a name="l00176"></a>00176 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> chunkSize_;
<a name="l00177"></a>00177 <span class="keywordtype">long</span> chunkPointer_;
<a name="l00178"></a>00178
<a name="l00179"></a>00179 };
<a name="l00180"></a>00180
<a name="l00181"></a><a class="code" href="classstk_1_1FileWvIn.html#ad17c12e8d51f90f59f0d0c9f6d626608">00181</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1FileWvIn.html#ad17c12e8d51f90f59f0d0c9f6d626608" title="Return the specified channel value of the last computed frame.">FileWvIn :: lastOut</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00182"></a>00182 {
<a name="l00183"></a>00183 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00184"></a>00184 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= data_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00185"></a>00185 oStream_ &lt;&lt; <span class="stringliteral">&quot;FileWvIn::lastOut(): channel argument and soundfile data are incompatible!&quot;</span>;
<a name="l00186"></a>00186 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00187"></a>00187 }
<a name="l00188"></a>00188 <span class="preprocessor">#endif</span>
<a name="l00189"></a>00189 <span class="preprocessor"></span>
<a name="l00190"></a>00190 <span class="keywordflow">if</span> ( finished_ ) <span class="keywordflow">return</span> 0.0;
<a name="l00191"></a>00191 <span class="keywordflow">return</span> lastFrame_[channel];
<a name="l00192"></a>00192 }
<a name="l00193"></a>00193
<a name="l00194"></a>00194 } <span class="comment">// stk namespace</span>
<a name="l00195"></a>00195
<a name="l00196"></a>00196 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,72 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>FileWvOut.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00022"></a>00022 <span class="comment">/***************************************************/</span>
<a name="l00023"></a>00023
<a name="l00024"></a>00024 <span class="preprocessor">#ifndef STK_FILEWVOUT_H</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILEWVOUT_H</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "WvOut.h"</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "FileWrite.h"</span>
<a name="l00029"></a>00029
<a name="l00030"></a><a class="code" href="classFileWvOut.html">00030</a> <span class="keyword">class </span><a class="code" href="classFileWvOut.html">FileWvOut</a> : <span class="keyword">public</span> <a class="code" href="classWvOut.html">WvOut</a>
<a name="l00031"></a>00031 {
<a name="l00032"></a>00032 <span class="keyword">public</span>:
<a name="l00033"></a>00033
<a name="l00035"></a>00035
<a name="l00039"></a>00039 <a class="code" href="classFileWvOut.html#a0">FileWvOut</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferFrames = 1024 );
<a name="l00040"></a>00040
<a name="l00042"></a>00042
<a name="l00045"></a>00045 <a class="code" href="classFileWvOut.html#a0">FileWvOut</a>( std::string fileName,
<a name="l00046"></a>00046 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = 1,
<a name="l00047"></a>00047 FileWrite::FILE_TYPE type = <a class="code" href="classFileWrite.html#s1">FileWrite::FILE_WAV</a>,
<a name="l00048"></a>00048 Stk::StkFormat format = <a class="code" href="classStk.html#s1">STK_SINT16</a>,
<a name="l00049"></a>00049 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferFrames = 1024 );
<a name="l00050"></a>00050
<a name="l00052"></a>00052 <span class="keyword">virtual</span> <a class="code" href="classFileWvOut.html#a2">~FileWvOut</a>();
<a name="l00053"></a>00053
<a name="l00055"></a>00055
<a name="l00060"></a>00060 <span class="keywordtype">void</span> <a class="code" href="classFileWvOut.html#a3">openFile</a>( std::string fileName,
<a name="l00061"></a>00061 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels,
<a name="l00062"></a>00062 FileWrite::FILE_TYPE type,
<a name="l00063"></a>00063 Stk::StkFormat format );
<a name="l00064"></a>00064
<a name="l00066"></a>00066
<a name="l00070"></a>00070 <span class="keywordtype">void</span> <a class="code" href="classFileWvOut.html#a4">closeFile</a>( <span class="keywordtype">void</span> );
<a name="l00071"></a>00071
<a name="l00072"></a>00072 <span class="keyword">protected</span>:
<a name="l00073"></a>00073
<a name="l00074"></a>00074 <span class="keywordtype">void</span> computeSample( <span class="keyword">const</span> StkFloat sample );
<a name="l00075"></a>00075
<a name="l00076"></a>00076 <span class="keywordtype">void</span> computeFrames( <span class="keyword">const</span> <a class="code" href="classStkFrames.html">StkFrames</a>&amp; frames );
<a name="l00077"></a>00077
<a name="l00078"></a>00078 <span class="keywordtype">void</span> incrementFrame( <span class="keywordtype">void</span> );
<a name="l00079"></a>00079
<a name="l00080"></a>00080 <a class="code" href="classFileWrite.html">FileWrite</a> file_;
<a name="l00081"></a>00081 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferFrames_;
<a name="l00082"></a>00082 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferIndex_;
<a name="l00083"></a>00083 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iData_;
<a name="l00084"></a>00084
<a name="l00085"></a>00085 };
<a name="l00086"></a>00086
<a name="l00087"></a>00087 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,80 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>FileWvOut.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FILEWVOUT_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILEWVOUT_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;WvOut.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;FileWrite.h&quot;</span>
<a name="l00006"></a>00006
<a name="l00007"></a>00007 <span class="keyword">namespace </span>stk {
<a name="l00008"></a>00008
<a name="l00009"></a>00009 <span class="comment">/***************************************************/</span>
<a name="l00030"></a>00030 <span class="comment">/***************************************************/</span>
<a name="l00031"></a>00031
<a name="l00032"></a><a class="code" href="classstk_1_1FileWvOut.html">00032</a> <span class="keyword">class </span><a class="code" href="classstk_1_1FileWvOut.html" title="STK audio file output class.">FileWvOut</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1WvOut.html" title="STK audio output abstract base class.">WvOut</a>
<a name="l00033"></a>00033 {
<a name="l00034"></a>00034 <span class="keyword">public</span>:
<a name="l00035"></a>00035
<a name="l00037"></a>00037
<a name="l00041"></a>00041 <a class="code" href="classstk_1_1FileWvOut.html#a6f0168fca20a3c9d6d5f2baedf03ec1b" title="Default constructor with optional output buffer size argument.">FileWvOut</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferFrames = 1024 );
<a name="l00042"></a>00042
<a name="l00044"></a>00044
<a name="l00047"></a>00047 <a class="code" href="classstk_1_1FileWvOut.html#a6f0168fca20a3c9d6d5f2baedf03ec1b" title="Default constructor with optional output buffer size argument.">FileWvOut</a>( std::string fileName,
<a name="l00048"></a>00048 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = 1,
<a name="l00049"></a>00049 FileWrite::FILE_TYPE type = <a class="code" href="classstk_1_1FileWrite.html#a800875bbcac8f137ed94f5606d55f8c6">FileWrite::FILE_WAV</a>,
<a name="l00050"></a>00050 Stk::StkFormat format = <a class="code" href="classstk_1_1Stk.html#a5a807971b7fc3c8985d97823be079a7b">STK_SINT16</a>,
<a name="l00051"></a>00051 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferFrames = 1024 );
<a name="l00052"></a>00052
<a name="l00054"></a>00054 <span class="keyword">virtual</span> <a class="code" href="classstk_1_1FileWvOut.html#add13d21d51f639961977b63cb481c36e" title="Class destructor.">~FileWvOut</a>();
<a name="l00055"></a>00055
<a name="l00057"></a>00057
<a name="l00062"></a>00062 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvOut.html#a31dde577d41a65018c3e03001de8d645" title="Open a new file with the specified parameters.">openFile</a>( std::string fileName,
<a name="l00063"></a>00063 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels,
<a name="l00064"></a>00064 FileWrite::FILE_TYPE type,
<a name="l00065"></a>00065 Stk::StkFormat format );
<a name="l00066"></a>00066
<a name="l00068"></a>00068
<a name="l00072"></a>00072 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvOut.html#a54cbced5ce278b0d16fa800e8445103c" title="Close a file if one is open.">closeFile</a>( <span class="keywordtype">void</span> );
<a name="l00073"></a>00073
<a name="l00075"></a>00075
<a name="l00078"></a>00078 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvOut.html#a9d3505aea3cd3c4d6822f05a2679dc41" title="Output a single sample to all channels in a sample frame.">tick</a>( <span class="keyword">const</span> StkFloat sample );
<a name="l00079"></a>00079
<a name="l00081"></a>00081
<a name="l00087"></a>00087 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FileWvOut.html#a9d3505aea3cd3c4d6822f05a2679dc41" title="Output a single sample to all channels in a sample frame.">tick</a>( <span class="keyword">const</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames );
<a name="l00088"></a>00088
<a name="l00089"></a>00089 <span class="keyword">protected</span>:
<a name="l00090"></a>00090
<a name="l00091"></a>00091 <span class="keywordtype">void</span> incrementFrame( <span class="keywordtype">void</span> );
<a name="l00092"></a>00092
<a name="l00093"></a>00093 <a class="code" href="classstk_1_1FileWrite.html" title="STK audio file output class.">FileWrite</a> file_;
<a name="l00094"></a>00094 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferFrames_;
<a name="l00095"></a>00095 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferIndex_;
<a name="l00096"></a>00096 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iData_;
<a name="l00097"></a>00097
<a name="l00098"></a>00098 };
<a name="l00099"></a>00099
<a name="l00100"></a>00100 } <span class="comment">// stk namespace</span>
<a name="l00101"></a>00101
<a name="l00102"></a>00102 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,75 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Filter.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00028"></a>00028 <span class="comment">/***************************************************/</span>
<a name="l00029"></a>00029
<a name="l00030"></a>00030 <span class="preprocessor">#ifndef STK_FILTER_H</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILTER_H</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span>
<a name="l00033"></a>00033 <span class="preprocessor">#include "Stk.h"</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;vector&gt;</span>
<a name="l00035"></a>00035
<a name="l00036"></a><a class="code" href="classFilter.html">00036</a> <span class="keyword">class </span><a class="code" href="classFilter.html">Filter</a> : <span class="keyword">public</span> <a class="code" href="classStk.html">Stk</a>
<a name="l00037"></a>00037 {
<a name="l00038"></a>00038 <span class="keyword">public</span>:
<a name="l00040"></a>00040 <a class="code" href="classFilter.html#a0">Filter</a>(<span class="keywordtype">void</span>);
<a name="l00041"></a>00041
<a name="l00043"></a>00043
<a name="l00047"></a>00047 <a class="code" href="classFilter.html#a0">Filter</a>( std::vector&lt;StkFloat&gt; &amp;bCoefficients, std::vector&lt;StkFloat&gt; &amp;aCoefficients );
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <span class="keyword">virtual</span> <a class="code" href="classFilter.html#a2">~Filter</a>(<span class="keywordtype">void</span>);
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classFilter.html#a3">clear</a>(<span class="keywordtype">void</span>);
<a name="l00054"></a>00054
<a name="l00056"></a>00056
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="classFilter.html#a4">setCoefficients</a>( std::vector&lt;StkFloat&gt; &amp;bCoefficients, std::vector&lt;StkFloat&gt; &amp;aCoefficients, <span class="keywordtype">bool</span> clearState = <span class="keyword">false</span> );
<a name="l00064"></a>00064
<a name="l00066"></a>00066
<a name="l00073"></a>00073 <span class="keywordtype">void</span> <a class="code" href="classFilter.html#a5">setNumerator</a>( std::vector&lt;StkFloat&gt; &amp;bCoefficients, <span class="keywordtype">bool</span> clearState = <span class="keyword">false</span> );
<a name="l00074"></a>00074
<a name="l00076"></a>00076
<a name="l00085"></a>00085 <span class="keywordtype">void</span> <a class="code" href="classFilter.html#a6">setDenominator</a>( std::vector&lt;StkFloat&gt; &amp;aCoefficients, <span class="keywordtype">bool</span> clearState = <span class="keyword">false</span> );
<a name="l00086"></a>00086
<a name="l00088"></a>00088
<a name="l00092"></a>00092 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classFilter.html#a7">setGain</a>(StkFloat gain);
<a name="l00093"></a>00093
<a name="l00095"></a>00095 <span class="keyword">virtual</span> StkFloat <a class="code" href="classFilter.html#a8">getGain</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00096"></a>00096
<a name="l00098"></a>00098 <span class="keyword">virtual</span> StkFloat <a class="code" href="classFilter.html#a9">lastOut</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l00099"></a>00099
<a name="l00101"></a>00101 <span class="keyword">virtual</span> StkFloat <a class="code" href="classFilter.html#a10">tick</a>( StkFloat input );
<a name="l00102"></a>00102
<a name="l00104"></a>00104
<a name="l00110"></a>00110 <span class="keyword">virtual</span> <a class="code" href="classStkFrames.html">StkFrames</a>&amp; <a class="code" href="classFilter.html#a10">tick</a>( <a class="code" href="classStkFrames.html">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00111"></a>00111
<a name="l00112"></a>00112 <span class="keyword">protected</span>:
<a name="l00113"></a>00113
<a name="l00114"></a>00114 StkFloat gain_;
<a name="l00115"></a>00115 std::vector&lt;StkFloat&gt; b_;
<a name="l00116"></a>00116 std::vector&lt;StkFloat&gt; a_;
<a name="l00117"></a>00117 std::vector&lt;StkFloat&gt; outputs_;
<a name="l00118"></a>00118 std::vector&lt;StkFloat&gt; inputs_;
<a name="l00119"></a>00119
<a name="l00120"></a>00120 };
<a name="l00121"></a>00121
<a name="l00122"></a>00122 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,116 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Filter.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FILTER_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FILTER_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Stk.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &lt;vector&gt;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="keyword">namespace </span>stk {
<a name="l00009"></a>00009
<a name="l00010"></a>00010 <span class="comment">/***************************************************/</span>
<a name="l00020"></a>00020 <span class="comment">/***************************************************/</span>
<a name="l00021"></a>00021
<a name="l00022"></a><a class="code" href="classstk_1_1Filter.html">00022</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Filter.html" title="STK abstract filter class.">Filter</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Stk.html" title="STK base class.">Stk</a>
<a name="l00023"></a>00023 {
<a name="l00024"></a>00024 <span class="keyword">public</span>:
<a name="l00026"></a><a class="code" href="classstk_1_1Filter.html#afc70117c0133d4a5d9a651ceb691d7c0">00026</a> <a class="code" href="classstk_1_1Filter.html#afc70117c0133d4a5d9a651ceb691d7c0" title="Class constructor.">Filter</a>( <span class="keywordtype">void</span> ) { gain_ = 1.0; channelsIn_ = 1; lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#a386e1b86cf48f7a8117313f9e41fc0fe" title="Resize self to represent the specified number of channels and frames.">resize</a>( 1, 1, 0.0 ); };
<a name="l00027"></a>00027
<a name="l00029"></a><a class="code" href="classstk_1_1Filter.html#a48f23ab6613be35e3be8aceaf5adfdd7">00029</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classstk_1_1Filter.html#a48f23ab6613be35e3be8aceaf5adfdd7" title="Return the number of input channels for the class.">channelsIn</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> channelsIn_; };
<a name="l00030"></a>00030
<a name="l00032"></a><a class="code" href="classstk_1_1Filter.html#a4f1ed97c9ad8aef32e54b48da03f5275">00032</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classstk_1_1Filter.html#a4f1ed97c9ad8aef32e54b48da03f5275" title="Return the number of output channels for the class.">channelsOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(); };
<a name="l00033"></a>00033
<a name="l00035"></a>00035 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Filter.html#a670b9cc23ac798d3239cb819e801363c" title="Clears all internal states of the filter.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00036"></a>00036
<a name="l00038"></a>00038
<a name="l00042"></a><a class="code" href="classstk_1_1Filter.html#a827b1bd3a99fa9af408cbd4eb559d212">00042</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Filter.html#a827b1bd3a99fa9af408cbd4eb559d212" title="Set the filter gain.">setGain</a>( StkFloat gain ) { gain_ = gain; };
<a name="l00043"></a>00043
<a name="l00045"></a><a class="code" href="classstk_1_1Filter.html#af21e11b72ea59af4585c59600a0980c2">00045</a> StkFloat <a class="code" href="classstk_1_1Filter.html#af21e11b72ea59af4585c59600a0980c2" title="Return the current filter gain.">getGain</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> gain_; };
<a name="l00046"></a>00046
<a name="l00048"></a>00048
<a name="l00053"></a>00053 StkFloat <a class="code" href="classstk_1_1Filter.html#a6453c68dca60f87053c888b3635b7220" title="Return the filter phase delay at the specified frequency.">phaseDelay</a>( StkFloat frequency );
<a name="l00054"></a>00054
<a name="l00056"></a><a class="code" href="classstk_1_1Filter.html#ab2d944f649693511dced1df249f0abe6">00056</a> <span class="keyword">const</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Filter.html#ab2d944f649693511dced1df249f0abe6" title="Return an StkFrames reference to the last output sample frame.">lastFrame</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_; };
<a name="l00057"></a>00057
<a name="l00059"></a>00059
<a name="l00067"></a>00067 <span class="keyword">virtual</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Filter.html#a3260a238824c4a748ac057b84b7d3f21" title="Take a channel of the StkFrames object as inputs to the filter and replace with corresponding...">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 ) = 0;
<a name="l00068"></a>00068
<a name="l00069"></a>00069 <span class="keyword">protected</span>:
<a name="l00070"></a>00070
<a name="l00071"></a>00071 StkFloat gain_;
<a name="l00072"></a>00072 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channelsIn_;
<a name="l00073"></a>00073 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> lastFrame_;
<a name="l00074"></a>00074
<a name="l00075"></a>00075 std::vector&lt;StkFloat&gt; b_;
<a name="l00076"></a>00076 std::vector&lt;StkFloat&gt; a_;
<a name="l00077"></a>00077 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> outputs_;
<a name="l00078"></a>00078 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> inputs_;
<a name="l00079"></a>00079
<a name="l00080"></a>00080 };
<a name="l00081"></a>00081
<a name="l00082"></a><a class="code" href="classstk_1_1Filter.html#a670b9cc23ac798d3239cb819e801363c">00082</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Filter.html#a670b9cc23ac798d3239cb819e801363c" title="Clears all internal states of the filter.">Filter :: clear</a>( <span class="keywordtype">void</span> )
<a name="l00083"></a>00083 {
<a name="l00084"></a>00084 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
<a name="l00085"></a>00085 <span class="keywordflow">for</span> ( i=0; i&lt;inputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>(); i++ )
<a name="l00086"></a>00086 inputs_[i] = 0.0;
<a name="l00087"></a>00087 <span class="keywordflow">for</span> ( i=0; i&lt;outputs_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>(); i++ )
<a name="l00088"></a>00088 outputs_[i] = 0.0;
<a name="l00089"></a>00089 <span class="keywordflow">for</span> ( i=0; i&lt;lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#a5c41aae98f77487c004085912d1f8f79" title="Returns the total number of audio samples represented by the object.">size</a>(); i++ )
<a name="l00090"></a>00090 lastFrame_[i] = 0.0;
<a name="l00091"></a>00091 }
<a name="l00092"></a>00092
<a name="l00093"></a><a class="code" href="classstk_1_1Filter.html#a6453c68dca60f87053c888b3635b7220">00093</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Filter.html#a6453c68dca60f87053c888b3635b7220" title="Return the filter phase delay at the specified frequency.">Filter :: phaseDelay</a>( StkFloat frequency )
<a name="l00094"></a>00094 {
<a name="l00095"></a>00095 <span class="keywordflow">if</span> ( frequency &lt;= 0.0 || frequency &gt; 0.5 * <a class="code" href="classstk_1_1Stk.html#a5fbe37000a611ce56075ee7d8936472d" title="Static method that returns the current STK sample rate.">Stk::sampleRate</a>() ) {
<a name="l00096"></a>00096 oStream_ &lt;&lt; <span class="stringliteral">&quot;Filter::phaseDelay: argument (&quot;</span> &lt;&lt; frequency &lt;&lt; <span class="stringliteral">&quot;) is out of range!&quot;</span>;
<a name="l00097"></a>00097 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::WARNING ); <span class="keywordflow">return</span> 0.0;
<a name="l00098"></a>00098 }
<a name="l00099"></a>00099
<a name="l00100"></a>00100 StkFloat omegaT = 2 * PI * frequency / <a class="code" href="classstk_1_1Stk.html#a5fbe37000a611ce56075ee7d8936472d" title="Static method that returns the current STK sample rate.">Stk::sampleRate</a>();
<a name="l00101"></a>00101 StkFloat real = 0.0, imag = 0.0;
<a name="l00102"></a>00102 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;b_.size(); i++ ) {
<a name="l00103"></a>00103 real += b_[i] * std::cos( i * omegaT );
<a name="l00104"></a>00104 imag -= b_[i] * std::sin( i * omegaT );
<a name="l00105"></a>00105 }
<a name="l00106"></a>00106 real *= gain_;
<a name="l00107"></a>00107 imag *= gain_;
<a name="l00108"></a>00108
<a name="l00109"></a>00109 StkFloat phase = atan2( imag, real );
<a name="l00110"></a>00110
<a name="l00111"></a>00111 real = 0.0, imag = 0.0;
<a name="l00112"></a>00112 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;a_.size(); i++ ) {
<a name="l00113"></a>00113 real += a_[i] * std::cos( i * omegaT );
<a name="l00114"></a>00114 imag -= a_[i] * std::sin( i * omegaT );
<a name="l00115"></a>00115 }
<a name="l00116"></a>00116
<a name="l00117"></a>00117 phase -= std::atan2( imag, real );
<a name="l00118"></a>00118 phase = std::fmod( -phase, 2 * PI );
<a name="l00119"></a>00119 <span class="keywordflow">return</span> phase / omegaT;
<a name="l00120"></a>00120 }
<a name="l00121"></a>00121
<a name="l00122"></a>00122 } <span class="comment">// stk namespace</span>
<a name="l00123"></a>00123
<a name="l00124"></a>00124 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

131
doc/html/Fir_8h_source.html Normal file
View File

@@ -0,0 +1,131 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Fir.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FIR_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FIR_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Filter.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00028"></a>00028 <span class="comment">/***************************************************/</span>
<a name="l00029"></a>00029
<a name="l00030"></a><a class="code" href="classstk_1_1Fir.html">00030</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Fir.html" title="STK general finite impulse response filter class.">Fir</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Filter.html" title="STK abstract filter class.">Filter</a>
<a name="l00031"></a>00031 {
<a name="l00032"></a>00032 <span class="keyword">public</span>:
<a name="l00034"></a>00034 <a class="code" href="classstk_1_1Fir.html#a4ad986b7f644d3e22e75b0744b2f948a" title="Default constructor creates a zero-order pass-through &amp;quot;filter&amp;quot;.">Fir</a>( <span class="keywordtype">void</span> );
<a name="l00035"></a>00035
<a name="l00037"></a>00037
<a name="l00041"></a>00041 <a class="code" href="classstk_1_1Fir.html#a4ad986b7f644d3e22e75b0744b2f948a" title="Default constructor creates a zero-order pass-through &amp;quot;filter&amp;quot;.">Fir</a>( std::vector&lt;StkFloat&gt; &amp;coefficients );
<a name="l00042"></a>00042
<a name="l00044"></a>00044 <a class="code" href="classstk_1_1Fir.html#a2a9db698672fcac97a77d95f3891b68f" title="Class destructor.">~Fir</a>( <span class="keywordtype">void</span> );
<a name="l00045"></a>00045
<a name="l00047"></a>00047
<a name="l00052"></a>00052 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Fir.html#aa3f72042fb8b13e9dcc31acbff4e1672" title="Set filter coefficients.">setCoefficients</a>( std::vector&lt;StkFloat&gt; &amp;coefficients, <span class="keywordtype">bool</span> clearState = <span class="keyword">false</span> );
<a name="l00053"></a>00053
<a name="l00055"></a><a class="code" href="classstk_1_1Fir.html#a5182288d564977bf172439f6ecaf2377">00055</a> StkFloat <a class="code" href="classstk_1_1Fir.html#a5182288d564977bf172439f6ecaf2377" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00056"></a>00056
<a name="l00058"></a>00058 StkFloat <a class="code" href="classstk_1_1Fir.html#afc5fd95f6bf72edaf4ee3060ca947793" title="Input one sample to the filter and return one output.">tick</a>( StkFloat input );
<a name="l00059"></a>00059
<a name="l00061"></a>00061
<a name="l00069"></a>00069 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Fir.html#afc5fd95f6bf72edaf4ee3060ca947793" title="Input one sample to the filter and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00070"></a>00070
<a name="l00072"></a>00072
<a name="l00080"></a>00080 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Fir.html#afc5fd95f6bf72edaf4ee3060ca947793" title="Input one sample to the filter and return one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> &amp;oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel = 0 );
<a name="l00081"></a>00081
<a name="l00082"></a>00082 <span class="keyword">protected</span>:
<a name="l00083"></a>00083
<a name="l00084"></a>00084 };
<a name="l00085"></a>00085
<a name="l00086"></a><a class="code" href="classstk_1_1Fir.html#afc5fd95f6bf72edaf4ee3060ca947793">00086</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Fir.html#afc5fd95f6bf72edaf4ee3060ca947793" title="Input one sample to the filter and return one output.">Fir :: tick</a>( StkFloat input )
<a name="l00087"></a>00087 {
<a name="l00088"></a>00088 lastFrame_[0] = 0.0;
<a name="l00089"></a>00089 inputs_[0] = gain_ * input;
<a name="l00090"></a>00090
<a name="l00091"></a>00091 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=b_.size()-1; i&gt;0; i-- ) {
<a name="l00092"></a>00092 lastFrame_[0] += b_[i] * inputs_[i];
<a name="l00093"></a>00093 inputs_[i] = inputs_[i-1];
<a name="l00094"></a>00094 }
<a name="l00095"></a>00095 lastFrame_[0] += b_[0] * inputs_[0];
<a name="l00096"></a>00096
<a name="l00097"></a>00097 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00098"></a>00098 }
<a name="l00099"></a>00099
<a name="l00100"></a><a class="code" href="classstk_1_1Fir.html#a602e5ce0cd93f5103796ffd50ed8c988">00100</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Fir.html#afc5fd95f6bf72edaf4ee3060ca947793" title="Input one sample to the filter and return one output.">Fir :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00101"></a>00101 {
<a name="l00102"></a>00102 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00103"></a>00103 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00104"></a>00104 oStream_ &lt;&lt; <span class="stringliteral">&quot;Fir::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00105"></a>00105 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00106"></a>00106 }
<a name="l00107"></a>00107 <span class="preprocessor">#endif</span>
<a name="l00108"></a>00108 <span class="preprocessor"></span>
<a name="l00109"></a>00109 StkFloat *samples = &amp;frames[channel];
<a name="l00110"></a>00110 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00111"></a>00111 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j=0; j&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); j++, samples += hop ) {
<a name="l00112"></a>00112 inputs_[0] = gain_ * *samples;
<a name="l00113"></a>00113 *samples = 0.0;
<a name="l00114"></a>00114
<a name="l00115"></a>00115 <span class="keywordflow">for</span> ( i=b_.size()-1; i&gt;0; i-- ) {
<a name="l00116"></a>00116 *samples += b_[i] * inputs_[i];
<a name="l00117"></a>00117 inputs_[i] = inputs_[i-1];
<a name="l00118"></a>00118 }
<a name="l00119"></a>00119 *samples += b_[0] * inputs_[0];
<a name="l00120"></a>00120 }
<a name="l00121"></a>00121
<a name="l00122"></a>00122 lastFrame_[0] = *(samples-hop);
<a name="l00123"></a>00123 <span class="keywordflow">return</span> frames;
<a name="l00124"></a>00124 }
<a name="l00125"></a>00125
<a name="l00126"></a><a class="code" href="classstk_1_1Fir.html#a53bcdfc2e9ad757d2ec549529b7a9738">00126</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Fir.html#afc5fd95f6bf72edaf4ee3060ca947793" title="Input one sample to the filter and return one output.">Fir :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel )
<a name="l00127"></a>00127 {
<a name="l00128"></a>00128 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00129"></a>00129 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( iChannel &gt;= iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() || oChannel &gt;= oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00130"></a>00130 oStream_ &lt;&lt; <span class="stringliteral">&quot;Fir::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00131"></a>00131 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00132"></a>00132 }
<a name="l00133"></a>00133 <span class="preprocessor">#endif</span>
<a name="l00134"></a>00134 <span class="preprocessor"></span>
<a name="l00135"></a>00135 StkFloat *iSamples = &amp;iFrames[iChannel];
<a name="l00136"></a>00136 StkFloat *oSamples = &amp;oFrames[oChannel];
<a name="l00137"></a>00137 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, iHop = iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(), oHop = oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00138"></a>00138 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j=0; j&lt;iFrames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); j++, iSamples += iHop, oSamples += oHop ) {
<a name="l00139"></a>00139 inputs_[0] = gain_ * *iSamples;
<a name="l00140"></a>00140 *oSamples = 0.0;
<a name="l00141"></a>00141
<a name="l00142"></a>00142 <span class="keywordflow">for</span> ( i=b_.size()-1; i&gt;0; i-- ) {
<a name="l00143"></a>00143 *oSamples += b_[i] * inputs_[i];
<a name="l00144"></a>00144 inputs_[i] = inputs_[i-1];
<a name="l00145"></a>00145 }
<a name="l00146"></a>00146 *oSamples += b_[0] * inputs_[0];
<a name="l00147"></a>00147 }
<a name="l00148"></a>00148
<a name="l00149"></a>00149 lastFrame_[0] = *(oSamples-oHop);
<a name="l00150"></a>00150 <span class="keywordflow">return</span> iFrames;
<a name="l00151"></a>00151 }
<a name="l00152"></a>00152
<a name="l00153"></a>00153 } <span class="comment">// stk namespace</span>
<a name="l00154"></a>00154
<a name="l00155"></a>00155 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,90 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>Flute.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00023"></a>00023 <span class="comment">/***************************************************/</span>
<a name="l00024"></a>00024
<a name="l00025"></a>00025 <span class="preprocessor">#ifndef STK_FLUTE_H</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define STK_FLUTE_H</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "Instrmnt.h"</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include "JetTable.h"</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include "DelayL.h"</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include "OnePole.h"</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include "PoleZero.h"</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include "Noise.h"</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include "ADSR.h"</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include "SineWave.h"</span>
<a name="l00036"></a>00036
<a name="l00037"></a><a class="code" href="classFlute.html">00037</a> <span class="keyword">class </span><a class="code" href="classFlute.html">Flute</a> : <span class="keyword">public</span> <a class="code" href="classInstrmnt.html">Instrmnt</a>
<a name="l00038"></a>00038 {
<a name="l00039"></a>00039 <span class="keyword">public</span>:
<a name="l00041"></a>00041
<a name="l00044"></a>00044 <a class="code" href="classFlute.html#a0">Flute</a>(StkFloat lowestFrequency);
<a name="l00045"></a>00045
<a name="l00047"></a>00047 <a class="code" href="classFlute.html#a1">~Flute</a>();
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <span class="keywordtype">void</span> <a class="code" href="classFlute.html#a2">clear</a>();
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classFlute.html#a3">setFrequency</a>(StkFloat frequency);
<a name="l00054"></a>00054
<a name="l00056"></a>00056 <span class="keywordtype">void</span> <a class="code" href="classFlute.html#a4">setJetReflection</a>(StkFloat coefficient);
<a name="l00057"></a>00057
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classFlute.html#a5">setEndReflection</a>(StkFloat coefficient);
<a name="l00060"></a>00060
<a name="l00062"></a>00062 <span class="keywordtype">void</span> <a class="code" href="classFlute.html#a6">setJetDelay</a>(StkFloat aRatio);
<a name="l00063"></a>00063
<a name="l00065"></a>00065 <span class="keywordtype">void</span> <a class="code" href="classFlute.html#a7">startBlowing</a>(StkFloat amplitude, StkFloat rate);
<a name="l00066"></a>00066
<a name="l00068"></a>00068 <span class="keywordtype">void</span> <a class="code" href="classFlute.html#a8">stopBlowing</a>(StkFloat rate);
<a name="l00069"></a>00069
<a name="l00071"></a>00071 <span class="keywordtype">void</span> <a class="code" href="classFlute.html#a9">noteOn</a>(StkFloat frequency, StkFloat amplitude);
<a name="l00072"></a>00072
<a name="l00074"></a>00074 <span class="keywordtype">void</span> <a class="code" href="classFlute.html#a10">noteOff</a>(StkFloat amplitude);
<a name="l00075"></a>00075
<a name="l00077"></a>00077 <span class="keywordtype">void</span> <a class="code" href="classFlute.html#a11">controlChange</a>(<span class="keywordtype">int</span> number, StkFloat value);
<a name="l00078"></a>00078
<a name="l00079"></a>00079 <span class="keyword">protected</span>:
<a name="l00080"></a>00080
<a name="l00081"></a>00081 StkFloat computeSample( <span class="keywordtype">void</span> );
<a name="l00082"></a>00082
<a name="l00083"></a>00083 <a class="code" href="classDelayL.html">DelayL</a> jetDelay_;
<a name="l00084"></a>00084 <a class="code" href="classDelayL.html">DelayL</a> boreDelay_;
<a name="l00085"></a>00085 <a class="code" href="classJetTable.html">JetTable</a> jetTable_;
<a name="l00086"></a>00086 <a class="code" href="classOnePole.html">OnePole</a> filter_;
<a name="l00087"></a>00087 <a class="code" href="classPoleZero.html">PoleZero</a> dcBlock_;
<a name="l00088"></a>00088 <a class="code" href="classNoise.html">Noise</a> noise_;
<a name="l00089"></a>00089 <a class="code" href="classADSR.html">ADSR</a> adsr_;
<a name="l00090"></a>00090 <a class="code" href="classSineWave.html">SineWave</a> vibrato_;
<a name="l00091"></a>00091 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> length_;
<a name="l00092"></a>00092 StkFloat lastFrequency_;
<a name="l00093"></a>00093 StkFloat maxPressure_;
<a name="l00094"></a>00094 StkFloat jetReflection_;
<a name="l00095"></a>00095 StkFloat endReflection_;
<a name="l00096"></a>00096 StkFloat noiseGain_;
<a name="l00097"></a>00097 StkFloat vibratoGain_;
<a name="l00098"></a>00098 StkFloat outputGain_;
<a name="l00099"></a>00099 StkFloat jetRatio_;
<a name="l00100"></a>00100
<a name="l00101"></a>00101 };
<a name="l00102"></a>00102
<a name="l00103"></a>00103 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,147 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>Flute.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FLUTE_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FLUTE_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Instrmnt.h&quot;</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include &quot;JetTable.h&quot;</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include &quot;DelayL.h&quot;</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;OnePole.h&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;PoleZero.h&quot;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &quot;Noise.h&quot;</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include &quot;ADSR.h&quot;</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &quot;SineWave.h&quot;</span>
<a name="l00012"></a>00012
<a name="l00013"></a>00013 <span class="keyword">namespace </span>stk {
<a name="l00014"></a>00014
<a name="l00015"></a>00015 <span class="comment">/***************************************************/</span>
<a name="l00037"></a>00037 <span class="comment">/***************************************************/</span>
<a name="l00038"></a>00038
<a name="l00039"></a><a class="code" href="classstk_1_1Flute.html">00039</a> <span class="keyword">class </span><a class="code" href="classstk_1_1Flute.html" title="STK flute physical model class.">Flute</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Instrmnt.html" title="STK instrument abstract base class.">Instrmnt</a>
<a name="l00040"></a>00040 {
<a name="l00041"></a>00041 <span class="keyword">public</span>:
<a name="l00043"></a>00043
<a name="l00046"></a>00046 <a class="code" href="classstk_1_1Flute.html#a9769eef3340651acc31b4997e9985e57" title="Class constructor, taking the lowest desired playing frequency.">Flute</a>( StkFloat lowestFrequency );
<a name="l00047"></a>00047
<a name="l00049"></a>00049 <a class="code" href="classstk_1_1Flute.html#a76120aedfc0bab94416917d173f8a74e" title="Class destructor.">~Flute</a>( <span class="keywordtype">void</span> );
<a name="l00050"></a>00050
<a name="l00052"></a>00052 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Flute.html#a4554fc4feffd469b83d02dd4e5471ffa" title="Reset and clear all internal state.">clear</a>( <span class="keywordtype">void</span> );
<a name="l00053"></a>00053
<a name="l00055"></a>00055 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Flute.html#aea66780681552de9d12af6bb91f297da" title="Set instrument parameters for a particular frequency.">setFrequency</a>( StkFloat frequency );
<a name="l00056"></a>00056
<a name="l00058"></a><a class="code" href="classstk_1_1Flute.html#a0732403c66b3667f5f6a8c80e90046e0">00058</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Flute.html#a0732403c66b3667f5f6a8c80e90046e0" title="Set the reflection coefficient for the jet delay (-1.0 - 1.0).">setJetReflection</a>( StkFloat coefficient ) { jetReflection_ = coefficient; };
<a name="l00059"></a>00059
<a name="l00061"></a><a class="code" href="classstk_1_1Flute.html#a7c0ef95a3170dafde08b65ee47102969">00061</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Flute.html#a7c0ef95a3170dafde08b65ee47102969" title="Set the reflection coefficient for the air column delay (-1.0 - 1.0).">setEndReflection</a>( StkFloat coefficient ) { endReflection_ = coefficient; };
<a name="l00062"></a>00062
<a name="l00064"></a>00064 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Flute.html#ad37a862df945987f91e3164813ce911b" title="Set the length of the jet delay in terms of a ratio of jet delay to air column delay...">setJetDelay</a>( StkFloat aRatio );
<a name="l00065"></a>00065
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Flute.html#a33b58e80c6ebbd5bd45f90a7a1c6a025" title="Apply breath velocity to instrument with given amplitude and rate of increase.">startBlowing</a>( StkFloat amplitude, StkFloat rate );
<a name="l00068"></a>00068
<a name="l00070"></a>00070 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Flute.html#a65b8e74b1a99bc8bada4e80ebd512058" title="Decrease breath velocity with given rate of decrease.">stopBlowing</a>( StkFloat rate );
<a name="l00071"></a>00071
<a name="l00073"></a>00073 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Flute.html#af76a46645fd6ed5d3c15dc4bcde3d928" title="Start a note with the given frequency and amplitude.">noteOn</a>( StkFloat frequency, StkFloat amplitude );
<a name="l00074"></a>00074
<a name="l00076"></a>00076 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Flute.html#ae371e0d2366ef9fae8d12898204e7b31" title="Stop a note with the given amplitude (speed of decay).">noteOff</a>( StkFloat amplitude );
<a name="l00077"></a>00077
<a name="l00079"></a>00079 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1Flute.html#a968b3799338e39df35dcf94fe7ee90a2" title="Perform the control change specified by number and value (0.0 - 128.0).">controlChange</a>( <span class="keywordtype">int</span> number, StkFloat value );
<a name="l00080"></a>00080
<a name="l00082"></a>00082 StkFloat <a class="code" href="classstk_1_1Flute.html#ab8f307f9a26ef2756ec4c0ea05f3acbe" title="Compute and return one output sample.">tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00083"></a>00083
<a name="l00085"></a>00085
<a name="l00092"></a>00092 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Flute.html#ab8f307f9a26ef2756ec4c0ea05f3acbe" title="Compute and return one output sample.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00093"></a>00093
<a name="l00094"></a>00094 <span class="keyword">protected</span>:
<a name="l00095"></a>00095
<a name="l00096"></a>00096 <a class="code" href="classstk_1_1DelayL.html" title="STK linear interpolating delay line class.">DelayL</a> jetDelay_;
<a name="l00097"></a>00097 <a class="code" href="classstk_1_1DelayL.html" title="STK linear interpolating delay line class.">DelayL</a> boreDelay_;
<a name="l00098"></a>00098 <a class="code" href="classstk_1_1JetTable.html" title="STK jet table class.">JetTable</a> jetTable_;
<a name="l00099"></a>00099 <a class="code" href="classstk_1_1OnePole.html" title="STK one-pole filter class.">OnePole</a> filter_;
<a name="l00100"></a>00100 <a class="code" href="classstk_1_1PoleZero.html" title="STK one-pole, one-zero filter class.">PoleZero</a> dcBlock_;
<a name="l00101"></a>00101 <a class="code" href="classstk_1_1Noise.html" title="STK noise generator.">Noise</a> noise_;
<a name="l00102"></a>00102 <a class="code" href="classstk_1_1ADSR.html" title="STK ADSR envelope class.">ADSR</a> adsr_;
<a name="l00103"></a>00103 <a class="code" href="classstk_1_1SineWave.html" title="STK sinusoid oscillator class.">SineWave</a> vibrato_;
<a name="l00104"></a>00104
<a name="l00105"></a>00105 StkFloat lastFrequency_;
<a name="l00106"></a>00106 StkFloat maxPressure_;
<a name="l00107"></a>00107 StkFloat jetReflection_;
<a name="l00108"></a>00108 StkFloat endReflection_;
<a name="l00109"></a>00109 StkFloat noiseGain_;
<a name="l00110"></a>00110 StkFloat vibratoGain_;
<a name="l00111"></a>00111 StkFloat outputGain_;
<a name="l00112"></a>00112 StkFloat jetRatio_;
<a name="l00113"></a>00113
<a name="l00114"></a>00114 };
<a name="l00115"></a>00115
<a name="l00116"></a><a class="code" href="classstk_1_1Flute.html#ab8f307f9a26ef2756ec4c0ea05f3acbe">00116</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1Flute.html#ab8f307f9a26ef2756ec4c0ea05f3acbe" title="Compute and return one output sample.">Flute :: tick</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> )
<a name="l00117"></a>00117 {
<a name="l00118"></a>00118 StkFloat pressureDiff;
<a name="l00119"></a>00119 StkFloat breathPressure;
<a name="l00120"></a>00120
<a name="l00121"></a>00121 <span class="comment">// Calculate the breath pressure (envelope + noise + vibrato)</span>
<a name="l00122"></a>00122 breathPressure = maxPressure_ * adsr_.<a class="code" href="classstk_1_1ADSR.html#af2c0869f86210a55f4f668172373c975" title="Compute and return one output sample.">tick</a>();
<a name="l00123"></a>00123 breathPressure += breathPressure * ( noiseGain_ * noise_.<a class="code" href="classstk_1_1Noise.html#a8ac40f69475eb744e803d557e8438a6d" title="Compute and return one output sample.">tick</a>() + vibratoGain_ * vibrato_.<a class="code" href="classstk_1_1SineWave.html#a31a55627bf8064919b5e063059260eda" title="Compute and return one output sample.">tick</a>() );
<a name="l00124"></a>00124
<a name="l00125"></a>00125 StkFloat temp = -filter_.<a class="code" href="classstk_1_1OnePole.html#a3c83b6d43f76bec06f11caa9de76881e" title="Input one sample to the filter and return one output.">tick</a>( boreDelay_.<a class="code" href="classstk_1_1DelayL.html#a16810ca38fab79276bb8ec51447623a9" title="Return the last computed output value.">lastOut</a>() );
<a name="l00126"></a>00126 temp = dcBlock_.<a class="code" href="classstk_1_1PoleZero.html#a1a29ac6f3a2b75e71693c73554599228" title="Input one sample to the filter and return one output.">tick</a>( temp ); <span class="comment">// Block DC on reflection.</span>
<a name="l00127"></a>00127
<a name="l00128"></a>00128 pressureDiff = breathPressure - (jetReflection_ * temp);
<a name="l00129"></a>00129 pressureDiff = jetDelay_.<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( pressureDiff );
<a name="l00130"></a>00130 pressureDiff = jetTable_.<a class="code" href="classstk_1_1JetTable.html#a3fb5333e6305abdeee7cd83a10ef76b6" title="Take one sample input and map to one sample of output.">tick</a>( pressureDiff ) + (endReflection_ * temp);
<a name="l00131"></a>00131 lastFrame_[0] = (StkFloat) 0.3 * boreDelay_.<a class="code" href="classstk_1_1DelayL.html#a1d01bbaf40cc20a0b70241bb8072da7f" title="Input one sample to the filter and return one output.">tick</a>( pressureDiff );
<a name="l00132"></a>00132
<a name="l00133"></a>00133 lastFrame_[0] *= outputGain_;
<a name="l00134"></a>00134 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00135"></a>00135 }
<a name="l00136"></a>00136
<a name="l00137"></a><a class="code" href="classstk_1_1Flute.html#a86640ddfacea6fd9385bc4e197fe1a28">00137</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1Flute.html#ab8f307f9a26ef2756ec4c0ea05f3acbe" title="Compute and return one output sample.">Flute :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00138"></a>00138 {
<a name="l00139"></a>00139 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nChannels = lastFrame_.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00140"></a>00140 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00141"></a>00141 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt; frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels ) {
<a name="l00142"></a>00142 oStream_ &lt;&lt; <span class="stringliteral">&quot;Flute::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00143"></a>00143 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00144"></a>00144 }
<a name="l00145"></a>00145 <span class="preprocessor">#endif</span>
<a name="l00146"></a>00146 <span class="preprocessor"></span>
<a name="l00147"></a>00147 StkFloat *samples = &amp;frames[channel];
<a name="l00148"></a>00148 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j, hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() - nChannels;
<a name="l00149"></a>00149 <span class="keywordflow">if</span> ( nChannels == 1 ) {
<a name="l00150"></a>00150 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00151"></a>00151 *samples++ = <a class="code" href="classstk_1_1Flute.html#ab8f307f9a26ef2756ec4c0ea05f3acbe" title="Compute and return one output sample.">tick</a>();
<a name="l00152"></a>00152 }
<a name="l00153"></a>00153 <span class="keywordflow">else</span> {
<a name="l00154"></a>00154 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop ) {
<a name="l00155"></a>00155 *samples++ = <a class="code" href="classstk_1_1Flute.html#ab8f307f9a26ef2756ec4c0ea05f3acbe" title="Compute and return one output sample.">tick</a>();
<a name="l00156"></a>00156 <span class="keywordflow">for</span> ( j=1; j&lt;nChannels; j++ )
<a name="l00157"></a>00157 *samples++ = lastFrame_[j];
<a name="l00158"></a>00158 }
<a name="l00159"></a>00159 }
<a name="l00160"></a>00160
<a name="l00161"></a>00161 <span class="keywordflow">return</span> frames;
<a name="l00162"></a>00162 }
<a name="l00163"></a>00163
<a name="l00164"></a>00164 } <span class="comment">// stk namespace</span>
<a name="l00165"></a>00165
<a name="l00166"></a>00166 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -1,73 +0,0 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.4.4 -->
<div class="nav">
<a class="el" href="dir_000000.html">include</a></div>
<h1>FormSwep.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************/</span>
<a name="l00013"></a>00013 <span class="comment">/***************************************************/</span>
<a name="l00014"></a>00014
<a name="l00015"></a>00015 <span class="preprocessor">#ifndef STK_FORMSWEP_H</span>
<a name="l00016"></a>00016 <span class="preprocessor"></span><span class="preprocessor">#define STK_FORMSWEP_H</span>
<a name="l00017"></a>00017 <span class="preprocessor"></span>
<a name="l00018"></a>00018 <span class="preprocessor">#include "BiQuad.h"</span>
<a name="l00019"></a>00019
<a name="l00020"></a><a class="code" href="classFormSwep.html">00020</a> <span class="keyword">class </span><a class="code" href="classFormSwep.html">FormSwep</a> : <span class="keyword">public</span> <a class="code" href="classBiQuad.html">BiQuad</a>
<a name="l00021"></a>00021 {
<a name="l00022"></a>00022 <span class="keyword">public</span>:
<a name="l00023"></a>00023
<a name="l00025"></a>00025 <a class="code" href="classFormSwep.html#a0">FormSwep</a>();
<a name="l00026"></a>00026
<a name="l00028"></a>00028 <a class="code" href="classFormSwep.html#a1">~FormSwep</a>();
<a name="l00029"></a>00029
<a name="l00031"></a>00031
<a name="l00042"></a>00042 <span class="keywordtype">void</span> <a class="code" href="classFormSwep.html#a2">setResonance</a>(StkFloat frequency, StkFloat radius);
<a name="l00043"></a>00043
<a name="l00045"></a>00045 <span class="keywordtype">void</span> <a class="code" href="classFormSwep.html#a3">setStates</a>(StkFloat frequency, StkFloat radius, StkFloat gain = 1.0);
<a name="l00046"></a>00046
<a name="l00048"></a>00048 <span class="keywordtype">void</span> <a class="code" href="classFormSwep.html#a4">setTargets</a>(StkFloat frequency, StkFloat radius, StkFloat gain = 1.0);
<a name="l00049"></a>00049
<a name="l00051"></a>00051
<a name="l00059"></a>00059 <span class="keywordtype">void</span> <a class="code" href="classFormSwep.html#a5">setSweepRate</a>(StkFloat rate);
<a name="l00060"></a>00060
<a name="l00062"></a>00062
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="classFormSwep.html#a6">setSweepTime</a>(StkFloat time);
<a name="l00068"></a>00068
<a name="l00069"></a>00069 <span class="keyword">protected</span>:
<a name="l00070"></a>00070
<a name="l00071"></a>00071 StkFloat computeSample( StkFloat input );
<a name="l00072"></a>00072
<a name="l00073"></a>00073 <span class="keywordtype">bool</span> dirty_;
<a name="l00074"></a>00074 StkFloat frequency_;
<a name="l00075"></a>00075 StkFloat radius_;
<a name="l00076"></a>00076 StkFloat startFrequency_;
<a name="l00077"></a>00077 StkFloat startRadius_;
<a name="l00078"></a>00078 StkFloat startGain_;
<a name="l00079"></a>00079 StkFloat targetFrequency_;
<a name="l00080"></a>00080 StkFloat targetRadius_;
<a name="l00081"></a>00081 StkFloat targetGain_;
<a name="l00082"></a>00082 StkFloat deltaFrequency_;
<a name="l00083"></a>00083 StkFloat deltaRadius_;
<a name="l00084"></a>00084 StkFloat deltaGain_;
<a name="l00085"></a>00085 StkFloat sweepState_;
<a name="l00086"></a>00086 StkFloat sweepRate_;
<a name="l00087"></a>00087
<a name="l00088"></a>00088 };
<a name="l00089"></a>00089
<a name="l00090"></a>00090 <span class="preprocessor">#endif</span>
</pre></div><HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2007 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

View File

@@ -0,0 +1,156 @@
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"> &nbsp; <img src="mcgill.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="faq.html">FAQ</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.6.2 -->
<div class="navpath"><a class="el" href="dir_221deb9bdff892d63ed1e409450a60d2.html">include</a>
</div>
<div class="contents">
<h1>FormSwep.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef STK_FORMSWEP_H</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define STK_FORMSWEP_H</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &quot;Filter.h&quot;</span>
<a name="l00005"></a>00005
<a name="l00006"></a>00006 <span class="keyword">namespace </span>stk {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="comment">/***************************************************/</span>
<a name="l00018"></a>00018 <span class="comment">/***************************************************/</span>
<a name="l00019"></a>00019
<a name="l00020"></a><a class="code" href="classstk_1_1FormSwep.html">00020</a> <span class="keyword">class </span><a class="code" href="classstk_1_1FormSwep.html" title="STK sweepable formant filter class.">FormSwep</a> : <span class="keyword">public</span> <a class="code" href="classstk_1_1Filter.html" title="STK abstract filter class.">Filter</a>
<a name="l00021"></a>00021 {
<a name="l00022"></a>00022 <span class="keyword">public</span>:
<a name="l00023"></a>00023
<a name="l00025"></a>00025 <a class="code" href="classstk_1_1FormSwep.html#aeb0093d5962acf4b5d582730e8c8bab9" title="Default constructor creates a second-order pass-through filter.">FormSwep</a>( <span class="keywordtype">void</span> );
<a name="l00026"></a>00026
<a name="l00028"></a>00028 <a class="code" href="classstk_1_1FormSwep.html#ac02cd2882f67e8ed9c315dfbf10b05a9" title="Class destructor.">~FormSwep</a>();
<a name="l00029"></a>00029
<a name="l00031"></a><a class="code" href="classstk_1_1FormSwep.html#a91096ebd684df25fc36a759f642b2200">00031</a> <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FormSwep.html#a91096ebd684df25fc36a759f642b2200" title="A function to enable/disable the automatic updating of class data when the STK sample...">ignoreSampleRateChange</a>( <span class="keywordtype">bool</span> ignore = <span class="keyword">true</span> ) { ignoreSampleRateChange_ = ignore; };
<a name="l00032"></a>00032
<a name="l00034"></a>00034
<a name="l00047"></a>00047 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FormSwep.html#aa6fe339cc937260c46e8c169a58d8529" title="Sets the filter coefficients for a resonance at frequency (in Hz).">setResonance</a>( StkFloat frequency, StkFloat radius );
<a name="l00048"></a>00048
<a name="l00050"></a>00050 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FormSwep.html#a3aede7b088dbe2ca98b3398a5f953ae7" title="Set both the current and target resonance parameters.">setStates</a>( StkFloat frequency, StkFloat radius, StkFloat gain = 1.0 );
<a name="l00051"></a>00051
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FormSwep.html#a2f00d2edf80fbf8f74a284c68caf07d6" title="Set target resonance parameters.">setTargets</a>( StkFloat frequency, StkFloat radius, StkFloat gain = 1.0 );
<a name="l00054"></a>00054
<a name="l00056"></a>00056
<a name="l00064"></a>00064 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FormSwep.html#a27ba31acdbe8334da1830e14872fd226" title="Set the sweep rate (between 0.0 - 1.0).">setSweepRate</a>( StkFloat rate );
<a name="l00065"></a>00065
<a name="l00067"></a>00067
<a name="l00072"></a>00072 <span class="keywordtype">void</span> <a class="code" href="classstk_1_1FormSwep.html#a242edcbe2a6f88393357b5a5ccec43e8" title="Set the sweep rate in terms of a time value in seconds.">setSweepTime</a>( StkFloat time );
<a name="l00073"></a>00073
<a name="l00075"></a><a class="code" href="classstk_1_1FormSwep.html#a3d8405c24e8539b389daf86fccfe5d70">00075</a> StkFloat <a class="code" href="classstk_1_1FormSwep.html#a3d8405c24e8539b389daf86fccfe5d70" title="Return the last computed output value.">lastOut</a>( <span class="keywordtype">void</span> )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lastFrame_[0]; };
<a name="l00076"></a>00076
<a name="l00078"></a>00078 StkFloat <a class="code" href="classstk_1_1FormSwep.html#aba0d15e1d102cb0fee0806e1bb05c774" title="Input one sample to the filter and return a reference to one output.">tick</a>( StkFloat input );
<a name="l00079"></a>00079
<a name="l00081"></a>00081
<a name="l00089"></a>00089 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1FormSwep.html#aba0d15e1d102cb0fee0806e1bb05c774" title="Input one sample to the filter and return a reference to one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel = 0 );
<a name="l00090"></a>00090
<a name="l00092"></a>00092
<a name="l00100"></a>00100 <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1FormSwep.html#aba0d15e1d102cb0fee0806e1bb05c774" title="Input one sample to the filter and return a reference to one output.">tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a> &amp;oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel = 0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel = 0 );
<a name="l00101"></a>00101
<a name="l00102"></a>00102 <span class="keyword">protected</span>:
<a name="l00103"></a>00103
<a name="l00104"></a>00104 <span class="keyword">virtual</span> <span class="keywordtype">void</span> sampleRateChanged( StkFloat newRate, StkFloat oldRate );
<a name="l00105"></a>00105
<a name="l00106"></a>00106 <span class="keywordtype">bool</span> dirty_;
<a name="l00107"></a>00107 StkFloat frequency_;
<a name="l00108"></a>00108 StkFloat radius_;
<a name="l00109"></a>00109 StkFloat startFrequency_;
<a name="l00110"></a>00110 StkFloat startRadius_;
<a name="l00111"></a>00111 StkFloat startGain_;
<a name="l00112"></a>00112 StkFloat targetFrequency_;
<a name="l00113"></a>00113 StkFloat targetRadius_;
<a name="l00114"></a>00114 StkFloat targetGain_;
<a name="l00115"></a>00115 StkFloat deltaFrequency_;
<a name="l00116"></a>00116 StkFloat deltaRadius_;
<a name="l00117"></a>00117 StkFloat deltaGain_;
<a name="l00118"></a>00118 StkFloat sweepState_;
<a name="l00119"></a>00119 StkFloat sweepRate_;
<a name="l00120"></a>00120
<a name="l00121"></a>00121 };
<a name="l00122"></a>00122
<a name="l00123"></a><a class="code" href="classstk_1_1FormSwep.html#aba0d15e1d102cb0fee0806e1bb05c774">00123</a> <span class="keyword">inline</span> StkFloat <a class="code" href="classstk_1_1FormSwep.html#aba0d15e1d102cb0fee0806e1bb05c774" title="Input one sample to the filter and return a reference to one output.">FormSwep :: tick</a>( StkFloat input )
<a name="l00124"></a>00124 {
<a name="l00125"></a>00125 <span class="keywordflow">if</span> ( dirty_ ) {
<a name="l00126"></a>00126 sweepState_ += sweepRate_;
<a name="l00127"></a>00127 <span class="keywordflow">if</span> ( sweepState_ &gt;= 1.0 ) {
<a name="l00128"></a>00128 sweepState_ = 1.0;
<a name="l00129"></a>00129 dirty_ = <span class="keyword">false</span>;
<a name="l00130"></a>00130 radius_ = targetRadius_;
<a name="l00131"></a>00131 frequency_ = targetFrequency_;
<a name="l00132"></a>00132 gain_ = targetGain_;
<a name="l00133"></a>00133 }
<a name="l00134"></a>00134 <span class="keywordflow">else</span> {
<a name="l00135"></a>00135 radius_ = startRadius_ + (deltaRadius_ * sweepState_);
<a name="l00136"></a>00136 frequency_ = startFrequency_ + (deltaFrequency_ * sweepState_);
<a name="l00137"></a>00137 gain_ = startGain_ + (deltaGain_ * sweepState_);
<a name="l00138"></a>00138 }
<a name="l00139"></a>00139 this-&gt;<a class="code" href="classstk_1_1FormSwep.html#aa6fe339cc937260c46e8c169a58d8529" title="Sets the filter coefficients for a resonance at frequency (in Hz).">setResonance</a>( frequency_, radius_ );
<a name="l00140"></a>00140 }
<a name="l00141"></a>00141
<a name="l00142"></a>00142 inputs_[0] = gain_ * input;
<a name="l00143"></a>00143 lastFrame_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
<a name="l00144"></a>00144 lastFrame_[0] -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
<a name="l00145"></a>00145 inputs_[2] = inputs_[1];
<a name="l00146"></a>00146 inputs_[1] = inputs_[0];
<a name="l00147"></a>00147 outputs_[2] = outputs_[1];
<a name="l00148"></a>00148 outputs_[1] = lastFrame_[0];
<a name="l00149"></a>00149
<a name="l00150"></a>00150 <span class="keywordflow">return</span> lastFrame_[0];
<a name="l00151"></a>00151 }
<a name="l00152"></a>00152
<a name="l00153"></a><a class="code" href="classstk_1_1FormSwep.html#a27f68dc2bb3fa41322ae49cf59cc9884">00153</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1FormSwep.html#aba0d15e1d102cb0fee0806e1bb05c774" title="Input one sample to the filter and return a reference to one output.">FormSwep :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; frames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> channel )
<a name="l00154"></a>00154 {
<a name="l00155"></a>00155 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00156"></a>00156 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( channel &gt;= frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00157"></a>00157 oStream_ &lt;&lt; <span class="stringliteral">&quot;FormSwep::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00158"></a>00158 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00159"></a>00159 }
<a name="l00160"></a>00160 <span class="preprocessor">#endif</span>
<a name="l00161"></a>00161 <span class="preprocessor"></span>
<a name="l00162"></a>00162 StkFloat *samples = &amp;frames[channel];
<a name="l00163"></a>00163 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hop = frames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00164"></a>00164 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;frames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, samples += hop )
<a name="l00165"></a>00165 *samples = <a class="code" href="classstk_1_1FormSwep.html#aba0d15e1d102cb0fee0806e1bb05c774" title="Input one sample to the filter and return a reference to one output.">tick</a>( *samples );
<a name="l00166"></a>00166
<a name="l00167"></a>00167 <span class="keywordflow">return</span> frames;
<a name="l00168"></a>00168 }
<a name="l00169"></a>00169
<a name="l00170"></a><a class="code" href="classstk_1_1FormSwep.html#a8a16af2b4e169946cedb8fec2bb1417a">00170</a> <span class="keyword">inline</span> <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; <a class="code" href="classstk_1_1FormSwep.html#aba0d15e1d102cb0fee0806e1bb05c774" title="Input one sample to the filter and return a reference to one output.">FormSwep :: tick</a>( <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; iFrames, <a class="code" href="classstk_1_1StkFrames.html" title="An STK class to handle vectorized audio data.">StkFrames</a>&amp; oFrames, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iChannel, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oChannel )
<a name="l00171"></a>00171 {
<a name="l00172"></a>00172 <span class="preprocessor">#if defined(_STK_DEBUG_)</span>
<a name="l00173"></a>00173 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( iChannel &gt;= iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() || oChannel &gt;= oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>() ) {
<a name="l00174"></a>00174 oStream_ &lt;&lt; <span class="stringliteral">&quot;FormSwep::tick(): channel and StkFrames arguments are incompatible!&quot;</span>;
<a name="l00175"></a>00175 <a class="code" href="classstk_1_1Stk.html#a48ac73a0d8ca28445ba1a054e1f061ff" title="Static function for error reporting and handling using c-strings.">handleError</a>( StkError::FUNCTION_ARGUMENT );
<a name="l00176"></a>00176 }
<a name="l00177"></a>00177 <span class="preprocessor">#endif</span>
<a name="l00178"></a>00178 <span class="preprocessor"></span>
<a name="l00179"></a>00179 StkFloat *iSamples = &amp;iFrames[iChannel];
<a name="l00180"></a>00180 StkFloat *oSamples = &amp;oFrames[oChannel];
<a name="l00181"></a>00181 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iHop = iFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>(), oHop = oFrames.<a class="code" href="classstk_1_1StkFrames.html#aec7ef9c46675a24111aa6e2fda3ba870" title="Return the number of channels represented by the data.">channels</a>();
<a name="l00182"></a>00182 <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;iFrames.<a class="code" href="classstk_1_1StkFrames.html#a05b1ab6fa750a8221a7d65c30e0cdab9" title="Return the number of sample frames represented by the data.">frames</a>(); i++, iSamples += iHop, oSamples += oHop )
<a name="l00183"></a>00183 *oSamples = <a class="code" href="classstk_1_1FormSwep.html#aba0d15e1d102cb0fee0806e1bb05c774" title="Input one sample to the filter and return a reference to one output.">tick</a>( *iSamples );
<a name="l00184"></a>00184
<a name="l00185"></a>00185 <span class="keywordflow">return</span> iFrames;
<a name="l00186"></a>00186 }
<a name="l00187"></a>00187
<a name="l00188"></a>00188 } <span class="comment">// stk namespace</span>
<a name="l00189"></a>00189
<a name="l00190"></a>00190 <span class="preprocessor">#endif</span>
</pre></div></div>
<HR>
<table>
<tr><td><A HREF="http://ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
<tr><td>&copy;1995-2012 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>
</BODY>
</HTML>

Some files were not shown because too many files have changed in this diff Show More