stk-4.5.0/0000755000076600007660000000000012327015126010137 5ustar garystk-4.5.0/.gitignore0000644000076600007660000001076612327014024012135 0ustar gary##### # OS X temporary files that should never be committed # # c.f. http://www.westwind.com/reference/os-x/invisibles.html .DS_Store # c.f. http://www.westwind.com/reference/os-x/invisibles.html .Trashes # c.f. http://www.westwind.com/reference/os-x/invisibles.html *.swp # *.lock - this is used and abused by many editors for many different things. # For the main ones I use (e.g. Eclipse), it should be excluded # from source-control, but YMMV *.lock # # profile - REMOVED temporarily (on double-checking, this seems incorrect; I can't find it in OS X docs?) #profile #### # Xcode temporary files that should never be committed # # NB: NIB/XIB files still exist even on Storyboard projects, so we want this... *~.nib #### # Xcode build files - # # NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData" DerivedData/ # NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build" build/ ##### # Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups) # # This is complicated: # # SOMETIMES you need to put this file in version control. # Apple designed it poorly - if you use "custom executables", they are # saved in this file. # 99% of projects do NOT use those, so they do NOT want to version control this file. # ..but if you're in the 1%, comment out the line "*.pbxuser" # .pbxuser: http://lists.apple.com/archives/xcode-users/2004/Jan/msg00193.html *.pbxuser # .mode1v3: http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html *.mode1v3 # .mode2v3: http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html *.mode2v3 # .perspectivev3: http://stackoverflow.com/questions/5223297/xcode-projects-what-is-a-perspectivev3-file *.perspectivev3 # NB: also, whitelist the default ones, some projects need to use these !default.pbxuser !default.mode1v3 !default.mode2v3 !default.perspectivev3 #### # Xcode 4 - semi-personal settings # # # OPTION 1: --------------------------------- # throw away ALL personal settings (including custom schemes! # - unless they are "shared") # # NB: this is exclusive with OPTION 2 below xcuserdata # OPTION 2: --------------------------------- # get rid of ALL personal settings, but KEEP SOME OF THEM # - NB: you must manually uncomment the bits you want to keep # # NB: this *requires* git v1.8.2 or above; you may need to upgrade to latest OS X, # or manually install git over the top of the OS X version # NB: this is exclusive with OPTION 1 above # #xcuserdata/**/* # (requires option 2 above): Personal Schemes # #!xcuserdata/**/xcschemes/* #### # XCode 4 workspaces - more detailed # # Workspaces are important! They are a core feature of Xcode - don't exclude them :) # # Workspace layout is quite spammy. For reference: # # /(root)/ # /(project-name).xcodeproj/ # project.pbxproj # /project.xcworkspace/ # contents.xcworkspacedata # /xcuserdata/ # /(your name)/xcuserdatad/ # UserInterfaceState.xcuserstate # /xcsshareddata/ # /xcschemes/ # (shared scheme name).xcscheme # /xcuserdata/ # /(your name)/xcuserdatad/ # (private scheme).xcscheme # xcschememanagement.plist # # #### # Xcode 4 - Deprecated classes # # Allegedly, if you manually "deprecate" your classes, they get moved here. # # We're using source-control, so this is a "feature" that we do not want! *.moved-aside #### # Files generated by automake Makefile autom4te.cache config.log config.status configure projects/demo/Makefile projects/demo/demo projects/demo/Release projects/demo/Debug projects/effects/Makefile projects/effects/effects projects/effects/Release projects/effects/Debug projects/eguitar/Makefile projects/eguitar/eguitar projects/eguitar/Release projects/eguitar/Debug projects/examples/Makefile projects/examples/audioprobe projects/examples/bethree projects/examples/controlbee projects/examples/crtsine projects/examples/duplex projects/examples/foursine projects/examples/grains projects/examples/inetIn projects/examples/inetOut projects/examples/libMakefile projects/examples/midiprobe projects/examples/play projects/examples/playsmf projects/examples/record projects/examples/rtsine projects/examples/sine projects/examples/sineosc projects/examples/threebees projects/examples/Release projects/examples/Debug projects/ragamatic/Makefile projects/ragamatic/ragamat projects/ragamatic/Release projects/ragamatic/Debug src/libstk.a src/Release src/Debug src/Makefile stk-4.5.0/autom4te.cache/0000755000076600007660000000000012327015126012743 5ustar garystk-4.5.0/autom4te.cache/output.00000644000076600007660000053246112327015126014377 0ustar gary@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.69 for STK 4.5.0. @%:@ @%:@ Report bugs to . @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: gary@music.mcgill.ca about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='STK' PACKAGE_TARNAME='stk' PACKAGE_VERSION='4.5.0' PACKAGE_STRING='STK 4.5.0' PACKAGE_BUGREPORT='gary@music.mcgill.ca' PACKAGE_URL='' ac_unique_file="src/Stk.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIB@&t@OBJS objects api libflags sharedname sharedlib host_os host_vendor host_cpu host build_os build_vendor build_cpu build debug object_path cxxflag cppflag build_shared build_static realtime sound_api include rawwaves byte_order EGREP GREP CPP ac_ct_CC CFLAGS CC AR RANLIB OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX GXX target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_realtime enable_static enable_shared enable_debug with_jack with_alsa with_oss with_core with_asio with_ds with_wasapi ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures STK 4.5.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/stk@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of STK 4.5.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-realtime = only compile generic non-realtime classes --disable-static = do not compile static library --enable-shared = compile the shared library --enable-debug = enable various debug output Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-jack = choose JACK server support (mac and linux only) --with-alsa = choose native ALSA API support (linux only) --with-oss = choose OSS API support (linux only) --with-jack = choose JACK server support (unix only) --with-core = choose CoreAudio API support (mac only) --with-asio = choose ASIO API support (windoze only) --with-ds = choose DirectSound API support (windoze only) --with-wasapi = choose Windows Audio Session API support (windoze only) Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF STK configure 4.5.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ----------------------------------- ## ## Report this to gary@music.mcgill.ca ## ## ----------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by STK $as_me 4.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in config "$srcdir"/config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_files="$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. GXX="no" # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ CC c++ cxx do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ CC c++ cxx do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_AR+:} false; then : $as_echo_n "(cached) " >&6 else case $AR in [\\/]* | ?:[\\/]*) ac_cv_path_AR="$AR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_AR" && ac_cv_path_AR="no" ;; esac fi AR=$ac_cv_path_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if [ $AR = "no" ] ; then as_fn_error $? "\"Could not find ar - needed to create a library\"" "$LINENO" 5; fi # Checks for header files. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fcntl.h sys/ioctl.h sys/time.h termio.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "@%:@define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "@%:@define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef WORDS_BIGENDIAN yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : byte_order=-D__LITTLE_ENDIAN__ fi rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RAWWAVE_PATH argument" >&5 $as_echo_n "checking for RAWWAVE_PATH argument... " >&6; } rawwaves=$RAWWAVE_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RAWWAVE_PATH" >&5 $as_echo "$RAWWAVE_PATH" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for INCLUDE_PATH argument" >&5 $as_echo_n "checking for INCLUDE_PATH argument... " >&6; } include=$INCLUDE_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INCLUDE_PATH" >&5 $as_echo "$INCLUDE_PATH" >&6; } # Check for realtime support disable { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile realtime support" >&5 $as_echo_n "checking whether to compile realtime support... " >&6; } @%:@ Check whether --enable-realtime was given. if test "${enable_realtime+set}" = set; then : enableval=$enable_realtime; realtime=$enableval fi if test "$realtime" = "no"; then sound_api= else realtime=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $realtime" >&5 $as_echo "$realtime" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the static library" >&5 $as_echo_n "checking whether to build the static library... " >&6; } @%:@ Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; build_static=$enableval else build_static=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_static" >&5 $as_echo "$build_static" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the shared library" >&5 $as_echo_n "checking whether to build the shared library... " >&6; } @%:@ Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; build_shared=$enableval else build_shared=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_shared" >&5 $as_echo "$build_shared" >&6; } if test x$build_static = xno -a x$build_shared = xno ; then as_fn_error 1 " both static and shared libraries are disabled" "$LINENO" 5 fi # Check for math library { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" else as_fn_error $? "math library is needed!" "$LINENO" 5 fi # Check for debug { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile debug version" >&5 $as_echo_n "checking whether to compile debug version... " >&6; } @%:@ Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; debug=$enableval fi if test "$debug" = "yes"; then cppflag="-D_STK_DEBUG_ -D__RTAUDIO_DEBUG__ -D__RTMIDI_DEBUG__" cxxflag="-g" object_path=Debug else debug=no cppflag= cxxflag=-O3 object_path=Release fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $debug" >&5 $as_echo "$debug" >&6; } # Checks for functions if test $realtime = yes; then for ac_func in select socket do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" if test "x$ac_cv_func_gettimeofday" = xyes; then : cppflag="$cppflag -DHAVE_GETTIMEOFDAY" fi fi # For -I and -D flags CPPFLAGS="$CPPFLAGS $cppflag" # For debugging and optimization ... overwrite default because it has both -g and -O2 CXXFLAGS="$cxxflag" # Check compiler and use -Wall if gnu. if test $GXX = "yes" ; then cxxflag=-Wall fi CXXFLAGS="$CXXFLAGS $cxxflag" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac sharedlib="libstk.so" sharedname="libstk.so.\$(RELEASE)" libflags="-shared -Wl,-soname,\$(SHAREDLIB).\$(MAJOR) -o \$(SHAREDLIB).\$(RELEASE)" case $host in *-apple*) sharedlib="libstk.dylib" sharedname="libstk.\$(RELEASE).dylib" libflags="-dynamiclib -o libstk.\$(RELEASE).dylib" esac if test $realtime = yes; then # Checks for package options and external software { $as_echo "$as_me:${as_lineno-$LINENO}: checking for audio API" >&5 $as_echo_n "checking for audio API... " >&6; } case $host in *-*-linux*) @%:@ Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; api="$api -D__UNIX_JACK__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using JACK" >&5 $as_echo "using JACK" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_client_open in -ljack" >&5 $as_echo_n "checking for jack_client_open in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_client_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_client_open (); int main () { return jack_client_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jack_jack_client_open=yes else ac_cv_lib_jack_jack_client_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_client_open" >&5 $as_echo "$ac_cv_lib_jack_jack_client_open" >&6; } if test "x$ac_cv_lib_jack_jack_client_open" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBJACK 1 _ACEOF LIBS="-ljack $LIBS" else as_fn_error $? "JACK support requires the jack library!" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_open in -lasound" >&5 $as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } if ${ac_cv_lib_asound_snd_pcm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char snd_pcm_open (); int main () { return snd_pcm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_pcm_open=yes else ac_cv_lib_asound_snd_pcm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_pcm_open" >&5 $as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } if test "x$ac_cv_lib_asound_snd_pcm_open" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else as_fn_error $? "Jack support also requires the asound library!" "$LINENO" 5 fi fi # Look for ALSA flag @%:@ Check whether --with-alsa was given. if test "${with_alsa+set}" = set; then : withval=$with_alsa; api="$api -D__LINUX_ALSA__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using ALSA" >&5 $as_echo "using ALSA" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_open in -lasound" >&5 $as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } if ${ac_cv_lib_asound_snd_pcm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char snd_pcm_open (); int main () { return snd_pcm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_pcm_open=yes else ac_cv_lib_asound_snd_pcm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_pcm_open" >&5 $as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } if test "x$ac_cv_lib_asound_snd_pcm_open" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else as_fn_error $? "ALSA support requires the asound library!" "$LINENO" 5 fi fi # Look for OSS flag @%:@ Check whether --with-oss was given. if test "${with_oss+set}" = set; then : withval=$with_oss; api="$api -D__LINUX_OSS__ -D__LINUX_ALSA__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using OSS" >&5 $as_echo "using OSS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_open in -lasound" >&5 $as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } if ${ac_cv_lib_asound_snd_pcm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char snd_pcm_open (); int main () { return snd_pcm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_pcm_open=yes else ac_cv_lib_asound_snd_pcm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_pcm_open" >&5 $as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } if test "x$ac_cv_lib_asound_snd_pcm_open" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else as_fn_error $? "OSS support requires ALSA for RtMidi!" "$LINENO" 5 fi fi # If no audio api flags specified, use ALSA if test "$api" == ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: using ALSA" >&5 $as_echo "using ALSA" >&6; } api=-D__LINUX_ALSA__ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_open in -lasound" >&5 $as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } if ${ac_cv_lib_asound_snd_pcm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char snd_pcm_open (); int main () { return snd_pcm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_pcm_open=yes else ac_cv_lib_asound_snd_pcm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_pcm_open" >&5 $as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } if test "x$ac_cv_lib_asound_snd_pcm_open" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else as_fn_error $? "ALSA support requires the asound library!" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" else as_fn_error $? "RtAudio requires the pthread library!" "$LINENO" 5 fi ;; *-apple*) @%:@ Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; api="$api -D__UNIX_JACK__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using JACK" >&5 $as_echo "using JACK" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_client_new in -ljack" >&5 $as_echo_n "checking for jack_client_new in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_client_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_client_new (); int main () { return jack_client_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jack_jack_client_new=yes else ac_cv_lib_jack_jack_client_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_client_new" >&5 $as_echo "$ac_cv_lib_jack_jack_client_new" >&6; } if test "x$ac_cv_lib_jack_jack_client_new" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBJACK 1 _ACEOF LIBS="-ljack $LIBS" else as_fn_error $? "JACK support requires the jack library!" "$LINENO" 5 fi fi # Look for Core flag @%:@ Check whether --with-core was given. if test "${with_core+set}" = set; then : withval=$with_core; api="$api -D__MACOSX_CORE__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using CoreAudio" >&5 $as_echo "using CoreAudio" >&6; } ac_fn_c_check_header_mongrel "$LINENO" "CoreAudio/CoreAudio.h" "ac_cv_header_CoreAudio_CoreAudio_h" "$ac_includes_default" if test "x$ac_cv_header_CoreAudio_CoreAudio_h" = xyes; then : else as_fn_error $? "CoreAudio header files not found!" "$LINENO" 5 fi LIBS="$LIBS -framework CoreAudio -framework CoreFoundation -framework CoreMidi" fi # If no audio api flags specified, use CoreAudio if test "$api" == ""; then api=-D__MACOSX_CORE__ { $as_echo "$as_me:${as_lineno-$LINENO}: result: using CoreAudio" >&5 $as_echo "using CoreAudio" >&6; } ac_fn_c_check_header_mongrel "$LINENO" "CoreAudio/CoreAudio.h" "ac_cv_header_CoreAudio_CoreAudio_h" "$ac_includes_default" if test "x$ac_cv_header_CoreAudio_CoreAudio_h" = xyes; then : else as_fn_error $? "CoreAudio header files not found!" "$LINENO" 5 fi LIBS="-framework CoreAudio -framework CoreFoundation -framework CoreMidi" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" else as_fn_error $? "RtAudio requires the pthread library!" "$LINENO" 5 fi ;; *-mingw32*) @%:@ Check whether --with-asio was given. if test "${with_asio+set}" = set; then : withval=$with_asio; api="$api -D__WINDOWS_ASIO__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using ASIO" >&5 $as_echo "using ASIO" >&6; } objects="asio.o asiodrivers.o asiolist.o iasiothiscallresolver.o" fi # Look for DirectSound flag @%:@ Check whether --with-ds was given. if test "${with_ds+set}" = set; then : withval=$with_ds; api="$api -D__WINDOWS_DS__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using DirectSound" >&5 $as_echo "using DirectSound" >&6; } LIBS="-ldsound $LIBS" fi # Look for WASAPI flag @%:@ Check whether --with-wasapi was given. if test "${with_wasapi+set}" = set; then : withval=$with_wasapi; api="$api -D__WINDOWS_WASAPI__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using WASAPI" >&5 $as_echo "using WASAPI" >&6; } LIBS="-luuid -lksuser $LIBS" fi # If no audio api flags specified, use DirectSound if test "$api" == ""; then api=-D__WINDOWS_DS__ { $as_echo "$as_me:${as_lineno-$LINENO}: result: using DirectSound" >&5 $as_echo "using DirectSound" >&6; } LIBS="-ldsound -lwinmm $LIBS" fi api="$api -D__WINDOWS_MM__" LIBS="-lole32 -lwinmm -lwsock32 $LIBS" ;; *) # Default case for unknown realtime systems. as_fn_error $? "Unknown system type for realtime support ... try --disable-realtime argument!" "$LINENO" 5 ;; esac CPPFLAGS="$CPPFLAGS $api" fi cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by STK $as_me 4.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ STK config.status 4.5.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "projects/demo/Makefile") CONFIG_FILES="$CONFIG_FILES projects/demo/Makefile" ;; "projects/effects/Makefile") CONFIG_FILES="$CONFIG_FILES projects/effects/Makefile" ;; "projects/ragamatic/Makefile") CONFIG_FILES="$CONFIG_FILES projects/ragamatic/Makefile" ;; "projects/examples/Makefile") CONFIG_FILES="$CONFIG_FILES projects/examples/Makefile" ;; "projects/examples/libMakefile") CONFIG_FILES="$CONFIG_FILES projects/examples/libMakefile" ;; "projects/eguitar/Makefile") CONFIG_FILES="$CONFIG_FILES projects/eguitar/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi stk-4.5.0/autom4te.cache/requests0000644000076600007660000000631012327015126014541 0ustar gary# This file was generated. # It contains the lists of macros which have been traced. # It can be safely removed. @request = ( bless( [ '0', 1, [ '/sw/share/autoconf' ], [ '/sw/share/autoconf/autoconf/autoconf.m4f', 'configure.ac' ], { '_LT_AC_TAGCONFIG' => 1, 'AM_PROG_F77_C_O' => 1, 'AC_INIT' => 1, 'm4_pattern_forbid' => 1, '_AM_COND_IF' => 1, 'AC_CANONICAL_TARGET' => 1, 'AC_SUBST' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, 'AC_FC_SRCEXT' => 1, 'AC_CANONICAL_HOST' => 1, 'AC_PROG_LIBTOOL' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AM_PATH_GUILE' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'AC_CONFIG_LINKS' => 1, 'm4_sinclude' => 1, 'LT_SUPPORTED_TAG' => 1, 'AM_MAINTAINER_MODE' => 1, 'AM_NLS' => 1, 'AC_FC_PP_DEFINE' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, 'AM_MAKEFILE_INCLUDE' => 1, '_m4_warn' => 1, 'AM_PROG_CXX_C_O' => 1, '_AM_COND_ENDIF' => 1, '_AM_MAKEFILE_INCLUDE' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AM_SILENT_RULES' => 1, 'AM_PROG_MOC' => 1, 'AC_CONFIG_FILES' => 1, 'include' => 1, 'LT_INIT' => 1, 'AM_PROG_AR' => 1, 'AM_GNU_GETTEXT' => 1, 'AC_LIBSOURCE' => 1, 'AM_PROG_FC_C_O' => 1, 'AC_CANONICAL_BUILD' => 1, 'AC_FC_FREEFORM' => 1, 'AH_OUTPUT' => 1, 'AC_FC_PP_SRCEXT' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AC_CONFIG_AUX_DIR' => 1, 'sinclude' => 1, 'AM_PROG_CC_C_O' => 1, 'm4_pattern_allow' => 1, 'AM_XGETTEXT_OPTION' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AM_CONDITIONAL' => 1, 'AC_CONFIG_HEADERS' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, 'AM_POT_TOOLS' => 1, 'm4_include' => 1, '_AM_COND_ELSE' => 1, 'AC_SUBST_TRACE' => 1 } ], 'Autom4te::Request' ) ); stk-4.5.0/autom4te.cache/traces.00000644000076600007660000006735712327015126014327 0ustar garym4trace:configure.ac:2: -1- AC_INIT([STK], [4.5.0], [gary@music.mcgill.ca], [stk]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:2: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:2: -1- AC_SUBST([SHELL]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:2: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_NAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_STRING]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_URL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.ac:2: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:2: -1- AC_SUBST([prefix], [NONE]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([prefix]) m4trace:configure.ac:2: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:2: -1- AC_SUBST([program_transform_name], [s,x,x,]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([program_transform_name]) m4trace:configure.ac:2: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:2: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([bindir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:2: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sbindir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:2: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([libexecdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:2: -1- AC_SUBST([datarootdir], ['${prefix}/share']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([datarootdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:2: -1- AC_SUBST([datadir], ['${datarootdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([datadir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:2: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sysconfdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:2: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sharedstatedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:2: -1- AC_SUBST([localstatedir], ['${prefix}/var']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([localstatedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:2: -1- AC_SUBST([includedir], ['${prefix}/include']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([includedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:2: -1- AC_SUBST([oldincludedir], ['/usr/include']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([oldincludedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:2: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], ['${datarootdir}/doc/${PACKAGE_TARNAME}'], ['${datarootdir}/doc/${PACKAGE}'])]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([docdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:2: -1- AC_SUBST([infodir], ['${datarootdir}/info']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([infodir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:2: -1- AC_SUBST([htmldir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([htmldir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:2: -1- AC_SUBST([dvidir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([dvidir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:2: -1- AC_SUBST([pdfdir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([pdfdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:2: -1- AC_SUBST([psdir], ['${docdir}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([psdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:2: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([libdir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:2: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([localedir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:2: -1- AC_SUBST([mandir], ['${datarootdir}/man']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([mandir]) m4trace:configure.ac:2: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ @%:@undef PACKAGE_NAME]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ @%:@undef PACKAGE_TARNAME]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ @%:@undef PACKAGE_VERSION]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ @%:@undef PACKAGE_STRING]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ @%:@undef PACKAGE_BUGREPORT]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ @%:@undef PACKAGE_URL]) m4trace:configure.ac:2: -1- AC_SUBST([DEFS]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.ac:2: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_C]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_C]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_N]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_N]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:2: -1- AC_SUBST([ECHO_T]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_T]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:2: -1- AC_SUBST([LIBS]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:2: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:2: -1- AC_SUBST([build_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([build_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:2: -1- AC_SUBST([host_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([host_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:2: -1- AC_SUBST([target_alias]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([target_alias]) m4trace:configure.ac:2: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:3: -1- AC_CONFIG_AUX_DIR([config]) m4trace:configure.ac:5: -1- AC_CONFIG_FILES([Makefile src/Makefile projects/demo/Makefile projects/effects/Makefile projects/ragamatic/Makefile projects/examples/Makefile projects/examples/libMakefile projects/eguitar/Makefile]) m4trace:configure.ac:8: -1- AC_SUBST([GXX], ["no" ]) m4trace:configure.ac:8: -1- AC_SUBST_TRACE([GXX]) m4trace:configure.ac:8: -1- m4_pattern_allow([^GXX$]) m4trace:configure.ac:11: -1- AC_SUBST([CXX]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.ac:11: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:11: -1- AC_SUBST([CXXFLAGS]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CXXFLAGS]) m4trace:configure.ac:11: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.ac:11: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:11: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:11: -1- AC_SUBST([LIBS]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:11: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:11: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:11: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:11: -1- AC_SUBST([CXX]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.ac:11: -1- m4_pattern_allow([^CXX$]) m4trace:configure.ac:11: -1- AC_SUBST([ac_ct_CXX]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([ac_ct_CXX]) m4trace:configure.ac:11: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.ac:11: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([EXEEXT]) m4trace:configure.ac:11: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:11: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) m4trace:configure.ac:11: -1- AC_SUBST_TRACE([OBJEXT]) m4trace:configure.ac:11: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:12: -1- AC_SUBST([RANLIB]) m4trace:configure.ac:12: -1- AC_SUBST_TRACE([RANLIB]) m4trace:configure.ac:12: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.ac:13: -1- AC_SUBST([AR]) m4trace:configure.ac:13: -1- AC_SUBST_TRACE([AR]) m4trace:configure.ac:13: -1- m4_pattern_allow([^AR$]) m4trace:configure.ac:19: -1- AC_SUBST([CC]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:19: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:19: -1- AC_SUBST([CFLAGS]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.ac:19: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:19: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:19: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:19: -1- AC_SUBST([LIBS]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:19: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:19: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:19: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:19: -1- AC_SUBST([CC]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:19: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:19: -1- AC_SUBST([CC]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:19: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:19: -1- AC_SUBST([CC]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:19: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:19: -1- AC_SUBST([CC]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:19: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:19: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.ac:19: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:19: -1- AC_SUBST([CPP]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.ac:19: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:19: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:19: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:19: -1- AC_SUBST([CPP]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.ac:19: -1- m4_pattern_allow([^CPP$]) m4trace:configure.ac:19: -1- AC_SUBST([GREP]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([GREP]) m4trace:configure.ac:19: -1- m4_pattern_allow([^GREP$]) m4trace:configure.ac:19: -1- AC_SUBST([EGREP]) m4trace:configure.ac:19: -1- AC_SUBST_TRACE([EGREP]) m4trace:configure.ac:19: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.ac:19: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.ac:19: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:19: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ @%:@undef STDC_HEADERS]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_FCNTL_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_SYS_IOCTL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_IOCTL_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_TERMIO_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_TERMIO_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_STAT_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MEMORY_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.ac:20: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:23: -1- AC_DEFINE_TRACE_LITERAL([const]) m4trace:configure.ac:23: -1- m4_pattern_allow([^const$]) m4trace:configure.ac:23: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ @%:@undef const]) m4trace:configure.ac:24: -1- AC_DEFINE_TRACE_LITERAL([size_t]) m4trace:configure.ac:24: -1- m4_pattern_allow([^size_t$]) m4trace:configure.ac:24: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if does not define. */ @%:@undef size_t]) m4trace:configure.ac:25: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME]) m4trace:configure.ac:25: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.ac:25: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both and . */ @%:@undef TIME_WITH_SYS_TIME]) m4trace:configure.ac:26: -1- AH_OUTPUT([WORDS_BIGENDIAN], [/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif]) m4trace:configure.ac:26: -1- AC_DEFINE_TRACE_LITERAL([WORDS_BIGENDIAN]) m4trace:configure.ac:26: -1- m4_pattern_allow([^WORDS_BIGENDIAN$]) m4trace:configure.ac:26: -1- AC_DEFINE_TRACE_LITERAL([AC_APPLE_UNIVERSAL_BUILD]) m4trace:configure.ac:26: -1- m4_pattern_allow([^AC_APPLE_UNIVERSAL_BUILD$]) m4trace:configure.ac:26: -1- AH_OUTPUT([AC_APPLE_UNIVERSAL_BUILD], [/* Define if building universal (internal helper macro) */ @%:@undef AC_APPLE_UNIVERSAL_BUILD]) m4trace:configure.ac:27: -1- AC_SUBST([byte_order], [-D__LITTLE_ENDIAN__ ]) m4trace:configure.ac:27: -1- AC_SUBST_TRACE([byte_order]) m4trace:configure.ac:27: -1- m4_pattern_allow([^byte_order$]) m4trace:configure.ac:34: -1- AC_SUBST([rawwaves], [$RAWWAVE_PATH ]) m4trace:configure.ac:34: -1- AC_SUBST_TRACE([rawwaves]) m4trace:configure.ac:34: -1- m4_pattern_allow([^rawwaves$]) m4trace:configure.ac:38: -1- AC_SUBST([include], [$INCLUDE_PATH ]) m4trace:configure.ac:38: -1- AC_SUBST_TRACE([include]) m4trace:configure.ac:38: -1- m4_pattern_allow([^include$]) m4trace:configure.ac:47: -1- AC_SUBST([sound_api], [ ]) m4trace:configure.ac:47: -1- AC_SUBST_TRACE([sound_api]) m4trace:configure.ac:47: -1- m4_pattern_allow([^sound_api$]) m4trace:configure.ac:49: -1- AC_SUBST([realtime], [yes ]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([realtime]) m4trace:configure.ac:49: -1- m4_pattern_allow([^realtime$]) m4trace:configure.ac:58: -1- AC_SUBST([build_static]) m4trace:configure.ac:58: -1- AC_SUBST_TRACE([build_static]) m4trace:configure.ac:58: -1- m4_pattern_allow([^build_static$]) m4trace:configure.ac:66: -1- AC_SUBST([build_shared]) m4trace:configure.ac:66: -1- AC_SUBST_TRACE([build_shared]) m4trace:configure.ac:66: -1- m4_pattern_allow([^build_shared$]) m4trace:configure.ac:74: -1- AH_OUTPUT([HAVE_LIBM], [/* Define to 1 if you have the `m\' library (-lm). */ @%:@undef HAVE_LIBM]) m4trace:configure.ac:74: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBM]) m4trace:configure.ac:74: -1- m4_pattern_allow([^HAVE_LIBM$]) m4trace:configure.ac:82: -1- AC_SUBST([cppflag], ["-D_STK_DEBUG_ -D__RTAUDIO_DEBUG__ -D__RTMIDI_DEBUG__" ]) m4trace:configure.ac:82: -1- AC_SUBST_TRACE([cppflag]) m4trace:configure.ac:82: -1- m4_pattern_allow([^cppflag$]) m4trace:configure.ac:83: -1- AC_SUBST([cxxflag], ["-g" ]) m4trace:configure.ac:83: -1- AC_SUBST_TRACE([cxxflag]) m4trace:configure.ac:83: -1- m4_pattern_allow([^cxxflag$]) m4trace:configure.ac:84: -1- AC_SUBST([object_path], [Debug ]) m4trace:configure.ac:84: -1- AC_SUBST_TRACE([object_path]) m4trace:configure.ac:84: -1- m4_pattern_allow([^object_path$]) m4trace:configure.ac:86: -1- AC_SUBST([debug], [no ]) m4trace:configure.ac:86: -1- AC_SUBST_TRACE([debug]) m4trace:configure.ac:86: -1- m4_pattern_allow([^debug$]) m4trace:configure.ac:87: -1- AC_SUBST([cppflag], [ ]) m4trace:configure.ac:87: -1- AC_SUBST_TRACE([cppflag]) m4trace:configure.ac:87: -1- m4_pattern_allow([^cppflag$]) m4trace:configure.ac:88: -1- AC_SUBST([cxxflag], [-O3 ]) m4trace:configure.ac:88: -1- AC_SUBST_TRACE([cxxflag]) m4trace:configure.ac:88: -1- m4_pattern_allow([^cxxflag$]) m4trace:configure.ac:89: -1- AC_SUBST([object_path], [Release ]) m4trace:configure.ac:89: -1- AC_SUBST_TRACE([object_path]) m4trace:configure.ac:89: -1- m4_pattern_allow([^object_path$]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SELECT], [/* Define to 1 if you have the `select\' function. */ @%:@undef HAVE_SELECT]) m4trace:configure.ac:95: -1- AH_OUTPUT([HAVE_SOCKET], [/* Define to 1 if you have the `socket\' function. */ @%:@undef HAVE_SOCKET]) m4trace:configure.ac:107: -1- AC_SUBST([cxxflag], [-Wall ]) m4trace:configure.ac:107: -1- AC_SUBST_TRACE([cxxflag]) m4trace:configure.ac:107: -1- m4_pattern_allow([^cxxflag$]) m4trace:configure.ac:112: -1- AC_CANONICAL_HOST m4trace:configure.ac:112: -1- AC_CANONICAL_BUILD m4trace:configure.ac:112: -1- AC_REQUIRE_AUX_FILE([config.sub]) m4trace:configure.ac:112: -1- AC_REQUIRE_AUX_FILE([config.guess]) m4trace:configure.ac:112: -1- AC_SUBST([build], [$ac_cv_build]) m4trace:configure.ac:112: -1- AC_SUBST_TRACE([build]) m4trace:configure.ac:112: -1- m4_pattern_allow([^build$]) m4trace:configure.ac:112: -1- AC_SUBST([build_cpu], [$[1]]) m4trace:configure.ac:112: -1- AC_SUBST_TRACE([build_cpu]) m4trace:configure.ac:112: -1- m4_pattern_allow([^build_cpu$]) m4trace:configure.ac:112: -1- AC_SUBST([build_vendor], [$[2]]) m4trace:configure.ac:112: -1- AC_SUBST_TRACE([build_vendor]) m4trace:configure.ac:112: -1- m4_pattern_allow([^build_vendor$]) m4trace:configure.ac:112: -1- AC_SUBST([build_os]) m4trace:configure.ac:112: -1- AC_SUBST_TRACE([build_os]) m4trace:configure.ac:112: -1- m4_pattern_allow([^build_os$]) m4trace:configure.ac:112: -1- AC_SUBST([host], [$ac_cv_host]) m4trace:configure.ac:112: -1- AC_SUBST_TRACE([host]) m4trace:configure.ac:112: -1- m4_pattern_allow([^host$]) m4trace:configure.ac:112: -1- AC_SUBST([host_cpu], [$[1]]) m4trace:configure.ac:112: -1- AC_SUBST_TRACE([host_cpu]) m4trace:configure.ac:112: -1- m4_pattern_allow([^host_cpu$]) m4trace:configure.ac:112: -1- AC_SUBST([host_vendor], [$[2]]) m4trace:configure.ac:112: -1- AC_SUBST_TRACE([host_vendor]) m4trace:configure.ac:112: -1- m4_pattern_allow([^host_vendor$]) m4trace:configure.ac:112: -1- AC_SUBST([host_os]) m4trace:configure.ac:112: -1- AC_SUBST_TRACE([host_os]) m4trace:configure.ac:112: -1- m4_pattern_allow([^host_os$]) m4trace:configure.ac:114: -1- AC_SUBST([sharedlib], ["libstk.so" ]) m4trace:configure.ac:114: -1- AC_SUBST_TRACE([sharedlib]) m4trace:configure.ac:114: -1- m4_pattern_allow([^sharedlib$]) m4trace:configure.ac:115: -1- AC_SUBST([sharedname], ["libstk.so.\$(RELEASE)" ]) m4trace:configure.ac:115: -1- AC_SUBST_TRACE([sharedname]) m4trace:configure.ac:115: -1- m4_pattern_allow([^sharedname$]) m4trace:configure.ac:116: -1- AC_SUBST([libflags], ["-shared -Wl,-soname,\$(SHAREDLIB).\$(MAJOR) -o \$(SHAREDLIB).\$(RELEASE)" ]) m4trace:configure.ac:116: -1- AC_SUBST_TRACE([libflags]) m4trace:configure.ac:116: -1- m4_pattern_allow([^libflags$]) m4trace:configure.ac:119: -1- AC_SUBST([sharedlib], ["libstk.dylib" ]) m4trace:configure.ac:119: -1- AC_SUBST_TRACE([sharedlib]) m4trace:configure.ac:119: -1- m4_pattern_allow([^sharedlib$]) m4trace:configure.ac:120: -1- AC_SUBST([sharedname], ["libstk.\$(RELEASE).dylib" ]) m4trace:configure.ac:120: -1- AC_SUBST_TRACE([sharedname]) m4trace:configure.ac:120: -1- m4_pattern_allow([^sharedname$]) m4trace:configure.ac:121: -1- AC_SUBST([libflags], ["-dynamiclib -o libstk.\$(RELEASE).dylib" ]) m4trace:configure.ac:121: -1- AC_SUBST_TRACE([libflags]) m4trace:configure.ac:121: -1- m4_pattern_allow([^libflags$]) m4trace:configure.ac:129: -1- AH_OUTPUT([HAVE_LIBJACK], [/* Define to 1 if you have the `jack\' library (-ljack). */ @%:@undef HAVE_LIBJACK]) m4trace:configure.ac:129: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBJACK]) m4trace:configure.ac:129: -1- m4_pattern_allow([^HAVE_LIBJACK$]) m4trace:configure.ac:129: -1- AH_OUTPUT([HAVE_LIBASOUND], [/* Define to 1 if you have the `asound\' library (-lasound). */ @%:@undef HAVE_LIBASOUND]) m4trace:configure.ac:129: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBASOUND]) m4trace:configure.ac:129: -1- m4_pattern_allow([^HAVE_LIBASOUND$]) m4trace:configure.ac:136: -1- AH_OUTPUT([HAVE_LIBASOUND], [/* Define to 1 if you have the `asound\' library (-lasound). */ @%:@undef HAVE_LIBASOUND]) m4trace:configure.ac:136: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBASOUND]) m4trace:configure.ac:136: -1- m4_pattern_allow([^HAVE_LIBASOUND$]) m4trace:configure.ac:142: -1- AH_OUTPUT([HAVE_LIBASOUND], [/* Define to 1 if you have the `asound\' library (-lasound). */ @%:@undef HAVE_LIBASOUND]) m4trace:configure.ac:142: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBASOUND]) m4trace:configure.ac:142: -1- m4_pattern_allow([^HAVE_LIBASOUND$]) m4trace:configure.ac:150: -1- AC_SUBST([api], [-D__LINUX_ALSA__ ]) m4trace:configure.ac:150: -1- AC_SUBST_TRACE([api]) m4trace:configure.ac:150: -1- m4_pattern_allow([^api$]) m4trace:configure.ac:151: -1- AH_OUTPUT([HAVE_LIBASOUND], [/* Define to 1 if you have the `asound\' library (-lasound). */ @%:@undef HAVE_LIBASOUND]) m4trace:configure.ac:151: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBASOUND]) m4trace:configure.ac:151: -1- m4_pattern_allow([^HAVE_LIBASOUND$]) m4trace:configure.ac:154: -1- AH_OUTPUT([HAVE_LIBPTHREAD], [/* Define to 1 if you have the `pthread\' library (-lpthread). */ @%:@undef HAVE_LIBPTHREAD]) m4trace:configure.ac:154: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBPTHREAD]) m4trace:configure.ac:154: -1- m4_pattern_allow([^HAVE_LIBPTHREAD$]) m4trace:configure.ac:158: -1- AH_OUTPUT([HAVE_LIBJACK], [/* Define to 1 if you have the `jack\' library (-ljack). */ @%:@undef HAVE_LIBJACK]) m4trace:configure.ac:158: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBJACK]) m4trace:configure.ac:158: -1- m4_pattern_allow([^HAVE_LIBJACK$]) m4trace:configure.ac:172: -1- AC_SUBST([api], [-D__MACOSX_CORE__ ]) m4trace:configure.ac:172: -1- AC_SUBST_TRACE([api]) m4trace:configure.ac:172: -1- m4_pattern_allow([^api$]) m4trace:configure.ac:177: -1- AC_SUBST([LIBS], ["-framework CoreAudio -framework CoreFoundation -framework CoreMidi" ]) m4trace:configure.ac:177: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:177: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:180: -1- AH_OUTPUT([HAVE_LIBPTHREAD], [/* Define to 1 if you have the `pthread\' library (-lpthread). */ @%:@undef HAVE_LIBPTHREAD]) m4trace:configure.ac:180: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBPTHREAD]) m4trace:configure.ac:180: -1- m4_pattern_allow([^HAVE_LIBPTHREAD$]) m4trace:configure.ac:184: -1- AC_SUBST([objects], ["asio.o asiodrivers.o asiolist.o iasiothiscallresolver.o" ]) m4trace:configure.ac:184: -1- AC_SUBST_TRACE([objects]) m4trace:configure.ac:184: -1- m4_pattern_allow([^objects$]) m4trace:configure.ac:203: -1- AC_SUBST([api], [-D__WINDOWS_DS__ ]) m4trace:configure.ac:203: -1- AC_SUBST_TRACE([api]) m4trace:configure.ac:203: -1- m4_pattern_allow([^api$]) m4trace:configure.ac:221: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:221: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:221: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([LTLIBOBJS]) m4trace:configure.ac:221: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:221: -1- _m4_warn([obsolete], [AC_C_BIGENDIAN should be used with AC_CONFIG_HEADERS], []) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([top_builddir]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([top_build_prefix]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([srcdir]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([abs_srcdir]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([top_srcdir]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([abs_top_srcdir]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([builddir]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([abs_builddir]) m4trace:configure.ac:221: -1- AC_SUBST_TRACE([abs_top_builddir]) stk-4.5.0/bin/0000755000076600007660000000000012327014024010703 5ustar garystk-4.5.0/bin/treesed0000755000076600007660000000707512327014024012275 0ustar gary#!/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 -tree/-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 () { $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 () { 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 () { 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 stk-4.5.0/config/0000755000076600007660000000000012327014024011400 5ustar garystk-4.5.0/config/config.guess0000755000076600007660000011461712327014024013732 0ustar gary#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. 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 # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Written by Per Bothner . # Please send patches to . # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi dummy=dummy-$$ trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int dummy(){}" > $dummy.c for c in cc gcc c89 ; do ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 if test $? = 0 ; then CC_FOR_BUILD="$c"; break fi done rm -f $dummy.c $dummy.o $dummy.rel if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 8/24/94.) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # Netbsd (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # Determine the machine/vendor (is the vendor relevant). case "${UNAME_MACHINE}" in amiga) machine=m68k-unknown ;; arm32) machine=arm-unknown ;; atari*) machine=m68k-atari ;; sun3*) machine=m68k-sun ;; mac68k) machine=m68k-apple ;; macppc) machine=powerpc-apple ;; hp3[0-9][05]) machine=m68k-hp ;; ibmrt|romp-ibm) machine=romp-ibm ;; *) machine=${UNAME_MACHINE}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE}" in i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. cat <$dummy.s .data \$Lformat: .byte 37,100,45,37,120,10,0 # "%d-%x\n" .text .globl main .align 4 .ent main main: .frame \$30,16,\$26,0 ldgp \$29,0(\$27) .prologue 1 .long 0x47e03d80 # implver \$0 lda \$2,-1 .long 0x47e20c21 # amask \$2,\$1 lda \$16,\$Lformat mov \$0,\$17 not \$1,\$18 jsr \$26,printf ldgp \$29,0(\$26) mov 0,\$16 jsr \$26,exit .end main EOF $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then case `./$dummy` in 0-0) UNAME_MACHINE="alpha" ;; 1-0) UNAME_MACHINE="alphaev5" ;; 1-1) UNAME_MACHINE="alphaev56" ;; 1-101) UNAME_MACHINE="alphapca56" ;; 2-303) UNAME_MACHINE="alphaev6" ;; 2-307) UNAME_MACHINE="alphaev67" ;; esac fi rm -f $dummy.s $dummy echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; arc64:OpenBSD:*:*) echo mips64el-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hkmips:OpenBSD:*:*) echo mips-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mips-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; atari*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; sun3*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD $dummy.c -o $dummy \ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) case "${HPUX_REV}" in 11.[0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; esac ;; esac fi ;; esac if [ "${HP_ARCH}" = "" ]; then sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi rm -f $dummy.c $dummy fi ;; esac echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; hppa*:OpenBSD:*:*) echo hppa-unknown-openbsd exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*X-MP:*:*:*) echo xmp-cray-unicos exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3D:*:*:*) echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY-2:*:*:*) echo cray2-cray-unicos exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i386-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) cat >$dummy.c < /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #ifdef __MIPSEB__ printf ("%s-unknown-linux-gnu\n", argv[1]); #endif #ifdef __MIPSEL__ printf ("%sel-unknown-linux-gnu\n", argv[1]); #endif return 0; } EOF $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy ;; ppc:Linux:*:*) # Determine Lib Version cat >$dummy.c < #if defined(__GLIBC__) extern char __libc_version[]; extern char __libc_release[]; #endif main(argc, argv) int argc; char *argv[]; { #if defined(__GLIBC__) printf("%s %s\n", __libc_version, __libc_release); #else printf("unknown\n"); #endif return 0; } EOF LIBC="" $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null if test "$?" = 0 ; then ./$dummy | grep 1\.99 > /dev/null if test "$?" = 0 ; then LIBC="libc1" ; fi fi rm -f $dummy.c $dummy echo powerpc-unknown-linux-gnu${LIBC} exit 0 ;; alpha:Linux:*:*) cat <$dummy.s .data \$Lformat: .byte 37,100,45,37,120,10,0 # "%d-%x\n" .text .globl main .align 4 .ent main main: .frame \$30,16,\$26,0 ldgp \$29,0(\$27) .prologue 1 .long 0x47e03d80 # implver \$0 lda \$2,-1 .long 0x47e20c21 # amask \$2,\$1 lda \$16,\$Lformat mov \$0,\$17 not \$1,\$18 jsr \$26,printf ldgp \$29,0(\$26) mov 0,\$16 jsr \$26,exit .end main EOF LIBC="" $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then case `./$dummy` in 0-0) UNAME_MACHINE="alpha" ;; 1-0) UNAME_MACHINE="alphaev5" ;; 1-1) UNAME_MACHINE="alphaev56" ;; 1-101) UNAME_MACHINE="alphapca56" ;; 2-303) UNAME_MACHINE="alphaev6" ;; 2-307) UNAME_MACHINE="alphaev67" ;; esac objdump --private-headers $dummy | \ grep ld.so.1 > /dev/null if test "$?" = 0 ; then LIBC="libc1" fi fi rm -f $dummy.s $dummy echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. ld_supported_emulations=`cd /; ld --help 2>&1 \ | sed -ne '/supported emulations:/!d s/[ ][ ]*/ /g s/.*supported emulations: *// s/ .*// p'` case "$ld_supported_emulations" in i*86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; elf_i*86) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; i*86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; esac # Either a pre-BFD a.out linker (linux-gnuoldld) # or one that does not give us useful --help. # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. # If ld does not provide *any* "supported emulations:" # that means it is gnuoldld. test -z "$ld_supported_emulations" && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 case "${UNAME_MACHINE}" in i*86) VENDOR=pc; ;; *) VENDOR=unknown; ;; esac # Determine whether the default compiler is a.out or elf cat >$dummy.c < #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); # else printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); # endif # else printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); # endif #else printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); #endif return 0; } EOF $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions # are messed up and put the nodename in both sysname and nodename. i*86:DYNIX/ptx:4*:*) echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:7*) # Fixed at (any) Pentium or better UNAME_MACHINE=i586 if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} fi exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) echo `uname -p`-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) if test "${UNAME_MACHINE}" = "x86pc"; then UNAME_MACHINE=pc fi echo `uname -p`-${UNAME_MACHINE}-nto-qnx exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[KW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: stk-4.5.0/config/config.sub0000644000076600007660000006571212327014024013373 0ustar gary#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. 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 # can handle that machine. It does not imply ALL GNU software can. # # 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 # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | storm-chaos* | os2-emx*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc \ | arm | arme[lb] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \ | pyramid | mn10200 | mn10300 | tron | a29k \ | 580 | i960 | h8300 \ | x86 | ppcbe | mipsbe | mipsle | shbe | shle \ | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ | hppa64 \ | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ | alphaev6[78] \ | we32k | ns16k | clipper | i370 | sh | sh[34] \ | powerpc | powerpcle \ | 1750a | dsp16xx | pdp10 | pdp11 \ | mips16 | mips64 | mipsel | mips64el \ | mips64orion | mips64orionel | mipstx39 | mipstx39el \ | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ | mips64vr5000 | miprs64vr5000el | mcore | s390 | s390x \ | sparc | sparclet | sparclite | sparc64 | sparcv9 | sparcv9b \ | v850 | c4x \ | thumb | d10v | d30v | fr30 | avr | openrisc | tic80 \ | pj | pjl | h8500) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | w65) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. # FIXME: clean up the formatting here. vax-* | tahoe-* | i*86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \ | arm-* | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ | xmp-* | ymp-* \ | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \ | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ | hppa2.0n-* | hppa64-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ | alphaev6[78]-* \ | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ | clipper-* | orion-* \ | sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ | sparc64-* | sparcv9-* | sparcv9b-* | sparc86x-* \ | mips16-* | mips64-* | mipsel-* \ | mips64el-* | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ | mipstx39-* | mipstx39el-* | mcore-* \ | f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \ | [cjt]90-* \ | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ | thumb-* | v850-* | d30v-* | tic30-* | tic80-* | c30-* | fr30-* \ | bs2000-* | tic54x-* | c54x-* | x86_64-* | pj-* | pjl-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | ymp) basic_machine=ymp-cray os=-unicos ;; cray2) basic_machine=cray2-cray os=-unicos ;; [cjt]90) basic_machine=${basic_machine}-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsel*-linux*) basic_machine=mipsel-unknown os=-linux-gnu ;; mips*-linux*) basic_machine=mips-unknown os=-linux-gnu ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon) basic_machine=i686-pc ;; pentiumii | pentium2) basic_machine=i686-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sparclite-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=t3e-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xmp) basic_machine=xmp-cray os=-unicos ;; xps | xps100) basic_machine=xps100-honeywell ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; mips) if [ x$os = x-linux-gnu ]; then basic_machine=mips-unknown else basic_machine=mips-mips fi ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4) basic_machine=sh-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; c4x*) basic_machine=c4x-none os=-coff ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -os2*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto*) os=-nto-qnx ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: stk-4.5.0/config/install.sh0000644000076600007660000000000012327014024013370 0ustar garystk-4.5.0/configure0000755000076600007660000053067312327015126012064 0ustar gary#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for STK 4.5.0. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: gary@music.mcgill.ca about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='STK' PACKAGE_TARNAME='stk' PACKAGE_VERSION='4.5.0' PACKAGE_STRING='STK 4.5.0' PACKAGE_BUGREPORT='gary@music.mcgill.ca' PACKAGE_URL='' ac_unique_file="src/Stk.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS objects api libflags sharedname sharedlib host_os host_vendor host_cpu host build_os build_vendor build_cpu build debug object_path cxxflag cppflag build_shared build_static realtime sound_api include rawwaves byte_order EGREP GREP CPP ac_ct_CC CFLAGS CC AR RANLIB OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX GXX target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_realtime enable_static enable_shared enable_debug with_jack with_alsa with_oss with_core with_asio with_ds with_wasapi ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures STK 4.5.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/stk] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of STK 4.5.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-realtime = only compile generic non-realtime classes --disable-static = do not compile static library --enable-shared = compile the shared library --enable-debug = enable various debug output Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-jack = choose JACK server support (mac and linux only) --with-alsa = choose native ALSA API support (linux only) --with-oss = choose OSS API support (linux only) --with-jack = choose JACK server support (unix only) --with-core = choose CoreAudio API support (mac only) --with-asio = choose ASIO API support (windoze only) --with-ds = choose DirectSound API support (windoze only) --with-wasapi = choose Windows Audio Session API support (windoze only) Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF STK configure 4.5.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ----------------------------------- ## ## Report this to gary@music.mcgill.ca ## ## ----------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by STK $as_me 4.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in config "$srcdir"/config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_files="$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. GXX="no" # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ CC c++ cxx do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ CC c++ cxx do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_AR+:} false; then : $as_echo_n "(cached) " >&6 else case $AR in [\\/]* | ?:[\\/]*) ac_cv_path_AR="$AR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_AR" && ac_cv_path_AR="no" ;; esac fi AR=$ac_cv_path_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if [ $AR = "no" ] ; then as_fn_error $? "\"Could not find ar - needed to create a library\"" "$LINENO" 5; fi # Checks for header files. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fcntl.h sys/ioctl.h sys/time.h termio.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef WORDS_BIGENDIAN yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : byte_order=-D__LITTLE_ENDIAN__ fi rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RAWWAVE_PATH argument" >&5 $as_echo_n "checking for RAWWAVE_PATH argument... " >&6; } rawwaves=$RAWWAVE_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RAWWAVE_PATH" >&5 $as_echo "$RAWWAVE_PATH" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for INCLUDE_PATH argument" >&5 $as_echo_n "checking for INCLUDE_PATH argument... " >&6; } include=$INCLUDE_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INCLUDE_PATH" >&5 $as_echo "$INCLUDE_PATH" >&6; } # Check for realtime support disable { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile realtime support" >&5 $as_echo_n "checking whether to compile realtime support... " >&6; } # Check whether --enable-realtime was given. if test "${enable_realtime+set}" = set; then : enableval=$enable_realtime; realtime=$enableval fi if test "$realtime" = "no"; then sound_api= else realtime=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $realtime" >&5 $as_echo "$realtime" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the static library" >&5 $as_echo_n "checking whether to build the static library... " >&6; } # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; build_static=$enableval else build_static=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_static" >&5 $as_echo "$build_static" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the shared library" >&5 $as_echo_n "checking whether to build the shared library... " >&6; } # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; build_shared=$enableval else build_shared=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_shared" >&5 $as_echo "$build_shared" >&6; } if test x$build_static = xno -a x$build_shared = xno ; then as_fn_error 1 " both static and shared libraries are disabled" "$LINENO" 5 fi # Check for math library { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" else as_fn_error $? "math library is needed!" "$LINENO" 5 fi # Check for debug { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile debug version" >&5 $as_echo_n "checking whether to compile debug version... " >&6; } # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; debug=$enableval fi if test "$debug" = "yes"; then cppflag="-D_STK_DEBUG_ -D__RTAUDIO_DEBUG__ -D__RTMIDI_DEBUG__" cxxflag="-g" object_path=Debug else debug=no cppflag= cxxflag=-O3 object_path=Release fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $debug" >&5 $as_echo "$debug" >&6; } # Checks for functions if test $realtime = yes; then for ac_func in select socket do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" if test "x$ac_cv_func_gettimeofday" = xyes; then : cppflag="$cppflag -DHAVE_GETTIMEOFDAY" fi fi # For -I and -D flags CPPFLAGS="$CPPFLAGS $cppflag" # For debugging and optimization ... overwrite default because it has both -g and -O2 CXXFLAGS="$cxxflag" # Check compiler and use -Wall if gnu. if test $GXX = "yes" ; then cxxflag=-Wall fi CXXFLAGS="$CXXFLAGS $cxxflag" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac sharedlib="libstk.so" sharedname="libstk.so.\$(RELEASE)" libflags="-shared -Wl,-soname,\$(SHAREDLIB).\$(MAJOR) -o \$(SHAREDLIB).\$(RELEASE)" case $host in *-apple*) sharedlib="libstk.dylib" sharedname="libstk.\$(RELEASE).dylib" libflags="-dynamiclib -o libstk.\$(RELEASE).dylib" esac if test $realtime = yes; then # Checks for package options and external software { $as_echo "$as_me:${as_lineno-$LINENO}: checking for audio API" >&5 $as_echo_n "checking for audio API... " >&6; } case $host in *-*-linux*) # Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; api="$api -D__UNIX_JACK__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using JACK" >&5 $as_echo "using JACK" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_client_open in -ljack" >&5 $as_echo_n "checking for jack_client_open in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_client_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_client_open (); int main () { return jack_client_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jack_jack_client_open=yes else ac_cv_lib_jack_jack_client_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_client_open" >&5 $as_echo "$ac_cv_lib_jack_jack_client_open" >&6; } if test "x$ac_cv_lib_jack_jack_client_open" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBJACK 1 _ACEOF LIBS="-ljack $LIBS" else as_fn_error $? "JACK support requires the jack library!" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_open in -lasound" >&5 $as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } if ${ac_cv_lib_asound_snd_pcm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char snd_pcm_open (); int main () { return snd_pcm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_pcm_open=yes else ac_cv_lib_asound_snd_pcm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_pcm_open" >&5 $as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } if test "x$ac_cv_lib_asound_snd_pcm_open" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else as_fn_error $? "Jack support also requires the asound library!" "$LINENO" 5 fi fi # Look for ALSA flag # Check whether --with-alsa was given. if test "${with_alsa+set}" = set; then : withval=$with_alsa; api="$api -D__LINUX_ALSA__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using ALSA" >&5 $as_echo "using ALSA" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_open in -lasound" >&5 $as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } if ${ac_cv_lib_asound_snd_pcm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char snd_pcm_open (); int main () { return snd_pcm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_pcm_open=yes else ac_cv_lib_asound_snd_pcm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_pcm_open" >&5 $as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } if test "x$ac_cv_lib_asound_snd_pcm_open" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else as_fn_error $? "ALSA support requires the asound library!" "$LINENO" 5 fi fi # Look for OSS flag # Check whether --with-oss was given. if test "${with_oss+set}" = set; then : withval=$with_oss; api="$api -D__LINUX_OSS__ -D__LINUX_ALSA__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using OSS" >&5 $as_echo "using OSS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_open in -lasound" >&5 $as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } if ${ac_cv_lib_asound_snd_pcm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char snd_pcm_open (); int main () { return snd_pcm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_pcm_open=yes else ac_cv_lib_asound_snd_pcm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_pcm_open" >&5 $as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } if test "x$ac_cv_lib_asound_snd_pcm_open" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else as_fn_error $? "OSS support requires ALSA for RtMidi!" "$LINENO" 5 fi fi # If no audio api flags specified, use ALSA if test "$api" == ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: using ALSA" >&5 $as_echo "using ALSA" >&6; } api=-D__LINUX_ALSA__ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_open in -lasound" >&5 $as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } if ${ac_cv_lib_asound_snd_pcm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char snd_pcm_open (); int main () { return snd_pcm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_pcm_open=yes else ac_cv_lib_asound_snd_pcm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_pcm_open" >&5 $as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } if test "x$ac_cv_lib_asound_snd_pcm_open" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else as_fn_error $? "ALSA support requires the asound library!" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" else as_fn_error $? "RtAudio requires the pthread library!" "$LINENO" 5 fi ;; *-apple*) # Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; api="$api -D__UNIX_JACK__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using JACK" >&5 $as_echo "using JACK" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_client_new in -ljack" >&5 $as_echo_n "checking for jack_client_new in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_client_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_client_new (); int main () { return jack_client_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jack_jack_client_new=yes else ac_cv_lib_jack_jack_client_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_client_new" >&5 $as_echo "$ac_cv_lib_jack_jack_client_new" >&6; } if test "x$ac_cv_lib_jack_jack_client_new" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBJACK 1 _ACEOF LIBS="-ljack $LIBS" else as_fn_error $? "JACK support requires the jack library!" "$LINENO" 5 fi fi # Look for Core flag # Check whether --with-core was given. if test "${with_core+set}" = set; then : withval=$with_core; api="$api -D__MACOSX_CORE__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using CoreAudio" >&5 $as_echo "using CoreAudio" >&6; } ac_fn_c_check_header_mongrel "$LINENO" "CoreAudio/CoreAudio.h" "ac_cv_header_CoreAudio_CoreAudio_h" "$ac_includes_default" if test "x$ac_cv_header_CoreAudio_CoreAudio_h" = xyes; then : else as_fn_error $? "CoreAudio header files not found!" "$LINENO" 5 fi LIBS="$LIBS -framework CoreAudio -framework CoreFoundation -framework CoreMidi" fi # If no audio api flags specified, use CoreAudio if test "$api" == ""; then api=-D__MACOSX_CORE__ { $as_echo "$as_me:${as_lineno-$LINENO}: result: using CoreAudio" >&5 $as_echo "using CoreAudio" >&6; } ac_fn_c_check_header_mongrel "$LINENO" "CoreAudio/CoreAudio.h" "ac_cv_header_CoreAudio_CoreAudio_h" "$ac_includes_default" if test "x$ac_cv_header_CoreAudio_CoreAudio_h" = xyes; then : else as_fn_error $? "CoreAudio header files not found!" "$LINENO" 5 fi LIBS="-framework CoreAudio -framework CoreFoundation -framework CoreMidi" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" else as_fn_error $? "RtAudio requires the pthread library!" "$LINENO" 5 fi ;; *-mingw32*) # Check whether --with-asio was given. if test "${with_asio+set}" = set; then : withval=$with_asio; api="$api -D__WINDOWS_ASIO__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using ASIO" >&5 $as_echo "using ASIO" >&6; } objects="asio.o asiodrivers.o asiolist.o iasiothiscallresolver.o" fi # Look for DirectSound flag # Check whether --with-ds was given. if test "${with_ds+set}" = set; then : withval=$with_ds; api="$api -D__WINDOWS_DS__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using DirectSound" >&5 $as_echo "using DirectSound" >&6; } LIBS="-ldsound $LIBS" fi # Look for WASAPI flag # Check whether --with-wasapi was given. if test "${with_wasapi+set}" = set; then : withval=$with_wasapi; api="$api -D__WINDOWS_WASAPI__" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using WASAPI" >&5 $as_echo "using WASAPI" >&6; } LIBS="-luuid -lksuser $LIBS" fi # If no audio api flags specified, use DirectSound if test "$api" == ""; then api=-D__WINDOWS_DS__ { $as_echo "$as_me:${as_lineno-$LINENO}: result: using DirectSound" >&5 $as_echo "using DirectSound" >&6; } LIBS="-ldsound -lwinmm $LIBS" fi api="$api -D__WINDOWS_MM__" LIBS="-lole32 -lwinmm -lwsock32 $LIBS" ;; *) # Default case for unknown realtime systems. as_fn_error $? "Unknown system type for realtime support ... try --disable-realtime argument!" "$LINENO" 5 ;; esac CPPFLAGS="$CPPFLAGS $api" fi cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by STK $as_me 4.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ STK config.status 4.5.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "projects/demo/Makefile") CONFIG_FILES="$CONFIG_FILES projects/demo/Makefile" ;; "projects/effects/Makefile") CONFIG_FILES="$CONFIG_FILES projects/effects/Makefile" ;; "projects/ragamatic/Makefile") CONFIG_FILES="$CONFIG_FILES projects/ragamatic/Makefile" ;; "projects/examples/Makefile") CONFIG_FILES="$CONFIG_FILES projects/examples/Makefile" ;; "projects/examples/libMakefile") CONFIG_FILES="$CONFIG_FILES projects/examples/libMakefile" ;; "projects/eguitar/Makefile") CONFIG_FILES="$CONFIG_FILES projects/eguitar/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi stk-4.5.0/configure.ac0000644000076600007660000001625312327014024012430 0ustar gary# Process this file with autoconf to produce a configure script. AC_INIT(STK, 4.5.0, gary@music.mcgill.ca, stk) AC_CONFIG_AUX_DIR(config) AC_CONFIG_SRCDIR(src/Stk.cpp) 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_CXX(g++ CC c++ 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 AC_CHECK_HEADERS(fcntl.h sys/ioctl.h sys/time.h termio.h unistd.h) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_SIZE_T AC_HEADER_TIME AC_C_BIGENDIAN AC_EGREP_CPP(yes, [#ifndef WORDS_BIGENDIAN yes #endif ], [AC_SUBST( byte_order, [-D__LITTLE_ENDIAN__] )] ) AC_MSG_CHECKING(for RAWWAVE_PATH argument) AC_SUBST( rawwaves, $RAWWAVE_PATH ) AC_MSG_RESULT($RAWWAVE_PATH) AC_MSG_CHECKING(for INCLUDE_PATH argument) AC_SUBST( include, $INCLUDE_PATH ) 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], realtime=$enableval) if test "$realtime" = "no"; then AC_SUBST( sound_api, [] ) else AC_SUBST( realtime, [yes] ) fi AC_MSG_RESULT($realtime) AC_MSG_CHECKING(whether to build the static library) AC_ARG_ENABLE(static, [ --disable-static = do not compile static library ], build_static=$enableval, build_static=yes) AC_SUBST(build_static) AC_MSG_RESULT($build_static) AC_MSG_CHECKING(whether to build the shared library) AC_ARG_ENABLE(shared, [ --enable-shared = compile the shared library ], build_shared=$enableval, build_shared=no) AC_SUBST(build_shared) AC_MSG_RESULT($build_shared) if test x$build_static = xno -a x$build_shared = xno ; then AC_MSG_ERROR([ both static and shared libraries are disabled], 1) fi # Check for math library AC_CHECK_LIB(m, cos, , AC_MSG_ERROR(math library is needed!)) # Check for debug AC_MSG_CHECKING(whether to compile debug version) AC_ARG_ENABLE(debug, [ --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 CXXFLAGS="$cxxflag" # Check compiler and use -Wall if gnu. 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_MSG_CHECKING(for audio API) case $host in *-*-linux*) 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 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)], [ 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 "$api" == "";] then AC_MSG_RESULT(using ALSA) 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(RtAudio requires the pthread library!)) ;; *-apple*) 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)], [ 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 "$api" == ""; ] then AC_SUBST( api, [-D__MACOSX_CORE__] ) AC_MSG_RESULT(using CoreAudio) AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [], [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(RtAudio requires the pthread library!)) ;; *-mingw32*) 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)], [ api="$api -D__WINDOWS_DS__" AC_MSG_RESULT(using DirectSound) LIBS="-ldsound $LIBS" ], ) # Look for WASAPI flag AC_ARG_WITH(wasapi, [ --with-wasapi = choose Windows Audio Session API support (windoze only)], [ api="$api -D__WINDOWS_WASAPI__" AC_MSG_RESULT(using WASAPI) LIBS="-luuid -lksuser $LIBS" ], ) # If no audio api flags specified, use DirectSound if [test "$api" == "";] then AC_SUBST( api, [-D__WINDOWS_DS__] ) AC_MSG_RESULT(using DirectSound) LIBS="-ldsound -lwinmm $LIBS" fi api="$api -D__WINDOWS_MM__" LIBS="-lole32 -lwinmm -lwsock32 $LIBS" ;; *) # Default case for unknown realtime systems. AC_MSG_ERROR(Unknown system type for realtime support ... try --disable-realtime argument!) ;; esac CPPFLAGS="$CPPFLAGS $api" fi AC_OUTPUT stk-4.5.0/doc/0000755000076600007660000000000012327015201010676 5ustar garystk-4.5.0/doc/doxygen/0000755000076600007660000000000012327014024012355 5ustar garystk-4.5.0/doc/doxygen/classes.txt0000644000076600007660000000050012327014024014546 0ustar gary/*! \page classes Class Documentation */stk-4.5.0/doc/doxygen/compile.txt0000644000076600007660000001730212327014024014551 0ustar gary/*! \page compile Compiling The Synthesis ToolKit can be used in a variety of ways, depending on your particular needs. Some people choose the classes they need for a particular project and copy those to their working directory. Others create Makefiles that compile project-specific class objects from common src and include directories. And still others like to compile and link to a common library of object files. STK was not designed with one particular style of use in mind. \section rtvsnonrt "Realtime" vs. "Non-Realtime" Most of the Synthesis ToolKit classes are platform independent. That means that they should compile on any reasonably current C++ compiler. The functionality needed for realtime audio and MIDI input/output, as well as realtime control message acquistion, is inherently platform and operating-system (OS) dependent. STK classes that require specific platform/OS support include RtAudio, RtWvOut, RtWvIn, RtDuplex, RtMidi, InetWvIn, InetWvOut, Socket, UdpSocket, TcpServer, TcpClient, Thread, and Mutex. These classes currently can only be compiled on Linux, Macintosh OS X, and Windows systems. Without the "realtime" classes, it is still possible to read SKINI scorefiles for control input and to read and write to/from a variety of audio file formats (WAV, SND, AIFF, MAT-file, and RAW). If compiling for a "little-endian" host processor, the __LITTLE_ENDIAN__ preprocessor definition should be provided. \section unix Unix Systems: STK compiles with realtime support on the following flavors of the Unix operating system: Linux, Irix, and Macintosh OS X. Aside from differences in compilers, audio/MIDI APIs, and host endianness, the steps necessary to compile STK programs and classes on these platforms are the same. The following table summarizes these differences.
OS: Realtime Audio/MIDI API: Preprocessor Definition: Library or Framework:
Linux ALSA __LINUX_ALSA__, __LITTLE_ENDIAN__ asound, pthread
Linux OSS (version 4.0 only, use ALSA for MIDI support) __LINUX_OSS__, __LINUX_ALSA__, __LITTLE_ENDIAN__ asound, pthread
Linux and Macintosh OS-X Jack __UNIX_JACK__, __LITTLE_ENDIAN__ asound, pthread, jack
Macintosh OS X CoreAudio __MACOSX_CORE__ pthread, CoreAudio, CoreMidi, CoreFoundation
The available C++ compilers on any of these systems can vary. One approach in using STK is to simply copy the class files needed for a particular program into a project directory. Taking the sineosc.cpp example from the previous tutorial chapter, it would be necessary to set up a directory that includes the files sineosc.cpp, the rawwave file sinewave.raw in a subdirectory called rawwaves, and the header and source files 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 sineosc.cpp 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. When working with a number of different projects that make use of ToolKit classes, the above approach can become cumbersome (especially when trying to synchronize with new STK releases). Most of the STK projects (e.g., demo, effects, ...) contain Makefiles (built by the configure script) that compile project-specific class objects from the distribution src and include directories. This approach makes it relatively easy when upgrading to a new STK release (by making path substitutions in the Makefile or by moving the projects to a similar relative path within the new STK source tree). A Makefile is provided in the projects/examples directory for compiling all the tutorial programs, as well as other example programs. To compile the sineosc.cpp program, for example, one need only type make sineosc from within the projects/examples directory. \subsection library Library Use: The STK distribution provides a Makefile that can be used on Unix systems to build a static library. After unpacking the distribution (tar -xzf stk-4.x.x.tar.gz), run the configure script by typing ./configure from the top level distribution directory (see the INSTALL file in the same directory for more information). Then from within the src directory, type make. After a successful build, you may wish to move the library (libstk.a) and the contents of the include directory to standard library and include search paths on your system. For example, the linux RPM distribution of STK puts the library in /usr/lib/ and the STK header files in /usr/include/stk/. Assuming the library is located in a standard search path and the header files are located in /usr/include/stk/, the sineosc.cpp example from the previous tutorial chapter can be compiled on a little-endian system using the GNU g++ compiler as follows: \code g++ -Wall -D__LITTLE_ENDIAN__ -I/usr/include/stk -o sineosc sineosc.cpp -lstk \endcode With the header files in a standard search path, it is possible to modify the \#include statements in the sineosc.cpp program as follows: \code #include "stk/FileLoop.h" #include "stk/FileWvOut.h" \endcode and then compile without an explicit include path argument to the compiler: \code g++ -Wall -D__LITTLE_ENDIAN__ -o sineosc sineosc.cpp -lstk \endcode \section compileWin Windows: STK has been tested on Windows platforms using the Visual .NET compiler only. It is assumed here that you're familiar with Visual C++ and its particular idiosyncrasies. STK won't compile in Visual C++ 6.0 any more. The approach when using Visual C++ is to build a project that includes the necessary ToolKit files from the distribution src and include directories. For the example program from the previous tutorial chapter, create a VC++ console application project, add the Stk, FileRead, FileWrite, WvIn, FileWvIn, FileLoop, WvOut, and FileWvOut class files, as well as sineosc.cpp, and make sure the sinewave.raw file is in the subdirectory rawwaves. For programs using any of the STK realtime classes mentioned above, it is necessary to link with the DirectSound (dsound.lib), winmm.lib, and Wsock32.lib libraries, select the multithreaded library, and provide the __LITTLE_ENDIAN__, __WINDOWS_DS__, and __WINDOWS_MM__ preprocessor definitions. For Steinberg ASIO support, use the __WINDOWS_ASIO__ preprocessor definition (and the __WINDOWS_MM__ definition for RtMidi support), include all the files in the src/asio/ directory (i.e., asio.h,cpp, asiodrivers.h,cpp, ...), and link with the winmm.lib, and Wsock32.lib libraries. [Main tutorial page]   [Next tutorial] */ stk-4.5.0/doc/doxygen/control.txt0000644000076600007660000000775312327014024014612 0ustar gary/*! \page controlin Control Input Each Synthesis ToolKit instrument exposes its relevant control parameters via public functions such as setFrequency() and controlChange(). Programmers are free to implement the control scheme of their choice in exposing those parameters to the user. A text-based control protocol called SKINI is provided with the Synthesis ToolKit. SKINI extends the MIDI protocol in incremental ways, providing a text-based messaging scheme in human-readable format and making use of floating-point numbers wherever possible. Each SKINI message consists of a message type (e.g., NoteOn, PitchBend), a time specification (absolute or delta), a channel number (scanned as a long integer), and a maximum of two subsequent message-specific field values. Knowing this, it should be relatively clear what the following SKINI "scorefile" specifies: \code NoteOn 0.000082 2 55.0 82.3 NoteOff 1.000000 2 55.0 64.0 NoteOn 0.000082 2 69.0 82.8 StringDetune 0.100000 2 10.0 StringDetune 0.100000 2 30.0 StringDetune 0.100000 2 50.0 StringDetune 0.100000 2 40.0 StringDetune 0.100000 2 22.0 StringDetune 0.100000 2 12.0 NoteOff 1.000000 2 69.0 64.0 \endcode MIDI messages are easily represented within the SKINI protocol. 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 bethree.cpp 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 A realtime control message will usually have a delta time of zero, in which case it is processed as soon as possible. Non-realtime messages, normally from a scorefile, will usually have non-zero delta times. The scheme used in this example is designed to work for both scorefile and realtime input types. When no message is available from the queue, the instrument is "ticked" for DELTA_CONTROL_TICKS and then the queue is checked again. The value of DELTA_CONTROL_TICKS roughly defines the program "control rate" in a realtime context, though multiple available messages in the queue are processed in immediate succession when their delta time values are zero. The \c processMessage() function centralizes the handling of control messages. Other control update schemes can be implemented, perhaps using a separate thread or in the \c main() function, and this function should work in any context. Assuming the program is compiled as controlbee and the SKINI scorefile bookert.ski is in the scores directory, the program can be run as: \code controlbee scores/bookert.ski \endcode 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 stk::Messager class provides stk::Messager::startStdInput(), stk::Messager::startSocketInput(), and stk::Messager::startMidiInput() functions for this purpose. [Main tutorial page]   [Next tutorial] */ stk-4.5.0/doc/doxygen/crealtime.txt0000644000076600007660000000764012327014024015072 0ustar gary/*! \page crealtime Realtime Audio (callback) An alternative scheme for audio input/output is to define a specific function in which audio computations are performed and to let the audio system call this function when more input/output data can be accepted by the hardware (referred to as a callback scheme). In this section, we show how the previous rtsine.cpp program can be modified to work in a callback scenario. There is no "single-sample" interface for this functionality. The callback function will be 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 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. \include crtsine.cpp The sinusoidal oscillator is created as before. The instantiation of RtAudio requires quite a few more parameters, including output/input device and channel specifiers, the data format, and the desired buffer length (in frames). In this example, we request a single output channel using the default output device, zero channels of input, the RtAudio data format which corresponds to an StkFloat, and the RT_BUFFER_SIZE defined in Stk.h. The \c bufferFrames argument is an API-dependent buffering parameter (see RtAudio for further information). We also provide the audio system controller with a pointer to our callback function and an optional pointer to data that will be made available in the callback. In this example, we need to pass only the pointer to the oscillator. In more complex programs, it is typically necessary to put all shared data in a struct (see the next tutorial program for an example) or make use of global variables. Our callback routine is the \c tick() function. Function arguments include pointers to the audio input and output data buffers, the buffer size (in frames), a stream time argument, a status argument to test for over/underruns, and the data pointer passed in the openStream() function (if it exists). It is necessary to cast these pointers to their corresponding data types before use. Our tick() routine simply "ticks" the oscillator for \c nBufferFrames counts and writes the result into the audio data buffer before returning. The \c main() function blocks at the std::cin.get() call until the user hits the "enter" key, after which the audio controller is shut down and program execution ends. \section callback Blocking vs. Callbacks Prior to version 4.2.0, all STK example projects and programs used blocking audio input/output functionality (typically with the RtWvIn, RtWvOut, or RtDuplex classes). In many instances, a blocking scheme results in a clearer and more straight-forward program structure. Within a graphical user interface (GUI) programming context, however, callback routines are often more natural. In order to allow all STK programs to function with equal proficiency on all supported computer platforms, a decision was made to modify the example projects to use audio callback routines. The result is a more complicated code structure, which is unfortunate given that we generally strive to make STK code as clear as possible for educational purposes. This was especially an issue with the demo program because it is designed to function in both realtime and non-realtime contexts. The use of global variables has been avoided by defining data structures to hold all variables that must be accessible to the callback routine and other functions. Alternative schemes for making control updates could be designed depending on particular program needs and constraints. [Main tutorial page]   [Next tutorial] */ stk-4.5.0/doc/doxygen/download.txt0000644000076600007660000004234512327014024014735 0ustar gary/*! \page download Download, Release Notes, and Bug Fixes \section down Download Version 4.5.0 (26 April 2014): \section notes Release Notes: \subsection v4dot5dot0 Version 4.5.0
  • Updated versions of RtAudio and RtMidi, with associated renaming of RtError class to either RtAudioError or RtMidiError
  • New iOS project files (thanks to Ariel Elkin)
  • Bug fix in FreeVerb that could cause crackling for stereo input
  • Various bug fixes and updates to minimize compiler warnings
  • ADSR fix for decay/release time calculations
  • Various updates to build system
\subsection v4dot4dot4 Version 4.4.4
  • New FreeVerb class (thanks to Greg Burlet)
  • New Guitar class
  • New electric guitar project
  • Updated versions of RtAudio and RtMidi
  • Cleaned / revised Shakers class
  • Bug fix in LentPitShift
  • Bug fix in Echo constructor
  • Bug fix in FileWvIn (file size when chunking)
  • Bug fix in StkFrames copy constructor
\subsection v4dot4dot3 Version 4.4.3
  • 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.
  • Bug fixes in ADSR and Envelope classes.
  • 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.
\subsection v4dot4dot2 Version 4.4.2
  • Added various header file includes for newer compilers.
  • Updates to RtAudio and RtMidi.
  • New LentPitShift class (thanks to Francois Germain).
  • Bug fixes in Voicer class (thanks Richard Dobson!).
  • Added Makefile.in to compile library and all projects, as well as clean and distclean.
\subsection v4dot4dot1 Version 4.4.1
  • 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.
\subsection v4dot4dot0 Version 4.4.0
  • 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).
\subsection v4dot3dot1 Version 4.3.1
  • Further headerless file support in FileRead.
  • Bug fix in RtWvOut.cpp.
  • Added configure support for MinGW.
  • Updates to RtAudio and RtMidi for MinGW.
  • Changes to channel assignment in demo.cpp.
\subsection v4dot3dot0 Version 4.3.0
  • 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.
  • Fixes in BlitSquare for frequency, harmonics, and dc offset.
  • Updates to Makefiles for non-realtime compile.
  • Fix in demo.cpp for voice channel assignment.
  • Updated versions of RtMidi and RtAudio.
  • Updated ASIO files for MinGW compiler.
  • New FAQ in documentation.
  • MAT-file bug fix in FileRead class.
\subsection v4dot2dot1 Version 4.2.1
  • Greatly expanded StkFrames functionality (including interpolation and indexing by channel/frame).
  • New Blit, BlitSaw, and BlitSquare bandlimited waveform classes (thanks to Robin Davies!).
  • New Granulate granular synthesis class.
  • Removed Table class ... all functionality (including interpolation) now in StkFrames and FileRead classes.
  • Revised Socket class (now abstract) and added TcpServer, TcpClient, and UdpSocket subclasses.
  • Added Stk::showWarnings() and Stk::printErrors() functions to dis/enable warning and error printouts.
  • Extracted file I/O functionality to FileRead and FileWrite classes.
  • Revised WvIn / WvOut class structure (WvIn / WvOut now abstract and file I/O functionality in new FileWvIn / FileWvOut subclasses).
  • New SineWave class which calculates its own static table of variable length (no rawwave dependency).
  • New sinewave.raw file of length 1024 samples (used to be 256).
  • TcpWvIn and TcpWvOut renamed InetWvIn and InetWvOut, with added support for UDP sockets.
  • Fixed bug in WvOut tickFrame( const StkFrames &frames ) function.
  • Fixed bug in demo.cpp when writing output soundfiles without realtime output.
  • Added "binary" open flag to MidiFileIn class for Windows.
  • Fixed oversized MAT-file header in WvOut.cpp
  • Fixed case statement bug in MidiFileIn.cpp for sysex.
  • Added missing getDelay() function to DelayA.cpp.
  • Fixed modDepth omission in Chorus.cpp.
  • Fixed DC blocker initialization bug in Flute.cpp.
  • Changed Filter class behavior so no default clearing of state when changing coefficients.
  • Fixes to RtAudio, especially for Windows DirectSound and ASIO (thanks to Robin Davies).
\subsection v4dot2dot0 Version 4.2.0
  • Simultaneous multiple audio APIs supported at compile time.
  • Various changes to better conform to standard C++ programming practices.
  • Fixed hidden overloaded virtual functions.
  • New Asymp exponential envelope class.
  • MY_FLOAT type converted to StkFloat and changed throughout (use \c treesed utility to search/replace in old files).
  • Most example programs rewritten to use an audio callback paradigm (which works better in OS-X).
  • New StkFrames class for vectorized multichannel data and associated new tick() functions making use of StkFrames.
  • New RtMidi class with MIDI output capabilities (API changes).
  • New MidiFileIn class for reading MIDI files.
  • Revised Filter classes to use std::vectors for coefficients (API changes).
  • Revised Messager class (API changes).
  • New abstract parent Effect class for various effects.
  • New abstract parent Generator class for various signal sources.
  • New abstract parent Function class for tables and various non-linear functions.
  • Skini class completely rewritten (simplified) using the C++ STL (API changes).
  • WvOut classes now clip to -1.0 to +1.0 and report out of range.
  • New Mutex class.
  • Turned Nagle algorithm off by default in Socket class.
  • Error reporting standardized in all classes.
\subsection v4dot1dot3 Version 4.1.3
  • Bug fix in RtAudio for Windows DirectSound output only support
\subsection v4dot1dot2 Version 4.1.2
  • Added Linux JACK support to RtAudio.
  • Added optional doNormalize argument to WvIn to allow specification of data normalization or not.
  • Added volume control to demo program and various tcl scripts.
  • Added support for dynamic rawwavePath() setting.
  • WaveLoop bug fix.
  • Fixed bug in ADSR::setReleaseTime() method.
  • Fixed missing initialization of apInput in non-default constructor of DelayA class.
  • Added time seeding of random number generator to Noise constructor.
  • Update to the contentsAt() method of Delay class.
  • WAV file fixes (8-bit) in WvIn and WvOut classes.
  • Configure script changes.
  • Updated \ include statements and appended "std::" as necessary throughout for compatibility with gcc 3.
\subsection v4dot1dot1 Version 4.1.1
  • Bug fix in RtAudio for Macintosh OS X and Windows ASIO duplex operation.
  • Windows ASIO fix in Stk.h.
  • Documentation updates.
  • Expanded tutorial.
  • Fixed RtDuplex omission in src Makefile.
\subsection v4dot1 Version 4.1
  • Macintosh OS X support added.
  • New Whistle class.
  • Added Voicer, SingWave, and VoicForm classes.
  • Improvements/fixes to the banded waveguide instruments.
  • Demo program now uses Voicer, allowing polyphony.
  • Demo tcl/tk scripts changed to use SKINI PitchChange instead of PitchBend.
  • Demo program response to PitchBend modified to octave up/down.
  • Several RtAudio fixes and improvements (OS X and Windows ASIO support added).
  • Added nextOut() method to Delay classes.
  • Documentation fixes for Reverb classes.
  • RAWWAVE_PATH changed to include the "rawwave" directory.
  • "configure" support added for unix systems.
  • Multivoice flag (-n NUMBER) added as command line option to demo program.
  • Sample rate flag added as command line option to example programs.
  • Socket port number added as command line option to example programs.
\subsection v4 Version 4.0
  • New documentation and tutorial.
  • Several new instruments, including Saxofony, BlowBotl, and StifKarp.
  • New Stk base class, replacing Object class.
  • New Filter class structure and methods.
  • Extensive modifications to WvIn and WvOut class structures and methods.
  • Looping functionality moved to WaveLoop (subclass of WvIn).
  • Automatic file type detection in WvIn ... hosed WavWvIn, AifWvIn, RawWavIn, SndWavIn, and MatWvIn subclasses.
  • New file type specifier argument in WvOut ... hosed WavWvOut, AifWvOut, RawWavOut, SndWavOut, and MatWvOut subclasses.
  • Some simplifications of Messager class (was Controller).
  • New independent RtAudio class.
  • Extensive revisions in code and a significant number of API changes.
\subsection v3dot2 Version 3.2
  • New input control handling class (Controller)
  • Added AIFF file input/output support.
  • New C++ error handling capabilities.
  • New input/output internet streaming support (StrmWvIn/StrmWvOut).
  • Added native ALSA support for linux.
  • Added optional "device" argument to all "Rt" classes (audio and MIDI) and printout of devices when argument is invalid.
  • WvIn classes rewritten to support very big files (incremental load from disk).
  • Changed WvIn/WvOut classes to work with sample frame buffers.
  • Fixed looping and negative rate calculations in WvIn classes.
  • Fixed interpolation bug in RtWvIn.
  • Windoze RtAudio code rewritten (thank Dave!).
  • Simplified byte-swapping functions (in-place swapping).
  • "Stereo-ized" RagaMatic.
  • Miscellaneous renamings.
  • Probably a bunch more fixes that I've long since forgotten about.
\subsection v3dot1 Version 3.1
  • New RagaMatic project ... very cool!!!
  • Less clipping in the Shakers class.
  • Added "microphone position" to Mandolin in STKdemo.
  • Fixed MIDI system message exclusion under Irix.
  • Added a few bitmaps for the Shaker instruments.
  • Made destructors virtual for Reverb.h, WvIn.h and Simple.h.
  • Fixed bug setting delay length in DLineA when value too big.
  • Fixed bug in WinMM realtime code (RTSoundIO).
  • Added tick() method to BowTabl, JetTabl, and ReedTabl (same as lookup).
  • Switched to pthread API on SGI platforms.
  • Added some defines to Object.h for random number generation, FPU overflow checking, etc....
  • A few minor changes, some bug fixes ... can't remember all of them.
\subsection v3 Version 3.0
  • New #define flags for OS and realtime dependencies (this will probably cause problems for old personal STK code, but it was necessary to make future ports easier).
  • Expanded and cleaned the Shakers class.
  • New BowedBar algorithm/class.
  • Fixed Linux MIDI input bug.
  • Fixed MIDI status masking problem in Windows.
  • OS type defines now in Makefile.
  • New RAWWAVE_PATH define in Object.h.
  • Syntmono project pulled out to separate directory and cleaned up.
  • Socketing capabilities under Unix, as well as Windoze.
  • Multiple simultaneous socket client connections to STK servers now possible.
  • MD2SKINI now can merge MIDI and piped messages under Irix and Linux (for TCL->MD2SKINI->syntmono control).
  • Defined INT16 and INT32 types and fixed various WvIn and WvOut classes.
  • Updated MatWvIn and MatWvOut for new MAT-file documentation from Matlab.
  • New demo Tcl/Tk GUI (TclDemo.tcl).
  • Minor fixes to FM behavior.
  • Added record/duplex capabilities to RTSoundIO (Linux, SGI, and Windoze).
  • Fixed bugs in WavWvOut and MatWvOut header specifications.
  • Added RawWvOut class.
  • New WvIn class with RawWvIn, SndWvIn, WavWvIn, MatWvIn, and RTWvIn subclasses.
  • Removed RawWave, RawShot, RawInterp, and RawLoop classes (supplanted by RawWvIn).
  • Multi-channel data support in WvIn and WvOut classes using MY_MULTI data type (pointer to StkFloat) and the methods mtick() and mlastOutput().
  • Now writing to primary buffer under Windoze when allowed by hardware.
  • Cleaned up Object.h a bit.
  • Pulled various utility and thread functions out of syntmono.cpp (to aid readability of the code).
\subsection v2dot02 Version 2.02
  • Created RawWave abstract class, with subclasses of RawLoop (looping rawwave oscillator), RawShot (non-looping, non-interpolating rawwave player ... used to be RawWvIn), and RawInterp (looping or non-looping, interpolating rawwave player ... used to be RawWave).
  • Modified DrumSynt to correctly handle sample rates different than 22050 Hz.
  • Modified syntmono parsing vs. tick routine so that some ticking occurs between each message. When multiple messages are waiting to be processed, the time between message updates is inversely proportional to the number of messages in the buffer.
  • Fixed DirectSound playback bug in WinXX distribution. Sound was being played at 8-bit, 22 kHz in all cases. Playback is now 16-bit and dependent on SRATE.
  • Fixed bug in MD2SKINI which prevented some NoteOff statements from being output.
  • This distribution includes an example STK project, mus151, which demonstrates a means for keeping a user's personal projects separate from the main distribution. This is highly recommended, in order to simplify upgrades to future STK releases.
\subsection v2 Version 2
  • Unification of the capabilities of STK across the various platforms. All of the previous SGI functionality has been ported to Linux and Windows, including realtime sound output and MIDI input.
  • MIDI input (with optional time-stamping) supported on SGI, Linux (OSS device drivers only), and Windows operating systems. Time stamping under IRIX and Windows is quantized to milliseconds and under Linux to hundredths of a second.
  • Various Sound Output Options - .wav, .snd, and .mat (Matlab MAT-file) soundfile outputs are supported on all operating systems. I hacked out the MAT-file structure, so you don't have to include any platform-specific libraries. Realtime sound output is provided as well, except under NeXTStep.
  • Multiple Reverberator Implementations - Reverb subclasses of JCRev and NRev (popular reverberator implementations from CCRMA) have been written. Perry's original reverb implementation still exists as PRCRev. All reverberators now take a T60 initializer argument.
  • MD2SKINI - A program which parses a MIDI input stream and spits out SKINI code. The output of MD2SKINI is typically piped into an STK instrument executable (eg. MD2SKINI | syntmono Clarinet -r -i). In addition, you can supply a filename argument to MD2SKINI and have it simultaneously record a SKINI score file for future reuse.
  • Modifications to Object.h for OS_TYPE compilation dependencies. Makefile automatically determines OS_TYPE when invoked (if you have the GNU makefile utilities installed on your system).
  • A single distribution for all platforms. The Unix and Windows versions have been merged into a single set of classes. Makefiles and Visual C++ workspace/project files are provided for compiling.
*/ stk-4.5.0/doc/doxygen/Doxyfile0000644000076600007660000020137012327014024014066 0ustar gary# Doxyfile 1.6.2 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = STK # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 4.5.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = ../html/ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 9 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set # FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = YES # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = YES # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = . \ ../../include # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.txt \ *.msg \ *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = ../../src/asio # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = ../../projects/examples # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = YES # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = ../html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = header.html # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = NO # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = YES # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = NO # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = letter # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = header.tex # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = NO # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = /sw/bin # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES stk-4.5.0/doc/doxygen/faq.txt0000644000076600007660000001073212327014024013670 0ustar gary/*! \page faq Frequently Asked Questions - \ref license - \ref filerate - \ref endianness - \ref xwindows \section license Does STK have a license? Yes, we finally made something official for release 4.3.0. It is listed in the Stk class and a few other places in the distribution, but I'll repeat it here for clarity: \verbatim 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. 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. STK WWW site: http://ccrma.stanford.edu/software/stk/ The Synthesis ToolKit in C++ (STK) Copyright (c) 1995--2014 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 "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \endverbatim \section filerate Why is my file sample rate wrong? When the FileWvIn class loads a soundfile, it automatically sets its internal read increment based on the soundfile rate and the current STK sample rate. For example, if the current STK sample rate is 44100 Hz and the soundfile rate is 22050 Hz, the read increment, or rate, will be set to 0.5 and the file will be interpolated so that is sounds correct at 44100 Hz. For most cases, this works fine. However, consider the following example: \code FileWvIn input( "infile" ); // read an input soundfile StkFloat sampleRate = input.getFileRate(); Stk::setSampleRate( sampleRate ); // set a new STK sample rate based on the file rate \endcode 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 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 __LITTLE_ENDIAN__ 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 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" \endcode Simply start your X server and then try the command again. */ stk-4.5.0/doc/doxygen/filtering.txt0000644000076600007660000000742112327014024015105 0ustar gary/*! \page filtering Using Filters 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 "Iir.h" using namespace stk; int main() { StkFrames output( 20, 1 ); // initialize StkFrames to 20 frames and 1 channel (default: interleaved) output[0] = 1.0; std::vector numerator( 5, 0.1 ); // create and initialize numerator coefficients std::vector denominator; // create empty denominator coefficients denominator.push_back( 1.0 ); // populate our denomintor values denominator.push_back( 0.3 ); denominator.push_back( -0.5 ); Iir filter( numerator, denominator ); filter.tick( output ); for ( unsigned int i=0; ivector, a container object provided by the C++ Standard Library. 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 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() { StkFrames output( 20, 1 ); // initialize StkFrames to 20 frames and 1 channel (default: interleaved) Noise noise; BiQuad biquad; biquad.setResonance( 440.0, 0.98, true ); // automatically normalize for unity peak gain for ( unsigned int i=0; iMain tutorial page]   [Next tutorial] */ stk-4.5.0/doc/doxygen/footer.html0000644000076600007660000000037112327014024014542 0ustar gary
The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/doxygen/fundamentals.txt0000644000076600007660000001047512327014024015606 0ustar gary/*! \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. Starting with STK version 4.4, all STK classes except RtAudio and RtMidi are defined within the stk namespace. \section Signal Computations: Audio and control signals throughout STK use a floating-point data type, StkFloat, 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 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 (StkFloat) values in the range -1.0 to +1.0: \code #include "Noise.h" using namespace stk; int main() { StkFloat output; Noise noise; for ( unsigned int i=0; i<20; i++ ) { output = noise.tick(); std::cout << "i = " << i << " : output = " << output << std::endl; } return 0; } \endcode Nearly all STK classes implement tick() functions that take and/or return sample values. Within the tick() function, the fundamental sample calculations are performed for a given class. Most STK classes consume/generate a single sample per operation and their tick() method takes/returns each sample "by value". In addition, every class implementing a tick() function also provides one or more overloaded tick() functions that can be used for vectorized computations, as shown in the next example. \code #include "Noise.h" using namespace stk; int main() { StkFrames output(20, 1); // initialize StkFrames to 20 frames and 1 channel (default: interleaved) Noise noise; noise.tick( output ); for ( unsigned int i=0; iMain tutorial page]   [Next tutorial] */ stk-4.5.0/doc/doxygen/header.html0000644000076600007660000000147412327014024014501 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk-4.5.0/doc/doxygen/header.tex0000644000076600007660000000161012327014024014325 0ustar gary\documentclass[letter]{book} \usepackage{makeidx} \usepackage{fancyhdr} \usepackage{graphicx} \usepackage{float} \usepackage{alltt} \usepackage{doxygen} \usepackage{hyperref} \makeindex \setcounter{tocdepth}{1} \setlength{\footrulewidth}{0.4pt} \begin{document} \begin{titlepage} \vspace*{7cm} \begin{center} {\Large User Manual}\\ \vspace*{0.5cm} {\Large The Synthesis ToolKit in C++}\\ \vspace*{1cm} {\large by Perry R. Cook and Gary P. Scavone}\\ \vspace*{0.5cm} {\small \copyright 1995--2007}\\ \end{center} \end{titlepage} \clearemptydoublepage \pagenumbering{roman} \rfoot[\fancyplain{}{\bfseries\scriptsize The Synthesis ToolKit in C++ by Perry R. Cook and Gary P. Scavone, \copyright~1995--2007}]{} \lfoot[]{\fancyplain{}{\bfseries\scriptsize The Synthesis ToolKit in C++ by Perry R. Cook and Gary P. Scavone, \copyright~1995--2007}} \tableofcontents \clearemptydoublepage \pagenumbering{arabic} stk-4.5.0/doc/doxygen/hello.txt0000644000076600007660000000744112327014024014227 0ustar gary/*! \page hello Hello Sine! 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, 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 stk::FileWvOut to write the result to a 16-bit, WAV formatted audio file. \code // sineosc.cpp #include "FileLoop.h" #include "FileWvOut.h" using namespace stk; int main() { // Set the global sample rate before creating class instances. Stk::setSampleRate( 44100.0 ); FileLoop input; FileWvOut output; // Load the sine wave file. input.openFile( "rawwaves/sinewave.raw", true ); // Open a 16-bit, one-channel WAV formatted output file output.openFile( "hellosine.wav", 1, FileWrite::FILE_WAV, Stk::STK_SINT16 ); input.setFrequency( 440.0 ); // Run the oscillator for 40000 samples, writing to the output file for ( int i=0; i<40000; i++ ) output.tick( input.tick() ); return 0; } \endcode 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. 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. 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 tick() 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 tick() 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 tick() functions taking StkFrames reference arguments should be used. 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. \section error Error Handling The ToolKit has some basic C++ error handling functionality built in. Classes that access files and/or hardware are most prone to runtime errors. To properly "catch" such errors, the above example should be 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. [Main tutorial page]   [Next tutorial] */ stk-4.5.0/doc/doxygen/images/0000755000076600007660000000000012327014024013622 5ustar garystk-4.5.0/doc/doxygen/images/ccrma.gif0000644000076600007660000002016112327014024015376 0ustar garyGIF87aá0÷(`0P(Px¨Äðèðð `ˆÐØØ˜˜ˆ8X °ÄР°¸°Ôè(|°¸Üø°Üø¨À蘸Ș¤¨ \€¸Ðè°Ôð¨¼Ø˜œ Èàø8p(Pˆ˜ 4hˆ” x€ˆ€˜°Øðx|xÀÀ˜ XˆØäè h˜°ÌèPx¨Äè¨Èà0h8Xx¨ØøÈÐØ ¼Ðp„˜¨¸È d ¨°°Øøðì ÄàÈÔà¨Ôð X€ˆœ¨¨Ðð ÀÐT€°ÈðL€Lp4`°Ôø´Èøøøœ¨¸àøÀÌÐðððÈÜè¨´È l˜¨Ðø ¬¸¸ÀÀ¸Ìè*¶‘D^&ßJGætÒNñ™^a%$Yq¥Sv˜ ¥]`å\œþ^—&šgÒÚfq#V!fs(BÇêTyE%•v© Ú2ˆX£‹ÄhêuTHPà 2È[Ô¹áF”¶´KãbDváÂWA |«©’P1Ê÷æÛæ(ÉY@íjGŒH•&̆êƒ)(àÂn½Q‘ë˜Ò*1]ÁõV‡Ç¿Ú ¢í‰¢¸Ý$¹µÈ¢v{ÅødË*ö€¢,蘞´;:¼F8ã¬ÄW4Àó M„K_¹õÍ€H,tóÄðFÏ„)Œ×“ŸÔKyËÛš±çA¯ŽˆDL $þ`› *° a)¬UYQÀÍð†3òÑêoPüª@8î}iŠÏPñûÙïBèL17˹($ À0D•ÍèGžC‰Ìnt7Lákx #è:öAí„.pƒí9®%P ‘ˆD% ÈG úñ‚†ÃRä¬Á0†^ÛØFÐ…J¬!‘U@‚0€I J´0Tà† ¡èL$H>(¦/ Àe¦PÅ?MÊØ(®08.Òï o¸€äº¤ (¬Ez9‰ÌÅ3x#dÓ¬šÐ!<‡ÂŽP¯$2ލÄêræ:.î‘Ák€ÄÅAÁ -þ0g$ô¸ÎÖ9ž…k@Xð˼ð’ÌÛZØÆ=O&’ m@B# `= H•&H•–¦3*Dbi²ÄYùÒ—Ë’î’Š½D!I–a^¡‹^´_%b19í)/hÂ@ f€ƒ‚bHóMÈ` $ª@†Q "‘ŽPë¦JATb‹'Ã\ÀÁ%Ôs ˆÅ È@s>P$Ì[ÓWÅàa I,™µCÔ•k6\:ˆ(°¡T(D A Ô&K¸YX¹P”°8Xâ K\îáð¢Q8‹ôÙ*ô_ýF;¸.œ:w©4M †P¡þj`8ç UtK]d†Ð‰àdxË ÌÚ….Œ€iA–ˆ¼®­ Ðê,ЇêV׃TxÁ¶òðTE* ¹YàB¸À„,¬ ‚실V‡qbí —¼+ ŦW‡6õY €k‘@VlОæ–*øoâŸds…,|`fˆ…êÇV^Á&‡Fñ´˜Š–‹ƒ#VfH¥P R@‰ ¤ÊB#܈,ðp¦E-ɦiN2˜(f­Ä  ÐB%è„:P€ ºUºØ uƒ@…§n@¸‰,n¸0ƒ!˜PèÄ Â°ó¦7ºZgþ#H ä |¾ðU×*€è}ò£øƒ¨1P¢h Tâf—î)‘u³éš…=äÒÁYø)œÒ÷ÙòL£p'ië‡ %Ä€bH`å$Ô"@ b@uvL€„!$Õ;5ꃓ© pÄ'É0ˆ $²/0…‚Ô$PB$žöä1TaÊ}ÐÄ rØT§¢3d0Á ¨)¤v¢%šHš¥;6ô¶T€3œa8C2Ô¡ÚDš  ¡‚6X)¡V‰‚ „,H›¸†)@8 fH8®Ð….Rš­³È0úÖÓN[œÓ¨XC, D2R'B ;Bþ9žQÖ¡€DŒj ž ¨$®µ6j'<½s&r0É‘éSìÁΠv¨Ä ÒP¶:¯@Fr˜Ps›£Ó',ñ¶«;qÍ`¹XÇz`ᆺ}`sœïêˆ ‡wÖÜ ÍN<¥p'„è6…5ŒLKôÝE ˜a¹f˜‚"ßÀé§j¿ô™>¼éûÕ¯l˜B'›Ժ kt5%`Ô $°×l¹w°Y1Øz”˜ÙVàˆ®¡ÐCjG‹#à³Rî%ް{ X÷÷} Cs¸Ï`Áv ØŒ{Rª½u­Ø¿Î±ËÙÝuöä_þ 1ìØíÙB!’Ê%¬ÄB‚{Ï›øò¾XPáá…U-nÌ ÎB—ž=“Ã;MÁvŽV y``•÷L)àmH•QvÐ PàIÅ4æq5t @4@ ƒ@CeWt ”€,Ñ;ö†P;3Ðy@Pà{Õõ/}@•PC«×‡p;· rPÌg;…ÄGpp \éö0}Õw}aÓ­÷I‘ GÀ€§o° (!¦©ãx‡wëp#°GÐËõm USE]Do”e…º‡øBZýw?Ô0 j`|À$C²€þ”0N$@v@É×jÞ` Ð-ˆ(@€­V€Õ0 zÐ bЋ²s°Šd°øgTþƒÀ€P]Z£5_C ±ÀA„;(ØlÀÖ|ãR‘=Ø n`-€HbðŒÓøÕ÷f×7_ïV :Ù là”PÀZ©Öb XÁ#à#°w7R€wj5Žz@»è†SE @õ³t¨ã'”0P?{è:• y˜4À•!H N)r>å°àC÷F-®æ2Ö r€™ÝqoœHlÖ O¸<ÀI@ ¦¨šA Qq‡}àCP yn‚} $àH zp}+PЪ9+IlPobÐ|AÐy… WèG`öFfðMþx0¥YW5¤I£f¦@ ©c- ”àP- f9†> pŽx'Ak@v@ S0$4U°òçõ#QÐ$ðgPÀ{ àTU˜yjˆÉz |˜w’X {$,ؘíåƒIÕ6clF)F jDiðgðuYT‘IC*GÐÖÉ[*Ö0œFàj¸×àŽ3÷Ýù›Z3 Ž(l@NCàN€™¯Ù[ àŽR wrЊx¤/Ê.j}Õ¨P \°{¦@Òt€( ð”Lð5h‰`“ S`\êX÷”àOSå-` þƒ‰ 2°SfQ* a@¨|è:Ž`˜ù@þô –* p‘½%0ç¹›IÅfIfXèŽ')‘lŠ¢pC@ +p/Ú„T0­:&¨ i¤F¬Ú‚²)Qièj¸IŽ8T /g³ÐjUJM ¸ya¥ßÖ‚N)™0–dÃ¥I•n° «T C 6> kDkšjpævr zfy# ¯R0£ç˜~k`…lÀGMS dОíÔ\€C@C€”l@U1¡ j`©¯PÞæ[J ÕDaf+‰”¼%™-0N¬JÃHFzoz ¦/þ£úˆ‰ˆbKT c)è‰ÐºA.(S4¦-›/€T9X H ÐgrP„v°|TÇ¡½EÀ­B›¬O8v˜´Ç‚å™FRZ‰-àas> ¶‹0 Mð=iywk°‹ñ8AMSiÐb óÇ’GFTÀŸyð ’ú ŽðŸd˜¯ TP„0ʪà(ª”@ø|žÊ¦ºW™G‰È±@ ¤ ¦TSTdS'ª9œ7ûg:Új\ð·}ŠC0LÐÝj}Ž ”À°À¼5ŽšPo(‡b`¤”ðœËxœ`€Üú­aþJ•ðµ Ú+g³Jljl ´k¤J8²°'€‹óL SYêYY§L´: Ð |KUL0“ Y÷T™¸ýA0±–z¹Æ&ÞëeÄê~”±0s¬:)†” H£ê‚®ÚÔ˜g@ `Ýæ© Þ× °€ƒ;‹ÃH å~0Ý)«Y3  Xxr€ËS÷V¤ƒµcaЉˆÐŽ©™b@½Û9¦Ø››5ÚkW “ËçgPà”  ÒD-Ъ Ÿi[C^~[b8†—õ›7 GÐË&‰:€ç`SU þIj°G¬“–'@±Sà±àÀl&”î"@C`Æ0Ð0 ºËw…n@.ÈvnàQSéfYÓ¤ h 8L LÐMÀÈ-ØbðÂMð}£;‹<‡0}n&CPÉIÛ[$Ðrë –˜dªa‰ÞHÔ+vÉ*ÊÛ»½Àið˜ËªP TA ™j¶N s*l«¶Ž0·òŠwkèp°{pÇ|?U€Tr‰uf À¬!°GL„}8 À¯€iÃl&¥0˹’mpÉ}lwr@…`ÑêiÅV|Å›à©*jNÉþä%2@^zà¥lFàÀ÷vÊLàÀkÒ"±™ºfÝšà[avrT×C«qT6@]ú̺> ½RmÅ+Ð `a†raÐ0`$©ú± Cóù5i‘¯w'†ŽpŸmy¶\;±y @ }ìÇSU\uw'pRð ,¨LÓÞ6£9S ¤<Ñ @o,ؽѭJ± ÕSí%]Á˧»7-¢-ɧ|‹,± ŠHE \ÐÒL ÙWœÐ¦&rÆ š°Õ¨‚G6H G@‰é&ÊVìÛV|2v ÆÞè½TþA-p… À€+€WR6³pji]h¹Îl‰7Ls¿YàY0xÜ4Sµ;5}ÜÏ«sÀ%4†8ð'ðR@¤@±"0ÓMàÄPp¹,©À%ýØmp€¯¥Ñ @¶@d/Û›ƒ0Ð_Û €à­íÒT ¥m0Ó3mo"g7LÀT°žd`j H™šà€ýCOBJÒ$¼@½¢üÚ; °íZ3 v`n¨F¶r—j*Zv¥ÝÐb0i-e9¯iÉ–´\pç-¸mÀÞìM) „ñM„\B~ Øùý1«iàß3- ÑÙ\À þ%½ γ÷f•ý ð T0äYó—œ ~¾ç2pà7‚ƒÛÚ£}a€Òâ¬Ò¬àš­Å_0î(OŠ ²f…àˆ€¿½êËœ C ê–¤ÙŽ0N‘Ðé›@ä¬`“LÂIH–­6Ùå[ '—ÎX®¶ñªŽy#°€ç` þÔ4`- ðw·­Ó×ð×­ßt0«p@±| íÈ4 "ðè©À ~þØ ;&&pƒáTQœ®½‹5_p%}É{ž )®Ò*ε:£Æ:£FÐð*=Ê _Žp´æFêa€°Pî¨ê”PþV/à³ ! YpÔ‡îã!= pB¾ ,~ëD> ‰ŒŠÒ›ÀT 7å¹Û Lpå_6w·Îw·ÓæÖî1¦Ä}üdp·¬CK~]î'@‡€ »öÙ¸­}଀à0ïù®Ç ê™Yò …à2 SýfÕ'd°è0÷¬ Ò©0F ‡pöhŸö äÅõÞ• ½^@äb'ø<h3Ϊ#‡y°gŸöl@J<.ÒÚë+É£Õ8¯ÅX@-Fà-]ml00M@ ñµe\Øj¯ñú5[~Ëõ}ì\°G«þsµ©—ÊpjÏgß-Øûfoúi¿îlïî¢mø|>^¬LÀ ®k(§Ñ=°÷z_r ʳ"üf‡ â—Ìç{>£kPìH©\`Â…Õ©bmòâå_¾dø²ˆ •š4¹D…JžE‡2 äŒÁ5P!Â@eS†M57Ͳ2DÓ‘*4eà° ¨ˆ cÁ F¨Xº˜AªÉªäÁºaÃ>|œðŠÃÇ#Ò0É’ÅLÚYL(C@Œ™ÌxP›÷™} À%[ljÁ'ýðqeƒ -à#ƒ‰.2R)d•0³©T¦.þ r$ ‰FtzBí¤êBT¼dj±bÅ k6ÄI…Õ R3ZL0A&LX¥‚Á%Uª^8À`ñ íC/Šçmò‚Å .À€ "*4mÞ´Ò¨*•2DÜò%:)*Sìß·¿è—¾5`Íjƒ<¶êʇEFëÀà"‹ÖjK-.ba„.Ì?ü`è ®¿& O Q )èà.b‘@ºN³Ë2S(97:i*èHá´ÓR+Ä*~àŒ$e‹Ê·©¤’“RZqƒBÚxA(¡Îøâ‘éštÒ7:L Ž” yé%™h:¤&œþOQÞ *ƒèÎ8„?ÿôóéž“*€ ªøÀ ô꫱Àò! 3 Lk-3Xñ°Â¾*é‚ÓN;­¤C¸ÊŒ03QŠºk, $¨±8Ì2c3SŒƒ¡*pôBz5Ô†hBϡ³¢&-)3UQ*å,™@.Ë6`h"¡ŽMö"2™Í€Y¶C)Xؤ“Î7mòb–q€ÂÈÃ"¡öÌ袳èÚVÌ¢ +¯qÔÀ5ö0£­IÎMÿò‹®¸.¦0ÁB4õ„9‘»Р1RbŒUÖZY1eåTÚ`b:Å´ìöW!A!àRþxÌ0÷+Ü3¥B`¸XŽÓ’ S`X &´Œå%ÁL–6©ÀMîàb<:p“&š¼@O+P; Gô”/_¹óóŒž;$Îã‚‚ tô@^`8ŠöP B.ÓXÓ ϸ¬ÁF4ì‡BVqE H.¥”öà"åY‘c†…`` 1¨¹;ú¸9çÓì@-ŒY8ÀzL'¹ö ¥@4K®ô,µl£ ,P ƒ4ÎÈB‹–Š”ß<°@l${]‰6qÄ +¾WÛŠ0*á—ù/ÌÏ÷ü0¿â¢Y¬‹8$ðÔF}H#Š(0 Õz 䘱¿à €“3 þ,ç:(fdš[Q`V#ÌÏ‚9*Ž(j¬À®:ã °¨ ˆ Zó ¸T.4DxZÞ–Â`<ä)€ mHƒ¿t—B3e@hLÒÕ&uÍ"™…÷¾gh" ¢°ˆÜÎ'ź) E˜€¨«dÅ`[Pô÷ý=ÌA{`Â_7ÀÆI.D"R Ç.G‡3qg1 @ ¨p 2¡!!êÀ ÒvDä¯t&, "i3RDáZZjÈÓ` É-µÁÆ;ž cƒLÂnìÛT€.„'æÉmOë³[)²þE&À~¤&ýŽa‡3ƒ¤Ö"1Æ©‘€ˆ6Ö1ýÀc'RÌñ••.GP»¤™PȶóˆÄ™"ÃPz½à³Xƒ#B‰Yl`jžL'& ƒO"O)M°!؆00 ÷ „#1‹YX'ãÁ€3z½!aé–ÈÄyiÂFXC V•²t¥*…é "Ú„,î­ ó$*S‰Î‚ †j4ÏØ0.¤4Ÿk@jJሤF”©H „RQªJT¢0 DVµªUË'¥Cgñ. Ö Ò<«;_'¤x «JQ@Rÿ#=þ;þ<ÿ>ÿ?ÿàåÿåéÿñóÿ1ÿ3ÿ?ÿ#KÿBeþbÿr‹ÿ ±ÿ¿ËÿÀËÿßåÿïòÿ1ÿ3ÿ4ý0ý2ÿ3ÿ4ÿ>ÿAý?þ@ÿAÿ Mÿ#Mÿ0Yÿ0Zý0Yÿ2Yÿ3Zÿ@eÿ@fÿBfÿPsþRsÿStÿ`ÿ`€ÿb€ÿpÿrÿ™þ˜ÿ™ÿ¥ÿ¦ÿ¥ÿ‘¦ÿŸ³ÿ ²ÿ¯¿ÿ°¿ÿ¿ÌÿÀÌÿÏÙÿÐÙÿàæÿßæÿóòþòñÿññþóóÿÿÿ,á0þC H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç™09ÉÈQI’0]Òô±¥Ë—0c lSÉÑ =oæŒÑ9gNÎ7tz¾'hA‰0É\Ê´©ÓP‘3&'O1X縙CÇê¢A…ÎôˆÍÓ³hÓBÄthŒ ]w~“ÃE‹ ¡„ê´B†Ÿsáüt#F%µˆ«ÅDôMÎLº¾Ù:GB¨&BI8 ƒC¨ovÂ=ÐUW:Ž£ÕäO΢‚Ò Š§ÐᆎÈÌ1“I!¦3Aj:ƒg¡Œ˜„æ¤qNOçrfL ò ^Ë¡RÌ‘3»*1³Åþô,ÔpS¤”—Tª4)©ÍÄ6É7#hPýAdÆTúÈÆÑ1Î ÅÕWn6`Oc¹§Ð"nˆ‡Y±±ÈaÑ‘‘Òc ‚Ü8x0¡L`…&4'Æ "rÇ ¡0!hs(°s„’Ã),€Án •sÊ!ø‡‚ý‡\^½6$±qÆsZͱ"”`b–&˜$BF“s,²PO¦•Ú@m x”‰ 9ÍÖÕXY2ÇÐÁD 8ׂ 0'a'Ð\)@Á;DÐxrÅ4DIfÊUNŒD b4è“\tì1ˆ˜9â\QÛÍaIBþm ¡UXdŒgOg ” VAyu"£6ØbäHO”p#%ðÉ:I@Á7|@ƒ9\ð™OM„BCZ¤p€'ˆÂQlC¬ ›_Å’ í±éOEý¡”Gä䆨xܦ%v„Ô½ÙÁªN‘D¨W¡ötP”üÕln’#=¥  B;üdh(0¤Â[o\Q |B oÄñF­ ÙÓN]½ëP"< Ô$i‚)Q; Ñ!Œ&… ¼]¢UUp(d³coœkѱsXa·G„bÄ\9~-PØ¡|]Ot€W‰7Œ×D‰UáN@3ÔþtlTœJkÔÆ€õd„í=Û%%דx 92OZW$¹aÔãqµWSùÄ¡cBÍ6Q!ÎUÔ Mâ9ebìxF‹èÔwN¯JäH¨Œ_tÉVcÈñ†Bû”Så1Ò+pXáóD¹ió‚… OÎ-ñVl]Md³h™7ÈNÅÅ.jïaÂaßâ!ïPšd$õkm"tìl:¹¯;è‚^!žh?y:ñeV!‚B'3xo®sNUæ áôä’Ëfw‘Aü/,tŠ~â°„8b‚\Ñ_Dv—“d“¢`PnЉxÂ'âyƒàƒa þ;éÐDŠIˆ¥} ÑMÚ€  8@è[&(1GP"Š1„hä¯ÅŒ¡@t¨  ƒr@Bä~-0þÒ“+Ô  8XÃP¬ÊŒ c(ÚP"q‹¡ÄP ÇI/„™D!8„=¼)fA6*âiÊš ÁÄ2P4 1A/ÒPœa‚aœ"R;7Üf—T(H0•“:dr&űÊ@<8$\Á$ãÞHlj”q‡äц¸&.`ID’S5À@Ž; b‡9AAkЉWΩ ;ˆF /ˆ&ê; ä9’Ù KÒÄ*«Œq Ý\Sí'–¬iD Y€®p€…o[H&ÒÄ „ ˜CЖX¡(µ>Ê3!ÓÌAgˆú‚2§9¬!#L¼Ä%Fr¯/Ø¡W2L k?FO#•8þe(.à|Å› Äp…† *"Rc­@Q¡œÀ’ pàAÔ' ð<AA!¤C'ŸlT –pÍlèV"i J¥„°æ”GÎÎ5¨e J(1Ò† Ä ’A( ƒäÎqÃ@,`€¾„]|È$†R¬nq v@#ÞÐÅKL†"ÈÄp÷L (‡o¸n(Ž…Ì ýLFÛ£WL“åPÒ„8ÓaQ"„Ü`.Y€ÖœX,p@@3Ñ‚¸ ’¸áŠAp‰2Ô DW%HV»Âªg¾)\K…;²M$…Èt Ë™;=«¬7#² p¹É x¤Ç•1*±B‚â†êNšÏg%ÒV`i†žÁ[oš Ê#$\:˜FŒÑT±%ü8µ. ­ Öˆ„8I` Øqj(%i)(AÈü;+?dEYwæþ0Mš$vÞt(„„51h˜ ‹4s$‚ ·0ºÄd$0B¼2DnÓ+n#À0ÌáHÐCh€U$làÍXD*r@R§I· ‚ÉïT^;ðìä·ÓÃ’B:+äA¹Þ½ "ª×pTtn@3d«"žk³wá‘@ &àܤ°ôCñûå+V™u(þ¦1 !‘z@!"$æÉ0Ák1 ¦éÊÌ] Va" ;,¿³×êÑÁš0½4¤ŠH>ží´;y3¹ ³Ð ¿áAÄ…ECh‡D‚Œ€Aä\À“tƒ`Z<>'wÐþâˆl¤±{ƒÓF(„@Ùñü…NC›ar  pAöQ‚ „ÃntHR¹–@šd»]í¦vc±>¸aíFzƒÀ’‚ ³Ò „@&¦r*ŒõÑR½Á*"h.I8_Á!†·âI ÐJk¡@S%mÐŽ Ýx™ ZÄx*±•Á zÇlp ”p$¡%ï# >!l•R„––)Ppx-°h#zñ^©€˜ˆax a)˜ˆ™˜2ñ„y |Š™’¹CàAa5™š¹™ ƒE"pœ9š¤)›ðfCsYš¬Ùš1Ðûæš´Y›¡ ¢i›ºy;stk-4.5.0/doc/doxygen/images/princeton.gif0000644000076600007660000001254412327014024016320 0ustar garyGIF87aá0õøüøøÌÈøÌ˜ø˜`ø˜0ød0ÈÌÈÈ̘ȘÈȘ˜È˜`Èd`Èd0Èd˜ÌȘ̘˜˜È˜˜˜˜˜`˜dȘd˜˜d`˜d0˜d˜0`dÈ`d˜`d``d0`00`000`000000@ èìèØÜظ¸¸¨¨¨ˆˆˆptpPTP@D@ ,á0þ@ˆÁD,ȤrÉl:ŸÐ¨tJ­> Ã#6»bOÖ°xL.›ÏVnÔË6aÝí·‡Â=¨8p'X°RÄ"Œ™¹«0Ù: 9°Ô5$QÄ9‘w+°°wJ™°Ú­°‰>nb‚4³4IA;ã +¼0$Ÿ í‘Vdøc¤áò·&\EZŠÈFO–õÈíN(\d‹YñèˆÑ S%€” ·ÂØKì¼ZY ÈÌœ¯ˆ§°G§ÄÆv×]ÁÁ¼° ” xïTvͳк²/ÄÝÂQôáÈš}é°ähË’Šë_5誌܃ha©×xÈwד†”Xö*‰ñ;K ¯åêS| Ùëc<ìÃ?6:×Üùºðê¿~GÓ\ì•æBþâɸ÷í·kÁ´ñÝML:º­ ›G¹Ë;‘>`Ý;¤`Vó¯0Ÿ `8‘g N¡´cÍWʲS‚\›8y8ü&@ªåì4Ë«0içîcCLçêØ™^°QÁzÝúê ·i¢3ÂHÀÛ%j3ñ@ E&²2n¯H»Ën1•è­phžPpö LI$BŸ¨Ä,7L$B•k‡Ñœ³¹ Ìb]‹ÓœÎñ«:- XÚù•QŒ¿+N ‹V ø‚…±5$b*L2±îKÂZÀ‚`3+ÉbÃ"0N@Zp)+P@ŠR° œ*KÂò )<óM´h&P’gþŽÁ°&Ö€…ø&ô‰ÅôQj®Iݰˆ%üÁ©(cØê*ÀCÖ9’‡+`i B¬#HA¨‚ŒPÀ Š X °˜ÒʲQ$Hù ±pZp2Ê+µ 8‹\ À ('xG;ÞÑÐDll/T¸—¼£(š†°°h.m#H£¡Ã¶£±Ñ ;5ÌŽé#1üÝPa»á¾:6IJ@a.`Á,”(Ÿi…Ò!#¥¹òvÛ„k/¢?#˜¢[4®–ºi(7dÈM„€ãèæ%Ò¨ÌL¦³ DàOP v2Ž3¥É’œû—®dþ•9D!Ûd„õµ…ÍT*ÐÀƒÅ¿rF’mœ(  ¬ÏaØŽ€'jÇ´PˆÀ"¨@ Ö)t hÔÁL #  ±ˆ }›W¥úFÞRs9Á(gb€[àX˜Vo™€ t@„c­ H,´ B0° x%ã Ht 0 H0dRãØBÖ4 .ÃŒßL©ÒÍ;¡Û©CGþJˆ $ ö‰l–ô$ FOZภÔ$ <0€QZ`”p%« .Ù,@”Õd:˂˾€¡å(pþ€¹¶C¡w} Ðöb`*ðÀ+ŽÚ€ia€£T¦BP€š%¯ P€0°…4Àq@@`ÆL jаf¹™€É|h†Ø‘ŒKã”C›Ú–§5ü°$ÛI@õ-èäoudÏçl„¿Ÿð+*GY€Œ%-pW€P¢  °§Y€Œò(€âjI »¾`¸p{;ðK°×<.Àb°÷vÀë©TÐ/t²¹/@™Ô±Ò€Tƒ@iá6ÕÏC;–Q4p5ƒ±î‡¶•n9A‚ïºÐ$@´¢ÍèÞur»ÄhoŒAic’UMÁcñÚþ'ÆÆÏ­@ðšNZÀÈ5FÁBë1ʹ¸wí@-¤¬P¸¶€ x.*`0`±›ó«¯ ‚çvÀh)ðÀ\°¼À-@TµÄ¨‰s³h0ušçZ`ò•ÓKù¿FÚVé4ʈ;qÊ»ûÝðŽw•a-{*1’†\’+]Ü`ཥ ²¬ %Öp¨ø*ð"á…ŽWÖÊ´yí7S4õ+6éH W7„Hœ‡tK!OÇ+` 'f`òÖ¸C"/Á`bXövÓò]ZvjeǶÓ6Fö IÇfc G•cdt‡# v dd‡gŒ-` ³9ÏJ'0›!Vgd{y³Ù27eSí…’ãàpT w7}u;³èÿ†+pTËYÞU¶cpàœeÕFöT¹¦˜nå$I,PËÖe›€·þt°h »CF˜B÷ iªpK¤çDæwô%J…¶_!õd ðc iVƒQé¤'F^…Wc)vÊ›€WX¶œ uqCVOv‡)£°–·´\ÒÀ&À_J2t8 pƒ&:Õ& @#0Ðiw8¢ÅËåwøtøkf‡DYY°ðŸc“?µ¬PŽÊ ﹊NGzGq ØXŽáWzø &Öšöleª …{¦¡L• „W:J €˜Üç$Ð J P¦Â‚Rbø+ÒÖIðd¶÷hϵ\U:!cRäk @:ïô^HIÝþé* €e!Ð+0\\‡—^æ*½Ötý(}MU0[ÏVPlÊš_ϦPÍê `_©AW™>5b˜TŽXQ¢×cÔõ)&PŽa zj.÷™f¬ì©`e¯P¨/b„˜ðdŨ~uj  Jì5!U—±ÇÉ F¶œÊª @wÐ2À'¨:JÐNJw'Æp ¤?öd@w&r•fhÂ5f` `”9&e¡p‘ALf£·° ðïd`€_pŸ`;¿f“DûN ³Nl嘞ð­-7mRŽ-›¥‡ÊDœ`%eÆ þí¯ JôZ­»`?VÚÁy¯ê¥þ0œif ·œ'`;ËÙt`; €__Uàp«²çšj+0²7j p#J£t+°æI&.@w9F/Û.À_O¶0üÅH7Öraf!S_øåž‡p C´±k´#¶Hs&XQa4øn× UA •ÕZ¥_ËJd 0£‡]«IÖ© …R´Tj³ ÐIÒ«w‡5j ‰*B²!`X'{!3©¸9+©` ð/}“å¤  ðj¾&‡aNŠ0ÅI¼ @þžÏ¦—情ÐP:zÛ`Eñj×KǺY @fù5µêkøU_!ó³ƒJÿiIò¸]¶´¦Ñ Þo¶RŽšFB' ÌÙGO $‡J ¤üÕr"Aèd¶¯ácÑ×c95 po"=¦f%1oJ¡–P}°€=f4P€Ú3®ÐcG°^œ JÆ9`\=&‡ìp`õŽ0h"p*pzÑciв?ÛÇ65­F¡¦²“kú âXýC› —GÙµñNHqua-´h„±€¬4OôÚ «„ ø,rBà-Ûà ð°Åþh zr+E a𵙋÷=·P0DP² Ðy †Éê»XP†¿r? ƒ«ƒÌ½ ø£ª41“‘0°Ò?AÔ1Ûz HX Äš8${3‡ ‹¼¾ÃOT„ ó }ü7Nâ€ùƒ28' J,1)®À ÓÑ$ÐP4Q?A"¶‹êh“ˆ7¿»â&ÙŠZ&èWjJ:„H‰¦<™¦œ‡´ŒÌ͵Žð+³  YHq™æ|@ Ä8 lw¯A„x±-üœJÓñi³qÓ´ÐŒ‘ò %/PÑ9m`|i´½üNC›0 9E‹ò³Ž™0ZCÑ+ÀHþ±KNFW™jj´6)D3šÜüÑ·2õƒSê0®Æ°´&°5Z±ÉK<«4 ƒØÒÓà"ÍLÄ%Ïc òEžâEr! ´ /…bõÒãW“+€ÉïT[‘mÃlÐrÜMtÒ?àÑX}´Š ƒ”™¦_ TôðÇy ‹ ($p¢¸€Y ÊrÎÂhQ€èÁ(4!¬ÈѾL I;ˆRžÂ"J"—ybÖa´ 2éö+−0dƒZ°ô‘- f}Öur0¦ØÕpØ r·*PŽuE·’EZA7wÛ2×á".ÄSÊÃPPöŒ Ô ¼xþ3¤`ü0ŽC •1°\… ( XF1M™NŠ4P¦$bÚ¡ Œ)6®ÅMëH³¥ ª|tGÛ“ÎÒJ»´,ÎâŽ\2â\65r"œ¼ËöíΜA¥ì}HËmd¯ÒÂà¯p§Π>­”!RG †Oyö+˜Œ“çà!é!iÈMåFŠÁbt:„No8!] ±æb2>Hé|Ûà‚±ñ‹Ì  J~ žâFµ0%Ì!à†mäUB߈4[+Ÿ6![óDÖ166!Fƒ] -\aç@ Ýô0ê0[­U¥hnùãJ'‘ŠiÒKt-«qÜ¢•ƒXçÜA¸ÀEŸLS4ܺý.ÅE(BFN ÔÄ¥‰ä —©Æî%îäîÝÞíåžîÆèèþíÆ9îíîîì>ïÞ~îõ~ïæ¾îî¾îünœñ~îñžïþ>ð$Àîðû~ð ¯ðð ðþ>îA;stk-4.5.0/doc/doxygen/index.txt0000644000076600007660000000365712327014024014240 0ustar gary/*! \mainpage The Synthesis ToolKit in C++ (STK) \htmlonly

Perry R. Cook & Gary P. Scavone

\endhtmlonly 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 20 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. - \ref information - \ref classes - \ref download - \ref usage - \ref maillist - \ref system - \ref links - \ref faq - \ref tutorial */

STK is a registered trademark of Analytical Graphics, Inc., 40 General Warren Blvd., Malvern, PA 19355, the manufacturer of the Satellite Tool Kit® (STK®) family of satellite simulation software. Although the term "STK" is used in this website, the content of this site is in no way related to Analytical Graphics, Inc, or its registered STK mark. Nothing in this website should be construed to mean that a business relationship, either past or present, exists between Analytical Graphics, Inc. and the owners of this particular website. stk-4.5.0/doc/doxygen/information.txt0000644000076600007660000002374512327014024015456 0ustar gary/*! \page information General Information

References

  • ICMC2005 Paper

  • A paper by Gary and Perry detailing recent updates to the Synthesis ToolKit in C++.

  • ICMC99 Paper

  • A not-so-recent paper by Perry and Gary about the Synthesis ToolKit in C++.

  • Book Chapter: Audio Anecdotes

  • Here's a link to a book that includes an chapter on STK.

What is the Synthesis ToolKit?

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 20 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. 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 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. Snd, Cool Edit, Matlab).

What the Synthesis ToolKit is not.

The Synthesis Toolkit is not one particular program. Rather, it is a set of C++ classes that you can use to create your own programs. A few example applications are provided to demonstrate some of the ways to use the classes. If you have specific needs, you will probably have to either modify the example programs or write a new program altogether. Further, the example programs don't have a fancy GUI wrapper. It is easy to embed STK classes inside a GUI environment but we have chosen to focus our energy on the audio signal processing issues. Spending hundreds of hours making platform-dependent graphical user interfaces would go against one of the fundamental design goals of the ToolKit - platform independence. For those instances where a simple GUI with sliders and buttons is helpful, we use Tcl/Tk (that is freely distributed for all the supported ToolKit platforms). A number of Tcl/Tk GUI scripts are distributed with the ToolKit release. For control, the Synthesis Toolkit uses raw MIDI (on supported platforms), and SKINI (Synthesis ToolKit Instrument Network Interface, a MIDI-like text message synthesis control format).

A brief history of the Synthesis ToolKit in C++.

Perry Cook began developing a pre-cursor to the Synthesis ToolKit (also called STK) under NeXTStep at the Center for Computer Research in Music and Acoustics (CCRMA) at Stanford University in the early-1990s. With his move to Princeton University in 1996, he ported everything to C++ on SGI hardware, added real-time capabilities, and greatly expanded the synthesis techniques available. With the help of Bill Putnam, Perry also made a port of STK to Windows95. Gary Scavone began using STK extensively in the summer of 1997 and completed a full port of STK to Linux early in 1998. He finished the fully compatable Windows port (using Direct Sound API) in June 1998. Numerous improvements and extensions have been made since then. The Toolkit has been distributed continuously since 1996 via the Princeton Sound Kitchen, Perry Cook's home page at Princeton, Gary Scavone's home page at McGill University, and the Synthesis ToolKit home page. The ToolKit has been included in various collections of software. Much of it has also been ported to Max/MSP on Macintosh computers by Dan Trueman and Luke Dubois of Columbia University, and is distributed as PeRColate. Help on real-time sound and MIDI has been provided over the years by Tim Stilson, Bill Putnam, and Gabriel Maldonado.

Legal and Ethical Notes

This software was designed and created to be made publicly available 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. Some of the concepts are covered by various patents, some known to us and likely others that are unknown. Many of the ones known to us are administered by the Stanford Office of Technology and Licensing. The good news is that large hunks of the techniques used here are public domain. To avoid subtle legal issues, we will not state what's freely useable here, but we will try to note within the various classes where certain things are likely to be protected by patents.

License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Disclaimer

STK is free and we do not guarantee anything. We've been hacking on this code for a while now and most of it seems to work pretty well. But, there surely are some bugs floating around. Sometimes things work fine on one computer platform but not so fine on another. FPU overflows and underflows cause very weird behavior that also depends on the particular CPU and OS. Let us know about bugs you find and we'll do our best to correct them.

Perry's Notes From the Original Distribution of STK

This whole world was created with no particular hardware in mind. These examples are intended to be tutorial in nature, as a platform for the continuation of my research, and as a possible starting point for a software synthesis system. The basic motivation was to create the necessary unit generators to do the synthesis, processing, and control that I want to do and teach about. Little thought for optimization was given and therefore improvements, especially speed enhancements, should be possible with these classes. It was written with some basic concepts in mind about how to let compilers optimize. Your question at this point might be, "But Perry, with CMix, CMusic, CSound, CShells, CMonkeys, etc. already cluttering the landscape, why a new set of stupid C functions for music synthesis and processing?" The answers lie below.
  1. I needed to port many of the things I've done into something that is generic enough to port further to different machines.
  2. I really plan to document this stuff, so that you don't have to be me to figure out what's going on. (I'll probably be sorry I said this in a couple of years, when even I can't figure out what I was thinking.)
  3. The classic difficulties most people have in trying to implement physical models are:
    • They have trouble understanding the papers, and/or in turning the theory into practice.
    • The physical model instruments are a pain to get to oscillate, and coming up with stable and meaningful parameter values is required to get the models to work at all.
    This set of C++ unit generators and instruments might help to diminish the scores of emails I get asking what to do with those block diagrams I put in my papers.
  4. I wanted to try some new stuff with modal synthesis, and implement some classic FM patches as well.
  5. I wanted to reimplement, and newly implement more of the intelligent and physical performer models I've talked about in some of my papers. But I wanted to do it in a portable way, and in such a way that I can hook up modules quickly. I also wanted to make these instruments connectable to such player objects, so folks like Brad Garton who really think a lot about the players can connect them to my instruments, a lot about which I think.
  6. More rationalizations to follow ...
*/ stk-4.5.0/doc/doxygen/instruments.txt0000644000076600007660000000240112327014024015506 0ustar gary/*! \page instruments Instruments 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 We have used an Instrmnt pointer when referencing the BeeThree instance above, so it would be simple to replace the BeeThree class 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., 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. [Main tutorial page]   [Next tutorial] */ stk-4.5.0/doc/doxygen/links.txt0000644000076600007660000000244312327014024014241 0ustar gary/*! \page links Miscellaneous Links - The %RtAudio WWW site - The %RtMidi WWW site - MoMu-Stk: A lightly modified version of STK that supports the iPhone platform (iPhone, iPad, iPod Touches) - StkX: A Cocoa STK Framework for Mac OS X by Woon Seung Yeo - Mobile STK: A port of STK for mobile devices by Georg Essl and Michael Rohs - ChucK: Concurrent, On-the-fly Audio Programming Language using STK unit generators - Kern Scores: A Library of Electronic Musical Scores (with automatic conversion to SKINI format) - MIDI to SKINI file converter by Craig Sapp - Kern Score to SKINI file converter by Craig Sapp - PeRColate: A Port of STK for Max/MSP - AUStk: a demo of integration of STK instruments into an AudioUnit by Airy Andre */ stk-4.5.0/doc/doxygen/maillist.txt0000644000076600007660000000137712327014024014744 0ustar gary/*! \page maillist The Mail List An STK mailing list has been set up to facilitate communication among STK users. Subscribing to this list is your best way of keeping on top of new releases, bug fixes, and various user developments.

For answers to frequently asked questions, check the list archives.

To join send a message to <stk-request@ccrma.stanford.edu> with the contents: subscribe

To be removed from the list send a message to <stk-request@ccrma.stanford.edu> with the contents: unsubscribe */stk-4.5.0/doc/doxygen/multichannel.txt0000644000076600007660000000405012327014024015600 0ustar gary/*! \page multichannel Multi-Channel I/O 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 sample frame. 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 tick() function. For classes supporting multi-channel data, one must distinguish the tick() functions taking or producing single \c StkFloat arguments from those taking stk::StkFrames& arguments. If a single-sample version of the tick() 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 tick() 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 tick() 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 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. \include foursine.cpp [Main tutorial page]   [Next tutorial] */ stk-4.5.0/doc/doxygen/polyvoices.txt0000644000076600007660000000410312327014024015310 0ustar gary/*! \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 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 "group" number. All sounding instrument outputs are summed and returned via the tick() 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 controlbee.cpp program to make use of three stk::BeeThree instruments, all controlled using a stk::Voicer. \include threebees.cpp We have written this program to accept control messages from \c STDIN. Assuming the program is compiled as threebees, the three-voice SKINI scorefile bachfugue.ski (located in the scores directory with the examples) can be redirected to the program as: \code threebees < scores/bachfugue.ski \endcode For more fun, surf to Kern Scores for a huge assortment of other scorefiles that can be downloaded in the SKINI format. 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. [Main tutorial page] */ stk-4.5.0/doc/doxygen/realtime.txt0000644000076600007660000000530412327014024014722 0ustar gary/*! \page realtime Realtime Audio (blocking) In this section, we modify the sineosc.cpp program in order to send the output to the default audio playback device on your 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 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. 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 stk::RtWvIn class exists as well that can be used to read realtime audio data from an input device. See the record.cpp example program in the examples project for more information. 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 effects project or the duplex.cpp example program in the examples project for more information. 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 \ RtWvOut.cpp RtAudio.cpp rtsine.cpp -lpthread -lasound \endcode On a Macintosh OS X system, the syntax would be: \code g++ -Wall -D__MACOSX_CORE__ -o rtsine Stk.cpp Generator.cpp SineWave.cpp WvOut.cpp RtWvOut.cpp RtAudio.cpp \ rtsine.cpp -lpthread -framework CoreAudio -framework CoreMIDI -framework CoreFoundation \endcode [Main tutorial page]   [Next tutorial] */ stk-4.5.0/doc/doxygen/skini.txt0000644000076600007660000004346612327014024014250 0ustar gary/*! \page skini Synthesis toolKit Instrument Network Interface (SKINI) This describes the latest (version 1.1) implementation of SKINI for the Synthesis ToolKit in C++ (STK) by Perry R. Cook. \code Too good to be true? Have control and read it too? A SKINI haiku. \endcode Profound thanks to Dan trueman, Brad Garton, and Gary Scavone for input on this revision. Thanks also to MIDI, the NeXT MusicKit, ZIPI and all the creators and modifiers of these for good bases upon/from which to build and depart. \section compatibility MIDI Compatibility SKINI was designed to be MIDI compatible wherever possible, and extend MIDI in incremental, then maybe profound ways. Differences from MIDI, and motivations, include: - Text-based messages are used, with meaningful names wherever possible. This allows any language or system capable of formatted printing to generate SKINI. Similarly, any system capable of reading in a string and turning delimited fields into strings, floats, and ints can consume SKINI for control. More importantly, humans can actually read, and even write if they want, SKINI files and streams. Use an editor and search/replace or macros to change a channel or control number. Load a SKINI score into a spread sheet to apply transformations to time, control parameters, MIDI velocities, etc. Put a monkey on a special typewriter and get your next great work. Life's too short to debug bit/nybble packed variable length mumble messages. Disk space gets cheaper, available bandwidth increases, music takes up so little space and bandwidth compared to video and graphics. Live a little. - Floating point numbers are used wherever possible. Note Numbers, Velocities, Controller Values, and Delta and Absolute Times are all represented and scanned as ASCII double-precision floats. MIDI byte values are preserved, so that incoming MIDI bytes from an interface can be put directly into SKINI messages. 60.0 or 60 is middle C, 127.0 or 127 is maximum velocity etc. But, unlike MIDI, 60.5 can cause a 50 cent sharp middle C to be played. As with MIDI byte values like velocity, use of the integer and SKINI-added fractional parts is up to the implementor of the algorithm being controlled by SKINI messages. But the extra precision is there to be used or ignored. \section why Why SKINI? SKINI was designed to be extensable and hackable for a number of applications: imbedded synthesis in a game or VR simulation, scoring and mixing tasks, real-time and non-real time applications which could benefit from controllable sound synthesis, JAVA controlled synthesis, or eventually maybe JAVA synthesis, etc. SKINI is not intended to be "the mother of scorefiles," but since the entire system is based on text representations of names, floats, and ints, converters from one scorefile language to SKINI, or back, should be easily created. I am basically a bottom-up designer with an awareness of top-down design ideas, so SKINI above all reflects the needs of my particular research and creative projects as they have arisen and developed. SKINI 1.1 represents a profound advance beyond versions 0.8 and 0.9 (the first versions), future SKINI's might reflect some changes. Compatibility with prior scorefiles will be attempted, but there aren't that many scorefiles out there yet. \section messages SKINI Messages A basic SKINI message is a line of text. There are only three required fields, the message type (an ASCII name), the time (either delta or absolute), and the channel number. Don't freak out and think that this is MIDI channel 0-15 (which is supported), because the channel number is scanned as a long int. Channels could be socket numbers, machine IDs, serial numbers, or even unique tags for each event in a synthesis. Other fields might be used, as specified in the \c SKINI.tbl file. This is described in more detail later. Fields in a SKINI line are delimited by spaces, commas, or tabs. The SKINI parser only operates on a line at a time, so a newline means the message is over. Multiple messages are NOT allowed directly on a single line (by use of the ; for example in C). This could be supported, but it isn't in version 1.1. Message types include standard MIDI types like NoteOn, NoteOff, ControlChange, etc. MIDI extension message types (messages which look better than MIDI but actually get turned into MIDI-like messages) include LipTension, StringDamping, etc. Non-MIDI message types include SetPath (sets a path for file use later), and OpenReadFile (for streaming, mixing, and applying effects to soundfiles along with synthesis, for example). Other non-MIDI message types include Trilling, HammerOn, etc. (these translate to gestures, behaviors, and contexts for use by intelligent players and instruments using SKINI). Where possible I will still use these as MIDI extension messages, so foot switches, etc. can be used to control them in real time. All fields other than type, time, and channel are optional, and the types and useage of the additional fields is defined in the file \c SKINI.tbl. The other important file used by SKINI is \c SKINI.msg, which is a set of #defines to make C code more readable, and to allow reasonably quick re-mapping of control numbers, etc.. All of these defined symbols are assigned integer values. For Java, the #defines could be replaced by declaration and assignment statements, preserving the look and behavior of the rest of the code. \section cfiles Files Used To Implement SKINI Skini is a C++ class which can either open a SKINI file and successively read and parse lines of text as SKINI strings, or accept strings from another object and parse them. The latter functionality would be used by a socket, pipe, or other connection receiving SKINI messages a line at a time, usually in real time, but not restricted to real time. \c SKINI.msg should be included by anything wanting to use the Skini object. This is not mandatory, but use of the __SK_blah_ symbols which are defined in the .msg file will help to ensure clarity and consistency when messages are added and changed. \c SKINI.tbl is used only by the Skini parser object (Skini.cpp). In the file \c SKINI.tbl, an array of structures is declared and assigned values which instruct the parser as to what the message types are, and what the fields mean for those message types. This table is compiled and linked into applications using SKINI, but could be dynamically loaded and changed in a future version of SKINI. \section parser SKINI Messages and the SKINI Parser: The parser isn't all that smart, but neither am I. Here are the basic rules governing a valid SKINI message: - If the first (non-delimiter ... see below) character in a SKINI string is '/' that line is treated as a comment and echoed to stdout. - Spaces, commas, and tabs delimit the fields in a SKINI message line. (We might allow for multiple messages per line later using the semicolon, but probably not. A series of lines with deltaTimes of 0.0 denotes simultaneous events. For read-ability, multiple messages per line doesn't help much, so it's unlikely to be supported later). - The first field must be a SKINI message name (like NoteOn). These might become case-insensitive in future versions, so don't plan on exciting clever overloading of names (like noTeOn being different from NoTeON). There can be a number of leading spaces or tabs, but don't exceed 32 or so. - The second field must be a time specification in seconds. A time field can be either delta-time (most common and the only one supported in version 0.8), or absolute time. Absolute time messages have an '=' appended to the beginning of the floating point number with no space. So 0.10000 means delta time of 100 ms, while =0.10000 means absolute time of 100 ms. Absolute time messages make most sense in score files, but could also be used for (loose) synchronization in a real-time context. Real-time messages should be time-ordered AND time-correct. That is, if you've sent 100 total delta-time messages of 1.0 seconds, and then send an absolute time message of =90.0 seconds, or if you send two absolute time messages of =100.0 and =90.0 in that order, things will get really fouled up. The SKINI parser doesn't know about time, however. The WvOut device is the master time keeper in the Synthesis Toolkit, so it should be queried to see if absolute time messages are making sense. There's an example of how to do that later in this document. Absolute times are returned by the parser as negative numbers (since negative deltaTimes are not allowed). - The third field must be an integer channel number. Don't go crazy and think that this is just MIDI channel 0-15 (which is supported). The channel number is scanned as a long int. Channels 0-15 are in general to be treated as MIDI channels. After that it's wide open. Channels could be socket numbers, machine IDs, serial numbers, or even unique tags for each event in a synthesis. A -1 channel can be used as don't care, omni, or other functions depending on your needs and taste. - All remaining fields are specified in the \c SKINI.tbl file. In general, there are maximum two more fields, which are either SK_INT (long), SK_DBL (double float), or SK_STR (string). The latter is the mechanism by which more arguments can be specified on the line, but the object using SKINI must take that string apart (retrived by using getRemainderString()) and scan it. Any excess fields are stashed in remainderString. \section file A Short SKINI File: \code /* Howdy!!! Welcome to SKINI, by P. Cook 1999 NoteOn 0.000082 2 55 82 NoteOff 1.000000 2 55 0 NoteOn 0.000082 2 69 82 StringDetune 0.100000 2 10 StringDetune 0.100000 2 30 StringDetune 0.100000 2 50 NoteOn 0.000000 2 69 82 StringDetune 0.100000 2 40 StringDetune 0.100000 2 22 StringDetune 0.100000 2 12 // StringDamping 0.000100 2 0.0 NoteOn 0.000082 2 55 82 NoteOn 0.200000 2 62 82 NoteOn 0.100000 2 71 82 NoteOn 0.200000 2 79 82 NoteOff 1.000000 2 55 82 NoteOff 0.000000 2 62 82 NoteOff 0.000000 2 71 82 NoteOff 0.000000 2 79 82 StringDamping =4.000000 2 0.0 NoteOn 0.000082 2 55 82 NoteOn 0.200000 2 62 82 NoteOn 0.100000 2 71 82 NoteOn 0.200000 2 79 82 NoteOff 1.000000 2 55 82 NoteOff 0.000000 2 62 82 NoteOff 0.000000 2 71 82 NoteOff 0.000000 2 79 82 \endcode \section table The SKINI.tbl File and Message Parsing: The \c SKINI.tbl file contains an array of structures which are accessed by the parser object Skini.cpp. The struct is: \code struct SKINISpec { char messageString[32]; long type; long data2; long data3; }; \endcode so an assignment of one of these structs looks like: \code MessageStr$ ,type, data2, data3, \endcode type is the message type sent back from the SKINI line parser. data is either: - NOPE : field not used, specifically, there aren't going to be any more fields on this line. So if there is is NOPE in data2, data3 won't even be checked. - SK_INT : byte (actually scanned as 32 bit signed long int). If it's a MIDI data field which is required to be an integer, like a controller number, it's 0-127. Otherwise, get creative with SK_INTs. - SK_DBL : double precision floating point. SKINI uses these in the MIDI context for note numbers with micro tuning, velocities, controller values, etc. - SK_STR : only valid in final field. This allows (nearly) arbitrary message types to be supported by simply scanning the string to EOL (End Of Line) and then passing it to a more intelligent handler. For example, MIDI SYSEX (system exclusive) messages can be read as space-delimited integers into the SK_STR buffer. Longer bulk dumps, soundfiles, etc. should be handled as a new message type pointing to a FileName, Socket, or something else stored in the SK_STR field, or as a new type of multi-line message. Each individual SKINI message is parsed and saved to a Skini::Message structure of the form: \code struct Message { long type; /*!< The message type, as defined in SKINI.msg. */ long channel; /*!< The message channel (not limited to 16!). */ StkFloat time; /*!< The message time stamp in seconds (delta or absolute). */ std::vector floatValues; /*!< The message values read as floats (values are type-specific). */ std::vector intValues; /*!< The message values read as ints (number and values are type-specific). */ std::string remainder; /*!< Any remaining message data, read as ascii text. */ }; \endcode Here's a couple of lines from the \c SKINI.tbl file \code {"NoteOff" , __SK_NoteOff_, SK_DBL, SK_DBL}, {"NoteOn" , __SK_NoteOn_, SK_DBL, SK_DBL}, {"ControlChange" , __SK_ControlChange_, SK_INT, SK_DBL}, {"Volume" , __SK_ControlChange_, __SK_Volume_ , SK_DBL}, {"StringDamping" , __SK_ControlChange_, __SK_StringDamping_, SK_DBL}, {"StringDetune" , __SK_ControlChange_, __SK_StringDetune_, SK_DBL}, \endcode The first three are basic MIDI messages. The first two would cause the parser, after recognizing a match of the string "NoteOff" or "NoteOn", to set the message type to 128 or 144 (__SK_NoteOff_ and __SK_NoteOn_ are #defined in the file \c SKINI.msg to be the MIDI byte value, without channel, of the actual MIDI messages for NoteOn and NoteOff). The parser would then set the time or delta time (this is always done and is therefore not described in the SKINI Message Struct). The next two fields would be scanned either as double-precision \c floats or as long ints, depending on the format specified in \c SKINI.tbl, and saved to the corresponding C++ vector variables in the Skini::Message structure (either \c floatValues or \c intValues). Floating-point values are also cast to ints (and vice-versa) and stored to their respective variables. For example, an expected integer value of 64 will also be saved as 64.0 in the corresponding \c floatValues variable of the Skini::Message structure. The remainder of the line is stashed in the remainderString variable. The ControlChange spec is basically the same as NoteOn and NoteOff, but the second data byte is set to an integer (for checking later as to what MIDI control is being changed). The Volume spec is a MIDI Extension message, which behaves like a ControlChange message with the controller number set explicitly to the value for MIDI Volume (7). Thus the following two lines would accomplish the same changing of MIDI volume on channel 2: \code ControlChange 0.000000 2 7 64.1 Volume 0.000000 2 64.1 \endcode I like the second line better, thus my motivation for SKINI in the first place. The StringDamping and StringDetune messages behave the same as the Volume message, but use Control Numbers which aren't specifically nailed-down in MIDI. Note that these Control Numbers are carried around as long ints, so we're not limited to 0-127. If, however, you want to use a MIDI controller to play an instrument, using controller numbers in the 0-127 range might make sense. \section using Using SKINI: Here's a simple example of code which uses the Skini object to read a SKINI file and control a single instrument. \code Skini score; Skini::Message message; instrument = new Mandolin(50.0); score.setFile( argv[1] ); while ( score.nextMessage( message ) != 0 ) { tempDouble = message.time; if (tempDouble < 0) { tempDouble = - tempDouble; tempDouble = tempDouble - output.getTime(); if (tempDouble < 0) { printf("Bad News Here!!! Backward Absolute Time Required.\n"); tempDouble = 0.0; } } tempLong = (long) ( tempDouble * Stk::sampleRate() ); for ( i=0; itick() ); } tempDouble3 = message.floatValues[1] * NORM_MIDI; if ( message.type == __SK_NoteOn_ ) { if ( tempDouble3 == 0.0 ) { tempDouble3 = 0.5; instrument->noteOff( tempDouble3 ); } else { tempLong = message.intValues[0]; tempDouble2 = Midi2Pitch[tempLong]; instrument->noteOn( tempDouble2, tempDouble3 ); } } else if ( message.type == __SK_NoteOff_ ) { instrument->noteOff( tempDouble3 ); } else if ( message.type == __SK_ControlChange_ ) { tempLong = message.intValues[0]; instrument->controlChange( tempLong, tempDouble3 ); } } \endcode When a SKINI score is passed to a Skini object using the Skini::setFile() function, valid messages are read from the file and returned using the Skini::nextMessage() function. The "time" member of a Skini::Message is the deltaTime until the current message should occur. If this is greater than 0, synthesis occurs until the deltaTime has elapsed. If deltaTime is less than zero, the time is interpreted as absolute time and the output device is queried as to what time it is now. That is used to form a deltaTime, and if it's positive we synthesize. If it's negative, we print an error, pretend this never happened and we hang around hoping to eventually catch up. The rest of the code sorts out message types NoteOn, NoteOff (including NoteOn with velocity 0), and ControlChange. The code implicitly takes into account the integer type of the control number, but all other data is treated as double float. */ stk-4.5.0/doc/doxygen/system.txt0000644000076600007660000000500312327014024014440 0ustar gary/*! \page system System Requirements General:

  • A MIDI interface to use MIDI input/output controls. (NOTE: This may be built into the soundcard on your computer.)
  • Tcl/Tk version 8.0 or higher to use the simple Tcl/Tk GUIs provided with the STK distribution (available free over the WWW for all supported realtime platforms).
Linux (specific):
  • A soundcard to use realtime audio input/output capabilities. In order to use the effects project, the soundcard and drivers must support full duplex mode.
  • ALSA device drivers and library for realtime sound and MIDI input/output.
  • OSS device drivers (version 4.0 and higher only) can be used for audio input/output, but MIDI support requires the ALSA library to compile.
Macintosh OS X (specific):
  • 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.
  • If you experience frequent audio input/output "glitches", try increasing the RT_BUFFER_SIZE specified in Stk.h.
  • 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.
Windows95/98/2000/XP/7 (specific):
  • A soundcard to use realtime audio input/output capabilities. In order to use the effects project, the soundcard and drivers must support full duplex mode.
  • DirectX 5.0 (or higher) runtime libraries.
  • For compiling the source (if not already in your system):
    • dsound.h header file (DirectX 6.1) - put somewhere in your header search path
    • dsound.lib library file (DirectX 6.1) - put somewhere in your library search path

*/ stk-4.5.0/doc/doxygen/tutorial.txt0000644000076600007660000000221412327014024014760 0ustar gary/*! \page tutorial Tutorial The Synthesis ToolKit is a set of C++ classes. In order to go beyond the simple example programs we provide, it is necessary to know some basics about programming in C and C++. STK's "target audience" includes people who:

  • want to create audio DSP and/or synthesis programs
  • want to use our unit generators and input/output routines rather than code their own
  • want to learn about synthesis and processing algorithms
  • wish to teach real-time synthesis and processing and wish to use some of our classes and examples
Most ToolKit programmers will likely end up writing a class or two for their own particular needs, but this task is typically simplified by making use of pre-existing STK classes (filters, oscillators, etc.). The following tutorial chapters describe many of the fundamental ToolKit concepts and classes. All tutorial programs are included in the projects/examples directory. -# \ref fundamentals -# \ref hello -# \ref compile -# \ref filtering -# \ref realtime -# \ref crealtime -# \ref instruments -# \ref controlin -# \ref multichannel -# \ref polyvoices */ stk-4.5.0/doc/doxygen/usage.txt0000644000076600007660000003570012327014024014227 0ustar gary/*! \page usage Usage Documentation - \ref directory - \ref compiling - \ref debug - \ref control - \ref voices - \ref nort - \ref rt - \ref tcl - \ref midi - \ref polyphony
\section directory Directory Structure: The top level distribution contains the following directories:
  • The src directory contains the source .cpp files for all the STK unit generator and algorithm classes.
  • The include directory contains the header files for all the STK unit generator and algorithm classes.
  • The rawwaves directory contains various raw, monophonic, 16-bit, big-endian, 22050 Hz soundfiles used with the STK classes.
  • The doc directory contains documentation about STK.
  • The projects directory contains various demo and example STK programs.
This release of STK comes with four separate "project" directories:
  1. The demo project is used to demonstrate nearly all of the STK instruments. The demo program has been written to allow a variety of control input and sound data output options. Simple graphical user interfaces (GUIs) are also provided.

  2. The effects project demonstrates realtime duplex mode (simultaneous audio input and output) operation, when available, as well as various delay-line based effects algorithms.

  3. The ragamatic project is just cool. Fire it up and be enlightened.

  4. The eguitar project demonstrates how to make an electric guitar with feedback and distortion.

  5. The examples project contains several simple programs that demonstrate audio input/output, including the audio internet streaming classes, as well as most of the tutorial programs.
\section compiling Compiling:
  • Windows95/98/2000/XP/7: Realtime support is available using either DirectSound, ASIO or WASAPI audio drivers. For DirectSound support, use the __WINDOWS_DS__ preprocessor definition and link with the dsound.lib, winmm.lib, and Wsock32.lib libraries. For ASIO support, use the __WINDOWS_ASIO__ preprocessor definition, include all the files in the src/asio/ directory (i.e. asio.h,cpp, asiodrivers.h,cpp, ...), and link with the winmm.lib, and Wsock32.lib libraries. For WASAPI support, use the __WINDOWS_WASAPI__ preprocessor definition. In addition, the __LITTLE_ENDIAN__ and __WINDOWS_MM__ 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.
  • Unix (and MinGW) Systems: A GNU configure shell script is included in the distribution for unix-based systems. From the top-level distribution directory, type './configure' and the script will create Makefiles in each project directory specific to the characteristics of the host computer. Then from within any given project directory (example demo), type 'make' to compile the project. In addition, an STK library can be compiled from within the src directory. Several options can be supplied to the configure script to customize the build behavior:
    • --disable-realtime to only compile generic non-realtime classes
    • --enable-debug to enable various debug output
    • --with-alsa to choose native ALSA API support (default, linux only)
    • --with-oss to choose native OSS audio API support (linux only, no native OSS MIDI support)
    • --with-jack to choose native JACK API support (linux and Macintosh OS-X)
    • --with-core to choose Core Audio API support (Macintosh OS-X)
    • --with-asio to choose ASIO Audio API support (Windows)
    • --with-ds to choose Windows Direct Sound Audio API support (Windows)

    Note that it is possible to specify as many of the "--with-" options as desired to compile multi-API support. In addition, it is possible to specify the location of the STK rawwaves and the STK include path as follows: \code ./configure RAWWAVE_PATH="/home/gary/rawwaves/" ./configure INCLUDE_PATH="/home/gary/include/" \endcode For novice STK users, the default configuration should be adequate.

For those who wish to create their own system-specific Makefiles:
  • Linux: Realtime audio support is enabled with either the __LINUX_ALSA__, __UNIX_JACK__, and/or __LINUX_OSS__ preprocessor definitions, which are used to select the underlying audio system API(s). 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__ preprocessor definition must be included for MIDI support. Note that native OSS MIDI support no longer exists in RtMidi. If the __LINUX_OSS__ preprocessor definition is specified, only OSS (version 4.0) audio support will be compiled and RtMidi will still be compiled using the ALSA API (assuming the __LINUX_ALSASEQ__ definition is defined). For this reason, STK now requires the asound library for realtime support. Realtime programs must also link with the pthread library. In addition, the __LITTLE_ENDIAN__ preprocessor definition is necessary if compiling on a little-endian system. See the README-Linux file for further system configuration information.
  • Macintosh OS X: Realtime support is enabled with the __MACOSX_CORE__ and __UNIX_JACK__ preprocessor definitions, which incorporate the CoreAudio audio/MIDI API and/or the JACK API. Realtime programs must also link with the pthread library and the CoreAudio, CoreMIDI, and CoreFoundation frameworks (for Core Audio support) and/or the JACK library. See the README-MacOSX file for further system configuration information.
  • Generic (non-realtime): Most STK classes are operating system independent 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 __LITTLE_ENDIAN__ preprocessor definition to your compiler. The demo 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 cannot 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 effects, ragamatic, and most of the examples projects for non-realtime use.
\section debug Debugging: When developing applications with STK, it is recommended that you define the preprocessor definition _STK_DEBUG_ when compiling (or specify the --enable-debug option to the configure 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: All STK programs in this distribution take input control data in the form of SKINI or MIDI messages only. The Messager class unifies the various means of acquiring control data under a single, easy to use set of functions. The way that SKINI messages can be sent to the programs is dependent upon the operating system in use, as well as whether the program is running in realtime or not. In general, it is possible to:
  1. Redirect or pipe SKINI scorefiles to an executable.
  2. Pipe realtime SKINI input messages to an executable (not possible under Windows95/98).
  3. Acquire realtime MIDI messages from a MIDI port on your computer.
Tcl/Tk graphical user interfaces (GUI) are provided with this distribution that can generate realtime SKINI messages. Note that the Messager class allows multiple simultaneous socket client connections, together with MIDI and/or piped input. The Md2Skini program (in the demo directory) is mostly obsolete but can be used to create SKINI scorefiles from realtime MIDI input. \section voices Demo: STK Instruments The demo project demonstrates the behavior of all the distributed STK instruments. The instruments available with this release include:
  • Clarinet: Pretty good physical model of the clarinet
  • BlowHole: A clarinet physical model with one tonehole and one register vent
  • Saxofony: A psuedo-conical bore reed instrument that sometimes sounds like a saxophone
  • Flute: Pretty good physical model of the flute
  • Brass: Not so bad physical model of a brass instrument
  • BlowBotl: A basic helmholtz resonator and air jet model
  • Bowed: Not hideous physical model of a bowed string instrument
  • Plucked: Yer basic plucked string physical model
  • StifKarp: A simple plucked, stiff string physical model
  • Sitar: A simple sitar/plucked string physical model
  • Mandolin: Two-string mandolin physical model
  • Rhodey: Rhodes-like electric piano FM synthesis model
  • Wurley: Wurlitzer-like electric piano FM synthesis model
  • TubeBell: FM synthesis model
  • HevyMetl: Distorted synthesizer FM synthesis model
  • PercFlut: Percussive flute-like FM synthesis model
  • BeeThree: Cheezy organ FM synthesis model
  • Moog: Swept filter sampler
  • FMVoices: Three-formant FM voice synthesis
  • VoicForm: Four-formant resonance filter voice synthesis
  • Resonate: Noise through a BiQuad filter
  • Drummer: Sampling synthesis
  • BandedWG: Banded waveguide meta-object for bowed bars, tibetan bowls, etc.
  • Shakers: Various stochastic event models of shaker instruments
  • ModalBar: Various four-resonance presets (marimba, vibraphone, etc...)
  • Mesh2D: Two-dimensional, rectilinear digital waveguide mesh
  • Whistle: Hybrid physical/spectral model of a police whistle
\section nort Demo: Non-Realtime Use See the information above with respect to compiling STK for non-realtime use. In non-realtime mode, it is assumed that input control messages are provided from a SKINI scorefile and that audio output is written to a soundfile (.snd, .wav, .aif, .mat, .raw). A number of SKINI scorefiles are provided in the scores directory of the demo project. Assuming a successful compilation of the demo program, typing: \code demo BeeThree -ow myfile.wav -if scores/bookert.ski \endcode from the demo directory will play the scorefile bookert.ski using the STK BeeThree instrument and write the resulting audio data to a WAV formatted soundfile called "myfile.wav" (note that you may need to append ./ to the program name if your default shell setup is not set to look in the current directory). Typing demo without any arguments will provide a full program usage description. \section rt Demo: Realtime Use STK realtime audio and MIDI input/output and realtime SKINI control input via socketing support is provided for Linux, Mac OS-X, and Windows95/98/2000/XP operating systems. STK realtime SKINI control input via piping is possible under Linux, Mac OS X, and Windows2000/XP only.

Control input and audio output options are typically specified as command-line arguments to STK programs. For example, the demo program is invoked as: \code demo instrument flags \endcode where instruments include those described above and flags can be any or all of:

  • -or for realtime audio output,
  • -ow \ for WAV soundfile output,
  • -os \ for SND (AU) soundfile output,
  • -om \ for MAT-file output,
  • -if \ for a SKINI formatted control file,
  • -ip for realtime SKINI control input via piping,
  • -im \ for MIDI control input (with optional port, -1 = virtual port where possible),
  • -s RATE to specify a sample rate,
  • -n NUMBER to specify multivoice polyphony
The -ip flag must be used when piping realtime SKINI control data to an STK program. The -im 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 demo program, typing: \code demo BeeThree -or -if scores/bookert.ski \endcode from the demo directory will play the scorefile bookert.ski using the STK BeeThree instrument and stream the resulting audio data in realtime to the audio output channel of your computer. Typing demo without any arguments will provide a full program usage description. \section tcl Realtime Control Input using Tcl/Tk Graphical User Interfaces: There are a number of Tcl/Tk GUIs supplied with the STK projects. These scripts require Tcl/Tk version 8.0 or later, which can be downloaded for free over the WWW. On Unix and Windows2000/XP platforms, you can run the various executable scripts (e.g. StkDemo.bat) provided with each project to start everything up (you may need to symbolically link the wishXX executable to the name wish). The Physical.bat script just implements the following command-line sequence: \code wish < tcl/Physical.tcl | demo Clarinet -or -ip \endcode \section midi Realtime MIDI Control Input: On all supported realtime platforms, you can direct realtime MIDI input to the STK Clarinet by typing: \code demo Clarinet -or -im \endcode This will attempt to use the default MIDI port for input. An optional MIDI port number can be specified after the -im flag. Valid MIDI ports are numbered from 0 (default) and higher. On Linux and Macintosh OS-X systems, it is possible to open a virtual MIDI input port (that other software applications can connect to) by specifying a port identifier of -1. \section polyphony Polyphony: The demo program supports an arbitrary number of voices via the -n NUMBER command-line flag and argument. For example, you can play eight BeeThree instruments with realtime output and control them from a MIDI device by typing: \code demo BeeThree -n 8 -or -im \endcode */ stk-4.5.0/doc/hierarchy.txt0000644000076600007660000002164112327014024013423 0ustar garySTK: A ToolKit of Audio Synthesis Classes and Instruments in C++ By Perry R. Cook and Gary P. Scavone, 1995--2014. STK Classes - See the HTML documentation in the html directory for complete information. .- Generator - (Modulate, Noise, SingWave, Envelope, ADSR, Asymp, SineWave, Blit, BlitSaw, BlitSquare, Granulate) | |- Function - (BowTable, JetTable, ReedTable) | |- FileRead, FileWrite | |- WvIn - (FileWvIn, RtWvIn, InetWvIn) | | | FileLoop | |- WvOut - (FileWvOut, RtWvOut, TcpWvOut) | |- Filter - (OnePole, OneZero, TwoPole, TwoZero, PoleZero, Biquad, FormSwep, Delay, DelayL, DelayA, TapDelay) | |- RtAudio, RtMidi, Socket, Thread, Mutex | | Stk -| UdpSocket | TcpServer | TcpClient | |- StkFrames | |- 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 | | | |- VoicForm | | | |- Sampler - Moog | | | |- Resonate | | | |- Mandolin .- Instrmnt -| |- Drummer | |- Clarinet, BlowHole, Saxofony, Flute, Brass, BlowBotl, Bowed, Plucked, StifKarp, Sitar | |- Shakers | |- BandedWG | |- Mesh2D | .- Whistle *********** UNIT GENERATORS ************** Master Class: Stk.cpp Sample rate, byte-swapping, error handling functionality 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 envelope Asymp.cpp Exponentially approaches target Noise.cpp Random number generator 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.h Abstract base class for audio data input classes FileWvIn.cpp Audio file input interface class with interpolation 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.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) 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 TwoZero.cpp Two zero filter TwoPole.cpp Two pole filter 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 DelayA.cpp Allpass interpolating delay line TapDelay.cpp Multi-tap non-interpolating delay line class 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, Noise, OnePole SingWave.cpp Looping wave table with randomness: Modulate, FileLoop, Envelope ********** INSTRUMENTS AND ALGORITHMS ************** 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 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.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 ************** RtAudio.cpp Multi-OS/API audio I/O routines RtMidi.cpp Multi-OS/API MIDI I/O routines Messager.cpp Pipe, socket, and MIDI control message handling Voicer.cpp Multi-instrument voice manager demo.cpp Demonstration program for most synthesis algorithms effects.cpp Effects demonstration program ragamatic.cpp Nirvana just waiting to happen Skini.cpp SKINI file/message parser object SKINI.msg #defines for often used and universal MIDI/SKINI symbols SKINI.tbl Table of SKINI messages stk-4.5.0/doc/html/0000755000076600007660000000000012327015321011645 5ustar garystk-4.5.0/doc/html/ADSR_8h_source.html0000644000076600007660000006100612327015202015244 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


ADSR.h
1 #ifndef STK_ADSR_H
2 #define STK_ADSR_H
3 
4 #include "Generator.h"
5 
6 namespace stk {
7 
8 /***************************************************/
22 /***************************************************/
23 
24 class ADSR : public Generator
25 {
26  public:
27 
29  enum {
35  };
36 
38  ADSR( void );
39 
41  ~ADSR( void );
42 
44  void keyOn( void );
45 
47  void keyOff( void );
48 
50  void setAttackRate( StkFloat rate );
51 
53  void setAttackTarget( StkFloat target );
54 
56  void setDecayRate( StkFloat rate );
57 
59  void setSustainLevel( StkFloat level );
60 
62  void setReleaseRate( StkFloat rate );
63 
65  void setAttackTime( StkFloat time );
66 
68  void setDecayTime( StkFloat time );
69 
71  void setReleaseTime( StkFloat time );
72 
74  void setAllTimes( StkFloat aTime, StkFloat dTime, StkFloat sLevel, StkFloat rTime );
75 
77  void setTarget( StkFloat target );
78 
80  int getState( void ) const { return state_; };
81 
83  void setValue( StkFloat value );
84 
86  StkFloat lastOut( void ) const { return lastFrame_[0]; };
87 
89  StkFloat tick( void );
90 
92 
99  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
100 
101  protected:
102 
103  void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
104 
105  int state_;
106  StkFloat value_;
107  StkFloat target_;
108  StkFloat attackRate_;
109  StkFloat decayRate_;
110  StkFloat releaseRate_;
111  StkFloat releaseTime_;
112  StkFloat sustainLevel_;
113 };
114 
115 inline StkFloat ADSR :: tick( void )
116 {
117  switch ( state_ ) {
118 
119  case ATTACK:
120  value_ += attackRate_;
121  if ( value_ >= target_ ) {
122  value_ = target_;
123  target_ = sustainLevel_;
124  state_ = DECAY;
125  }
126  lastFrame_[0] = value_;
127  break;
128 
129  case DECAY:
130  if ( value_ > sustainLevel_ ) {
131  value_ -= decayRate_;
132  if ( value_ <= sustainLevel_ ) {
133  value_ = sustainLevel_;
134  state_ = SUSTAIN;
135  }
136  }
137  else {
138  value_ += decayRate_; // attack target < sustain level
139  if ( value_ >= sustainLevel_ ) {
140  value_ = sustainLevel_;
141  state_ = SUSTAIN;
142  }
143  }
144  lastFrame_[0] = value_;
145  break;
146 
147  case RELEASE:
148  value_ -= releaseRate_;
149  if ( value_ <= 0.0 ) {
150  value_ = 0.0;
151  state_ = IDLE;
152  }
153  lastFrame_[0] = value_;
154 
155  }
156 
157  return value_;
158 }
159 
160 inline StkFrames& ADSR :: tick( StkFrames& frames, unsigned int channel )
161 {
162 #if defined(_STK_DEBUG_)
163  if ( channel >= frames.channels() ) {
164  oStream_ << "ADSR::tick(): channel and StkFrames arguments are incompatible!";
165  handleError( StkError::FUNCTION_ARGUMENT );
166  }
167 #endif
168 
169  StkFloat *samples = &frames[channel];
170  unsigned int hop = frames.channels();
171  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
172  *samples = ADSR::tick();
173 
174  return frames;
175 }
176 
177 } // stk namespace
178 
179 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/annotated.html0000644000076600007660000012617512327015206014526 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Class List
Here are the classes, structs, unions and interfaces with brief descriptions:
[detail level 123]
oNstkThe STK namespace
oCRtAudioRealtime audio i/o C++ classes
oCRtAudioErrorException handling class for RtAudio
oCRtMidiAn abstract base class for realtime MIDI input/output
oCRtMidiErrorException handling class for RtMidi
oCRtMidiInA realtime MIDI input class
\CRtMidiOutA realtime MIDI output class

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Asymp_8h_source.html0000644000076600007660000004227312327015202015611 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Asymp.h
1 #ifndef STK_ASYMP_H
2 #define STK_ASYMP_H
3 
4 #include "Generator.h"
5 
6 namespace stk {
7 
8 /***************************************************/
31 /***************************************************/
32 
33 const StkFloat TARGET_THRESHOLD = 0.000001;
34 
35 class Asymp : public Generator
36 {
37  public:
38 
40  Asymp( void );
41 
43  ~Asymp( void );
44 
46  void keyOn( void );
47 
49  void keyOff( void );
50 
52 
58  void setTau( StkFloat tau );
59 
61  void setTime( StkFloat time );
62 
64  void setT60( StkFloat t60 );
65 
67  void setTarget( StkFloat target );
68 
70  void setValue( StkFloat value );
71 
73  int getState( void ) const { return state_; };
74 
76  StkFloat lastOut( void ) const { return lastFrame_[0]; };
77 
79  StkFloat tick( void );
80 
82 
89  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
90 
91  protected:
92 
93  void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
94 
95  StkFloat value_;
96  StkFloat target_;
97  StkFloat factor_;
98  StkFloat constant_;
99  int state_;
100 };
101 
102 inline StkFloat Asymp :: tick( void )
103 {
104  if ( state_ ) {
105 
106  value_ = factor_ * value_ + constant_;
107 
108  // Check threshold.
109  if ( target_ > value_ ) {
110  if ( target_ - value_ <= TARGET_THRESHOLD ) {
111  value_ = target_;
112  state_ = 0;
113  }
114  }
115  else {
116  if ( value_ - target_ <= TARGET_THRESHOLD ) {
117  value_ = target_;
118  state_ = 0;
119  }
120  }
121  lastFrame_[0] = value_;
122  }
123 
124  return value_;
125 }
126 
127 inline StkFrames& Asymp :: tick( StkFrames& frames, unsigned int channel )
128 {
129 #if defined(_STK_DEBUG_)
130  if ( channel >= frames.channels() ) {
131  oStream_ << "Asymp::tick(): channel and StkFrames arguments are incompatible!";
132  handleError( StkError::FUNCTION_ARGUMENT );
133  }
134 #endif
135 
136  StkFloat *samples = &frames[channel];
137  unsigned int hop = frames.channels();
138  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
139  *samples = Asymp::tick();
140 
141  return frames;
142 }
143 
144 } // stk namespace
145 
146 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/BandedWG_8h_source.html0000644000076600007660000004566612327015203016145 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


BandedWG.h
1 #ifndef STK_BANDEDWG_H
2 #define STK_BANDEDWG_H
3 
4 #include "Instrmnt.h"
5 #include "DelayL.h"
6 #include "BowTable.h"
7 #include "ADSR.h"
8 #include "BiQuad.h"
9 
10 namespace stk {
11 
12 /***************************************************/
41 /***************************************************/
42 
43 const int MAX_BANDED_MODES = 20;
44 
45 class BandedWG : public Instrmnt
46 {
47  public:
49  BandedWG( void );
50 
52  ~BandedWG( void );
53 
55  void clear( void );
56 
58  void setStrikePosition( StkFloat position );
59 
61  void setPreset( int preset );
62 
64  void setFrequency( StkFloat frequency );
65 
67  void startBowing( StkFloat amplitude, StkFloat rate );
68 
70  void stopBowing( StkFloat rate );
71 
73  void pluck( StkFloat amp );
74 
76  void noteOn( StkFloat frequency, StkFloat amplitude );
77 
79  void noteOff( StkFloat amplitude );
80 
82  void controlChange( int number, StkFloat value );
83 
85  StkFloat tick( unsigned int channel = 0 );
86 
88 
95  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
96 
97  protected:
98 
99  bool doPluck_;
100  bool trackVelocity_;
101  int nModes_;
102  int presetModes_;
103  BowTable bowTable_;
104  ADSR adsr_;
105  BiQuad bandpass_[MAX_BANDED_MODES];
106  DelayL delay_[MAX_BANDED_MODES];
107  StkFloat maxVelocity_;
108  StkFloat modes_[MAX_BANDED_MODES];
109  StkFloat frequency_;
110  StkFloat baseGain_;
111  StkFloat gains_[MAX_BANDED_MODES];
112  StkFloat basegains_[MAX_BANDED_MODES];
113  StkFloat excitation_[MAX_BANDED_MODES];
114  StkFloat integrationConstant_;
115  StkFloat velocityInput_;
116  StkFloat bowVelocity_;
117  StkFloat bowTarget_;
118  StkFloat bowPosition_;
119  StkFloat strikeAmp_;
120  int strikePosition_;
121 
122 };
123 
124 inline StkFrames& BandedWG :: tick( StkFrames& frames, unsigned int channel )
125 {
126  unsigned int nChannels = lastFrame_.channels();
127 #if defined(_STK_DEBUG_)
128  if ( channel > frames.channels() - nChannels ) {
129  oStream_ << "BandedWG::tick(): channel and StkFrames arguments are incompatible!";
130  handleError( StkError::FUNCTION_ARGUMENT );
131  }
132 #endif
133 
134  StkFloat *samples = &frames[channel];
135  unsigned int j, hop = frames.channels() - nChannels;
136  if ( nChannels == 1 ) {
137  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
138  *samples++ = tick();
139  }
140  else {
141  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
142  *samples++ = tick();
143  for ( j=1; j<nChannels; j++ )
144  *samples++ = lastFrame_[j];
145  }
146  }
147 
148  return frames;
149 }
150 
151 } // stk namespace
152 
153 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/bc_s.png0000644000076600007660000000124412327015202013260 0ustar gary‰PNG  IHDR€_ kIDATxíËkQÆÏ¹É̤I&“¦mš&156*nÄ…”ܸR,4 +Hµ(U­b”ª1‚ŠˆJ.º(E·mßúhëJmKS'C›(‚èäÑ…¤ï &äÖþ ‡ïrÎåü3gö(z÷ýÒ&_9ó}’ÕŸ@‰mÚu ` Øh`ñ÷Ô¯  „ú&·ññ×Ù~“½—Üò‡ÎÝÑM4¸%‰3²§?Êêh)€ÿù™\ÄYi>Jb @gûßiÞˆú²Ñkg§ãê\è½­šEUæv+?E€î"pæÖÛB\ƒY&ðØó$vM+ê’Dn¼)}òþ:§Xoâ ƒ3ŠÚ¯'¯¿.‚fÁ0ìuŠ9òLýj€f6¸%«3Gf”Ô#Ôsm(,ùÃk*Ê’³Jª…¯¼JË¢o䆔¼u_~ °r]%%mnu]z°r5[ÍÆ°«Úò•Xeµ’†Iù<ÈèÐÅg@IÔÚÞàµë3‚:/<JÇ’ÐQ) ñ¹…tÚß÷(Mû\63éCgl!ýí;ÿ¸4Ùhâñ=÷Zë29­w’ÝÒ´·ˆV;ÊL3ƒj&7©·º½÷a!I†)ëë$-öÇÓú³›‹7tIV¾VàñÔübf¨8¡ÈƒB<﫵imnÿœÈ‡„ lߣù‡ÛD —#É5“­'Æ4?쬲øM’™›°»g¬‚|5Åçµ½GNdÓÐr|ô”Ã&„ì"7+'³@ 5‡G➑Džâɬ^;õã–.3Òr"ý_R³¿Â@²oI¾å$IEND®B`‚stk-4.5.0/doc/html/bdwn.png0000644000076600007660000000022312327015202013300 0ustar gary‰PNG  IHDR5åZIDATxíË € DŸP–1ñlžmÀ r±j².e è†D[ØÉ¾ÙÏÔ¼µ¦ã´Þ|陣6€Všë3´Å?Ls'(}¬>+ žKó÷¥¿ch`‚ ^׃ÞnIEND®B`‚stk-4.5.0/doc/html/BeeThree_8h_source.html0000644000076600007660000003642212327015203016203 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


BeeThree.h
1 #ifndef STK_BEETHREE_H
2 #define STK_BEETHREE_H
3 
4 #include "FM.h"
5 
6 namespace stk {
7 
8 /***************************************************/
40 /***************************************************/
41 
42 class BeeThree : public FM
43 {
44  public:
46 
49  BeeThree( void );
50 
52  ~BeeThree( void );
53 
55  void noteOn( StkFloat frequency, StkFloat amplitude );
56 
58  StkFloat tick( unsigned int channel = 0 );
59 
61 
68  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
69 
70  protected:
71 
72 };
73 
74 inline StkFloat BeeThree :: tick( unsigned int )
75 {
76  StkFloat temp;
77 
78  if ( modDepth_ > 0.0 ) {
79  temp = 1.0 + ( modDepth_ * vibrato_.tick() * 0.1 );
80  waves_[0]->setFrequency( baseFrequency_ * temp * ratios_[0] );
81  waves_[1]->setFrequency( baseFrequency_ * temp * ratios_[1] );
82  waves_[2]->setFrequency( baseFrequency_ * temp * ratios_[2] );
83  waves_[3]->setFrequency( baseFrequency_ * temp * ratios_[3] );
84  }
85 
86  waves_[3]->addPhaseOffset( twozero_.lastOut() );
87  temp = control1_ * 2.0 * gains_[3] * adsr_[3]->tick() * waves_[3]->tick();
88  twozero_.tick( temp );
89 
90  temp += control2_ * 2.0 * gains_[2] * adsr_[2]->tick() * waves_[2]->tick();
91  temp += gains_[1] * adsr_[1]->tick() * waves_[1]->tick();
92  temp += gains_[0] * adsr_[0]->tick() * waves_[0]->tick();
93 
94  lastFrame_[0] = temp * 0.125;
95  return lastFrame_[0];
96 }
97 
98 inline StkFrames& BeeThree :: tick( StkFrames& frames, unsigned int channel )
99 {
100  unsigned int nChannels = lastFrame_.channels();
101 #if defined(_STK_DEBUG_)
102  if ( channel > frames.channels() - nChannels ) {
103  oStream_ << "BeeThree::tick(): channel and StkFrames arguments are incompatible!";
104  handleError( StkError::FUNCTION_ARGUMENT );
105  }
106 #endif
107 
108  StkFloat *samples = &frames[channel];
109  unsigned int j, hop = frames.channels() - nChannels;
110  if ( nChannels == 1 ) {
111  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
112  *samples++ = tick();
113  }
114  else {
115  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
116  *samples++ = tick();
117  for ( j=1; j<nChannels; j++ )
118  *samples++ = lastFrame_[j];
119  }
120  }
121 
122  return frames;
123 }
124 
125 } // stk namespace
126 
127 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/BiQuad_8h_source.html0000644000076600007660000005746312327015203015675 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


BiQuad.h
1 #ifndef STK_BIQUAD_H
2 #define STK_BIQUAD_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
18 /***************************************************/
19 
20 class BiQuad : public Filter
21 {
22 public:
23 
25  BiQuad();
26 
28  ~BiQuad();
29 
31  void ignoreSampleRateChange( bool ignore = true ) { ignoreSampleRateChange_ = ignore; };
32 
34  void setCoefficients( StkFloat b0, StkFloat b1, StkFloat b2, StkFloat a1, StkFloat a2, bool clearState = false );
35 
37  void setB0( StkFloat b0 ) { b_[0] = b0; };
38 
40  void setB1( StkFloat b1 ) { b_[1] = b1; };
41 
43  void setB2( StkFloat b2 ) { b_[2] = b2; };
44 
46  void setA1( StkFloat a1 ) { a_[1] = a1; };
47 
49  void setA2( StkFloat a2 ) { a_[2] = a2; };
50 
52 
65  void setResonance( StkFloat frequency, StkFloat radius, bool normalize = false );
66 
68 
75  void setNotch( StkFloat frequency, StkFloat radius );
76 
78 
84  void setEqualGainZeroes( void );
85 
87  StkFloat lastOut( void ) const { return lastFrame_[0]; };
88 
90  StkFloat tick( StkFloat input );
91 
93 
101  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
102 
104 
112  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
113 
114  protected:
115 
116  virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
117 };
118 
119 inline StkFloat BiQuad :: tick( StkFloat input )
120 {
121  inputs_[0] = gain_ * input;
122  lastFrame_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
123  lastFrame_[0] -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
124  inputs_[2] = inputs_[1];
125  inputs_[1] = inputs_[0];
126  outputs_[2] = outputs_[1];
127  outputs_[1] = lastFrame_[0];
128 
129  return lastFrame_[0];
130 }
131 
132 inline StkFrames& BiQuad :: tick( StkFrames& frames, unsigned int channel )
133 {
134 #if defined(_STK_DEBUG_)
135  if ( channel >= frames.channels() ) {
136  oStream_ << "BiQuad::tick(): channel and StkFrames arguments are incompatible!";
137  handleError( StkError::FUNCTION_ARGUMENT );
138  }
139 #endif
140 
141  StkFloat *samples = &frames[channel];
142  unsigned int hop = frames.channels();
143  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
144  inputs_[0] = gain_ * *samples;
145  *samples = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
146  *samples -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
147  inputs_[2] = inputs_[1];
148  inputs_[1] = inputs_[0];
149  outputs_[2] = outputs_[1];
150  outputs_[1] = *samples;
151  }
152 
153  lastFrame_[0] = outputs_[1];
154  return frames;
155 }
156 
157 inline StkFrames& BiQuad :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
158 {
159 #if defined(_STK_DEBUG_)
160  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
161  oStream_ << "BiQuad::tick(): channel and StkFrames arguments are incompatible!";
162  handleError( StkError::FUNCTION_ARGUMENT );
163  }
164 #endif
165 
166  StkFloat *iSamples = &iFrames[iChannel];
167  StkFloat *oSamples = &oFrames[oChannel];
168  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
169  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
170  inputs_[0] = gain_ * *iSamples;
171  *oSamples = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
172  *oSamples -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
173  inputs_[2] = inputs_[1];
174  inputs_[1] = inputs_[0];
175  outputs_[2] = outputs_[1];
176  outputs_[1] = *oSamples;
177  }
178 
179  lastFrame_[0] = outputs_[1];
180  return iFrames;
181 }
182 
183 } // stk namespace
184 
185 #endif
186 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Blit_8h_source.html0000644000076600007660000004256212327015203015414 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Blit.h
1 #ifndef STK_BLIT_H
2 #define STK_BLIT_H
3 
4 #include "Generator.h"
5 #include <cmath>
6 #include <limits>
7 
8 namespace stk {
9 
10 /***************************************************/
31 /***************************************************/
32 
33 class Blit: public Generator
34 {
35  public:
37  Blit( StkFloat frequency = 220.0 );
38 
40  ~Blit();
41 
43  void reset();
44 
46 
49  void setPhase( StkFloat phase ) { phase_ = PI * phase; };
50 
52 
55  StkFloat getPhase() const { return phase_ / PI; };
56 
58  void setFrequency( StkFloat frequency );
59 
61 
73  void setHarmonics( unsigned int nHarmonics = 0 );
74 
76  StkFloat lastOut( void ) const { return lastFrame_[0]; };
77 
79  StkFloat tick( void );
80 
82 
89  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
90 
91  protected:
92 
93  void updateHarmonics( void );
94 
95  unsigned int nHarmonics_;
96  unsigned int m_;
97  StkFloat rate_;
98  StkFloat phase_;
99  StkFloat p_;
100 
101 };
102 
103 inline StkFloat Blit :: tick( void )
104 {
105  // The code below implements the SincM algorithm of Stilson and
106  // Smith with an additional scale factor of P / M applied to
107  // normalize the output.
108 
109  // A fully optimized version of this code would replace the two sin
110  // calls with a pair of fast sin oscillators, for which stable fast
111  // two-multiply algorithms are well known. In the spirit of STK,
112  // which favors clarity over performance, the optimization has not
113  // been made here.
114 
115  // Avoid a divide by zero at the sinc peak, which has a limiting
116  // value of 1.0.
117  StkFloat tmp, denominator = sin( phase_ );
118  if ( denominator <= std::numeric_limits<StkFloat>::epsilon() )
119  tmp = 1.0;
120  else {
121  tmp = sin( m_ * phase_ );
122  tmp /= m_ * denominator;
123  }
124 
125  phase_ += rate_;
126  if ( phase_ >= PI ) phase_ -= PI;
127 
128  lastFrame_[0] = tmp;
129  return lastFrame_[0];
130 }
131 
132 inline StkFrames& Blit :: tick( StkFrames& frames, unsigned int channel )
133 {
134 #if defined(_STK_DEBUG_)
135  if ( channel >= frames.channels() ) {
136  oStream_ << "Blit::tick(): channel and StkFrames arguments are incompatible!";
137  handleError( StkError::FUNCTION_ARGUMENT );
138  }
139 #endif
140 
141  StkFloat *samples = &frames[channel];
142  unsigned int hop = frames.channels();
143  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
144  *samples = Blit::tick();
145 
146  return frames;
147 }
148 
149 } // stk namespace
150 
151 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/BlitSaw_8h_source.html0000644000076600007660000004344512327015203016070 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


BlitSaw.h
1 #ifndef STK_BLITSAW_H
2 #define STK_BLITSAW_H
3 
4 #include "Generator.h"
5 #include <cmath>
6 #include <limits>
7 
8 namespace stk {
9 
10 /***************************************************/
29 /***************************************************/
30 
31 class BlitSaw: public Generator
32 {
33  public:
35  BlitSaw( StkFloat frequency = 220.0 );
36 
38  ~BlitSaw();
39 
41  void reset();
42 
44  void setFrequency( StkFloat frequency );
45 
47 
59  void setHarmonics( unsigned int nHarmonics = 0 );
60 
62  StkFloat lastOut( void ) const { return lastFrame_[0]; };
63 
65  StkFloat tick( void );
66 
68 
75  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
76 
77  protected:
78 
79  void updateHarmonics( void );
80 
81  unsigned int nHarmonics_;
82  unsigned int m_;
83  StkFloat rate_;
84  StkFloat phase_;
85  StkFloat p_;
86  StkFloat C2_;
87  StkFloat a_;
88  StkFloat state_;
89 
90 };
91 
92 inline StkFloat BlitSaw :: tick( void )
93 {
94  // The code below implements the BLIT algorithm of Stilson and
95  // Smith, followed by a summation and filtering operation to produce
96  // a sawtooth waveform. After experimenting with various approaches
97  // to calculate the average value of the BLIT over one period, I
98  // found that an estimate of C2_ = 1.0 / period (in samples) worked
99  // most consistently. A "leaky integrator" is then applied to the
100  // difference of the BLIT output and C2_. (GPS - 1 October 2005)
101 
102  // A fully optimized version of this code would replace the two sin
103  // calls with a pair of fast sin oscillators, for which stable fast
104  // two-multiply algorithms are well known. In the spirit of STK,
105  // which favors clarity over performance, the optimization has
106  // not been made here.
107 
108  // Avoid a divide by zero, or use of a denormalized divisor
109  // at the sinc peak, which has a limiting value of m_ / p_.
110  StkFloat tmp, denominator = sin( phase_ );
111  if ( fabs(denominator) <= std::numeric_limits<StkFloat>::epsilon() )
112  tmp = a_;
113  else {
114  tmp = sin( m_ * phase_ );
115  tmp /= p_ * denominator;
116  }
117 
118  tmp += state_ - C2_;
119  state_ = tmp * 0.995;
120 
121  phase_ += rate_;
122  if ( phase_ >= PI ) phase_ -= PI;
123 
124  lastFrame_[0] = tmp;
125  return lastFrame_[0];
126 }
127 
128 inline StkFrames& BlitSaw :: tick( StkFrames& frames, unsigned int channel )
129 {
130 #if defined(_STK_DEBUG_)
131  if ( channel >= frames.channels() ) {
132  oStream_ << "BlitSaw::tick(): channel and StkFrames arguments are incompatible!";
133  handleError( StkError::FUNCTION_ARGUMENT );
134  }
135 #endif
136 
137 
138  StkFloat *samples = &frames[channel];
139  unsigned int hop = frames.channels();
140  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
141  *samples = BlitSaw::tick();
142 
143  return frames;
144 }
145 
146 } // stk namespace
147 
148 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/BlitSquare_8h_source.html0000644000076600007660000004535612327015203016601 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


BlitSquare.h
1 #ifndef STK_BLITSQUARE_H
2 #define STK_BLITSQUARE_H
3 
4 #include "Generator.h"
5 #include <cmath>
6 #include <limits>
7 
8 namespace stk {
9 
10 /***************************************************/
40 /***************************************************/
41 
42 class BlitSquare: public Generator
43 {
44  public:
46  BlitSquare( StkFloat frequency = 220.0 );
47 
49  ~BlitSquare();
50 
52  void reset();
53 
55 
58  void setPhase( StkFloat phase ) { phase_ = PI * phase; };
59 
61 
64  StkFloat getPhase() const { return phase_ / PI; };
65 
67  void setFrequency( StkFloat frequency );
68 
70 
82  void setHarmonics( unsigned int nHarmonics = 0 );
83 
85  StkFloat lastOut( void ) const { return lastFrame_[0]; };
86 
88  StkFloat tick( void );
89 
91 
98  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
99 
100  protected:
101 
102  void updateHarmonics( void );
103 
104  unsigned int nHarmonics_;
105  unsigned int m_;
106  StkFloat rate_;
107  StkFloat phase_;
108  StkFloat p_;
109  StkFloat a_;
110  StkFloat lastBlitOutput_;
111  StkFloat dcbState_;
112 };
113 
114 inline StkFloat BlitSquare :: tick( void )
115 {
116  StkFloat temp = lastBlitOutput_;
117 
118  // A fully optimized version of this would replace the two sin calls
119  // with a pair of fast sin oscillators, for which stable fast
120  // two-multiply algorithms are well known. In the spirit of STK,
121  // which favors clarity over performance, the optimization has
122  // not been made here.
123 
124  // Avoid a divide by zero, or use of a denomralized divisor
125  // at the sinc peak, which has a limiting value of 1.0.
126  StkFloat denominator = sin( phase_ );
127  if ( fabs( denominator ) < std::numeric_limits<StkFloat>::epsilon() ) {
128  // Inexact comparison safely distinguishes betwen *close to zero*, and *close to PI*.
129  if ( phase_ < 0.1f || phase_ > TWO_PI - 0.1f )
130  lastBlitOutput_ = a_;
131  else
132  lastBlitOutput_ = -a_;
133  }
134  else {
135  lastBlitOutput_ = sin( m_ * phase_ );
136  lastBlitOutput_ /= p_ * denominator;
137  }
138 
139  lastBlitOutput_ += temp;
140 
141  // Now apply DC blocker.
142  lastFrame_[0] = lastBlitOutput_ - dcbState_ + 0.999 * lastFrame_[0];
143  dcbState_ = lastBlitOutput_;
144 
145  phase_ += rate_;
146  if ( phase_ >= TWO_PI ) phase_ -= TWO_PI;
147 
148  return lastFrame_[0];
149 }
150 
151 inline StkFrames& BlitSquare :: tick( StkFrames& frames, unsigned int channel )
152 {
153 #if defined(_STK_DEBUG_)
154  if ( channel >= frames.channels() ) {
155  oStream_ << "BlitSquare::tick(): channel and StkFrames arguments are incompatible!";
156  handleError( StkError::FUNCTION_ARGUMENT );
157  }
158 #endif
159 
160  StkFloat *samples = &frames[channel];
161  unsigned int hop = frames.channels();
162  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
163  *samples = BlitSquare::tick();
164 
165  return frames;
166 }
167 
168 } // stk namespace
169 
170 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/BlowBotl_8h_source.html0000644000076600007660000005054212327015203016243 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


BlowBotl.h
1 #ifndef STK_BLOWBOTL_H
2 #define STK_BLOWBOTL_H
3 
4 #include "Instrmnt.h"
5 #include "JetTable.h"
6 #include "BiQuad.h"
7 #include "PoleZero.h"
8 #include "Noise.h"
9 #include "ADSR.h"
10 #include "SineWave.h"
11 
12 namespace stk {
13 
14 /***************************************************/
30 /***************************************************/
31 
32 class BlowBotl : public Instrmnt
33 {
34  public:
36 
39  BlowBotl( void );
40 
42  ~BlowBotl( void );
43 
45  void clear( void );
46 
48  void setFrequency( StkFloat frequency );
49 
51  void startBlowing( StkFloat amplitude, StkFloat rate );
52 
54  void stopBlowing( StkFloat rate );
55 
57  void noteOn( StkFloat frequency, StkFloat amplitude );
58 
60  void noteOff( StkFloat amplitude );
61 
63  void controlChange( int number, StkFloat value );
64 
66  StkFloat tick( unsigned int channel = 0 );
67 
69 
76  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
77 
78  protected:
79 
80  JetTable jetTable_;
81  BiQuad resonator_;
82  PoleZero dcBlock_;
83  Noise noise_;
84  ADSR adsr_;
85  SineWave vibrato_;
86  StkFloat maxPressure_;
87  StkFloat noiseGain_;
88  StkFloat vibratoGain_;
89  StkFloat outputGain_;
90 
91 };
92 
93 inline StkFloat BlowBotl :: tick( unsigned int )
94 {
95  StkFloat breathPressure;
96  StkFloat randPressure;
97  StkFloat pressureDiff;
98 
99  // Calculate the breath pressure (envelope + vibrato)
100  breathPressure = maxPressure_ * adsr_.tick();
101  breathPressure += vibratoGain_ * vibrato_.tick();
102 
103  pressureDiff = breathPressure - resonator_.lastOut();
104 
105  randPressure = noiseGain_ * noise_.tick();
106  randPressure *= breathPressure;
107  randPressure *= (1.0 + pressureDiff);
108 
109  resonator_.tick( breathPressure + randPressure - ( jetTable_.tick( pressureDiff ) * pressureDiff ) );
110  lastFrame_[0] = 0.2 * outputGain_ * dcBlock_.tick( pressureDiff );
111 
112  return lastFrame_[0];
113 }
114 
115 inline StkFrames& BlowBotl :: tick( StkFrames& frames, unsigned int channel )
116 {
117  unsigned int nChannels = lastFrame_.channels();
118 #if defined(_STK_DEBUG_)
119  if ( channel > frames.channels() - nChannels ) {
120  oStream_ << "BlowBotl::tick(): channel and StkFrames arguments are incompatible!";
121  handleError( StkError::FUNCTION_ARGUMENT );
122  }
123 #endif
124 
125  StkFloat *samples = &frames[channel];
126  unsigned int j, hop = frames.channels() - nChannels;
127  if ( nChannels == 1 ) {
128  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
129  *samples++ = tick();
130  }
131  else {
132  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
133  *samples++ = tick();
134  for ( j=1; j<nChannels; j++ )
135  *samples++ = lastFrame_[j];
136  }
137  }
138 
139  return frames;
140 }
141 
142 } // stk namespace
143 
144 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/BlowHole_8h_source.html0000644000076600007660000006134612327015203016236 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


BlowHole.h
1 #ifndef STK_BLOWHOLE_H
2 #define STK_BLOWHOLE_H
3 
4 #include "Instrmnt.h"
5 #include "DelayL.h"
6 #include "ReedTable.h"
7 #include "OneZero.h"
8 #include "PoleZero.h"
9 #include "Envelope.h"
10 #include "Noise.h"
11 #include "SineWave.h"
12 
13 namespace stk {
14 
15 /***************************************************/
48 /***************************************************/
49 
50 class BlowHole : public Instrmnt
51 {
52  public:
54 
57  BlowHole( StkFloat lowestFrequency );
58 
60  ~BlowHole( void );
61 
63  void clear( void );
64 
66  void setFrequency( StkFloat frequency );
67 
69  void setTonehole( StkFloat newValue );
70 
72  void setVent( StkFloat newValue );
73 
75  void startBlowing( StkFloat amplitude, StkFloat rate );
76 
78  void stopBlowing( StkFloat rate );
79 
81  void noteOn( StkFloat frequency, StkFloat amplitude );
82 
84  void noteOff( StkFloat amplitude );
85 
87  void controlChange( int number, StkFloat value );
88 
90  StkFloat tick( unsigned int channel = 0 );
91 
93 
100  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
101 
102  protected:
103 
104  DelayL delays_[3];
105  ReedTable reedTable_;
106  OneZero filter_;
107  PoleZero tonehole_;
108  PoleZero vent_;
109  Envelope envelope_;
110  Noise noise_;
111  SineWave vibrato_;
112 
113  StkFloat scatter_;
114  StkFloat thCoeff_;
115  StkFloat rhGain_;
116  StkFloat outputGain_;
117  StkFloat noiseGain_;
118  StkFloat vibratoGain_;
119 };
120 
121  inline StkFloat BlowHole :: tick( unsigned int )
122 {
123  StkFloat pressureDiff;
124  StkFloat breathPressure;
125  StkFloat temp;
126 
127  // Calculate the breath pressure (envelope + noise + vibrato)
128  breathPressure = envelope_.tick();
129  breathPressure += breathPressure * noiseGain_ * noise_.tick();
130  breathPressure += breathPressure * vibratoGain_ * vibrato_.tick();
131 
132  // Calculate the differential pressure = reflected - mouthpiece pressures
133  pressureDiff = delays_[0].lastOut() - breathPressure;
134 
135  // Do two-port junction scattering for register vent
136  StkFloat pa = breathPressure + pressureDiff * reedTable_.tick( pressureDiff );
137  StkFloat pb = delays_[1].lastOut();
138  vent_.tick( pa+pb );
139 
140  lastFrame_[0] = delays_[0].tick( vent_.lastOut()+pb );
141  lastFrame_[0] *= outputGain_;
142 
143  // Do three-port junction scattering (under tonehole)
144  pa += vent_.lastOut();
145  pb = delays_[2].lastOut();
146  StkFloat pth = tonehole_.lastOut();
147  temp = scatter_ * (pa + pb - 2 * pth);
148 
149  delays_[2].tick( filter_.tick(pa + temp) * -0.95 );
150  delays_[1].tick( pb + temp );
151  tonehole_.tick( pa + pb - pth + temp );
152 
153  return lastFrame_[0];
154 }
155 
156 inline StkFrames& BlowHole :: tick( StkFrames& frames, unsigned int channel )
157 {
158  unsigned int nChannels = lastFrame_.channels();
159 #if defined(_STK_DEBUG_)
160  if ( channel > frames.channels() - nChannels ) {
161  oStream_ << "BlowHole::tick(): channel and StkFrames arguments are incompatible!";
162  handleError( StkError::FUNCTION_ARGUMENT );
163  }
164 #endif
165 
166  StkFloat *samples = &frames[channel];
167  unsigned int j, hop = frames.channels() - nChannels;
168  if ( nChannels == 1 ) {
169  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
170  *samples++ = tick();
171  }
172  else {
173  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
174  *samples++ = tick();
175  for ( j=1; j<nChannels; j++ )
176  *samples++ = lastFrame_[j];
177  }
178  }
179 
180  return frames;
181 }
182 
183 } // stk namespace
184 
185 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Bowed_8h_source.html0000644000076600007660000005572712327015203015571 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Bowed.h
1 #ifndef STK_BOWED_H
2 #define STK_BOWED_H
3 
4 #include "Instrmnt.h"
5 #include "DelayL.h"
6 #include "BowTable.h"
7 #include "OnePole.h"
8 #include "BiQuad.h"
9 #include "SineWave.h"
10 #include "ADSR.h"
11 
12 namespace stk {
13 
14 /***************************************************/
38 /***************************************************/
39 
40 class Bowed : public Instrmnt
41 {
42  public:
44  Bowed( StkFloat lowestFrequency = 8.0 );
45 
47  ~Bowed( void );
48 
50  void clear( void );
51 
53  void setFrequency( StkFloat frequency );
54 
56  void setVibrato( StkFloat gain ) { vibratoGain_ = gain; };
57 
59  void startBowing( StkFloat amplitude, StkFloat rate );
60 
62  void stopBowing( StkFloat rate );
63 
65  void noteOn( StkFloat frequency, StkFloat amplitude );
66 
68  void noteOff( StkFloat amplitude );
69 
71  void controlChange( int number, StkFloat value );
72 
74  StkFloat tick( unsigned int channel = 0 );
75 
77 
84  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
85 
86  protected:
87 
88  DelayL neckDelay_;
89  DelayL bridgeDelay_;
90  BowTable bowTable_;
91  OnePole stringFilter_;
92  BiQuad bodyFilters_[6];
93  SineWave vibrato_;
94  ADSR adsr_;
95 
96  bool bowDown_;
97  StkFloat maxVelocity_;
98  StkFloat baseDelay_;
99  StkFloat vibratoGain_;
100  StkFloat betaRatio_;
101 
102 };
103 
104 inline StkFloat Bowed :: tick( unsigned int )
105 {
106  StkFloat bowVelocity = maxVelocity_ * adsr_.tick();
107  StkFloat bridgeReflection = -stringFilter_.tick( bridgeDelay_.lastOut() );
108  StkFloat nutReflection = -neckDelay_.lastOut();
109  StkFloat stringVelocity = bridgeReflection + nutReflection;
110  StkFloat deltaV = bowVelocity - stringVelocity; // Differential velocity
111 
112  StkFloat newVelocity = 0.0;
113  if ( bowDown_ )
114  newVelocity = deltaV * bowTable_.tick( deltaV ); // Non-Linear bow function
115  neckDelay_.tick( bridgeReflection + newVelocity); // Do string propagations
116  bridgeDelay_.tick(nutReflection + newVelocity);
117 
118  if ( vibratoGain_ > 0.0 ) {
119  neckDelay_.setDelay( (baseDelay_ * (1.0 - betaRatio_) ) +
120  (baseDelay_ * vibratoGain_ * vibrato_.tick()) );
121  }
122 
123  lastFrame_[0] = 0.1248 * bodyFilters_[5].tick( bodyFilters_[4].tick( bodyFilters_[3].tick( bodyFilters_[2].tick( bodyFilters_[1].tick( bodyFilters_[0].tick( bridgeDelay_.lastOut() ) ) ) ) ) );
124 
125  return lastFrame_[0];
126 }
127 
128 inline StkFrames& Bowed :: tick( StkFrames& frames, unsigned int channel )
129 {
130  unsigned int nChannels = lastFrame_.channels();
131 #if defined(_STK_DEBUG_)
132  if ( channel > frames.channels() - nChannels ) {
133  oStream_ << "Bowed::tick(): channel and StkFrames arguments are incompatible!";
134  handleError( StkError::FUNCTION_ARGUMENT );
135  }
136 #endif
137 
138  StkFloat *samples = &frames[channel];
139  unsigned int j, hop = frames.channels() - nChannels;
140  if ( nChannels == 1 ) {
141  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
142  *samples++ = tick();
143  }
144  else {
145  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
146  *samples++ = tick();
147  for ( j=1; j<nChannels; j++ )
148  *samples++ = lastFrame_[j];
149  }
150  }
151 
152  return frames;
153 }
154 
155 } // stk namespace
156 
157 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/BowTable_8h_source.html0000644000076600007660000005167412327015203016225 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


BowTable.h
1 #ifndef STK_BOWTABL_H
2 #define STK_BOWTABL_H
3 
4 #include "Function.h"
5 #include <cmath>
6 
7 namespace stk {
8 
9 /***************************************************/
20 /***************************************************/
21 
22 class BowTable : public Function
23 {
24 public:
26  BowTable( void ) : offset_(0.0), slope_(0.1), minOutput_(0.01), maxOutput_(0.98) {};
27 
29 
35  void setOffset( StkFloat offset ) { offset_ = offset; };
36 
38 
42  void setSlope( StkFloat slope ) { slope_ = slope; };
43 
45  void setMinOutput( StkFloat minimum ) { minOutput_ = minimum; };
46 
48  void setMaxOutput( StkFloat maximum ) { maxOutput_ = maximum; };
49 
51  StkFloat tick( StkFloat input );
52 
54 
62  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
63 
65 
73  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
74 
75 protected:
76 
77  StkFloat offset_;
78  StkFloat slope_;
79  StkFloat minOutput_;
80  StkFloat maxOutput_;
81 
82 };
83 
84 inline StkFloat BowTable :: tick( StkFloat input )
85 {
86  // The input represents differential string vs. bow velocity.
87  StkFloat sample = input + offset_; // add bias to input
88  sample *= slope_; // then scale it
89  lastFrame_[0] = (StkFloat) fabs( (double) sample ) + (StkFloat) 0.75;
90  lastFrame_[0] = (StkFloat) pow( lastFrame_[0], (StkFloat) -4.0 );
91 
92  // Set minimum threshold
93  if ( lastFrame_[0] < minOutput_ ) lastFrame_[0] = minOutput_;
94 
95  // Set maximum threshold
96  if ( lastFrame_[0] > maxOutput_ ) lastFrame_[0] = maxOutput_;
97 
98  return lastFrame_[0];
99 }
100 
101 inline StkFrames& BowTable :: tick( StkFrames& frames, unsigned int channel )
102 {
103 #if defined(_STK_DEBUG_)
104  if ( channel >= frames.channels() ) {
105  oStream_ << "BowTable::tick(): channel and StkFrames arguments are incompatible!";
106  handleError( StkError::FUNCTION_ARGUMENT );
107  }
108 #endif
109 
110  StkFloat *samples = &frames[channel];
111  unsigned int hop = frames.channels();
112  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
113  *samples = *samples + offset_;
114  *samples *= slope_;
115  *samples = (StkFloat) fabs( (double) *samples ) + 0.75;
116  *samples = (StkFloat) pow( *samples, (StkFloat) -4.0 );
117  if ( *samples > 1.0) *samples = 1.0;
118  }
119 
120  lastFrame_[0] = *(samples-hop);
121  return frames;
122 }
123 
124 inline StkFrames& BowTable :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
125 {
126 #if defined(_STK_DEBUG_)
127  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
128  oStream_ << "BowTable::tick(): channel and StkFrames arguments are incompatible!";
129  handleError( StkError::FUNCTION_ARGUMENT );
130  }
131 #endif
132 
133  StkFloat *iSamples = &iFrames[iChannel];
134  StkFloat *oSamples = &oFrames[oChannel];
135  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
136  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
137  *oSamples = *iSamples + offset_;
138  *oSamples *= slope_;
139  *oSamples = (StkFloat) fabs( (double) *oSamples ) + 0.75;
140  *oSamples = (StkFloat) pow( *oSamples, (StkFloat) -4.0 );
141  if ( *oSamples > 1.0) *oSamples = 1.0;
142  }
143 
144  lastFrame_[0] = *(oSamples-oHop);
145  return iFrames;
146 }
147 
148 } // stk namespace
149 
150 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Brass_8h_source.html0000644000076600007660000005052412327015203015571 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Brass.h
1 #ifndef STK_BRASS_H
2 #define STK_BRASS_H
3 
4 #include "Instrmnt.h"
5 #include "DelayA.h"
6 #include "BiQuad.h"
7 #include "PoleZero.h"
8 #include "ADSR.h"
9 #include "SineWave.h"
10 
11 namespace stk {
12 
13 /***************************************************/
33 /***************************************************/
34 
35 class Brass: public Instrmnt
36 {
37  public:
39 
42  Brass( StkFloat lowestFrequency = 8.0 );
43 
45  ~Brass( );
46 
48  void clear( );
49 
51  void setFrequency( StkFloat frequency );
52 
54  void setLip( StkFloat frequency );
55 
57  void startBlowing( StkFloat amplitude, StkFloat rate );
58 
60  void stopBlowing( StkFloat rate );
61 
63  void noteOn( StkFloat frequency, StkFloat amplitude );
64 
66  void noteOff( StkFloat amplitude );
67 
69  void controlChange( int number, StkFloat value );
70 
72  StkFloat tick( unsigned int channel = 0 );
73 
75 
82  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
83 
84  protected:
85 
86  DelayA delayLine_;
87  BiQuad lipFilter_;
88  PoleZero dcBlock_;
89  ADSR adsr_;
90  SineWave vibrato_;
91 
92  StkFloat lipTarget_;
93  StkFloat slideTarget_;
94  StkFloat vibratoGain_;
95  StkFloat maxPressure_;
96 
97 };
98 
99 inline StkFloat Brass :: tick( unsigned int )
100 {
101  StkFloat breathPressure = maxPressure_ * adsr_.tick();
102  breathPressure += vibratoGain_ * vibrato_.tick();
103 
104  StkFloat mouthPressure = 0.3 * breathPressure;
105  StkFloat borePressure = 0.85 * delayLine_.lastOut();
106  StkFloat deltaPressure = mouthPressure - borePressure; // Differential pressure.
107  deltaPressure = lipFilter_.tick( deltaPressure ); // Force - > position.
108  deltaPressure *= deltaPressure; // Basic position to area mapping.
109  if ( deltaPressure > 1.0 ) deltaPressure = 1.0; // Non-linear saturation.
110 
111  // The following input scattering assumes the mouthPressure = area.
112  lastFrame_[0] = deltaPressure * mouthPressure + ( 1.0 - deltaPressure) * borePressure;
113  lastFrame_[0] = delayLine_.tick( dcBlock_.tick( lastFrame_[0] ) );
114 
115  return lastFrame_[0];
116 }
117 
118 inline StkFrames& Brass :: tick( StkFrames& frames, unsigned int channel )
119 {
120  unsigned int nChannels = lastFrame_.channels();
121 #if defined(_STK_DEBUG_)
122  if ( channel > frames.channels() - nChannels ) {
123  oStream_ << "Brass::tick(): channel and StkFrames arguments are incompatible!";
124  handleError( StkError::FUNCTION_ARGUMENT );
125  }
126 #endif
127 
128  StkFloat *samples = &frames[channel];
129  unsigned int j, hop = frames.channels() - nChannels;
130  if ( nChannels == 1 ) {
131  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
132  *samples++ = tick();
133  }
134  else {
135  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
136  *samples++ = tick();
137  for ( j=1; j<nChannels; j++ )
138  *samples++ = lastFrame_[j];
139  }
140  }
141 
142  return frames;
143 }
144 
145 } // stk namespace
146 
147 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/ccrma.gif0000644000076600007660000002016112327015321013421 0ustar garyGIF87aá0÷(`0P(Px¨Äðèðð `ˆÐØØ˜˜ˆ8X °ÄР°¸°Ôè(|°¸Üø°Üø¨À蘸Ș¤¨ \€¸Ðè°Ôð¨¼Ø˜œ Èàø8p(Pˆ˜ 4hˆ” x€ˆ€˜°Øðx|xÀÀ˜ XˆØäè h˜°ÌèPx¨Äè¨Èà0h8Xx¨ØøÈÐØ ¼Ðp„˜¨¸È d ¨°°Øøðì ÄàÈÔà¨Ôð X€ˆœ¨¨Ðð ÀÐT€°ÈðL€Lp4`°Ôø´Èøøøœ¨¸àøÀÌÐðððÈÜè¨´È l˜¨Ðø ¬¸¸ÀÀ¸Ìè*¶‘D^&ßJGætÒNñ™^a%$Yq¥Sv˜ ¥]`å\œþ^—&šgÒÚfq#V!fs(BÇêTyE%•v© Ú2ˆX£‹ÄhêuTHPà 2È[Ô¹áF”¶´KãbDváÂWA |«©’P1Ê÷æÛæ(ÉY@íjGŒH•&̆êƒ)(àÂn½Q‘ë˜Ò*1]ÁõV‡Ç¿Ú ¢í‰¢¸Ý$¹µÈ¢v{ÅødË*ö€¢,蘞´;:¼F8ã¬ÄW4Àó M„K_¹õÍ€H,tóÄðFÏ„)Œ×“ŸÔKyËÛš±çA¯ŽˆDL $þ`› *° a)¬UYQÀÍð†3òÑêoPüª@8î}iŠÏPñûÙïBèL17˹($ À0D•ÍèGžC‰Ìnt7Lákx #è:öAí„.pƒí9®%P ‘ˆD% ÈG úñ‚†ÃRä¬Á0†^ÛØFÐ…J¬!‘U@‚0€I J´0Tà† ¡èL$H>(¦/ Àe¦PÅ?MÊØ(®08.Òï o¸€äº¤ (¬Ez9‰ÌÅ3x#dÓ¬šÐ!<‡ÂŽP¯$2ލÄêræ:.î‘Ák€ÄÅAÁ -þ0g$ô¸ÎÖ9ž…k@Xð˼ð’ÌÛZØÆ=O&’ m@B# `= H•&H•–¦3*Dbi²ÄYùÒ—Ë’î’Š½D!I–a^¡‹^´_%b19í)/hÂ@ f€ƒ‚bHóMÈ` $ª@†Q "‘ŽPë¦JATb‹'Ã\ÀÁ%Ôs ˆÅ È@s>P$Ì[ÓWÅàa I,™µCÔ•k6\:ˆ(°¡T(D A Ô&K¸YX¹P”°8Xâ K\îáð¢Q8‹ôÙ*ô_ýF;¸.œ:w©4M †P¡þj`8ç UtK]d†Ð‰àdxË ÌÚ….Œ€iA–ˆ¼®­ Ðê,ЇêV׃TxÁ¶òðTE* ¹YàB¸À„,¬ ‚실V‡qbí —¼+ ŦW‡6õY €k‘@VlОæ–*øoâŸds…,|`fˆ…êÇV^Á&‡Fñ´˜Š–‹ƒ#VfH¥P R@‰ ¤ÊB#܈,ðp¦E-ɦiN2˜(f­Ä  ÐB%è„:P€ ºUºØ uƒ@…§n@¸‰,n¸0ƒ!˜PèÄ Â°ó¦7ºZgþ#H ä |¾ðU×*€è}ò£øƒ¨1P¢h Tâf—î)‘u³éš…=äÒÁYø)œÒ÷ÙòL£p'ië‡ %Ä€bH`å$Ô"@ b@uvL€„!$Õ;5ꃓ© pÄ'É0ˆ $²/0…‚Ô$PB$žöä1TaÊ}ÐÄ rØT§¢3d0Á ¨)¤v¢%šHš¥;6ô¶T€3œa8C2Ô¡ÚDš  ¡‚6X)¡V‰‚ „,H›¸†)@8 fH8®Ð….Rš­³È0úÖÓN[œÓ¨XC, D2R'B ;Bþ9žQÖ¡€DŒj ž ¨$®µ6j'<½s&r0É‘éSìÁΠv¨Ä ÒP¶:¯@Fr˜Ps›£Ó',ñ¶«;qÍ`¹XÇz`ᆺ}`sœïêˆ ‡wÖÜ ÍN<¥p'„è6…5ŒLKôÝE ˜a¹f˜‚"ßÀé§j¿ô™>¼éûÕ¯l˜B'›Ժ kt5%`Ô $°×l¹w°Y1Øz”˜ÙVàˆ®¡ÐCjG‹#à³Rî%ް{ X÷÷} Cs¸Ï`Áv ØŒ{Rª½u­Ø¿Î±ËÙÝuöä_þ 1ìØíÙB!’Ê%¬ÄB‚{Ï›øò¾XPáá…U-nÌ ÎB—ž=“Ã;MÁvŽV y``•÷L)àmH•QvÐ PàIÅ4æq5t @4@ ƒ@CeWt ”€,Ñ;ö†P;3Ðy@Pà{Õõ/}@•PC«×‡p;· rPÌg;…ÄGpp \éö0}Õw}aÓ­÷I‘ GÀ€§o° (!¦©ãx‡wëp#°GÐËõm USE]Do”e…º‡øBZýw?Ô0 j`|À$C²€þ”0N$@v@É×jÞ` Ð-ˆ(@€­V€Õ0 zÐ bЋ²s°Šd°øgTþƒÀ€P]Z£5_C ±ÀA„;(ØlÀÖ|ãR‘=Ø n`-€HbðŒÓøÕ÷f×7_ïV :Ù là”PÀZ©Öb XÁ#à#°w7R€wj5Žz@»è†SE @õ³t¨ã'”0P?{è:• y˜4À•!H N)r>å°àC÷F-®æ2Ö r€™ÝqoœHlÖ O¸<ÀI@ ¦¨šA Qq‡}àCP yn‚} $àH zp}+PЪ9+IlPobÐ|AÐy… WèG`öFfðMþx0¥YW5¤I£f¦@ ©c- ”àP- f9†> pŽx'Ak@v@ S0$4U°òçõ#QÐ$ðgPÀ{ àTU˜yjˆÉz |˜w’X {$,ؘíåƒIÕ6clF)F jDiðgðuYT‘IC*GÐÖÉ[*Ö0œFàj¸×àŽ3÷Ýù›Z3 Ž(l@NCàN€™¯Ù[ àŽR wrЊx¤/Ê.j}Õ¨P \°{¦@Òt€( ð”Lð5h‰`“ S`\êX÷”àOSå-` þƒ‰ 2°SfQ* a@¨|è:Ž`˜ù@þô –* p‘½%0ç¹›IÅfIfXèŽ')‘lŠ¢pC@ +p/Ú„T0­:&¨ i¤F¬Ú‚²)Qièj¸IŽ8T /g³ÐjUJM ¸ya¥ßÖ‚N)™0–dÃ¥I•n° «T C 6> kDkšjpævr zfy# ¯R0£ç˜~k`…lÀGMS dОíÔ\€C@C€”l@U1¡ j`©¯PÞæ[J ÕDaf+‰”¼%™-0N¬JÃHFzoz ¦/þ£úˆ‰ˆbKT c)è‰ÐºA.(S4¦-›/€T9X H ÐgrP„v°|TÇ¡½EÀ­B›¬O8v˜´Ç‚å™FRZ‰-àas> ¶‹0 Mð=iywk°‹ñ8AMSiÐb óÇ’GFTÀŸyð ’ú ŽðŸd˜¯ TP„0ʪà(ª”@ø|žÊ¦ºW™G‰È±@ ¤ ¦TSTdS'ª9œ7ûg:Új\ð·}ŠC0LÐÝj}Ž ”À°À¼5ŽšPo(‡b`¤”ðœËxœ`€Üú­aþJ•ðµ Ú+g³Jljl ´k¤J8²°'€‹óL SYêYY§L´: Ð |KUL0“ Y÷T™¸ýA0±–z¹Æ&ÞëeÄê~”±0s¬:)†” H£ê‚®ÚÔ˜g@ `Ýæ© Þ× °€ƒ;‹ÃH å~0Ý)«Y3  Xxr€ËS÷V¤ƒµcaЉˆÐŽ©™b@½Û9¦Ø››5ÚkW “ËçgPà”  ÒD-Ъ Ÿi[C^~[b8†—õ›7 GÐË&‰:€ç`SU þIj°G¬“–'@±Sà±àÀl&”î"@C`Æ0Ð0 ºËw…n@.ÈvnàQSéfYÓ¤ h 8L LÐMÀÈ-ØbðÂMð}£;‹<‡0}n&CPÉIÛ[$Ðrë –˜dªa‰ÞHÔ+vÉ*ÊÛ»½Àið˜ËªP TA ™j¶N s*l«¶Ž0·òŠwkèp°{pÇ|?U€Tr‰uf À¬!°GL„}8 À¯€iÃl&¥0˹’mpÉ}lwr@…`ÑêiÅV|Å›à©*jNÉþä%2@^zà¥lFàÀ÷vÊLàÀkÒ"±™ºfÝšà[avrT×C«qT6@]ú̺> ½RmÅ+Ð `a†raÐ0`$©ú± Cóù5i‘¯w'†ŽpŸmy¶\;±y @ }ìÇSU\uw'pRð ,¨LÓÞ6£9S ¤<Ñ @o,ؽѭJ± ÕSí%]Á˧»7-¢-ɧ|‹,± ŠHE \ÐÒL ÙWœÐ¦&rÆ š°Õ¨‚G6H G@‰é&ÊVìÛV|2v ÆÞè½TþA-p… À€+€WR6³pji]h¹Îl‰7Ls¿YàY0xÜ4Sµ;5}ÜÏ«sÀ%4†8ð'ðR@¤@±"0ÓMàÄPp¹,©À%ýØmp€¯¥Ñ @¶@d/Û›ƒ0Ð_Û €à­íÒT ¥m0Ó3mo"g7LÀT°žd`j H™šà€ýCOBJÒ$¼@½¢üÚ; °íZ3 v`n¨F¶r—j*Zv¥ÝÐb0i-e9¯iÉ–´\pç-¸mÀÞìM) „ñM„\B~ Øùý1«iàß3- ÑÙ\À þ%½ γ÷f•ý ð T0äYó—œ ~¾ç2pà7‚ƒÛÚ£}a€Òâ¬Ò¬àš­Å_0î(OŠ ²f…àˆ€¿½êËœ C ê–¤ÙŽ0N‘Ðé›@ä¬`“LÂIH–­6Ùå[ '—ÎX®¶ñªŽy#°€ç` þÔ4`- ðw·­Ó×ð×­ßt0«p@±| íÈ4 "ðè©À ~þØ ;&&pƒáTQœ®½‹5_p%}É{ž )®Ò*ε:£Æ:£FÐð*=Ê _Žp´æFêa€°Pî¨ê”PþV/à³ ! YpÔ‡îã!= pB¾ ,~ëD> ‰ŒŠÒ›ÀT 7å¹Û Lpå_6w·Îw·ÓæÖî1¦Ä}üdp·¬CK~]î'@‡€ »öÙ¸­}଀à0ïù®Ç ê™Yò …à2 SýfÕ'd°è0÷¬ Ò©0F ‡pöhŸö äÅõÞ• ½^@äb'ø<h3Ϊ#‡y°gŸöl@J<.ÒÚë+É£Õ8¯ÅX@-Fà-]ml00M@ ñµe\Øj¯ñú5[~Ëõ}ì\°G«þsµ©—ÊpjÏgß-Øûfoúi¿îlïî¢mø|>^¬LÀ ®k(§Ñ=°÷z_r ʳ"üf‡ â—Ìç{>£kPìH©\`Â…Õ©bmòâå_¾dø²ˆ •š4¹D…JžE‡2 äŒÁ5P!Â@eS†M57Ͳ2DÓ‘*4eà° ¨ˆ cÁ F¨Xº˜AªÉªäÁºaÃ>|œðŠÃÇ#Ò0É’ÅLÚYL(C@Œ™ÌxP›÷™} À%[ljÁ'ýðqeƒ -à#ƒ‰.2R)d•0³©T¦.þ r$ ‰FtzBí¤êBT¼dj±bÅ k6ÄI…Õ R3ZL0A&LX¥‚Á%Uª^8À`ñ íC/Šçmò‚Å .À€ "*4mÞ´Ò¨*•2DÜò%:)*Sìß·¿è—¾5`Íjƒ<¶êʇEFëÀà"‹ÖjK-.ba„.Ì?ü`è ®¿& O Q )èà.b‘@ºN³Ë2S(97:i*èHá´ÓR+Ä*~àŒ$e‹Ê·©¤’“RZqƒBÚxA(¡Îøâ‘éštÒ7:L Ž” yé%™h:¤&œþOQÞ *ƒèÎ8„?ÿôóéž“*€ ªøÀ ô꫱Àò! 3 Lk-3Xñ°Â¾*é‚ÓN;­¤C¸ÊŒ03QŠºk, $¨±8Ì2c3SŒƒ¡*pôBz5Ô†hBϡ³¢&-)3UQ*å,™@.Ë6`h"¡ŽMö"2™Í€Y¶C)Xؤ“Î7mòb–q€ÂÈÃ"¡öÌ袳èÚVÌ¢ +¯qÔÀ5ö0£­IÎMÿò‹®¸.¦0ÁB4õ„9‘»Р1RbŒUÖZY1eåTÚ`b:Å´ìöW!A!àRþxÌ0÷+Ü3¥B`¸XŽÓ’ S`X &´Œå%ÁL–6©ÀMîàb<:p“&š¼@O+P; Gô”/_¹óóŒž;$Îã‚‚ tô@^`8ŠöP B.ÓXÓ ϸ¬ÁF4ì‡BVqE H.¥”öà"åY‘c†…`` 1¨¹;ú¸9çÓì@-ŒY8ÀzL'¹ö ¥@4K®ô,µl£ ,P ƒ4ÎÈB‹–Š”ß<°@l${]‰6qÄ +¾WÛŠ0*á—ù/ÌÏ÷ü0¿â¢Y¬‹8$ðÔF}H#Š(0 Õz 䘱¿à €“3 þ,ç:(fdš[Q`V#ÌÏ‚9*Ž(j¬À®:ã °¨ ˆ Zó ¸T.4DxZÞ–Â`<ä)€ mHƒ¿t—B3e@hLÒÕ&uÍ"™…÷¾gh" ¢°ˆÜÎ'ź) E˜€¨«dÅ`[Pô÷ý=ÌA{`Â_7ÀÆI.D"R Ç.G‡3qg1 @ ¨p 2¡!!êÀ ÒvDä¯t&, "i3RDáZZjÈÓ` É-µÁÆ;ž cƒLÂnìÛT€.„'æÉmOë³[)²þE&À~¤&ýŽa‡3ƒ¤Ö"1Æ©‘€ˆ6Ö1ýÀc'RÌñ••.GP»¤™PȶóˆÄ™"ÃPz½à³Xƒ#B‰Yl`jžL'& ƒO"O)M°!؆00 ÷ „#1‹YX'ãÁ€3z½!aé–ÈÄyiÂFXC V•²t¥*…é "Ú„,î­ ó$*S‰Î‚ †j4ÏØ0.¤4Ÿk@jJሤF”©H „RQªJT¢0 DVµªUË'¥Cgñ. Ö Ò<«;_'¤x «JQ@R The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Chorus.h
1 #ifndef STK_CHORUS_H
2 #define STK_CHORUS_H
3 
4 #include "Effect.h"
5 #include "DelayL.h"
6 #include "SineWave.h"
7 
8 namespace stk {
9 
10 /***************************************************/
19 /***************************************************/
20 
21 class Chorus : public Effect
22 {
23  public:
25 
28  Chorus( StkFloat baseDelay = 6000 );
29 
31  void clear( void );
32 
34  void setModDepth( StkFloat depth );
35 
37  void setModFrequency( StkFloat frequency );
38 
40 
48  StkFloat lastOut( unsigned int channel = 0 );
49 
51 
58  StkFloat tick( StkFloat input, unsigned int channel = 0 );
59 
61 
70  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
71 
73 
82  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
83 
84  protected:
85 
86  DelayL delayLine_[2];
87  SineWave mods_[2];
88  StkFloat baseLength_;
89  StkFloat modDepth_;
90 
91 };
92 
93 inline StkFloat Chorus :: lastOut( unsigned int channel )
94 {
95 #if defined(_STK_DEBUG_)
96  if ( channel > 1 ) {
97  oStream_ << "Chorus::lastOut(): channel argument must be less than 2!";
98  handleError( StkError::FUNCTION_ARGUMENT );
99  }
100 #endif
101 
102  return lastFrame_[channel];
103 }
104 
105 inline StkFloat Chorus :: tick( StkFloat input, unsigned int channel )
106 {
107 #if defined(_STK_DEBUG_)
108  if ( channel > 1 ) {
109  oStream_ << "Chorus::tick(): channel argument must be less than 2!";
110  handleError( StkError::FUNCTION_ARGUMENT );
111  }
112 #endif
113 
114  delayLine_[0].setDelay( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].tick() ) );
115  delayLine_[1].setDelay( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].tick() ) );
116  lastFrame_[0] = effectMix_ * ( delayLine_[0].tick( input ) - input ) + input;
117  lastFrame_[1] = effectMix_ * ( delayLine_[1].tick( input ) - input ) + input;
118  return lastFrame_[channel];
119 }
120 
121 inline StkFrames& Chorus :: tick( StkFrames& frames, unsigned int channel )
122 {
123 #if defined(_STK_DEBUG_)
124  if ( channel >= frames.channels() - 1 ) {
125  oStream_ << "Chorus::tick(): channel and StkFrames arguments are incompatible!";
126  handleError( StkError::FUNCTION_ARGUMENT );
127  }
128 #endif
129 
130  StkFloat *samples = &frames[channel];
131  unsigned int hop = frames.channels() - 1;
132  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
133  delayLine_[0].setDelay( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].tick() ) );
134  delayLine_[1].setDelay( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].tick() ) );
135  *samples = effectMix_ * ( delayLine_[0].tick( *samples ) - *samples ) + *samples;
136  samples++;
137  *samples = effectMix_ * ( delayLine_[1].tick( *samples ) - *samples ) + *samples;
138  }
139 
140  lastFrame_[0] = *(samples-hop);
141  lastFrame_[1] = *(samples-hop+1);
142  return frames;
143 }
144 
145 inline StkFrames& Chorus :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
146 {
147 #if defined(_STK_DEBUG_)
148  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() - 1 ) {
149  oStream_ << "Chorus::tick(): channel and StkFrames arguments are incompatible!";
150  handleError( StkError::FUNCTION_ARGUMENT );
151  }
152 #endif
153 
154  StkFloat *iSamples = &iFrames[iChannel];
155  StkFloat *oSamples = &oFrames[oChannel];
156  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
157  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
158  delayLine_[0].setDelay( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].tick() ) );
159  delayLine_[1].setDelay( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].tick() ) );
160  *oSamples = effectMix_ * ( delayLine_[0].tick( *iSamples ) - *iSamples ) + *iSamples;
161  *(oSamples+1) = effectMix_ * ( delayLine_[1].tick( *iSamples ) - *iSamples ) + *iSamples;
162  }
163 
164  lastFrame_[0] = *(oSamples-oHop);
165  lastFrame_[1] = *(oSamples-oHop+1);
166  return iFrames;
167 }
168 
169 } // stk namespace
170 
171 #endif
172 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Clarinet_8h_source.html0000644000076600007660000005145712327015203016266 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Clarinet.h
1 #ifndef STK_CLARINET_H
2 #define STK_CLARINET_H
3 
4 #include "Instrmnt.h"
5 #include "DelayL.h"
6 #include "ReedTable.h"
7 #include "OneZero.h"
8 #include "Envelope.h"
9 #include "Noise.h"
10 #include "SineWave.h"
11 
12 namespace stk {
13 
14 /***************************************************/
36 /***************************************************/
37 
38 class Clarinet : public Instrmnt
39 {
40  public:
42 
45  Clarinet( StkFloat lowestFrequency = 8.0 );
46 
48  ~Clarinet( void );
49 
51  void clear( void );
52 
54  void setFrequency( StkFloat frequency );
55 
57  void startBlowing( StkFloat amplitude, StkFloat rate );
58 
60  void stopBlowing( StkFloat rate );
61 
63  void noteOn( StkFloat frequency, StkFloat amplitude );
64 
66  void noteOff( StkFloat amplitude );
67 
69  void controlChange( int number, StkFloat value );
70 
72  StkFloat tick( unsigned int channel = 0 );
73 
75 
82  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
83 
84  protected:
85 
86  DelayL delayLine_;
87  ReedTable reedTable_;
88  OneZero filter_;
89  Envelope envelope_;
90  Noise noise_;
91  SineWave vibrato_;
92 
93  StkFloat outputGain_;
94  StkFloat noiseGain_;
95  StkFloat vibratoGain_;
96 };
97 
98 inline StkFloat Clarinet :: tick( unsigned int )
99 {
100  StkFloat pressureDiff;
101  StkFloat breathPressure;
102 
103  // Calculate the breath pressure (envelope + noise + vibrato)
104  breathPressure = envelope_.tick();
105  breathPressure += breathPressure * noiseGain_ * noise_.tick();
106  breathPressure += breathPressure * vibratoGain_ * vibrato_.tick();
107 
108  // Perform commuted loss filtering.
109  pressureDiff = -0.95 * filter_.tick( delayLine_.lastOut() );
110 
111  // Calculate pressure difference of reflected and mouthpiece pressures.
112  pressureDiff = pressureDiff - breathPressure;
113 
114  // Perform non-linear scattering using pressure difference in reed function.
115  lastFrame_[0] = delayLine_.tick(breathPressure + pressureDiff * reedTable_.tick(pressureDiff));
116 
117  // Apply output gain.
118  lastFrame_[0] *= outputGain_;
119 
120  return lastFrame_[0];
121 }
122 
123 inline StkFrames& Clarinet :: tick( StkFrames& frames, unsigned int channel )
124 {
125  unsigned int nChannels = lastFrame_.channels();
126 #if defined(_STK_DEBUG_)
127  if ( channel > frames.channels() - nChannels ) {
128  oStream_ << "Clarinet::tick(): channel and StkFrames arguments are incompatible!";
129  handleError( StkError::FUNCTION_ARGUMENT );
130  }
131 #endif
132 
133  StkFloat *samples = &frames[channel];
134  unsigned int j, hop = frames.channels() - nChannels;
135  if ( nChannels == 1 ) {
136  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
137  *samples++ = tick();
138  }
139  else {
140  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
141  *samples++ = tick();
142  for ( j=1; j<nChannels; j++ )
143  *samples++ = lastFrame_[j];
144  }
145  }
146 
147  return frames;
148 }
149 
150 } // stk namespace
151 
152 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classes.html0000644000076600007660000005636112327015206014205 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Class Index
A | B | C | D | E | F | G | H | I | J | L | M | N | O | P | R | S | T | U | V | W
  A  
Effect (stk)   
  J  
PitShift (stk)   StkError (stk)   
Envelope (stk)   Plucked (stk)   StkFrames (stk)   
ADSR (stk)   
  F  
JCRev (stk)   PoleZero (stk)   RtAudio::StreamOptions   
Asymp (stk)   JetTable (stk)   PRCRev (stk)   RtAudio::StreamParameters   
  B  
FileLoop (stk)   
  L  
  R  
  T  
FileRead (stk)   
BandedWG (stk)   FileWrite (stk)   LentPitShift (stk)   ReedTable (stk)   TapDelay (stk)   
BeeThree (stk)   FileWvIn (stk)   
  M  
Resonate (stk)   TcpClient (stk)   
BiQuad (stk)   FileWvOut (stk)   Rhodey (stk)   TcpServer (stk)   
Blit (stk)   Filter (stk)   Mandolin (stk)   RtAudio   Thread (stk)   
BlitSaw (stk)   Fir (stk)   Mesh2D (stk)   RtAudioError   TubeBell (stk)   
BlitSquare (stk)   Flute (stk)   Skini::Message (stk)   RtMidi   Twang (stk)   
BlowBotl (stk)   FM (stk)   Messager (stk)   RtMidiError   TwoPole (stk)   
BlowHole (stk)   FMVoices (stk)   MidiFileIn (stk)   RtMidiIn   TwoZero (stk)   
Bowed (stk)   FormSwep (stk)   Modal (stk)   RtMidiOut   
  U  
BowTable (stk)   FreeVerb (stk)   ModalBar (stk)   RtWvIn (stk)   
Brass (stk)   Function (stk)   Modulate (stk)   RtWvOut (stk)   UdpSocket (stk)   
  C  
  G  
Moog (stk)   
  S  
  V  
Mutex (stk)   
Chorus (stk)   Generator (stk)   
  N  
Sampler (stk)   Vector3D (stk)   
Clarinet (stk)   Granulate (stk)   Saxofony (stk)   Voicer (stk)   
Cubic (stk)   Guitar (stk)   Noise (stk)   Shakers (stk)   VoicForm (stk)   
  D  
  H  
NRev (stk)   Simple (stk)   
  W  
  O  
SineWave (stk)   
Delay (stk)   HevyMetl (stk)   SingWave (stk)   Whistle (stk)   
DelayA (stk)   
  I  
OnePole (stk)   Sitar (stk)   Wurley (stk)   
DelayL (stk)   OneZero (stk)   Skini (stk)   WvIn (stk)   
RtAudio::DeviceInfo   Iir (stk)   
  P  
Socket (stk)   WvOut (stk)   
Drummer (stk)   InetWvIn (stk)   Sphere (stk)   
  E  
InetWvOut (stk)   PercFlut (stk)   StifKarp (stk)   
Instrmnt (stk)   Phonemes (stk)   Stk (stk)   
Echo (stk)   
A | B | C | D | E | F | G | H | I | J | L | M | N | O | P | R | S | T | U | V | W

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtAudio-members.html0000644000076600007660000002407312327015204016566 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudio Member List

This is the complete list of members for RtAudio, including all inherited members.

abortStream(void)RtAudioinline
Api enum nameRtAudio
closeStream(void)RtAudioinline
getCompiledApi(std::vector< RtAudio::Api > &apis)RtAudiostatic
getCurrentApi(void)RtAudioinline
getDefaultInputDevice(void)RtAudioinline
getDefaultOutputDevice(void)RtAudioinline
getDeviceCount(void)RtAudioinline
getDeviceInfo(unsigned int device)RtAudioinline
getStreamLatency(void)RtAudioinline
getStreamSampleRate(void)RtAudioinline
getStreamTime(void)RtAudioinline
getVersion(void)RtAudiostatic
isStreamOpen(void) const RtAudioinline
isStreamRunning(void) const RtAudioinline
LINUX_ALSA enum valueRtAudio
LINUX_OSS enum valueRtAudio
LINUX_PULSE enum valueRtAudio
MACOSX_CORE enum valueRtAudio
openStream(RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData=NULL, RtAudio::StreamOptions *options=NULL, RtAudioErrorCallback errorCallback=NULL)RtAudio
RtAudio(RtAudio::Api api=UNSPECIFIED)RtAudio
RTAUDIO_DUMMY enum valueRtAudio
setStreamTime(double time)RtAudioinline
showWarnings(bool value=true)RtAudioinline
startStream(void)RtAudioinline
stopStream(void)RtAudioinline
UNIX_JACK enum valueRtAudio
UNSPECIFIED enum valueRtAudio
WINDOWS_ASIO enum valueRtAudio
WINDOWS_DS enum valueRtAudio
WINDOWS_WASAPI enum valueRtAudio
~RtAudio()RtAudio

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtAudio.html0000644000076600007660000014436712327015204015147 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Realtime audio i/o C++ classes. More...

#include <RtAudio.h>

Classes

struct  DeviceInfo
 The public device information structure for returning queried values. More...
 
struct  StreamOptions
 The structure for specifying stream options. More...
 
struct  StreamParameters
 The structure for specifying input or ouput stream parameters. More...
 

Public Types

enum  Api {
  UNSPECIFIED, LINUX_ALSA, LINUX_PULSE, LINUX_OSS,
  UNIX_JACK, MACOSX_CORE, WINDOWS_WASAPI, WINDOWS_ASIO,
  WINDOWS_DS, RTAUDIO_DUMMY
}
 Audio API specifier arguments. More...
 

Public Member Functions

 RtAudio (RtAudio::Api api=UNSPECIFIED)
 The class constructor. More...
 
 ~RtAudio () throw ()
 The destructor. More...
 
RtAudio::Api getCurrentApi (void) throw ()
 Returns the audio API specifier for the current instance of RtAudio.
 
unsigned int getDeviceCount (void) throw ()
 A public function that queries for the number of audio devices available. More...
 
RtAudio::DeviceInfo getDeviceInfo (unsigned int device)
 Return an RtAudio::DeviceInfo structure for a specified device number. More...
 
unsigned int getDefaultOutputDevice (void) throw ()
 A function that returns the index of the default output device. More...
 
unsigned int getDefaultInputDevice (void) throw ()
 A function that returns the index of the default input device. More...
 
void openStream (RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData=NULL, RtAudio::StreamOptions *options=NULL, RtAudioErrorCallback errorCallback=NULL)
 A public function for opening a stream with the specified parameters. More...
 
void closeStream (void) throw ()
 A function that closes a stream and frees any associated stream memory. More...
 
void startStream (void)
 A function that starts a stream. More...
 
void stopStream (void)
 Stop a stream, allowing any samples remaining in the output queue to be played. More...
 
void abortStream (void)
 Stop a stream, discarding any samples remaining in the input/output queue. More...
 
bool isStreamOpen (void) const throw ()
 Returns true if a stream is open and false if not.
 
bool isStreamRunning (void) const throw ()
 Returns true if the stream is running and false if it is stopped or not open.
 
double getStreamTime (void)
 Returns the number of elapsed seconds since the stream was started. More...
 
void setStreamTime (double time)
 Set the stream time to a time in seconds greater than or equal to 0.0. More...
 
long getStreamLatency (void)
 Returns the internal stream latency in sample frames. More...
 
unsigned int getStreamSampleRate (void)
 Returns actual sample rate in use by the stream. More...
 
void showWarnings (bool value=true) throw ()
 Specify whether warning messages should be printed to stderr.
 

Static Public Member Functions

static std::string getVersion (void) throw ()
 A static function to determine the current RtAudio version.
 
static void getCompiledApi (std::vector< RtAudio::Api > &apis) throw ()
 A static function to determine the available compiled audio APIs. More...
 

Detailed Description

Realtime audio i/o C++ classes.

RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), Macintosh OS X (CoreAudio and Jack), and Windows (DirectSound, ASIO and WASAPI) operating systems.

RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/

RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2014 Gary P. Scavone

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Member Enumeration Documentation

Audio API specifier arguments.

Enumerator
UNSPECIFIED 

Search for a working compiled API.

LINUX_ALSA 

The Advanced Linux Sound Architecture API.

LINUX_PULSE 

The Linux PulseAudio API.

LINUX_OSS 

The Linux Open Sound System API.

UNIX_JACK 

The Jack Low-Latency Audio Server API.

MACOSX_CORE 

Macintosh OS-X Core Audio API.

WINDOWS_WASAPI 

The Microsoft WASAPI API.

WINDOWS_ASIO 

The Steinberg Audio Stream I/O API.

WINDOWS_DS 

The Microsoft Direct Sound API.

RTAUDIO_DUMMY 

A compilable but non-functional API.

266  {
267  UNSPECIFIED,
268  LINUX_ALSA,
269  LINUX_PULSE,
270  LINUX_OSS,
271  UNIX_JACK,
272  MACOSX_CORE,
274  WINDOWS_ASIO,
275  WINDOWS_DS,
277  };

Constructor & Destructor Documentation

RtAudio::RtAudio ( RtAudio::Api  api = UNSPECIFIED)

The class constructor.

The constructor performs minor initialization tasks. An exception can be thrown if no API support is compiled.

If no API argument is specified and multiple API support has been compiled, the default order of use is JACK, ALSA, OSS (Linux systems) and ASIO, DS (Windows systems).

RtAudio::~RtAudio ( ) throw ()

The destructor.

If a stream is running or open, it will be stopped and closed automatically.

Member Function Documentation

static void RtAudio::getCompiledApi ( std::vector< RtAudio::Api > &  apis) throw ()
static

A static function to determine the available compiled audio APIs.

The values returned in the std::vector can be compared against the enumerated list values. Note that there can be more than one API compiled for certain operating systems.

unsigned int RtAudio::getDeviceCount ( void  ) throw ()
inline

A public function that queries for the number of audio devices available.

This function performs a system query of available devices each time it is called, thus supporting devices connected after instantiation. If a system error occurs during processing, a warning will be issued.

827 { return rtapi_->getDeviceCount(); }
RtAudio::DeviceInfo RtAudio::getDeviceInfo ( unsigned int  device)
inline

Return an RtAudio::DeviceInfo structure for a specified device number.

Any device integer between 0 and getDeviceCount() - 1 is valid. If an invalid argument is provided, an RtAudioError (type = INVALID_USE) will be thrown. If a device is busy or otherwise unavailable, the structure member "probed" will have a value of "false" and all other members are undefined. If the specified device is the current default input or output device, the corresponding "isDefault" member will have a value of "true".

828 { return rtapi_->getDeviceInfo( device ); }
unsigned int RtAudio::getDefaultOutputDevice ( void  ) throw ()
inline

A function that returns the index of the default output device.

If the underlying audio API does not provide a "default device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream.

830 { return rtapi_->getDefaultOutputDevice(); }
unsigned int RtAudio::getDefaultInputDevice ( void  ) throw ()
inline

A function that returns the index of the default input device.

If the underlying audio API does not provide a "default device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream.

829 { return rtapi_->getDefaultInputDevice(); }
void RtAudio::openStream ( RtAudio::StreamParameters outputParameters,
RtAudio::StreamParameters inputParameters,
RtAudioFormat  format,
unsigned int  sampleRate,
unsigned int *  bufferFrames,
RtAudioCallback  callback,
void *  userData = NULL,
RtAudio::StreamOptions options = NULL,
RtAudioErrorCallback  errorCallback = NULL 
)

A public function for opening a stream with the specified parameters.

An RtAudioError (type = SYSTEM_ERROR) is thrown if a stream cannot be opened with the specified parameters or an error occurs during processing. An RtAudioError (type = INVALID_USE) is thrown if any invalid device ID or channel number parameters are specified.

Parameters
outputParametersSpecifies output stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For input-only streams, this argument should be NULL. The device ID is an index value between 0 and getDeviceCount() - 1.
inputParametersSpecifies input stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For output-only streams, this argument should be NULL. The device ID is an index value between 0 and getDeviceCount() - 1.
formatAn RtAudioFormat specifying the desired sample data format.
sampleRateThe desired sample rate (sample frames per second).
*bufferFramesA pointer to a value indicating the desired internal buffer size in sample frames. The actual value used by the device is returned via the same pointer. A value of zero can be specified, in which case the lowest allowable value is determined.
callbackA client-defined function that will be invoked when input data is available and/or output data is needed.
userDataAn optional pointer to data that can be accessed from within the callback function.
optionsAn optional pointer to a structure containing various global stream options, including a list of OR'ed RtAudioStreamFlags and a suggested number of stream buffers that can be used to control stream latency. More buffers typically result in more robust performance, though at a cost of greater latency. If a value of zero is specified, a system-specific median value is chosen. If the RTAUDIO_MINIMIZE_LATENCY flag bit is set, the lowest allowable value is used. The actual value used is returned via the structure argument. The parameter is API dependent.
errorCallbackA client-defined function that will be invoked when an error has occured.
void RtAudio::closeStream ( void  ) throw ()
inline

A function that closes a stream and frees any associated stream memory.

If a stream is not open, this function issues a warning and returns (no exception is thrown).

831 { return rtapi_->closeStream(); }
void RtAudio::startStream ( void  )
inline

A function that starts a stream.

An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtAudioError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already running.

832 { return rtapi_->startStream(); }
void RtAudio::stopStream ( void  )
inline

Stop a stream, allowing any samples remaining in the output queue to be played.

An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtAudioError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped.

833 { return rtapi_->stopStream(); }
void RtAudio::abortStream ( void  )
inline

Stop a stream, discarding any samples remaining in the input/output queue.

An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtAudioError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped.

834 { return rtapi_->abortStream(); }
double RtAudio::getStreamTime ( void  )
inline

Returns the number of elapsed seconds since the stream was started.

If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown.

839 { return rtapi_->getStreamTime(); }
void RtAudio::setStreamTime ( double  time)
inline

Set the stream time to a time in seconds greater than or equal to 0.0.

If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown.

840 { return rtapi_->setStreamTime( time ); }
long RtAudio::getStreamLatency ( void  )
inline

Returns the internal stream latency in sample frames.

The stream latency refers to delay in audio input and/or output caused by internal buffering by the audio system and/or hardware. For duplex streams, the returned value will represent the sum of the input and output latencies. If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. If the API does not report latency, the return value will be zero.

837 { return rtapi_->getStreamLatency(); }
unsigned int RtAudio::getStreamSampleRate ( void  )
inline

Returns actual sample rate in use by the stream.

On some systems, the sample rate used may be slightly different than that specified in the stream parameters. If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown.

838 { return rtapi_->getStreamSampleRate(); }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtAudioError-members.html0000644000076600007660000001523612327015204017601 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudioError Member List

This is the complete list of members for RtAudioError, including all inherited members.

DEBUG_WARNING enum valueRtAudioError
DRIVER_ERROR enum valueRtAudioError
getMessage(void) const RtAudioErrorinlinevirtual
getType(void) const RtAudioErrorinlinevirtual
INVALID_DEVICE enum valueRtAudioError
INVALID_PARAMETER enum valueRtAudioError
INVALID_USE enum valueRtAudioError
MEMORY_ERROR enum valueRtAudioError
NO_DEVICES_FOUND enum valueRtAudioError
printMessage(void) const RtAudioErrorinlinevirtual
RtAudioError(const std::string &message, Type type=RtAudioError::UNSPECIFIED)RtAudioErrorinline
SYSTEM_ERROR enum valueRtAudioError
THREAD_ERROR enum valueRtAudioError
Type enum nameRtAudioError
UNSPECIFIED enum valueRtAudioError
WARNING enum valueRtAudioError
what(void) const RtAudioErrorinlinevirtual
~RtAudioError(void)RtAudioErrorinlinevirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtAudioError.html0000644000076600007660000003622312327015204016150 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudioError Class Reference

Exception handling class for RtAudio. More...

#include <RtAudio.h>

Inheritance diagram for RtAudioError:

Public Types

enum  Type {
  WARNING, DEBUG_WARNING, UNSPECIFIED, NO_DEVICES_FOUND,
  INVALID_DEVICE, MEMORY_ERROR, INVALID_PARAMETER, INVALID_USE,
  DRIVER_ERROR, SYSTEM_ERROR, THREAD_ERROR
}
 Defined RtAudioError types. More...
 

Public Member Functions

 RtAudioError (const std::string &message, Type type=RtAudioError::UNSPECIFIED) throw ()
 The constructor.
 
virtual ~RtAudioError (void) throw ()
 The destructor.
 
virtual void printMessage (void) const throw ()
 Prints thrown error message to stderr.
 
virtual const TypegetType (void) const throw ()
 Returns the thrown error message type.
 
virtual const std::string & getMessage (void) const throw ()
 Returns the thrown error message string.
 
virtual const char * what (void) const throw ()
 Returns the thrown error message as a c-style string.
 

Detailed Description

Exception handling class for RtAudio.

The RtAudioError class is quite simple but it does allow errors to be "caught" by RtAudioError::Type. See the RtAudio documentation to know which methods can throw an RtAudioError.

Member Enumeration Documentation

Defined RtAudioError types.

Enumerator
WARNING 

A non-critical error.

DEBUG_WARNING 

A non-critical error which might be useful for debugging.

UNSPECIFIED 

The default, unspecified error type.

NO_DEVICES_FOUND 

No devices found on system.

INVALID_DEVICE 

An invalid device ID was specified.

MEMORY_ERROR 

An error occured during memory allocation.

INVALID_PARAMETER 

An invalid parameter was specified to a function.

INVALID_USE 

The function was called incorrectly.

DRIVER_ERROR 

A system driver error occured.

SYSTEM_ERROR 

A system error occured.

THREAD_ERROR 

A thread error occured.

202  {
203  WARNING,
204  DEBUG_WARNING,
205  UNSPECIFIED,
208  MEMORY_ERROR,
210  INVALID_USE,
211  DRIVER_ERROR,
212  SYSTEM_ERROR,
213  THREAD_ERROR
214  };

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtAudioError.png0000644000076600007660000000067312327015204015770 0ustar gary‰PNG  IHDRXPªBkPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2JIDATxíÑ®Ã0Cí—úÿÿø¶M$éº\©©4)^ #BОA’3JÒýJðãàÃøG²5ô4ú°$ur0·Üå+D•¶öX£×n_ ¦ä+¢|Å¥¸‚¯WûÜ[ ªût³oEÞ>-¸ø†ÁML{™ámá×`J¾šV—7Ðã÷­xM……}˜ ›!ó¶B’Æõaß/%éB ~L’ÃZ`†f—eyxåÎ!OáT$8ÁÐ(Á €Z N0ÔJð¯€Ir†@¸_ ~\®ró?€¸V‡ûŽ{€w ฽?Heœ²[Ù–§h·Ë›ŸÊâÊW9Á‹w^q£}_üÑÁGÚXÂU{°ñ·êBÚ'{Þ*I®š=Û[Îí`kî `sù8ôSÑõا"ÿ+T+Áß &É ú# 2ä¿*2IEND®B`‚stk-4.5.0/doc/html/classRtMidi-members.html0000644000076600007660000001346612327015204016413 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtMidi Member List

This is the complete list of members for RtMidi, including all inherited members.

Api enum nameRtMidi
closePort(void)=0RtMidipure virtual
getCompiledApi(std::vector< RtMidi::Api > &apis)RtMidistatic
getPortCount()=0RtMidipure virtual
getPortName(unsigned int portNumber=0)=0RtMidipure virtual
getVersion(void)RtMidistatic
isPortOpen(void) const =0RtMidipure virtual
LINUX_ALSA enum valueRtMidi
MACOSX_CORE enum valueRtMidi
openPort(unsigned int portNumber=0, const std::string portName=std::string("RtMidi"))=0RtMidipure virtual
openVirtualPort(const std::string portName=std::string("RtMidi"))=0RtMidipure virtual
RTMIDI_DUMMY enum valueRtMidi
setErrorCallback(RtMidiErrorCallback errorCallback=NULL)=0RtMidipure virtual
UNIX_JACK enum valueRtMidi
UNSPECIFIED enum valueRtMidi
WINDOWS_MM enum valueRtMidi

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtMidi.html0000644000076600007660000004467412327015204014770 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


An abstract base class for realtime MIDI input/output. More...

#include <RtMidi.h>

Inheritance diagram for RtMidi:
RtMidiIn RtMidiOut

Public Types

enum  Api {
  UNSPECIFIED, MACOSX_CORE, LINUX_ALSA, UNIX_JACK,
  WINDOWS_MM, RTMIDI_DUMMY
}
 MIDI API specifier arguments. More...
 

Public Member Functions

virtual void openPort (unsigned int portNumber=0, const std::string portName=std::string("RtMidi"))=0
 Pure virtual openPort() function.
 
virtual void openVirtualPort (const std::string portName=std::string("RtMidi"))=0
 Pure virtual openVirtualPort() function.
 
virtual unsigned int getPortCount ()=0
 Pure virtual getPortCount() function.
 
virtual std::string getPortName (unsigned int portNumber=0)=0
 Pure virtual getPortName() function.
 
virtual void closePort (void)=0
 Pure virtual closePort() function.
 
virtual bool isPortOpen (void) const =0
 Returns true if a port is open and false if not.
 
virtual void setErrorCallback (RtMidiErrorCallback errorCallback=NULL)=0
 Set an error callback function to be invoked when an error has occured. More...
 

Static Public Member Functions

static std::string getVersion (void) throw ()
 A static function to determine the current RtMidi version.
 
static void getCompiledApi (std::vector< RtMidi::Api > &apis) throw ()
 A static function to determine the available compiled MIDI APIs. More...
 

Detailed Description

An abstract base class for realtime MIDI input/output.

This class implements some common functionality for the realtime MIDI input/output subclasses RtMidiIn and RtMidiOut.

RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/

RtMidi: realtime MIDI i/o C++ classes Copyright (c) 2003-2014 Gary P. Scavone

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Member Enumeration Documentation

MIDI API specifier arguments.

Enumerator
UNSPECIFIED 

Search for a working compiled API.

MACOSX_CORE 

Macintosh OS-X Core Midi API.

LINUX_ALSA 

The Advanced Linux Sound Architecture API.

UNIX_JACK 

The JACK Low-Latency MIDI Server API.

WINDOWS_MM 

The Microsoft Multimedia MIDI API.

RTMIDI_DUMMY 

A compilable but non-functional API.

121  {
122  UNSPECIFIED,
123  MACOSX_CORE,
124  LINUX_ALSA,
125  UNIX_JACK,
126  WINDOWS_MM,
127  RTMIDI_DUMMY
128  };

Member Function Documentation

static void RtMidi::getCompiledApi ( std::vector< RtMidi::Api > &  apis) throw ()
static

A static function to determine the available compiled MIDI APIs.

The values returned in the std::vector can be compared against the enumerated list values. Note that there can be more than one API compiled for certain operating systems.

virtual void RtMidi::setErrorCallback ( RtMidiErrorCallback  errorCallback = NULL)
pure virtual

Set an error callback function to be invoked when an error has occured.

The callback function will be called whenever an error has occured. It is best to set the error callback function before opening a port.

Implemented in RtMidiOut, and RtMidiIn.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtMidi.png0000644000076600007660000000102212327015204014564 0ustar gary‰PNG  IHDRPÁp >PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2¡IDATxíárƒ —ïf|ÿG®Æ Õ“ô2î„^èÇrö/@)¥Ô ÀqôÇ…€GxüµÐrqF–Ïò°(~N(/|¿ÑÅÅ^[üCBS› ¡[ÏÆÊÉš=?=Ô€ü|ô = Ö¡¼vÙž ê UÍ:é -BË ÊnçÜ2€—!ð!¯J)¥>>Èp%®&4 3ºšÐès-£Ë Å-ð !ð!ÿ,4 Ãpº÷ð!ð!ð!ðh33sÌÌ\Ž 3Iꢒ¤.BH’ The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtMidiError Member List

This is the complete list of members for RtMidiError, including all inherited members.

DEBUG_WARNING enum valueRtMidiError
DRIVER_ERROR enum valueRtMidiError
getMessage(void) const RtMidiErrorinlinevirtual
getType(void) const RtMidiErrorinlinevirtual
INVALID_DEVICE enum valueRtMidiError
INVALID_PARAMETER enum valueRtMidiError
INVALID_USE enum valueRtMidiError
MEMORY_ERROR enum valueRtMidiError
NO_DEVICES_FOUND enum valueRtMidiError
printMessage(void) const RtMidiErrorinlinevirtual
RtMidiError(const std::string &message, Type type=RtMidiError::UNSPECIFIED)RtMidiErrorinline
SYSTEM_ERROR enum valueRtMidiError
THREAD_ERROR enum valueRtMidiError
Type enum nameRtMidiError
UNSPECIFIED enum valueRtMidiError
WARNING enum valueRtMidiError
what(void) const RtMidiErrorinlinevirtual
~RtMidiError(void)RtMidiErrorinlinevirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtMidiError.html0000644000076600007660000003622112327015204015767 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtMidiError Class Reference

Exception handling class for RtMidi. More...

#include <RtMidi.h>

Inheritance diagram for RtMidiError:

Public Types

enum  Type {
  WARNING, DEBUG_WARNING, UNSPECIFIED, NO_DEVICES_FOUND,
  INVALID_DEVICE, MEMORY_ERROR, INVALID_PARAMETER, INVALID_USE,
  DRIVER_ERROR, SYSTEM_ERROR, THREAD_ERROR
}
 Defined RtMidiError types. More...
 

Public Member Functions

 RtMidiError (const std::string &message, Type type=RtMidiError::UNSPECIFIED) throw ()
 The constructor.
 
virtual ~RtMidiError (void) throw ()
 The destructor.
 
virtual void printMessage (void) const throw ()
 Prints thrown error message to stderr.
 
virtual const TypegetType (void) const throw ()
 Returns the thrown error message type.
 
virtual const std::string & getMessage (void) const throw ()
 Returns the thrown error message string.
 
virtual const char * what (void) const throw ()
 Returns the thrown error message as a c-style string.
 

Detailed Description

Exception handling class for RtMidi.

The RtMidiError class is quite simple but it does allow errors to be "caught" by RtMidiError::Type. See the RtMidi documentation to know which methods can throw an RtMidiError.

Member Enumeration Documentation

Defined RtMidiError types.

Enumerator
WARNING 

A non-critical error.

DEBUG_WARNING 

A non-critical error which might be useful for debugging.

UNSPECIFIED 

The default, unspecified error type.

NO_DEVICES_FOUND 

No devices found on system.

INVALID_DEVICE 

An invalid device ID was specified.

MEMORY_ERROR 

An error occured during memory allocation.

INVALID_PARAMETER 

An invalid parameter was specified to a function.

INVALID_USE 

The function was called incorrectly.

DRIVER_ERROR 

A system driver error occured.

SYSTEM_ERROR 

A system error occured.

THREAD_ERROR 

A thread error occured.

67  {
68  WARNING,
70  UNSPECIFIED,
73  MEMORY_ERROR,
75  INVALID_USE,
76  DRIVER_ERROR,
77  SYSTEM_ERROR,
79  };

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtMidiError.png0000644000076600007660000000066712327015204015614 0ustar gary‰PNG  IHDRXPªBkPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2FIDATxíѮà Cí—úÿÿxmÂÆ¸W£Ò´T¸-Yz Ú3Hr…@Iú¼|;8OþPlO}šý °$u20ÚéVe§Hi혔Ǟ•C笊µ`J6ê‰(õƒR=ª˜7ßY45Ôú4®Ù[у˃SlìrüfV‹ôÁ”l8+òæMxüÚŠëT”´7§¢œ¡{j…$ÍëÍw¿–¤| ˜$¦µÀ ­oÛ"ò*ðÎ]C^þÂSà€S€ ­`hà_“ä ðyønpÚÎ#z…í5½å-€¡¸äRíÓ | >O¡Ï5œ‰ÕJÒ—é–r=êUljg¸\ÂÀ¹^Îk7öؽǥ‰F£Ž+½è4eÅ:p‹ë<þ¸8l5®ö;íTÄt ðwƒIrù*2ØÊ"†”IEND®B`‚stk-4.5.0/doc/html/classRtMidiIn-members.html0000644000076600007660000002046012327015204016672 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtMidiIn Member List

This is the complete list of members for RtMidiIn, including all inherited members.

Api enum nameRtMidi
cancelCallback()RtMidiIninline
closePort(void)RtMidiIninlinevirtual
getCompiledApi(std::vector< RtMidi::Api > &apis)RtMidistatic
getCurrentApi(void)RtMidiIninline
getMessage(std::vector< unsigned char > *message)RtMidiIninline
getPortCount()RtMidiIninlinevirtual
getPortName(unsigned int portNumber=0)RtMidiIninlinevirtual
getVersion(void)RtMidistatic
ignoreTypes(bool midiSysex=true, bool midiTime=true, bool midiSense=true)RtMidiIninline
isPortOpen() const RtMidiIninlinevirtual
LINUX_ALSA enum valueRtMidi
MACOSX_CORE enum valueRtMidi
openPort(unsigned int portNumber=0, const std::string portName=std::string("RtMidi Input"))RtMidiIninlinevirtual
openVirtualPort(const std::string portName=std::string("RtMidi Input"))RtMidiIninlinevirtual
RTMIDI_DUMMY enum valueRtMidi
RtMidiCallback typedefRtMidiIn
RtMidiIn(RtMidi::Api api=UNSPECIFIED, const std::string clientName=std::string("RtMidi Input Client"), unsigned int queueSizeLimit=100)RtMidiIn
setCallback(RtMidiCallback callback, void *userData=0)RtMidiIninline
setErrorCallback(RtMidiErrorCallback errorCallback=NULL)RtMidiIninlinevirtual
UNIX_JACK enum valueRtMidi
UNSPECIFIED enum valueRtMidi
WINDOWS_MM enum valueRtMidi
~RtMidiIn(void)RtMidiIn

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtMidiIn.html0000644000076600007660000010112212327015204015235 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


A realtime MIDI input class. More...

#include <RtMidi.h>

Inheritance diagram for RtMidiIn:
RtMidi

Public Types

typedef void(* RtMidiCallback )(double timeStamp, std::vector< unsigned char > *message, void *userData)
 User callback function type definition.
 
- Public Types inherited from RtMidi
enum  Api {
  UNSPECIFIED, MACOSX_CORE, LINUX_ALSA, UNIX_JACK,
  WINDOWS_MM, RTMIDI_DUMMY
}
 MIDI API specifier arguments. More...
 

Public Member Functions

 RtMidiIn (RtMidi::Api api=UNSPECIFIED, const std::string clientName=std::string("RtMidi Input Client"), unsigned int queueSizeLimit=100)
 Default constructor that allows an optional api, client name and queue size. More...
 
 ~RtMidiIn (void) throw ()
 If a MIDI connection is still open, it will be closed by the destructor.
 
RtMidi::Api getCurrentApi (void) throw ()
 Returns the MIDI API specifier for the current instance of RtMidiIn.
 
void openPort (unsigned int portNumber=0, const std::string portName=std::string("RtMidi Input"))
 Open a MIDI input connection given by enumeration number. More...
 
void openVirtualPort (const std::string portName=std::string("RtMidi Input"))
 Create a virtual input port, with optional name, to allow software connections (OS X, JACK and ALSA only). More...
 
void setCallback (RtMidiCallback callback, void *userData=0)
 Set a callback function to be invoked for incoming MIDI messages. More...
 
void cancelCallback ()
 Cancel use of the current callback function (if one exists). More...
 
void closePort (void)
 Close an open MIDI connection (if one exists).
 
virtual bool isPortOpen () const
 Returns true if a port is open and false if not.
 
unsigned int getPortCount ()
 Return the number of available MIDI input ports. More...
 
std::string getPortName (unsigned int portNumber=0)
 Return a string identifier for the specified MIDI input port number. More...
 
void ignoreTypes (bool midiSysex=true, bool midiTime=true, bool midiSense=true)
 Specify whether certain MIDI message types should be queued or ignored during input. More...
 
double getMessage (std::vector< unsigned char > *message)
 Fill the user-provided vector with the data bytes for the next available MIDI message in the input queue and return the event delta-time in seconds. More...
 
virtual void setErrorCallback (RtMidiErrorCallback errorCallback=NULL)
 Set an error callback function to be invoked when an error has occured. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from RtMidi
static std::string getVersion (void) throw ()
 A static function to determine the current RtMidi version.
 
static void getCompiledApi (std::vector< RtMidi::Api > &apis) throw ()
 A static function to determine the available compiled MIDI APIs. More...
 

Detailed Description

A realtime MIDI input class.

This class provides a common, platform-independent API for realtime MIDI input. It allows access to a single MIDI input port. Incoming MIDI messages are either saved to a queue for retrieval using the getMessage() function or immediately passed to a user-specified callback function. Create multiple instances of this class to connect to more than one MIDI device at the same time. With the OS-X, Linux ALSA, and JACK MIDI APIs, it is also possible to open a virtual input port to which other MIDI software clients can connect.

by Gary P. Scavone, 2003-2014.

Constructor & Destructor Documentation

RtMidiIn::RtMidiIn ( RtMidi::Api  api = UNSPECIFIED,
const std::string  clientName = std::string("RtMidi Input Client"),
unsigned int  queueSizeLimit = 100 
)

Default constructor that allows an optional api, client name and queue size.

An exception will be thrown if a MIDI system initialization error occurs. The queue size defines the maximum number of messages that can be held in the MIDI queue (when not using a callback function). If the queue size limit is reached, incoming messages will be ignored.

If no API argument is specified and multiple API support has been compiled, the default order of use is ALSA, JACK (Linux) and CORE, JACK (OS-X).

Parameters
apiAn optional API id can be specified.
clientNameAn optional client name can be specified. This will be used to group the ports that are created by the application.
queueSizeLimitAn optional size of the MIDI input queue can be specified.

Member Function Documentation

void RtMidiIn::openPort ( unsigned int  portNumber = 0,
const std::string  portName = std::string( "RtMidi Input" ) 
)
inlinevirtual

Open a MIDI input connection given by enumeration number.

Parameters
portNumberAn optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened.
portNameAn optional name for the application port that is used to connect to portId can be specified.

Implements RtMidi.

540 { rtapi_->openPort( portNumber, portName ); }
void RtMidiIn::openVirtualPort ( const std::string  portName = std::string( "RtMidi Input" ))
inlinevirtual

Create a virtual input port, with optional name, to allow software connections (OS X, JACK and ALSA only).

This function creates a virtual MIDI input port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X, any JACK, and Linux ALSA APIs (the function returns an error for the other APIs).

Parameters
portNameAn optional name for the application port that is used to connect to portId can be specified.

Implements RtMidi.

541 { rtapi_->openVirtualPort( portName ); }
void RtMidiIn::setCallback ( RtMidiCallback  callback,
void *  userData = 0 
)
inline

Set a callback function to be invoked for incoming MIDI messages.

The callback function will be called whenever an incoming MIDI message is received. While not absolutely necessary, it is best to set the callback function before opening a MIDI port to avoid leaving some messages in the queue.

Parameters
callbackA callback function must be given.
userDataOptionally, a pointer to additional data can be passed to the callback function whenever it is called.
544 { ((MidiInApi *)rtapi_)->setCallback( callback, userData ); }
void RtMidiIn::cancelCallback ( void  )
inline

Cancel use of the current callback function (if one exists).

Subsequent incoming MIDI messages will be written to the queue and can be retrieved with the getMessage function.

545 { ((MidiInApi *)rtapi_)->cancelCallback(); }
unsigned int RtMidiIn::getPortCount ( void  )
inlinevirtual

Return the number of available MIDI input ports.

Returns
This function returns the number of MIDI ports of the selected API.

Implements RtMidi.

546 { return rtapi_->getPortCount(); }
std::string RtMidiIn::getPortName ( unsigned int  portNumber = 0)
inlinevirtual

Return a string identifier for the specified MIDI input port number.

Returns
The name of the port with the given Id is returned.
Return values
Anempty string is returned if an invalid port specifier is provided.

Implements RtMidi.

547 { return rtapi_->getPortName( portNumber ); }
void RtMidiIn::ignoreTypes ( bool  midiSysex = true,
bool  midiTime = true,
bool  midiSense = true 
)
inline

Specify whether certain MIDI message types should be queued or ignored during input.

By default, MIDI timing and active sensing messages are ignored during message input because of their relative high data rates. MIDI sysex messages are ignored by default as well. Variable values of "true" imply that the respective message type will be ignored.

548 { ((MidiInApi *)rtapi_)->ignoreTypes( midiSysex, midiTime, midiSense ); }
double RtMidiIn::getMessage ( std::vector< unsigned char > *  message)
inline

Fill the user-provided vector with the data bytes for the next available MIDI message in the input queue and return the event delta-time in seconds.

This function returns immediately whether a new message is available or not. A valid message is indicated by a non-zero vector size. An exception is thrown if an error occurs during message retrieval or an input connection was not previously established.

549 { return ((MidiInApi *)rtapi_)->getMessage( message ); }
void RtMidiIn::setErrorCallback ( RtMidiErrorCallback  errorCallback = NULL)
inlinevirtual

Set an error callback function to be invoked when an error has occured.

The callback function will be called whenever an error has occured. It is best to set the error callback function before opening a port.

Implements RtMidi.

550 { rtapi_->setErrorCallback(errorCallback); }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtMidiIn.png0000644000076600007660000000053712327015204015065 0ustar gary‰PNG  IHDR9P”=-%PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2îIDATxíá®Ã Fôýù®:Åv›¶ìG³[¿H‘Bû˜™…„©ªtORÖgÝÓÊ®j6Î7¤G¤ u«‡r-ÜéÏÑš¨o5Ç>w並µÏLèrS~Ôg!K—žd0[UÕ£š¤ªjO‘ff|ÔR˜\–(&`“—Ìv’]M §Iô4I€žþ)"ÐíÈ<®ÕQs¹™­m '›ˆìznõp@¦ïädºEŠ)«æ{[3MüÞúÜçŽDðõJº |‚Üô$wñÇÈÒ¥G¾^à–<À)ý)"Ñ-  O&^IEND®B`‚stk-4.5.0/doc/html/classRtMidiOut-members.html0000644000076600007660000001631412327015204017076 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtMidiOut Member List

This is the complete list of members for RtMidiOut, including all inherited members.

Api enum nameRtMidi
closePort(void)RtMidiOutinlinevirtual
getCompiledApi(std::vector< RtMidi::Api > &apis)RtMidistatic
getCurrentApi(void)RtMidiOutinline
getPortCount(void)RtMidiOutinlinevirtual
getPortName(unsigned int portNumber=0)RtMidiOutinlinevirtual
getVersion(void)RtMidistatic
isPortOpen() const RtMidiOutinlinevirtual
LINUX_ALSA enum valueRtMidi
MACOSX_CORE enum valueRtMidi
openPort(unsigned int portNumber=0, const std::string portName=std::string("RtMidi Output"))RtMidiOutinlinevirtual
openVirtualPort(const std::string portName=std::string("RtMidi Output"))RtMidiOutinlinevirtual
RTMIDI_DUMMY enum valueRtMidi
RtMidiOut(RtMidi::Api api=UNSPECIFIED, const std::string clientName=std::string("RtMidi Output Client"))RtMidiOut
sendMessage(std::vector< unsigned char > *message)RtMidiOutinline
setErrorCallback(RtMidiErrorCallback errorCallback=NULL)RtMidiOutinlinevirtual
UNIX_JACK enum valueRtMidi
UNSPECIFIED enum valueRtMidi
WINDOWS_MM enum valueRtMidi
~RtMidiOut(void)RtMidiOut

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtMidiOut.html0000644000076600007660000005374412327015204015456 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtMidiOut Class Reference

A realtime MIDI output class. More...

#include <RtMidi.h>

Inheritance diagram for RtMidiOut:
RtMidi

Public Member Functions

 RtMidiOut (RtMidi::Api api=UNSPECIFIED, const std::string clientName=std::string("RtMidi Output Client"))
 Default constructor that allows an optional client name. More...
 
 ~RtMidiOut (void) throw ()
 The destructor closes any open MIDI connections.
 
RtMidi::Api getCurrentApi (void) throw ()
 Returns the MIDI API specifier for the current instance of RtMidiOut.
 
void openPort (unsigned int portNumber=0, const std::string portName=std::string("RtMidi Output"))
 Open a MIDI output connection. More...
 
void closePort (void)
 Close an open MIDI connection (if one exists).
 
virtual bool isPortOpen () const
 Returns true if a port is open and false if not.
 
void openVirtualPort (const std::string portName=std::string("RtMidi Output"))
 Create a virtual output port, with optional name, to allow software connections (OS X, JACK and ALSA only). More...
 
unsigned int getPortCount (void)
 Return the number of available MIDI output ports.
 
std::string getPortName (unsigned int portNumber=0)
 Return a string identifier for the specified MIDI port type and number. More...
 
void sendMessage (std::vector< unsigned char > *message)
 Immediately send a single message out an open MIDI output port. More...
 
virtual void setErrorCallback (RtMidiErrorCallback errorCallback=NULL)
 Set an error callback function to be invoked when an error has occured. More...
 

Additional Inherited Members

- Public Types inherited from RtMidi
enum  Api {
  UNSPECIFIED, MACOSX_CORE, LINUX_ALSA, UNIX_JACK,
  WINDOWS_MM, RTMIDI_DUMMY
}
 MIDI API specifier arguments. More...
 
- Static Public Member Functions inherited from RtMidi
static std::string getVersion (void) throw ()
 A static function to determine the current RtMidi version.
 
static void getCompiledApi (std::vector< RtMidi::Api > &apis) throw ()
 A static function to determine the available compiled MIDI APIs. More...
 

Detailed Description

A realtime MIDI output class.

This class provides a common, platform-independent API for MIDI output. It allows one to probe available MIDI output ports, to connect to one such port, and to send MIDI bytes immediately over the connection. Create multiple instances of this class to connect to more than one MIDI device at the same time. With the OS-X, Linux ALSA and JACK MIDI APIs, it is also possible to open a virtual port to which other MIDI software clients can connect.

by Gary P. Scavone, 2003-2014.

Constructor & Destructor Documentation

RtMidiOut::RtMidiOut ( RtMidi::Api  api = UNSPECIFIED,
const std::string  clientName = std::string("RtMidi Output Client") 
)

Default constructor that allows an optional client name.

An exception will be thrown if a MIDI system initialization error occurs.

If no API argument is specified and multiple API support has been compiled, the default order of use is ALSA, JACK (Linux) and CORE, JACK (OS-X).

Member Function Documentation

void RtMidiOut::openPort ( unsigned int  portNumber = 0,
const std::string  portName = std::string( "RtMidi Output" ) 
)
inlinevirtual

Open a MIDI output connection.

An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. An exception is thrown if an error occurs while attempting to make the port connection.

Implements RtMidi.

553 { rtapi_->openPort( portNumber, portName ); }
void RtMidiOut::openVirtualPort ( const std::string  portName = std::string( "RtMidi Output" ))
inlinevirtual

Create a virtual output port, with optional name, to allow software connections (OS X, JACK and ALSA only).

This function creates a virtual MIDI output port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X, Linux ALSA and JACK APIs (the function does nothing with the other APIs). An exception is thrown if an error occurs while attempting to create the virtual port.

Implements RtMidi.

554 { rtapi_->openVirtualPort( portName ); }
std::string RtMidiOut::getPortName ( unsigned int  portNumber = 0)
inlinevirtual

Return a string identifier for the specified MIDI port type and number.

An empty string is returned if an invalid port specifier is provided.

Implements RtMidi.

558 { return rtapi_->getPortName( portNumber ); }
void RtMidiOut::sendMessage ( std::vector< unsigned char > *  message)
inline

Immediately send a single message out an open MIDI output port.

An exception is thrown if an error occurs during output or an output connection was not previously established.

559 { ((MidiOutApi *)rtapi_)->sendMessage( message ); }
void RtMidiOut::setErrorCallback ( RtMidiErrorCallback  errorCallback = NULL)
inlinevirtual

Set an error callback function to be invoked when an error has occured.

The callback function will be called whenever an error has occured. It is best to set the error callback function before opening a port.

Implements RtMidi.

560 { rtapi_->setErrorCallback(errorCallback); }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classRtMidiOut.png0000644000076600007660000000060312327015204015260 0ustar gary‰PNG  IHDRCPuV8tPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíQ®ƒ0 ljûù•@b—B[j>žÚ µÌf´uzJ)%YIJÕ`H ÚaØüÌkÕÒêÛÐ|Êpoeõ¥”u̘ÃFMvëœÏ±ío&ÉõjÆ™n!>›é5Œ»HïÏ£1Ú4÷ö½HÒ© IA_Æ(¥”\<¯ Y0¦)¹€qC¤!W0þͽ 5@Ð`Aƒ ôc 3³da© ¨3–ÏNõmÛ­?¼a¸wõûÆó‚QoÛ5Yõ<„Z¼‡9š'Ûa<æˆóØ0rìþ–h÷çñ`žq²O7n½]F›†ãZ¨ðÿX{›{ø°ú2†™Y®þJ’/²!‘XIEND®B`‚stk-4.5.0/doc/html/classstk_1_1ADSR-members.html0000644000076600007660000003735612327015204017142 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::ADSR Member List

This is the complete list of members for stk::ADSR, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
ADSR(void)stk::ADSR
ATTACK enum valuestk::ADSR
channelsOut(void) const stk::Generatorinline
DECAY enum valuestk::ADSR
Generator(void)stk::Generatorinline
getState(void) const stk::ADSRinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
IDLE enum valuestk::ADSR
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
keyOff(void)stk::ADSR
keyOn(void)stk::ADSR
lastFrame(void) const stk::Generatorinline
lastOut(void) const stk::ADSRinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
RELEASE enum valuestk::ADSR
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
setAllTimes(StkFloat aTime, StkFloat dTime, StkFloat sLevel, StkFloat rTime)stk::ADSR
setAttackRate(StkFloat rate)stk::ADSR
setAttackTarget(StkFloat target)stk::ADSR
setAttackTime(StkFloat time)stk::ADSR
setDecayRate(StkFloat rate)stk::ADSR
setDecayTime(StkFloat time)stk::ADSR
setRawwavePath(std::string path)stk::Stkstatic
setReleaseRate(StkFloat rate)stk::ADSR
setReleaseTime(StkFloat time)stk::ADSR
setSampleRate(StkFloat rate)stk::Stkstatic
setSustainLevel(StkFloat level)stk::ADSR
setTarget(StkFloat target)stk::ADSR
setValue(StkFloat value)stk::ADSR
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
SUSTAIN enum valuestk::ADSR
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(void)stk::ADSRinline
tick(StkFrames &frames, unsigned int channel=0)stk::ADSRinlinevirtual
~ADSR(void)stk::ADSR
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1ADSR.html0000644000076600007660000013244112327015204015501 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


STK ADSR envelope class. More...

#include <ADSR.h>

Inheritance diagram for stk::ADSR:
stk::Generator stk::Stk

Public Types

enum  {
  ATTACK, DECAY, SUSTAIN, RELEASE,
  IDLE
}
 ADSR envelope states. More...
 

Public Member Functions

 ADSR (void)
 Default constructor.
 
 ~ADSR (void)
 Class destructor.
 
void keyOn (void)
 Set target = 1, state = ADSR::ATTACK.
 
void keyOff (void)
 Set target = 0, state = ADSR::RELEASE.
 
void setAttackRate (StkFloat rate)
 Set the attack rate (gain / sample).
 
void setAttackTarget (StkFloat target)
 Set the target value for the attack (default = 1.0).
 
void setDecayRate (StkFloat rate)
 Set the decay rate (gain / sample).
 
void setSustainLevel (StkFloat level)
 Set the sustain level.
 
void setReleaseRate (StkFloat rate)
 Set the release rate (gain / sample).
 
void setAttackTime (StkFloat time)
 Set the attack rate based on a time duration (seconds).
 
void setDecayTime (StkFloat time)
 Set the decay rate based on a time duration (seconds).
 
void setReleaseTime (StkFloat time)
 Set the release rate based on a time duration (seconds).
 
void setAllTimes (StkFloat aTime, StkFloat dTime, StkFloat sLevel, StkFloat rTime)
 Set sustain level and attack, decay, and release time durations (seconds).
 
void setTarget (StkFloat target)
 Set a sustain target value and attack or decay from current value to target.
 
int getState (void) const
 Return the current envelope state (ATTACK, DECAY, SUSTAIN, RELEASE, IDLE).
 
void setValue (StkFloat value)
 Set to state = ADSR::SUSTAIN with current and target values of value.
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (void)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK ADSR envelope class.

This class implements a traditional ADSR (Attack, Decay, Sustain, Release) envelope. It responds to simple keyOn and keyOff messages, keeping track of its state. The state = ADSR::IDLE before being triggered and after the envelope value reaches 0.0 in the ADSR::RELEASE state. All rate, target and level settings must be non-negative. All time settings are in seconds and must be positive.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Enumeration Documentation

anonymous enum

ADSR envelope states.

Enumerator
ATTACK 

Attack

DECAY 

Decay

SUSTAIN 

Sustain

RELEASE 

Release

IDLE 

Before attack / after release

29  {
30  ATTACK,
31  DECAY,
32  SUSTAIN,
33  RELEASE,
34  IDLE
35  };

Member Function Documentation

StkFrames & stk::ADSR::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

161 {
162 #if defined(_STK_DEBUG_)
163  if ( channel >= frames.channels() ) {
164  oStream_ << "ADSR::tick(): channel and StkFrames arguments are incompatible!";
165  handleError( StkError::FUNCTION_ARGUMENT );
166  }
167 #endif
168 
169  StkFloat *samples = &frames[channel];
170  unsigned int hop = frames.channels();
171  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
172  *samples = ADSR::tick();
173 
174  return frames;
175 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1ADSR.png0000644000076600007660000000116212327015204015314 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíí®£0 DO&ïÿÈ ù 6eKÙÊ{U]W3mp’ãXýM­µÆ˜*IN´$«ŸE—&ó¼~NÂ’ä|ÝÆ=ö zKoËÑbÆà–$ï—è=·F™¤V–¤3_¡Ã#öZ¿¬ÈuANãe>@û‚œ\ã'±:ë½ÆQy‰û5ú°$9ÿC$Y%Z’Õ×¢k­5Äï{ˆqzYÂØqè•ÅDi‡$pJ4`•hÀ*Ñ€U¢«DV‰¬~ºÖZcL•¤'Z’ÕÿC—&X?’tå“Eèöðû%zËnKÑÒzòël?lü´Ås£‹Zt'6uÈÓmón~ŒÑ#ú±Ý=ÀA\Q_3ôºÆåÎâ\¡}AŽh__¦«¬‹då*òª o GAæ%ÎFÏìbêïV¸ÉÿIzr¢%Y}-ºÖZC ð¾€Ç¡—%Œ‡^ÉQì@ô—vH¢§DV‰¬ X%°J4`•hÀê7 K)%Æ€'°úô?LõÇ~ùsä€Ñ ôXºÍÁ# ¢·$F_šY‹¶SwÐ}[ÓÈn&¹'ÛGá ô Ú¹gôXp«Ö}Ç=oÍ Ý+N¹F[㫸ÁÍk,`u†þ¨C¶¯°gôÖ9ôõ4ÀçN4`•hÀ*]J)!þË%âo%!MIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Asymp-members.html0000644000076600007660000003161712327015204017474 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Asymp Member List

This is the complete list of members for stk::Asymp, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
Asymp(void)stk::Asymp
channelsOut(void) const stk::Generatorinline
Generator(void)stk::Generatorinline
getState(void) const stk::Asympinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
keyOff(void)stk::Asymp
keyOn(void)stk::Asymp
lastFrame(void) const stk::Generatorinline
lastOut(void) const stk::Asympinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setT60(StkFloat t60)stk::Asymp
setTarget(StkFloat target)stk::Asymp
setTau(StkFloat tau)stk::Asymp
setTime(StkFloat time)stk::Asymp
setValue(StkFloat value)stk::Asymp
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(void)stk::Asympinline
tick(StkFrames &frames, unsigned int channel=0)stk::Asympinlinevirtual
~Asymp(void)stk::Asymp
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Asymp.html0000644000076600007660000011314312327015204016037 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Asymp Class Reference

STK asymptotic curve envelope class. More...

#include <Asymp.h>

Inheritance diagram for stk::Asymp:
stk::Generator stk::Stk

Public Member Functions

 Asymp (void)
 Default constructor.
 
 ~Asymp (void)
 Class destructor.
 
void keyOn (void)
 Set target = 1.
 
void keyOff (void)
 Set target = 0.
 
void setTau (StkFloat tau)
 Set the asymptotic rate via the time factor tau (must be > 0). More...
 
void setTime (StkFloat time)
 Set the asymptotic rate based on a time duration (must be > 0).
 
void setT60 (StkFloat t60)
 Set the asymptotic rate such that the target value is perceptually reached (to within -60dB of the target) in t60 seconds.
 
void setTarget (StkFloat target)
 Set the target value.
 
void setValue (StkFloat value)
 Set current and target values to value.
 
int getState (void) const
 Return the current envelope state (0 = at target, 1 otherwise).
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (void)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK asymptotic curve envelope class.

This class implements a simple envelope generator which asymptotically approaches a target value. The algorithm used is of the form:

y[n] = a y[n-1] + (1-a) target,

where a = exp(-T/tau), T is the sample period, and tau is a time constant. The user can set the time constant (default value = 0.3) and target value. Theoretically, this recursion never reaches its target, though the calculations in this class are stopped when the current value gets within a small threshold value of the target (at which time the current value is set to the target). It responds to keyOn and keyOff messages by ramping to 1.0 on keyOn and to 0.0 on keyOff.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::Asymp::setTau ( StkFloat  tau)

Set the asymptotic rate via the time factor tau (must be > 0).

The rate is computed as described above. The value of tau must be greater than zero. Values of tau close to zero produce fast approach rates, while values greater than 1.0 produce rather slow rates.

StkFrames & stk::Asymp::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

128 {
129 #if defined(_STK_DEBUG_)
130  if ( channel >= frames.channels() ) {
131  oStream_ << "Asymp::tick(): channel and StkFrames arguments are incompatible!";
132  handleError( StkError::FUNCTION_ARGUMENT );
133  }
134 #endif
135 
136  StkFloat *samples = &frames[channel];
137  unsigned int hop = frames.channels();
138  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
139  *samples = Asymp::tick();
140 
141  return frames;
142 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Asymp.png0000644000076600007660000000120312327015204015650 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíÑ®ã Dƒ”ÿÿäMImÊ6¹­¼«êºšQ©hž©µÖS%)‰–dõÑ¥Éü^?“²$9ÿÝÚ{íô¶½mÓcY’¼_¢Ï½5ÊAjq˜²$Í|…î 8³~™Èu SF˜Ð>É1~ˆÕ솼{Œ=ãÏcôeIš9ß!’¬-ÉêkѵÖb€û^b‡^–0vz%G±Ñ_zC 8%°J4`•hÀ*Ñ€U¢«DV¿]k­1¦JR„-Éêß¡K“-¬Iºòdкý¸Ã~‰Þv·mÑÒöͯ½ûbý« >&ºªEïĦò´F›|–›í¡:¢ÓÑÄÅ8V} 3t/ºúáá\¡} #ÚçâcºÚu‘¬\"¯¹î‡x,ÐïÌyCLþn„»!ù‘¤''Z’Õ×¢k­5Ä÷½Ä8½,aì8ôJŽb¢¿ô†$pJ4`•hÀ*Ñ€U¢«DV‰¬~º”RbLˆp¢«ÿ€^«CÇ·pýóÇ›ÌX/ävÙú1pëmÍÖÝǬ煟Ñûècâc²ž­†Ü“-ÎÐçD_=<,búK Ïèöϵ½ýÚ2<ʹåwЬƔæè{Y÷G>&Û5zǹ–=ñ;7àÚã¥ü&úÎ?õ=ôüÂVùR¬¾]J)!þ¸©%濆!}IEND®B`‚stk-4.5.0/doc/html/classstk_1_1BandedWG-members.html0000644000076600007660000003417312327015204020016 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BandedWG Member List

This is the complete list of members for stk::BandedWG, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
BandedWG(void)stk::BandedWG
channelsOut(void) const stk::Instrmntinline
clear(void)stk::BandedWGvirtual
controlChange(int number, StkFloat value)stk::BandedWGvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::BandedWGvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::BandedWGvirtual
pluck(StkFloat amp)stk::BandedWG
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::BandedWGvirtual
setPreset(int preset)stk::BandedWG
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setStrikePosition(StkFloat position)stk::BandedWG
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
startBowing(StkFloat amplitude, StkFloat rate)stk::BandedWG
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stopBowing(StkFloat rate)stk::BandedWG
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::BandedWGvirtual
tick(StkFrames &frames, unsigned int channel=0)stk::BandedWGinlinevirtual
~BandedWG(void)stk::BandedWG
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BandedWG.html0000644000076600007660000012160712327015204016365 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BandedWG Class Reference

Banded waveguide modeling class. More...

#include <BandedWG.h>

Inheritance diagram for stk::BandedWG:
stk::Instrmnt stk::Stk

Public Member Functions

 BandedWG (void)
 Class constructor.
 
 ~BandedWG (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setStrikePosition (StkFloat position)
 Set strike position (0.0 - 1.0).
 
void setPreset (int preset)
 Select a preset.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void startBowing (StkFloat amplitude, StkFloat rate)
 Apply bow velocity/pressure to instrument with given amplitude and rate of increase.
 
void stopBowing (StkFloat rate)
 Decrease bow velocity/breath pressure with given rate of decrease.
 
void pluck (StkFloat amp)
 Pluck the instrument with given amplitude.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

Banded waveguide modeling class.

This class uses banded waveguide techniques to model a variety of sounds, including bowed bars, glasses, and bowls. For more information, see Essl, G. and Cook, P. "Banded Waveguides: Towards Physical Modelling of Bar Percussion Instruments", Proceedings of the 1999 International Computer Music Conference.

Control Change Numbers:

  • Bow Pressure = 2
  • Bow Motion = 4
  • Strike Position = 8 (not implemented)
  • Vibrato Frequency = 11
  • Gain = 1
  • Bow Velocity = 128
  • Set Striking = 64
  • Instrument Presets = 16
    • Uniform Bar = 0
    • Tuned Bar = 1
    • Glass Harmonica = 2
    • Tibetan Bowl = 3

by Georg Essl, 1999 - 2004. Modified for STK 4.0 by Gary Scavone.

Member Function Documentation

StkFrames & stk::BandedWG::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

125 {
126  unsigned int nChannels = lastFrame_.channels();
127 #if defined(_STK_DEBUG_)
128  if ( channel > frames.channels() - nChannels ) {
129  oStream_ << "BandedWG::tick(): channel and StkFrames arguments are incompatible!";
130  handleError( StkError::FUNCTION_ARGUMENT );
131  }
132 #endif
133 
134  StkFloat *samples = &frames[channel];
135  unsigned int j, hop = frames.channels() - nChannels;
136  if ( nChannels == 1 ) {
137  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
138  *samples++ = tick();
139  }
140  else {
141  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
142  *samples++ = tick();
143  for ( j=1; j<nChannels; j++ )
144  *samples++ = lastFrame_[j];
145  }
146  }
147 
148  return frames;
149 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BandedWG.png0000644000076600007660000000121412327015204016174 0ustar gary‰PNG  IHDR`ˆ/QåPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíërë —¿ÿ#ׯ _”49´gRµl„щñorÎy$dIG$Éå?¤2Ì|þ¹KÒ‘—åó{_°u9¯MV?Ã’tâ‘ ³äÚò•™°$Ýð„ fêµ<ªÑS%ºÌT¿ØÛ‚¾DM~¿Dv\Ý¢÷š\K´µ¸5¹KÒ ñ.’$—H’ËGrÎy ßbÉhÁ4 6ŒÌùdž >à…À'.!p €K\Bà—?(È9ç‘%i!$—ߤ2ìTÒ>ŽóÛø¯Ò’|þcåó²°//ò[žZWK\Ò>.뎚ÀN“dGÍX†]•dƵ æ5O·sîËý¹¬n‰îmùuA_¢“ ·½ H’%zSPk°µøœ³5øJðÄ-’¤G$É%’äò‚œsÀ·˜F2Z0Mƒ £sþ±†á‚¸E!ð €K\Bà—¸„Àå RJi$$€q„Àå§óÄÎ×kp¤Ömeßs‚s®gvÛ.XœõÚ¶ÝíÉõDób=  Ö™I~8r3µ±?· ¶Èþ ®3³ãV°g¹êA—òü¯dj‡Û¾Ý±D')Ñ9s<.zЗ¨ÜýØUÓÞ£ =8þ®DÛ—Üv¶›Òø|‹ºþš—h¼‹\Bàò‚”RÈXb(´VÁ$IEND®B`‚stk-4.5.0/doc/html/classstk_1_1BeeThree-members.html0000644000076600007660000003723312327015204020066 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BeeThree Member List

This is the complete list of members for stk::BeeThree, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
BeeThree(void)stk::BeeThree
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::FMvirtual
FM(unsigned int operators=4)stk::FM
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::FM
keyOn(void)stk::FM
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
loadWaves(const char **filenames)stk::FM
noteOff(StkFloat amplitude)stk::FMvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::BeeThreevirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setControl1(StkFloat cVal)stk::FMinline
setControl2(StkFloat cVal)stk::FMinline
setFrequency(StkFloat frequency)stk::FMvirtual
setGain(unsigned int waveIndex, StkFloat gain)stk::FM
setModulationDepth(StkFloat mDepth)stk::FMinline
setModulationSpeed(StkFloat mSpeed)stk::FMinline
setRatio(unsigned int waveIndex, StkFloat ratio)stk::FM
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::BeeThreeinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::BeeThreeinlinevirtual
~BeeThree(void)stk::BeeThree
~FM(void)stk::FMvirtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BeeThree.html0000644000076600007660000013675212327015204016444 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BeeThree Class Reference

STK Hammond-oid organ FM synthesis instrument. More...

#include <BeeThree.h>

Inheritance diagram for stk::BeeThree:
stk::FM stk::Instrmnt stk::Stk

Public Member Functions

 BeeThree (void)
 Class constructor. More...
 
 ~BeeThree (void)
 Class destructor.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::FM
 FM (unsigned int operators=4)
 Class constructor, taking the number of wave/envelope operators to control. More...
 
virtual ~FM (void)
 Class destructor.
 
void loadWaves (const char **filenames)
 Load the rawwave filenames in waves.
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setRatio (unsigned int waveIndex, StkFloat ratio)
 Set the frequency ratio for the specified wave.
 
void setGain (unsigned int waveIndex, StkFloat gain)
 Set the gain for the specified wave.
 
void setModulationSpeed (StkFloat mSpeed)
 Set the modulation speed in Hz.
 
void setModulationDepth (StkFloat mDepth)
 Set the modulation depth.
 
void setControl1 (StkFloat cVal)
 Set the value of control1.
 
void setControl2 (StkFloat cVal)
 Set the value of control1.
 
void keyOn (void)
 Start envelopes toward "on" targets.
 
void keyOff (void)
 Start envelopes toward "off" targets.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK Hammond-oid organ FM synthesis instrument.

This class implements a simple 4 operator topology, also referred to as algorithm 8 of the TX81Z.

Algorithm 8 is :
1 --.
2 -\|
+-> Out
3 -/|
4 --

Control Change Numbers:

  • Operator 4 (feedback) Gain = 2
  • Operator 3 Gain = 4
  • LFO Speed = 11
  • LFO Depth = 1
  • ADSR 2 & 4 Target = 128

The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::BeeThree::BeeThree ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::BeeThree::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::FM.

99 {
100  unsigned int nChannels = lastFrame_.channels();
101 #if defined(_STK_DEBUG_)
102  if ( channel > frames.channels() - nChannels ) {
103  oStream_ << "BeeThree::tick(): channel and StkFrames arguments are incompatible!";
104  handleError( StkError::FUNCTION_ARGUMENT );
105  }
106 #endif
107 
108  StkFloat *samples = &frames[channel];
109  unsigned int j, hop = frames.channels() - nChannels;
110  if ( nChannels == 1 ) {
111  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
112  *samples++ = tick();
113  }
114  else {
115  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
116  *samples++ = tick();
117  for ( j=1; j<nChannels; j++ )
118  *samples++ = lastFrame_[j];
119  }
120  }
121 
122  return frames;
123 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BeeThree.png0000644000076600007660000000134312327015204016247 0ustar gary‰PNG  IHDRXÀ·~T(PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2rIDATxíÝá’« àÃÉŒïÿÈ«1Aj[¯Ù»¦Ë±ôƒ³¿!"IÞŸ„ÿ\j3ýù3&éÚÛpý½Ž]‡—¥-볈þè‡IÒå nëªÆæÔB˜a’ä ¬‚ZÏjñ´CAä2ìK1ؼ륰môV\Û<-Ŷumóü0I’ÿ+&IŸ„ED/g€ˆDÁÓ$GÁ³#‡ÁøV$œ0tI8aðI8aðIø[`‘ˆ@Hòþ$üŸàR›í’Ü[ߎÿ\t>X»þ^&öée þÕ³ÖÙ:þ^ÏÔ m·¶©T›=ƒÕ3gµuíÓÝmå–â1ܦ߇})°¿Ëp!m”â"¬ÏºmÝÑj7‚OÞ ’¼' 'L’>‘°ˆH@àåL‘(xš‚ä(xvcä0øߊ„€. ' > ' >  ,"IÞŸ„ÿ\jÛ»õ³Ù9’{{n7°_$Ùå ®+›Ö¾^½Ú–Ë[W'×±‹°zæj-ñ?Á+ØÃöqºú“ÜÛùæÙRÜÒ¶ÜB’‡„—¥éBÚ% Ð…oë×q¬—ø ¼zµUi_½~ï_Ûaœàa4¸Õx (>#x{¸Ý¬Þ íåîNð›gKÑÁö©­Øïç¨ÆGà†Rl[§whÏ>|+ì­¾pgN|"áRJ Èíê7o‡ÖIEND®B`‚stk-4.5.0/doc/html/classstk_1_1BiQuad-members.html0000644000076600007660000003635112327015204017550 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BiQuad Member List

This is the complete list of members for stk::BiQuad, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
BiQuad()stk::BiQuad
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
getGain(void) const stk::Filterinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::BiQuadinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::BiQuadinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
setA1(StkFloat a1)stk::BiQuadinline
setA2(StkFloat a2)stk::BiQuadinline
setB0(StkFloat b0)stk::BiQuadinline
setB1(StkFloat b1)stk::BiQuadinline
setB2(StkFloat b2)stk::BiQuadinline
setCoefficients(StkFloat b0, StkFloat b1, StkFloat b2, StkFloat a1, StkFloat a2, bool clearState=false)stk::BiQuad
setEqualGainZeroes(void)stk::BiQuad
setGain(StkFloat gain)stk::Filterinline
setNotch(StkFloat frequency, StkFloat radius)stk::BiQuad
setRawwavePath(std::string path)stk::Stkstatic
setResonance(StkFloat frequency, StkFloat radius, bool normalize=false)stk::BiQuad
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::BiQuadinline
tick(StkFrames &frames, unsigned int channel=0)stk::BiQuadinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::BiQuadinline
~BiQuad()stk::BiQuad
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BiQuad.html0000644000076600007660000015053612327015204016122 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BiQuad Class Reference

STK biquad (two-pole, two-zero) filter class. More...

#include <BiQuad.h>

Inheritance diagram for stk::BiQuad:
stk::Filter stk::Stk

Public Member Functions

 BiQuad ()
 Default constructor creates a second-order pass-through filter.
 
 ~BiQuad ()
 Class destructor.
 
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes.
 
void setCoefficients (StkFloat b0, StkFloat b1, StkFloat b2, StkFloat a1, StkFloat a2, bool clearState=false)
 Set all filter coefficients.
 
void setB0 (StkFloat b0)
 Set the b[0] coefficient value.
 
void setB1 (StkFloat b1)
 Set the b[1] coefficient value.
 
void setB2 (StkFloat b2)
 Set the b[2] coefficient value.
 
void setA1 (StkFloat a1)
 Set the a[1] coefficient value.
 
void setA2 (StkFloat a2)
 Set the a[2] coefficient value.
 
void setResonance (StkFloat frequency, StkFloat radius, bool normalize=false)
 Sets the filter coefficients for a resonance at frequency (in Hz). More...
 
void setNotch (StkFloat frequency, StkFloat radius)
 Set the filter coefficients for a notch at frequency (in Hz). More...
 
void setEqualGainZeroes (void)
 Sets the filter zeroes for equal resonance gain. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return a reference to one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK biquad (two-pole, two-zero) filter class.

This class implements a two-pole, two-zero digital filter. Methods are provided for creating a resonance or notch in the frequency response while maintaining a constant filter gain.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::BiQuad::setResonance ( StkFloat  frequency,
StkFloat  radius,
bool  normalize = false 
)

Sets the filter coefficients for a resonance at frequency (in Hz).

This method determines the filter coefficients corresponding to two complex-conjugate poles with the given frequency (in Hz) and radius from the z-plane origin. If normalize is true, the filter zeros are placed at z = 1, z = -1, and the coefficients are then normalized to produce a constant unity peak gain (independent of the filter gain parameter). The resulting filter frequency response has a resonance at the given frequency. The closer the poles are to the unit-circle (radius close to one), the narrower the resulting resonance width. An unstable filter will result for radius >= 1.0. The frequency value should be between zero and half the sample rate.

void stk::BiQuad::setNotch ( StkFloat  frequency,
StkFloat  radius 
)

Set the filter coefficients for a notch at frequency (in Hz).

This method determines the filter coefficients corresponding to two complex-conjugate zeros with the given frequency (in Hz) and radius from the z-plane origin. No filter normalization is attempted. The frequency value should be between zero and half the sample rate. The radius value should be positive.

void stk::BiQuad::setEqualGainZeroes ( void  )

Sets the filter zeroes for equal resonance gain.

When using the filter as a resonator, zeroes places at z = 1, z = -1 will result in a constant gain at resonance of 1 / (1 - R), where R is the pole radius setting.

StkFrames & stk::BiQuad::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

133 {
134 #if defined(_STK_DEBUG_)
135  if ( channel >= frames.channels() ) {
136  oStream_ << "BiQuad::tick(): channel and StkFrames arguments are incompatible!";
137  handleError( StkError::FUNCTION_ARGUMENT );
138  }
139 #endif
140 
141  StkFloat *samples = &frames[channel];
142  unsigned int hop = frames.channels();
143  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
144  inputs_[0] = gain_ * *samples;
145  *samples = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
146  *samples -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
147  inputs_[2] = inputs_[1];
148  inputs_[1] = inputs_[0];
149  outputs_[2] = outputs_[1];
150  outputs_[1] = *samples;
151  }
152 
153  lastFrame_[0] = outputs_[1];
154  return frames;
155 }
StkFrames & stk::BiQuad::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

158 {
159 #if defined(_STK_DEBUG_)
160  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
161  oStream_ << "BiQuad::tick(): channel and StkFrames arguments are incompatible!";
162  handleError( StkError::FUNCTION_ARGUMENT );
163  }
164 #endif
165 
166  StkFloat *iSamples = &iFrames[iChannel];
167  StkFloat *oSamples = &oFrames[oChannel];
168  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
169  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
170  inputs_[0] = gain_ * *iSamples;
171  *oSamples = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
172  *oSamples -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
173  inputs_[2] = inputs_[1];
174  inputs_[1] = inputs_[0];
175  outputs_[2] = outputs_[1];
176  outputs_[1] = *oSamples;
177  }
178 
179  lastFrame_[0] = outputs_[1];
180  return iFrames;
181 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BiQuad.png0000644000076600007660000000111712327015204015730 0ustar gary‰PNG  IHDRKˆ˜ìæÂPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÞIDATxí E—Ä÷äUD-ŠŠ³Mv’­éu ÒcÿøË|%çœD–$K’ÆõÀJÅÌ~¾:Êzõ}b- ,Yظº8»ßXûÛKØZ*4nIjtǪAmÌÞ¯~‘÷5vƒjº_XmÞªÑZoŽÃ½¯5nß{ߺ%©Qü¶%i\Á’¤qͬœsöÀ»&'9²¦ÉæÈšQn0OÖ¯c°>(Xã À¸‚0®`Œ+Xû•sÎN"K’‹‚%Iãê²R±c[®ÍmŸH26ĺ}"ÉØ™UÞ?ßlж(¾5ÃåVv,SÉr¬­ª)³¨ÍñʪA¶°µ]J:l×KÖ%¯þÜ{[ãë:”ç~Ýôþs[绽·s”tXü¶%i\Á’¤qͬœsöÀ»þÁÿm€7M“Ì‘5£Ü`ž¬_;Ç`|P°Æ,€q `\ÁW°ö+¥”œDpQ°ÆubÍ»_§S}u pRu¿°š“ǰva-/­ßȱžº*ZÓ<>+³Ø­Þ7,sªÃªM¦_×¼:;[ã…ÕæÕ¬ê,º¬¶Æ~¿ön^þÜõ«ÛûcŽ5÷‡~Õ·Îo§Îß—=T‡~#À_*XãúOX)¥ä£?ðr CÍÈáIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Blit-members.html0000644000076600007660000003104712327015204017272 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Blit Member List

This is the complete list of members for stk::Blit, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
Blit(StkFloat frequency=220.0)stk::Blit
channelsOut(void) const stk::Generatorinline
Generator(void)stk::Generatorinline
getPhase() const stk::Blitinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Generatorinline
lastOut(void) const stk::Blitinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
reset()stk::Blit
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Blit
setHarmonics(unsigned int nHarmonics=0)stk::Blit
setPhase(StkFloat phase)stk::Blitinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(void)stk::Blitinline
tick(StkFrames &frames, unsigned int channel=0)stk::Blitinlinevirtual
~Blit()stk::Blit
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Blit.html0000644000076600007660000011543012327015204015641 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Blit Class Reference

STK band-limited impulse train class. More...

#include <Blit.h>

Inheritance diagram for stk::Blit:
stk::Generator stk::Stk

Public Member Functions

 Blit (StkFloat frequency=220.0)
 Default constructor that initializes BLIT frequency to 220 Hz.
 
 ~Blit ()
 Class destructor.
 
void reset ()
 Resets the oscillator state and phase to 0.
 
void setPhase (StkFloat phase)
 Set the phase of the signal. More...
 
StkFloat getPhase () const
 Get the current phase of the signal. More...
 
void setFrequency (StkFloat frequency)
 Set the impulse train rate in terms of a frequency in Hz.
 
void setHarmonics (unsigned int nHarmonics=0)
 Set the number of harmonics generated in the signal. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (void)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK band-limited impulse train class.

This class generates a band-limited impulse train using a closed-form algorithm reported by Stilson and Smith in "Alias-Free Digital Synthesis of Classic Analog Waveforms", 1996. The user can specify both the fundamental frequency of the impulse train and the number of harmonics contained in the resulting signal.

The signal is normalized so that the peak value is +/-1.0.

If nHarmonics is 0, then the signal will contain all harmonics up to half the sample rate. Note, however, that this setting may produce aliasing in the signal when the frequency is changing (no automatic modification of the number of harmonics is performed by the setFrequency() function).

Original code by Robin Davies, 2005. Revisions by Gary Scavone for STK, 2005.

Member Function Documentation

void stk::Blit::setPhase ( StkFloat  phase)
inline

Set the phase of the signal.

Set the phase of the signal, in the range 0 to 1.

49 { phase_ = PI * phase; };
StkFloat stk::Blit::getPhase ( ) const
inline

Get the current phase of the signal.

Get the phase of the signal, in the range [0 to 1.0).

55 { return phase_ / PI; };
void stk::Blit::setHarmonics ( unsigned int  nHarmonics = 0)

Set the number of harmonics generated in the signal.

This function sets the number of harmonics contained in the resulting signal. It is equivalent to (2 * M) + 1 in the BLIT algorithm. The default value of 0 sets the algorithm for maximum harmonic content (harmonics up to half the sample rate). This parameter is not checked against the current sample rate and fundamental frequency. Thus, aliasing can result if one or more harmonics for a given fundamental frequency exceeds fs / 2. This behavior was chosen over the potentially more problematic solution of automatically modifying the M parameter, which can produce audible clicks in the signal.

StkFrames & stk::Blit::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

133 {
134 #if defined(_STK_DEBUG_)
135  if ( channel >= frames.channels() ) {
136  oStream_ << "Blit::tick(): channel and StkFrames arguments are incompatible!";
137  handleError( StkError::FUNCTION_ARGUMENT );
138  }
139 #endif
140 
141  StkFloat *samples = &frames[channel];
142  unsigned int hop = frames.channels();
143  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
144  *samples = Blit::tick();
145 
146  return frames;
147 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Blit.png0000644000076600007660000000112712327015204015456 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2æIDATxíÑŽ«0 DO&ÿÿÉB 6 —Ö»ªÖÕŒJMr0ã¨ÏÔZkŒ©’áDK²ú]ti2¿çÏ ,IÎÿn×kíôÒÞÒ£Åô‹cY’¼OÑ{o²‘Z¦,I#_¡;Ã#ö¬O¹dÈè/óÚ2ã;XNÈÝ1ö@¶!îcôeI9ÿC$Y%Z’Õ×¢k­5į{ˆqzšÂØqè™ÅDé I4à”hÀ*Ñ€U¢«DV‰¬ Xýt­µÆ˜*IN´$«ŸC—&[˜?’tåÁ¢ tûñ û½t·´hé kóóÝõaý«-Þ6ºªE¯Ä¦òôŒ¶y/7?®Õ#ú±Ý=ÀA\ŒÇªd„îE÷„>Ü-œ+´äˆö¹ø˜®º.’•Kä,Ð=mˆÛú™ÙOˆÉß­p'$ÿC$éɉ–dõµèZk 1Àëžb‡ž¦0vz&G±Ñ_zB 8%°J4`•hÀ*Ñ€U¢«DV]J)1¦D8Ñ€Õï¢çvÍ:ü­|²ûÚÕn£—öúÝ—ô|£½À³OÑû;¯«LæÀÐWèŽ1‹>”õΰètmCý0º€ÕG»^Ù†Øa>ë›'ྠX%°ŠE—RJˆÿ.æ%Â(;IEND®B`‚stk-4.5.0/doc/html/classstk_1_1BlitSaw-members.html0000644000076600007660000003012612327015204017742 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BlitSaw Member List

This is the complete list of members for stk::BlitSaw, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
BlitSaw(StkFloat frequency=220.0)stk::BlitSaw
channelsOut(void) const stk::Generatorinline
Generator(void)stk::Generatorinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Generatorinline
lastOut(void) const stk::BlitSawinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
reset()stk::BlitSaw
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::BlitSaw
setHarmonics(unsigned int nHarmonics=0)stk::BlitSaw
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(void)stk::BlitSawinline
tick(StkFrames &frames, unsigned int channel=0)stk::BlitSawinlinevirtual
~BlitSaw()stk::BlitSaw
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BlitSaw.html0000644000076600007660000010777112327015204016325 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BlitSaw Class Reference

STK band-limited sawtooth wave class. More...

#include <BlitSaw.h>

Inheritance diagram for stk::BlitSaw:
stk::Generator stk::Stk

Public Member Functions

 BlitSaw (StkFloat frequency=220.0)
 Class constructor.
 
 ~BlitSaw ()
 Class destructor.
 
void reset ()
 Resets the oscillator state and phase to 0.
 
void setFrequency (StkFloat frequency)
 Set the sawtooth oscillator rate in terms of a frequency in Hz.
 
void setHarmonics (unsigned int nHarmonics=0)
 Set the number of harmonics generated in the signal. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (void)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK band-limited sawtooth wave class.

This class generates a band-limited sawtooth waveform using a closed-form algorithm reported by Stilson and Smith in "Alias-Free Digital Synthesis of Classic Analog Waveforms", 1996. The user can specify both the fundamental frequency of the sawtooth and the number of harmonics contained in the resulting signal.

If nHarmonics is 0, then the signal will contain all harmonics up to half the sample rate. Note, however, that this setting may produce aliasing in the signal when the frequency is changing (no automatic modification of the number of harmonics is performed by the setFrequency() function).

Based on initial code of Robin Davies, 2005. Modified algorithm code by Gary Scavone, 2005.

Member Function Documentation

void stk::BlitSaw::setHarmonics ( unsigned int  nHarmonics = 0)

Set the number of harmonics generated in the signal.

This function sets the number of harmonics contained in the resulting signal. It is equivalent to (2 * M) + 1 in the BLIT algorithm. The default value of 0 sets the algorithm for maximum harmonic content (harmonics up to half the sample rate). This parameter is not checked against the current sample rate and fundamental frequency. Thus, aliasing can result if one or more harmonics for a given fundamental frequency exceeds fs / 2. This behavior was chosen over the potentially more problematic solution of automatically modifying the M parameter, which can produce audible clicks in the signal.

StkFrames & stk::BlitSaw::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

129 {
130 #if defined(_STK_DEBUG_)
131  if ( channel >= frames.channels() ) {
132  oStream_ << "BlitSaw::tick(): channel and StkFrames arguments are incompatible!";
133  handleError( StkError::FUNCTION_ARGUMENT );
134  }
135 #endif
136 
137 
138  StkFloat *samples = &frames[channel];
139  unsigned int hop = frames.channels();
140  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
141  *samples = BlitSaw::tick();
142 
143  return frames;
144 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BlitSaw.png0000644000076600007660000000116712327015204016135 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxía£0 D_&ÿÿ' l…»Ê{ªÖ«-uàÅŒ#>Sk­1¦JR„-Éêÿ¢K“ù=ÿ Ê’äü÷èv½Ô>A¿Ú{õh1ýâX–$ï·è­·FYI-S–¤‘ïÐá[Öo¹dÈè/óÚ2ã'XNÈ¿Ž±²q£/KÒÈù ‘d•hIV_‹®µÖ<÷ã8ô4…±ãÐ39ŠˆþÒ’hÀ)Ñ€U¢«DV‰¬ X%°ú èZk1U’"œhIV?‡.M¶0ÿIÒ7Ý Û'ì·èWw¯-}`i~^]6ëÿÚÍ냮jÑ ±iœöhoåæýúP=¢÷ÇÑÄÅx¬ú@Fè^t;ôá®áÜ¡} G´ÏÅÇt×u‘¬\"ïy€î¬C\7ègf;!&w‡;!ù ‘¤“-ÉêkѵÖb€çžb‡ž¦0vz&G±Ñ_zB 8%°J4`•hÀ*Ñ€U¢«DV¿]J)1¦D8Ñ€Õϣ碭/_Ëíj)\ù!ÚÕÖ‹öýê¦ÊmÉ ç{b[óý…¨z{çee€Â®ÖÀ|Žî³pÎÚ¬»-o9¡‡ˆ}œÑ> ´k¿wðþ×Y_Œq€$}È:›NòY÷ÊzBÌù ¸p¢«¯E—RJˆÿ7Û%ü9ô5IEND®B`‚stk-4.5.0/doc/html/classstk_1_1BlitSquare-members.html0000644000076600007660000003140512327015204020451 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BlitSquare Member List

This is the complete list of members for stk::BlitSquare, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
BlitSquare(StkFloat frequency=220.0)stk::BlitSquare
channelsOut(void) const stk::Generatorinline
Generator(void)stk::Generatorinline
getPhase() const stk::BlitSquareinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Generatorinline
lastOut(void) const stk::BlitSquareinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
reset()stk::BlitSquare
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::BlitSquare
setHarmonics(unsigned int nHarmonics=0)stk::BlitSquare
setPhase(StkFloat phase)stk::BlitSquareinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(void)stk::BlitSquareinline
tick(StkFrames &frames, unsigned int channel=0)stk::BlitSquareinlinevirtual
~BlitSquare()stk::BlitSquare
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BlitSquare.html0000644000076600007660000011712312327015204017023 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BlitSquare Class Reference

STK band-limited square wave class. More...

#include <BlitSquare.h>

Inheritance diagram for stk::BlitSquare:
stk::Generator stk::Stk

Public Member Functions

 BlitSquare (StkFloat frequency=220.0)
 Default constructor that initializes BLIT frequency to 220 Hz.
 
 ~BlitSquare ()
 Class destructor.
 
void reset ()
 Resets the oscillator state and phase to 0.
 
void setPhase (StkFloat phase)
 Set the phase of the signal. More...
 
StkFloat getPhase () const
 Get the current phase of the signal. More...
 
void setFrequency (StkFloat frequency)
 Set the impulse train rate in terms of a frequency in Hz.
 
void setHarmonics (unsigned int nHarmonics=0)
 Set the number of harmonics generated in the signal. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (void)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK band-limited square wave class.

This class generates a band-limited square wave signal. It is derived in part from the approach reported by Stilson and Smith in "Alias-Free Digital Synthesis of Classic Analog Waveforms", 1996. The algorithm implemented in this class uses a SincM function with an even M value to achieve a bipolar bandlimited impulse train. This signal is then integrated to achieve a square waveform. The integration process has an associated DC offset so a DC blocking filter is applied at the output.

The user can specify both the fundamental frequency of the waveform and the number of harmonics contained in the resulting signal.

If nHarmonics is 0, then the signal will contain all harmonics up to half the sample rate. Note, however, that this setting may produce aliasing in the signal when the frequency is changing (no automatic modification of the number of harmonics is performed by the setFrequency() function). Also note that the harmonics of a square wave fall at odd integer multiples of the fundamental, so aliasing will happen with a lower fundamental than with the other Blit waveforms. This class is not guaranteed to be well behaved in the presence of significant aliasing.

Based on initial code of Robin Davies, 2005. Modified algorithm code by Gary Scavone, 2005 - 2006.

Member Function Documentation

void stk::BlitSquare::setPhase ( StkFloat  phase)
inline

Set the phase of the signal.

Set the phase of the signal, in the range 0 to 1.

58 { phase_ = PI * phase; };
StkFloat stk::BlitSquare::getPhase ( ) const
inline

Get the current phase of the signal.

Get the phase of the signal, in the range [0 to 1.0).

64 { return phase_ / PI; };
void stk::BlitSquare::setHarmonics ( unsigned int  nHarmonics = 0)

Set the number of harmonics generated in the signal.

This function sets the number of harmonics contained in the resulting signal. It is equivalent to (2 * M) + 1 in the BLIT algorithm. The default value of 0 sets the algorithm for maximum harmonic content (harmonics up to half the sample rate). This parameter is not checked against the current sample rate and fundamental frequency. Thus, aliasing can result if one or more harmonics for a given fundamental frequency exceeds fs / 2. This behavior was chosen over the potentially more problematic solution of automatically modifying the M parameter, which can produce audible clicks in the signal.

StkFrames & stk::BlitSquare::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

152 {
153 #if defined(_STK_DEBUG_)
154  if ( channel >= frames.channels() ) {
155  oStream_ << "BlitSquare::tick(): channel and StkFrames arguments are incompatible!";
156  handleError( StkError::FUNCTION_ARGUMENT );
157  }
158 #endif
159 
160  StkFloat *samples = &frames[channel];
161  unsigned int hop = frames.channels();
162  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
163  *samples = BlitSquare::tick();
164 
165  return frames;
166 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BlitSquare.png0000644000076600007660000000121512327015204016635 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíÑnì Dƒ”ÿÿä›%ÀÚIšlïÊ­VõjF%Nœõ™Zk1U’"œhIV¿‹.Mæyý”%Éùûè6Þjï í=z´˜>Ø—%Éû={k”Ajq˜²$ùÝ1³¾Lä>SFÿ˜7Ð>“c|'«³ò¿Ç؇8Ñ—%éÌù?D’U¢%Y},ºÖZC ðº€Ç¡—%Œ‡^ÉQì@ô‡ÞDN‰¬ X%°J4`•hÀ*Ñ€Õ_@×ZkŒ©’áDK²ú9ti²…õ'Iw>Ytƒn¯°/Ñî-ZúsÃÖü:»½¬ÿi‹ÇFWµèØ´Aïh›g¹ù9ÞU÷èçvGôq1î«>3t/º7ôÃáÜ¡} {´ÏÅÇt×u‘¬\"W¼€îŒC/èwfÞ“¿[ánHþ‘¤ƒ-ÉêcѵÖb€×½Ä8½,aì8ôJŽb¢?ô†$pJ4`•hÀ*Ñ€U¢«DV‰¬þº”RbLˆp¢«ŸC¯öy;èQn£­pç´«Á‹ì'úÑM¿Œs¯A¯ö¦¶qÿ 63Xϯš«ç7ϦIÈ\mι1Þ¡ç–‹¬ûüfÇñ>r@º6™»@ìð€ö|¶çz ÄñYÖ_ã>ü~jP8ú$ÑÊØî²î•yCærs±NnÀ÷|·ñÏ¡®œhÀ*]J)!þôõ&(âõå£IEND®B`‚stk-4.5.0/doc/html/classstk_1_1BlowBotl-members.html0000644000076600007660000003262412327015204020126 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BlowBotl Member List

This is the complete list of members for stk::BlowBotl, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
BlowBotl(void)stk::BlowBotl
channelsOut(void) const stk::Instrmntinline
clear(void)stk::BlowBotlvirtual
controlChange(int number, StkFloat value)stk::BlowBotlvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::BlowBotlvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::BlowBotlvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::BlowBotlvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
startBlowing(StkFloat amplitude, StkFloat rate)stk::BlowBotl
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stopBlowing(StkFloat rate)stk::BlowBotl
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::BlowBotlinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::BlowBotlinlinevirtual
~BlowBotl(void)stk::BlowBotl
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BlowBotl.html0000644000076600007660000011656112327015204016501 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BlowBotl Class Reference

STK blown bottle instrument class. More...

#include <BlowBotl.h>

Inheritance diagram for stk::BlowBotl:
stk::Instrmnt stk::Stk

Public Member Functions

 BlowBotl (void)
 Class constructor. More...
 
 ~BlowBotl (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void startBlowing (StkFloat amplitude, StkFloat rate)
 Apply breath velocity to instrument with given amplitude and rate of increase.
 
void stopBlowing (StkFloat rate)
 Decrease breath velocity with given rate of decrease.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK blown bottle instrument class.

This class implements a helmholtz resonator (biquad filter) with a polynomial jet excitation (a la Cook).

Control Change Numbers:

  • Noise Gain = 4
  • Vibrato Frequency = 11
  • Vibrato Gain = 1
  • Volume = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::BlowBotl::BlowBotl ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::BlowBotl::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

116 {
117  unsigned int nChannels = lastFrame_.channels();
118 #if defined(_STK_DEBUG_)
119  if ( channel > frames.channels() - nChannels ) {
120  oStream_ << "BlowBotl::tick(): channel and StkFrames arguments are incompatible!";
121  handleError( StkError::FUNCTION_ARGUMENT );
122  }
123 #endif
124 
125  StkFloat *samples = &frames[channel];
126  unsigned int j, hop = frames.channels() - nChannels;
127  if ( nChannels == 1 ) {
128  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
129  *samples++ = tick();
130  }
131  else {
132  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
133  *samples++ = tick();
134  for ( j=1; j<nChannels; j++ )
135  *samples++ = lastFrame_[j];
136  }
137  }
138 
139  return frames;
140 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BlowBotl.png0000644000076600007660000000112712327015204016310 0ustar gary‰PNG  IHDRQˆ¨`÷ãPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2æIDATxíÛ’¬ E›*ÿÿ“"j@úâó05i³» !Ë„t¿“sή"K’£‚(IózOLÅÌ~ý Ü’.{D,ëÝ÷âVÌV‘Í®‹Þ-ÉØ+âYII>¥gã–¤^oˆ5µÍ<ïñeÛo»¦ÖÒŸÛ®“ùA×ÖF³~8™Úõ1—s2­[’zÅÿZ’æDIš×JÌ9gO|¥ÀUîÄeñFºW 3ÒŸø+fD`^A˜WæD€yàµrÎÙUdIrT%i^7b*f·’.ë÷wÿÿ%¦¶~YhYo+¼9ÊSNíÑâ¿÷#5Ãn“d­"ŠÙèXA¦µ³’+ܽ¯¿©¾ë×Ä3ü€Øv}#¶øoˆI²6èú)±¶uÌå9§2"Žf-I ¢$ÍëÏsÎÙS_ip•;qY¼‘îÄèŒô'þŠYÀAA˜WæD€y`^Ax­”Rr ÀQA˜WG\7v¿Ï®õu¡[ââÀ×…Þ·7Ö_ÓyÐKIGÁ5íò_?C³8­¦èky† ±;ÜkÌÞÎuMæ^ÕyÅcâNê‰}$.ûP£ 4žq¾ëº}ÿ˜ØèC{×Çå.k¿³­›ÿk`^+1¥”<õ`ì"šµwY7IEND®B`‚stk-4.5.0/doc/html/classstk_1_1BlowHole-members.html0000644000076600007660000003367112327015204020120 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BlowHole Member List

This is the complete list of members for stk::BlowHole, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
BlowHole(StkFloat lowestFrequency)stk::BlowHole
channelsOut(void) const stk::Instrmntinline
clear(void)stk::BlowHolevirtual
controlChange(int number, StkFloat value)stk::BlowHolevirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::BlowHolevirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::BlowHolevirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::BlowHolevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setTonehole(StkFloat newValue)stk::BlowHole
setVent(StkFloat newValue)stk::BlowHole
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
startBlowing(StkFloat amplitude, StkFloat rate)stk::BlowHole
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stopBlowing(StkFloat rate)stk::BlowHole
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::BlowHoleinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::BlowHoleinlinevirtual
~BlowHole(void)stk::BlowHole
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BlowHole.html0000644000076600007660000012246412327015204016467 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BlowHole Class Reference

STK clarinet physical model with one register hole and one tonehole. More...

#include <BlowHole.h>

Inheritance diagram for stk::BlowHole:
stk::Instrmnt stk::Stk

Public Member Functions

 BlowHole (StkFloat lowestFrequency)
 Class constructor. More...
 
 ~BlowHole (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setTonehole (StkFloat newValue)
 Set the tonehole state (0.0 = closed, 1.0 = fully open).
 
void setVent (StkFloat newValue)
 Set the register hole state (0.0 = closed, 1.0 = fully open).
 
void startBlowing (StkFloat amplitude, StkFloat rate)
 Apply breath pressure to instrument with given amplitude and rate of increase.
 
void stopBlowing (StkFloat rate)
 Decrease breath pressure with given rate of decrease.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK clarinet physical model with one register hole and one tonehole.

This class is based on the clarinet model, with the addition of a two-port register hole and a three-port dynamic tonehole implementation, as discussed by Scavone and Cook (1998).

In this implementation, the distances between the reed/register hole and tonehole/bell are fixed. As a result, both the tonehole and register hole will have variable influence on the playing frequency, which is dependent on the length of the air column. In addition, the highest playing freqeuency is limited by these fixed lengths.

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others.

Control Change Numbers:

  • Reed Stiffness = 2
  • Noise Gain = 4
  • Tonehole State = 11
  • Register State = 1
  • Breath Pressure = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::BlowHole::BlowHole ( StkFloat  lowestFrequency)

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::BlowHole::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

157 {
158  unsigned int nChannels = lastFrame_.channels();
159 #if defined(_STK_DEBUG_)
160  if ( channel > frames.channels() - nChannels ) {
161  oStream_ << "BlowHole::tick(): channel and StkFrames arguments are incompatible!";
162  handleError( StkError::FUNCTION_ARGUMENT );
163  }
164 #endif
165 
166  StkFloat *samples = &frames[channel];
167  unsigned int j, hop = frames.channels() - nChannels;
168  if ( nChannels == 1 ) {
169  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
170  *samples++ = tick();
171  }
172  else {
173  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
174  *samples++ = tick();
175  for ( j=1; j<nChannels; j++ )
176  *samples++ = lastFrame_[j];
177  }
178  }
179 
180  return frames;
181 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BlowHole.png0000644000076600007660000000107512327015204016301 0ustar gary‰PNG  IHDRVˆJ¼ìšPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÌIDATxíqà Ťßÿ#_«VÑÚ®kt—el¼‹þ†`îo¨ªŽ”$G˱ÿˆ•`f¿~:n’ÖÞņuô=ÅnemµYDZ´n’•]`sM°SB Œ›$ºÆ¦óõñÜÛ‹.¼jB÷|ºÄClÝ„ÎÈž6ÁZï%<YjÂ>°<²ÚM’GùÿÇ~)VUu¸à®¯9Øe™Âƒ]©3¸“°_öëXÇ:@1Ç:Ö±?€UU/(IŽ–c?‹•`vK²X»ïù?ƒ• ¹þ±ä°Þ%¼9Â7dÅhð÷±1/³[!­%N0=Ç&šÉÉ5•pó£ÇÆušpŽÍáw±uØú7nc…´ÖiÂ#lºå>°#)«‡=} $9DŽuìl¬ªêpÀ]-0^s°Ë2…;»Rgp'a¿ì%8Ö±Žu,€bŽu¬c+"2^-Ç~ »nì>µö•Ì*P§¼Àv|ob·²ÒƒË)êÞKßå€YUØx&XÊÚùe™C[ggZÁ¦¸¹Žému:^,¯±×bÛj!(vø½TD32Û„slüž5ᢷݑ €V7z›š°O¥¾–ó{ý`œëØÙX‘áúÕÕ$š 0ðZIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Bowed-members.html0000644000076600007660000003311212327015204017433 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Bowed Member List

This is the complete list of members for stk::Bowed, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
Bowed(StkFloat lowestFrequency=8.0)stk::Bowed
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Bowedvirtual
controlChange(int number, StkFloat value)stk::Bowedvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Bowedvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Bowedvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Bowedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setVibrato(StkFloat gain)stk::Bowedinline
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
startBowing(StkFloat amplitude, StkFloat rate)stk::Bowed
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stopBowing(StkFloat rate)stk::Bowed
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Bowedinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Bowedinlinevirtual
~Bowed(void)stk::Bowed
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Bowed.html0000644000076600007660000011667712327015204016025 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Bowed Class Reference

STK bowed string instrument class. More...

#include <Bowed.h>

Inheritance diagram for stk::Bowed:
stk::Instrmnt stk::Stk

Public Member Functions

 Bowed (StkFloat lowestFrequency=8.0)
 Class constructor, taking the lowest desired playing frequency.
 
 ~Bowed (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setVibrato (StkFloat gain)
 Set vibrato gain.
 
void startBowing (StkFloat amplitude, StkFloat rate)
 Apply breath pressure to instrument with given amplitude and rate of increase.
 
void stopBowing (StkFloat rate)
 Decrease breath pressure with given rate of decrease.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK bowed string instrument class.

This class implements a bowed string model, a la Smith (1986), after McIntyre, Schumacher, Woodhouse (1983).

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others.

Control Change Numbers:

  • Bow Pressure = 2
  • Bow Position = 4
  • Vibrato Frequency = 11
  • Vibrato Gain = 1
  • Bow Velocity = 100
  • Frequency = 101
  • Volume = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014. Contributions by Esteban Maestre, 2011.

Member Function Documentation

StkFrames & stk::Bowed::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

129 {
130  unsigned int nChannels = lastFrame_.channels();
131 #if defined(_STK_DEBUG_)
132  if ( channel > frames.channels() - nChannels ) {
133  oStream_ << "Bowed::tick(): channel and StkFrames arguments are incompatible!";
134  handleError( StkError::FUNCTION_ARGUMENT );
135  }
136 #endif
137 
138  StkFloat *samples = &frames[channel];
139  unsigned int j, hop = frames.channels() - nChannels;
140  if ( nChannels == 1 ) {
141  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
142  *samples++ = tick();
143  }
144  else {
145  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
146  *samples++ = tick();
147  for ( j=1; j<nChannels; j++ )
148  *samples++ = lastFrame_[j];
149  }
150  }
151 
152  return frames;
153 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Bowed.png0000644000076600007660000000111512327015204015621 0ustar gary‰PNG  IHDRLˆz0ý»PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÜIDATxíѮ㠇ƒ”ÿÿäM!¶ÞzµWºN}*°ñ€qª¾’sÎ^"K’&I6½‚¥bÝ|}&î¿‚•ñî³Á¶#lçèëàê~ kû—¼#·Ù¹%iÐ#¬fIíÎæu¾(sšUl‚eN`+³·Y7?o@-ó¸þÖ€Ñ-Iƒâ·)I6L’lZa9çì$€´xɶ,Ž4OØÊò£¹Â~p7`TÀl €M°)`6¬rÎÙKdIòQÀ$ɦ ,ë§’N»Î/þKhýêye¼Îðæ(Ÿ²jÛ£uq?MRo5»X½Â*£«¥í†/[ W3–ù káÏ`c™7ØH~KRo“2 °ZÇqý÷üvù3Ø¥›’ô­&I6ýXÎ9; àýt€·ZGš'leùÑ\a?¸›0*`6 À¦€Ø0›Ö?)¥ä%€`Ó ¶N{ÏÞ$€Gá·°q9ÀUsØv„ú²4gƒ•–AÝq?ððnuã}q±#á„ížÖ­x‚›ÞïlÀŸg The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BowTable Member List

This is the complete list of members for stk::BowTable, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
BowTable(void)stk::BowTableinline
Function(void)stk::Functioninline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastOut(void) const stk::Functioninline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setMaxOutput(StkFloat maximum)stk::BowTableinline
setMinOutput(StkFloat minimum)stk::BowTableinline
setOffset(StkFloat offset)stk::BowTableinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setSlope(StkFloat slope)stk::BowTableinline
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::BowTableinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::BowTableinline
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::BowTableinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BowTable.html0000644000076600007660000012304612327015204016450 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::BowTable Class Reference

STK bowed string table class. More...

#include <BowTable.h>

Inheritance diagram for stk::BowTable:
stk::Function stk::Stk

Public Member Functions

 BowTable (void)
 Default constructor.
 
void setOffset (StkFloat offset)
 Set the table offset value. More...
 
void setSlope (StkFloat slope)
 Set the table slope value. More...
 
void setMinOutput (StkFloat minimum)
 Set the minimum table output value (0.0 - 1.0).
 
void setMaxOutput (StkFloat maximum)
 Set the maximum table output value (0.0 - 1.0).
 
StkFloat tick (StkFloat input)
 Take one sample input and map to one sample of output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the table and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the table and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Function
 Function (void)
 Class constructor.
 
StkFloat lastOut (void) const
 Return the last computed output sample.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK bowed string table class.

This class implements a simple bowed string non-linear function, as described by Smith (1986). The output is an instantaneous reflection coefficient value.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::BowTable::setOffset ( StkFloat  offset)
inline

Set the table offset value.

The table offset is a bias which controls the symmetry of the friction. If you want the friction to vary with direction, use a non-zero value for the offset. The default value is zero.

35 { offset_ = offset; };
void stk::BowTable::setSlope ( StkFloat  slope)
inline

Set the table slope value.

The table slope controls the width of the friction pulse, which is related to bow force.

42 { slope_ = slope; };
StkFrames & stk::BowTable::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inline

Take a channel of the StkFrames object as inputs to the table and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

102 {
103 #if defined(_STK_DEBUG_)
104  if ( channel >= frames.channels() ) {
105  oStream_ << "BowTable::tick(): channel and StkFrames arguments are incompatible!";
106  handleError( StkError::FUNCTION_ARGUMENT );
107  }
108 #endif
109 
110  StkFloat *samples = &frames[channel];
111  unsigned int hop = frames.channels();
112  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
113  *samples = *samples + offset_;
114  *samples *= slope_;
115  *samples = (StkFloat) fabs( (double) *samples ) + 0.75;
116  *samples = (StkFloat) pow( *samples, (StkFloat) -4.0 );
117  if ( *samples > 1.0) *samples = 1.0;
118  }
119 
120  lastFrame_[0] = *(samples-hop);
121  return frames;
122 }
StkFrames & stk::BowTable::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the table and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

125 {
126 #if defined(_STK_DEBUG_)
127  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
128  oStream_ << "BowTable::tick(): channel and StkFrames arguments are incompatible!";
129  handleError( StkError::FUNCTION_ARGUMENT );
130  }
131 #endif
132 
133  StkFloat *iSamples = &iFrames[iChannel];
134  StkFloat *oSamples = &oFrames[oChannel];
135  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
136  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
137  *oSamples = *iSamples + offset_;
138  *oSamples *= slope_;
139  *oSamples = (StkFloat) fabs( (double) *oSamples ) + 0.75;
140  *oSamples = (StkFloat) pow( *oSamples, (StkFloat) -4.0 );
141  if ( *oSamples > 1.0) *oSamples = 1.0;
142  }
143 
144  lastFrame_[0] = *(oSamples-oHop);
145  return iFrames;
146 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1BowTable.png0000644000076600007660000000114012327015204016256 0ustar gary‰PNG  IHDRXˆTuÜ)PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ïIDATxíﲫ Ä—ÍŒïÿÈ·òÏÑZÇœ{:'-[áGØdú""‚äó ðo§ÜÔøõ™L“4ícpî—¹ûà5´5> ©qš$ÎÀ=®Ìhœl„š&ɉހ+ÁºÇg^¼µbJ¨¹ ¶VL’wß ÝfUq/yÕŠ–ºž<;M’ÅE€IÒê+Á""€ËZÀC^àeq"{_\²ø «"À€A0X8À`à¿ñ„$ŸW€ÿ8å¶ ó‡$'Ö~&É#¼4à5²5<Ínõ™çKøùumôW{pá•ÝzhÀÛ¬Z®_ÍÁÛ㱎X7žr.À The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Brass Member List

This is the complete list of members for stk::Brass, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
Brass(StkFloat lowestFrequency=8.0)stk::Brass
channelsOut(void) const stk::Instrmntinline
clear()stk::Brassvirtual
controlChange(int number, StkFloat value)stk::Brassvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Brassvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Brassvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Brassvirtual
setLip(StkFloat frequency)stk::Brass
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
startBlowing(StkFloat amplitude, StkFloat rate)stk::Brass
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stopBlowing(StkFloat rate)stk::Brass
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Brassinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Brassinlinevirtual
~Brass()stk::Brass
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Brass.html0000644000076600007660000012011412327015204016014 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Brass Class Reference

STK simple brass instrument class. More...

#include <Brass.h>

Inheritance diagram for stk::Brass:
stk::Instrmnt stk::Stk

Public Member Functions

 Brass (StkFloat lowestFrequency=8.0)
 Class constructor, taking the lowest desired playing frequency. More...
 
 ~Brass ()
 Class destructor.
 
void clear ()
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setLip (StkFloat frequency)
 Set the lips frequency.
 
void startBlowing (StkFloat amplitude, StkFloat rate)
 Apply breath pressure to instrument with given amplitude and rate of increase.
 
void stopBlowing (StkFloat rate)
 Decrease breath pressure with given rate of decrease.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK simple brass instrument class.

This class implements a simple brass instrument waveguide model, a la Cook (TBone, HosePlayer).

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others.

Control Change Numbers:

  • Lip Tension = 2
  • Slide Length = 4
  • Vibrato Frequency = 11
  • Vibrato Gain = 1
  • Volume = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Brass::Brass ( StkFloat  lowestFrequency = 8.0)

Class constructor, taking the lowest desired playing frequency.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::Brass::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

119 {
120  unsigned int nChannels = lastFrame_.channels();
121 #if defined(_STK_DEBUG_)
122  if ( channel > frames.channels() - nChannels ) {
123  oStream_ << "Brass::tick(): channel and StkFrames arguments are incompatible!";
124  handleError( StkError::FUNCTION_ARGUMENT );
125  }
126 #endif
127 
128  StkFloat *samples = &frames[channel];
129  unsigned int j, hop = frames.channels() - nChannels;
130  if ( nChannels == 1 ) {
131  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
132  *samples++ = tick();
133  }
134  else {
135  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
136  *samples++ = tick();
137  for ( j=1; j<nChannels; j++ )
138  *samples++ = lastFrame_[j];
139  }
140  }
141 
142  return frames;
143 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Brass.png0000644000076600007660000000110512327015204015632 0ustar gary‰PNG  IHDRLˆz0ý»PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÔIDATxíá’¤ ›*ßÿ‘Oœ1{¹º©Ú¸´%AZ’ìÖþ%眽 K’!“$ïd©Œn¾^“ðdåyÙdÛ¶sôëÃ5üQÖ¾_ö{K’]X’neu׸©Õlžç›4§»êM²1ÍIliöcÖÍç ¨iåo Ã’4›’d#d’dc•圳X¼ð”-‹£ÍS¶ºül®²/îfÈŒ„ ÀFÈl„ ÀFÈl„¬¿rÎÙ ²$ù2I²q‘¥2ú©¤s\ç—ø?’¥M´Þz_yÞÎå-P~Ê[ûj‰÷²}µ¾ÜO“Ôº»Œ~õ*«Ž.—öýsùò©¡4cš÷²¶üL6¦ù"ÍdIêÇ$Mƒ¬æq”ÿu+þLvé¦$ý-!“$¿G–sÎN<àüGøÈ²8ÚñDÖnï¸È¶#Ôß—o²=¼Ÿ²¿ßÈvGûîf-Ó:IÐ7²úrm5;bÍqÍ}’æ‹ìL³ªŸ¥Ùåp†Y“Îw[³iL5«iå¯ï5;zý(M€Ÿ2¿G–RJNü\É b*ÌIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Chorus-members.html0000644000076600007660000003077612327015204017653 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Chorus Member List

This is the complete list of members for stk::Chorus, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Effectinline
Chorus(StkFloat baseDelay=6000)stk::Chorus
clear(void)stk::Chorusvirtual
Effect(void)stk::Effectinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Effectinline
lastOut(unsigned int channel=0)stk::Chorusinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setEffectMix(StkFloat mix)stk::Effectinlinevirtual
setModDepth(StkFloat depth)stk::Chorus
setModFrequency(StkFloat frequency)stk::Chorus
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input, unsigned int channel=0)stk::Chorusinline
tick(StkFrames &frames, unsigned int channel=0)stk::Chorusinline
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::Chorusinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Chorus.html0000644000076600007660000014762612327015204016226 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Chorus Class Reference

STK chorus effect class. More...

#include <Chorus.h>

Inheritance diagram for stk::Chorus:
stk::Effect stk::Stk

Public Member Functions

 Chorus (StkFloat baseDelay=6000)
 Class constructor, taking the median desired delay length. More...
 
void clear (void)
 Reset and clear all internal state.
 
void setModDepth (StkFloat depth)
 Set modulation depth in range 0.0 - 1.0.
 
void setModFrequency (StkFloat frequency)
 Set modulation frequency.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed stereo frame. More...
 
StkFloat tick (StkFloat input, unsigned int channel=0)
 Input one sample to the effect and return the specified channel value of the computed stereo frame. More...
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the effect and replace with stereo outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Effect
 Effect (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual void setEffectMix (StkFloat mix)
 Set the mixture of input and "effected" levels in the output (0.0 = input only, 1.0 = effect only).
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK chorus effect class.

This class implements a chorus effect. It takes a monophonic input signal and produces a stereo output signal.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Chorus::Chorus ( StkFloat  baseDelay = 6000)

Class constructor, taking the median desired delay length.

An StkError can be thrown if the rawwave path is incorrect.

Member Function Documentation

StkFloat stk::Chorus::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed stereo frame.

Use the lastFrame() function to get both values of the last computed stereo frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

94 {
95 #if defined(_STK_DEBUG_)
96  if ( channel > 1 ) {
97  oStream_ << "Chorus::lastOut(): channel argument must be less than 2!";
98  handleError( StkError::FUNCTION_ARGUMENT );
99  }
100 #endif
101 
102  return lastFrame_[channel];
103 }
StkFloat stk::Chorus::tick ( StkFloat  input,
unsigned int  channel = 0 
)
inline

Input one sample to the effect and return the specified channel value of the computed stereo frame.

Use the lastFrame() function to get both values of the computed stereo output frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

106 {
107 #if defined(_STK_DEBUG_)
108  if ( channel > 1 ) {
109  oStream_ << "Chorus::tick(): channel argument must be less than 2!";
110  handleError( StkError::FUNCTION_ARGUMENT );
111  }
112 #endif
113 
114  delayLine_[0].setDelay( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].tick() ) );
115  delayLine_[1].setDelay( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].tick() ) );
116  lastFrame_[0] = effectMix_ * ( delayLine_[0].tick( input ) - input ) + input;
117  lastFrame_[1] = effectMix_ * ( delayLine_[1].tick( input ) - input ) + input;
118  return lastFrame_[channel];
119 }
StkFrames & stk::Chorus::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inline

Take a channel of the StkFrames object as inputs to the effect and replace with stereo outputs.

The StkFrames argument reference is returned. The stereo outputs are written to the StkFrames argument starting at the specified channel. Therefore, the channel argument must be less than ( channels() - 1 ) of the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

122 {
123 #if defined(_STK_DEBUG_)
124  if ( channel >= frames.channels() - 1 ) {
125  oStream_ << "Chorus::tick(): channel and StkFrames arguments are incompatible!";
126  handleError( StkError::FUNCTION_ARGUMENT );
127  }
128 #endif
129 
130  StkFloat *samples = &frames[channel];
131  unsigned int hop = frames.channels() - 1;
132  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
133  delayLine_[0].setDelay( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].tick() ) );
134  delayLine_[1].setDelay( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].tick() ) );
135  *samples = effectMix_ * ( delayLine_[0].tick( *samples ) - *samples ) + *samples;
136  samples++;
137  *samples = effectMix_ * ( delayLine_[1].tick( *samples ) - *samples ) + *samples;
138  }
139 
140  lastFrame_[0] = *(samples-hop);
141  lastFrame_[1] = *(samples-hop+1);
142  return frames;
143 }
StkFrames & stk::Chorus::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object.

The iFrames object reference is returned. The iChannel argument must be less than the number of channels in the iFrames argument (the first channel is specified by 0). The oChannel argument must be less than ( channels() - 1 ) of the oFrames argument. However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

146 {
147 #if defined(_STK_DEBUG_)
148  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() - 1 ) {
149  oStream_ << "Chorus::tick(): channel and StkFrames arguments are incompatible!";
150  handleError( StkError::FUNCTION_ARGUMENT );
151  }
152 #endif
153 
154  StkFloat *iSamples = &iFrames[iChannel];
155  StkFloat *oSamples = &oFrames[oChannel];
156  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
157  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
158  delayLine_[0].setDelay( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].tick() ) );
159  delayLine_[1].setDelay( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].tick() ) );
160  *oSamples = effectMix_ * ( delayLine_[0].tick( *iSamples ) - *iSamples ) + *iSamples;
161  *(oSamples+1) = effectMix_ * ( delayLine_[1].tick( *iSamples ) - *iSamples ) + *iSamples;
162  }
163 
164  lastFrame_[0] = *(oSamples-oHop);
165  lastFrame_[1] = *(oSamples-oHop+1);
166  return iFrames;
167 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Chorus.png0000644000076600007660000000110512327015204016023 0ustar gary‰PNG  IHDRJˆw.üPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÔIDATxíÑŽ„ E—Äÿÿäu´(Ž]&Ù’Þ•Úâd^É9ç9"KÒ J’|zƒJÅÌz÷/Pe¾ù>A½Žå`Ãêäì~@íg—¨YÊ3nIÝ¡jL²÷jXá}ؚ쨾ÀAÛ?)ÐÚè½m¯¶¦ïmïÝ’:‹Ÿ³$ù(IòiEåœó À§@ø(ŸUFÎ9ÏY’f(P’äÓ•ŠË2Êd“¤ÃÌÚ2Ï3è j;8u´:)îš]q•G_Q¡XÍÁ0[VÇ›SþgTÝ`v´^ PO^Pç¬òû¶ÛoP} ï ´vzîU-°5½2O½ênж"~Î’äS $ɧ•sÎSð¬¯ü£_–i¬y¨•4‹5õ¥7(§àS | €Oð)Pe¤”Ò‘f(P>Pë¢G—›9;®z@•Å…pÕz^?Ž=ÐLJreCjÉn‹ÚÅꦎy¬[øe—EÕw¦˜.=‹ê]£hÒí<¨aÖ7xE™ lMo;Ìwµ½oðcï¨@€?(P>ýTJ)MѺٲ,¤ÀIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Clarinet-members.html0000644000076600007660000003265412327015204020146 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Clarinet Member List

This is the complete list of members for stk::Clarinet, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
Clarinet(StkFloat lowestFrequency=8.0)stk::Clarinet
clear(void)stk::Clarinetvirtual
controlChange(int number, StkFloat value)stk::Clarinetvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Clarinetvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Clarinetvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Clarinetvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
startBlowing(StkFloat amplitude, StkFloat rate)stk::Clarinet
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stopBlowing(StkFloat rate)stk::Clarinet
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Clarinetinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Clarinetinlinevirtual
~Clarinet(void)stk::Clarinet
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Clarinet.html0000644000076600007660000011733512327015204016516 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Clarinet Class Reference

STK clarinet physical model class. More...

#include <Clarinet.h>

Inheritance diagram for stk::Clarinet:
stk::Instrmnt stk::Stk

Public Member Functions

 Clarinet (StkFloat lowestFrequency=8.0)
 Class constructor, taking the lowest desired playing frequency. More...
 
 ~Clarinet (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void startBlowing (StkFloat amplitude, StkFloat rate)
 Apply breath pressure to instrument with given amplitude and rate of increase.
 
void stopBlowing (StkFloat rate)
 Decrease breath pressure with given rate of decrease.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK clarinet physical model class.

This class implements a simple clarinet physical model, as discussed by Smith (1986), McIntyre, Schumacher, Woodhouse (1983), and others.

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others.

Control Change Numbers:

  • Reed Stiffness = 2
  • Noise Gain = 4
  • Vibrato Frequency = 11
  • Vibrato Gain = 1
  • Breath Pressure = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Clarinet::Clarinet ( StkFloat  lowestFrequency = 8.0)

Class constructor, taking the lowest desired playing frequency.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::Clarinet::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

124 {
125  unsigned int nChannels = lastFrame_.channels();
126 #if defined(_STK_DEBUG_)
127  if ( channel > frames.channels() - nChannels ) {
128  oStream_ << "Clarinet::tick(): channel and StkFrames arguments are incompatible!";
129  handleError( StkError::FUNCTION_ARGUMENT );
130  }
131 #endif
132 
133  StkFloat *samples = &frames[channel];
134  unsigned int j, hop = frames.channels() - nChannels;
135  if ( nChannels == 1 ) {
136  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
137  *samples++ = tick();
138  }
139  else {
140  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
141  *samples++ = tick();
142  for ( j=1; j<nChannels; j++ )
143  *samples++ = lastFrame_[j];
144  }
145  }
146 
147  return frames;
148 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Clarinet.png0000644000076600007660000000112412327015204016322 0ustar gary‰PNG  IHDRMˆ•ò–…PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ãIDATxíÛ®ã0E—·¥þÿ'Oâ8‰qÒ =ŒæHCËn6+`zy¥ÖZÃD•¤ %M’üzE+ÍyÜ„¿£µë-椭E¬•Œ™ýb¿§´Ä=¹õ9„%Éê)­§Ù¬ãÜž´ú¢ÓÛ´^²f;½™‚³ÓÑîfê˜BïtŸÁ1–$«üžJ’_I“$¿Z­µF à=ÂJ{<"q¡´ˆ‹¥ýê™& à % À¯¤ø•4¿’àWÒcµÖ&ª$)i’ä×D+ÍFWÒi³?Çÿ­¬¤åe¶ëuá\^íÙvm«-nhÛrß=ºE­§7W/´Ú9*8—§{ÙÓ±>§ËÒl§šE¿£i´›N=´ÞÊ>ƒ+à˜Àmž©$ýXI“$¿þ+Z­µF àý›ÿz€·z<"q¡´ˆ‹¥ýê™& à % À¯¤ø•4¿’àWÒc¥”& @’à×D[Koƒšƒ× zà ­9—[X]hk ýsäš‹­Ê–ÑötwÏ3´ ²m]SóÝÜsǹq¤õ…¡«¹Èƒx÷véô%mÈ€Ù¢7S;½ÒÒ]QOÏmÆ™ruºÏ`ß1¶wÜ eM~ë¾RÒüZXJ)%HÖ åÖ+7ˆIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Cubic-members.html0000644000076600007660000003036312327015204017425 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Cubic Member List

This is the complete list of members for stk::Cubic, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
Cubic(void)stk::Cubicinline
Function(void)stk::Functioninline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastOut(void) const stk::Functioninline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setA1(StkFloat a1)stk::Cubicinline
setA2(StkFloat a2)stk::Cubicinline
setA3(StkFloat a3)stk::Cubicinline
setGain(StkFloat gain)stk::Cubicinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setThreshold(StkFloat threshold)stk::Cubicinline
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::Cubicinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Cubicinline
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::Cubicinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Cubic.html0000644000076600007660000011642512327015204016001 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Cubic Class Reference

STK cubic non-linearity class. More...

#include <Cubic.h>

Inheritance diagram for stk::Cubic:
stk::Function stk::Stk

Public Member Functions

 Cubic (void)
 Default constructor.
 
void setA1 (StkFloat a1)
 Set the a1 coefficient value.
 
void setA2 (StkFloat a2)
 Set the a2 coefficient value.
 
void setA3 (StkFloat a3)
 Set the a3 coefficient value.
 
void setGain (StkFloat gain)
 Set the gain value.
 
void setThreshold (StkFloat threshold)
 Set the threshold value.
 
StkFloat tick (StkFloat input)
 Input one sample to the function and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the function and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the function and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Function
 Function (void)
 Class constructor.
 
StkFloat lastOut (void) const
 Return the last computed output sample.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK cubic non-linearity class.

This class implements the cubic non-linearity that was used in SynthBuilder.

The formula implemented is:

output = gain * (a1 * input + a2 * input^2 + a3 * input^3)

followed by a limiter for values outside +-threshold.

Ported to STK by Nick Porcaro, 2007. Updated for inclusion in STK distribution by Gary Scavone, 2011.

Member Function Documentation

StkFrames & stk::Cubic::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inline

Take a channel of the StkFrames object as inputs to the function and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

100 {
101 #if defined(_STK_DEBUG_)
102  if ( channel >= frames.channels() ) {
103  oStream_ << "Cubic::tick(): channel and StkFrames arguments are incompatible!";
104  handleError( StkError::FUNCTION_ARGUMENT );
105  }
106 #endif
107 
108  StkFloat *samples = &frames[channel];
109  unsigned int hop = frames.channels();
110  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
111  *samples = tick( *samples );
112 
113  lastFrame_[0] = *(samples-hop);
114  return frames;
115 }
StkFrames & stk::Cubic::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the function and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

118 {
119 #if defined(_STK_DEBUG_)
120  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
121  oStream_ << "Cubic::tick(): channel and StkFrames arguments are incompatible!";
122  handleError( StkError::FUNCTION_ARGUMENT );
123  }
124 #endif
125 
126  StkFloat *iSamples = &iFrames[iChannel];
127  StkFloat *oSamples = &oFrames[oChannel];
128  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
129  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop )
130  *oSamples = tick( *iSamples );
131 
132  lastFrame_[0] = *(oSamples-oHop);
133  return iFrames;
134 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Cubic.png0000644000076600007660000000111112327015204015602 0ustar gary‰PNG  IHDRRˆCWLàPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ØIDATxí[’¬ “C„û_òU-ð1íÜ3C …dWQö?9çì…,IN†R’<|¡Le„õü¹K:Æ;e™¯±ï(—t–œâñmÒ‡%…q«Üs)§«¡”Â’Ôó¤ÜζG÷»¼­ü¹ð˳[òßP¶…_´ç;…ÇqÕñ·íÙ ¯ÍÙÛÓ†%©güÇ%ÉÃPJ’‡Y™sÎV>cðâWN“ÝéWÎF·ó”¿¤ãC `b(< %€‡¡ð0”†à‘œsöB–$'C)I:e*ãX–$]Ð=û©R’î¸Û<”K6KJÑZ'Ëw‰¯)—Ì·gמ•«i=—òˆ†ÇãV¯<6›»ŒYÆêý'åªê•}áï”máe’â8)ëeÝÝå}áµ9½{B“ÛŽ_.I†R’<üeeÎ9[øŒ À‹_9Mv§_9ÝÎPþ’Ž%€‰¡ð0”†ÀÃPxJ€GRJÉ ÀÉPx¸QÎÁ6^:·ÃLJʲ8"••K6Û˵o5“²Qr.Ä쯕«i=—­2 The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Delay Member List

This is the complete list of members for stk::Delay, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
addTo(StkFloat value, unsigned long tapDelay)stk::Delay
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Delay(unsigned long delay=0, unsigned long maxDelay=4095)stk::Delay
energy(void) const stk::Delay
Filter(void)stk::Filterinline
getDelay(void) const stk::Delayinline
getGain(void) const stk::Filterinline
getMaximumDelay(void)stk::Delayinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::Delayinline
nextOut(void)stk::Delayinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setDelay(unsigned long delay)stk::Delay
setGain(StkFloat gain)stk::Filterinline
setMaximumDelay(unsigned long delay)stk::Delay
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tapIn(StkFloat value, unsigned long tapDelay)stk::Delay
tapOut(unsigned long tapDelay)stk::Delay
tick(StkFloat input)stk::Delayinline
tick(StkFrames &frames, unsigned int channel=0)stk::Delayinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::Delayinline
~Delay()stk::Delay
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Delay.html0000644000076600007660000015565312327015204016020 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Delay Class Reference

STK non-interpolating delay line class. More...

#include <Delay.h>

Inheritance diagram for stk::Delay:
stk::Filter stk::Stk

Public Member Functions

 Delay (unsigned long delay=0, unsigned long maxDelay=4095)
 The default constructor creates a delay-line with maximum length of 4095 samples and zero delay. More...
 
 ~Delay ()
 Class destructor.
 
unsigned long getMaximumDelay (void)
 Get the maximum delay-line length.
 
void setMaximumDelay (unsigned long delay)
 Set the maximum delay-line length. More...
 
void setDelay (unsigned long delay)
 Set the delay-line length. More...
 
unsigned long getDelay (void) const
 Return the current delay-line length.
 
StkFloat tapOut (unsigned long tapDelay)
 Return the value at tapDelay samples from the delay-line input. More...
 
void tapIn (StkFloat value, unsigned long tapDelay)
 Set the value at tapDelay samples from the delay-line input.
 
StkFloat addTo (StkFloat value, unsigned long tapDelay)
 Sum the provided value into the delay line at tapDelay samples from the input. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat nextOut (void)
 Return the value that will be output by the next call to tick(). More...
 
StkFloat energy (void) const
 Calculate and return the signal energy in the delay-line.
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK non-interpolating delay line class.

This class implements a non-interpolating digital delay-line. If the delay and maximum length are not specified during instantiation, a fixed maximum length of 4095 and a delay of zero is set.

A non-interpolating delay line is typically used in fixed delay-length applications, such as for reverberation.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Delay::Delay ( unsigned long  delay = 0,
unsigned long  maxDelay = 4095 
)

The default constructor creates a delay-line with maximum length of 4095 samples and zero delay.

An StkError will be thrown if the delay parameter is less than zero, the maximum delay parameter is less than one, or the delay parameter is greater than the maxDelay value.

Member Function Documentation

void stk::Delay::setMaximumDelay ( unsigned long  delay)

Set the maximum delay-line length.

This method should generally only be used during initial setup of the delay line. If it is used between calls to the tick() function, without a call to clear(), a signal discontinuity will likely occur. If the current maximum length is greater than the new length, no memory allocation change is made.

void stk::Delay::setDelay ( unsigned long  delay)

Set the delay-line length.

The valid range for delay is from 0 to the maximum delay-line length.

StkFloat stk::Delay::tapOut ( unsigned long  tapDelay)

Return the value at tapDelay samples from the delay-line input.

The tap point is determined modulo the delay-line length and is relative to the last input value (i.e., a tapDelay of zero returns the last input value).

StkFloat stk::Delay::addTo ( StkFloat  value,
unsigned long  tapDelay 
)

Sum the provided value into the delay line at tapDelay samples from the input.

The new value is returned. The tap point is determined modulo the delay-line length and is relative to the last input value (i.e., a tapDelay of zero sums into the last input value).

StkFloat stk::Delay::nextOut ( void  )
inline

Return the value that will be output by the next call to tick().

This method is valid only for delay settings greater than zero!

87 { return inputs_[outPoint_]; };
StkFrames & stk::Delay::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

142 {
143 #if defined(_STK_DEBUG_)
144  if ( channel >= frames.channels() ) {
145  oStream_ << "Delay::tick(): channel and StkFrames arguments are incompatible!";
146  handleError( StkError::FUNCTION_ARGUMENT );
147  }
148 #endif
149 
150  StkFloat *samples = &frames[channel];
151  unsigned int hop = frames.channels();
152  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
153  inputs_[inPoint_++] = *samples * gain_;
154  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
155  *samples = inputs_[outPoint_++];
156  if ( outPoint_ == inputs_.size() ) outPoint_ = 0;
157  }
158 
159  lastFrame_[0] = *(samples-hop);
160  return frames;
161 }
StkFrames & stk::Delay::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

164 {
165 #if defined(_STK_DEBUG_)
166  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
167  oStream_ << "Delay::tick(): channel and StkFrames arguments are incompatible!";
168  handleError( StkError::FUNCTION_ARGUMENT );
169  }
170 #endif
171 
172  StkFloat *iSamples = &iFrames[iChannel];
173  StkFloat *oSamples = &oFrames[oChannel];
174  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
175  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
176  inputs_[inPoint_++] = *iSamples * gain_;
177  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
178  *oSamples = inputs_[outPoint_++];
179  if ( outPoint_ == inputs_.size() ) outPoint_ = 0;
180  }
181 
182  lastFrame_[0] = *(oSamples-oHop);
183  return iFrames;
184 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Delay.png0000644000076600007660000000102512327015204015617 0ustar gary‰PNG  IHDRBˆdùÍPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2¤IDATxíÝŽë „Ç¶”÷ä“!6˜$gÝ‹JuÅdù1öno!"„™9¢D<"¨45Þ?Îô J¿Î½AÇgêðÖ§ˆ~V‰>w”2Ôô¢ÅÚÐîÅT‰_ˆÛ’{°…8v¾)D7ïFžìl…œfv;ít~͘™g% DDB€{mS±maF±¢Œ ¾äF‘˜”ˆDÀ¨Dü$BD$&3sD‰¸APi×°|Îi½ò±\qå´ý¡cÏN™«ù2š*ÝcÕ¦nj)ê§XD‹ÕÙW+˜øj]~!bÊâbºvêBVˆÉgß‹…o 9ÍtíÔ7’_3ff«D„ˆHHp¯¯øAܶ0#ŽØ QÆ_r#‰HLJD"`T"~AD"Jıô¸n–Àê1ì{@ǵKs The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::DelayA Member List

This is the complete list of members for stk::DelayA, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::DelayAvirtual
DelayA(StkFloat delay=0.5, unsigned long maxDelay=4095)stk::DelayA
Filter(void)stk::Filterinline
getDelay(void) const stk::DelayAinline
getGain(void) const stk::Filterinline
getMaximumDelay(void)stk::DelayAinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::DelayAinline
nextOut(void)stk::DelayAinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setDelay(StkFloat delay)stk::DelayA
setGain(StkFloat gain)stk::Filterinline
setMaximumDelay(unsigned long delay)stk::DelayA
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tapIn(StkFloat value, unsigned long tapDelay)stk::DelayA
tapOut(unsigned long tapDelay)stk::DelayA
tick(StkFloat input)stk::DelayAinline
tick(StkFrames &frames, unsigned int channel=0)stk::DelayAinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::DelayAinline
~DelayA()stk::DelayA
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1DelayA.html0000644000076600007660000015513012327015204016107 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::DelayA Class Reference

STK allpass interpolating delay line class. More...

#include <DelayA.h>

Inheritance diagram for stk::DelayA:
stk::Filter stk::Stk

Public Member Functions

 DelayA (StkFloat delay=0.5, unsigned long maxDelay=4095)
 Default constructor creates a delay-line with maximum length of 4095 samples and delay = 0.5. More...
 
 ~DelayA ()
 Class destructor.
 
void clear (void)
 Clears all internal states of the delay line.
 
unsigned long getMaximumDelay (void)
 Get the maximum delay-line length.
 
void setMaximumDelay (unsigned long delay)
 Set the maximum delay-line length. More...
 
void setDelay (StkFloat delay)
 Set the delay-line length. More...
 
StkFloat getDelay (void) const
 Return the current delay-line length.
 
StkFloat tapOut (unsigned long tapDelay)
 Return the value at tapDelay samples from the delay-line input. More...
 
void tapIn (StkFloat value, unsigned long tapDelay)
 Set the value at tapDelay samples from the delay-line input.
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat nextOut (void)
 Return the value which will be output by the next call to tick(). More...
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK allpass interpolating delay line class.

This class implements a fractional-length digital delay-line using a first-order allpass filter. If the delay and maximum length are not specified during instantiation, a fixed maximum length of 4095 and a delay of 0.5 is set.

An allpass filter has unity magnitude gain but variable phase delay properties, making it useful in achieving fractional delays without affecting a signal's frequency magnitude response. In order to achieve a maximally flat phase delay response, the minimum delay possible in this implementation is limited to a value of 0.5.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::DelayA::DelayA ( StkFloat  delay = 0.5,
unsigned long  maxDelay = 4095 
)

Default constructor creates a delay-line with maximum length of 4095 samples and delay = 0.5.

An StkError will be thrown if the delay parameter is less than zero, the maximum delay parameter is less than one, or the delay parameter is greater than the maxDelay value.

Member Function Documentation

void stk::DelayA::setMaximumDelay ( unsigned long  delay)

Set the maximum delay-line length.

This method should generally only be used during initial setup of the delay line. If it is used between calls to the tick() function, without a call to clear(), a signal discontinuity will likely occur. If the current maximum length is greater than the new length, no memory allocation change is made.

void stk::DelayA::setDelay ( StkFloat  delay)

Set the delay-line length.

The valid range for delay is from 0.5 to the maximum delay-line length.

StkFloat stk::DelayA::tapOut ( unsigned long  tapDelay)

Return the value at tapDelay samples from the delay-line input.

The tap point is determined modulo the delay-line length and is relative to the last input value (i.e., a tapDelay of zero returns the last input value).

StkFloat stk::DelayA::nextOut ( void  )
inline

Return the value which will be output by the next call to tick().

This method is valid only for delay settings greater than zero!

126 {
127  if ( doNextOut_ ) {
128  // Do allpass interpolation delay.
129  nextOutput_ = -coeff_ * lastFrame_[0];
130  nextOutput_ += apInput_ + ( coeff_ * inputs_[outPoint_] );
131  doNextOut_ = false;
132  }
133 
134  return nextOutput_;
135 }
StkFrames & stk::DelayA::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

157 {
158 #if defined(_STK_DEBUG_)
159  if ( channel >= frames.channels() ) {
160  oStream_ << "DelayA::tick(): channel and StkFrames arguments are incompatible!";
161  handleError( StkError::FUNCTION_ARGUMENT );
162  }
163 #endif
164 
165  StkFloat *samples = &frames[channel];
166  unsigned int hop = frames.channels();
167  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
168  inputs_[inPoint_++] = *samples * gain_;
169  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
170  *samples = nextOut();
171  lastFrame_[0] = *samples;
172  doNextOut_ = true;
173  apInput_ = inputs_[outPoint_++];
174  if ( outPoint_ == inputs_.size() ) outPoint_ = 0;
175  }
176 
177  return frames;
178 }
StkFrames & stk::DelayA::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

181 {
182 #if defined(_STK_DEBUG_)
183  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
184  oStream_ << "DelayA::tick(): channel and StkFrames arguments are incompatible!";
185  handleError( StkError::FUNCTION_ARGUMENT );
186  }
187 #endif
188 
189  StkFloat *iSamples = &iFrames[iChannel];
190  StkFloat *oSamples = &oFrames[oChannel];
191  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
192  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
193  inputs_[inPoint_++] = *iSamples * gain_;
194  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
195  *oSamples = nextOut();
196  lastFrame_[0] = *oSamples;
197  doNextOut_ = true;
198  apInput_ = inputs_[outPoint_++];
199  if ( outPoint_ == inputs_.size() ) outPoint_ = 0;
200  }
201 
202  return iFrames;
203 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1DelayA.png0000644000076600007660000000112712327015204015723 0ustar gary‰PNG  IHDRKˆ˜ìæÂPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2æIDATxíÛŽ¬0 +‰ÿÿä!€ÌÈÒÙ‡ 4› ®qÛÃÎ+9ç$²$…h°$ɯV*ì竳ý «Ì×½O¬%% W'çí7Öþé%l -Ͷ$5ºcÕ 6f¯Wßä½ÇnPM÷ «õØ©ý'vôúè®}õ¸U~¯}»-IÆ»-I~ –$ù5³rÎ9FȚ¦8X kF…Á"Y¶ƒðAƒà×`ø5X~ €_ƒµ_9ç$²$…h°$ɯ.+•q,˵mÛIf¸X·'’Ì8³ÊçÏ7´MÊÞšár+«–q²<Öºjlµ9^Y5È[Ë¥¤cìzñxa]ò:àϵ·ïXצ<×ë¦öŸ=n•ïÖÞöQÒ1Æ»-I~ –$ù5³rÎ9Fïú¿Ûoš¦8X kF…Á"Y¶ƒðAƒà×`ø5X~ €_ƒµ_)¥$@ˆ À¯k^ØõÚæ Ñ±÷Â::,8¦Kõ;bN·ûšßivÇZeÔçvh[ÇŸƒybÕ§.žZ‚ƒµ2nYkªG“´íŽ­½õØÉëœÐ‘Ò~z­×©öÆŠ“U=nÔÀÝAÛGÓÅ. à‹®q?³ž¿¶nõߦñÿ À«`VJ)ÅèÉç :t6†}IEND®B`‚stk-4.5.0/doc/html/classstk_1_1DelayL-members.html0000644000076600007660000003572012327015204017554 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::DelayL Member List

This is the complete list of members for stk::DelayL, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
DelayL(StkFloat delay=0.0, unsigned long maxDelay=4095)stk::DelayL
Filter(void)stk::Filterinline
getDelay(void) const stk::DelayLinline
getGain(void) const stk::Filterinline
getMaximumDelay(void)stk::DelayLinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::DelayLinline
nextOut(void)stk::DelayLinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setDelay(StkFloat delay)stk::DelayL
setGain(StkFloat gain)stk::Filterinline
setMaximumDelay(unsigned long delay)stk::DelayL
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tapIn(StkFloat value, unsigned long tapDelay)stk::DelayL
tapOut(unsigned long tapDelay)stk::DelayL
tick(StkFloat input)stk::DelayLinline
tick(StkFrames &frames, unsigned int channel=0)stk::DelayLinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::DelayLinline
~DelayL()stk::DelayL
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1DelayL.html0000644000076600007660000015625312327015204016131 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::DelayL Class Reference

STK linear interpolating delay line class. More...

#include <DelayL.h>

Inheritance diagram for stk::DelayL:
stk::Filter stk::Stk

Public Member Functions

 DelayL (StkFloat delay=0.0, unsigned long maxDelay=4095)
 Default constructor creates a delay-line with maximum length of 4095 samples and zero delay. More...
 
 ~DelayL ()
 Class destructor.
 
unsigned long getMaximumDelay (void)
 Get the maximum delay-line length.
 
void setMaximumDelay (unsigned long delay)
 Set the maximum delay-line length. More...
 
void setDelay (StkFloat delay)
 Set the delay-line length. More...
 
StkFloat getDelay (void) const
 Return the current delay-line length.
 
StkFloat tapOut (unsigned long tapDelay)
 Return the value at tapDelay samples from the delay-line input. More...
 
void tapIn (StkFloat value, unsigned long tapDelay)
 Set the value at tapDelay samples from the delay-line input.
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat nextOut (void)
 Return the value which will be output by the next call to tick(). More...
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK linear interpolating delay line class.

This class implements a fractional-length digital delay-line using first-order linear interpolation. If the delay and maximum length are not specified during instantiation, a fixed maximum length of 4095 and a delay of zero is set.

Linear interpolation is an efficient technique for achieving fractional delay lengths, though it does introduce high-frequency signal attenuation to varying degrees depending on the fractional delay setting. The use of higher order Lagrange interpolators can typically improve (minimize) this attenuation characteristic.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::DelayL::DelayL ( StkFloat  delay = 0.0,
unsigned long  maxDelay = 4095 
)

Default constructor creates a delay-line with maximum length of 4095 samples and zero delay.

An StkError will be thrown if the delay parameter is less than zero, the maximum delay parameter is less than one, or the delay parameter is greater than the maxDelay value.

Member Function Documentation

void stk::DelayL::setMaximumDelay ( unsigned long  delay)

Set the maximum delay-line length.

This method should generally only be used during initial setup of the delay line. If it is used between calls to the tick() function, without a call to clear(), a signal discontinuity will likely occur. If the current maximum length is greater than the new length, no memory allocation change is made.

void stk::DelayL::setDelay ( StkFloat  delay)

Set the delay-line length.

The valid range for delay is from 0 to the maximum delay-line length.

StkFloat stk::DelayL::tapOut ( unsigned long  tapDelay)

Return the value at tapDelay samples from the delay-line input.

The tap point is determined modulo the delay-line length and is relative to the last input value (i.e., a tapDelay of zero returns the last input value).

StkFloat stk::DelayL::nextOut ( void  )
inline

Return the value which will be output by the next call to tick().

This method is valid only for delay settings greater than zero!

121 {
122  if ( doNextOut_ ) {
123  // First 1/2 of interpolation
124  nextOutput_ = inputs_[outPoint_] * omAlpha_;
125  // Second 1/2 of interpolation
126  if (outPoint_+1 < inputs_.size())
127  nextOutput_ += inputs_[outPoint_+1] * alpha_;
128  else
129  nextOutput_ += inputs_[0] * alpha_;
130  doNextOut_ = false;
131  }
132 
133  return nextOutput_;
134 }
StkFrames & stk::DelayL::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

155 {
156 #if defined(_STK_DEBUG_)
157  if ( channel >= frames.channels() ) {
158  oStream_ << "DelayL::tick(): channel and StkFrames arguments are incompatible!";
159  handleError( StkError::FUNCTION_ARGUMENT );
160  }
161 #endif
162 
163  StkFloat *samples = &frames[channel];
164  unsigned int hop = frames.channels();
165  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
166  inputs_[inPoint_++] = *samples * gain_;
167  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
168  *samples = nextOut();
169  doNextOut_ = true;
170  if ( ++outPoint_ == inputs_.size() ) outPoint_ = 0;
171  }
172 
173  lastFrame_[0] = *(samples-hop);
174  return frames;
175 }
StkFrames & stk::DelayL::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

178 {
179 #if defined(_STK_DEBUG_)
180  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
181  oStream_ << "DelayL::tick(): channel and StkFrames arguments are incompatible!";
182  handleError( StkError::FUNCTION_ARGUMENT );
183  }
184 #endif
185 
186  StkFloat *iSamples = &iFrames[iChannel];
187  StkFloat *oSamples = &oFrames[oChannel];
188  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
189  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
190  inputs_[inPoint_++] = *iSamples * gain_;
191  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
192  *oSamples = nextOut();
193  doNextOut_ = true;
194  if ( ++outPoint_ == inputs_.size() ) outPoint_ = 0;
195  }
196 
197  lastFrame_[0] = *(oSamples-oHop);
198  return iFrames;
199 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1DelayL.png0000644000076600007660000000110712327015204015734 0ustar gary‰PNG  IHDRIˆœ6ÿPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÖIDATxíA’„ EŸ*ïäQDE£SYô"]ùòL=½%çœ]D–$I’lÝ“R±f>îï¤2^}HËË— Ú¨:8»ŸIû›KÐXjkÜ’:»!Õ>bïÓ°¼Ûê†!5Õ÷¤¾ºAÇ?T×Úèì^v¼V·õ{ïxï–ÔY|ƒ%ÉV$ÉÖLÊ9g˜š\äFš&/”i9¡üH?yvAx¡ Ø €­ Ø €­ AÎ9»ˆ,I ’$Ù‘R±cZ>›»]‘tØÒ튤ÃN¤òîùцlƒâ[³[evKjjX6õõtuù]H5¤-im“’ÛõXÝ…tÉé@?u¼­îŽt=Ч>Ýtücu[¿‡oÏ.¾Á’ôMA’$[3)çœ=`ê꤃ åFšAN(?ÒOž]^(H¶‚`+H¶‚`+HRJ."8(H¶N¤yÒÎ×3é–Æ‡AºìZ’–—×[±¯¯ƒå¹ævI«»Ø±k'õ®þÏ€T/Õ\ŸI+á–´¶¾V×e7êx[Ý §.™£ O}:u¼o°MªÕmjØ~Ÿú³Û!Í…ûÿ?Çý›4¸¤ÿ#]£âÿ€-WRJ)yèÍgx×’IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Drummer-members.html0000644000076600007660000003170012327015204020007 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Drummer Member List

This is the complete list of members for stk::Drummer, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::Instrmntinlinevirtual
Drummer(void)stk::Drummer
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Drummervirtual
noteOn(StkFloat instrument, StkFloat amplitude)stk::Drummervirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Instrmntinlinevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Drummerinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Drummerinlinevirtual
~Drummer(void)stk::Drummer
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Drummer.html0000644000076600007660000011761112327015204016365 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Drummer Class Reference

STK drum sample player class. More...

#include <Drummer.h>

Inheritance diagram for stk::Drummer:
stk::Instrmnt stk::Stk

Public Member Functions

 Drummer (void)
 Class constructor. More...
 
 ~Drummer (void)
 Class destructor.
 
void noteOn (StkFloat instrument, StkFloat amplitude)
 Start a note with the given drum type and amplitude. More...
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK drum sample player class.

This class implements a drum sampling synthesizer using WvIn objects and one-pole filters. The drum rawwave files are sampled at 22050 Hz, but will be appropriately interpolated for other sample rates. You can specify the maximum polyphony (maximum number of simultaneous voices) via a #define in the Drummer.h.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Drummer::Drummer ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

void stk::Drummer::noteOn ( StkFloat  instrument,
StkFloat  amplitude 
)
virtual

Start a note with the given drum type and amplitude.

Use general MIDI drum instrument numbers, converted to frequency values as if MIDI note numbers, to select a particular instrument. An StkError will be thrown if the rawwave path is incorrectly set.

Implements stk::Instrmnt.

StkFrames & stk::Drummer::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

101 {
102  unsigned int nChannels = lastFrame_.channels();
103 #if defined(_STK_DEBUG_)
104  if ( channel > frames.channels() - nChannels ) {
105  oStream_ << "Drummer::tick(): channel and StkFrames arguments are incompatible!";
106  handleError( StkError::FUNCTION_ARGUMENT );
107  }
108 #endif
109 
110  StkFloat *samples = &frames[channel];
111  unsigned int j, hop = frames.channels() - nChannels;
112  if ( nChannels == 1 ) {
113  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
114  *samples++ = tick();
115  }
116  else {
117  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
118  *samples++ = tick();
119  for ( j=1; j<nChannels; j++ )
120  *samples++ = lastFrame_[j];
121  }
122  }
123 
124  return frames;
125 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Drummer.png0000644000076600007660000000112312327015204016173 0ustar gary‰PNG  IHDRTˆNI<§PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2âIDATxíᎭ ‡¯‰ïÿÈW÷xL½ÉIºÛq¡ÈHíú33o0Iò%¤’äË'iÊÑÍçŸAZR_Jó¸äžI—#-çêupLKêãZÚΓ÷¯Ž\|—–¤JëîýæöN¯ëÿPþpw-à‘t_þ QÏÊïcÔýïUË_ÛÔµOKÒ‰øö%É—J’/³ÔÌÌ€›LÞ¼!¦¬oHg§¿õéu?¤Î„À—øR_B àKHî`fæ &I¾„T’|HSŽ~*i‹ã|ÿÒ´çKïÍãea[^ù7ßUVs~$-wÕMý4I}TKŽ~õJZ]Ýí<Ûòá‘§Wv.ÿZÚ–¿“îË?I÷O¸)MRƒòHk}k›ÎžÖ¤‘ô¢û’äAH%É—š™9p“ À›7¤Óô‚õ éìô·¾"ý¡î‡À™øR_B àKH| )ÀRJÉ€/!ðå 'ý¼´à+>HÛà6›t9Rýkš2X®K¾ü-ƒ5WŸ[êYeMZÖ×=Ût•6Ñ2¬Ïnƒî¦£´íÙ—¿íÙ?›ÄsùO¥µŸgé¾ü¯OÚ·tôNj—ZF‚süYþÚ¦}]­É$±u?¾ýþ”4¥”œùxó#¾XAuÑIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Echo-members.html0000644000076600007660000003070312327015204017254 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Echo Member List

This is the complete list of members for stk::Echo, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Effectinline
clear()stk::Echovirtual
Echo(unsigned long maximumDelay=(unsigned long) Stk::sampleRate())stk::Echo
Effect(void)stk::Effectinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Effectinline
lastOut(void) const stk::Echoinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setDelay(unsigned long delay)stk::Echo
setEffectMix(StkFloat mix)stk::Effectinlinevirtual
setMaximumDelay(unsigned long delay)stk::Echo
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::Echoinline
tick(StkFrames &frames, unsigned int channel=0)stk::Echoinline
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::Echoinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Echo.html0000644000076600007660000012253012327015204015624 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Echo Class Reference

STK echo effect class. More...

#include <Echo.h>

Inheritance diagram for stk::Echo:
stk::Effect stk::Stk

Public Member Functions

 Echo (unsigned long maximumDelay=(unsigned long) Stk::sampleRate())
 Class constructor, taking the longest desired delay length (one second default value). More...
 
void clear ()
 Reset and clear all internal state.
 
void setMaximumDelay (unsigned long delay)
 Set the maximum delay line length in samples.
 
void setDelay (unsigned long delay)
 Set the delay line length in samples.
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the effect and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the effect and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the effect and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Effect
 Effect (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual void setEffectMix (StkFloat mix)
 Set the mixture of input and "effected" levels in the output (0.0 = input only, 1.0 = effect only).
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK echo effect class.

This class implements an echo effect.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Echo::Echo ( unsigned long  maximumDelay = (unsigned long) Stk::sampleRate())

Class constructor, taking the longest desired delay length (one second default value).

The default delay value is set to 1/2 the maximum delay length.

Member Function Documentation

StkFrames & stk::Echo::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inline

Take a channel of the StkFrames object as inputs to the effect and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

79 {
80 #if defined(_STK_DEBUG_)
81  if ( channel >= frames.channels() ) {
82  oStream_ << "Echo::tick(): channel and StkFrames arguments are incompatible!";
83  handleError( StkError::FUNCTION_ARGUMENT );
84  }
85 #endif
86 
87  StkFloat *samples = &frames[channel];
88  unsigned int hop = frames.channels();
89  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
90  *samples = effectMix_ * ( delayLine_.tick( *samples ) - *samples ) + *samples;
91  }
92 
93  lastFrame_[0] = *(samples-hop);
94  return frames;
95 }
StkFrames & stk::Echo::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the effect and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

98 {
99 #if defined(_STK_DEBUG_)
100  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
101  oStream_ << "Echo::tick(): channel and StkFrames arguments are incompatible!";
102  handleError( StkError::FUNCTION_ARGUMENT );
103  }
104 #endif
105 
106  StkFloat *iSamples = &iFrames[iChannel];
107  StkFloat *oSamples = &oFrames[oChannel];
108  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
109  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
110  *oSamples = effectMix_ * ( delayLine_.tick( *iSamples ) - *iSamples ) + *iSamples;
111  }
112 
113  lastFrame_[0] = *(oSamples-oHop);
114  return iFrames;
115 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Echo.png0000644000076600007660000000101512327015204015436 0ustar gary‰PNG  IHDRBˆdùÍPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2œIDATxíÝ’Ã …0“÷äM Fü«ÝÒ‹Î.ÎD?šé-DDb‚03G”ˆ-‚ÔÜü|&î_ t|ù^A<Ž{œéÃmлˆû,.;4 çÞ!,¶ ½k1d2Odk—{Ñ&2)ç+‰x›udWNK¤ó.gëÎÏŒ™yT"„ˆHHð\ÄGG˜Gœ„(ãˆ/éH"ƒ‘蕈‰‰ ÂÌQ"–R«S}tp‰™«Ù|ƒpï0A\QC±ºí6êÒ—+âÚ©fg:V¹E]q«a îÆ¥Ä*‘Ñߢçåô‰,m‰ÆD¼­ëZX"¥˜ÆêjÑt¤¤œŸY"˜™{‘๾âñ8ÂŒ8â$D@|IG‘”ˆD@¯DüKQL ˆ(OçÔ{¬ænmœíӬͷ³ô.ç¢zÚ›ùèbW´gOõº}Ý××Â\•=E\[{DûÞ!ÚDÞAàmDÔ½›DJ1U~¥#¦yGà%âo"ˆˆBúx³qÚW ºIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Effect-members.html0000644000076600007660000002476112327015204017601 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Effect Member List

This is the complete list of members for stk::Effect, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Effectinline
clear()=0stk::Effectpure virtual
Effect(void)stk::Effectinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Effectinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setEffectMix(StkFloat mix)stk::Effectinlinevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Effect.html0000644000076600007660000006471212327015204016151 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Effect Class Referenceabstract

STK abstract effects parent class. More...

#include <Effect.h>

Inheritance diagram for stk::Effect:
stk::Stk stk::Chorus stk::Echo stk::FreeVerb stk::JCRev stk::LentPitShift stk::NRev stk::PitShift stk::PRCRev

Public Member Functions

 Effect (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual void clear ()=0
 Reset and clear all internal state.
 
virtual void setEffectMix (StkFloat mix)
 Set the mixture of input and "effected" levels in the output (0.0 = input only, 1.0 = effect only).
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK abstract effects parent class.

This class provides common functionality for STK effects subclasses. It is general enough to support both monophonic and polyphonic input/output classes.

by Perry R. Cook and Gary P. Scavone, 1995–2014.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Effect.png0000644000076600007660000000465312327015204015767 0ustar gary‰PNG  IHDRÊ÷úPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2 :IDATxíÝë’ªÈDáeVïÿÈ£\¤¸Ø›¢eÌ6ÒÃÚ Øgêƒ*üK)¥\ÀÿT‘¤ë  ¹P$éH¡4w„rë·jÿþÚ9,IëÌ)ýçáØ_¢<.ÿãÔÃ?¬KÒ&ÊóÚ÷£žFÞO¯ê°$½ÈŠ2Žy9äçZù× 3›`»coÖ¢,'ØÎ²ÿK¬Þöž`eÙlZôÏe¿<,I/ʯ=@s¡HÒ‘Bh.I:R(Í}¥”R. À´à;úJ×}å{(wÉ·X¾ˆ’'€_¡¸ €[¡¸ €[¡¸ €[¡¸ €[¡¸ €[¡¸ ÀÕÝn·Û•üO]üß  ¹PŽ @s?ý·îçêÓÏGÒãŸÍ³iÿÿÈ•R½oÿÌ–2\øÛB3~èw§?Ô¿½ø ùLy\ýÇ-¨^}èoNÿ…a·?×·Ãü,eôÛ8È…iÞŸ†¿ó-Ê8¶jd‹ÛSS–‡$i‘Á;Ay×뺮;—$­«'ØqŠå«·'Ø–R­ IÕf1Á¦E?°ú]ÎO¸ù»vO0Iz[¡4Š$)€æB‘¤#…Ð\)¥\@Sç)V…àV(n…àV(n…àV(n…àV(n…àV(n…àV(n…àV(n…àV(÷W)¥\@S¿ HÒu…Ð\(’t¤Pšû™rë·y·Õg%é§|)’ªí¯PWÿq jÍü¡¿7÷“ý‘úNIª7Ê è·aÔµi:2}e1¡Ìã]¯•ñÐl´¦ „5eù~ ¥ëºî\’´_=ÁþG À©¬•í²_þÈ›ýhš~W¦'ؘ÷L’ÞP(Í…"IG  ¹P$éH¡4WJ)WÐÔy €U¡¸ €[¡¸ €[¡¸ €[¡¸ €[¡¸ €[¡¸ €[¡¸ €[¡¸ÊýUJ)WÐÔ/(’t]¡4Š$)€æ6”[¿Í»ýK’6 GWçV»VIÚÏ™ò¸ú[PkªãÙáVMç–ûýÿj͇(ƒ ßÆA.LãÎü¦›´¬Ç.îÌç(ãP«±<—J5曤e0Á6”úÃèªxÓüšþô ”®ëºsIš·z‚íQöÖϼïsWnR½½ T¬þw±^\&Ø´è÷LË'Ø|›êåäð“¤w @s¡HÒ‘Bh.I:R(Í•RÊ•4už`U(n…àV(n…àV(n…àV(n…àV(n…àV(n…àV(n…àV(n…r•RÊ•4õ Š$]W(Í…"IG  ¹—”[¿Iš·~ÿvoëó’´Ê™2pæwIú¡OS—ûqÍךzÿIoÒ Ø‡)Èûmá8È=Jõ OÊ8¾Õà”iÍXS¿(óü¿¾»pNPº®ëÎ%I›ê ¶úî>¾‹pªŸ×ÊÎ]X=Áêc’´Êc‚M‹~ï8ݪ5²<.I›òkÐ\(’t¤Pš E’Ž @sßD)¥” hê<ÀªPÜ À­PÜ À­PÜ À­PÜ À­PÜ À­PÜ À­PÜ À­PÜ åþ*¥”+hêIº®Pš E’Ž @s Ê­ßê]IZöøÎã5}Þ›þè¾?îÙSæ“ÕÞüí ö ÊãÂ>®n=¦éÃtիî=ÏOûÏ¡ ‚axõnu‘{Èú>ŒÓéy1惻+ót©fÕŠ2¹VÆ?Z^‚O°W”aä›»µóñ”®ëºs­Öó<÷wesÕ—sì€Sm×ÊfÙo'˜5eœ`Ó¢_­‰ÅZ¨ŸYÓCmg­|ì &IW @s¡HÒ‘Bh.I:R(Í•RÊ•4už`U(n…àV(n…àV(n…àV(n…àV(n…àV(n…àV(n…àV(n…r•RÊ•4õ Š$]W(Í…"IG  ¹)·~«wǃ—$ý3[J¿3”P$©­Pš E’Ž @s¥”reM§X €[¡¸ €[¡¸ €[¡¸ €[¡¸ €[¡¸ €[¡¸ €[¡¸ €[¡Ü_¥”reMý‚"I× @s¡HÒ‘Bhn—rë·y÷ñªÞ‡O‹’´—¥>ÖÖ$i·ORWùq©kÍzä›ý_TJ Ê0Ð~¶&¼2Îo>”qXÕ˜Öke¦Tì(aM©Þ—”y~·^8'(]×uç’¤EõÛR^/¢7QÎõz­¬F¼Xå;‹gÿiöAÊ8Á¦E¿4Í£­Íü3£HÒ  ¹P$éH¡4Š$)€æJ)åÊþÏ,½v€¾ IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Envelope-members.html0000644000076600007660000003215312327015204020154 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Envelope Member List

This is the complete list of members for stk::Envelope, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Generatorinline
Envelope(void)stk::Envelope
Generator(void)stk::Generatorinline
getState(void) const stk::Envelopeinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
keyOff(void)stk::Envelopeinline
keyOn(void)stk::Envelopeinline
lastFrame(void) const stk::Generatorinline
lastOut(void) const stk::Envelopeinline
operator=(const Envelope &e)stk::Envelope
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
setRate(StkFloat rate)stk::Envelope
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setTarget(StkFloat target)stk::Envelope
setTime(StkFloat time)stk::Envelope
setValue(StkFloat value)stk::Envelope
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(void)stk::Envelopeinline
tick(StkFrames &frames, unsigned int channel=0)stk::Envelopeinlinevirtual
~Envelope(void)stk::Envelope
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Envelope.html0000644000076600007660000011327112327015204016525 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Envelope Class Reference

STK linear line envelope class. More...

#include <Envelope.h>

Inheritance diagram for stk::Envelope:
stk::Generator stk::Stk

Public Member Functions

 Envelope (void)
 Default constructor.
 
 ~Envelope (void)
 Class destructor.
 
Envelopeoperator= (const Envelope &e)
 Assignment operator.
 
void keyOn (void)
 Set target = 1.
 
void keyOff (void)
 Set target = 0.
 
void setRate (StkFloat rate)
 Set the rate. More...
 
void setTime (StkFloat time)
 Set the rate based on a positive time duration (seconds). More...
 
void setTarget (StkFloat target)
 Set the target value.
 
void setValue (StkFloat value)
 Set current and target values to value.
 
int getState (void) const
 Return the current envelope state (0 = at target, 1 otherwise).
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (void)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK linear line envelope class.

This class implements a simple linear line envelope generator which is capable of ramping to an arbitrary target value by a specified rate. It also responds to simple keyOn and keyOff messages, ramping to 1.0 on keyOn and to 0.0 on keyOff.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::Envelope::setRate ( StkFloat  rate)

Set the rate.

The rate must be positive (though a value of 0.0 is allowed).

void stk::Envelope::setTime ( StkFloat  time)

Set the rate based on a positive time duration (seconds).

The rate is calculated such that the envelope will ramp from a value of 0.0 to 1.0 in the specified time duration.

StkFrames & stk::Envelope::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

112 {
113 #if defined(_STK_DEBUG_)
114  if ( channel >= frames.channels() ) {
115  oStream_ << "Envelope::tick(): channel and StkFrames arguments are incompatible!";
116  handleError( StkError::FUNCTION_ARGUMENT );
117  }
118 #endif
119 
120  StkFloat *samples = &frames[channel];
121  unsigned int hop = frames.channels();
122  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
123  *samples = tick();
124 
125  return frames;
126 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Envelope.png0000644000076600007660000000117612327015204016345 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2 IDATxíÑŽ«0 DO&ÿÿÉB›f¡ÝÊ{UÕÕL n8 ã¨ÏÔZkŒ©’áDK²ú¿èÒdîçÏ ,Iί£Ûx­½ƒ^¶·ìÑbúà\–$ïKô¾·FÙH-S–¤‘ïÐá{Ö—‰Ü2dô—yí´ñ@¬F'ä·mìlMÜÛèË’4rþ‡H²J´$«E×Zkˆž÷ã8ô4…±ãÐ39ŠˆþÐ’hÀ)Ñ€U¢«DV‰¬ X%°út­µÆ˜*IN´$«¿C—&[˜?’tçÁ¤t»y†}‰^v·lÑÒÖÍÏ¿®‹õK›¼=誽›VÈÃíá½Ü|ŒOÕ3úxÜ=ÀA\Œçªd„îE·BoîÎÚrFû\|Lw».’•Kä*'Ð=­‰ÛýÌì'Ääïf¸’ÿ!’ôàDK²úXt­µ†àyO1ŽCOS;=“£Øè=!‰œ X%°J4`•hÀ*Ñ€U¢«o@—RJŒ)N4`õ—èùÖVz¯}½«[4ÀO~½ì®ǽ¸ æê2Ü}ÜõÑújö z%6õçÌmÙío;²w#ô1ïœõó„v—q hsío¾-8BÛžû6Ú@.Ñ®åþr“õ¨}¼½’udÛWŸì³Þ;òÚ ø­G¯FœhÀ*]J)!þ:&(à96IEND®B`‚stk-4.5.0/doc/html/classstk_1_1FileLoop-members.html0000644000076600007660000004272012327015204020111 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FileLoop Member List

This is the complete list of members for stk::FileLoop, including all inherited members.

addPhase(StkFloat angle)stk::FileLoop
addPhaseOffset(StkFloat angle)stk::FileLoop
addSampleRateAlert(Stk *ptr)stk::Stkprotected
addTime(StkFloat time)stk::FileLoopvirtual
channelsOut(void) const stk::FileLoopinline
closeFile(void)stk::FileLoopinlinevirtual
FileLoop(unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)stk::FileLoop
FileLoop(std::string fileName, bool raw=false, bool doNormalize=true, unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)stk::FileLoop
FileWvIn(unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)stk::FileWvInprotected
FileWvIn(std::string fileName, bool raw=false, bool doNormalize=true, unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)stk::FileWvInprotected
getFileRate(void) const stk::FileLoopinlinevirtual
getSize(void) const stk::FileLoopinlinevirtual
handleError(const char *message, StkError::Type type)stk::Stkprotectedstatic
handleError(std::string message, StkError::Type type)stk::Stkprotectedstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinlineprotected
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlineprotectedstatic
isFinished(void) const stk::FileWvIninlineprotected
isOpen(void)stk::FileWvIninlineprotected
lastFrame(void) const stk::WvIninlineprotected
lastOut(unsigned int channel=0)stk::FileLoopinline
normalize(void)stk::FileLoopinlinevirtual
normalize(StkFloat peak)stk::FileLoopinlinevirtual
openFile(std::string fileName, bool raw=false, bool doNormalize=true)stk::FileLoopvirtual
printErrors(bool status)stk::Stkinlineprotectedstatic
rawwavePath(void)stk::Stkinlineprotectedstatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
reset(void)stk::FileLoopinlinevirtual
sampleRate(void)stk::Stkinlineprotectedstatic
setFrequency(StkFloat frequency)stk::FileLoopinline
setInterpolate(bool doInterpolate)stk::FileWvIninlineprotected
setRate(StkFloat rate)stk::FileLoopvirtual
setRawwavePath(std::string path)stk::Stkprotectedstatic
setSampleRate(StkFloat rate)stk::Stkprotectedstatic
showWarnings(bool status)stk::Stkinlineprotectedstatic
sleep(unsigned long milliseconds)stk::Stkprotectedstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkprotectedstatic
STK_FLOAT64stk::Stkprotectedstatic
STK_SINT16stk::Stkprotectedstatic
STK_SINT24stk::Stkprotectedstatic
STK_SINT32stk::Stkprotectedstatic
STK_SINT8stk::Stkprotectedstatic
swap16(unsigned char *ptr)stk::Stkprotectedstatic
swap32(unsigned char *ptr)stk::Stkprotectedstatic
swap64(unsigned char *ptr)stk::Stkprotectedstatic
tick(unsigned int channel=0)stk::FileLoopvirtual
tick(StkFrames &frames)stk::FileLoopvirtual
~FileLoop(void)stk::FileLoop
~FileWvIn(void)stk::FileWvInprotected
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FileLoop.html0000644000076600007660000014307112327015204016462 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FileLoop Class Reference

STK file looping / oscillator class. More...

#include <FileLoop.h>

Inheritance diagram for stk::FileLoop:
stk::FileWvIn stk::WvIn stk::Stk

Public Member Functions

 FileLoop (unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)
 Default constructor.
 
 FileLoop (std::string fileName, bool raw=false, bool doNormalize=true, unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)
 Class constructor that opens a specified file.
 
 ~FileLoop (void)
 Class destructor.
 
void openFile (std::string fileName, bool raw=false, bool doNormalize=true)
 Open the specified file and load its data. More...
 
void closeFile (void)
 Close a file if one is open.
 
void reset (void)
 Clear outputs and reset time (file) pointer to zero.
 
unsigned int channelsOut (void) const
 Return the number of audio channels in the data or stream.
 
void normalize (void)
 Normalize data to a maximum of +-1.0. More...
 
void normalize (StkFloat peak)
 Normalize data to a maximum of +-peak. More...
 
unsigned long getSize (void) const
 Return the file size in sample frames.
 
StkFloat getFileRate (void) const
 Return the input file sample rate in Hz (not the data read rate). More...
 
void setRate (StkFloat rate)
 Set the data read rate in samples. The rate can be negative. More...
 
void setFrequency (StkFloat frequency)
 Set the data interpolation rate based on a looping frequency. More...
 
void addTime (StkFloat time)
 Increment the read pointer by time samples, modulo file size.
 
void addPhase (StkFloat angle)
 Increment current read pointer by angle, relative to a looping frequency. More...
 
void addPhaseOffset (StkFloat angle)
 Add a phase offset to the current read pointer. More...
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
StkFloat tick (unsigned int channel=0)
 Compute a sample frame and return the specified channel value. More...
 
StkFramestick (StkFrames &frames)
 Fill the StkFrames argument with computed frames and return the same reference. More...
 

Additional Inherited Members

- Protected Member Functions inherited from stk::FileWvIn
 FileWvIn (unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)
 Default constructor.
 
 FileWvIn (std::string fileName, bool raw=false, bool doNormalize=true, unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)
 Overloaded constructor for file input. More...
 
 ~FileWvIn (void)
 Class destructor.
 
bool isOpen (void)
 Query whether a file is open.
 
bool isFinished (void) const
 Query whether reading is complete.
 
void setInterpolate (bool doInterpolate)
 Turn linear interpolation on/off. More...
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Static Protected Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Protected Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 

Detailed Description

STK file looping / oscillator class.

This class provides audio file looping functionality. Any audio file that can be loaded by FileRead can be looped using this class.

FileLoop supports multi-channel data. It is important to distinguish the tick() method that computes a single frame (and returns only the specified sample of a multi-channel frame) from the overloaded one that takes an StkFrames object for multi-channel and/or multi-frame data.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::FileLoop::openFile ( std::string  fileName,
bool  raw = false,
bool  doNormalize = true 
)
virtual

Open the specified file and load its data.

Data from a previously opened file will be overwritten by this function. An StkError will be thrown if the file is not found, its format is unknown, or a read error occurs. If the file data is to be loaded incrementally from disk and normalization is specified, a scaling will be applied with respect to fixed-point limits. If the data format is floating-point, no scaling is performed.

Reimplemented from stk::FileWvIn.

void stk::FileLoop::normalize ( void  )
inlinevirtual

Normalize data to a maximum of +-1.0.

This function has no effect when data is incrementally loaded from disk.

Reimplemented from stk::FileWvIn.

65 { FileWvIn::normalize( 1.0 ); };
void stk::FileLoop::normalize ( StkFloat  peak)
inlinevirtual

Normalize data to a maximum of +-peak.

This function has no effect when data is incrementally loaded from disk.

Reimplemented from stk::FileWvIn.

72 { FileWvIn::normalize( peak ); };
StkFloat stk::FileLoop::getFileRate ( void  ) const
inlinevirtual

Return the input file sample rate in Hz (not the data read rate).

WAV, SND, and AIF formatted files specify a sample rate in their headers. STK RAW files have a sample rate of 22050 Hz by definition. MAT-files are assumed to have a rate of 44100 Hz.

Reimplemented from stk::FileWvIn.

83 { return data_.dataRate(); };
void stk::FileLoop::setRate ( StkFloat  rate)
virtual

Set the data read rate in samples. The rate can be negative.

If the rate value is negative, the data is read in reverse order.

Reimplemented from stk::FileWvIn.

void stk::FileLoop::setFrequency ( StkFloat  frequency)
inline

Set the data interpolation rate based on a looping frequency.

This function determines the interpolation rate based on the file size and the current Stk::sampleRate. The frequency value corresponds to file cycles per second. The frequency can be negative, in which case the loop is read in reverse order.

98 { this->setRate( file_.fileSize() * frequency / Stk::sampleRate() ); };
void stk::FileLoop::addPhase ( StkFloat  angle)

Increment current read pointer by angle, relative to a looping frequency.

This function increments the read pointer based on the file size and the current Stk::sampleRate. The anAngle value is a multiple of file size.

void stk::FileLoop::addPhaseOffset ( StkFloat  angle)

Add a phase offset to the current read pointer.

This function determines a time offset based on the file size and the current Stk::sampleRate. The angle value is a multiple of file size.

StkFloat stk::FileLoop::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed frame.

For multi-channel files, use the lastFrame() function to get all values from the last computed frame. If no file data is loaded, the returned value is 0.0. The channel argument must be less than the number of channels in the file data (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

129 { return FileWvIn::lastOut( channel ); };
StkFloat stk::FileLoop::tick ( unsigned int  channel = 0)
virtual

Compute a sample frame and return the specified channel value.

For multi-channel files, use the lastFrame() function to get all values from the computed frame. If no file data is loaded, the returned value is 0.0. The channel argument must be less than the number of channels in the file data (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Reimplemented from stk::FileWvIn.

StkFrames& stk::FileLoop::tick ( StkFrames frames)
virtual

Fill the StkFrames argument with computed frames and return the same reference.

The number of channels in the StkFrames argument should equal the number of channels in the file data. However, this is only checked if STK_DEBUG is defined during compilation, in which case an incompatibility will trigger an StkError exception. If no file data is loaded, the function does nothing (a warning will be issued if STK_DEBUG is defined during compilation and Stk::showWarnings() has been set to true).

Reimplemented from stk::FileWvIn.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FileLoop.png0000644000076600007660000000136612327015204016302 0ustar gary‰PNG  IHDRRÀ \ÄáPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2…IDATxíárã —O“¼ÿ#Ÿƒ ;Nªô&S¥l ¬%Ôö7ff¾`’äI(%ɇ'Ê”G³ž>ƒ°¤u¼¦Ìó9öŽò‘Î#§öø2Ù†%5ãPYsɧ‹!—Ý„%iË™r9Û­wyXùyáóKòo(ûÂíy§ðvŒ:þj{–ÂKsj{ú°$m‰¿qIò!”’ää43sàw_ü•÷»»Ó_9½P~IÇC àD(|%€¡ð!”>„à33_0Iò$”’äá2åÑ.+kD’vü’2=tÓ·ÖÚ(×Ó#ñ@YœØKºÕ¦”3år¨¯|þ½@R3Ž ?Qî²—ÔŽq{Ú··ùŽ2IíØ+K®/^r)â)%é„R’|øËJ33W®qðÅ_y¿»;ý•“ÑÛùå—t<”N„À‡PøJB àC(N13ó“$OB)I>l”)u™?›ðcVX#—•£éueÎfúÖZËd‰åŒ[åúc:W®ÊZ^–®Ë~s³×¬Ö§[å²ßV;_åN2^°+|§ì³¬/(Ê®¤½²/|¨Ü6è‰2Ií8R.¹Õ­²>)¼¼vÔž¥ãו’äB(%ɇ¿¬43sà7_ü•·›»Ó_9½P~IǾ€¸Kâ.|ˆ»ð!îÀ‡¸Kþë]¦”’/$OB àÃF9-ÚõÒÁ>ü,‡'ÊÑôº2g3ÿRÕCuožæŒ›yV‚óªUÖòæH_íºZƒÍ*'Ól4OÔÍî.¯)×ôûÂwÊ>ËÚ«‹Ê¾ð¡² >W&hÇ‘ò•»\ /͵§4·\ð³Žü€®Iÿ/?¥L)%Wþê3MT 7IEND®B`‚stk-4.5.0/doc/html/classstk_1_1FileRead-members.html0000644000076600007660000003031412327015204020047 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FileRead Member List

This is the complete list of members for stk::FileRead, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channels(void) const stk::FileReadinline
close(void)stk::FileRead
fileRate(void) const stk::FileReadinline
FileRead(void)stk::FileRead
FileRead(std::string fileName, bool typeRaw=false, unsigned int nChannels=1, StkFormat format=STK_SINT16, StkFloat rate=22050.0)stk::FileRead
fileSize(void) const stk::FileReadinline
format(void) const stk::FileReadinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
isOpen(void)stk::FileRead
open(std::string fileName, bool typeRaw=false, unsigned int nChannels=1, StkFormat format=STK_SINT16, StkFloat rate=22050.0)stk::FileRead
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
read(StkFrames &buffer, unsigned long startFrame=0, bool doNormalize=true)stk::FileRead
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
~FileRead(void)stk::FileRead
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FileRead.html0000644000076600007660000011266312327015204016427 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FileRead Class Reference

STK audio file input class. More...

#include <FileRead.h>

Inheritance diagram for stk::FileRead:
stk::Stk

Public Member Functions

 FileRead (void)
 Default constructor.
 
 FileRead (std::string fileName, bool typeRaw=false, unsigned int nChannels=1, StkFormat format=STK_SINT16, StkFloat rate=22050.0)
 Overloaded constructor that opens a file during instantiation. More...
 
 ~FileRead (void)
 Class destructor.
 
void open (std::string fileName, bool typeRaw=false, unsigned int nChannels=1, StkFormat format=STK_SINT16, StkFloat rate=22050.0)
 Open the specified file and determine its formatting. More...
 
void close (void)
 If a file is open, close it.
 
bool isOpen (void)
 Returns true if a file is currently open.
 
unsigned long fileSize (void) const
 Return the file size in sample frames.
 
unsigned int channels (void) const
 Return the number of audio channels in the file.
 
StkFormat format (void) const
 Return the data format of the file.
 
StkFloat fileRate (void) const
 Return the file sample rate in Hz. More...
 
void read (StkFrames &buffer, unsigned long startFrame=0, bool doNormalize=true)
 Read sample frames from the file into an StkFrames object. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK audio file input class.

This class provides input support for various audio file formats. Multi-channel (>2) soundfiles are supported. The file data is returned via an external StkFrames object passed to the read() function. This class does not store its own copy of the file data, rather the data is read directly from disk.

FileRead currently supports uncompressed WAV, AIFF/AIFC, SND (AU), MAT-file (Matlab), and STK RAW file formats. Signed integer (8-, 16-, 24-, and 32-bit) and floating-point (32- and 64-bit) data types are supported. Compressed data types are not supported.

STK RAW files have no header and are assumed to contain a monophonic stream of 16-bit signed integers in big-endian byte order at a sample rate of 22050 Hz. MAT-file data should be saved in an array with each data channel filling a matrix row. The sample rate for MAT-files should be specified in a variable named "fs". If no such variable is found, the sample rate is assumed to be 44100 Hz.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::FileRead::FileRead ( std::string  fileName,
bool  typeRaw = false,
unsigned int  nChannels = 1,
StkFormat  format = STK_SINT16,
StkFloat  rate = 22050.0 
)

Overloaded constructor that opens a file during instantiation.

An StkError will be thrown if the file is not found or its format is unknown or unsupported. The optional arguments allow a headerless file type to be supported. If typeRaw is false (the default), the subsequent parameters are ignored.

Member Function Documentation

void stk::FileRead::open ( std::string  fileName,
bool  typeRaw = false,
unsigned int  nChannels = 1,
StkFormat  format = STK_SINT16,
StkFloat  rate = 22050.0 
)

Open the specified file and determine its formatting.

An StkError will be thrown if the file is not found or its format is unknown or unsupported. The optional arguments allow a headerless file type to be supported. If typeRaw is false (the default), the subsequent parameters are ignored.

StkFloat stk::FileRead::fileRate ( void  ) const
inline

Return the file sample rate in Hz.

WAV, SND, and AIF formatted files specify a sample rate in their headers. By definition, STK RAW files have a sample rate of 22050 Hz. MAT-files are assumed to have a rate of 44100 Hz.

91 { return fileRate_; };
void stk::FileRead::read ( StkFrames buffer,
unsigned long  startFrame = 0,
bool  doNormalize = true 
)

Read sample frames from the file into an StkFrames object.

The number of sample frames to read will be determined from the number of frames of the StkFrames argument. If this size is larger than the available data in the file (given the file size and starting frame index), the extra frames will be unaffected (the StkFrames object will not be resized). Optional parameters are provided to specify the starting sample frame within the file (default = 0) and whether to normalize the data with respect to fixed-point limits (default = true). An StkError will be thrown if a file error occurs or if the number of channels in the StkFrames argument is not equal to that in the file.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FileRead.png0000644000076600007660000000066712327015204016247 0ustar gary‰PNG  IHDRSPRø¹œPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2FIDATxíÁŽÃ DƒÔÿÿäMÁ¡¦Í:‡Õ:bTpä'“ÞÉ9gg‘%ÉUÁ”$?0SYÝyy&eIÝúŽYöµv‰ùè9Ußo›mYR¿™mšÒ¾"Šó®,I;½cZóØÛîóØü{ïÓfÿ sô>Éè’÷~Írÿ:#ó¾&Ô2Ë’´Süß%ÉOÁ”$?-ÌœsöÀgz8ëæãá½¹ Ý¡w0ÿLîÁpT0üL?ÀOÁðS0N•RJÎ"¸*˜~Ú0—C¶DzÕ6²ê s¶-»)tÇ,óÔo«5´wu[çkL·ýì˜Ía­Œ†_§µ8íý„i/{Ãvu#óUš{ß1Ç9[`«õÚ3T7õÞ§Ì1£îxÀLЯ#æW÷iÞׄf½É½çß'À¯L?ýsfJ)ùêe¥’>ŠûIEND®B`‚stk-4.5.0/doc/html/classstk_1_1FileWrite-members.html0000644000076600007660000003066412327015204020276 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FileWrite Member List

This is the complete list of members for stk::FileWrite, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
close(void)stk::FileWrite
FILE_AIFstk::FileWritestatic
FILE_MATstk::FileWritestatic
FILE_RAWstk::FileWritestatic
FILE_SNDstk::FileWritestatic
FILE_WAVstk::FileWritestatic
FileWrite(void)stk::FileWrite
FileWrite(std::string fileName, unsigned int nChannels=1, FILE_TYPE type=FILE_WAV, Stk::StkFormat format=STK_SINT16)stk::FileWrite
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
isOpen(void)stk::FileWrite
open(std::string fileName, unsigned int nChannels=1, FileWrite::FILE_TYPE type=FILE_WAV, Stk::StkFormat format=STK_SINT16)stk::FileWrite
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
write(StkFrames &buffer)stk::FileWrite
~FileWrite()stk::FileWritevirtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FileWrite.html0000644000076600007660000011126712327015204016645 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


STK audio file output class. More...

#include <FileWrite.h>

Inheritance diagram for stk::FileWrite:
stk::Stk

Public Member Functions

 FileWrite (void)
 Default constructor.
 
 FileWrite (std::string fileName, unsigned int nChannels=1, FILE_TYPE type=FILE_WAV, Stk::StkFormat format=STK_SINT16)
 Overloaded constructor used to specify a file name, type, and data format with this object. More...
 
virtual ~FileWrite ()
 Class destructor.
 
void open (std::string fileName, unsigned int nChannels=1, FileWrite::FILE_TYPE type=FILE_WAV, Stk::StkFormat format=STK_SINT16)
 Create a file of the specified type and name and output samples to it in the given data format. More...
 
void close (void)
 If a file is open, write out samples in the queue and then close it.
 
bool isOpen (void)
 Returns true if a file is currently open.
 
void write (StkFrames &buffer)
 Write sample frames from the StkFrames object to the file. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Static Public Attributes

static const FILE_TYPE FILE_RAW
 
static const FILE_TYPE FILE_WAV
 
static const FILE_TYPE FILE_SND
 
static const FILE_TYPE FILE_AIF
 
static const FILE_TYPE FILE_MAT
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK audio file output class.

This class provides output support for various audio file formats.

FileWrite writes samples to an audio file. It supports multi-channel data.

FileWrite currently supports uncompressed WAV, AIFF, AIFC, SND (AU), MAT-file (Matlab), and STK RAW file formats. Signed integer (8-, 16-, 24-, and 32-bit) and floating- point (32- and 64-bit) data types are supported. STK RAW files use 16-bit integers by definition. MAT-files will always be written as 64-bit floats. If a data type specification does not match the specified file type, the data type will automatically be modified. Compressed data types are not supported.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::FileWrite::FileWrite ( std::string  fileName,
unsigned int  nChannels = 1,
FILE_TYPE  type = FILE_WAV,
Stk::StkFormat  format = STK_SINT16 
)

Overloaded constructor used to specify a file name, type, and data format with this object.

An StkError is thrown for invalid argument values or if an error occurs when initializing the output file.

Member Function Documentation

void stk::FileWrite::open ( std::string  fileName,
unsigned int  nChannels = 1,
FileWrite::FILE_TYPE  type = FILE_WAV,
Stk::StkFormat  format = STK_SINT16 
)

Create a file of the specified type and name and output samples to it in the given data format.

An StkError is thrown for invalid argument values or if an error occurs when initializing the output file.

void stk::FileWrite::write ( StkFrames buffer)

Write sample frames from the StkFrames object to the file.

An StkError will be thrown if the number of channels in the StkFrames argument does not agree with the number of channels specified when opening the file.

Member Data Documentation

const FILE_TYPE stk::FileWrite::FILE_RAW
static

STK RAW file type.

const FILE_TYPE stk::FileWrite::FILE_WAV
static

WAV file type.

const FILE_TYPE stk::FileWrite::FILE_SND
static

SND (AU) file type.

const FILE_TYPE stk::FileWrite::FILE_AIF
static

AIFF file type.

const FILE_TYPE stk::FileWrite::FILE_MAT
static

Matlab MAT-file type.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FileWrite.png0000644000076600007660000000067012327015204016460 0ustar gary‰PNG  IHDRSPRø¹œPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2GIDATxíÛŽÃ DƒÔÿÿäM¡æÖl#çaµ´Œ>±=í;1Æè,¢$¹j1%ÉOÌ–9oŸAX’Yß1ÓþˆÝbîíUÙü¼iÃ’ìš2K5)ýD¤ÎMX’:}bæä:·ÌsÞüçއɹü;̺÷G·z·käû×åÞO‡ŠGuX’:­ÿ»$ùi1%ÉO3Æ}ð;½œõóõò‡>ÀÜîÐ'˜Æ÷ÅpÔbøi1ü´˜~ZL?-&À¥BÁYW-&€Ÿæv°çlcÞw§9—ÌѶeÖÛŠ™ê9~[åJSJª¹bî×·ï™Û0K‡G¤nø}jž½c*·Ì|ÝötŒ³cßî-ó`µÌºÎò†3?l<²½™­KÝ(æóœyTP3æ¤÷Ó¡‘GÅÚž9öÀI‹ à§Î !_ýN2‹]ƒkIEND®B`‚stk-4.5.0/doc/html/classstk_1_1FileWvIn-members.html0000644000076600007660000003515612327015204020070 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FileWvIn Member List

This is the complete list of members for stk::FileWvIn, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
addTime(StkFloat time)stk::FileWvInvirtual
channelsOut(void) const stk::WvIninline
closeFile(void)stk::FileWvInvirtual
FileWvIn(unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)stk::FileWvIn
FileWvIn(std::string fileName, bool raw=false, bool doNormalize=true, unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)stk::FileWvIn
getFileRate(void) const stk::FileWvIninlinevirtual
getSize(void) const stk::FileWvIninlinevirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
isFinished(void) const stk::FileWvIninline
isOpen(void)stk::FileWvIninline
lastFrame(void) const stk::WvIninline
lastOut(unsigned int channel=0)stk::FileWvIninline
normalize(void)stk::FileWvInvirtual
normalize(StkFloat peak)stk::FileWvInvirtual
openFile(std::string fileName, bool raw=false, bool doNormalize=true)stk::FileWvInvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
reset(void)stk::FileWvInvirtual
sampleRate(void)stk::Stkinlinestatic
setInterpolate(bool doInterpolate)stk::FileWvIninline
setRate(StkFloat rate)stk::FileWvInvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::FileWvInvirtual
tick(StkFrames &frames)stk::FileWvInvirtual
~FileWvIn(void)stk::FileWvIn
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FileWvIn.html0000644000076600007660000015167412327015204016444 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FileWvIn Class Reference

STK audio file input class. More...

#include <FileWvIn.h>

Inheritance diagram for stk::FileWvIn:
stk::WvIn stk::Stk stk::FileLoop

Public Member Functions

 FileWvIn (unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)
 Default constructor.
 
 FileWvIn (std::string fileName, bool raw=false, bool doNormalize=true, unsigned long chunkThreshold=1000000, unsigned long chunkSize=1024)
 Overloaded constructor for file input. More...
 
 ~FileWvIn (void)
 Class destructor.
 
virtual void openFile (std::string fileName, bool raw=false, bool doNormalize=true)
 Open the specified file and load its data. More...
 
virtual void closeFile (void)
 Close a file if one is open.
 
virtual void reset (void)
 Clear outputs and reset time (file) pointer to zero.
 
virtual void normalize (void)
 Normalize data to a maximum of +-1.0. More...
 
virtual void normalize (StkFloat peak)
 Normalize data to a maximum of +-peak. More...
 
virtual unsigned long getSize (void) const
 Return the file size in sample frames.
 
virtual StkFloat getFileRate (void) const
 Return the input file sample rate in Hz (not the data read rate). More...
 
bool isOpen (void)
 Query whether a file is open.
 
bool isFinished (void) const
 Query whether reading is complete.
 
virtual void setRate (StkFloat rate)
 Set the data read rate in samples. The rate can be negative. More...
 
virtual void addTime (StkFloat time)
 Increment the read pointer by time samples. More...
 
void setInterpolate (bool doInterpolate)
 Turn linear interpolation on/off. More...
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
virtual StkFloat tick (unsigned int channel=0)
 Compute a sample frame and return the specified channel value. More...
 
virtual StkFramestick (StkFrames &frames)
 Fill the StkFrames argument with computed frames and return the same reference. More...
 
- Public Member Functions inherited from stk::WvIn
unsigned int channelsOut (void) const
 Return the number of audio channels in the data or stream.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last computed sample frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK audio file input class.

This class inherits from WvIn. It provides a "tick-level" interface to the FileRead class. It also provides variable-rate playback functionality. Audio file support is provided by the FileRead class. Linear interpolation is used for fractional read rates.

FileWvIn supports multi-channel data. It is important to distinguish the tick() method that computes a single frame (and returns only the specified sample of a multi-channel frame) from the overloaded one that takes an StkFrames object for multi-channel and/or multi-frame data.

FileWvIn will either load the entire content of an audio file into local memory or incrementally read file data from disk in chunks. This behavior is controlled by the optional constructor arguments chunkThreshold and chunkSize. File sizes greater than chunkThreshold (in sample frames) will be read incrementally in chunks of chunkSize each (also in sample frames).

When the file end is reached, subsequent calls to the tick() functions return zeros and isFinished() returns true.

See the FileRead class for a description of the supported audio file formats.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::FileWvIn::FileWvIn ( std::string  fileName,
bool  raw = false,
bool  doNormalize = true,
unsigned long  chunkThreshold = 1000000,
unsigned long  chunkSize = 1024 
)

Overloaded constructor for file input.

An StkError will be thrown if the file is not found, its format is unknown, or a read error occurs.

Member Function Documentation

virtual void stk::FileWvIn::openFile ( std::string  fileName,
bool  raw = false,
bool  doNormalize = true 
)
virtual

Open the specified file and load its data.

Data from a previously opened file will be overwritten by this function. An StkError will be thrown if the file is not found, its format is unknown, or a read error occurs. If the file data is to be loaded incrementally from disk and normalization is specified, a scaling will be applied with respect to fixed-point limits. If the data format is floating-point, no scaling is performed.

Reimplemented in stk::FileLoop.

virtual void stk::FileWvIn::normalize ( void  )
virtual

Normalize data to a maximum of +-1.0.

This function has no effect when data is incrementally loaded from disk.

Reimplemented in stk::FileLoop.

virtual void stk::FileWvIn::normalize ( StkFloat  peak)
virtual

Normalize data to a maximum of +-peak.

This function has no effect when data is incrementally loaded from disk.

Reimplemented in stk::FileLoop.

virtual StkFloat stk::FileWvIn::getFileRate ( void  ) const
inlinevirtual

Return the input file sample rate in Hz (not the data read rate).

WAV, SND, and AIF formatted files specify a sample rate in their headers. STK RAW files have a sample rate of 22050 Hz by definition. MAT-files are assumed to have a rate of 44100 Hz.

Reimplemented in stk::FileLoop.

100 { return data_.dataRate(); };
virtual void stk::FileWvIn::setRate ( StkFloat  rate)
virtual

Set the data read rate in samples. The rate can be negative.

If the rate value is negative, the data is read in reverse order.

Reimplemented in stk::FileLoop.

virtual void stk::FileWvIn::addTime ( StkFloat  time)
virtual

Increment the read pointer by time samples.

Note that this function will not modify the interpolation flag status.

Reimplemented in stk::FileLoop.

void stk::FileWvIn::setInterpolate ( bool  doInterpolate)
inline

Turn linear interpolation on/off.

Interpolation is automatically off when the read rate is an integer value. If interpolation is turned off for a fractional rate, the time index is truncated to an integer value.

127 { interpolate_ = doInterpolate; };
StkFloat stk::FileWvIn::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed frame.

If no file is loaded, the returned value is 0.0. The channel argument must be less than the number of output channels, which can be determined with the channelsOut() function (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

See Also
lastFrame()
182 {
183 #if defined(_STK_DEBUG_)
184  if ( channel >= data_.channels() ) {
185  oStream_ << "FileWvIn::lastOut(): channel argument and soundfile data are incompatible!";
186  handleError( StkError::FUNCTION_ARGUMENT );
187  }
188 #endif
189 
190  if ( finished_ ) return 0.0;
191  return lastFrame_[channel];
192 }
virtual StkFloat stk::FileWvIn::tick ( unsigned int  channel = 0)
virtual

Compute a sample frame and return the specified channel value.

For multi-channel files, use the lastFrame() function to get all values from the computed frame. If no file data is loaded, the returned value is 0.0. The channel argument must be less than the number of channels in the file data (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::WvIn.

Reimplemented in stk::FileLoop.

virtual StkFrames& stk::FileWvIn::tick ( StkFrames frames)
virtual

Fill the StkFrames argument with computed frames and return the same reference.

The number of channels in the StkFrames argument must equal the number of channels in the file data. However, this is only checked if STK_DEBUG is defined during compilation, in which case an incompatibility will trigger an StkError exception. If no file data is loaded, the function does nothing (a warning will be issued if STK_DEBUG is defined during compilation).

Implements stk::WvIn.

Reimplemented in stk::FileLoop.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FileWvIn.png0000644000076600007660000000137012327015204016247 0ustar gary‰PNG  IHDRRÀ \ÄáPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2‡IDATxíÑró* —OÓ¼ÿ#ƒ6qœTùÏdJʶ ÃZBm¯13‹“¤H¦R’bx¢Ly¸õò„%µñš2Ïר;Ê{:÷œüñ2Ù‡%¹ñP¹å’OWC.Û…%iÏ™²œínwù°òó‡gKòo(ûÂíy§p?Fµ=¥ðÚœ­=}X’öÌ¿qIŠa*%)†Eif À5n±Ä+o·pg¼r1F;? ü’ŽO%@S ÃTÄ0•1L%@ S pŠ™Y,˜$E2•’ÃCeÊÃ/7ZD’ü#eºë–oÞê”íDze (ëöû‰£¤[íJ9S–C}åë×è’ÜxTø‰ò½$?Æíñ…ïoóe’ü8*k®/^s©â_)%éL¥$Åð—•ff¡\ãK¼òv wÆ+c´óÊ/éøT1•1L%@ S ÃTÄ0•§¤”R,$€H¦ †rYøué`¾Ï*-rY9š^WælÖ_ªmËö¬Hî{¼²ýXεÍe¶•·FújÛªæVm·W–ç¾Úõ*’õkô‚CáeŸåö‚ªìJ:*û‡Ê}ƒž(øñHYrsçO²\kª¯µ§tüº „©ˆá/+SJ)€küįüù wÆ+c´óÊ/é8À0ï †y—1Ì»ˆaÞ%@ ó.bø_ïÒÌ,L’"™JIŠa§Ly´eþìÂ~ƒ$íy¢M¯+s6Ë7o­“Ë·`^mÁuå•[yYÚ–ýCt«œÌöÀ+ÛÃî.¯)[ú}áeŸåÖ«‹Ê¾ð¡² >W&ÉGÊWî²^›3jOmn½àg—¤_àð·”óÿå§”ff¡ü™…3G€1LIEND®B`‚stk-4.5.0/doc/html/classstk_1_1FileWvOut-members.html0000644000076600007660000003111212327015204020255 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FileWvOut Member List

This is the complete list of members for stk::FileWvOut, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
clipStatus(void)stk::WvOutinline
closeFile(void)stk::FileWvOut
FileWvOut(unsigned int bufferFrames=1024)stk::FileWvOut
FileWvOut(std::string fileName, unsigned int nChannels=1, FileWrite::FILE_TYPE type=FileWrite::FILE_WAV, Stk::StkFormat format=STK_SINT16, unsigned int bufferFrames=1024)stk::FileWvOut
getFrameCount(void) const stk::WvOutinline
getTime(void) const stk::WvOutinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
openFile(std::string fileName, unsigned int nChannels, FileWrite::FILE_TYPE type, Stk::StkFormat format)stk::FileWvOut
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
resetClipStatus(void)stk::WvOutinline
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(const StkFloat sample)stk::FileWvOutvirtual
tick(const StkFrames &frames)stk::FileWvOutvirtual
WvOut(void)stk::WvOutinline
~FileWvOut()stk::FileWvOutvirtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FileWvOut.html0000644000076600007660000011620612327015204016635 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FileWvOut Class Reference

STK audio file output class. More...

#include <FileWvOut.h>

Inheritance diagram for stk::FileWvOut:
stk::WvOut stk::Stk

Public Member Functions

 FileWvOut (unsigned int bufferFrames=1024)
 Default constructor with optional output buffer size argument. More...
 
 FileWvOut (std::string fileName, unsigned int nChannels=1, FileWrite::FILE_TYPE type=FileWrite::FILE_WAV, Stk::StkFormat format=STK_SINT16, unsigned int bufferFrames=1024)
 Overloaded constructor used to specify a file name, type, and data format with this object. More...
 
virtual ~FileWvOut ()
 Class destructor.
 
void openFile (std::string fileName, unsigned int nChannels, FileWrite::FILE_TYPE type, Stk::StkFormat format)
 Open a new file with the specified parameters. More...
 
void closeFile (void)
 Close a file if one is open. More...
 
void tick (const StkFloat sample)
 Output a single sample to all channels in a sample frame. More...
 
void tick (const StkFrames &frames)
 Output the StkFrames data. More...
 
- Public Member Functions inherited from stk::WvOut
 WvOut (void)
 Default constructor.
 
unsigned long getFrameCount (void) const
 Return the number of sample frames output.
 
StkFloat getTime (void) const
 Return the number of seconds of data output.
 
bool clipStatus (void)
 Returns true if clipping has been detected during output since instantiation or the last reset.
 
void resetClipStatus (void)
 Reset the clipping status to false.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK audio file output class.

This class inherits from WvOut. It provides a "tick-level" interface to the FileWrite class.

FileWvOut writes samples to an audio file and supports multi-channel data. It is important to distinguish the tick() method that outputs a single sample to all channels in a sample frame from the overloaded one that takes a reference to an StkFrames object for multi-channel and/or multi-frame data.

See the FileWrite class for a description of the supported audio file formats.

Currently, FileWvOut is non-interpolating and the output rate is always Stk::sampleRate().

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::FileWvOut::FileWvOut ( unsigned int  bufferFrames = 1024)

Default constructor with optional output buffer size argument.

The output buffer size defines the number of frames that are accumulated between writes to disk.

stk::FileWvOut::FileWvOut ( std::string  fileName,
unsigned int  nChannels = 1,
FileWrite::FILE_TYPE  type = FileWrite::FILE_WAV,
Stk::StkFormat  format = STK_SINT16,
unsigned int  bufferFrames = 1024 
)

Overloaded constructor used to specify a file name, type, and data format with this object.

An StkError is thrown for invalid argument values or if an error occurs when initializing the output file.

Member Function Documentation

void stk::FileWvOut::openFile ( std::string  fileName,
unsigned int  nChannels,
FileWrite::FILE_TYPE  type,
Stk::StkFormat  format 
)

Open a new file with the specified parameters.

If a file was previously open, it will be closed. An StkError will be thrown if any of the specified arguments are invalid or a file error occurs during opening.

void stk::FileWvOut::closeFile ( void  )

Close a file if one is open.

Any data remaining in the internal buffer will be written to the file before closing.

void stk::FileWvOut::tick ( const StkFloat  sample)
virtual

Output a single sample to all channels in a sample frame.

An StkError is thrown if an output error occurs.

Implements stk::WvOut.

void stk::FileWvOut::tick ( const StkFrames frames)
virtual

Output the StkFrames data.

An StkError will be thrown if an output error occurs. An StkError will also be thrown if STK_DEBUG is defined during compilation and there is an incompatability between the number of channels in the FileWvOut object and that in the StkFrames object.

Implements stk::WvOut.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FileWvOut.png0000644000076600007660000000116112327015204016446 0ustar gary‰PNG  IHDR\ˆ]ž|SPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíá’ —™¾ÿ#_¥-‚žÚËÝ8eGˆ¸¤!ãorÎÙ ²$ùrI2ü¹<•Ѭ××$,I=oÈË|‹]“ßR¼åÙŠöÉ–¤Çòš_ñ®R”&,IS¾•ï–^Rkþ¸.O”ejÙè’¼/ËäB¯•¥³nyÿB÷²×Y/´KÒ”øo‘$CÈ%ÉðÑòœsvà/<åËâh÷”¯n?»«üƒ»%ä–B`9€!ä†B`ø7òœsö‚,I>„\’ #Oe´ËJ­¯a‹¤f\—鸖tŽ™ü–Ï-©ÖßÈ›6Ð?Æ=ù¶½ £Θö­|ßÝ×e{_”oÒûòæŒ7ä}Yƪ_“'©V~î¿X–#¿ãgF~öùÞYÏt‹$ý !—$CÈ%Éà-Ï9g'^`ðÂS¾,ŽvOùêö³»Ê?¸[B` 9€!ä†B`9€!ä†#O)%/H>„Àð›òuÑ®÷;ï÷ÙA»±× The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Filter Member List

This is the complete list of members for stk::Filter, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
getGain(void) const stk::Filterinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setGain(StkFloat gain)stk::Filterinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFrames &frames, unsigned int channel=0)=0stk::Filterpure virtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Filter.html0000644000076600007660000011515712327015204016202 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Filter Class Referenceabstract

STK abstract filter class. More...

#include <Filter.h>

Inheritance diagram for stk::Filter:
stk::Stk stk::BiQuad stk::Delay stk::DelayA stk::DelayL stk::Fir stk::FormSwep stk::Iir stk::OnePole stk::OneZero stk::PoleZero stk::TapDelay stk::TwoPole stk::TwoZero

Public Member Functions

 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual StkFramestick (StkFrames &frames, unsigned int channel=0)=0
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK abstract filter class.

This class provides limited common functionality for STK digital filter subclasses. It is general enough to support both monophonic and polyphonic input/output classes.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::Filter::setGain ( StkFloat  gain)
inline

Set the filter gain.

The gain is applied at the filter input and does not affect the coefficient values. The default gain value is 1.0.

42 { gain_ = gain; };
StkFloat stk::Filter::phaseDelay ( StkFloat  frequency)
inline

Return the filter phase delay at the specified frequency.

Note that the phase delay calculation accounts for the filter gain. The frequency value should be greater than 0.0 and less than or equal to one-half the sample rate.

94 {
95  if ( frequency <= 0.0 || frequency > 0.5 * Stk::sampleRate() ) {
96  oStream_ << "Filter::phaseDelay: argument (" << frequency << ") is out of range!";
97  handleError( StkError::WARNING ); return 0.0;
98  }
99 
100  StkFloat omegaT = 2 * PI * frequency / Stk::sampleRate();
101  StkFloat real = 0.0, imag = 0.0;
102  for ( unsigned int i=0; i<b_.size(); i++ ) {
103  real += b_[i] * std::cos( i * omegaT );
104  imag -= b_[i] * std::sin( i * omegaT );
105  }
106  real *= gain_;
107  imag *= gain_;
108 
109  StkFloat phase = atan2( imag, real );
110 
111  real = 0.0, imag = 0.0;
112  for ( unsigned int i=0; i<a_.size(); i++ ) {
113  real += a_[i] * std::cos( i * omegaT );
114  imag -= a_[i] * std::sin( i * omegaT );
115  }
116 
117  phase -= std::atan2( imag, real );
118  phase = std::fmod( -phase, 2 * PI );
119  return phase / omegaT;
120 }
virtual StkFrames& stk::Filter::tick ( StkFrames frames,
unsigned int  channel = 0 
)
pure virtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implemented in stk::Delay, stk::BiQuad, stk::DelayA, stk::Iir, stk::DelayL, stk::TapDelay, stk::FormSwep, stk::TwoPole, stk::PoleZero, stk::TwoZero, stk::Fir, stk::OnePole, and stk::OneZero.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Filter.png0000644000076600007660000000716012327015204016014 0ustar gary‰PNG  IHDRÄ(§¿=PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2 ÿIDATxíív£:Ë­sxÿG¾áËŒ‰Ì ëvÒDe# ïNI3â/¥”rÿ‚"I €V"!ID •ï%nC«ú_×ΰ$mð•îDZÏè—¼_÷:àéf;,I[,$îë=Ä;Ç<$S5,Iû¸HLÑ®ƒ½×Ä7ùä“N»ÑNôëtÚ)ìÏH§ºíNþ…=¥Ó\Ö÷Â^KÒ>yc´ I: ­DB’ˆ@+¿C¢”R®ÀàÓù ]÷ ,~ƒÄ—Ãç[ü ‰œNDÀH8 "à@$ˆ€‘p DÀH8 "p ·Ûívÿ‚+ÿ£H´ €"ÐÊÑô5WOÏ'νa)ñt`‡wK +þõQG;ß c㞌¯‚á1€ o–¨’¦`@«Œx¶ÿ‚£5ÖzS»;8¤ÓƒÄÃN,V¼¿°ëtz&ñÍ¿áSO ûsÒi.ëÝ®O'€GòÆh%D •H €V~‡Äív»]€À§ó$ºîXü‰/‡Ï·ø9<ˆ€‘p DÀH8 "à@$ˆ€‘p DÀÓ¥”r/p^B’."­DB’ˆ@+û·¡-Ýþ‡ÇŽ$=²6“¨B¬ï%ÕÍG¢_æ~­k9ðelº7fü‰¤¥½MâêSù‰ê)'‰)ª*¤ª&wâ¡g’NëXÝM…þ#]×ugØ)ì:ökâ^1_’–æP»…½œNÓn9ÖÄ”NsYÏámßõCÓQft:IÒO €V"!ID •HHÒ‘h¥”R.àNK¸ "à@$ˆ€‘p DÀH8 "à@$ˆ€‘p DÀ¿-QJ)—ðç%$é""ÐJ$$é€H´ò\â6´¥Û_ëiI:ÂPb¹½D¿äýº×ãMÿ9îÈæN’¶¼UbŒ}hS€w›éfZ¾$iÍ»%¦ðÒgº³ÄüS‰±Â§tª·IÒª½,Ñu]w†'…]§ÓÎN¬· ~̱&6…]Õ±»Ä”NsYOßßëÓéiE|Úû7H<{ï}’ÄÓw÷g¥“$í €V"!ID •RJ¹ €8-àB$ˆ€‘p DÀH8 "à@$ˆ€‘p DÀH8 þ¶D)¥\À œ—¤‹ˆ@+‘¤"ÐʾÄmhK·¿ÖÓ’´bgÌLbåNÀ·Á÷IôKÞ¯{í1ÞôŸãŽlîì$ÆØ‡6x·™n–¡åk‘q‘˜Â{HŸuèÎcðO%Æ ŸÒ©Ú¦m韓躮;ÃNa×é´³Û-X6akáP›Â®²Æ]bJ§9¶)â{²¬O§êlò’¤WØ{ñ}šÄÃÇH9|P:IÒ"ÐJ$$é€H´RJ)—ð§%\ˆ€‘p DÀH8 "à@$ˆ€‘p DÀH8 "àÀß–(¥”Ëxó’t‘h%’t@$Zy"qÚÒí¯õ´¤ª= 8Jlµ—è—¼_÷Úc¼é?ÇÙÜÙIŒ m ð.±ZIÒŠ·JLq=¤ÏC̶cðO%Æ ŸÒiµ'’´æe‰®ëº3ìvN;;±Ú‚%ë$iEMl {]ÇÖS:ͱMßßëÓéÿöEòioìÝMø0‰çŸ#qàðIé$IûD •HHÒ‘h¥”R.àNK¸ "à@$ˆ€‘p DÀH8 "à@$ˆ€‘p DÀ¿-QJ)—ðç%$é""ÐJ$$é€H´Ò qÚÒ®õ˜$=â,!IM˜H +þõQ{Ì7ý÷0#I»xHŒ±m ¹¶F·ÅFbн v*‰YK’ž`”N«t’¤g¼,Ñu]w†ï »N§Ë%ÎÐZÏ [’ža•NsYï¶$=%ol€V"!ID •HHÒ‘håwH”RÊU¼Ài "à@$ˆ€‘p DÀH8 "à@$ˆ€‘p DÀH8ð·%J)å2^༄$]D$Z‰„$ €VV·¡-Ýá’¤=Žæœ$$éÃä±Å?—èWµ_ÚÚc¹×¼Ÿ½?1MηÓχ‡æßýk‰1²¡Í!-÷@‡H‡6õj‰»Êý‡oXbXÕ„¤Ûš{”óä2¶Þ¥·¤ÓƒÄv'ööhi£òÿ‘躮;ÃRØu:5HÌÉ´*”êÁ÷ÖÄcaJ<̾¯&¦tšËsk³*â9gÖ£§“$ý UME •HHÒ‘h%’t@$Z)¥”ËxÓ.DÀH8 "à@$ˆ€‘p DÀH8 "à@$ˆ€‘pàoK”RÊe¼Ày IºˆH´ I: ­4I܆ö¬+I»¸KHÒ·ØHÜz¯Úcº%é.c¼Cã^Úà'IO1’˜b¯"¾ï„$`•NÿL¢ëºî ßvNŸ¹7©nNsY¯ [’ŽÈ •HHÒ‘h%’t@$Zù¥”r/pZÀ…H8 "à@$ˆ€‘p DÀH8 "à@$ˆ€‘p üm‰RJ¹ €8/!I €V"!ID •G‰ÛÐê¯K’Öô£ÕðÎNCç1ÆÍ°D¿´ýúÖÓÍ04.ý¸w‰¥»Ý±·HŒ±áÖÝyn˜ÇWݻڻ%–p÷vbõ5Õ„›Äü·côó#•ÄöxY¢ëºî ›Â®Óé`'ª5H<ŸšØZ¬§~À4æ²¾Wï”%ëCh9¾¼N'IúI"ÐJ$$é€H´ I: ­”RÊe¼Ài "à@$ˆ€‘p DÀH8 "à@$ˆ€‘p DÀH8ð·%J)å2^༄$]D$Z‰„$ €V$nC«¾.IZÓîNXJ gÁJô Û¯ní1Ý CãÂWë_÷ÇŸ­öæcìc¸uwž[–Á¥?M×›ó&‰%ܽØH,Ÿ[ÞNßKÌõ<ÏLýŸèº®;ú°ët:؉º¦ëotªÛötZ§Óª¸ýÒi.ë9Ò:}ƦÏ9ªìzÿé$I?J$Z‰„$ €V"!ID •RJ¹ €8-àB$ˆ€‘p DÀH8 "à@$ˆ€‘p DÀH8 þ¶D)¥\À œ—¤‹ˆ@+‘¤"ÐÊVâ6´¥Û_«Ùz¢ž’¤ 6›Ð%ÕÍO¢_×~qk»Ä¸êË]5;öÇß­öæ cìC›âm¦ïedŠt1œ—`½9"­‹`Jü=‰åsË›ÓéA¢úž$æzž·c­ù¿$º®ëΰ*ì:žJìÌlwÄ¢&6…½—N«'ìÒi.ë­ÍætZÞuv½ýt’¤Ÿ%­DB’ˆ@+‘¤"ÐJ)¥\À œ–p!DÀH8 "à@$ˆ€‘p DÀH8 "à@$ˆ€[¢”R.àÎKHÒED •HHÒ‘he+qÚ½7^’ê¶ÛΛIìG8 Õª’´Ã;$úÕí—x³óâ÷Ó×<1¯îÞ)1Æ>´)–eÅçû3ËËÐòõV‰%Ô\Y‡úØ·¸§ÊžÄXÊÕð|Wýøe‰®ëº3¬ »N§‡*~²ë-Xýö½5ñPØ;5QÕ±‘Ä”NsY¯ {:µæÓéþžXŸNëŠp}c?{!–û·JHÒO €V"!ID •HHÒ‘h¥”R.ã?ö-xÏÖæ‚IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Fir-members.html0000644000076600007660000003305412327015204017120 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Fir Member List

This is the complete list of members for stk::Fir, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
Fir(void)stk::Fir
Fir(std::vector< StkFloat > &coefficients)stk::Fir
getGain(void) const stk::Filterinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::Firinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setCoefficients(std::vector< StkFloat > &coefficients, bool clearState=false)stk::Fir
setGain(StkFloat gain)stk::Filterinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::Firinline
tick(StkFrames &frames, unsigned int channel=0)stk::Firinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::Firinline
~Fir(void)stk::Fir
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Fir.html0000644000076600007660000013615312327015204015474 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Fir Class Reference

STK general finite impulse response filter class. More...

#include <Fir.h>

Inheritance diagram for stk::Fir:
stk::Filter stk::Stk

Public Member Functions

 Fir (void)
 Default constructor creates a zero-order pass-through "filter".
 
 Fir (std::vector< StkFloat > &coefficients)
 Overloaded constructor which takes filter coefficients. More...
 
 ~Fir (void)
 Class destructor.
 
void setCoefficients (std::vector< StkFloat > &coefficients, bool clearState=false)
 Set filter coefficients. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK general finite impulse response filter class.

This class provides a generic digital filter structure that can be used to implement FIR filters. For filters with feedback terms, the Iir class should be used.

In particular, this class implements the standard difference equation:

y[n] = b[0]*x[n] + ... + b[nb]*x[n-nb]

The gain parameter is applied at the filter input and does not affect the coefficient values. The default gain value is 1.0. This structure results in one extra multiply per computed sample, but allows easy control of the overall filter gain.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Fir::Fir ( std::vector< StkFloat > &  coefficients)

Overloaded constructor which takes filter coefficients.

An StkError can be thrown if the coefficient vector size is zero.

Member Function Documentation

void stk::Fir::setCoefficients ( std::vector< StkFloat > &  coefficients,
bool  clearState = false 
)

Set filter coefficients.

An StkError can be thrown if the coefficient vector size is zero. The internal state of the filter is not cleared unless the clearState flag is true.

StkFrames & stk::Fir::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

101 {
102 #if defined(_STK_DEBUG_)
103  if ( channel >= frames.channels() ) {
104  oStream_ << "Fir::tick(): channel and StkFrames arguments are incompatible!";
105  handleError( StkError::FUNCTION_ARGUMENT );
106  }
107 #endif
108 
109  StkFloat *samples = &frames[channel];
110  unsigned int i, hop = frames.channels();
111  for ( unsigned int j=0; j<frames.frames(); j++, samples += hop ) {
112  inputs_[0] = gain_ * *samples;
113  *samples = 0.0;
114 
115  for ( i=(unsigned int)b_.size()-1; i>0; i-- ) {
116  *samples += b_[i] * inputs_[i];
117  inputs_[i] = inputs_[i-1];
118  }
119  *samples += b_[0] * inputs_[0];
120  }
121 
122  lastFrame_[0] = *(samples-hop);
123  return frames;
124 }
StkFrames & stk::Fir::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

127 {
128 #if defined(_STK_DEBUG_)
129  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
130  oStream_ << "Fir::tick(): channel and StkFrames arguments are incompatible!";
131  handleError( StkError::FUNCTION_ARGUMENT );
132  }
133 #endif
134 
135  StkFloat *iSamples = &iFrames[iChannel];
136  StkFloat *oSamples = &oFrames[oChannel];
137  unsigned int i, iHop = iFrames.channels(), oHop = oFrames.channels();
138  for ( unsigned int j=0; j<iFrames.frames(); j++, iSamples += iHop, oSamples += oHop ) {
139  inputs_[0] = gain_ * *iSamples;
140  *oSamples = 0.0;
141 
142  for ( i=(unsigned int)b_.size()-1; i>0; i-- ) {
143  *oSamples += b_[i] * inputs_[i];
144  inputs_[i] = inputs_[i-1];
145  }
146  *oSamples += b_[0] * inputs_[0];
147  }
148 
149  lastFrame_[0] = *(oSamples-oHop);
150  return iFrames;
151 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Fir.png0000644000076600007660000000076012327015204015306 0ustar gary‰PNG  IHDR>ˆˆŒ¨PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíÑŽ„ E4ñÿ?y‹0ꔇÉÎÔôºXz쥳¯ˆˆØ…Ä£UŽÇu„êy½é‡xZï¹;|k³õÒ¥yqNðÚ#U–êd]¥¯ð\×–Õ³ŸÜÌꊩ¼5?Ýy£É_.›/ƒ«£kÓþÉ8."bÀ•»æðe™âçð•žá'ñOÞq›0Éq“0é«q»c´Êñz…ÇcºJZï<Ã_îtxê²Þt]Y¤Üîc»¥§W·Önã?)ïh<×iÇûÑcˆGTõæ;¼ë~¼¯6ÿ ?mŒÎþbtOÌ—Á G§'ïŸÌã""f\é£ÿ¤–eŠŸÃWz†ŸÄ? The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Flute Member List

This is the complete list of members for stk::Flute, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Flutevirtual
controlChange(int number, StkFloat value)stk::Flutevirtual
Flute(StkFloat lowestFrequency)stk::Flute
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Flutevirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Flutevirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setEndReflection(StkFloat coefficient)stk::Fluteinline
setFrequency(StkFloat frequency)stk::Flutevirtual
setJetDelay(StkFloat aRatio)stk::Flute
setJetReflection(StkFloat coefficient)stk::Fluteinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
startBlowing(StkFloat amplitude, StkFloat rate)stk::Flute
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stopBlowing(StkFloat rate)stk::Flute
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Fluteinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Fluteinlinevirtual
~Flute(void)stk::Flute
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Flute.html0000644000076600007660000012321012327015204016021 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Flute Class Reference

STK flute physical model class. More...

#include <Flute.h>

Inheritance diagram for stk::Flute:
stk::Instrmnt stk::Stk

Public Member Functions

 Flute (StkFloat lowestFrequency)
 Class constructor, taking the lowest desired playing frequency. More...
 
 ~Flute (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setJetReflection (StkFloat coefficient)
 Set the reflection coefficient for the jet delay (-1.0 - 1.0).
 
void setEndReflection (StkFloat coefficient)
 Set the reflection coefficient for the air column delay (-1.0 - 1.0).
 
void setJetDelay (StkFloat aRatio)
 Set the length of the jet delay in terms of a ratio of jet delay to air column delay lengths.
 
void startBlowing (StkFloat amplitude, StkFloat rate)
 Apply breath velocity to instrument with given amplitude and rate of increase.
 
void stopBlowing (StkFloat rate)
 Decrease breath velocity with given rate of decrease.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK flute physical model class.

This class implements a simple flute physical model, as discussed by Karjalainen, Smith, Waryznyk, etc. The jet model uses a polynomial, a la Cook.

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others.

Control Change Numbers:

  • Jet Delay = 2
  • Noise Gain = 4
  • Vibrato Frequency = 11
  • Vibrato Gain = 1
  • Breath Pressure = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Flute::Flute ( StkFloat  lowestFrequency)

Class constructor, taking the lowest desired playing frequency.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::Flute::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

138 {
139  unsigned int nChannels = lastFrame_.channels();
140 #if defined(_STK_DEBUG_)
141  if ( channel > frames.channels() - nChannels ) {
142  oStream_ << "Flute::tick(): channel and StkFrames arguments are incompatible!";
143  handleError( StkError::FUNCTION_ARGUMENT );
144  }
145 #endif
146 
147  StkFloat *samples = &frames[channel];
148  unsigned int j, hop = frames.channels() - nChannels;
149  if ( nChannels == 1 ) {
150  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
151  *samples++ = tick();
152  }
153  else {
154  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
155  *samples++ = tick();
156  for ( j=1; j<nChannels; j++ )
157  *samples++ = lastFrame_[j];
158  }
159  }
160 
161  return frames;
162 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Flute.png0000644000076600007660000000107412327015204015644 0ustar gary‰PNG  IHDRLˆz0ý»PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ËIDATxíѮ㠇ƒ”ÿÿäMIMJÛø®W[é:õ©ÀÆÆ©úJ­µF‰*I1J˜$ùôVš™ùúLÜ?‚µñîóÁ¶#lç°‰}pu„û·¼#·iÜ’4è%¬gIçÍë|Sæ4«ØËœ4ÀW¦µY7ï7 —y\ÿÙ€Ñ-Iƒò·)I>%L’|ZaµÖ$€Z¢ [–@Z$leÅÑBa_ÜÍ„8•0ŸàSÂ|J€O ³O­µF‰*I1J˜$ùt•fv*éa×ùÅÿ`e­_–ׯ[àÞíÓVíÑæ·°=ÚÛi‘¬õìf6z…u†©åÜÿ¾l5\ÍXækؾË|‚ä°"Y›”é€õ:ŽëÎ?/»tS’þV “$Ÿ~¬ÖZƒpCÿãࣖ% [Yq´PØw3aN% À§„ø”0ŸàSÂìSJ)Q¢Ä(a>Ía«Ïº{«Œo~‚{°'ÄMX;ÁþƜۆkðX»ÂöõÍö The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FM Member List

This is the complete list of members for stk::FM, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::FMvirtual
FM(unsigned int operators=4)stk::FM
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::FM
keyOn(void)stk::FM
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
loadWaves(const char **filenames)stk::FM
noteOff(StkFloat amplitude)stk::FMvirtual
noteOn(StkFloat frequency, StkFloat amplitude)=0stk::Instrmntpure virtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setControl1(StkFloat cVal)stk::FMinline
setControl2(StkFloat cVal)stk::FMinline
setFrequency(StkFloat frequency)stk::FMvirtual
setGain(unsigned int waveIndex, StkFloat gain)stk::FM
setModulationDepth(StkFloat mDepth)stk::FMinline
setModulationSpeed(StkFloat mSpeed)stk::FMinline
setRatio(unsigned int waveIndex, StkFloat ratio)stk::FM
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int)=0stk::FMpure virtual
tick(StkFrames &frames, unsigned int channel=0)=0stk::FMpure virtual
~FM(void)stk::FMvirtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FM.html0000644000076600007660000012412012327015204015245 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FM Class Referenceabstract

STK abstract FM synthesis base class. More...

#include <FM.h>

Inheritance diagram for stk::FM:
stk::Instrmnt stk::Stk stk::BeeThree stk::FMVoices stk::HevyMetl stk::PercFlut stk::Rhodey stk::TubeBell stk::Wurley

Public Member Functions

 FM (unsigned int operators=4)
 Class constructor, taking the number of wave/envelope operators to control. More...
 
virtual ~FM (void)
 Class destructor.
 
void loadWaves (const char **filenames)
 Load the rawwave filenames in waves.
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setRatio (unsigned int waveIndex, StkFloat ratio)
 Set the frequency ratio for the specified wave.
 
void setGain (unsigned int waveIndex, StkFloat gain)
 Set the gain for the specified wave.
 
void setModulationSpeed (StkFloat mSpeed)
 Set the modulation speed in Hz.
 
void setModulationDepth (StkFloat mDepth)
 Set the modulation depth.
 
void setControl1 (StkFloat cVal)
 Set the value of control1.
 
void setControl2 (StkFloat cVal)
 Set the value of control1.
 
void keyOn (void)
 Start envelopes toward "on" targets.
 
void keyOff (void)
 Start envelopes toward "off" targets.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
virtual StkFloat tick (unsigned int)=0
 Compute and return one output sample.
 
virtual StkFramestick (StkFrames &frames, unsigned int channel=0)=0
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
virtual void noteOn (StkFloat frequency, StkFloat amplitude)=0
 Start a note with the given frequency and amplitude.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK abstract FM synthesis base class.

This class controls an arbitrary number of waves and envelopes, determined via a constructor argument.

Control Change Numbers:

  • Control One = 2
  • Control Two = 4
  • LFO Speed = 11
  • LFO Depth = 1
  • ADSR 2 & 4 Target = 128

The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::FM::FM ( unsigned int  operators = 4)

Class constructor, taking the number of wave/envelope operators to control.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

virtual StkFrames& stk::FM::tick ( StkFrames frames,
unsigned int  channel = 0 
)
pure virtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

Implemented in stk::FMVoices, stk::Rhodey, stk::Wurley, stk::BeeThree, stk::TubeBell, stk::PercFlut, and stk::HevyMetl.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FM.png0000644000076600007660000000450112327015204015065 0ustar gary‰PNG  IHDR¹À72‹¦PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÐIDATxíÝëv£Æ…ÑÉf ½ÿ#[×që´±R9+aÚ­ëvŸÐ_8fÇñ$ðÃÆªªS¤\8CÊ…€¾¤\èKÊ…€¾¤\èËn¹Ãõhný·pwUÕTÊ…€3üi¹×ßîK¹ð[å~_\¿¯°m¥÷ÌﮪšI¹p†rŸWÖk¤P¿s~ÜÚ¼ê¦\8Ãv¹÷D§…^o¾ß]U“#åBÀ6Ê]Oô~)N¹ðû¶Ê}&z¿ü>/ÄïwWUͤ\8ÃF¹CU{,”»™nÊ…€3l]s‡ï0¿~\=B¾þkﮪZ”r!à [åVUýs)Îr! /)ú’r! /)ú’r! /)ú’r! /ã8Ž'€€Oº@@@7R.tårIºГ” ]ù 7éB@GR.ô&ÝB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.|Ü8ŽãI à‡UU§H¹p†” }I¹З” }I¹З¥r‡ëÑÞ¬ª×1¿½rÊ…€3¤\èˬÜá»Ú¯m¼×?ðzøûŽëÿ×gݽޟr!àdÓro)ÞËloUíqOõz´¦\8Û[¹÷`› ŸWÖ×ó®ÛGS.œjZî­ØÕrŸ§\ø”Y¹¯_6åN3N¹ðû¦åUí1/wj õ:R.ü’Ù5w¸Vx»â^Îb}üX,wšnÊ…€3ÌÊ­ªú!)Îr! /)ú’r! /)ú’r! /)ú’r! /ã8Ž'€€Oº@@@7R.tårIºГ” ]ù 7éB@GR.ô&ÝB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.ô%åB@_R.|Ü0 ÃI à‡×WÊ…€3¤\èKÊ…€¾¤\èKÊ…€¾ìõõõxû”áúßë¾—§\8ß–û,¸ýoR.œa+½ïj¿~´ñ¦\ø°õ¾nÁ^ï'=o޼ݗr!à—m–{¶yÎ×5øz3åBÀ‡l¥÷¸Ô¶å¶äæ 3)ΰÙ×-ÍöÊšr!àÃÖûh·rŸ`AÊ…€3l¥wMóvÅ}\`S.|Øy}¥\8CÊ…€¾¤\èKÊ…€¾¤\èKÊ…€¾¤\èKÊ…€¾ Ã0œ>éÝH¹ЕË%éB@OR.tå+ܤ I¹Лt }I¹З” }I¹З” }I¹З” }I¹З” }I¹ð¯p¹\.q¹\.q¹\.? Nò+‘ Ã2öd—à° ÃR.ìÉ8,åž Ã2öd—à° ÃR.ìÉ8,åž Ã2öd—à° ÃR.ìÉ8,åž Ã2öd—à° ÃR.ìÉ8,åž Ã2öd—à° ÃR.ìÉ8ìß8dÇñ°Ë8Žãa2ŽãxX†Œã8f¬ª:E»€ªªSdHUÕaÿ¥!Ù¥ªªmRUuXÊ­ªÚ“!UU‡¥Üªª=9UU‡eHUÕa)·ªjO†TUö‘r‡ëñºùý_UMŽë_w¿=PUí±¶€¥Í}Ͼž´1i}—æc6ß©¾ðòÍSqdË–W:}áÎù^ó>jó´l ™NxœåÅw-rö·í–»pjÖ²Ý×^¹+ï°vU½Ž£å>wãùk»²ªz?Uîkøß–»>fñãñOË]¸ïG˽ÓÂ#Ë{õr¯ÉÜ.¥ÓOÚõMoçôñI»ß¿óú’éV°:cÏs¯ ËtÀsÌâ.­y½ÓÝãW;¼yùÎgðÈ–½vgö­ò½ÍÙÙø nŒyž„ç¾¼-ñ@¹KÚ¥ÌçÌùå®­ez:®»¶¹¦ÜÛËnc{sr~'·ÇÕñù{6â}ë3§øõÈl=³Ðž/[Ú¥1KïÔ>siÄúù>°eóÝyÿ#vÏ÷ö˜ùö¬­!‹f徆•½Ú.wyÒä½Û][_È´ÜÉåçþ Yº@M×´ô‘Y/wkÆ^¹Ó9›å®Œy?­Yîî–µ[Ò<ô‡å=3‹¿•û>a~Í~Eͧ/waÒí ;TÕÌ¡rŸ_Ó“ýyÎy|…>¾çSfOXYÀꌦŸ×wìR¹-{¼jq—ÖÇLv}!Þf­ûån/gVð|¥p¾×Ƭ—û¾„Ïà„år_ŸþõAå.OZ/wu!m¹Óëø¬ÜéÖ/_sçŒå¨–g.wþ²/òùó'ßÙͤ¶ÜI^{Qm-g’Ø_”»wf5K The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FMVoices Member List

This is the complete list of members for stk::FMVoices, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::FMVoicesvirtual
FM(unsigned int operators=4)stk::FM
FMVoices(void)stk::FMVoices
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::FM
keyOn(void)stk::FM
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
loadWaves(const char **filenames)stk::FM
noteOff(StkFloat amplitude)stk::FMvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::FMVoicesvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setControl1(StkFloat cVal)stk::FMinline
setControl2(StkFloat cVal)stk::FMinline
setFrequency(StkFloat frequency)stk::FMVoicesvirtual
setGain(unsigned int waveIndex, StkFloat gain)stk::FM
setModulationDepth(StkFloat mDepth)stk::FMinline
setModulationSpeed(StkFloat mSpeed)stk::FMinline
setRatio(unsigned int waveIndex, StkFloat ratio)stk::FM
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::FMVoicesinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::FMVoicesinlinevirtual
~FM(void)stk::FMvirtual
~FMVoices(void)stk::FMVoices
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FMVoices.html0000644000076600007660000013625212327015204016427 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FMVoices Class Reference

STK singing FM synthesis instrument. More...

#include <FMVoices.h>

Inheritance diagram for stk::FMVoices:
stk::FM stk::Instrmnt stk::Stk

Public Member Functions

 FMVoices (void)
 Class constructor. More...
 
 ~FMVoices (void)
 Class destructor.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::FM
 FM (unsigned int operators=4)
 Class constructor, taking the number of wave/envelope operators to control. More...
 
virtual ~FM (void)
 Class destructor.
 
void loadWaves (const char **filenames)
 Load the rawwave filenames in waves.
 
void setRatio (unsigned int waveIndex, StkFloat ratio)
 Set the frequency ratio for the specified wave.
 
void setGain (unsigned int waveIndex, StkFloat gain)
 Set the gain for the specified wave.
 
void setModulationSpeed (StkFloat mSpeed)
 Set the modulation speed in Hz.
 
void setModulationDepth (StkFloat mDepth)
 Set the modulation depth.
 
void setControl1 (StkFloat cVal)
 Set the value of control1.
 
void setControl2 (StkFloat cVal)
 Set the value of control1.
 
void keyOn (void)
 Start envelopes toward "on" targets.
 
void keyOff (void)
 Start envelopes toward "off" targets.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK singing FM synthesis instrument.

This class implements 3 carriers and a common modulator, also referred to as algorithm 6 of the TX81Z.

Algorithm 6 is :
/->1 -\
4-|-->2 - +-> Out
\->3 -/

Control Change Numbers:

  • Vowel = 2
  • Spectral Tilt = 4
  • LFO Speed = 11
  • LFO Depth = 1
  • ADSR 2 & 4 Target = 128

The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::FMVoices::FMVoices ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::FMVoices::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::FM.

107 {
108  unsigned int nChannels = lastFrame_.channels();
109 #if defined(_STK_DEBUG_)
110  if ( channel > frames.channels() - nChannels ) {
111  oStream_ << "FMVoices::tick(): channel and StkFrames arguments are incompatible!";
112  handleError( StkError::FUNCTION_ARGUMENT );
113  }
114 #endif
115 
116  StkFloat *samples = &frames[channel];
117  unsigned int j, hop = frames.channels() - nChannels;
118  if ( nChannels == 1 ) {
119  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
120  *samples++ = tick();
121  }
122  else {
123  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
124  *samples++ = tick();
125  for ( j=1; j<nChannels; j++ )
126  *samples++ = lastFrame_[j];
127  }
128  }
129 
130  return frames;
131 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FMVoices.png0000644000076600007660000000142012327015204016233 0ustar gary‰PNG  IHDR[À\Iï+PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ŸIDATxíí’³ F3Þÿ%¿)&j[û‘¾ÓÙtsT10û›Zk ‚*I!¤[’<ÿÙ]Z˜öü;HK’çyw{^ro¹/ ¼¬ÒzúÃ6-IîºÇêšæªj1iI:ä‘»K¼cÔû~Q×äPÒ?ç·¯ÉÁ^¾UGçäå½ì5¹îäØKŸ–¤Còÿ‰$yÒ-Ižv×Zk 療tOSœ<Ð=«Ãä‘îŸ='éØnOº<éð¤À“nOº<Ä]k­AP%)„tK’çûîÒÂ6%­±mßÈÕ].ÞùbõíùÒ±v_í¯Zz[þŽ{ÜçÚf‘ltY ÛûÀÝ•fàXÝÚ½y󾎷jrÛ=º_rûšìÜþEϹ‹dã &¯»ûG_wr¯ûxä¾N$éS¤[’<é–$O°»ÖZc8ÏD {šâäîY&tÿì9I7À†txÒ àI7€'ÝžtxÒ àù#îZk ‚*I!¤[’<ÿ×]Z¬Íö[s¶O’çÝãö&I;îºÛúæ‹ÕȽ([\ £Ù;—Üëî®4‚^îwÝ‹së¶µÙ I6쥭ÉGÝE²±s$é€51•ÝœëwÜ’ôé–$Oº%É쮵ÖÎ3螦8y {V‡É#Ý?{NÒ °!ÝžtxÒ àI7€'Ýžtxþˆ»”R‚ „nÏÝsöûvÜx\ÝYÚ÷xǸmÝ7XÝmâr&ÇÌw˵fû¢¥¹ôÛÖ½([ô)®K®ú(wÊÕÝûÌ÷örŸp»ÄaMvn» ×y}ÊÞ}]È®&fäþœso§Õû`/íšëÉz÷š˜Êús½s?qN>Lº<éð»K)%†ÙÜ9/RLIEND®B`‚stk-4.5.0/doc/html/classstk_1_1FormSwep-members.html0000644000076600007660000003423412327015204020143 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FormSwep Member List

This is the complete list of members for stk::FormSwep, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
FormSwep(void)stk::FormSwep
getGain(void) const stk::Filterinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::FormSwepinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::FormSwepinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
setGain(StkFloat gain)stk::Filterinline
setRawwavePath(std::string path)stk::Stkstatic
setResonance(StkFloat frequency, StkFloat radius)stk::FormSwep
setSampleRate(StkFloat rate)stk::Stkstatic
setStates(StkFloat frequency, StkFloat radius, StkFloat gain=1.0)stk::FormSwep
setSweepRate(StkFloat rate)stk::FormSwep
setSweepTime(StkFloat time)stk::FormSwep
setTargets(StkFloat frequency, StkFloat radius, StkFloat gain=1.0)stk::FormSwep
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::FormSwepinline
tick(StkFrames &frames, unsigned int channel=0)stk::FormSwepinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::FormSwepinline
~FormSwep()stk::FormSwep
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FormSwep.html0000644000076600007660000013754512327015204016524 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FormSwep Class Reference

STK sweepable formant filter class. More...

#include <FormSwep.h>

Inheritance diagram for stk::FormSwep:
stk::Filter stk::Stk

Public Member Functions

 FormSwep (void)
 Default constructor creates a second-order pass-through filter.
 
 ~FormSwep ()
 Class destructor.
 
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes.
 
void setResonance (StkFloat frequency, StkFloat radius)
 Sets the filter coefficients for a resonance at frequency (in Hz). More...
 
void setStates (StkFloat frequency, StkFloat radius, StkFloat gain=1.0)
 Set both the current and target resonance parameters.
 
void setTargets (StkFloat frequency, StkFloat radius, StkFloat gain=1.0)
 Set target resonance parameters.
 
void setSweepRate (StkFloat rate)
 Set the sweep rate (between 0.0 - 1.0). More...
 
void setSweepTime (StkFloat time)
 Set the sweep rate in terms of a time value in seconds. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return a reference to one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK sweepable formant filter class.

This class implements a formant (resonance) which can be "swept" over time from one frequency setting to another. It provides methods for controlling the sweep rate and target frequency.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::FormSwep::setResonance ( StkFloat  frequency,
StkFloat  radius 
)

Sets the filter coefficients for a resonance at frequency (in Hz).

This method determines the filter coefficients corresponding to two complex-conjugate poles with the given frequency (in Hz) and radius from the z-plane origin. The filter zeros are placed at z = 1, z = -1, and the coefficients are then normalized to produce a constant unity gain (independent of the filter gain parameter). The resulting filter frequency response has a resonance at the given frequency. The closer the poles are to the unit-circle (radius close to one), the narrower the resulting resonance width. An unstable filter will result for radius >= 1.0. The frequency value should be between zero and half the sample rate.

void stk::FormSwep::setSweepRate ( StkFloat  rate)

Set the sweep rate (between 0.0 - 1.0).

The formant parameters are varied in increments of the sweep rate between their current and target values. A sweep rate of 1.0 will produce an immediate change in resonance parameters from their current values to the target values. A sweep rate of 0.0 will produce no change in resonance parameters.

void stk::FormSwep::setSweepTime ( StkFloat  time)

Set the sweep rate in terms of a time value in seconds.

This method adjusts the sweep rate based on a given time for the formant parameters to reach their target values.

StkFrames & stk::FormSwep::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

154 {
155 #if defined(_STK_DEBUG_)
156  if ( channel >= frames.channels() ) {
157  oStream_ << "FormSwep::tick(): channel and StkFrames arguments are incompatible!";
158  handleError( StkError::FUNCTION_ARGUMENT );
159  }
160 #endif
161 
162  StkFloat *samples = &frames[channel];
163  unsigned int hop = frames.channels();
164  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
165  *samples = tick( *samples );
166 
167  return frames;
168 }
StkFrames & stk::FormSwep::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

171 {
172 #if defined(_STK_DEBUG_)
173  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
174  oStream_ << "FormSwep::tick(): channel and StkFrames arguments are incompatible!";
175  handleError( StkError::FUNCTION_ARGUMENT );
176  }
177 #endif
178 
179  StkFloat *iSamples = &iFrames[iChannel];
180  StkFloat *oSamples = &oFrames[oChannel];
181  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
182  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop )
183  *oSamples = tick( *iSamples );
184 
185  return iFrames;
186 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FormSwep.png0000644000076600007660000000120512327015204016323 0ustar gary‰PNG  IHDR]ˆ²\mPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíᎳ E—Ä÷ä¯" èè¶_wvÓìN# G¸Cú›œsvƒ,IN„]’,~ßžJúË–¤ÿa/÷ÛØ›öu‘ëJGS½9KÒ‘{{_a5YÉe–$›/íU3[zî_DóD2¦¦né=ûœŒQÕ7“›ufÞ¨jM¦Õ´Wu–$›øŸ‘$‹°K’ŇÛsÎÙ €XÜpµ/‹§ÞÕþ;ê}í}fÂ`v‹°X„À"ìa°;€Å_²çœ³dIr"ì’dñ›öTÚÞ-Wg$Éà5ûåŒ$\ÚË?£¦Ý”±mëOéIÒ‰+û°ÿõÅ9‹)œÂÅ>nìU3Ʊ٤½u$éÈm2'ûiíûç$éÄMUÇd®ìçrKÚÛ¹_Tõ’i55«:žI:ÿ3’dvI²øp{Î9{ð €®öeñÔ»ÚrG½¯ý£ÏLØLÂ`v‹°X„À"ìa°øKö”RrƒàDØ,~ÔþèŒýZxƒ»¹§ìW”É{ýn_×QOhe¿ÙV¹Îö'êd»­¯—‡ºsx¨µöìn(­öF{ÿÆðåa }rÊH3ýõ6¹÷5&s²×níjoÛZLûœÌö–ËTŒáÁ‹ÜÏU½µŸfÜk2­6ÇÏLlÛŸGïÎ À÷0Õ-ìgÂ`ánO)%/þN''ޱ7w;IEND®B`‚stk-4.5.0/doc/html/classstk_1_1FreeVerb-members.html0000644000076600007660000003473212327015205020105 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::FreeVerb Member List

This is the complete list of members for stk::FreeVerb, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Effectinline
clear(void)stk::FreeVerbvirtual
Effect(void)stk::Effectinline
FreeVerb()stk::FreeVerb
getDamping(void)stk::FreeVerb
getMode(void)stk::FreeVerb
getRoomSize(void)stk::FreeVerb
getWidth(void)stk::FreeVerb
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Effectinline
lastOut(unsigned int channel=0)stk::FreeVerbinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setDamping(StkFloat value)stk::FreeVerb
setEffectMix(StkFloat mix)stk::FreeVerbvirtual
setMode(bool isFrozen)stk::FreeVerb
setRawwavePath(std::string path)stk::Stkstatic
setRoomSize(StkFloat value)stk::FreeVerb
setSampleRate(StkFloat rate)stk::Stkstatic
setWidth(StkFloat value)stk::FreeVerb
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat inputL, StkFloat inputR=0.0, unsigned int channel=0)stk::FreeVerbinline
tick(StkFrames &frames, unsigned int channel=0)stk::FreeVerb
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::FreeVerb
update(void)stk::FreeVerbprotected
~FreeVerb()stk::FreeVerb
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FreeVerb.html0000644000076600007660000014772512327015205016464 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Jezar at Dreampoint's FreeVerb, implemented in STK. More...

#include <FreeVerb.h>

Inheritance diagram for stk::FreeVerb:
stk::Effect stk::Stk

Public Member Functions

 FreeVerb ()
 FreeVerb Constructor. More...
 
 ~FreeVerb ()
 Destructor.
 
void setEffectMix (StkFloat mix)
 Set the effect mix [0 = mostly dry, 1 = mostly wet].
 
void setRoomSize (StkFloat value)
 Set the room size (comb filter feedback gain) parameter [0,1].
 
StkFloat getRoomSize (void)
 Get the room size (comb filter feedback gain) parameter.
 
void setDamping (StkFloat value)
 Set the damping parameter [0=low damping, 1=higher damping].
 
StkFloat getDamping (void)
 Get the damping parameter.
 
void setWidth (StkFloat value)
 Set the width (left-right mixing) parameter [0,1].
 
StkFloat getWidth (void)
 Get the width (left-right mixing) parameter.
 
void setMode (bool isFrozen)
 Set the mode [frozen = 1, unfrozen = 0].
 
StkFloat getMode (void)
 Get the current freeze mode [frozen = 1, unfrozen = 0].
 
void clear (void)
 Clears delay lines, etc.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed stereo frame. More...
 
StkFloat tick (StkFloat inputL, StkFloat inputR=0.0, unsigned int channel=0)
 Input one or two samples to the effect and return the specified channel value of the computed stereo frame. More...
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take two channels of the StkFrames object as inputs to the effect and replace with stereo outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take one or two channels of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Effect
 Effect (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Protected Member Functions

void update (void)
 Update interdependent parameters.
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 

Detailed Description

Jezar at Dreampoint's FreeVerb, implemented in STK.

Freeverb is a free and open-source Schroeder reverberator originally implemented in C++. The parameters of the reverberation model are exceptionally well tuned. FreeVerb uses 8 lowpass-feedback-comb-filters in parallel, followed by 4 Schroeder allpass filters in series. The input signal can be either mono or stereo, and the output signal is stereo. The delay lengths are optimized for a sample rate of 44100 Hz.

Ported to STK by Gregory Burlet, 2012.

Constructor & Destructor Documentation

stk::FreeVerb::FreeVerb ( )

FreeVerb Constructor.

Initializes the effect with default parameters. Note that these defaults are slightly different than those in the original implementation of FreeVerb [Effect Mix: 0.75; Room Size: 0.75; Damping: 0.25; Width: 1.0; Mode: freeze mode off].

Member Function Documentation

StkFloat stk::FreeVerb::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed stereo frame.

Use the lastFrame() function to get both values of the last computed stereo frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

166 {
167 #if defined(_STK_DEBUG_)
168  if ( channel > 1 ) {
169  oStream_ << "FreeVerb::lastOut(): channel argument must be less than 2!";
170  handleError( StkError::FUNCTION_ARGUMENT );
171  }
172 #endif
173 
174  return lastFrame_[channel];
175 }
StkFloat stk::FreeVerb::tick ( StkFloat  inputL,
StkFloat  inputR = 0.0,
unsigned int  channel = 0 
)
inline

Input one or two samples to the effect and return the specified channel value of the computed stereo frame.

Use the lastFrame() function to get both values of the computed stereo output frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

178 {
179 #if defined(_STK_DEBUG_)
180  if ( channel > 1 ) {
181  oStream_ << "FreeVerb::tick(): channel argument must be less than 2!";
182  handleError(StkError::FUNCTION_ARGUMENT);
183  }
184 #endif
185 
186  StkFloat fInput = (inputL + inputR) * gain_;
187  StkFloat outL = 0.0;
188  StkFloat outR = 0.0;
189 
190  // Parallel LBCF filters
191  for ( int i = 0; i < nCombs; i++ ) {
192  // Left channel
193  //StkFloat yn = fInput + (roomSize_ * FreeVerb::undenormalize(combLPL_[i].tick(FreeVerb::undenormalize(combDelayL_[i].nextOut()))));
194  StkFloat yn = fInput + (roomSize_ * combLPL_[i].tick( combDelayL_[i].nextOut() ) );
195  combDelayL_[i].tick(yn);
196  outL += yn;
197 
198  // Right channel
199  //yn = fInput + (roomSize_ * FreeVerb::undenormalize(combLPR_[i].tick(FreeVerb::undenormalize(combDelayR_[i].nextOut()))));
200  yn = fInput + (roomSize_ * combLPR_[i].tick( combDelayR_[i].nextOut() ) );
201  combDelayR_[i].tick(yn);
202  outR += yn;
203  }
204 
205  // Series allpass filters
206  for ( int i = 0; i < nAllpasses; i++ ) {
207  // Left channel
208  //StkFloat vn_m = FreeVerb::undenormalize(allPassDelayL_[i].nextOut());
209  StkFloat vn_m = allPassDelayL_[i].nextOut();
210  StkFloat vn = outL + (g_ * vn_m);
211  allPassDelayL_[i].tick(vn);
212 
213  // calculate output
214  outL = -vn + (1.0 + g_)*vn_m;
215 
216  // Right channel
217  //vn_m = FreeVerb::undenormalize(allPassDelayR_[i].nextOut());
218  vn_m = allPassDelayR_[i].nextOut();
219  vn = outR + (g_ * vn_m);
220  allPassDelayR_[i].tick(vn);
221 
222  // calculate output
223  outR = -vn + (1.0 + g_)*vn_m;
224  }
225 
226  // Mix output
227  lastFrame_[0] = outL*wet1_ + outR*wet2_ + inputL*dry_;
228  lastFrame_[1] = outR*wet1_ + outL*wet2_ + inputR*dry_;
229 
230  /*
231  // Hard limiter ... there's not much else we can do at this point
232  if ( lastFrame_[0] >= 1.0 ) {
233  lastFrame_[0] = 0.9999;
234  }
235  if ( lastFrame_[0] <= -1.0 ) {
236  lastFrame_[0] = -0.9999;
237  }
238  if ( lastFrame_[1] >= 1.0 ) {
239  lastFrame_[1] = 0.9999;
240  }
241  if ( lastFrame_[1] <= -1.0 ) {
242  lastFrame_[1] = -0.9999;
243  }
244  */
245 
246  return lastFrame_[channel];
247 }
StkFrames& stk::FreeVerb::tick ( StkFrames frames,
unsigned int  channel = 0 
)

Take two channels of the StkFrames object as inputs to the effect and replace with stereo outputs.

The StkFrames argument reference is returned. The stereo inputs are taken from (and written back to) the StkFrames argument starting at the specified channel. Therefore, the channel argument must be less than ( channels() - 1 ) of the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

StkFrames& stk::FreeVerb::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)

Take one or two channels of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object.

The iFrames object reference is returned. The iChannel argument must be less than the number of channels in the iFrames argument (the first channel is specified by 0). If more than one channel of data exists in iFrames starting from iChannel, stereo data is input to the effect. The oChannel argument must be less than ( channels() - 1 ) of the oFrames argument. However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1FreeVerb.png0000644000076600007660000000113012327015204016256 0ustar gary‰PNG  IHDRXˆTuÜ)PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2çIDATxíQ’ã DM•ïäI0Ø&qâ »›eè1‚ð[ª|“sÎ3D–¤Ï+Àÿ8•aâÛg°,É·Áe¾®]ßS»çg!uÒ/K’Ó3ð–Wa4N1Â,KÒ@'àJð€Íãg^œZ1$Ô¹ öV ŠwÝ ;F]q­xÕŠVº­x~Y’ŠßŠK’×W‚sÎy‚^Ö0C³ÀË2‰< |ãÎ!OaW8À`¯À+À¿œsÎ3D–¤Ï+ÀÿœÊØÃò)“U’öÑÇï€Íóˆy¼&•»NÊrͼ,•GŸW^5?sCËxßéßí)¸~Ý|¿y<¿gÅÜg¼ßóNñ¬ÀÞzIr:ñøP¼?ò¸ZÑJWoè The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Function Member List

This is the complete list of members for stk::Function, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
Function(void)stk::Functioninline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastOut(void) const stk::Functioninline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)=0stk::Functionpure virtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Function.html0000644000076600007660000006064012327015205016537 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Function Class Referenceabstract

STK abstract function parent class. More...

#include <Function.h>

Inheritance diagram for stk::Function:
stk::Stk stk::BowTable stk::Cubic stk::JetTable stk::ReedTable

Public Member Functions

 Function (void)
 Class constructor.
 
StkFloat lastOut (void) const
 Return the last computed output sample.
 
virtual StkFloat tick (StkFloat input)=0
 Take one sample input and compute one sample of output.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK abstract function parent class.

This class provides common functionality for STK classes that implement tables or other types of input to output function mappings.

by Perry R. Cook and Gary P. Scavone, 1995–2014.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Function.png0000644000076600007660000000247112327015205016355 0ustar gary‰PNG  IHDR’ˆúfPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÈIDATxíÝárâLFṊû¿ä`lcp{ó©f_àÐvZi$ý…¦LÓ4} p„©ªêCD &J Q­ˆhE”@+ö•œ.¯Ù÷_媪Q‡9¬äòù{-Jàí¼TòU_51OÿõÃz¹ªjM”Àa^)¹×Â%û7—¶5[®ªÚ&Jà0;J®¹_¦þ>Kv:W”Àav×fî¯Å%ðnvÆû¼qmŒ÷4.x3ƒ³d5Þ—«ªÖD f q݆û}¼/—«ª¶‰8ÌN㪪úc¢%Њ(VD ´"J Q­ˆhE”@+¦iš>øgÐ…(NœÏqˆèÄ/#q}ˆhF„@+¢Z%Њ(VD ´"J Q­ˆhE”@+¢Z%Њ(VD ´"J Q­ˆhE”@+¢Z%Њ(VD ´"J Q­ˆhE”@+¢>Ìét:} p„O¦-Jà0Q­ˆhE”@+¢Zñ˜¶_+óÅÓå¬îÅü%p˜}%ðŒ×I8Ì"m_ÕðUs+·_ï—õï’¹TÎõÞï/÷KQΪ n¯»€%¿Wg·Ï/E ü€ÇuMîb–Ì«d.jí'Jà‡<4®%ëÆ%ðAVi›7®(¿Ï“Y²9ÞoÃâÙ,‰ø1ë6Ü×nn+ß,îO›(ðÉ´E &J Q­ˆhE”@+¢Z%Њ(VœN§ÓÇ€Ÿã º%Љó9N Qøe$N Q͈hE”@+¢Z%Њ(VD ´"J Q­ˆhÅÿ­’óù|çóù|øé·˜00Fr‰#J`Œ„1’+8H”ÀQc$ Œ‘\ÁA¢ƈ#a`Œä %0F”À c$Wp(1š†™¦iç̸._ôÏïUò4â=êó½G”lí¿<Ð}ï½£l‡ÙOÙìm®äE°™’ïm¿“0ÿz¿¯ÿVr»qö·óÓï(yq`ïáŸïjÿÅfYÚ÷f eó cÁ–J~߸nŒ‹ˆË\†=¨d#âC•<ȪªÅë…’ÇýŸ)Ù9Ê3%#)[ì¶lݸ6´þãe®~ óri\T²¹ÿ=‰÷ÿ|è(Ï×Ö®­èÚ׿=?Ør¼Ï«ð‰’ï纟¤m¼?‰ø&%Ïö_´°±£< ó:eË>l{–<ΪÁþÖY²}¤ï_Ù;fÉ Óï™%OSö“Yr­ÂÛ¤ZÔím©ä²|yÎÊu¼J¶"ÞŠúváÙÞãkµÿâ@÷½÷Žòªq­RvÏÓ2sóîò*زqUU½“ýÆUUõcþµ0ÉUUÕQRU5F”TU%UU‰’ªª1¢¤ªjŒ(©ª#Jªª%UUcü=%Ó4MŸbvˆiš¦Oño…ù1¯dœÖÑšáIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Generator-members.html0000644000076600007660000002440712327015205020331 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Generator Member List

This is the complete list of members for stk::Generator, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Generatorinline
Generator(void)stk::Generatorinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Generatorinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFrames &frames, unsigned int channel=0)=0stk::Generatorpure virtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Generator.html0000644000076600007660000007265512327015205016711 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Generator Class Referenceabstract

STK abstract unit generator parent class. More...

#include <Generator.h>

Inheritance diagram for stk::Generator:
stk::Stk stk::ADSR stk::Asymp stk::Blit stk::BlitSaw stk::BlitSquare stk::Envelope stk::Granulate stk::Modulate stk::Noise stk::SineWave stk::SingWave

Public Member Functions

 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual StkFramestick (StkFrames &frames, unsigned int channel=0)=0
 Fill the StkFrames object with computed sample frames, starting at the specified channel. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK abstract unit generator parent class.

This class provides limited common functionality for STK unit generator sample-source subclasses. It is general enough to support both monophonic and polyphonic output classes.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

virtual StkFrames& stk::Generator::tick ( StkFrames frames,
unsigned int  channel = 0 
)
pure virtual

Fill the StkFrames object with computed sample frames, starting at the specified channel.

The channel argument plus the number of output channels must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implemented in stk::Granulate, stk::ADSR, stk::BlitSquare, stk::SingWave, stk::Asymp, stk::Blit, stk::SineWave, stk::Envelope, stk::BlitSaw, stk::Modulate, and stk::Noise.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Generator.png0000644000076600007660000000621112327015205016512 0ustar gary‰PNG  IHDR¾¸ýl·›PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2 IDATxíÝër«8ÑöVïÿÈcî"aùäÊvÑ6·3³‰ü%¥”ž àñ’$=‘ùÌ—¤:ó5ù¯iɶߟ“Ý’TÔ'ZŸ÷õÎoóx¯sê²rÜ-IeáüíOÒU; l·$Õq–Ìmì;zú<§Îå¡tÎ/ÏÉÔí}ðäËÙ›§ç©» žuânS·Ü-Igù¯.@#ó%©Î|€FæKRù>ŸRJÐWÀçöÙüaøhÿgóßúOö8ßo€¸ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€Øëõz=Àã=ö1 ‘ùuæ4*þ/ïòÿzõ rrRüiãŠ#œ?ÞåñVçW° æ‡ð>:_Ðò3¼þÃbïoógõ´ÌÐê:&à¶{j_?ìàïÄB]" h1äNö<\>xÎøËÎâ*– ½¤øåà9òË1T©îþ ò¥=ß žNøËàY'îzË»h{ódó¡8£xóø¯.À¥Ì¨3 ‘ùuæ4útþëõz=@_ ŸÛgó‡á£ýŸÍë?Ùÿá|¿yâ2 *ó¢2 *ó¢2 *ó¢2 *ó¢2 *ó¢2 *ó¢ºÉO)¥g¸Þ]¾$=‘ùÌ—¤:ó}ÅMËaÏø=~¶µb‡¤léŒÿš··¯ueß+)[ÂøãÍïhy9??Ô¦MËr—×›½Ýôym_팿¨sTÍ_NènìϪ#©¿x4’Šå§üa†IÒ±|ðI±ÒáÔ}IùrÆïþÍ3~ÍÈü:æWÒá½ß_’þæ42_’êÌhd¾$Õ™Ð(¥”ž àz7ù=d>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@T“ŸRJÏp½»|Iz"ó™/Iuæ4:翦å°G’®×ÿõcÿ5Òß_å¬üñè´:^Îy¯ÔßE+nfèmmbÏ+õà ão¸rïÚáB² ”´/ƒ§æŸâèá þ?†áF’T–žÃ#Ùný¿çü¼oÆþNÚGÔ9¿Ÿ±¿ ˜_Çr`»ž|–÷ò摤vÇ? ’t¨cþ•¿ÈýòÜO»û’ÔÊ|€FæKRùRJé™®w“ÐCæDe>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@TæDõ7ù)¥ôL׻˗¤'2 ‘ù’Tg>@£&ÿ5-ûæøÙvçG$åK§üb_×üñ6÷:¿‚Œÿ>0=Iª çoãcº€|¸dG$é´ø 5S~ÐØßœ9ÿ©»? Ãp#Iú²|ð<ÌøyׯþS÷Ï:qp9ö;~óHÒýÌhd¾$Õ™ÐÈ|Iª3 QJ)=ÀõnòzÈ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨þ&?¥”ž àzwù’ôDæ42_’êÌhtÊM˾9~¶ÝÓÚ¼C’¾ª#~±o]iøcøã]om~ÿ}`>¸=—åqT×Â߯Çl܇‹^Ú—é"7t_ü…ša걟/.«‹ÁSñO™ûþ'üa†IRQ>x¾àçsy97?¿‹±ÿÅÔ=៌üØÁ³ÎÇE[ŽýeÏúæÉ.Ãu~ù’Tg>@#ó%©Î|€FŸÎO)¥G¸ÞM>@™•ùQ™•ùQ™•ùQ™•ùQ™•ùQ™•ùQ™•ùQ™Õßä§”Ò3\ï._’žÈ|€FæKRù þkZöÍñ³ížÖæ’Ôª~±o]¹èÿ]þxWÇ[›_AƘngÏ[Ë#™O\þüm|lªìfçƒg;;?q;¶®ð7Ö7c9>—Y÷1üU𫻟Íbðä«7ùÃ0 7:ÌÛl€×ü|.׃§œÖQcÿ‹©{œ ËL•^ª <ë-]‰ÅØ_öložíôì…ô摤ŸÕzý›Ðè¯ò%é»Ìhd¾$Õ™Ð(¥”ž àz7ù=d>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@T“ŸRJÏp½»|Iz"ó™/Iuæ4:ð_Ó²oNI:é«ýñ%é«úâwy¼Õù¬+ï½ãêÖ¾µ¬Í(R¿ÌŸÕӲزë˜.mã—ǧ«Î·¢ø»å8ö+÷_üÄ žŠŸý.£d½¨3~>Ïʆa¸Q5ogâ·übš—?Œý³©»¬o_½ýeð¬÷w•c›!ý½y$éngÌhd¾$Õ™ÐÈ|Iª3 QJ)=ÀõnòzÈ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨þ&?¥”ž àzwù’ôDæ42_’êÌhTò_Ó’ïx$éËö£‡ózàOßú{áwy¼Õùä¶åð´:ÿlW;íß¿"ø³dZvXÆ_¥ÛjyV±ÃßuùÝ_oy1ºÊŸøÛˆ8ò3ÔY û>QÚ~Æþ¢\'îzË»(ߨ®d;kÙù摤šùÌ—¤:ó™/Iuæ4J)¥g¸ÞM>@™•ùQ™•ùQ™•ùQ™•ùQ™•ùQ™•ùQ™•ùQ™Õßä§”Ò3\ï._’žÈ|€FæKRùü×´ä›Åïqël­'þ¼±ütͯ÷W~9<6¯/g¬?ë?\ÏáϘiÙmëzž¤ù¿(×Âø $»…§üÃOüe„ù›ýKþ{ȬO%=?åÃ0ܨš·ó¿Ì/×zûÙÔÝ«ÆþúÓÕà)G{Æ/ß<ù hZ~óHÒ¿Ì|€FæKRùÌ—¤:ó¥”Ò3\ï& ‡ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆÊ|€¨ÌˆêoòSJé™®w—/IOd>@#ó%©Î|€F_ò_Ó’onßåš$ÔÚh¢{àÔ×û+¿‚iknº’ym>ûô¢Âø³zZèa]/ËéC‰ä/ÄŒuänO¦;þÌ®ùóÈÂ2–NGÏOùÃ0 7’¤ª|À|ͯæwoc?Ÿºëœî}쯃¢¸ãÙ@ïüÍ#Iÿ?ó™/Iuæ42_’êÌh”RJÏp½›|€2 *ó¢2 *ó¢2 *ó¢2 *ó¢2 *ó¢2 *ó¢2 *ó¢2 ª¿ÉO)¥g¸Þ]¾$=‘ùÌ—¤:óü×´dÛïϼ[R¶¬;«]ñ§õ3büñ6÷:¿‚ueÚ7=‡é”’Ø3ŸöÛüY=;÷ǰX¦+Ûwæ§gä·ù»³ý§¼ñ"ç ÍÆ\ wÇsq£Ç¹|àg{öã7øÃ0 7ªœ»ºåÝ-&oñ<й5öS·âêr%zð¬÷p›º‡±¿½YvçòºÊ¶üWàRæKRùÌ—¤:ó}:?¥” àz7ù=d>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@TæDe>@T“ŸRJÏp½»|Iz"ó™/Iuæ4*ø¯iɶߟy·¤lYwVºâOëgÄþøãmïu~ëÊ´ozã÷rÆÖö€ö­_çϦٹ?†Å2]ÙvÂ~½Žÿ1xnTžõnS÷0ö×32çòºÊ¶"ø’t­ï^ö÷ßû7ú¿õ·ªs~68$é»z<’t!ó™/Iuæ4J)¥gú+ôìäM£<}IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Granulate-members.html0000644000076600007660000003252312327015205020323 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Granulate Member List

This is the complete list of members for stk::Granulate, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Generatorinline
Generator(void)stk::Generatorinline
Granulate(void)stk::Granulate
Granulate(unsigned int nVoices, std::string fileName, bool typeRaw=false)stk::Granulate
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Generatorinline
lastOut(unsigned int channel=0)stk::Granulateinline
openFile(std::string fileName, bool typeRaw=false)stk::Granulate
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
reset(void)stk::Granulate
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setGrainParameters(unsigned int duration=30, unsigned int rampPercent=50, int offset=0, unsigned int delay=0)stk::Granulate
setRandomFactor(StkFloat randomness=0.1)stk::Granulate
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setStretch(unsigned int stretchFactor=1)stk::Granulate
setVoices(unsigned int nVoices=1)stk::Granulate
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Granulate
tick(StkFrames &frames, unsigned int channel=0)stk::Granulateinlinevirtual
~Granulate(void)stk::Granulate
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Granulate.html0000644000076600007660000013650212327015205016675 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Granulate Class Reference

STK granular synthesis class. More...

#include <Granulate.h>

Inheritance diagram for stk::Granulate:
stk::Generator stk::Stk

Public Member Functions

 Granulate (void)
 Default constructor.
 
 Granulate (unsigned int nVoices, std::string fileName, bool typeRaw=false)
 Constructor taking input audio file and number of voices arguments.
 
 ~Granulate (void)
 Class destructor.
 
void openFile (std::string fileName, bool typeRaw=false)
 Load a monophonic soundfile to be "granulated". More...
 
void reset (void)
 Reset the file pointer and all existing grains to the file start. More...
 
void setVoices (unsigned int nVoices=1)
 Set the number of simultaneous grain "voices" to use. More...
 
void setStretch (unsigned int stretchFactor=1)
 Set the stretch factor used for grain playback (1 - 1000). More...
 
void setGrainParameters (unsigned int duration=30, unsigned int rampPercent=50, int offset=0, unsigned int delay=0)
 Set global grain parameters used to determine individual grain settings. More...
 
void setRandomFactor (StkFloat randomness=0.1)
 This factor is used when setting individual grain parameters (0.0 - 1.0). More...
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
StkFloat tick (unsigned int channel=0)
 Compute one sample frame and return the specified channel value.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill the StkFrames object with computed sample frames, starting at the specified channel. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK granular synthesis class.

This class implements a real-time granular synthesis algorithm that operates on an input soundfile. Multi-channel files are supported. Various functions are provided to allow control over voice and grain parameters.

The functionality of this class is based on the program MacPod by Chris Rolfe and Damian Keller, though there are likely to be a number of differences in the actual implementation.

by Gary Scavone, 2005 - 2010.

Member Function Documentation

void stk::Granulate::openFile ( std::string  fileName,
bool  typeRaw = false 
)

Load a monophonic soundfile to be "granulated".

An StkError will be thrown if the file is not found, its format is unknown or unsupported, or the file has more than one channel.

void stk::Granulate::reset ( void  )

Reset the file pointer and all existing grains to the file start.

Multiple grains are offset from one another in time by grain duration / nVoices.

void stk::Granulate::setVoices ( unsigned int  nVoices = 1)

Set the number of simultaneous grain "voices" to use.

Multiple grains are offset from one another in time by grain duration / nVoices. For this reason, it is best to set the grain parameters before calling this function (during initialization).

void stk::Granulate::setStretch ( unsigned int  stretchFactor = 1)

Set the stretch factor used for grain playback (1 - 1000).

Granular synthesis allows for time-stetching without affecting the original pitch of a sound. A stretch factor of 4 will produce a resulting sound of length 4 times the orignal sound. The default parameter of 1 produces no stretching.

void stk::Granulate::setGrainParameters ( unsigned int  duration = 30,
unsigned int  rampPercent = 50,
int  offset = 0,
unsigned int  delay = 0 
)

Set global grain parameters used to determine individual grain settings.

Each grain is defined as having a length of duration milliseconds which must be greater than zero. For values of rampPercent (0 - 100) greater than zero, a linear envelope will be applied to each grain. If rampPercent = 100, the resultant grain "window" is triangular while rampPercent = 50 produces a trapezoidal window. In addition, each grain can have a time delay of length delay and a grain pointer increment of length offset, which can be negative, before the next ramp onset (in milliseconds). The offset parameter controls grain pointer jumps between enveloped grain segments, while the delay parameter causes grain calculations to pause between grains. The actual values calculated for each grain will be randomized by a factor set using the setRandomFactor() function.

void stk::Granulate::setRandomFactor ( StkFloat  randomness = 0.1)

This factor is used when setting individual grain parameters (0.0 - 1.0).

This random factor is applied when all grain state durations are calculated. If set to 0.0, no randomness occurs. When randomness = 1.0, a grain segment of length duration will be randomly augmented by up to +- duration seconds (i.e., a 30 millisecond length will be augmented by an extra length of up to +30 or -30 milliseconds).

StkFloat stk::Granulate::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed frame.

The channel argument must be less than the number of output channels, which can be determined with the channelsOut() function (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

See Also
lastFrame()
175 {
176 #if defined(_STK_DEBUG_)
177  if ( channel >= lastFrame_.channels() ) {
178  oStream_ << "Granulate::lastOut(): channel argument is invalid!";
179  handleError( StkError::FUNCTION_ARGUMENT );
180  }
181 #endif
182 
183  return lastFrame_[channel];
184 }
StkFrames & stk::Granulate::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill the StkFrames object with computed sample frames, starting at the specified channel.

The channel argument plus the number of output channels must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

187 {
188  unsigned int nChannels = lastFrame_.channels();
189 #if defined(_STK_DEBUG_)
190  if ( channel > frames.channels() - nChannels ) {
191  oStream_ << "Granulate::tick(): channel and StkFrames arguments are incompatible!";
192  handleError( StkError::FUNCTION_ARGUMENT );
193  }
194 #endif
195 
196  StkFloat *samples = &frames[channel];
197  unsigned int j, hop = frames.channels() - nChannels;
198  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
199  *samples++ = tick();
200  for ( j=1; j<nChannels; j++ )
201  *samples++ = lastFrame_[j];
202  }
203 
204  return frames;
205 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Granulate.png0000644000076600007660000000120412327015205016503 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxía“¤ DM•ÿÿ'Ÿ"`â°êí{5µ™ê^1Â#&¬ŸÉ9ç9&KÒ Z’ÕÿE§"s¿þaIrþ{tï±wÐ[z[ŽSç°$y_¢{n…ÒH¥&,I#ß¡+Ã#z­/+r_!£¾Ìh_Aß)ˆÕè„|·µ ­‰½>,I#Ç7D’U %Y},:眧เ9ž‡^–iìyè•<‹=ý¡'$ЀS «@V¬ X° 4`õÐ9ç<ÇdIšá@K²ú9t*²õ'IwLºA—›'ìKô–Ý–¢¥ öä×§ûfõR&·….jÑ;±h‡¼ìQ÷pñ1>EÏèc¹#z€ƒ¸2ž£¾ #t ºjs[qîо g´¯‹/Ó]ÖI²r¹*Èt-HkbÛ ž™~BLýÝ wBâ"I/´$«Eçœó<÷0ÇóÐË2=½’g±'¢?ô„p 4`hÀ*ЀU «@V¬~:¥”æ˜0ì~½Þ[«¾òñô4ï]n.ÙOÐ[võ41?qƒu¸_z&%~ü9£÷YEÇ"ƒn”>ô³Üè}¬´Y·T]ÅüåÝßòŒ6 öž¾¢{|ÿ´Ñd„0£ËZŸØ¶i'Ò³ZWBkbÛ }ÁÌMߥϪñ¯NÀ?u «@VsÑ)¥4ŘÞ&vüEIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Guitar-members.html0000644000076600007660000003136712327015205017641 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Guitar Member List

This is the complete list of members for stk::Guitar, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
clear(void)stk::Guitar
controlChange(int number, StkFloat value, int string=-1)stk::Guitar
Guitar(unsigned int nStrings=6, std::string bodyfile="")stk::Guitar
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastOut(void)stk::Guitarinline
noteOff(StkFloat amplitude, unsigned int string=0)stk::Guitar
noteOn(StkFloat frequency, StkFloat amplitude, unsigned int string=0)stk::Guitar
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setBodyFile(std::string bodyfile="")stk::Guitar
setFrequency(StkFloat frequency, unsigned int string=0)stk::Guitar
setLoopGain(StkFloat gain, int string=-1)stk::Guitar
setPluckPosition(StkFloat position, int string=-1)stk::Guitar
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input=0.0)stk::Guitarinline
tick(StkFrames &frames, unsigned int channel=0)stk::Guitarinline
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::Guitarinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Guitar.html0000644000076600007660000013250512327015205016205 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Guitar Class Reference

STK guitar model class. More...

#include <Guitar.h>

Inheritance diagram for stk::Guitar:
stk::Stk

Public Member Functions

 Guitar (unsigned int nStrings=6, std::string bodyfile="")
 Class constructor, specifying an arbitrary number of strings (default = 6).
 
void clear (void)
 Reset and clear all internal state.
 
void setBodyFile (std::string bodyfile="")
 Set the string excitation, using either a soundfile or computed noise. More...
 
void setPluckPosition (StkFloat position, int string=-1)
 Set the pluck position for one or all strings. More...
 
void setLoopGain (StkFloat gain, int string=-1)
 Set the loop gain for one or all strings. More...
 
void setFrequency (StkFloat frequency, unsigned int string=0)
 Set instrument parameters for a particular frequency.
 
void noteOn (StkFloat frequency, StkFloat amplitude, unsigned int string=0)
 Start a note with the given frequency and amplitude. More...
 
void noteOff (StkFloat amplitude, unsigned int string=0)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value, int string=-1)
 Perform the control change specified by number and value (0.0 - 128.0). More...
 
StkFloat lastOut (void)
 Return the last computed output value.
 
StkFloat tick (StkFloat input=0.0)
 Take an optional input sample and compute one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the iFrames object as inputs to the class and write outputs to the oFrames object. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the effect and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK guitar model class.

This class implements a guitar model with an arbitrary number of strings (specified during instantiation). Each string is represented by an stk::Twang object. The model supports commuted synthesis, as discussed by Smith and Karjalainen. It also includes a basic body coupling model and supports feedback.

This class does not attempt voice management. Rather, most functions support a parameter to specify a particular string number and string (voice) management is assumed to occur externally. Note that this class does not inherit from stk::Instrmnt because of API inconsistencies.

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others.

Control Change Numbers:

  • Bridge Coupling Gain = 2
  • Pluck Position = 4
  • Loop Gain = 11
  • Coupling Filter Pole = 1
  • Pick Filter Pole = 128

by Gary P. Scavone, 2012.

Member Function Documentation

void stk::Guitar::setBodyFile ( std::string  bodyfile = "")

Set the string excitation, using either a soundfile or computed noise.

If no argument is provided, the std::string is empty, or an error occurs reading the file data, an enveloped noise signal will be generated for use as the pluck excitation.

void stk::Guitar::setPluckPosition ( StkFloat  position,
int  string = -1 
)

Set the pluck position for one or all strings.

If the string argument is < 0, the pluck position is set for all strings.

void stk::Guitar::setLoopGain ( StkFloat  gain,
int  string = -1 
)

Set the loop gain for one or all strings.

If the string argument is < 0, the loop gain is set for all strings.

void stk::Guitar::noteOn ( StkFloat  frequency,
StkFloat  amplitude,
unsigned int  string = 0 
)

Start a note with the given frequency and amplitude.

If the amplitude parameter is less than 0.2, the string will be undamped but it will not be "plucked."

void stk::Guitar::controlChange ( int  number,
StkFloat  value,
int  string = -1 
)

Perform the control change specified by number and value (0.0 - 128.0).

If the string argument is < 0, then the control change is applied to all strings (if appropriate).

StkFrames & stk::Guitar::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inline

Take a channel of the iFrames object as inputs to the class and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

163 {
164 #if defined(_STK_DEBUG_)
165  if ( channel >= frames.channels() ) {
166  oStream_ << "Guitar::tick(): channel and StkFrames arguments are incompatible!";
167  handleError( StkError::FUNCTION_ARGUMENT );
168  }
169 #endif
170 
171  StkFloat *samples = &frames[channel];
172  unsigned int hop = frames.channels();
173  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
174  *samples = tick( *samples );
175 
176  return frames;
177 }
StkFrames & stk::Guitar::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the effect and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

180 {
181 #if defined(_STK_DEBUG_)
182  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
183  oStream_ << "Guitar::tick(): channel and StkFrames arguments are incompatible!";
184  handleError( StkError::FUNCTION_ARGUMENT );
185  }
186 #endif
187 
188  StkFloat *iSamples = &iFrames[iChannel];
189  StkFloat *oSamples = &oFrames[oChannel];
190  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
191  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop )
192  *oSamples = tick( *iSamples );
193 
194  return iFrames;
195 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Guitar.png0000644000076600007660000000063212327015205016020 0ustar gary‰PNG  IHDRCPuV8tPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2)IDATxíÑŽ… DOKâÿò*Š÷ºÁ‡M¶fš@-¦„wRJi2HîîS wÝ0,Kæë7Hÿ†‘Ç{îcÛpÛUëËàœ¾c´Ýry]’HÚÝ¥¸¯mý¸š{—ã=aô^=}äE5º—¯=-^jG[Oû´»Š7çî¢`¸»he¤”Ò\|Ž`2^`,Ë<äÆŠ˜†¼Áø3÷ @ @ @ @ @ôÏff“LE0щ±Nzfnûýï'Œ<¹fÑÁØö+wÝêºAþ‘UÎV×6ƾt¯Óé‰Q³9ÚÒƒQêzÿeç3¶r®^F ݺŽv3WFïå£y93 T™v¾/Œâ¥v´’ê«l6¸¾xs€(€(¿f3³™øÊ3#a6IEND®B`‚stk-4.5.0/doc/html/classstk_1_1HevyMetl-members.html0000644000076600007660000003723312327015205020141 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::HevyMetl Member List

This is the complete list of members for stk::HevyMetl, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::FMvirtual
FM(unsigned int operators=4)stk::FM
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
HevyMetl(void)stk::HevyMetl
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::FM
keyOn(void)stk::FM
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
loadWaves(const char **filenames)stk::FM
noteOff(StkFloat amplitude)stk::FMvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::HevyMetlvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setControl1(StkFloat cVal)stk::FMinline
setControl2(StkFloat cVal)stk::FMinline
setFrequency(StkFloat frequency)stk::FMvirtual
setGain(unsigned int waveIndex, StkFloat gain)stk::FM
setModulationDepth(StkFloat mDepth)stk::FMinline
setModulationSpeed(StkFloat mSpeed)stk::FMinline
setRatio(unsigned int waveIndex, StkFloat ratio)stk::FM
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::HevyMetlinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::HevyMetlinlinevirtual
~FM(void)stk::FMvirtual
~HevyMetl(void)stk::HevyMetl
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1HevyMetl.html0000644000076600007660000013651012327015205016507 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::HevyMetl Class Reference

STK heavy metal FM synthesis instrument. More...

#include <HevyMetl.h>

Inheritance diagram for stk::HevyMetl:
stk::FM stk::Instrmnt stk::Stk

Public Member Functions

 HevyMetl (void)
 Class constructor. More...
 
 ~HevyMetl (void)
 Class destructor.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::FM
 FM (unsigned int operators=4)
 Class constructor, taking the number of wave/envelope operators to control. More...
 
virtual ~FM (void)
 Class destructor.
 
void loadWaves (const char **filenames)
 Load the rawwave filenames in waves.
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setRatio (unsigned int waveIndex, StkFloat ratio)
 Set the frequency ratio for the specified wave.
 
void setGain (unsigned int waveIndex, StkFloat gain)
 Set the gain for the specified wave.
 
void setModulationSpeed (StkFloat mSpeed)
 Set the modulation speed in Hz.
 
void setModulationDepth (StkFloat mDepth)
 Set the modulation depth.
 
void setControl1 (StkFloat cVal)
 Set the value of control1.
 
void setControl2 (StkFloat cVal)
 Set the value of control1.
 
void keyOn (void)
 Start envelopes toward "on" targets.
 
void keyOff (void)
 Start envelopes toward "off" targets.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK heavy metal FM synthesis instrument.

This class implements 3 cascade operators with feedback modulation, also referred to as algorithm 3 of the TX81Z.

Algorithm 3 is : 4--\
3-->2-- + -->1-->Out

Control Change Numbers:

  • Total Modulator Index = 2
  • Modulator Crossfade = 4
  • LFO Speed = 11
  • LFO Depth = 1
  • ADSR 2 & 4 Target = 128

The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::HevyMetl::HevyMetl ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::HevyMetl::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::FM.

98 {
99  unsigned int nChannels = lastFrame_.channels();
100 #if defined(_STK_DEBUG_)
101  if ( channel > frames.channels() - nChannels ) {
102  oStream_ << "HevyMetl::tick(): channel and StkFrames arguments are incompatible!";
103  handleError( StkError::FUNCTION_ARGUMENT );
104  }
105 #endif
106 
107  StkFloat *samples = &frames[channel];
108  unsigned int j, hop = frames.channels() - nChannels;
109  if ( nChannels == 1 ) {
110  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
111  *samples++ = tick();
112  }
113  else {
114  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
115  *samples++ = tick();
116  for ( j=1; j<nChannels; j++ )
117  *samples++ = lastFrame_[j];
118  }
119  }
120 
121  return frames;
122 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1HevyMetl.png0000644000076600007660000000132212327015205016317 0ustar gary‰PNG  IHDRWÀFu¥PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2aIDATxíÝÑ’Â ÐËÍLÿÿ“·¥ÅZ‘¸ã7ÑBäXë3DD B’ÓÓÝvC 5^i’U¼êÆë}nØÝnl»;m¤‹vš$«¼pó]Eâ`bÔ4IvòÚM@½>÷÷ªÏúÐÒ×uë>töm¸:zçahßRŽ]ËûVO“d'ý÷ÁÝ/wEDæ'ÜÍ ÒÈ]ØÈ]YØÊýºóà®»J¸ë®»P§»îþŒ+"b’œžî~Þ 1ôd‰vÜÿ6s}Òt¼Þ ¥¼MÄ¿ø®½ç¸ûÓ:= ¤ŽÅÐÕ 7qêMù®J¹ùÔsïz}xìæòËn݇“[È}7::}sÓ=víLå=ë¹ÏIÎIwÝý+"2?àn.`Fî²ØÀFîÊšÀVî×wÝPÂ]wÝ€:Ýu÷g\ƒ„äôt÷Ý£ ã£ÌéɯºÙ×/$Ùä…ïk}Òôwçbl«ó0÷¹17qjqjï;îîµ®þ2MïI–¸Ü7݇in uœÜœ$yʧ}PlÎí¨K’Ãé®»rEDæ'ÜÍ ÒÈ]ØÈ]YØÊýºóà®»J¸ë®»P§»îþŒB‰ÓÓݺë@÷ëGŸ|Ì—zYþ–›Ê×îVNç.¿±¸[%]•åÆº:¶ê"GYÝ<^ö‹ªÐq«»Ðÿ‹ï¸éë4nù°£ºÔûû¦ûкõñQ|£]õ·³oǦ嵋·úP÷¬=úÆ*÷8/çó÷óé¢1÷ùš!÷ÆÿüZ7„æç¡6Öù¦íIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Iir-members.html0000644000076600007660000003437112327015205017127 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Iir Member List

This is the complete list of members for stk::Iir, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
getGain(void) const stk::Filterinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
Iir(void)stk::Iir
Iir(std::vector< StkFloat > &bCoefficients, std::vector< StkFloat > &aCoefficients)stk::Iir
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::Iirinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setCoefficients(std::vector< StkFloat > &bCoefficients, std::vector< StkFloat > &aCoefficients, bool clearState=false)stk::Iir
setDenominator(std::vector< StkFloat > &aCoefficients, bool clearState=false)stk::Iir
setGain(StkFloat gain)stk::Filterinline
setNumerator(std::vector< StkFloat > &bCoefficients, bool clearState=false)stk::Iir
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::Iirinline
tick(StkFrames &frames, unsigned int channel=0)stk::Iirinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::Iirinline
~Iir(void)stk::Iir
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Iir.html0000644000076600007660000015242112327015205015474 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Iir Class Reference

STK general infinite impulse response filter class. More...

#include <Iir.h>

Inheritance diagram for stk::Iir:
stk::Filter stk::Stk

Public Member Functions

 Iir (void)
 Default constructor creates a zero-order pass-through "filter".
 
 Iir (std::vector< StkFloat > &bCoefficients, std::vector< StkFloat > &aCoefficients)
 Overloaded constructor which takes filter coefficients. More...
 
 ~Iir (void)
 Class destructor.
 
void setCoefficients (std::vector< StkFloat > &bCoefficients, std::vector< StkFloat > &aCoefficients, bool clearState=false)
 Set filter coefficients. More...
 
void setNumerator (std::vector< StkFloat > &bCoefficients, bool clearState=false)
 Set numerator coefficients. More...
 
void setDenominator (std::vector< StkFloat > &aCoefficients, bool clearState=false)
 Set denominator coefficients. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK general infinite impulse response filter class.

This class provides a generic digital filter structure that can be used to implement IIR filters. For filters containing only feedforward terms, the Fir class is slightly more efficient.

In particular, this class implements the standard difference equation:

a[0]*y[n] = b[0]*x[n] + ... + b[nb]*x[n-nb] - a[1]*y[n-1] - ... - a[na]*y[n-na]

If a[0] is not equal to 1, the filter coeffcients are normalized by a[0].

The gain parameter is applied at the filter input and does not affect the coefficient values. The default gain value is 1.0. This structure results in one extra multiply per computed sample, but allows easy control of the overall filter gain.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Iir::Iir ( std::vector< StkFloat > &  bCoefficients,
std::vector< StkFloat > &  aCoefficients 
)

Overloaded constructor which takes filter coefficients.

An StkError can be thrown if either of the coefficient vector sizes is zero, or if the a[0] coefficient is equal to zero.

Member Function Documentation

void stk::Iir::setCoefficients ( std::vector< StkFloat > &  bCoefficients,
std::vector< StkFloat > &  aCoefficients,
bool  clearState = false 
)

Set filter coefficients.

An StkError can be thrown if either of the coefficient vector sizes is zero, or if the a[0] coefficient is equal to zero. If a[0] is not equal to 1, the filter coeffcients are normalized by a[0]. The internal state of the filter is not cleared unless the clearState flag is true.

void stk::Iir::setNumerator ( std::vector< StkFloat > &  bCoefficients,
bool  clearState = false 
)

Set numerator coefficients.

An StkError can be thrown if coefficient vector is empty. Any previously set denominator coefficients are left unaffected. Note that the default constructor sets the single denominator coefficient a[0] to 1.0. The internal state of the filter is not cleared unless the clearState flag is true.

void stk::Iir::setDenominator ( std::vector< StkFloat > &  aCoefficients,
bool  clearState = false 
)

Set denominator coefficients.

An StkError can be thrown if the coefficient vector is empty or if the a[0] coefficient is equal to zero. Previously set numerator coefficients are unaffected unless a[0] is not equal to 1, in which case all coeffcients are normalized by a[0]. Note that the default constructor sets the single numerator coefficient b[0] to 1.0. The internal state of the filter is not cleared unless the clearState flag is true.

StkFrames & stk::Iir::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

136 {
137 #if defined(_STK_DEBUG_)
138  if ( channel >= frames.channels() ) {
139  oStream_ << "Iir::tick(): channel and StkFrames arguments are incompatible!";
140  handleError( StkError::FUNCTION_ARGUMENT );
141  }
142 #endif
143 
144  StkFloat *samples = &frames[channel];
145  size_t i;
146  unsigned int hop = frames.channels();
147  for ( unsigned int j=0; j<frames.frames(); j++, samples += hop ) {
148  outputs_[0] = 0.0;
149  inputs_[0] = gain_ * *samples;
150  for ( i=b_.size()-1; i>0; i-- ) {
151  outputs_[0] += b_[i] * inputs_[i];
152  inputs_[i] = inputs_[i-1];
153  }
154  outputs_[0] += b_[0] * inputs_[0];
155 
156  for ( i=a_.size()-1; i>0; i-- ) {
157  outputs_[0] += -a_[i] * outputs_[i];
158  outputs_[i] = outputs_[i-1];
159  }
160 
161  *samples = outputs_[0];
162  }
163 
164  lastFrame_[0] = *(samples-hop);
165  return frames;
166 }
StkFrames & stk::Iir::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

169 {
170 #if defined(_STK_DEBUG_)
171  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
172  oStream_ << "Iir::tick(): channel and StkFrames arguments are incompatible!";
173  handleError( StkError::FUNCTION_ARGUMENT );
174  }
175 #endif
176 
177  StkFloat *iSamples = &iFrames[iChannel];
178  StkFloat *oSamples = &oFrames[oChannel];
179  size_t i;
180  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
181  for ( unsigned int j=0; j<iFrames.frames(); j++, iSamples += iHop, oSamples += oHop ) {
182  outputs_[0] = 0.0;
183  inputs_[0] = gain_ * *iSamples;
184  for ( i=b_.size()-1; i>0; i-- ) {
185  outputs_[0] += b_[i] * inputs_[i];
186  inputs_[i] = inputs_[i-1];
187  }
188  outputs_[0] += b_[0] * inputs_[0];
189 
190  for ( i=a_.size()-1; i>0; i-- ) {
191  outputs_[0] += -a_[i] * outputs_[i];
192  outputs_[i] = outputs_[i-1];
193  }
194 
195  *oSamples = outputs_[0];
196  }
197 
198  lastFrame_[0] = *(oSamples-oHop);
199  return iFrames;
200 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Iir.png0000644000076600007660000000074612327015205015316 0ustar gary‰PNG  IHDR>ˆˆŒ¨PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2uIDATxíÑŽ„ Emâÿò*‚Ag¶e½Ù¾ºÈ¹ÝÇvË»7·Jk·ñŸU*/}Öñþê’äŒC½ùïN?Ÿ×Κ¿Ã/…ѻߌîóupÃÑÙÉÇ'óÏqUU·žôÑRË2ÅÏá+=ÃOâž|à>àRà.àÒWã)¥ä À«ÀZ­Y[¸l8@§¾þ1·Có„²îº{|ï̱gä'g ñB™Êq:`ãÆüÞšÿ-žÀ†Ó|\;: ‰ød\úëxJ)¹õ“ǽ!:¹ IEND®B`‚stk-4.5.0/doc/html/classstk_1_1InetWvIn-members.html0000644000076600007660000002722312327015205020105 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::InetWvIn Member List

This is the complete list of members for stk::InetWvIn, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::WvIninline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
InetWvIn(unsigned long bufferFrames=1024, unsigned int nBuffers=8)stk::InetWvIn
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
isConnected(void)stk::InetWvIn
lastFrame(void) const stk::WvIninline
lastOut(unsigned int channel=0)stk::InetWvIninline
listen(int port=2006, unsigned int nChannels=1, Stk::StkFormat format=STK_SINT16, Socket::ProtocolType protocol=Socket::PROTO_TCP)stk::InetWvIn
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::InetWvInvirtual
tick(StkFrames &frames)stk::InetWvInvirtual
~InetWvIn()stk::InetWvIn
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1InetWvIn.html0000644000076600007660000012035012327015205016450 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::InetWvIn Class Reference

STK internet streaming input class. More...

#include <InetWvIn.h>

Inheritance diagram for stk::InetWvIn:
stk::WvIn stk::Stk

Public Member Functions

 InetWvIn (unsigned long bufferFrames=1024, unsigned int nBuffers=8)
 Default constructor. More...
 
 ~InetWvIn ()
 Class destructor.
 
void listen (int port=2006, unsigned int nChannels=1, Stk::StkFormat format=STK_SINT16, Socket::ProtocolType protocol=Socket::PROTO_TCP)
 Wait for a (new) socket connection with specified protocol, port, data channels and format. More...
 
bool isConnected (void)
 Returns true is an input connection exists or input data remains in the queue. More...
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
StkFloat tick (unsigned int channel=0)
 Compute a sample frame and return the specified channel value. More...
 
StkFramestick (StkFrames &frames)
 Fill the StkFrames argument with computed frames and return the same reference. More...
 
- Public Member Functions inherited from stk::WvIn
unsigned int channelsOut (void) const
 Return the number of audio channels in the data or stream.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last computed sample frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK internet streaming input class.

This Wvin subclass reads streamed audio data over a network via a TCP or UDP socket connection. The data is assumed in big-endian, or network, byte order. Only a single socket connection is supported.

InetWvIn supports multi-channel data. It is important to distinguish the tick() method that computes a single frame (and returns only the specified sample of a multi-channel frame) from the overloaded one that takes an StkFrames object for multi-channel and/or multi-frame data.

This class implements a socket server. When using the TCP protocol, the server "listens" for a single remote connection within the InetWvIn::start() function. For the UDP protocol, no attempt is made to verify packet delivery or order. The default data type for the incoming stream is signed 16-bit integers, though any of the defined StkFormats are permissible.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::InetWvIn::InetWvIn ( unsigned long  bufferFrames = 1024,
unsigned int  nBuffers = 8 
)

Default constructor.

An StkError will be thrown if an error occurs while initializing the input thread.

Member Function Documentation

void stk::InetWvIn::listen ( int  port = 2006,
unsigned int  nChannels = 1,
Stk::StkFormat  format = STK_SINT16,
Socket::ProtocolType  protocol = Socket::PROTO_TCP 
)

Wait for a (new) socket connection with specified protocol, port, data channels and format.

For the UDP protocol, this function will create a socket instance and return. For the TCP protocol, this function will block until a connection is established. An StkError will be thrown if a socket error occurs or an invalid function argument is provided.

bool stk::InetWvIn::isConnected ( void  )

Returns true is an input connection exists or input data remains in the queue.

This method will not return false after an input connection has been closed until all buffered input data has been read out.

StkFloat stk::InetWvIn::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed frame.

For multi-channel files, use the lastFrame() function to get all values from the last computed frame. If no connection exists, the returned value is 0.0. The channel argument must be less than the number of channels in the data stream (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

141 {
142 #if defined(_STK_DEBUG_)
143  if ( channel >= data_.channels() ) {
144  oStream_ << "InetWvIn::lastOut(): channel argument and data stream are incompatible!";
145  handleError( StkError::FUNCTION_ARGUMENT );
146  }
147 #endif
148 
149  // If no connection and we've output all samples in the queue, return.
150  if ( !connected_ && bytesFilled_ == 0 && bufferCounter_ == 0 ) return 0.0;
151 
152  return lastFrame_[channel];
153 }
StkFloat stk::InetWvIn::tick ( unsigned int  channel = 0)
virtual

Compute a sample frame and return the specified channel value.

For multi-channel files, use the lastFrame() function to get all values from the computed frame. If no connection exists, the returned value is 0.0 (and a warning will be issued if STK_DEBUG is defined during compilation). The channel argument must be less than the number of channels in the data stream (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::WvIn.

StkFrames& stk::InetWvIn::tick ( StkFrames frames)
virtual

Fill the StkFrames argument with computed frames and return the same reference.

The number of channels in the StkFrames argument must equal the number of channels specified in the listen() function. However, this is only checked if STK_DEBUG is defined during compilation, in which case an incompatibility will trigger an StkError exception. If no connection exists, the function does nothing (a warning will be issued if STK_DEBUG is defined during compilation).

Implements stk::WvIn.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1InetWvIn.png0000644000076600007660000000107712327015205016274 0ustar gary‰PNG  IHDRQˆ¨`÷ãPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÎIDATxíënà FRÞÿ‘— $@j‹7iª;Ÿ•›OíÐþ'ÆM!J’!n”¤yÆÆ°G1__eIW¼eÜÇÇÚÆ­˜­¢2; ÚeIE<ÏJöä,Ø{.–%©e`L©uæùÛvÝMM¥¿o¬»îÜÌ]—Ñ»ë7o&uïå¼™zY’Züw-Ió¸Q’æY1Æh ÀK,¦˜—ÅZin\…ÆJ{㿸k7àF€yÜ0æq#ÀÞ6Ž­¼Ÿ¹Þò©Ò˜wÒÊ5=G­£š]u”Æ´_4ÑSí)m©Åc¨»÷ßWc¬ú¹ë®{5æ¬+}h PÆ ë:}PãÑuþÔÊ~ì¤ý׸`ž¯5†‚%?"¶»F]IEND®B`‚stk-4.5.0/doc/html/classstk_1_1InetWvOut-members.html0000644000076600007660000003121612327015205020303 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::InetWvOut Member List

This is the complete list of members for stk::InetWvOut, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
clipStatus(void)stk::WvOutinline
connect(int port, Socket::ProtocolType protocol=Socket::PROTO_TCP, std::string hostname="localhost", unsigned int nChannels=1, Stk::StkFormat format=STK_SINT16)stk::InetWvOut
disconnect(void)stk::InetWvOut
getFrameCount(void) const stk::WvOutinline
getTime(void) const stk::WvOutinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
InetWvOut(unsigned long packetFrames=1024)stk::InetWvOut
InetWvOut(int port, Socket::ProtocolType protocol=Socket::PROTO_TCP, std::string hostname="localhost", unsigned int nChannels=1, Stk::StkFormat format=STK_SINT16, unsigned long packetFrames=1024)stk::InetWvOut
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
resetClipStatus(void)stk::WvOutinline
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(const StkFloat sample)stk::InetWvOutvirtual
tick(const StkFrames &frames)stk::InetWvOutvirtual
WvOut(void)stk::WvOutinline
~InetWvOut()stk::InetWvOut
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1InetWvOut.html0000644000076600007660000011515112327015205016654 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::InetWvOut Class Reference

STK internet streaming output class. More...

#include <InetWvOut.h>

Inheritance diagram for stk::InetWvOut:
stk::WvOut stk::Stk

Public Member Functions

 InetWvOut (unsigned long packetFrames=1024)
 Default constructor ... the socket is not instantiated.
 
 InetWvOut (int port, Socket::ProtocolType protocol=Socket::PROTO_TCP, std::string hostname="localhost", unsigned int nChannels=1, Stk::StkFormat format=STK_SINT16, unsigned long packetFrames=1024)
 Overloaded constructor which opens a network connection during instantiation. More...
 
 ~InetWvOut ()
 Class destructor.
 
void connect (int port, Socket::ProtocolType protocol=Socket::PROTO_TCP, std::string hostname="localhost", unsigned int nChannels=1, Stk::StkFormat format=STK_SINT16)
 Connect to the specified host and port and prepare to stream nChannels of data in the given data format. More...
 
void disconnect (void)
 If a connection is open, write out remaining samples in the queue and then disconnect.
 
void tick (const StkFloat sample)
 Output a single sample to all channels in a sample frame. More...
 
void tick (const StkFrames &frames)
 Output the StkFrames data. More...
 
- Public Member Functions inherited from stk::WvOut
 WvOut (void)
 Default constructor.
 
unsigned long getFrameCount (void) const
 Return the number of sample frames output.
 
StkFloat getTime (void) const
 Return the number of seconds of data output.
 
bool clipStatus (void)
 Returns true if clipping has been detected during output since instantiation or the last reset.
 
void resetClipStatus (void)
 Reset the clipping status to false.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK internet streaming output class.

This WvOut subclass can stream data over a network via a TCP or UDP socket connection. The data is converted to big-endian byte order, if necessary, before being transmitted.

InetWvOut supports multi-channel data. It is important to distinguish the tick() method that outputs a single sample to all channels in a sample frame from the overloaded one that takes a reference to an StkFrames object for multi-channel and/or multi-frame data.

This class connects to a socket server, the port and IP address of which must be specified as constructor arguments. The default data type is signed 16-bit integers but any of the defined StkFormats are permissible.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::InetWvOut::InetWvOut ( int  port,
Socket::ProtocolType  protocol = Socket::PROTO_TCP,
std::string  hostname = "localhost",
unsigned int  nChannels = 1,
Stk::StkFormat  format = STK_SINT16,
unsigned long  packetFrames = 1024 
)

Overloaded constructor which opens a network connection during instantiation.

An StkError is thrown if a socket error occurs or an invalid argument is specified.

Member Function Documentation

void stk::InetWvOut::connect ( int  port,
Socket::ProtocolType  protocol = Socket::PROTO_TCP,
std::string  hostname = "localhost",
unsigned int  nChannels = 1,
Stk::StkFormat  format = STK_SINT16 
)

Connect to the specified host and port and prepare to stream nChannels of data in the given data format.

An StkError is thrown if a socket error occurs or an invalid argument is specified.

void stk::InetWvOut::tick ( const StkFloat  sample)
virtual

Output a single sample to all channels in a sample frame.

An StkError is thrown if an output error occurs. If a socket connection does not exist, the function does nothing (a warning will be issued if STK_DEBUG is defined during compilation).

Implements stk::WvOut.

void stk::InetWvOut::tick ( const StkFrames frames)
virtual

Output the StkFrames data.

An StkError will be thrown if an output error occurs. An StkError will also be thrown if STK_DEBUG is defined during compilation and there is an incompatability between the number of channels in the FileWvOut object and that in the StkFrames object. If a socket connection does not exist, the function does nothing (a warning will be issued if STK_DEBUG is defined during compilation).

Implements stk::WvOut.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1InetWvOut.png0000644000076600007660000000115512327015205016472 0ustar gary‰PNG  IHDR[ˆ¿Bg*PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2üIDATxíëŽë ‡)ïÿȧ’`Bo'õ®ªu—Q¸epŒµ¿É9g'È’äB¸%ÉòËîTZ7¾ý&Ó’dyß]úuî’{ p²÷´Î8-IÝ{tE³©JFºiIšòÌÝ$Ö±çûqRžçd*iŸsÅms2¹ËK9éÛ¬Nþû.[N¶›ÜïÒNKÒ”ø"I–pK’å‹Ý9çìÀë,N8º—ÅOî辩Ýäžî¯­“p „ÀnK¸,á°„ÀnËq眳dIr!Ü’dùw*­îìs·ß°EÒÑ.¸Kw?s¯Ñ¬!õúÎÝ=ú ûwÜuwi'ÛpÄì°gî¶Ù&¥þ]sWç}wwÄûn›“1ã—ÜIêÛÙ}díð¾—“-ºí­“û¨ïVS/Ô‰$}„pK’%Ü’dqv眳¯³8áè^?¹£û¦v“{º¿¶N 0nK¸,á°„ÀnK¸,ÄRJN\7€åÝ·A?>ÛÖ7úZ;¿öwéŽãÞ½žÜjrßVú5¤ÙV³îÑOl±»ëJ•™áÞ³áˆùaÇJ[°wq}åþCwuÞw×ë²îîˆÇn›“»ÛÍM¾èNз9|ÉÛ×Mr²EbΩ+m}â>ê»ÕÙP'&Ü–pXœÝ)¥äÃ?½k&²CÝFRIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Instrmnt-members.html0000644000076600007660000003067212327015205020222 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Instrmnt Member List

This is the complete list of members for stk::Instrmnt, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::Instrmntinlinevirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)=0stk::Instrmntpure virtual
noteOn(StkFloat frequency, StkFloat amplitude)=0stk::Instrmntpure virtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Instrmntinlinevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)=0stk::Instrmntpure virtual
tick(StkFrames &frames, unsigned int channel=0)=0stk::Instrmntpure virtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Instrmnt.html0000644000076600007660000013506712327015205016576 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Instrmnt Class Referenceabstract

STK instrument abstract base class. More...

#include <Instrmnt.h>

Inheritance diagram for stk::Instrmnt:
stk::Stk stk::BandedWG stk::BlowBotl stk::BlowHole stk::Bowed stk::Brass stk::Clarinet stk::Drummer stk::Flute stk::FM stk::Mandolin stk::Mesh2D stk::Modal stk::Plucked stk::Resonate stk::Sampler stk::Saxofony stk::Shakers stk::Simple stk::Sitar stk::StifKarp stk::VoicForm stk::Whistle

Public Member Functions

 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
virtual void noteOn (StkFloat frequency, StkFloat amplitude)=0
 Start a note with the given frequency and amplitude.
 
virtual void noteOff (StkFloat amplitude)=0
 Stop a note with the given amplitude (speed of decay).
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
virtual StkFloat tick (unsigned int channel=0)=0
 Compute one sample frame and return the specified channel value. More...
 
virtual StkFramestick (StkFrames &frames, unsigned int channel=0)=0
 Fill the StkFrames object with computed sample frames, starting at the specified channel. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK instrument abstract base class.

This class provides a common interface for all STK instruments.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

virtual void stk::Instrmnt::clear ( void  )
inlinevirtual

Reset and clear all internal state (for subclasses).

Not all subclasses implement a clear() function.

Reimplemented in stk::Saxofony, stk::BlowHole, stk::BandedWG, stk::VoicForm, stk::Flute, stk::Clarinet, stk::Bowed, stk::Brass, stk::Mandolin, stk::Mesh2D, stk::StifKarp, stk::BlowBotl, stk::Whistle, stk::Plucked, stk::Sitar, and stk::Modal.

29 {};
StkFloat stk::Instrmnt::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed frame.

The channel argument must be less than the number of output channels, which can be determined with the channelsOut() function (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

See Also
lastFrame()
89 {
90 #if defined(_STK_DEBUG_)
91  if ( channel >= lastFrame_.channels() ) {
92  oStream_ << "Instrmnt::lastOut(): channel argument is invalid!";
93  handleError( StkError::FUNCTION_ARGUMENT );
94  }
95 #endif
96 
97  return lastFrame_[channel];
98 }
virtual StkFloat stk::Instrmnt::tick ( unsigned int  channel = 0)
pure virtual
virtual StkFrames& stk::Instrmnt::tick ( StkFrames frames,
unsigned int  channel = 0 
)
pure virtual

Fill the StkFrames object with computed sample frames, starting at the specified channel.

The channel argument plus the number of output channels must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implemented in stk::BlowHole, stk::VoicForm, stk::Saxofony, stk::FM, stk::BandedWG, stk::Flute, stk::Shakers, stk::Mandolin, stk::Mesh2D, stk::StifKarp, stk::Bowed, stk::Brass, stk::Clarinet, stk::Modal, stk::BlowBotl, stk::Whistle, stk::Resonate, stk::Simple, stk::FMVoices, stk::Plucked, stk::Rhodey, stk::Wurley, stk::BeeThree, stk::Moog, stk::Sitar, stk::TubeBell, stk::Drummer, stk::PercFlut, stk::HevyMetl, and stk::Sampler.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Instrmnt.png0000644000076600007660000001345312327015205016410 0ustar gary‰PNG  IHDRÊ 6\8ÙPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ºIDATxíÛnã:ËM@ÿÿÉǺS—dE':î­²ERÁN‰3ô+¥”r'ÿE’î#*ÍDE’®€f®¨<†¨ÆÏëdZ’ö˜« ÷ãÜ_Ré_¿uÚÓÍ~Z’ø¨,ï~ÈzÎ|(¯jZ’¾ÀJeÊy›òÒ+ÿª0³;ÍyÚ¬?¤²-°“¶ÿKVÇÙ öWÚ~*°¹é—¶ßNKÒä× ™¨HÒ¢ÐLT$é Qhæ“TJ)åFLé>ƒÏQéºqù•§É§¸|JN0?¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈ €Q¸›Çãñ¸€ÿ‰›ÿ¯¨4€+D ™/þ¯çt½²ê« óQhæøõ¿ýBm3Ü?ór?1üžW¿#oUs›R­‡¨cÊ}ˆz¨âÝ*“Aµ´¼ûuy'z,J“ûZeYþ *Û;¨l½¬UPÇIý•©‚æ¦?f¿´ü™ŠÕ ð{D ™¨\!*ÍDà Qhæñx<îÀ”à3ø•®û—ÏQyš|ŠË©äð#*nDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨¸7^W)¥”;hâ*’tQh&*’t…¨4³Qy ±ûK’lg§?›þÎMå˜õ•úÏÞ¡Ò¿ÇþeÖ6KNã[~.N/½šœF•ÆFó *c C¬Í*óÌúP59Žª¿0PYó=ë•Mòǯá,¯aÞ±÷ØA¥*°£Ãfr§ò“^麮{]óŽélU¾ÜŽ}ŸW ÿ¾]yHuüCå¤Wvòþ›KdÎq9¥¶p<Á6?„ùµx‰¨HÒ¢ÐLT$é Qhæ“TJ)åFšx]ÀЍ¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*nDåy•RÊ4ñIº¨4IºBTš9Sy ±ûkœ–´‰yéü Uγ¬—UúwÜ¿è:©ZeØ„y‹†Çêùñ=TÆ<‡˜òÖÛe©RÙ=l¢2%UwÀÚ+›”Ç}XÚÈLeTØ«ìwE­ñë»Òu]÷’6QØ×*ã?óÛ¾ñs• ¦*SÍ}ÒcåUÃi¢þÃüÚG%*’ÔDTš‰Š$]!*Í”RÊ4ñº €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈Êó*¥”;hâ*’tQh&*’t…¨4sTy ±ûkœ–´‰qj]8yÄKådî¨ô¯¿ßƒ:óZeØŸy‹†ÇæûeãÆ»·«Œy1e6;­·ËR­²}ºvy£Ê”S•MÕ+›ŒÇ ýTF…½Ê~WôÐÇIü*]×u¯!©ŠºÀ¾Vÿ}U`f½rÚöI{L{e*°¹³·%SO¿L’~™¨4IºBTš‰Š$]!*Í”RÊ4ñº €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈Êó*¥”;hâ*’tQh&*’t…¨4ó¥ÊcˆuØ_’ô5gË–*_%ë­Ò¿þ~j›EeØœáfò7k|\’6¼YeLuˆ9ÝUeœYUª'ßÜO0Iú¢ÐLT$é Qh&*’t…¨4SJ)wÐÄë*VDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*Ï«”Rî ‰¨HÒ}D ™¨HÒ¢Ð̹Êcˆzâyó»Ç$Uq˜ðS?IÚâ¥Ò¿ý~ êÄ77ãþCe0ù_UJ)åFšx]ÀЍ¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*nDåy•RÊ4ñIº¨4IºBTš9ª<†¨‡›oIk¬“»¿òTÓ—¤:6*’´çm*}¾çGmS«ôkýÒ87>¸LޱS~—ÊœNŸQݘþ¨7È.kÕäfÂAeMv\Tªò;ûZ&vT©¶d(¦›Uº®ë^CRuQT¾rÐCkØØ&©¥ê¾LÞ½À¶^©L§Û::9Á\T$éw‰ @3Q‘¤+D ™¨HÒ¢ÐL)¥Ü @¯«X7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨<¯RJ¹€&~ "I÷€f¢"IWˆ @3§*!êáæû0ÿè÷¤5ìTÆÁ!ÑißÇó£¶©Uúµñ~yªŒCLIV÷“Þ4¹IÒ•)½*¿S•YÀVeª¢½Êâ±SyØ/ªt]×½†$PÕ?TÜ ¬ŽµêÉÛ÷Ê|Lmº£R99Áêý˯}T¢"I-”Q)£ò4ù•Þä3T“ÿU¥”Rn ‰×U¬ˆ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFTžW)¥Ü @?P‘¤ûˆ @3Q‘¤+D ™s•Çë°¿ÆiIUüsÂOådî¨ô¯¿ßƒ:óJeÞœe›ÖAÿ§N*KÂcZkþ[•åkQÃLeJ¬Êªê•êkÚ½ž¤5Þ^`•m TFÓ_R麮{ IÚRØ¿TêüÝvå!Õq¦RíÀ¾¬ze*°ùuoê¥å‡f:ñüN0IúE¢ÐLT$é Qh&*’t…¨4SJ)wÐÄë*VDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*Ï«”Rî ‰¨HÒ}D ™¨HÒ¢ÐÌQå1Ä:ì/Iú'gOy©|•¥$m°Ré_¿µÍ¢2mÎü9LÕ£õÃ@e4bLtqš¾«Ưíh¹³PYSÜ÷Êšïv0=j¦2*ìUÖú—w^óÚô‡» {A¥ëºî5$UQضW63[•]5šõʱíO{åLÅ©Àæ¦ß¶ýù ¶.§™Ë &I¿LTš‰Š$]!*ÍDE’®€fJ)åNšx]ÀЍ¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*nDåy•RÊ4ñIº¨4IºBTš9Uy QŸ—$óÍ’Êpÿu®*ýëï÷ ¶Yo†ÍYŸ7ã×¼2.™¨ŒI1e9&º( ¦CLÚëCëƒ.*K¾ûÍÚ»V²‹Š¤M¼»ÀNT–2zHuÌwÓÁð*]×u¯!IêÛ¶ýf»rzxôÊ®íÏT޽"iï/°¹é—¶Ÿ¨a¡>'˜¤:þʯýw?(Q‰ÊU$é{ÊǨ”Qyš|ˆJoò*ƒÉÿªRJ)7ÐÄë*VDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*Ï«”Rî ‰¨HÒ}D ™¨HÒ¢ÐÌQå1D5~^’tÆ×+Ž*ÃýÿKä*ýKî÷ ¶Yo†ÕYv~tùwhæÝ*cªCL)©.JÕõ×è¶™1PYó:ëˆÅìDe;cQ`'*³ÃTOÿPÙüí *]×u¯!©ŠºÀ¶mÿ¯[nªð_ôÊ®í—\§‘½ÊT¢ÐLT$é QhæTå1D5~^ãôö!Iú7•á~¯ç¯Ò¿þ~êÌç›çìh5ïÑð5Í ãƒÞUÆü†Ø¤»jN3ÕË#‡{·Ê”讚ê´ë'6:’´åÝvZ+ëvL§ÀRlë‘ð+Öu]÷’´¡.°cÛŸXÕO^VÇ÷*›:;ä l~ãë)µmñ~e©Ä¥g¼N0IúM¢ÐLT$é Qh&*’t…¨4SJ)wÐÄë*VDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*Ï«”Rî ‰¨HÒ}D ™¨HÒ¢ÐÌ×*!ªñó§%mâdÊZe¸?OÚY¥ýýÔ6óÍ07-v¢²Ù’å¤3^P麮{ Iú‚ºÀ¶m¿+0I:Ç­WvmÿçT¦››þPRgœ$mɯ=@3Q‘¤+D ™¨HÒ¢ÐÌ'©”RÊ4ñº €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈Êó*¥”;hâ*’tQh&*’t…¨4s®ò¢?¯uúy?¬n‘¤#v*sâãÜ$uÅä½*ýëï÷ ¶™nÆéaƒV¯a»úéaIÒ&Þ©²¤9ÑZR›ÅiµÚ¡áwêÍ*SÎÛ¬ª^S_—ë‚sRYsÞgUí×¶À~Y¥ëºî5$iK]`‡¶_UôN1ì•]ÛTZf½2ØÜôkk¬ÓëÛßvn'˜$½ÈÙïLTš‰Š$]!*ÍDE’®€fJ)åNšx]ÀЍ¸7¢àFT܈ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*nDåy•RÊ4ñIº¨4IºBTš9¨<†¨‡Ëçîn¸$éœUö+’ô ïRéßqÿ¢76ýÝ0·``¹›·g|pü·q|“ʘÅSªI;ÖÙ9ãUp`|ïW™’ÜWØQeîI-ÛmygT¦=:Qù—ë‹*]×u¯!iºÀÞ¥ðç½òÅ!ö}¯øØÜôKNkoüã3R‘¤_&*ÍDE’®€f¢"IWˆ @3¥”r'M¼®`ET܈ €Qp#*nDÀ¨¸7¢àFT܈ €Qp#*nDÀ¨¸7¢ò¼J)åNšøŠ$ÝGTš‰Š$]!*Í|¥ò¢ÎLÓËêîIIUü •¯ž”TÅ›U}rÏ:ÇJÿÀ8ZŸ¾%iË{UFƒ1çõ¥/³cþÒãg›óv•)õm…ÿöbÖ*KýüSe}r¨¯³ {A¥ëºî5$iO]`ûnÙvÿ¦À$iG» Àk|Û+u‚'*©Žß)0€×ø²Àæjš…Îveóä/`¯a÷kðQ‘¤+D ™¨HÒ¢ÐÌ'©”RÊüþ\âåÝ?ãIEND®B`‚stk-4.5.0/doc/html/classstk_1_1JCRev-members.html0000644000076600007660000003021612327015205017347 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::JCRev Member List

This is the complete list of members for stk::JCRev, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Effectinline
clear(void)stk::JCRevvirtual
Effect(void)stk::Effectinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
JCRev(StkFloat T60=1.0)stk::JCRev
lastFrame(void) const stk::Effectinline
lastOut(unsigned int channel=0)stk::JCRevinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setEffectMix(StkFloat mix)stk::Effectinlinevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setT60(StkFloat T60)stk::JCRev
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input, unsigned int channel=0)stk::JCRevinline
tick(StkFrames &frames, unsigned int channel=0)stk::JCRev
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::JCRev
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1JCRev.html0000644000076600007660000014013612327015205015722 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::JCRev Class Reference

John Chowning's reverberator class. More...

#include <JCRev.h>

Inheritance diagram for stk::JCRev:
stk::Effect stk::Stk

Public Member Functions

 JCRev (StkFloat T60=1.0)
 Class constructor taking a T60 decay time argument (one second default value).
 
void clear (void)
 Reset and clear all internal state.
 
void setT60 (StkFloat T60)
 Set the reverberation T60 decay time.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed stereo frame. More...
 
StkFloat tick (StkFloat input, unsigned int channel=0)
 Input one sample to the effect and return the specified channel value of the computed stereo frame. More...
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the effect and replace with stereo outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Effect
 Effect (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual void setEffectMix (StkFloat mix)
 Set the mixture of input and "effected" levels in the output (0.0 = input only, 1.0 = effect only).
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

John Chowning's reverberator class.

This class takes a monophonic input signal and produces a stereo output signal. It is derived from the CLM JCRev function, which is based on the use of networks of simple allpass and comb delay filters. This class implements three series allpass units, followed by four parallel comb filters, and two decorrelation delay lines in parallel at the output.

Although not in the original JC reverberator, one-pole lowpass filters have been added inside the feedback comb filters.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

StkFloat stk::JCRev::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed stereo frame.

Use the lastFrame() function to get both values of the last computed stereo frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

101 {
102 #if defined(_STK_DEBUG_)
103  if ( channel > 1 ) {
104  oStream_ << "JCRev::lastOut(): channel argument must be less than 2!";
105  handleError( StkError::FUNCTION_ARGUMENT );
106  }
107 #endif
108 
109  return lastFrame_[channel];
110 }
StkFloat stk::JCRev::tick ( StkFloat  input,
unsigned int  channel = 0 
)
inline

Input one sample to the effect and return the specified channel value of the computed stereo frame.

Use the lastFrame() function to get both values of the computed stereo output frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

113 {
114 #if defined(_STK_DEBUG_)
115  if ( channel > 1 ) {
116  oStream_ << "JCRev::tick(): channel argument must be less than 2!";
117  handleError( StkError::FUNCTION_ARGUMENT );
118  }
119 #endif
120 
121  StkFloat temp, temp0, temp1, temp2, temp3, temp4, temp5, temp6;
122  StkFloat filtout;
123 
124  temp = allpassDelays_[0].lastOut();
125  temp0 = allpassCoefficient_ * temp;
126  temp0 += input;
127  allpassDelays_[0].tick(temp0);
128  temp0 = -(allpassCoefficient_ * temp0) + temp;
129 
130  temp = allpassDelays_[1].lastOut();
131  temp1 = allpassCoefficient_ * temp;
132  temp1 += temp0;
133  allpassDelays_[1].tick(temp1);
134  temp1 = -(allpassCoefficient_ * temp1) + temp;
135 
136  temp = allpassDelays_[2].lastOut();
137  temp2 = allpassCoefficient_ * temp;
138  temp2 += temp1;
139  allpassDelays_[2].tick(temp2);
140  temp2 = -(allpassCoefficient_ * temp2) + temp;
141 
142  temp3 = temp2 + ( combFilters_[0].tick( combCoefficient_[0] * combDelays_[0].lastOut() ) );
143  temp4 = temp2 + ( combFilters_[1].tick( combCoefficient_[1] * combDelays_[1].lastOut() ) );
144  temp5 = temp2 + ( combFilters_[2].tick( combCoefficient_[2] * combDelays_[2].lastOut() ) );
145  temp6 = temp2 + ( combFilters_[3].tick( combCoefficient_[3] * combDelays_[3].lastOut() ) );
146 
147  combDelays_[0].tick(temp3);
148  combDelays_[1].tick(temp4);
149  combDelays_[2].tick(temp5);
150  combDelays_[3].tick(temp6);
151 
152  filtout = temp3 + temp4 + temp5 + temp6;
153 
154  lastFrame_[0] = effectMix_ * (outLeftDelay_.tick(filtout));
155  lastFrame_[1] = effectMix_ * (outRightDelay_.tick(filtout));
156  temp = (1.0 - effectMix_) * input;
157  lastFrame_[0] += temp;
158  lastFrame_[1] += temp;
159 
160  return 0.7 * lastFrame_[channel];
161 }
StkFrames& stk::JCRev::tick ( StkFrames frames,
unsigned int  channel = 0 
)

Take a channel of the StkFrames object as inputs to the effect and replace with stereo outputs.

The StkFrames argument reference is returned. The stereo outputs are written to the StkFrames argument starting at the specified channel. Therefore, the channel argument must be less than ( channels() - 1 ) of the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

StkFrames& stk::JCRev::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)

Take a channel of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object.

The iFrames object reference is returned. The iChannel argument must be less than the number of channels in the iFrames argument (the first channel is specified by 0). The oChannel argument must be less than ( channels() - 1 ) of the oFrames argument. However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1JCRev.png0000644000076600007660000000110012327015205015525 0ustar gary‰PNG  IHDRGˆ‚ÐLPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÏIDATxíÑ®¬ E›Äÿÿäë`U`¨z#“œNº#» ›cÎ+9ç·iIuÄw*I¾‚#I¾VNÎ9¿À€ šÄY–9 Iœ34‹ós÷€ ÀWp|ÀWp|ýiNÎ9OY’^+8’äë‹“JœÓò+ƒM’Î8ç·œêÙS<ζejP6(i;WI•‡;ÎV^Âv¯€ûyΕöä-ÇV«vœË¾¾8ýyNì…Ïu_§µÍ髟sãõµ»lÀΟæ¾*â;•$_Á‘$_+'çœß àN?öyYæ€&qVÌÐ,ÎÏÝWp._Áð_Áðõ§9)¥4A$€× €¯Ž³Nzn™—±»øÒ3ÎÆ:Ÿ­NÎg#û;pÑÇŽwRÎöz [nZNõÆ€c‹Ý¹Îî“ÏÙêï8g[öúQ]™Q÷ÕÔ ûêN1ðg°w_unÜ×îòþ²uYùÒæã;¸Wp|­œ”Rz¯f|Ä ‡¾IEND®B`‚stk-4.5.0/doc/html/classstk_1_1JetTable-members.html0000644000076600007660000002520512327015205020072 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::JetTable Member List

This is the complete list of members for stk::JetTable, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
Function(void)stk::Functioninline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastOut(void) const stk::Functioninline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::JetTableinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::JetTableinline
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::JetTableinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1JetTable.html0000644000076600007660000011037212327015205016442 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::JetTable Class Reference

STK jet table class. More...

#include <JetTable.h>

Inheritance diagram for stk::JetTable:
stk::Function stk::Stk

Public Member Functions

StkFloat tick (StkFloat input)
 Take one sample input and map to one sample of output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the table and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the table and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Function
 Function (void)
 Class constructor.
 
StkFloat lastOut (void) const
 Return the last computed output sample.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK jet table class.

This class implements a flue jet non-linear function, computed by a polynomial calculation. Contrary to the name, this is not a "table".

Consult Fletcher and Rossing, Karjalainen, Cook, and others for more information.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

StkFrames & stk::JetTable::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inline

Take a channel of the StkFrames object as inputs to the table and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

68 {
69 #if defined(_STK_DEBUG_)
70  if ( channel >= frames.channels() ) {
71  oStream_ << "JetTable::tick(): channel and StkFrames arguments are incompatible!";
72  handleError( StkError::FUNCTION_ARGUMENT );
73  }
74 #endif
75 
76  StkFloat *samples = &frames[channel];
77  unsigned int hop = frames.channels();
78  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
79  *samples = *samples * (*samples * *samples - 1.0);
80  if ( *samples > 1.0) *samples = 1.0;
81  if ( *samples < -1.0) *samples = -1.0;
82  }
83 
84  lastFrame_[0] = *(samples-hop);
85  return frames;
86 }
StkFrames & stk::JetTable::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the table and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

89 {
90 #if defined(_STK_DEBUG_)
91  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
92  oStream_ << "JetTable::tick(): channel and StkFrames arguments are incompatible!";
93  handleError( StkError::FUNCTION_ARGUMENT );
94  }
95 #endif
96 
97  StkFloat *iSamples = &iFrames[iChannel];
98  StkFloat *oSamples = &oFrames[oChannel];
99  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
100  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
101  *oSamples = *oSamples * (*oSamples * *oSamples - 1.0);
102  if ( *oSamples > 1.0) *oSamples = 1.0;
103  if ( *oSamples < -1.0) *oSamples = -1.0;
104  }
105 
106  lastFrame_[0] = *(oSamples-oHop);
107  return iFrames;
108 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1JetTable.png0000644000076600007660000000114312327015205016255 0ustar gary‰PNG  IHDRRˆCWLàPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2òIDATxíÑrë DËŒÿÿ“¯ ØÄv›ÜíC§$¬k:HlúNÎ9{E–$§&R’<ú™Êóõs–tŽ÷彯>Anål5Åôö2†%…q‹ÚÚþ~„ºÚÏ£öѶu Gàx”CBÞY[_}Ûwqò%~‰ The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::LentPitShift Member List

This is the complete list of members for stk::LentPitShift, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Effectinline
clear(void)stk::LentPitShiftvirtual
Effect(void)stk::Effectinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Effectinline
LentPitShift(StkFloat periodRatio=1.0, int tMax=RT_BUFFER_SIZE)stk::LentPitShift
printErrors(bool status)stk::Stkinlinestatic
process()stk::LentPitShiftinlineprotected
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setEffectMix(StkFloat mix)stk::Effectinlinevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setShift(StkFloat shift)stk::LentPitShift
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::LentPitShiftinline
tick(StkFrames &frames, unsigned int channel=0)stk::LentPitShiftinline
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::LentPitShiftinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1LentPitShift.html0000644000076600007660000014456412327015205017337 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Pitch shifter effect class based on the Lent algorithm. More...

#include <LentPitShift.h>

Inheritance diagram for stk::LentPitShift:
stk::Effect stk::Stk

Public Member Functions

 LentPitShift (StkFloat periodRatio=1.0, int tMax=RT_BUFFER_SIZE)
 Class constructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setShift (StkFloat shift)
 Set the pitch shift factor (1.0 produces no shift).
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Effect
 Effect (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual void setEffectMix (StkFloat mix)
 Set the mixture of input and "effected" levels in the output (0.0 = input only, 1.0 = effect only).
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Protected Member Functions

void process ()
 Apply the effect on the input samples and store it. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 

Detailed Description

Pitch shifter effect class based on the Lent algorithm.

This class implements a pitch shifter using pitch tracking and sample windowing and shifting.

by Francois Germain, 2009.

Member Function Documentation

StkFrames & stk::LentPitShift::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inline

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

224 {
225 #if defined(_STK_DEBUG_)
226  if ( channel >= frames.channels() ) {
227  oStream_ << "LentPitShift::tick(): channel and StkFrames arguments are incompatible!";
228  handleError( StkError::FUNCTION_ARGUMENT );
229  }
230 #endif
231 
232  StkFloat *samples = &frames[channel];
233  unsigned int hop = frames.channels();
234  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
235  *samples = tick( *samples );
236  }
237 
238  return frames;
239 }
StkFrames & stk::LentPitShift::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

242 {
243 #if defined(_STK_DEBUG_)
244  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
245  oStream_ << "LentPitShift::tick(): channel and StkFrames arguments are incompatible!";
246  handleError( StkError::FUNCTION_ARGUMENT );
247  }
248 #endif
249 
250  StkFloat *iSamples = &iFrames[iChannel];
251  StkFloat *oSamples = &oFrames[oChannel];
252  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
253  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
254  *oSamples = tick( *iSamples );
255  }
256 
257  return iFrames;
258 }
void stk::LentPitShift::process ( )
inlineprotected

Apply the effect on the input samples and store it.

The samples stored in the input frame vector are processed and the delayed result are stored in the output frame vector.

110 {
111  StkFloat x_t; // input coefficient
112  StkFloat x_t_T; // previous input coefficient at T samples
113  StkFloat coeff; // new coefficient for the difference function
114 
115  unsigned long alternativePitch = tMax_; // Global minimum storage
116  lastPeriod_ = tMax_+1; // Storage of the lowest local minimum under the threshold
117 
118  // Loop variables
119  unsigned long delay_;
120  unsigned int n;
121 
122  // Initialization of the dt coefficients. Since the
123  // frames are of tMax_ length, there is no overlapping
124  // between the successive windows where pitch tracking
125  // is performed.
126  for ( delay_=1; delay_<=tMax_; delay_++ )
127  dt[delay_] = 0.;
128 
129  // Calculation of the dt coefficients and update of the input delay line.
130  for ( n=0; n<inputFrames.size(); n++ ) {
131  x_t = inputLine_.tick( inputFrames[ n ] );
132  for ( delay_=1; delay_<= tMax_; delay_++ ) {
133  x_t_T = inputLine_.tapOut( delay_ );
134  coeff = x_t - x_t_T;
135  dt[delay_] += coeff * coeff;
136  }
137  }
138 
139  // Calculation of the pitch tracking function and test for the minima.
140  for ( delay_=1; delay_<=tMax_; delay_++ ) {
141  cumDt[delay_] = dt[delay_] + cumDt[delay_-1];
142  dpt[delay_] = dt[delay_] * delay_ / cumDt[delay_];
143 
144  // Look for a minimum
145  if ( dpt[delay_-1]-dpt[delay_-2] < 0 && dpt[delay_]-dpt[delay_-1] > 0 ) {
146  // Check if the minimum is under the threshold
147  if ( dpt[delay_-1] < threshold_ ){
148  lastPeriod_ = delay_-1;
149  // If a minimum is found, we can stop the loop
150  break;
151  }
152  else if ( dpt[alternativePitch] > dpt[delay_-1] )
153  // Otherwise we store it if it is the current global minimum
154  alternativePitch = delay_-1;
155  }
156  }
157 
158  // Test for the last period length.
159  if ( dpt[delay_]-dpt[delay_-1] < 0 ) {
160  if ( dpt[delay_] < threshold_ )
161  lastPeriod_ = delay_;
162  else if ( dpt[alternativePitch] > dpt[delay_] )
163  alternativePitch = delay_;
164  }
165 
166  if ( lastPeriod_ == tMax_+1 )
167  // No period has been under the threshold so we used the global minimum
168  lastPeriod_ = alternativePitch;
169 
170  // We put the new zero output coefficients in the output delay line and
171  // we get the previous calculated coefficients
172  outputLine_.tick( zeroFrame, outputFrames );
173 
174  // Initialization of the Hamming window used in the algorithm
175  for ( int n=-(int)lastPeriod_; n<(int)lastPeriod_; n++ )
176  window[n+lastPeriod_] = (1 + cos(PI*n/lastPeriod_)) / 2 ;
177 
178  long M; // Index of reading in the input delay line
179  long N; // Index of writing in the output delay line
180  double sample; // Temporary storage for the new coefficient
181 
182  // We loop for all the frames of length lastPeriod_ presents between inputPtr and tMax_
183  for ( ; inputPtr<(int)(tMax_-lastPeriod_); inputPtr+=lastPeriod_ ) {
184  // Test for the decision of compression/expansion
185  while ( outputPtr < inputPtr ) {
186  // Coefficients for the linear interpolation
187  env[1] = fmod( outputPtr + tMax_, 1.0 );
188  env[0] = 1.0 - env[1];
189  M = tMax_ - inputPtr + lastPeriod_ - 1; // New reading pointer
190  N = 2*tMax_ - (unsigned long)floor(outputPtr + tMax_) + lastPeriod_ - 1; // New writing pointer
191  for ( unsigned int j=0; j<2*lastPeriod_; j++,M--,N-- ) {
192  sample = inputLine_.tapOut(M) * window[j] / 2.;
193  // Linear interpolation
194  outputLine_.addTo(env[0] * sample, N);
195  outputLine_.addTo(env[1] * sample, N-1);
196  }
197  outputPtr = outputPtr + lastPeriod_ * periodRatio_; // new output pointer
198  }
199  }
200  // Shifting of the pointers waiting for the new frame of length tMax_.
201  outputPtr -= tMax_;
202  inputPtr -= tMax_;
203 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1LentPitShift.png0000644000076600007660000000121712327015205017142 0ustar gary‰PNG  IHDR`ˆ/QåPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxííÒâ F3½ÿK^¥´|´F­›ww|ãpF %ô79çì Y’ü$™ü'‚TZ7¾}N¦%iæ’ ô×¹Ï÷­Þ÷Û«yZ’<ìû,±¶x%AÝ´$=àA4Úkð,G/¥è4R=ØÇ‚1E'EþAó])rŸ¢‚±4’tà…ŠüWjPS´•¸š¦ ·èøÃˆÿ"IzN$Éä+9çìÀ[,žx –ÅÙà-¸Å÷5¸ ¾à…À&&!0 €ILB`“_(H)%OH~„Àä§·A?>•ßß)×c½¶Eíò\´‡Ý¨½=è¶éû&êµÝßlÏÖ%Ý;5dÑ×çÛdéw‚5v*áç=ׄì[l“Ó Ú»¼L‚u¬A]4nì4Ek¼ÃÉNº†`LÑᇎYz.Hз')º ¨)ÚJ<åzÈqo¶‹uRƒéx“˜ü„ ¥”ù6(ÇåÜÆ¤IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Mandolin-members.html0000644000076600007660000003427212327015205020145 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Mandolin Member List

This is the complete list of members for stk::Mandolin, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Mandolinvirtual
controlChange(int number, StkFloat value)stk::Mandolinvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
Mandolin(StkFloat lowestFrequency)stk::Mandolin
noteOff(StkFloat amplitude)stk::Mandolinvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Mandolinvirtual
pluck(StkFloat amplitude)stk::Mandolin
pluck(StkFloat amplitude, StkFloat position)stk::Mandolin
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setBodySize(StkFloat size)stk::Mandolin
setDetune(StkFloat detune)stk::Mandolin
setFrequency(StkFloat frequency)stk::Mandolinvirtual
setPluckPosition(StkFloat position)stk::Mandolin
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Mandolininlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Mandolininlinevirtual
~Mandolin(void)stk::Mandolin
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Mandolin.html0000644000076600007660000012210412327015205016505 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Mandolin Class Reference

STK mandolin instrument model class. More...

#include <Mandolin.h>

Inheritance diagram for stk::Mandolin:
stk::Instrmnt stk::Stk

Public Member Functions

 Mandolin (StkFloat lowestFrequency)
 Class constructor, taking the lowest desired playing frequency.
 
 ~Mandolin (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setDetune (StkFloat detune)
 Detune the two strings by the given factor. A value of 1.0 produces unison strings.
 
void setBodySize (StkFloat size)
 Set the body size (a value of 1.0 produces the "default" size).
 
void setPluckPosition (StkFloat position)
 Set the pluck or "excitation" position along the string (0.0 - 1.0).
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void pluck (StkFloat amplitude)
 Pluck the strings with the given amplitude (0.0 - 1.0) using the current frequency.
 
void pluck (StkFloat amplitude, StkFloat position)
 Pluck the strings with the given amplitude (0.0 - 1.0) and position (0.0 - 1.0).
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude (0.0 - 1.0).
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK mandolin instrument model class.

This class uses two "twang" models and "commuted synthesis" techniques to model a mandolin instrument.

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Commuted Synthesis, in particular, is covered by patents, granted, pending, and/or applied-for. All are assigned to the Board of Trustees, Stanford University. For information, contact the Office of Technology Licensing, Stanford University.

Control Change Numbers:

  • Body Size = 2
  • Pluck Position = 4
  • String Sustain = 11
  • String Detuning = 1
  • Microphone Position = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

StkFrames & stk::Mandolin::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

115 {
116  unsigned int nChannels = lastFrame_.channels();
117 #if defined(_STK_DEBUG_)
118  if ( channel > frames.channels() - nChannels ) {
119  oStream_ << "Mandolin::tick(): channel and StkFrames arguments are incompatible!";
120  handleError( StkError::FUNCTION_ARGUMENT );
121  }
122 #endif
123 
124  StkFloat *samples = &frames[channel];
125  unsigned int j, hop = frames.channels() - nChannels;
126  if ( nChannels == 1 ) {
127  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
128  *samples++ = tick();
129  }
130  else {
131  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
132  *samples++ = tick();
133  for ( j=1; j<nChannels; j++ )
134  *samples++ = lastFrame_[j];
135  }
136  }
137 
138  return frames;
139 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Mandolin.png0000644000076600007660000000107012327015205016323 0ustar gary‰PNG  IHDRUˆ¡‹W™PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÇIDATxíaŽë „Çc)÷?òKˆ&¶‰ O]y×Ób>ÀXý UÕá‚’ä`õÿP%™ó׿N˜¤·›Ô4Þc©Û¡¶“y‚ Îa’•]Só‰à€¤û»0I¶zIµåõê\×%xSîr»Â3j]Îk=¬€·^ The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Mesh2D Member List

This is the complete list of members for stk::Mesh2D, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Mesh2Dvirtual
controlChange(int number, StkFloat value)stk::Mesh2Dvirtual
energy(void)stk::Mesh2D
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inputTick(StkFloat input)stk::Mesh2D
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
Mesh2D(unsigned short nX, unsigned short nY)stk::Mesh2D
noteOff(StkFloat amplitude)stk::Mesh2Dvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Mesh2Dvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setDecay(StkFloat decayFactor)stk::Mesh2D
setFrequency(StkFloat frequency)stk::Instrmntinlinevirtual
setInputPosition(StkFloat xFactor, StkFloat yFactor)stk::Mesh2D
setNX(unsigned short lenX)stk::Mesh2D
setNY(unsigned short lenY)stk::Mesh2D
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Mesh2Dvirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Mesh2Dinlinevirtual
~Mesh2D(void)stk::Mesh2D
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Mesh2D.html0000644000076600007660000012303712327015205016034 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Mesh2D Class Reference

Two-dimensional rectilinear waveguide mesh class. More...

#include <Mesh2D.h>

Inheritance diagram for stk::Mesh2D:
stk::Instrmnt stk::Stk

Public Member Functions

 Mesh2D (unsigned short nX, unsigned short nY)
 Class constructor, taking the x and y dimensions in samples.
 
 ~Mesh2D (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setNX (unsigned short lenX)
 Set the x dimension size in samples.
 
void setNY (unsigned short lenY)
 Set the y dimension size in samples.
 
void setInputPosition (StkFloat xFactor, StkFloat yFactor)
 Set the x, y input position on a 0.0 - 1.0 scale.
 
void setDecay (StkFloat decayFactor)
 Set the loss filters gains (0.0 - 1.0).
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Impulse the mesh with the given amplitude (frequency ignored).
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay) ... currently ignored.
 
StkFloat energy (void)
 Calculate and return the signal energy stored in the mesh.
 
StkFloat inputTick (StkFloat input)
 Input a sample to the mesh and compute one output sample.
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

Two-dimensional rectilinear waveguide mesh class.

This class implements a rectilinear, two-dimensional digital waveguide mesh structure. For details, see Van Duyne and Smith, "Physical Modeling with the 2-D Digital Waveguide Mesh", Proceedings of the 1993 International Computer Music Conference.

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others.

Control Change Numbers:

  • X Dimension = 2
  • Y Dimension = 4
  • Mesh Decay = 11
  • X-Y Input Position = 1

by Julius Smith, 2000 - 2002. Revised by Gary Scavone for STK, 2002.

Member Function Documentation

StkFrames & stk::Mesh2D::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

116 {
117  unsigned int nChannels = lastFrame_.channels();
118 #if defined(_STK_DEBUG_)
119  if ( channel > frames.channels() - nChannels ) {
120  oStream_ << "Mesh2D::tick(): channel and StkFrames arguments are incompatible!";
121  handleError( StkError::FUNCTION_ARGUMENT );
122  }
123 #endif
124 
125  StkFloat *samples = &frames[channel];
126  unsigned int j, hop = frames.channels() - nChannels;
127  if ( nChannels == 1 ) {
128  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
129  *samples++ = tick();
130  }
131  else {
132  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
133  *samples++ = tick();
134  for ( j=1; j<nChannels; j++ )
135  *samples++ = lastFrame_[j];
136  }
137  }
138 
139  return frames;
140 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Mesh2D.png0000644000076600007660000000113612327015205015647 0ustar gary‰PNG  IHDRPˆG¢œÝPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2íIDATxíÑnä E)ÿÿÉ›†0³Éâ}¨JËÆSõ•cô„(I~,¡$Íñ]R3ãýgþga꟱÷Âã*Ç}ìæÜéÃ’jû$,÷H{¯ý)a–¤Ž/¼³ÝXÞðSÎ_SîÌ-lSå}ʶªü®(9å«$¥(mX’:Öß²$ͱ„’4Ç.Œ1FG±xâ-Ü6g£·p÷ùÝ…? ÊK0É̱„s,!ÀK0ÇŒ‰1FOˆ’äÇJÒ7aHÍ%ÕÖoñÿ* ‡lÿ°ÎÔ?&êôH¿iÕ9›â½ð\‘7ØalˆÔììH˜=&¯r:Ý×=SŸòga™~.lS¾ [ûal¤üR˜sºJrw”‚Œ„ƒ*KÒ The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Messager Member List

This is the complete list of members for stk::Messager, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Messager()stk::Messager
popMessage(Skini::Message &message)stk::Messager
printErrors(bool status)stk::Stkinlinestatic
pushMessage(Skini::Message &message)stk::Messager
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setScoreFile(const char *filename)stk::Messager
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
startMidiInput(int port=0)stk::Messager
startSocketInput(int port=2001)stk::Messager
startStdInput()stk::Messager
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
~Messager()stk::Messager
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Messager.html0000644000076600007660000010373312327015205016521 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Messager Class Reference

STK input control message parser. More...

#include <Messager.h>

Inheritance diagram for stk::Messager:
stk::Stk

Public Member Functions

 Messager ()
 Default constructor.
 
 ~Messager ()
 Class destructor.
 
void popMessage (Skini::Message &message)
 Pop the next message from the queue and write it to the referenced message structure. More...
 
void pushMessage (Skini::Message &message)
 Push the referenced message onto the message stack.
 
bool setScoreFile (const char *filename)
 Specify a SKINI formatted scorefile from which messages should be read. More...
 
bool startStdInput ()
 Initiate the "realtime" retreival from stdin of control messages into the queue. More...
 
bool startSocketInput (int port=2001)
 Start a socket server, accept connections, and read "realtime" control messages into the message queue. More...
 
bool startMidiInput (int port=0)
 Start MIDI input, with optional device and port identifiers. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK input control message parser.

This class reads and parses control messages from a variety of sources, such as a scorefile, MIDI port, socket connection, or stdin. MIDI messages are retrieved using the RtMidi class. All other input sources (scorefile, socket, or stdin) are assumed to provide SKINI formatted messages. This class can be compiled with generic, non-realtime support, in which case only scorefile reading is possible.

The various realtime message acquisition mechanisms (from MIDI, socket, or stdin) take place asynchronously, filling the message queue. A call to popMessage() will pop the next available control message from the queue and return it via the referenced Message structure. When a non-realtime scorefile is set, it is not possible to start reading realtime input messages (from MIDI, socket, or stdin). Likewise, it is not possible to read from a scorefile when a realtime input mechanism is running.

When MIDI input is started, input is also automatically read from stdin. This allows for program termination via the terminal window. An __SK_Exit_ message is pushed onto the stack whenever an "exit" or "Exit" message is received from stdin or when all socket connections close and no stdin thread is running.

This class is primarily for use in STK example programs but it is generic enough to work in many other contexts.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::Messager::popMessage ( Skini::Message message)

Pop the next message from the queue and write it to the referenced message structure.

Invalid messages (or an empty queue) are indicated by type values of zero, in which case all other message structure values are undefined. The user MUST verify the returned message type is valid before reading other message values.

bool stk::Messager::setScoreFile ( const char *  filename)

Specify a SKINI formatted scorefile from which messages should be read.

A return value of true indicates the call was successful. A return value of false can occur if the file is not found, cannot be opened, another file is currently still open, or if a realtime input mechanism is running. Scorefile input is considered to be a non-realtime control mechanism that cannot run concurrently with realtime input.

bool stk::Messager::startStdInput ( )

Initiate the "realtime" retreival from stdin of control messages into the queue.

This function initiates a thread for asynchronous retrieval of SKINI formatted messages from stdin. A return value of true indicates the call was successful. A return value of false can occur if a scorefile is being read, a stdin thread is already running, or a thread error occurs during startup. Stdin input is considered to be a realtime control mechanism that cannot run concurrently with non-realtime scorefile input.

bool stk::Messager::startSocketInput ( int  port = 2001)

Start a socket server, accept connections, and read "realtime" control messages into the message queue.

This function creates a socket server on the optional port (default = 2001) and starts a thread for asynchronous retrieval of SKINI formatted messages from socket connections. A return value of true indicates the call was successful. A return value of false can occur if a scorefile is being read, a socket thread is already running, or an error occurs during the socket server or thread initialization stages. Socket input is considered to be a realtime control mechanism that cannot run concurrently with non-realtime scorefile input.

bool stk::Messager::startMidiInput ( int  port = 0)

Start MIDI input, with optional device and port identifiers.

This function creates an RtMidiIn instance for MIDI input. The RtMidiIn class invokes a local callback function to read incoming messages into the queue. If port = -1, RtMidiIn will open a virtual port to which other software applications can connect (OS X and Linux only). A return value of true indicates the call was successful. A return value of false can occur if a scorefile is being read, MIDI input is already running, or an error occurs during RtMidiIn construction. Midi input is considered to be a realtime control mechanism that cannot run concurrently with non-realtime scorefile input.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Messager.png0000644000076600007660000000067712327015205016344 0ustar gary‰PNG  IHDRYPEÚ)UPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2NIDATxíá’ƒ „7ËŒïÿȧ˜hÚzÖÌ];q²-Aü„%ò¥”"’ P’ÿ Yj¨|¾œn’4ú5¹¶×¾7ÈËä–jJkì»IÒêy̬B:¨z¡ºIÒÓ rCXÂðù©/Ýpm)×ÉÖ gßpC‡Ww°¹Ñ÷oì í&IOyn$™$=}(¹”R"§5@ˆÂÈÓ…#Ïà tù#k#ɶHr’ÀS’“ ž’œdðôýd‘A @Iþòœè¼·¯¼ýyMÚœ×F^oU8@š¼Ü]ý·'z@{|W`:Ì´ÛÛØEomÙX &·jé.ÙønïtÝ8’vý`n(ràì vàHÞÌa²û:ò|V;¸é¼ÏܰÎêÑjcåšÚ¸õt 7µ7ŸÍ:òý²ˆH„~°ûÔÍ îIEND®B`‚stk-4.5.0/doc/html/classstk_1_1MidiFileIn-members.html0000644000076600007660000002723112327015205020352 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::MidiFileIn Member List

This is the complete list of members for stk::MidiFileIn, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
getDivision() const stk::MidiFileIninline
getFileFormat() const stk::MidiFileIninline
getNextEvent(std::vector< unsigned char > *event, unsigned int track=0)stk::MidiFileIn
getNextMidiEvent(std::vector< unsigned char > *midiEvent, unsigned int track=0)stk::MidiFileIn
getNumberOfTracks() const stk::MidiFileIninline
getTickSeconds(unsigned int track=0)stk::MidiFileIn
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
MidiFileIn(std::string fileName)stk::MidiFileIn
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
rewindTrack(unsigned int track=0)stk::MidiFileIn
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
~MidiFileIn()stk::MidiFileIn
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1MidiFileIn.html0000644000076600007660000010702112327015205016716 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::MidiFileIn Class Reference

A standard MIDI file reading/parsing class. More...

#include <MidiFileIn.h>

Inheritance diagram for stk::MidiFileIn:
stk::Stk

Public Member Functions

 MidiFileIn (std::string fileName)
 Default constructor. More...
 
 ~MidiFileIn ()
 Class destructor.
 
int getFileFormat () const
 Return the MIDI file format (0, 1, or 2).
 
unsigned int getNumberOfTracks () const
 Return the number of tracks in the MIDI file.
 
int getDivision () const
 Return the MIDI file division value from the file header. More...
 
void rewindTrack (unsigned int track=0)
 Move the specified track event reader to the beginning of its track. More...
 
double getTickSeconds (unsigned int track=0)
 Get the current value, in seconds, of delta-time ticks for the specified track. More...
 
unsigned long getNextEvent (std::vector< unsigned char > *event, unsigned int track=0)
 Fill the user-provided vector with the next event in the specified track and return the event delta-time in ticks. More...
 
unsigned long getNextMidiEvent (std::vector< unsigned char > *midiEvent, unsigned int track=0)
 Fill the user-provided vector with the next MIDI channel event in the specified track and return the event delta time in ticks. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

A standard MIDI file reading/parsing class.

This class can be used to read events from a standard MIDI file. Event bytes are copied to a C++ vector and must be subsequently interpreted by the user. The function getNextMidiEvent() skips meta and sysex events, returning only MIDI channel messages. Event delta-times are returned in the form of "ticks" and a function is provided to determine the current "seconds per tick". Tempo changes are internally tracked by the class and reflected in the values returned by the function getTickSeconds().

by Gary P. Scavone, 2003 - 2010.

Constructor & Destructor Documentation

stk::MidiFileIn::MidiFileIn ( std::string  fileName)

Default constructor.

If an error occurs while opening or parsing the file header, an StkError exception will be thrown.

Member Function Documentation

int stk::MidiFileIn::getDivision ( ) const
inline

Return the MIDI file division value from the file header.

Note that this value must be "parsed" in accordance with the MIDI File Specification. In particular, if the MSB is set, the file uses time-code representations for delta-time values.

54 { return division_; };
void stk::MidiFileIn::rewindTrack ( unsigned int  track = 0)

Move the specified track event reader to the beginning of its track.

The relevant track tempo value is reset as well. If an invalid track number is specified, an StkError exception will be thrown.

double stk::MidiFileIn::getTickSeconds ( unsigned int  track = 0)

Get the current value, in seconds, of delta-time ticks for the specified track.

This value can change as events are read (via "Set Tempo" Meta-Events). Therefore, one should call this function after every call to getNextEvent() or getNextMidiEvent(). If an invalid track number is specified, an StkError exception will be thrown.

unsigned long stk::MidiFileIn::getNextEvent ( std::vector< unsigned char > *  event,
unsigned int  track = 0 
)

Fill the user-provided vector with the next event in the specified track and return the event delta-time in ticks.

MIDI File events consist of a delta time and a sequence of event bytes. This function returns the delta-time value and writes the subsequent event bytes directly to the event vector. The user must parse the event bytes in accordance with the MIDI File Specification. All returned MIDI channel events are complete ... a status byte is provided even when running status is used in the file. If the track has reached its end, no bytes will be written and the event vector size will be zero. If an invalid track number is specified or an error occurs while reading the file, an StkError exception will be thrown.

unsigned long stk::MidiFileIn::getNextMidiEvent ( std::vector< unsigned char > *  midiEvent,
unsigned int  track = 0 
)

Fill the user-provided vector with the next MIDI channel event in the specified track and return the event delta time in ticks.

All returned MIDI events are complete ... a status byte is provided even when running status is used in the file. Meta and sysex events in the track are skipped though "Set Tempo" events are properly parsed for use by the getTickSeconds() function. If the track has reached its end, no bytes will be written and the event vector size will be zero. If an invalid track number is specified or an error occurs while reading the file, an StkError exception will be thrown.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1MidiFileIn.png0000644000076600007660000000065412327015205016542 0ustar gary‰PNG  IHDRXPªBkPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2;IDATxíᎄ „§Câû?ò) ´^]wÍvs›«ab)ø¥L‰¿QJ)B!É÷+Á,u¨ùú8i’f¼ ®qËÝo¥mõiHŽi’4zuUÆÎ©F¨4I:ºw‚ yqi…Kè¹ ¶V8Í»o…Þ­¸×¼nÅÞºÑ<›&IGù¯H0IZ}%¸”ROk€E—%ˆ^¹1ä0ðÞŠ'Jp‚À*Á «ÿ°ˆH„ ð~%øãàu¢ç{<Ó-ê}·Ûm…à6é¯ùµÚs ®´ë7¶(ðÕÃIjõm2jàñEËØx.z`µ_{6Á}ÝœóÖ{à鈵â7Ø”k‡Vžƒíñ_[ÃÏ=VÍ›zÎãs+\Wg÷/o…k¼M N0XE‚EDôm{£MÏÐSIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Modal-members.html0000644000076600007660000003475212327015205017443 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Modal Member List

This is the complete list of members for stk::Modal, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Modalvirtual
controlChange(int number, StkFloat value)=0stk::Modalpure virtual
damp(StkFloat amplitude)stk::Modal
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
Modal(unsigned int modes=4)stk::Modal
noteOff(StkFloat amplitude)stk::Modalvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Modalvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setDirectGain(StkFloat aGain)stk::Modalinline
setFrequency(StkFloat frequency)stk::Modalvirtual
setMasterGain(StkFloat aGain)stk::Modalinline
setModeGain(unsigned int modeIndex, StkFloat gain)stk::Modal
setRatioAndRadius(unsigned int modeIndex, StkFloat ratio, StkFloat radius)stk::Modal
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
strike(StkFloat amplitude)stk::Modalvirtual
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Modalinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Modalinlinevirtual
~Modal(void)stk::Modalvirtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Modal.html0000644000076600007660000012401012327015205015776 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Modal Class Referenceabstract

STK resonance model abstract base class. More...

#include <Modal.h>

Inheritance diagram for stk::Modal:
stk::Instrmnt stk::Stk stk::ModalBar

Public Member Functions

 Modal (unsigned int modes=4)
 Class constructor, taking the desired number of modes to create. More...
 
virtual ~Modal (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setRatioAndRadius (unsigned int modeIndex, StkFloat ratio, StkFloat radius)
 Set the ratio and radius for a specified mode filter.
 
void setMasterGain (StkFloat aGain)
 Set the master gain.
 
void setDirectGain (StkFloat aGain)
 Set the direct gain.
 
void setModeGain (unsigned int modeIndex, StkFloat gain)
 Set the gain for a specified mode filter.
 
virtual void strike (StkFloat amplitude)
 Initiate a strike with the given amplitude (0.0 - 1.0).
 
void damp (StkFloat amplitude)
 Damp modes with a given decay factor (0.0 - 1.0).
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
virtual void controlChange (int number, StkFloat value)=0
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK resonance model abstract base class.

This class contains an excitation wavetable, an envelope, an oscillator, and N resonances (non-sweeping BiQuad filters), where N is set during instantiation.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Modal::Modal ( unsigned int  modes = 4)

Class constructor, taking the desired number of modes to create.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::Modal::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

126 {
127  unsigned int nChannels = lastFrame_.channels();
128 #if defined(_STK_DEBUG_)
129  if ( channel > frames.channels() - nChannels ) {
130  oStream_ << "Modal::tick(): channel and StkFrames arguments are incompatible!";
131  handleError( StkError::FUNCTION_ARGUMENT );
132  }
133 #endif
134 
135  StkFloat *samples = &frames[channel];
136  unsigned int j, hop = frames.channels() - nChannels;
137  if ( nChannels == 1 ) {
138  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
139  *samples++ = tick();
140  }
141  else {
142  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
143  *samples++ = tick();
144  for ( j=1; j<nChannels; j++ )
145  *samples++ = lastFrame_[j];
146  }
147  }
148 
149  return frames;
150 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Modal.png0000644000076600007660000000136212327015205015622 0ustar gary‰PNG  IHDRXÀ·~T(PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíÝër«0 àõj†÷äƒo 7&jµÞ_ø0‚æ7DD<!ÉÏ'àÿN¥©þú3&iÚe¸×±ûpÞZÞŸFÚÁ8L’&¯àm_ÅèN)„&ÉIÞÀM°ÀVãWµx[Š©Ðnä6lK1yx÷K¡Ûì­¸÷ðZ)ú£Ûž&ÉIâ»"`’´y$,"â8<â/‹“쯮ì?ð­8`pÀ`pÀ`ð·À""äçðÁ©4Ý%¹·±?ÿ58etý£írœ'öéÿ!¼ë™~lWcr®öqÎg·q›Ôpž«Ç{ï \½ÒÚ)ê¸]¬ šÕæp[¬¦¦p?÷$Üîw„7u€Ë¿ïÙ‡§oÿ |­ºíõ9Pkܽ©ª‚'oÅt{ñ]0Ó §”’Càtðˆ¼,N²¼º>²üÀ·"à€`HÀ€MÀ€MÀß‹ˆœÍ""r2’ü|þu8•¦»æsìååù‡$‡¼kg8ÓÂÇ p>;_\Ûn«+ZOÃ}¾½ÁuMiû)ý¸mÐöÔΫ?ì¸íÍÞ÷î7Ô/³×XM¥8›:À•J1‡íí¿_”b„©›½·+5þ¡¶ªzõñ­¨«z‡7*¾+&I›GÂ""ùéê6álÃIEND®B`‚stk-4.5.0/doc/html/classstk_1_1ModalBar-members.html0000644000076600007660000004004212327015205020055 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::ModalBar Member List

This is the complete list of members for stk::ModalBar, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Modalvirtual
controlChange(int number, StkFloat value)stk::ModalBarvirtual
damp(StkFloat amplitude)stk::Modal
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
Modal(unsigned int modes=4)stk::Modal
ModalBar(void)stk::ModalBar
noteOff(StkFloat amplitude)stk::Modalvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Modalvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setDirectGain(StkFloat aGain)stk::Modalinline
setFrequency(StkFloat frequency)stk::Modalvirtual
setMasterGain(StkFloat aGain)stk::Modalinline
setModeGain(unsigned int modeIndex, StkFloat gain)stk::Modal
setModulationDepth(StkFloat mDepth)stk::ModalBar
setPreset(int preset)stk::ModalBar
setRatioAndRadius(unsigned int modeIndex, StkFloat ratio, StkFloat radius)stk::Modal
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setStickHardness(StkFloat hardness)stk::ModalBar
setStrikePosition(StkFloat position)stk::ModalBar
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
strike(StkFloat amplitude)stk::Modalvirtual
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Modalinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Modalinlinevirtual
~Modal(void)stk::Modalvirtual
~ModalBar(void)stk::ModalBar
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1ModalBar.html0000644000076600007660000012231612327015205016432 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::ModalBar Class Reference

STK resonant bar instrument class. More...

#include <ModalBar.h>

Inheritance diagram for stk::ModalBar:
stk::Modal stk::Instrmnt stk::Stk

Public Member Functions

 ModalBar (void)
 Class constructor.
 
 ~ModalBar (void)
 Class destructor.
 
void setStickHardness (StkFloat hardness)
 Set stick hardness (0.0 - 1.0).
 
void setStrikePosition (StkFloat position)
 Set stick position (0.0 - 1.0).
 
void setPreset (int preset)
 Select a bar preset (currently modulo 9).
 
void setModulationDepth (StkFloat mDepth)
 Set the modulation (vibrato) depth.
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
- Public Member Functions inherited from stk::Modal
 Modal (unsigned int modes=4)
 Class constructor, taking the desired number of modes to create. More...
 
virtual ~Modal (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setRatioAndRadius (unsigned int modeIndex, StkFloat ratio, StkFloat radius)
 Set the ratio and radius for a specified mode filter.
 
void setMasterGain (StkFloat aGain)
 Set the master gain.
 
void setDirectGain (StkFloat aGain)
 Set the direct gain.
 
void setModeGain (unsigned int modeIndex, StkFloat gain)
 Set the gain for a specified mode filter.
 
virtual void strike (StkFloat amplitude)
 Initiate a strike with the given amplitude (0.0 - 1.0).
 
void damp (StkFloat amplitude)
 Damp modes with a given decay factor (0.0 - 1.0).
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK resonant bar instrument class.

This class implements a number of different struck bar instruments. It inherits from the Modal class.

Control Change Numbers:

  • Stick Hardness = 2
  • Stick Position = 4
  • Vibrato Gain = 1
  • Vibrato Frequency = 11
  • Direct Stick Mix = 8
  • Volume = 128
  • Modal Presets = 16
    • Marimba = 0
    • Vibraphone = 1
    • Agogo = 2
    • Wood1 = 3
    • Reso = 4
    • Wood2 = 5
    • Beats = 6
    • Two Fixed = 7
    • Clump = 8

by Perry R. Cook and Gary P. Scavone, 1995–2014.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1ModalBar.png0000644000076600007660000000135312327015205016247 0ustar gary‰PNG  IHDRXÀ·~T(PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2zIDATxíÝ뎫0 àÉXâýù@nØ!Ûªwªw3-¹ð&êoˆˆxB’ŸOÀÿœrSýõo2LÒ´Ëp>.c÷áíÖ¶ûÓH=‡IÒäÜï+ÍÉ…PÃ$9ɸ è5~U‹·¥˜ õAnö“—w¿ºÍvŽ—WKÑ^]yv˜$'‰ßŠ€IÒæ‘°ˆˆCàtðˆ¼,N²¼º>²üÀ]pÀ0$à€À&à€À&àoED<!ÉÏ'à?‚SnºKroc:þkpÚÐõCÛùx›Ø§·üŸW•Ù<þ\VÖu7‘ºU)7=û ®žZÕïkŸ.{,ß´?Ã}ú:lKq€íU.À‰ÔmRŠ›p}ÖöêŽVq3øÅ® ÉÏ$à€IÒÆqœÎñ‚—ÅIö‚W×Gvƒ¸+†0Ø0Øü-°ˆˆG $ùùü‡pÊMwÍ÷سãWàÒ©_7áíì´~h[ÃÛ\9Þ{gàâåVOQÇõbuÐôHª6‡ëbµz 7î$\Ÿw„»:Àk)ÎÂöñßÀ×J¡Û^Ÿu±ÆíÕ›ª*x²+ô³ÅoIÓ~6,"â8<â/‹“쯮ì?pW0 8`° 8`° ø[à”Rò|>ÿ:¼vt¿Û‹ï½myÞ`ó.áL /<ÀÛÙuûõu®7V7héi¸Í׳;\Öä¶ŸÒŽ+PmOÝyñ‡;n×1Ï=…‡[Q5V“C)ŽpW¸pC)æ°}ü7ð‹RŒpt³Ïv¥Æ?”ÂVU¯>ªÕxØQñ[0Ø<N)%‡üã'7Jë„2IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Modulate-members.html0000644000076600007660000003016012327015205020146 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Modulate Member List

This is the complete list of members for stk::Modulate, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Generatorinline
Generator(void)stk::Generatorinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Generatorinline
lastOut(void) const stk::Modulateinline
Modulate(void)stk::Modulate
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
reset(void)stk::Modulateinline
sampleRate(void)stk::Stkinlinestatic
setRandomGain(StkFloat gain)stk::Modulate
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setVibratoGain(StkFloat gain)stk::Modulateinline
setVibratoRate(StkFloat rate)stk::Modulateinline
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(void)stk::Modulateinline
tick(StkFrames &frames, unsigned int channel=0)stk::Modulateinlinevirtual
~Modulate(void)stk::Modulate
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Modulate.html0000644000076600007660000010502612327015205016522 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Modulate Class Reference

STK periodic/random modulator. More...

#include <Modulate.h>

Inheritance diagram for stk::Modulate:
stk::Generator stk::Stk

Public Member Functions

 Modulate (void)
 Class constructor. More...
 
 ~Modulate (void)
 Class destructor.
 
void reset (void)
 Reset internal state.
 
void setVibratoRate (StkFloat rate)
 Set the periodic (vibrato) rate or frequency in Hz.
 
void setVibratoGain (StkFloat gain)
 Set the periodic (vibrato) gain.
 
void setRandomGain (StkFloat gain)
 Set the random modulation gain.
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (void)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK periodic/random modulator.

This class combines random and periodic modulations to give a nice, natural human modulation function.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Modulate::Modulate ( void  )

Class constructor.

An StkError can be thrown if the rawwave path is incorrect.

Member Function Documentation

StkFrames & stk::Modulate::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

90 {
91 #if defined(_STK_DEBUG_)
92  if ( channel >= frames.channels() ) {
93  oStream_ << "Modulate::tick(): channel and StkFrames arguments are incompatible!";
94  handleError( StkError::FUNCTION_ARGUMENT );
95  }
96 #endif
97 
98  StkFloat *samples = &frames[channel];
99  unsigned int hop = frames.channels();
100  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
101  *samples = Modulate::tick();
102 
103  return frames;
104 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Modulate.png0000644000076600007660000000116712327015205016343 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíao¤0 D_&ÿÿ'„làÚ=÷´ªW3"ñ&ìÄígj­5ÆTIŠp¢%Yý_ti2óùsQ–$篣Ûx­½ƒ^Ž·œÑbúàX–$ï—èíl2H-S–¤+ß¡;Ã#¶¬_&rÈ%£ÿ˜7Ð>‹k|'««ùî5ö@Æ%n×èË’tåü"É*Ñ’¬>]k­!xî Æqèi cÇ¡gr;ý¡’hÀ)Ñ€U¢«DV‰¬ X%°ú èZk1U’"œhIV?‡.M¶0$é΋nÐmò„ý½œn9¢¥ïÖÃÏß®/ë¶xltU‹^‰M+äô޶y+7ïãCõˆÞ·;¢8ˆ‹ñXõ\¡{ѽ¡_îçí9¢}.>¦»SÉÊ%ò*èȸÄñ‚Þ3[‡˜üÝ ×!ù?D’NN´$«E×Zkˆž{ˆqzšÂØqè™ÅDh‡$pJ4`•hÀ*Ñ€U¢«DV‰¬~º”RbLˆp¢«ŸDÏS[c¿jŸ]ž¢×I|½ìïí¸-zùn÷ã16Ž'ôº°iß7ÆÖ(v‡]¢û¢Ó«Oçt{tÿÕGôÆý+ºýQ¯m"þmÑ~t—µOé óÇøt Úwˆm”6|Õ!ÿÒ‰¬ XÅ¢K)%Ĩb&4Ø¡ÍIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Moog-members.html0000644000076600007660000003454712327015205017312 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Moog Member List

This is the complete list of members for stk::Moog, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::Moogvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::Sampler
keyOn(void)stk::Sampler
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
Moog(void)stk::Moog
noteOff(StkFloat amplitude)stk::Samplervirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Moogvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
Sampler(void)stk::Sampler
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Moogvirtual
setModulationDepth(StkFloat mDepth)stk::Mooginline
setModulationSpeed(StkFloat mSpeed)stk::Mooginline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Mooginlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Mooginlinevirtual
~Moog(void)stk::Moog
~Sampler(void)stk::Samplervirtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Moog.html0000644000076600007660000012627212327015205015657 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Moog Class Reference

STK moog-like swept filter sampling synthesis class. More...

#include <Moog.h>

Inheritance diagram for stk::Moog:
stk::Sampler stk::Instrmnt stk::Stk

Public Member Functions

 Moog (void)
 Class constructor. More...
 
 ~Moog (void)
 Class destructor.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void setModulationSpeed (StkFloat mSpeed)
 Set the modulation (vibrato) speed in Hz.
 
void setModulationDepth (StkFloat mDepth)
 Set the modulation (vibrato) depth.
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Sampler
 Sampler (void)
 Default constructor.
 
virtual ~Sampler (void)
 Class destructor.
 
void keyOn (void)
 Initiate the envelopes with a key-on event and reset the attack waves.
 
void keyOff (void)
 Signal a key-off event to the envelopes.
 
virtual void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK moog-like swept filter sampling synthesis class.

This instrument uses one attack wave, one looped wave, and an ADSR envelope (inherited from the Sampler class) and adds two sweepable formant (FormSwep) filters.

Control Change Numbers:

  • Filter Q = 2
  • Filter Sweep Rate = 4
  • Vibrato Frequency = 11
  • Vibrato Gain = 1
  • Gain = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Moog::Moog ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::Moog::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Sampler.

97 {
98  unsigned int nChannels = lastFrame_.channels();
99 #if defined(_STK_DEBUG_)
100  if ( channel > frames.channels() - nChannels ) {
101  oStream_ << "Moog::tick(): channel and StkFrames arguments are incompatible!";
102  handleError( StkError::FUNCTION_ARGUMENT );
103  }
104 #endif
105 
106  StkFloat *samples = &frames[channel];
107  unsigned int j, hop = frames.channels() - nChannels;
108  if ( nChannels == 1 ) {
109  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
110  *samples++ = tick();
111  }
112  else {
113  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
114  *samples++ = tick();
115  for ( j=1; j<nChannels; j++ )
116  *samples++ = lastFrame_[j];
117  }
118  }
119 
120  return frames;
121 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Moog.png0000644000076600007660000000141012327015205015461 0ustar gary‰PNG  IHDROÀr ιPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2—IDATxíë’´, ›'UÞÿ%Šˆ€8«L¶jë{™M¯È¡%d13s“$7¦O’Æùè 1ŠûõÕéõÅöÞ÷Ú·mdÛM¹65ÚnIgÜøò.âÒcy̶薤†{_ZX¯Ëçw—ð§|» Ó¶ßúê|;õxo½ú¾ªGÊ÷¨F®GÝ-I óó+IãLŸ$³úÌÌüxÂàˆ³oY|…ξUç*ôöýùúNÀLÀ8Ó0ÎôŒ3}ãL@33G0Ircú$iœÖb”·’Îhï/ý¿è ›kýW*c{8‡·Žøgí£±¿ñíÒüò6He$AŒr´ãKš"©¼‹s¸yZsFM¾÷¾<üØWç{ñÕòŸ}A*£“ï;_Jè¨ÆU‘kÑó]ë+Iß3}’4Î?è33óà Ïàì[_¡³oÕ¹ ½}¾¾ÓðÓ0ÎôŒ3}ãLÀ8ÓÐÁÌÌL’ܘ>I§ñ…Åýú’¤>¡Ï¾Ø¾~ômÙvS*ÏFÜf\ûåÙ‡Jß>3FšºÏÎÞø¸éÙç¤sbåˋꬎ¢²”¾n¾_Î*He­T±«¯Î·®GµŸËþÊ“î_Sžïz~7ùÕÈõHå‹eÍ.õýæóqÿ–üú$©ÏôIÒ8«ÏÌÌ€'<þ=x€³oY|…ξUç*ôöýùúNÀLÀ8Ó0ÎôŒ3}ãL@‡Bp„àÆôŒÓ÷­}e÷Ñ~ðèg¾ý&]n¹ø¶Eém”GJß6V^šõ×ûquÕNϨ.ͦ;¾4µèÿäûa)©Ö—e¯}uŽ_û”qBWôóùE¬N¬ð½­/À;<}êð””öü¾ðà|!„àÇóe1ž$ÙÆ`IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Mutex-members.html0000644000076600007660000002470512327015205017506 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Mutex Member List

This is the complete list of members for stk::Mutex, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lock(void)stk::Mutex
Mutex()stk::Mutex
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
signal(void)stk::Mutex
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
unlock(void)stk::Mutex
wait(void)stk::Mutex
~Mutex()stk::Mutex
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Mutex.html0000644000076600007660000006517212327015205016061 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Mutex Class Reference

STK mutex class. More...

#include <Mutex.h>

Inheritance diagram for stk::Mutex:
stk::Stk

Public Member Functions

 Mutex ()
 Default constructor.
 
 ~Mutex ()
 Class destructor.
 
void lock (void)
 Lock the mutex.
 
void unlock (void)
 Unlock the mutex.
 
void wait (void)
 Wait indefinitely on the mutex condition variable. More...
 
void signal (void)
 Signal the condition variable. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK mutex class.

This class provides a uniform interface for cross-platform mutex use. On Linux and IRIX systems, the pthread library is used. Under Windows, critical sections are used.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::Mutex::wait ( void  )

Wait indefinitely on the mutex condition variable.

The mutex must be locked before calling this function, and then subsequently unlocked after this function returns.

void stk::Mutex::signal ( void  )

Signal the condition variable.

The mutex must be locked before calling this function, and then subsequently unlocked after this function returns.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Mutex.png0000644000076600007660000000062712327015205015673 0ustar gary‰PNG  IHDRCPuV8tPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2&IDATxíÑnà EFÊÿòpà’Ð$y˜6ªkŒ9àKûNŒ1ÑÌl(&ÃÌD!Iæë§“þ#sîc;p;Uë}pLb”ÓRù¾%u"i3«ê1¼¸­-~œ›é÷Ò-öë=a´½t<}Ô‹ª÷.·žz/»£ÅÓ6mfUó?gf¢É03Ñʈ1Ʊ¸Ž`0^`,Ë8äÆŠ†¼Áø5ï2€j2Ñd¢ÉD“ˆþ#„ƒ0“ˆŒu¢ó}\s½oyâ_÷Œ­Ðߺ c­‹{U®ñå}CN'årÆyt`øš\÷ŠQ Û^ÎŒFúywíý¯Gû{~ˆ§5ü†ÕÝŽ§ÞKë€0|éò]~“ˆþ#„Æâ àg)ÀÄ(IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Noise-members.html0000644000076600007660000002645012327015205017460 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Noise Member List

This is the complete list of members for stk::Noise, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Generatorinline
Generator(void)stk::Generatorinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Generatorinline
lastOut(void) const stk::Noiseinline
Noise(unsigned int seed=0)stk::Noise
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setSeed(unsigned int seed=0)stk::Noise
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(void)stk::Noiseinline
tick(StkFrames &frames, unsigned int channel=0)stk::Noiseinlinevirtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Noise.html0000644000076600007660000010322712327015205016026 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Noise Class Reference

STK noise generator. More...

#include <Noise.h>

Inheritance diagram for stk::Noise:
stk::Generator stk::Stk

Public Member Functions

 Noise (unsigned int seed=0)
 Default constructor that can also take a specific seed value. More...
 
void setSeed (unsigned int seed=0)
 Seed the random number generator with a specific seed value. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (void)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK noise generator.

Generic random number generation using the C rand() function. The quality of the rand() function varies from one OS to another.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Noise::Noise ( unsigned int  seed = 0)

Default constructor that can also take a specific seed value.

If the seed value is zero (the default value), the random number generator is seeded with the system time.

Member Function Documentation

void stk::Noise::setSeed ( unsigned int  seed = 0)

Seed the random number generator with a specific seed value.

If no seed is provided or the seed value is zero, the random number generator is seeded with the current system time.

StkFrames & stk::Noise::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

65 {
66 #if defined(_STK_DEBUG_)
67  if ( channel >= frames.channels() ) {
68  oStream_ << "Noise::tick(): channel and StkFrames arguments are incompatible!";
69  handleError( StkError::FUNCTION_ARGUMENT );
70  }
71 #endif
72 
73  StkFloat *samples = &frames[channel];
74  unsigned int hop = frames.channels();
75  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
76  *samples = (StkFloat) ( 2.0 * rand() / (RAND_MAX + 1.0) - 1.0 );
77 
78  lastFrame_[0] = *(samples-hop);
79  return frames;
80 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Noise.png0000644000076600007660000000115612327015205015644 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ýIDATxíÑŽê0 DO&Rÿÿ“oIÒb—@áVÞZ£mpÛwœå™Zk1U’"œhIV¿‹.Mæûú™”%Éùst[÷Úô­½[3Dz$y¿Dï½5ÊFjq˜²$Í|† س~™Èy SÆx™ hÈdŒW±šÿãdâ>F_–¤™ó7D’U¢%Y}-ºÖZC ð¾€Ç¡—%Œ‡^ÉQì@ô—žDN‰¬ X%°J4`•hÀ*Ñ€Õ_@×ZkŒ©’áDK²ú9ti²…õ#IgžÜt‚n_Þa¿Dߺ»µhé÷zóëÕ¾ÙøÓnÞtU‹îĦyØ£=¼—›ïëCõˆ¾?îˆà .ÆcÕ2C¢Ûa w ç í9¢}.>¦³®‹dåyÈèÈ6Ämƒqföbòww¸’¿!’ôàDK²úZt­µ†à}/1ŽC/K;½’£Øè/=!‰œ X%°J4`•hÀ*Ñ€U¢«¿€.¥”S"œhÀêwÐë{­¯ï•Ó–>@·/¼ã}ÃŒƒ¹_îw6·]újüg=EwbÓ€Öœæý=AÇÍÅ#j£ÐùˆîwÛæG>ÓDžÑ†ðý0ëO²¶cÜæ{%ëíE]§&Ø 'ຠX%°ŠE—RJˆÿþ%Ù‘tSSIEND®B`‚stk-4.5.0/doc/html/classstk_1_1NRev-members.html0000644000076600007660000003016312327015205017251 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::NRev Member List

This is the complete list of members for stk::NRev, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Effectinline
clear(void)stk::NRevvirtual
Effect(void)stk::Effectinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Effectinline
lastOut(unsigned int channel=0)stk::NRevinline
NRev(StkFloat T60=1.0)stk::NRev
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setEffectMix(StkFloat mix)stk::Effectinlinevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setT60(StkFloat T60)stk::NRev
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input, unsigned int channel=0)stk::NRevinline
tick(StkFrames &frames, unsigned int channel=0)stk::NRev
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::NRev
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1NRev.html0000644000076600007660000013545012327015205015626 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::NRev Class Reference

CCRMA's NRev reverberator class. More...

#include <NRev.h>

Inheritance diagram for stk::NRev:
stk::Effect stk::Stk

Public Member Functions

 NRev (StkFloat T60=1.0)
 Class constructor taking a T60 decay time argument (one second default value).
 
void clear (void)
 Reset and clear all internal state.
 
void setT60 (StkFloat T60)
 Set the reverberation T60 decay time.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed stereo frame. More...
 
StkFloat tick (StkFloat input, unsigned int channel=0)
 Input one sample to the effect and return the specified channel value of the computed stereo frame. More...
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the effect and replace with stereo outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Effect
 Effect (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual void setEffectMix (StkFloat mix)
 Set the mixture of input and "effected" levels in the output (0.0 = input only, 1.0 = effect only).
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

CCRMA's NRev reverberator class.

This class takes a monophonic input signal and produces a stereo output signal. It is derived from the CLM NRev function, which is based on the use of networks of simple allpass and comb delay filters. This particular arrangement consists of 6 comb filters in parallel, followed by 3 allpass filters, a lowpass filter, and another allpass in series, followed by two allpass filters in parallel with corresponding right and left outputs.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

StkFloat stk::NRev::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed stereo frame.

Use the lastFrame() function to get both values of the last computed stereo frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

93 {
94 #if defined(_STK_DEBUG_)
95  if ( channel > 1 ) {
96  oStream_ << "NRev::lastOut(): channel argument must be less than 2!";
97  handleError( StkError::FUNCTION_ARGUMENT );
98  }
99 #endif
100 
101  return lastFrame_[channel];
102 }
StkFloat stk::NRev::tick ( StkFloat  input,
unsigned int  channel = 0 
)
inline

Input one sample to the effect and return the specified channel value of the computed stereo frame.

Use the lastFrame() function to get both values of the computed stereo output frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

105 {
106 #if defined(_STK_DEBUG_)
107  if ( channel > 1 ) {
108  oStream_ << "NRev::tick(): channel argument must be less than 2!";
109  handleError( StkError::FUNCTION_ARGUMENT );
110  }
111 #endif
112 
113  StkFloat temp, temp0, temp1, temp2, temp3;
114  int i;
115 
116  temp0 = 0.0;
117  for ( i=0; i<6; i++ ) {
118  temp = input + (combCoefficient_[i] * combDelays_[i].lastOut());
119  temp0 += combDelays_[i].tick(temp);
120  }
121 
122  for ( i=0; i<3; i++ ) {
123  temp = allpassDelays_[i].lastOut();
124  temp1 = allpassCoefficient_ * temp;
125  temp1 += temp0;
126  allpassDelays_[i].tick(temp1);
127  temp0 = -(allpassCoefficient_ * temp1) + temp;
128  }
129 
130  // One-pole lowpass filter.
131  lowpassState_ = 0.7 * lowpassState_ + 0.3 * temp0;
132  temp = allpassDelays_[3].lastOut();
133  temp1 = allpassCoefficient_ * temp;
134  temp1 += lowpassState_;
135  allpassDelays_[3].tick( temp1 );
136  temp1 = -( allpassCoefficient_ * temp1 ) + temp;
137 
138  temp = allpassDelays_[4].lastOut();
139  temp2 = allpassCoefficient_ * temp;
140  temp2 += temp1;
141  allpassDelays_[4].tick( temp2 );
142  lastFrame_[0] = effectMix_*( -( allpassCoefficient_ * temp2 ) + temp );
143 
144  temp = allpassDelays_[5].lastOut();
145  temp3 = allpassCoefficient_ * temp;
146  temp3 += temp1;
147  allpassDelays_[5].tick( temp3 );
148  lastFrame_[1] = effectMix_*( - ( allpassCoefficient_ * temp3 ) + temp );
149 
150  temp = ( 1.0 - effectMix_ ) * input;
151  lastFrame_[0] += temp;
152  lastFrame_[1] += temp;
153 
154  return lastFrame_[channel];
155 }
StkFrames& stk::NRev::tick ( StkFrames frames,
unsigned int  channel = 0 
)

Take a channel of the StkFrames object as inputs to the effect and replace with stereo outputs.

The StkFrames argument reference is returned. The stereo outputs are written to the StkFrames argument starting at the specified channel. Therefore, the channel argument must be less than ( channels() - 1 ) of the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

StkFrames& stk::NRev::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)

Take a channel of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object.

The iFrames object reference is returned. The iChannel argument must be less than the number of channels in the iFrames argument (the first channel is specified by 0). The oChannel argument must be less than ( channels() - 1 ) of the oFrames argument. However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1NRev.png0000644000076600007660000000102412327015205015433 0ustar gary‰PNG  IHDRBˆdùÍPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2£IDATxíÝŽë0„òþ|Œcü×t—½¨N‰Å&ø³«ê-DDb‚03G”ˆGi¸ùù,Ò?@è¸äÞA\Û]{úrŒé âÞK«ë mÃ¥ŸVÛ—Þ^L¬YÖÚáÞ@ô,ì|§«y²Ó©fÞvöéü™13ÏJD‡ ^뀘âˆã3∓eüâCn$‰€I‰HŒJÄW"DDb‚03G”ˆ-‚4ÚT1s ›? Ü{,e#ê(6дFSú²qC”•¶§cÕS´/î«GØwâêűkdBŒ§hĵ¾‘ ¢·hnÄDZ÷©fk𢻑ÚrþÌÁÌ<êDˆˆ„¯õˆÇfÄ'!ÊøćÜH"“‘•ˆ¯DÅ€ˆ±Gœ3Ÿ(ã+©ÖÀ¤'„NjrÍpˆ«Ün¹åtèå0U=¢Ôi´eÂM—ˆÚöØ—óâ%¢,¥ä^~£†f‡=[ªCx—–|¸îÔçÞ ;S#Õ@Ïšodƒ€ß(ÿ'‚ˆ(¤šuyÃîÝ*IEND®B`‚stk-4.5.0/doc/html/classstk_1_1OnePole-members.html0000644000076600007660000003427512327015205017750 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::OnePole Member List

This is the complete list of members for stk::OnePole, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
getGain(void) const stk::Filterinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::OnePoleinline
OnePole(StkFloat thePole=0.9)stk::OnePole
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setA1(StkFloat a1)stk::OnePoleinline
setB0(StkFloat b0)stk::OnePoleinline
setCoefficients(StkFloat b0, StkFloat a1, bool clearState=false)stk::OnePole
setGain(StkFloat gain)stk::Filterinline
setPole(StkFloat thePole)stk::OnePole
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::OnePoleinline
tick(StkFrames &frames, unsigned int channel=0)stk::OnePoleinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::OnePoleinline
~OnePole()stk::OnePole
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1OnePole.html0000644000076600007660000013331412327015205016312 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::OnePole Class Reference

STK one-pole filter class. More...

#include <OnePole.h>

Inheritance diagram for stk::OnePole:
stk::Filter stk::Stk

Public Member Functions

 OnePole (StkFloat thePole=0.9)
 The default constructor creates a low-pass filter (pole at z = 0.9).
 
 ~OnePole ()
 Class destructor.
 
void setB0 (StkFloat b0)
 Set the b[0] coefficient value.
 
void setA1 (StkFloat a1)
 Set the a[1] coefficient value.
 
void setCoefficients (StkFloat b0, StkFloat a1, bool clearState=false)
 Set all filter coefficients.
 
void setPole (StkFloat thePole)
 Set the pole position in the z-plane. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK one-pole filter class.

This class implements a one-pole digital filter. A method is provided for setting the pole position along the real axis of the z-plane while maintaining a constant peak filter gain.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::OnePole::setPole ( StkFloat  thePole)

Set the pole position in the z-plane.

This method sets the pole position along the real-axis of the z-plane and normalizes the coefficients for a maximum gain of one. A positive pole value produces a low-pass filter, while a negative pole value produces a high-pass filter. This method does not affect the filter gain value. The argument magnitude should be less than one to maintain filter stability.

StkFrames & stk::OnePole::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

90 {
91 #if defined(_STK_DEBUG_)
92  if ( channel >= frames.channels() ) {
93  oStream_ << "OnePole::tick(): channel and StkFrames arguments are incompatible!";
94  handleError( StkError::FUNCTION_ARGUMENT );
95  }
96 #endif
97 
98  StkFloat *samples = &frames[channel];
99  unsigned int hop = frames.channels();
100  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
101  inputs_[0] = gain_ * *samples;
102  *samples = b_[0] * inputs_[0] - a_[1] * outputs_[1];
103  outputs_[1] = *samples;
104  }
105 
106  lastFrame_[0] = outputs_[1];
107  return frames;
108 }
StkFrames & stk::OnePole::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

111 {
112 #if defined(_STK_DEBUG_)
113  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
114  oStream_ << "OnePole::tick(): channel and StkFrames arguments are incompatible!";
115  handleError( StkError::FUNCTION_ARGUMENT );
116  }
117 #endif
118 
119  StkFloat *iSamples = &iFrames[iChannel];
120  StkFloat *oSamples = &oFrames[oChannel];
121  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
122  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
123  inputs_[0] = gain_ * *iSamples;
124  *oSamples = b_[0] * inputs_[0] - a_[1] * outputs_[1];
125  outputs_[1] = *oSamples;
126  }
127 
128  lastFrame_[0] = outputs_[1];
129  return iFrames;
130 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1OnePole.png0000644000076600007660000000114112327015205016122 0ustar gary‰PNG  IHDRRˆCWLàPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ðIDATxíÑ’« ›C•ÿÿÉWAaPtMjöaëNŠN„H;ÃIÞÉ9g_È’äI(%ɇ”© 3__“eI}|¦,×uíåVÎV“ݾ_œ—%™q«lµ”݇¡´m–%éÌ“rß;nmgyÛùsãÓ½{ñ_(ÇÆ'ñ|Ó¸³Ä?goü§Å3.KÒ™øK’¡”$VeÎ9»ðŽÀ岸;ý•«ÑÛù Ê?’x(œ%€¡ð!”>„À‡P<’sξ%É“PJ’·ÊTFŸ–×±l¿‘¤×ÊÛo$i`¦,Õ¬ovïqQÖj½Û[™I²c¢4ímw­½.Ï•û^Ûm=J%õÑdÆ]ãå¥Êþ IvÌã±ß)¯¹½:Ë›x¾mügM\Ò0â?.I>„R’|X•9çì À;_ü•ËâîôW®Foç/(ÿHâ¡p"”>„À‡PøJB ðHJ)ùBð$”>œ”ëd|DI` kw½W–ÉÕyZ¾SnÝTí–ý¢,Õ²juMÙ§½ì¦¬¦ºÙNïú±>LÛƒFeß<«røØÏòYYU?*««÷Ø”=0mü¡J“ÇåˆîÎòì[´7¼jü§e°÷3ÛO‰øJþgeJ)¹òœ‘#¬ç4üIEND®B`‚stk-4.5.0/doc/html/classstk_1_1OneZero-members.html0000644000076600007660000003427612327015205017771 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::OneZero Member List

This is the complete list of members for stk::OneZero, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
getGain(void) const stk::Filterinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::OneZeroinline
OneZero(StkFloat theZero=-1.0)stk::OneZero
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setB0(StkFloat b0)stk::OneZeroinline
setB1(StkFloat b1)stk::OneZeroinline
setCoefficients(StkFloat b0, StkFloat b1, bool clearState=false)stk::OneZero
setGain(StkFloat gain)stk::Filterinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setZero(StkFloat theZero)stk::OneZero
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::OneZeroinline
tick(StkFrames &frames, unsigned int channel=0)stk::OneZeroinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::OneZeroinline
~OneZero()stk::OneZero
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1OneZero.html0000644000076600007660000013320312327015205016327 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::OneZero Class Reference

STK one-zero filter class. More...

#include <OneZero.h>

Inheritance diagram for stk::OneZero:
stk::Filter stk::Stk

Public Member Functions

 OneZero (StkFloat theZero=-1.0)
 The default constructor creates a low-pass filter (zero at z = -1.0).
 
 ~OneZero ()
 Class destructor.
 
void setB0 (StkFloat b0)
 Set the b[0] coefficient value.
 
void setB1 (StkFloat b1)
 Set the b[1] coefficient value.
 
void setCoefficients (StkFloat b0, StkFloat b1, bool clearState=false)
 Set all filter coefficients.
 
void setZero (StkFloat theZero)
 Set the zero position in the z-plane. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK one-zero filter class.

This class implements a one-zero digital filter. A method is provided for setting the zero position along the real axis of the z-plane while maintaining a constant filter gain.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::OneZero::setZero ( StkFloat  theZero)

Set the zero position in the z-plane.

This method sets the zero position along the real-axis of the z-plane and normalizes the coefficients for a maximum gain of one. A positive zero value produces a high-pass filter, while a negative zero value produces a low-pass filter. This method does not affect the filter gain value.

StkFrames & stk::OneZero::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

89 {
90 #if defined(_STK_DEBUG_)
91  if ( channel >= frames.channels() ) {
92  oStream_ << "OneZero::tick(): channel and StkFrames arguments are incompatible!";
93  handleError( StkError::FUNCTION_ARGUMENT );
94  }
95 #endif
96 
97  StkFloat *samples = &frames[channel];
98  unsigned int hop = frames.channels();
99  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
100  inputs_[0] = gain_ * *samples;
101  *samples = b_[1] * inputs_[1] + b_[0] * inputs_[0];
102  inputs_[1] = inputs_[0];
103  }
104 
105  lastFrame_[0] = *(samples-hop);
106  return frames;
107 }
StkFrames & stk::OneZero::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

110 {
111 #if defined(_STK_DEBUG_)
112  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
113  oStream_ << "OneZero::tick(): channel and StkFrames arguments are incompatible!";
114  handleError( StkError::FUNCTION_ARGUMENT );
115  }
116 #endif
117 
118  StkFloat *iSamples = &iFrames[iChannel];
119  StkFloat *oSamples = &oFrames[oChannel];
120  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
121  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
122  inputs_[0] = gain_ * *iSamples;
123  *oSamples = b_[1] * inputs_[1] + b_[0] * inputs_[0];
124  inputs_[1] = inputs_[0];
125  }
126 
127  lastFrame_[0] = *(oSamples-oHop);
128  return iFrames;
129 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1OneZero.png0000644000076600007660000000110012327015205016135 0ustar gary‰PNG  IHDRUˆ¡‹W™PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÏIDATxím“ƒ „—ÍŒÿÿ'Ÿò"‰BëyÐ;qX+Á<† ÓÏ.I–Sÿ‡âPóõj„IêñKj|N±›Ô­¨­2MÈÇ0I3úÔ½¢(¸&ɳ^RsºÍÞ}}aÁšéy ÷¨ÖF·n: Gë ÜèVv ôjï– “äYþ?àÔ‡QEDF .j€ášB]–Ø)Ô:;‡ú¨3àT§:Õ©NuªS¿–*"2\’,§~šâ¨Óx•°^!Ƀ®S»+$yP“kZo:½<ÄXªz»ÅIµ¨jŸ[‚ݳ1!ªQw‡šÓõ¶“­ ¬cI3ºœ¨§ZëgHÒ¨Ó-í@znãU_;Ýúƒ¥WÍné3@’Vþ?àÔ‡QEDF .j€ášB]–Ø)Ô:;‡ú¨3àT§:Õ©NuªS¿–BÃ…ƒåÔP׉ýJl(•N@Ko¨qÒ˾BÝ>OÚþz~ˆ¡TšªPÏSÚ¾¶S,åëiY«¬ó¼\×ôK%¿UëZïGxO-M*+yÞ¥Z^Ôª¥;èq<ÖÓ± ”^•T½ãôB¾—­+Cg†É©NF !„ÑúöÀ$Et MIEND®B`‚stk-4.5.0/doc/html/classstk_1_1PercFlut-members.html0000644000076600007660000003725512327015205020134 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::PercFlut Member List

This is the complete list of members for stk::PercFlut, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::FMvirtual
FM(unsigned int operators=4)stk::FM
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::FM
keyOn(void)stk::FM
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
loadWaves(const char **filenames)stk::FM
noteOff(StkFloat amplitude)stk::FMvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::PercFlutvirtual
PercFlut(void)stk::PercFlut
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setControl1(StkFloat cVal)stk::FMinline
setControl2(StkFloat cVal)stk::FMinline
setFrequency(StkFloat frequency)stk::PercFlutvirtual
setGain(unsigned int waveIndex, StkFloat gain)stk::FM
setModulationDepth(StkFloat mDepth)stk::FMinline
setModulationSpeed(StkFloat mSpeed)stk::FMinline
setRatio(unsigned int waveIndex, StkFloat ratio)stk::FM
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::PercFlutinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::PercFlutinlinevirtual
~FM(void)stk::FMvirtual
~PercFlut(void)stk::PercFlut
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1PercFlut.html0000644000076600007660000013625112327015205016500 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::PercFlut Class Reference

STK percussive flute FM synthesis instrument. More...

#include <PercFlut.h>

Inheritance diagram for stk::PercFlut:
stk::FM stk::Instrmnt stk::Stk

Public Member Functions

 PercFlut (void)
 Class constructor. More...
 
 ~PercFlut (void)
 Class destructor.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::FM
 FM (unsigned int operators=4)
 Class constructor, taking the number of wave/envelope operators to control. More...
 
virtual ~FM (void)
 Class destructor.
 
void loadWaves (const char **filenames)
 Load the rawwave filenames in waves.
 
void setRatio (unsigned int waveIndex, StkFloat ratio)
 Set the frequency ratio for the specified wave.
 
void setGain (unsigned int waveIndex, StkFloat gain)
 Set the gain for the specified wave.
 
void setModulationSpeed (StkFloat mSpeed)
 Set the modulation speed in Hz.
 
void setModulationDepth (StkFloat mDepth)
 Set the modulation depth.
 
void setControl1 (StkFloat cVal)
 Set the value of control1.
 
void setControl2 (StkFloat cVal)
 Set the value of control1.
 
void keyOn (void)
 Start envelopes toward "on" targets.
 
void keyOff (void)
 Start envelopes toward "off" targets.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK percussive flute FM synthesis instrument.

This class implements algorithm 4 of the TX81Z.

Algorithm 4 is : 4->3--\
2-- + -->1-->Out

Control Change Numbers:

  • Total Modulator Index = 2
  • Modulator Crossfade = 4
  • LFO Speed = 11
  • LFO Depth = 1
  • ADSR 2 & 4 Target = 128

The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::PercFlut::PercFlut ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::PercFlut::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::FM.

99 {
100  unsigned int nChannels = lastFrame_.channels();
101 #if defined(_STK_DEBUG_)
102  if ( channel > frames.channels() - nChannels ) {
103  oStream_ << "PercFlut::tick(): channel and StkFrames arguments are incompatible!";
104  handleError( StkError::FUNCTION_ARGUMENT );
105  }
106 #endif
107 
108  StkFloat *samples = &frames[channel];
109  unsigned int j, hop = frames.channels() - nChannels;
110  if ( nChannels == 1 ) {
111  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
112  *samples++ = tick();
113  }
114  else {
115  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
116  *samples++ = tick();
117  for ( j=1; j<nChannels; j++ )
118  *samples++ = lastFrame_[j];
119  }
120  }
121 
122  return frames;
123 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1PercFlut.png0000644000076600007660000000135312327015205016312 0ustar gary‰PNG  IHDRQÀKkâPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2zIDATxíÝr«0 ןfxÿG>Ä"ÌÏ ±zÑ©ZmŠe¼Xé5ff¡`’H%iœ{c©áÆóÏIZÒ;ëõ’ûÂøÚÌkG~u»èÓ’\\·ÔÅ« ÖìÒ’ÔsclK÷+·s¼,û¶êÓ¥mëÏûªO:óEÕ>Îzý°3­êµ/[göiIêÉïµ$“FIg6š™Eð@(áÆiŠV†ga°2Þø+zF€Ò0NÆI#À8i'ט™…‚IR i”¤qÆRÃ%½£ó?k,/Ûüá¥õú5ñž~%êo½k™­ùƒq¹¥­ðÃ"ùhŠ~öÔØD®´m'ïéîyýIõU_·éÆ}Õã^ÿ‰±H>Nª~jle­}9J¶®œÏz-I¤Q’Æù³F3³H>b%Ü8MÑÊpã, VÆE¯Ó@ÆI#À8i'ã¤à3³P0I $’4έ±ÔxëÏ;çç¾4nfÿGÒ.®Œu/ó‡—Q׺mØ&—ÜSc¹eí¿3.¦Þè èÎø“ÎøªŒEòq0nHÒžûªÝ‰uïás£$}G%iœ?k43‹à#&€PÂÓ­ 7ÎÂ`e¼ñWô:¤`œ4Œ“F€qÒ0N®)¥”P(¤`œÎ8üxéÀÖWw{»úÑÝ øX³7ÆúÀåmÚîÚŒm«Ël½vÆe¸V³—™mÁªÞÖ´§îK9d¼±M¸*×sìÙO]So¼0ŸU}Ö_õùñ?2ðqnrìî=ê«^ûÒ«×^o×»‡µw ¿×A¤`œú_¨”RâøU=3-èÄn±IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Phonemes-members.html0000644000076600007660000002562312327015205020162 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Phonemes Member List

This is the complete list of members for stk::Phonemes, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
formantFrequency(unsigned int index, unsigned int partial)stk::Phonemesstatic
formantGain(unsigned int index, unsigned int partial)stk::Phonemesstatic
formantRadius(unsigned int index, unsigned int partial)stk::Phonemesstatic
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
name(unsigned int index)stk::Phonemesstatic
noiseGain(unsigned int index)stk::Phonemesstatic
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
voiceGain(unsigned int index)stk::Phonemesstatic
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Phonemes.html0000644000076600007660000006400612327015205016530 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Phonemes Class Reference

STK phonemes table. More...

#include <Phonemes.h>

Inheritance diagram for stk::Phonemes:
stk::Stk

Static Public Member Functions

static const char * name (unsigned int index)
 Returns the phoneme name for the given index (0-31).
 
static StkFloat voiceGain (unsigned int index)
 Returns the voiced component gain for the given phoneme index (0-31).
 
static StkFloat noiseGain (unsigned int index)
 Returns the unvoiced component gain for the given phoneme index (0-31).
 
static StkFloat formantFrequency (unsigned int index, unsigned int partial)
 Returns the formant frequency for the given phoneme index (0-31) and partial (0-3).
 
static StkFloat formantRadius (unsigned int index, unsigned int partial)
 Returns the formant radius for the given phoneme index (0-31) and partial (0-3).
 
static StkFloat formantGain (unsigned int index, unsigned int partial)
 Returns the formant gain for the given phoneme index (0-31) and partial (0-3).
 
- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 

Additional Inherited Members

- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK phonemes table.

This class does nothing other than declare a set of 32 static phoneme formant parameters and provide access to those values.

by Perry R. Cook and Gary P. Scavone, 1995–2014.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Phonemes.png0000644000076600007660000000070012327015205016337 0ustar gary‰PNG  IHDR[PA/ùhPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2OIDATxíánƒ0 /_$Þÿ‘×BâÚΛª¹âvÉá~AýMÎ9;A–$Â-I–?v§õèêÛgÒ–$ËóîõºôÞrß¼OÙ{¶‹±-IÝût«¦ªÖDº¶$M9soëØó~Êy&SÉösÞqÛL&{ùV&ý1{O^ÞË-“º“û^Ú¶$M‰ÿI²„[’,ìÎ9g®³8áè^?¹£û¦v“{º?ö= 7À@¸,á°„ÀnK¸,á°üwJ)9Ap!Ü–_tߊ¾.»m{×8qOz×hîû€Û;¹«š{ý~RÕk{t—Ч/˹•³ªMÔ-³î¶r–·Y}pÙö,“ƒ»;¥åÁí¨ƒ2é†0îC˜Ã²YÞÃ^>ŸÉèÞ2©;i²gާߪ*þî=øa ` 7€ÅÙRJ>|~:13tÐIEND®B`‚stk-4.5.0/doc/html/classstk_1_1PitShift-members.html0000644000076600007660000003026412327015205020133 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::PitShift Member List

This is the complete list of members for stk::PitShift, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Effectinline
clear(void)stk::PitShiftvirtual
Effect(void)stk::Effectinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Effectinline
lastOut(void) const stk::PitShiftinline
PitShift(void)stk::PitShift
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setEffectMix(StkFloat mix)stk::Effectinlinevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setShift(StkFloat shift)stk::PitShift
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::PitShiftinline
tick(StkFrames &frames, unsigned int channel=0)stk::PitShift
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::PitShift
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1PitShift.html0000644000076600007660000010402512327015205016500 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::PitShift Class Reference

STK simple pitch shifter effect class. More...

#include <PitShift.h>

Inheritance diagram for stk::PitShift:
stk::Effect stk::Stk

Public Member Functions

 PitShift (void)
 Class constructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setShift (StkFloat shift)
 Set the pitch shift factor (1.0 produces no shift).
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the effect and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the effect and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the effect and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Effect
 Effect (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual void setEffectMix (StkFloat mix)
 Set the mixture of input and "effected" levels in the output (0.0 = input only, 1.0 = effect only).
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK simple pitch shifter effect class.

This class implements a simple pitch shifter using delay lines.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

StkFrames& stk::PitShift::tick ( StkFrames frames,
unsigned int  channel = 0 
)

Take a channel of the StkFrames object as inputs to the effect and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

StkFrames& stk::PitShift::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)

Take a channel of the iFrames object as inputs to the effect and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1PitShift.png0000644000076600007660000000110712327015205016315 0ustar gary‰PNG  IHDRHˆsÛ]ÁPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÖIDATxíÝŽ³0 DOÆïÿÈ ~L¿m.*ÕUf|’q {‹™Ùa’ô¹$I±îA¥ÏŸ‹ôƒê|ɽz-ýZßµÉ1‚¶ukÍZW¹´$?n@­¢/ØztåíÖÚeEÛèÛ ÞÚE³ß·æÇÕ©½×ìfmmõÖì>-É|i%)V‚$)Ö 23 €GM#4 4MƒH£@3g iè O-AJ@¬ÄJ@¬Äúu™Ùa’ô¹$I±Î RÇÖO,’´=~¹ï#æ´,Z:V›ÔtÛYMÕ¯6?‚–ú:Úúޏîh¿Òïýj—‡µG ØÚ tÜÑΚí­Ý€úÖÝYóãôÔ£fmmu#zÔškB¾´’+A’k™™ À£¾î_ö4 "Íœ1¤a /<µ<(A±+A±ë×A¥”2B€Ï• €XÐøx9Ž-½GíÞ9³G!hû³]éîè°kúµX{¶;÷Rÿ ¼¢öµ¨-õK‘ýt­q÷žw´pÞ=jû….­@çÖíåw ÞÚÈ7;´ÖYÿ3¨Y[[Ý›c÷O _Z€P ˆUJ)åcý üÓó±úIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Plucked-members.html0000644000076600007660000003221212327015205017763 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Plucked Member List

This is the complete list of members for stk::Plucked, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Pluckedvirtual
controlChange(int number, StkFloat value)stk::Instrmntinlinevirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Pluckedvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Pluckedvirtual
pluck(StkFloat amplitude)stk::Plucked
Plucked(StkFloat lowestFrequency=10.0)stk::Plucked
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Pluckedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Pluckedinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Pluckedinlinevirtual
~Plucked(void)stk::Plucked
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Plucked.html0000644000076600007660000011462012327015205016337 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Plucked Class Reference

STK basic plucked string class. More...

#include <Plucked.h>

Inheritance diagram for stk::Plucked:
stk::Instrmnt stk::Stk

Public Member Functions

 Plucked (StkFloat lowestFrequency=10.0)
 Class constructor, taking the lowest desired playing frequency.
 
 ~Plucked (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void pluck (StkFloat amplitude)
 Pluck the string with the given amplitude using the current frequency.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK basic plucked string class.

This class implements a simple plucked string physical model based on the Karplus-Strong algorithm.

For a more advanced plucked string implementation, see the stk::Twang class.

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. There exist at least two patents, assigned to Stanford, bearing the names of Karplus and/or Strong.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

StkFrames & stk::Plucked::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

88 {
89  unsigned int nChannels = lastFrame_.channels();
90 #if defined(_STK_DEBUG_)
91  if ( channel > frames.channels() - nChannels ) {
92  oStream_ << "Plucked::tick(): channel and StkFrames arguments are incompatible!";
93  handleError( StkError::FUNCTION_ARGUMENT );
94  }
95 #endif
96 
97  StkFloat *samples = &frames[channel];
98  unsigned int j, hop = frames.channels() - nChannels;
99  if ( nChannels == 1 ) {
100  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
101  *samples++ = tick();
102  }
103  else {
104  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
105  *samples++ = tick();
106  for ( j=1; j<nChannels; j++ )
107  *samples++ = lastFrame_[j];
108  }
109  }
110 
111  return frames;
112 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Plucked.png0000644000076600007660000000112312327015205016150 0ustar gary‰PNG  IHDRNˆ~Å-†PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2âIDATxíánà ©ïÿÈK¡†Ð5ež4i^}k0á‚q¦ý%çœý K’¡“¤5¾Õ¥f¼ýLÒ‹ºr}ä>ÕíÛØ÷b—Ö‹1}C×öPVž«K©&-I=¯uu]¿¬Ý‹j¿+vº®núC]_줟kcÖÙOZQ‹=ÑZѧ%©'þf%iÐIÒ›.çœÝ¸ÃÀ_ÝãáêóÕm6OŸ³îw6t‹„`Ь:€5B°FèrÎÙ²$y:IZcÔ¥v(éãxÌÿž.íªí—5–ë}â9½'ʧÜuÌ–|¯;æëív˜$u} ;{ÕU‹©¨íá9=<¬? ¡Ø×º6}W×{Ñõî·º$Ù˜û‘®Vs6âjhm˜é.•¤:IZã¿érÎÙ €;Üý· p_ÝãáêóÕm6OŸ³îw6t‹„`Ь:€5B°FèRJÉ€¡XcÐm;>šÕçÎû5ñF7ÉÝÔíÛ¨/N»ÙèÎM¶í>ûÒQ×™§£×µ¯¦?b¢«“¦svæ«–2>âZìE×éEw The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::PoleZero Member List

This is the complete list of members for stk::PoleZero, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
getGain(void) const stk::Filterinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::PoleZeroinline
phaseDelay(StkFloat frequency)stk::Filterinline
PoleZero()stk::PoleZero
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setA1(StkFloat a1)stk::PoleZeroinline
setAllpass(StkFloat coefficient)stk::PoleZero
setB0(StkFloat b0)stk::PoleZeroinline
setB1(StkFloat b1)stk::PoleZeroinline
setBlockZero(StkFloat thePole=0.99)stk::PoleZero
setCoefficients(StkFloat b0, StkFloat b1, StkFloat a1, bool clearState=false)stk::PoleZero
setGain(StkFloat gain)stk::Filterinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::PoleZeroinline
tick(StkFrames &frames, unsigned int channel=0)stk::PoleZeroinlinevirtual
~PoleZero()stk::PoleZero
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1PoleZero.html0000644000076600007660000012317312327015205016512 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::PoleZero Class Reference

STK one-pole, one-zero filter class. More...

#include <PoleZero.h>

Inheritance diagram for stk::PoleZero:
stk::Filter stk::Stk

Public Member Functions

 PoleZero ()
 Default constructor creates a first-order pass-through filter.
 
 ~PoleZero ()
 Class destructor.
 
void setB0 (StkFloat b0)
 Set the b[0] coefficient value.
 
void setB1 (StkFloat b1)
 Set the b[1] coefficient value.
 
void setA1 (StkFloat a1)
 Set the a[1] coefficient value.
 
void setCoefficients (StkFloat b0, StkFloat b1, StkFloat a1, bool clearState=false)
 Set all filter coefficients.
 
void setAllpass (StkFloat coefficient)
 Set the filter for allpass behavior using coefficient. More...
 
void setBlockZero (StkFloat thePole=0.99)
 Create a DC blocking filter with the given pole position in the z-plane. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK one-pole, one-zero filter class.

This class implements a one-pole, one-zero digital filter. A method is provided for creating an allpass filter with a given coefficient. Another method is provided to create a DC blocking filter.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::PoleZero::setAllpass ( StkFloat  coefficient)

Set the filter for allpass behavior using coefficient.

This method uses coefficient to create an allpass filter, which has unity gain at all frequencies. Note that the coefficient magnitude must be less than one to maintain filter stability.

void stk::PoleZero::setBlockZero ( StkFloat  thePole = 0.99)

Create a DC blocking filter with the given pole position in the z-plane.

This method sets the given pole position, together with a zero at z=1, to create a DC blocking filter. The argument magnitude should be close to (but less than) one to minimize low-frequency attenuation.

StkFrames & stk::PoleZero::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

90 {
91 #if defined(_STK_DEBUG_)
92  if ( channel >= frames.channels() ) {
93  oStream_ << "PoleZero::tick(): channel and StkFrames arguments are incompatible!";
94  handleError( StkError::FUNCTION_ARGUMENT );
95  }
96 #endif
97 
98  StkFloat *samples = &frames[channel];
99  unsigned int hop = frames.channels();
100  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
101  inputs_[0] = gain_ * *samples;
102  *samples = b_[0] * inputs_[0] + b_[1] * inputs_[1] - a_[1] * outputs_[1];
103  inputs_[1] = inputs_[0];
104  outputs_[1] = *samples;
105  }
106 
107  lastFrame_[0] = outputs_[1];
108  return frames;
109 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1PoleZero.png0000644000076600007660000000110412327015205016317 0ustar gary‰PNG  IHDRVˆJ¼ìšPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÓIDATxíYnÃ0 DGCÀ÷?rm­Ô–:©ÔÂ(ŽcIá3=$ò ‘õ‚äjö±Î‡ZŸŸÁ6Iïbý}Øû{•uÕ¦ñ¦Ý&YÅ l®ÉÅ[ ¶I²×kl̯ӳ·/\øÎ„a~|‰±µ ƒ–}j‚ŽÑ$|Ò²hBjXnY½M’½ì?Á°ÅŠˆ,ÜÕëµ{[¸{°'uwöa“`XÃÖ°JÖ°†ýX‘õ‚äjöO°ÎGYúOÚÖ'$Ùè ìô„$±¾ªó¢óÓß u_¿"ÉJC¬zÕ+£~íʯAå3lÌ×o¬¥c‰,’UÌMè°]µå9$YiÖ2m Û÷ò¶·“–ýĄ԰aËô$d-ûO0ìC±""ËwuÀzíÁÇîìIÝÁÝ„}Ø$Ö°†5,€†5¬aÿÖ9çÖ V˰¿†=zšªOëñ€¡¾Á60:î`¯gÇË?ÏØPY¹S§aòòYÆšHHüø]vJFYû¢ô™þQxdïí[®­::¬úŽØÔ©”_?¸ÇÖ&L±ƒ“¶ê‰·MËF&T¿¸aBjXËo&¡Ì­öd0 °N†5ìn¬sÎ-×Ñ¡$²È"£µIEND®B`‚stk-4.5.0/doc/html/classstk_1_1PRCRev-members.html0000644000076600007660000003025112327015205017476 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::PRCRev Member List

This is the complete list of members for stk::PRCRev, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Effectinline
clear(void)stk::PRCRevvirtual
Effect(void)stk::Effectinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Effectinline
lastOut(unsigned int channel=0)stk::PRCRevinline
PRCRev(StkFloat T60=1.0)stk::PRCRev
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setEffectMix(StkFloat mix)stk::Effectinlinevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setT60(StkFloat T60)stk::PRCRev
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input, unsigned int channel=0)stk::PRCRevinline
tick(StkFrames &frames, unsigned int channel=0)stk::PRCRev
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::PRCRev
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1PRCRev.html0000644000076600007660000013040712327015205016052 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::PRCRev Class Reference

Perry's simple reverberator class. More...

#include <PRCRev.h>

Inheritance diagram for stk::PRCRev:
stk::Effect stk::Stk

Public Member Functions

 PRCRev (StkFloat T60=1.0)
 Class constructor taking a T60 decay time argument (one second default value).
 
void clear (void)
 Reset and clear all internal state.
 
void setT60 (StkFloat T60)
 Set the reverberation T60 decay time.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed stereo frame. More...
 
StkFloat tick (StkFloat input, unsigned int channel=0)
 Input one sample to the effect and return the specified channel value of the computed stereo frame. More...
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the effect and replace with stereo outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Effect
 Effect (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
virtual void setEffectMix (StkFloat mix)
 Set the mixture of input and "effected" levels in the output (0.0 = input only, 1.0 = effect only).
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

Perry's simple reverberator class.

This class takes a monophonic input signal and produces a stereo output signal. It is based on some of the famous Stanford/CCRMA reverbs (NRev, KipRev), which were based on the Chowning/Moorer/Schroeder reverberators using networks of simple allpass and comb delay filters. This class implements two series allpass units and two parallel comb filters.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

StkFloat stk::PRCRev::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed stereo frame.

Use the lastFrame() function to get both values of the last computed stereo frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

91 {
92 #if defined(_STK_DEBUG_)
93  if ( channel > 1 ) {
94  oStream_ << "PRCRev::lastOut(): channel argument must be less than 2!";
95  handleError( StkError::FUNCTION_ARGUMENT );
96  }
97 #endif
98 
99  return lastFrame_[channel];
100 }
StkFloat stk::PRCRev::tick ( StkFloat  input,
unsigned int  channel = 0 
)
inline

Input one sample to the effect and return the specified channel value of the computed stereo frame.

Use the lastFrame() function to get both values of the computed stereo output frame. The channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

103 {
104 #if defined(_STK_DEBUG_)
105  if ( channel > 1 ) {
106  oStream_ << "PRCRev::tick(): channel argument must be less than 2!";
107  handleError( StkError::FUNCTION_ARGUMENT );
108  }
109 #endif
110 
111  StkFloat temp, temp0, temp1, temp2, temp3;
112 
113  temp = allpassDelays_[0].lastOut();
114  temp0 = allpassCoefficient_ * temp;
115  temp0 += input;
116  allpassDelays_[0].tick(temp0);
117  temp0 = -(allpassCoefficient_ * temp0) + temp;
118 
119  temp = allpassDelays_[1].lastOut();
120  temp1 = allpassCoefficient_ * temp;
121  temp1 += temp0;
122  allpassDelays_[1].tick(temp1);
123  temp1 = -(allpassCoefficient_ * temp1) + temp;
124 
125  temp2 = temp1 + ( combCoefficient_[0] * combDelays_[0].lastOut() );
126  temp3 = temp1 + ( combCoefficient_[1] * combDelays_[1].lastOut() );
127 
128  lastFrame_[0] = effectMix_ * (combDelays_[0].tick(temp2));
129  lastFrame_[1] = effectMix_ * (combDelays_[1].tick(temp3));
130  temp = (1.0 - effectMix_) * input;
131  lastFrame_[0] += temp;
132  lastFrame_[1] += temp;
133 
134  return lastFrame_[channel];
135 }
StkFrames& stk::PRCRev::tick ( StkFrames frames,
unsigned int  channel = 0 
)

Take a channel of the StkFrames object as inputs to the effect and replace with stereo outputs.

The StkFrames argument reference is returned. The stereo outputs are written to the StkFrames argument starting at the specified channel. Therefore, the channel argument must be less than ( channels() - 1 ) of the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

StkFrames& stk::PRCRev::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)

Take a channel of the iFrames object as inputs to the effect and write stereo outputs to the oFrames object.

The iFrames object reference is returned. The iChannel argument must be less than the number of channels in the iFrames argument (the first channel is specified by 0). The oChannel argument must be less than ( channels() - 1 ) of the oFrames argument. However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1PRCRev.png0000644000076600007660000000113212327015205015662 0ustar gary‰PNG  IHDRPˆG¢œÝPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2éIDATxíÛŽë EÛRþÿ“OJH¸”tÒÁ/£ãÊ[€ƒW|iÕWÌÌ<…I’Ÿ(Ikú LÙšóþ™¸ ÌûÃ÷=ð•Ê+Ÿ6¸lF·¤jwÀ+{Æç‚·$ ú,‘}àÕûš?–<,‰ ìKž åû’[›Mù»¡”’Ï‘\CéÝ’4(~Ë’´¦JÒšv ™™£ið”7pÛœ‰ÞÀçKtþ)`QXSÖ@€5`M˜ËÌÌS˜$ù)€’´¦90e«ÇüÉ›C’ªõçgÀfq?$RÇ,›ì.™fW^Êþxp²•|ò™a}2Ö2–kͽ³‡೒߀c†•ÿd(mÉ7À¾µ’ª}èáÛP~ÕÃRò9’BzØMyøbÆoY’Ö@IZÓ43sÀ#=þ£x"oà¶9½;Ï—èüS À¢°¦¬)€k Àš0WJ)yŠà§¬iî‡ö|Œ­®Ç®sýl}4::UàëåktÝãßäˆæ] 𸞭<AwoªË,›JÆV`㸠ج=°V\âêÕß–ü¼oµ9pÚÔ~âcÉçHzri›Y§<8(€kú?)¥ä¨fø"18ùHIEND®B`‚stk-4.5.0/doc/html/classstk_1_1ReedTable-members.html0000644000076600007660000002700212327015205020224 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::ReedTable Member List

This is the complete list of members for stk::ReedTable, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
Function(void)stk::Functioninline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastOut(void) const stk::Functioninline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
ReedTable(void)stk::ReedTableinline
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setOffset(StkFloat offset)stk::ReedTableinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setSlope(StkFloat slope)stk::ReedTableinline
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::ReedTableinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::ReedTableinline
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::ReedTableinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1ReedTable.html0000644000076600007660000012001012327015205016565 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::ReedTable Class Reference

STK reed table class. More...

#include <ReedTable.h>

Inheritance diagram for stk::ReedTable:
stk::Function stk::Stk

Public Member Functions

 ReedTable (void)
 Default constructor.
 
void setOffset (StkFloat offset)
 Set the table offset value. More...
 
void setSlope (StkFloat slope)
 Set the table slope value. More...
 
StkFloat tick (StkFloat input)
 Take one sample input and map to one sample of output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the table and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the table and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Function
 Function (void)
 Class constructor.
 
StkFloat lastOut (void) const
 Return the last computed output sample.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK reed table class.

This class implements a simple one breakpoint, non-linear reed function, as described by Smith (1986). This function is based on a memoryless non-linear spring model of the reed (the reed mass is ignored) which saturates when the reed collides with the mouthpiece facing.

See McIntyre, Schumacher, & Woodhouse (1983), Smith (1986), Hirschman, Cook, Scavone, and others for more information.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::ReedTable::setOffset ( StkFloat  offset)
inline

Set the table offset value.

The table offset roughly corresponds to the size of the initial reed tip opening (a greater offset represents a smaller opening).

39 { offset_ = offset; };
void stk::ReedTable::setSlope ( StkFloat  slope)
inline

Set the table slope value.

The table slope roughly corresponds to the reed stiffness (a greater slope represents a harder reed).

47 { slope_ = slope; };
StkFrames & stk::ReedTable::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inline

Take a channel of the StkFrames object as inputs to the table and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

99 {
100 #if defined(_STK_DEBUG_)
101  if ( channel >= frames.channels() ) {
102  oStream_ << "ReedTable::tick(): channel and StkFrames arguments are incompatible!";
103  handleError( StkError::FUNCTION_ARGUMENT );
104  }
105 #endif
106 
107  StkFloat *samples = &frames[channel];
108  unsigned int hop = frames.channels();
109  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
110  *samples = offset_ + (slope_ * *samples);
111  if ( *samples > 1.0) *samples = 1.0;
112  if ( *samples < -1.0) *samples = -1.0;
113  }
114 
115  lastFrame_[0] = *(samples-hop);
116  return frames;
117 }
StkFrames & stk::ReedTable::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the table and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

120 {
121 #if defined(_STK_DEBUG_)
122  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
123  oStream_ << "ReedTable::tick(): channel and StkFrames arguments are incompatible!";
124  handleError( StkError::FUNCTION_ARGUMENT );
125  }
126 #endif
127 
128  StkFloat *iSamples = &iFrames[iChannel];
129  StkFloat *oSamples = &oFrames[oChannel];
130  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
131  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
132  *oSamples = offset_ + (slope_ * *iSamples);
133  if ( *oSamples > 1.0) *oSamples = 1.0;
134  if ( *oSamples < -1.0) *oSamples = -1.0;
135  }
136 
137  lastFrame_[0] = *(oSamples-oHop);
138  return iFrames;
139 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1ReedTable.png0000644000076600007660000000121212327015205016407 0ustar gary‰PNG  IHDR]ˆ²\mPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxíír¬ ›C•ïÿÈwEÔg?’ÍäÖV&¡£"6p†Êoj­5 ª$‘vIòøÿöÒšy¾ý8Ý’4ñ {»ßúÞ´¯‹\WjMýfî–¤™Çöc…M´ËZ.¦[’|žÚ»f´¹?‰æ…d\MßÒ{ö1§ªo&c›wfÞ¨jOf¯éQÕ±[’|òÿŒ$y¤]’<>Ü^k­Q| ŒPû²DêCí7y >ÖþÑg&í.iðH;€GÚ<Òà‘v´xü%{­µ†A•¤ Ò.I¿o/­íG’¦±’l{Å.I÷xør¶¯k\j'ØoÖkëß6ÒöÓÇnÇ«;öMº)ìã`?{Ípûêý7än×n眧zd߬³}NæÛö1™¶ɶ‹}ö^î/%³×tžæ8K昌gæY2’ôc¤]’<Ò.IáöZkà ,a„Ú—%Rj¿Éõ±ö>3ipI;€GÚ<Òà‘v´x¤Àã/ÙK)% @iðøUûíÁ>ou˜¹}×OÅù¥¹¼f¿~pïÍûºŒ~BÇ­ú"‹µoëfÆÁÖ¾I[ë£öiúu¸ôYŽÉûâì¨Ù~›s¿Ø§dÆ™û±±Á~îµ×—8%3íëˆÆVÕ&3æ>–l´_SsªZÀ¶«ý­Ü{2{MǪ>=3í÷Á™øqÒà‘vp{)¥Dñ 'tbŸh‡IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Resonate-members.html0000644000076600007660000003450112327015205020157 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Resonate Member List

This is the complete list of members for stk::Resonate, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::Resonatevirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::Resonateinline
keyOn(void)stk::Resonateinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Resonatevirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Resonatevirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
Resonate(void)stk::Resonate
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setEqualGainZeroes(void)stk::Resonateinline
setFrequency(StkFloat frequency)stk::Instrmntinlinevirtual
setNotch(StkFloat frequency, StkFloat radius)stk::Resonate
setRawwavePath(std::string path)stk::Stkstatic
setResonance(StkFloat frequency, StkFloat radius)stk::Resonate
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Resonateinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Resonateinlinevirtual
~Resonate(void)stk::Resonate
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Resonate.html0000644000076600007660000012174012327015205016531 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Resonate Class Reference

STK noise driven formant filter. More...

#include <Resonate.h>

Inheritance diagram for stk::Resonate:
stk::Instrmnt stk::Stk

Public Member Functions

 Resonate (void)
 Class constructor.
 
 ~Resonate (void)
 Class destructor.
 
void setResonance (StkFloat frequency, StkFloat radius)
 Set the filter for a resonance at the given frequency (Hz) and radius.
 
void setNotch (StkFloat frequency, StkFloat radius)
 Set the filter for a notch at the given frequency (Hz) and radius.
 
void setEqualGainZeroes (void)
 Set the filter zero coefficients for contant resonance gain.
 
void keyOn (void)
 Initiate the envelope with a key-on event.
 
void keyOff (void)
 Signal a key-off event to the envelope.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK noise driven formant filter.

This instrument contains a noise source, which excites a biquad resonance filter, with volume controlled by an ADSR.

Control Change Numbers:

  • Resonance Frequency (0-Nyquist) = 2
  • Pole Radii = 4
  • Notch Frequency (0-Nyquist) = 11
  • Zero Radii = 1
  • Envelope Gain = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

StkFrames & stk::Resonate::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

96 {
97  unsigned int nChannels = lastFrame_.channels();
98 #if defined(_STK_DEBUG_)
99  if ( channel > frames.channels() - nChannels ) {
100  oStream_ << "Resonate::tick(): channel and StkFrames arguments are incompatible!";
101  handleError( StkError::FUNCTION_ARGUMENT );
102  }
103 #endif
104 
105  StkFloat *samples = &frames[channel];
106  unsigned int j, hop = frames.channels() - nChannels;
107  if ( nChannels == 1 ) {
108  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
109  *samples++ = tick();
110  }
111  else {
112  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
113  *samples++ = tick();
114  for ( j=1; j<nChannels; j++ )
115  *samples++ = lastFrame_[j];
116  }
117  }
118 
119  return frames;
120 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Resonate.png0000644000076600007660000000107312327015205016345 0ustar gary‰PNG  IHDRUˆ¡‹W™PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÊIDATxím„ „‡iâÿÿɧ€P î‹½ì¦{•qJî3DD¦ B’“åÔÿ¡†j¼ÿŒ4IoRãsÊݤ›:v¦ ù¡O“lâšZv'$~¿J“䨇Լ¼]]|}`ÁÌåùîQ[ŒnÝt@‡unt+;pöªt«M“ä(ÿ?àÔ/£ŠˆÌ¼¨ ¦k uÛV`—PwèìêW§:Õ©NuªSú³T‘é‚äd9õcÔCIÖèÇVþÔp÷‹Çç£PËG"þÅY©ó&5MË«ô0:2&†®^R3LM);ªåî£k£×ÔR~“Ú:0PÛW¼J ¤Ã;Ôü‰g¯FPé”E½:$9ENuê2ªˆÈlÀ‹Ú`º–P·mv u‡.À®¡~ÕpªSêT§:Õ©?K !„éB€ÉrêG¨û@S?à™ÚYO¨ã0tE=6•OZ™R¨yËç5¦ô¨^Zj‚ÅHk >ßÕ„tkGå©§ÖÙ½¯ui;èw4P­§VR¹{ÅYË ‹º[ÚÖ×~Žykv3ú:vËôÕ¢^8pöªí–}j)ã À49թ˨!„0[›$0²X‚tIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Rhodey-members.html0000644000076600007660000003717312327015205017641 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Rhodey Member List

This is the complete list of members for stk::Rhodey, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::FMvirtual
FM(unsigned int operators=4)stk::FM
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::FM
keyOn(void)stk::FM
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
loadWaves(const char **filenames)stk::FM
noteOff(StkFloat amplitude)stk::FMvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Rhodeyvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
Rhodey(void)stk::Rhodey
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setControl1(StkFloat cVal)stk::FMinline
setControl2(StkFloat cVal)stk::FMinline
setFrequency(StkFloat frequency)stk::Rhodeyvirtual
setGain(unsigned int waveIndex, StkFloat gain)stk::FM
setModulationDepth(StkFloat mDepth)stk::FMinline
setModulationSpeed(StkFloat mSpeed)stk::FMinline
setRatio(unsigned int waveIndex, StkFloat ratio)stk::FM
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Rhodeyinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Rhodeyinlinevirtual
~FM(void)stk::FMvirtual
~Rhodey(void)stk::Rhodey
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Rhodey.html0000644000076600007660000013651112327015205016205 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Rhodey Class Reference

STK Fender Rhodes electric piano FM synthesis instrument. More...

#include <Rhodey.h>

Inheritance diagram for stk::Rhodey:
stk::FM stk::Instrmnt stk::Stk

Public Member Functions

 Rhodey (void)
 Class constructor. More...
 
 ~Rhodey (void)
 Class destructor.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::FM
 FM (unsigned int operators=4)
 Class constructor, taking the number of wave/envelope operators to control. More...
 
virtual ~FM (void)
 Class destructor.
 
void loadWaves (const char **filenames)
 Load the rawwave filenames in waves.
 
void setRatio (unsigned int waveIndex, StkFloat ratio)
 Set the frequency ratio for the specified wave.
 
void setGain (unsigned int waveIndex, StkFloat gain)
 Set the gain for the specified wave.
 
void setModulationSpeed (StkFloat mSpeed)
 Set the modulation speed in Hz.
 
void setModulationDepth (StkFloat mDepth)
 Set the modulation depth.
 
void setControl1 (StkFloat cVal)
 Set the value of control1.
 
void setControl2 (StkFloat cVal)
 Set the value of control1.
 
void keyOn (void)
 Start envelopes toward "on" targets.
 
void keyOff (void)
 Start envelopes toward "off" targets.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK Fender Rhodes electric piano FM synthesis instrument.

This class implements two simple FM Pairs summed together, also referred to as algorithm 5 of the TX81Z.

Algorithm 5 is : 4->3--\
+ --> Out
2->1--/

Control Change Numbers:

  • Modulator Index One = 2
  • Crossfade of Outputs = 4
  • LFO Speed = 11
  • LFO Depth = 1
  • ADSR 2 & 4 Target = 128

The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Rhodey::Rhodey ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::Rhodey::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::FM.

100 {
101  unsigned int nChannels = lastFrame_.channels();
102 #if defined(_STK_DEBUG_)
103  if ( channel > frames.channels() - nChannels ) {
104  oStream_ << "Rhodey::tick(): channel and StkFrames arguments are incompatible!";
105  handleError( StkError::FUNCTION_ARGUMENT );
106  }
107 #endif
108 
109  StkFloat *samples = &frames[channel];
110  unsigned int j, hop = frames.channels() - nChannels;
111  if ( nChannels == 1 ) {
112  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
113  *samples++ = tick();
114  }
115  else {
116  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
117  *samples++ = tick();
118  for ( j=1; j<nChannels; j++ )
119  *samples++ = lastFrame_[j];
120  }
121  }
122 
123  return frames;
124 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Rhodey.png0000644000076600007660000000134612327015205016022 0ustar gary‰PNG  IHDRLÀ™;uºPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2uIDATxíán³0 EO®¥¾ÿ#RpÒ¬­WÚ¤…ùìàClÓõ/ffYÂ$)G &I1=ƒ•jÎߎIø[°z}Äb°} û>|b»Ã/açókÞ=·éÂ’ÔéKXËê“ΞÍë|Ræ4«m8ëËœ V¦·Ù4ß@+óÞþs}X’:­ï¦$Å´`’Ó33KÀºd)v»%Ò2a+– ûÅÓ\0€  ¦ˆiÁbZ0€˜ÌffYÂ$)G &I1 °RÍ»’.ý!þŸ`emžW¯÷…kyÔ¿z×±Zãv¬¶›½[$o-»š_aáj9Ÿ-êZÓ—ù5ì\~Ö—ùëÉ/`Eò6)3kuÜÛÿ˜6¦)IŸjÁ$)¦¿33KÀú‰_t€—ºÝi™°•GK…ýâi.@P Ó‚Ä´`1-@L æ3³,a’”£“¤˜žÀJµË­ÇókqØ õ'I—ÍauÛ‡ç}v0ªí)§ÛXÖ.£µ, ; #Ìo{èç‹ø2?ƒÉÛì”$oÏÊtÝÞ¯L’¾¡“¤˜þÌÌ,Ioè'~Ñ^êvK¤eÂ6V-ö‹§¹`A-@L Ó‚Ä´`1-˜?J)%K€-@Lls¼Œ¨7ôz›ÄÞ‚í[h¯Êy竬ëÇ­u¿ç®[ ;G¢wó嶫ΛÁ®ÄYÏÒŸÀÈë5œŽ'¹¶øø20= û™ôl6€¯{6ƒµ2ïípÏ›L³{öç߀L˜oñ§°nøëÿ@DÙ°RJIÒ?pt02ùGIEND®B`‚stk-4.5.0/doc/html/classstk_1_1RtWvIn-members.html0000644000076600007660000002704412327015205017574 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::RtWvIn Member List

This is the complete list of members for stk::RtWvIn, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::WvIninline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::WvIninline
lastOut(unsigned int channel=0)stk::RtWvIninline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
RtWvIn(unsigned int nChannels=1, StkFloat sampleRate=Stk::sampleRate(), int device=0, int bufferFrames=RT_BUFFER_SIZE, int nBuffers=20)stk::RtWvIn
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
start(void)stk::RtWvIn
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stop(void)stk::RtWvIn
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::RtWvInvirtual
tick(StkFrames &frames)stk::RtWvInvirtual
~RtWvIn()stk::RtWvIn
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1RtWvIn.html0000644000076600007660000011626312327015205016146 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::RtWvIn Class Reference

STK realtime audio (blocking) input class. More...

#include <RtWvIn.h>

Inheritance diagram for stk::RtWvIn:
stk::WvIn stk::Stk

Public Member Functions

 RtWvIn (unsigned int nChannels=1, StkFloat sampleRate=Stk::sampleRate(), int device=0, int bufferFrames=RT_BUFFER_SIZE, int nBuffers=20)
 Default constructor. More...
 
 ~RtWvIn ()
 Class destructor.
 
void start (void)
 Start the audio input stream. More...
 
void stop (void)
 Stop the audio input stream. More...
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
StkFloat tick (unsigned int channel=0)
 Compute a sample frame and return the specified channel value. More...
 
StkFramestick (StkFrames &frames)
 Fill the StkFrames argument with computed frames and return the same reference. More...
 
- Public Member Functions inherited from stk::WvIn
unsigned int channelsOut (void) const
 Return the number of audio channels in the data or stream.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last computed sample frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK realtime audio (blocking) input class.

This class provides a simplified interface to RtAudio for realtime audio input. It is a subclass of WvIn. This class makes use of RtAudio's callback functionality by creating a large ring-buffer from which data is read. This class should not be used when low-latency is desired.

RtWvIn supports multi-channel data in both interleaved and non-interleaved formats. It is important to distinguish the tick() method that computes a single frame (and returns only the specified sample of a multi-channel frame) from the overloaded one that takes an StkFrames object for multi-channel and/or multi-frame data.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::RtWvIn::RtWvIn ( unsigned int  nChannels = 1,
StkFloat  sampleRate = Stk::sampleRate(),
int  device = 0,
int  bufferFrames = RT_BUFFER_SIZE,
int  nBuffers = 20 
)

Default constructor.

The default device argument value (zero) will select the default input device on your system. The first device enumerated by the underlying audio API is specified with a value of one. The default buffer size of RT_BUFFER_SIZE is defined in Stk.h. An StkError will be thrown if an error occurs duing instantiation.

Member Function Documentation

void stk::RtWvIn::start ( void  )

Start the audio input stream.

The stream is started automatically, if necessary, when a tick() or tickFrame() method is called.

void stk::RtWvIn::stop ( void  )

Stop the audio input stream.

It may be necessary to use this method to avoid audio underflow problems if you wish to temporarily stop audio input.

StkFloat stk::RtWvIn::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed frame.

For multi-channel files, use the lastFrame() function to get all values from the last computed frame. If the device is stopped, the returned value is 0.0. The channel argument must be less than the number of channels in the audio stream (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

112 {
113 #if defined(_STK_DEBUG_)
114  if ( channel >= data_.channels() ) {
115  oStream_ << "RtWvIn::lastOut(): channel argument and audio stream are incompatible!";
116  handleError( StkError::FUNCTION_ARGUMENT );
117  }
118 #endif
119 
120  return lastFrame_[channel];
121 }
StkFloat stk::RtWvIn::tick ( unsigned int  channel = 0)
virtual

Compute a sample frame and return the specified channel value.

For multi-channel files, use the lastFrame() function to get all values from the computed frame. If the device is "stopped", it is "started". The channel argument must be less than the number of channels in the audio stream (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::WvIn.

StkFrames& stk::RtWvIn::tick ( StkFrames frames)
virtual

Fill the StkFrames argument with computed frames and return the same reference.

If the device is "stopped", it is "started". The number of channels in the StkFrames argument must equal the number of channels specified during instantiation. However, this is only checked if STK_DEBUG is defined during compilation, in which case an incompatibility will trigger an StkError exception.

Implements stk::WvIn.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1RtWvIn.png0000644000076600007660000000105212327015205015753 0ustar gary‰PNG  IHDRHˆsÛ]ÁPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2¹IDATxíáNÃ0 /Ÿ¥¾ÿ#ÓvMë¤WX&0ø`Éâ‹íñ3³`’ô>)’¤˜ç¢²†[Ï_Ûß­¯{÷EËÕËý>i{Ño‡¢ýÞ5§æ­¹mI>žˆ¶Œ6aŸÑUoO[»ÌØ ½-j[»öýÖ|\=µ{ÃÞZ«£Þ‡ÝnKò‘´’“"IŠ™EffxÉ0‚Q¢id%š=cLÃDøÔRð‚Ĥ &E1)ˆùï"3³`’ô>)’¤˜+QYÃ/wŽIMü–¨,’ù‡w9Ññk>ÒêZQ=´œ;§6«®ì³h;Úööø¾ÒF­¢S¥Á°}ký”äã,ªuÝl­Þ[u?IÒÏH‘$Åüm‘™Ù^òqÿ²§ii”höŒ1 }àSKÀ R“"€˜Ĥ æ¿‹J)e€÷I@L'š~ýxûve?{_tìÝ-Wo‡ýÈ&ªŸ’¶¸5Ö‚Ñ~ïžS]j³:nõ¢í}W²›Ñz²/ÌõÚ¶v5TQSôYÔ¶v¶Ï E|„¢~vW­Õ˺aw?¼AŠbþ¶¨”Rðó q$…IEND®B`‚stk-4.5.0/doc/html/classstk_1_1RtWvOut-members.html0000644000076600007660000003014112327015205017765 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::RtWvOut Member List

This is the complete list of members for stk::RtWvOut, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
clipStatus(void)stk::WvOutinline
getFrameCount(void) const stk::WvOutinline
getTime(void) const stk::WvOutinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
resetClipStatus(void)stk::WvOutinline
RtWvOut(unsigned int nChannels=1, StkFloat sampleRate=Stk::sampleRate(), int device=0, int bufferFrames=RT_BUFFER_SIZE, int nBuffers=20)stk::RtWvOut
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
start(void)stk::RtWvOut
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stop(void)stk::RtWvOut
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(const StkFloat sample)stk::RtWvOutvirtual
tick(const StkFrames &frames)stk::RtWvOutvirtual
WvOut(void)stk::WvOutinline
~RtWvOut()stk::RtWvOut
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1RtWvOut.html0000644000076600007660000011112712327015205016341 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::RtWvOut Class Reference

STK realtime audio (blocking) output class. More...

#include <RtWvOut.h>

Inheritance diagram for stk::RtWvOut:
stk::WvOut stk::Stk

Public Member Functions

 RtWvOut (unsigned int nChannels=1, StkFloat sampleRate=Stk::sampleRate(), int device=0, int bufferFrames=RT_BUFFER_SIZE, int nBuffers=20)
 Default constructor. More...
 
 ~RtWvOut ()
 Class destructor.
 
void start (void)
 Start the audio output stream. More...
 
void stop (void)
 Stop the audio output stream. More...
 
void tick (const StkFloat sample)
 Output a single sample to all channels in a sample frame. More...
 
void tick (const StkFrames &frames)
 Output the StkFrames data. More...
 
- Public Member Functions inherited from stk::WvOut
 WvOut (void)
 Default constructor.
 
unsigned long getFrameCount (void) const
 Return the number of sample frames output.
 
StkFloat getTime (void) const
 Return the number of seconds of data output.
 
bool clipStatus (void)
 Returns true if clipping has been detected during output since instantiation or the last reset.
 
void resetClipStatus (void)
 Reset the clipping status to false.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK realtime audio (blocking) output class.

This class provides a simplified interface to RtAudio for realtime audio output. It is a subclass of WvOut. This class makes use of RtAudio's callback functionality by creating a large ring-buffer into which data is written. This class should not be used when low-latency is desired.

RtWvOut supports multi-channel data in interleaved format. It is important to distinguish the tick() method that outputs a single sample to all channels in a sample frame from the overloaded one that takes a reference to an StkFrames object for multi-channel and/or multi-frame data.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::RtWvOut::RtWvOut ( unsigned int  nChannels = 1,
StkFloat  sampleRate = Stk::sampleRate(),
int  device = 0,
int  bufferFrames = RT_BUFFER_SIZE,
int  nBuffers = 20 
)

Default constructor.

The default device argument value (zero) will select the default output device on your system. The first device enumerated by the underlying audio API is specified with a value of one. The default buffer size of RT_BUFFER_SIZE is defined in Stk.h. An StkError will be thrown if an error occurs duing instantiation.

Member Function Documentation

void stk::RtWvOut::start ( void  )

Start the audio output stream.

The stream is started automatically, if necessary, when a tick() method is called.

void stk::RtWvOut::stop ( void  )

Stop the audio output stream.

It may be necessary to use this method to avoid undesireable audio buffer cycling if you wish to temporarily stop audio output.

void stk::RtWvOut::tick ( const StkFloat  sample)
virtual

Output a single sample to all channels in a sample frame.

If the device is "stopped", it is "started".

Implements stk::WvOut.

void stk::RtWvOut::tick ( const StkFrames frames)
virtual

Output the StkFrames data.

If the device is "stopped", it is "started". The number of channels in the StkFrames argument must equal the number of channels specified during instantiation. However, this is only checked if STK_DEBUG is defined during compilation, in which case an incompatibility will trigger an StkError exception.

Implements stk::WvOut.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1RtWvOut.png0000644000076600007660000000112112327015205016151 0ustar gary‰PNG  IHDRRˆCWLàPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2àIDATxíÙrì ›C•ÿÿ“¯—ëL”‡T4¡kÚ"ï䜳/dIò$”’äÔif¾~.Â’úøšrÿ}Ä>Qnél9ÙíåÇ–dÆ­²å²ï®†½l–¤™'eÙ;nmgy[ùsá—{Kò(ÇÂ/ÚóIáv\uü«í)…׿´öŒaIš‰ÿqIò!”’äêÌ9gWÞ±øâ¯\w§¿r5z;@ùK:J'B àC(|%€¡ð!”䜳/dIò$”’äÕ2íÃN-¶~¦%ßTî?çùr{÷–€µ¥ù²1åQy,ÚÇI2™¯Þq£,kÆÊ¿”‡ê^i̯•cáói~¢L’ge?š®{UxÍ¥.>)û½,·ã¾ã’ômB)I>üeeÎ9»ðŽÀ岸;ý•«ÑÛùÊ_ÒñP8JB àC(|%€¡x$¥”|!xJ&å:±ó£-\±ÇÍ/”=v¡¬Oo•Û Ë¥jËʦzׯ„›¡jÊMÙri»ë®A2™¯ßÑŸ”¶”~–ûÊS²ÊC5+ªÒ˜Ÿ•cá§öØæ¼T&°ãQÙO©ëî ¯ Lí™®PýjM>6Lð!”>üeeJ)¹ò†­# ¿±·“IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Sampler-members.html0000644000076600007660000003254412327015205020007 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Sampler Member List

This is the complete list of members for stk::Sampler, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)=0stk::Samplerpure virtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::Sampler
keyOn(void)stk::Sampler
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Samplervirtual
noteOn(StkFloat frequency, StkFloat amplitude)=0stk::Instrmntpure virtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
Sampler(void)stk::Sampler
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)=0stk::Samplerpure virtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)=0stk::Samplerpure virtual
tick(StkFrames &frames, unsigned int channel=0)=0stk::Samplerpure virtual
~Sampler(void)stk::Samplervirtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Sampler.html0000644000076600007660000010616012327015205016353 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Sampler Class Referenceabstract

STK sampling synthesis abstract base class. More...

#include <Sampler.h>

Inheritance diagram for stk::Sampler:
stk::Instrmnt stk::Stk stk::Moog

Public Member Functions

 Sampler (void)
 Default constructor.
 
virtual ~Sampler (void)
 Class destructor.
 
virtual void setFrequency (StkFloat frequency)=0
 Set instrument parameters for a particular frequency.
 
void keyOn (void)
 Initiate the envelopes with a key-on event and reset the attack waves.
 
void keyOff (void)
 Signal a key-off event to the envelopes.
 
virtual void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
virtual void controlChange (int number, StkFloat value)=0
 Perform the control change specified by number and value (0.0 - 128.0).
 
virtual StkFloat tick (unsigned int channel=0)=0
 Compute and return one output sample.
 
virtual StkFramestick (StkFrames &frames, unsigned int channel=0)=0
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
virtual void noteOn (StkFloat frequency, StkFloat amplitude)=0
 Start a note with the given frequency and amplitude.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK sampling synthesis abstract base class.

This instrument provides an ADSR envelope, a one-pole filter, and structures for an arbitrary number of attack and looped files.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

virtual StkFrames& stk::Sampler::tick ( StkFrames frames,
unsigned int  channel = 0 
)
pure virtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

Implemented in stk::Moog.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Sampler.png0000644000076600007660000000142112327015205016165 0ustar gary‰PNG  IHDROÀr ιPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2 IDATxííró* —G3¾ÿK>6Æ0Nm¢ÎtÎK«ùÜ ”´13s“$7¦O’Æùè 1ŠþúÓõÅö>öÚ·d;M¹75ÚaIgÜøò)âÖc{̶–¤†{_ÚXïË÷w—ð§|»Ó±ßúê|;õxo½ú¾ªGÊ÷¨F®G=,I óû+IãLŸ$³úÌÌüxÂàˆ³oY|…ξUç*ôöýùúNÀLÀ8Ó0ÎôŒ3}ãL@33G0Ircú$iœÖb”]Ig´ýËø/úÂæZ_Jeloçô6ãª}6Ž7¾}AZ_vƒTFÄ(g;¾¤)’ʧ8§›wkî¨É÷Þ—§ûê|/¾Zþ³/Hetò}çK Õ¸*r-z¾k}%é{¦O’Æù}ff~<áñÿs€8û–ÅWèì[u®Boߟ¯ïô|ÁôŒ3}ãLÀ8Ó0Îôt!GnLÀ8oíÔý­b]:SŸ}±}/üèÛ’>?yÝÙˆÇÌ“kc3Ù“}ûÊié¾:{ãÛÅHï}.:V¾¼©¾Áê**KéëæÛñ嬔q´RÅ®¾:ߺÕy.ç+oºwM=z¾ëýÝä{T#×#•/N”5»Ô÷›ïǧäÿÑÐgúÆÙ>™!„àÀÿ?x€³oY|…ξUç*ôöýùúNÀLÀ8Ó0ÎôŒ3}ãL@3³,ffÀ$É铤qú¾£ìVOIºá™o龜$Ýrñm›ÂúR*Kß6W>šC·¾]#î®Úé=ªGsèŽ/--Ö}òýp¾”Të˲׾:ǯ}A*㼄®èçû;ŠXÝXá{[_Iz‡§ïQ=$é))íù÷J’<øŸ™™ÿá 1Ýqb5$IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Saxofony-members.html0000644000076600007660000003326112327015205020207 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Saxofony Member List

This is the complete list of members for stk::Saxofony, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Saxofonyvirtual
controlChange(int number, StkFloat value)stk::Saxofonyvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Saxofonyvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Saxofonyvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
Saxofony(StkFloat lowestFrequency)stk::Saxofony
setBlowPosition(StkFloat aPosition)stk::Saxofony
setFrequency(StkFloat frequency)stk::Saxofonyvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
startBlowing(StkFloat amplitude, StkFloat rate)stk::Saxofony
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stopBlowing(StkFloat rate)stk::Saxofony
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Saxofonyinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Saxofonyinlinevirtual
~Saxofony(void)stk::Saxofony
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Saxofony.html0000644000076600007660000012166312327015205016563 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Saxofony Class Reference

STK faux conical bore reed instrument class. More...

#include <Saxofony.h>

Inheritance diagram for stk::Saxofony:
stk::Instrmnt stk::Stk

Public Member Functions

 Saxofony (StkFloat lowestFrequency)
 Class constructor, taking the lowest desired playing frequency. More...
 
 ~Saxofony (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setBlowPosition (StkFloat aPosition)
 Set the "blowing" position between the air column terminations (0.0 - 1.0).
 
void startBlowing (StkFloat amplitude, StkFloat rate)
 Apply breath pressure to instrument with given amplitude and rate of increase.
 
void stopBlowing (StkFloat rate)
 Decrease breath pressure with given rate of decrease.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK faux conical bore reed instrument class.

This class implements a "hybrid" digital waveguide instrument that can generate a variety of wind-like sounds. It has also been referred to as the "blowed string" model. The waveguide section is essentially that of a string, with one rigid and one lossy termination. The non-linear function is a reed table. The string can be "blown" at any point between the terminations, though just as with strings, it is impossible to excite the system at either end. If the excitation is placed at the string mid-point, the sound is that of a clarinet. At points closer to the "bridge", the sound is closer to that of a saxophone. See Scavone (2002) for more details.

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others.

Control Change Numbers:

  • Reed Stiffness = 2
  • Reed Aperture = 26
  • Noise Gain = 4
  • Blow Position = 11
  • Vibrato Frequency = 29
  • Vibrato Gain = 1
  • Breath Pressure = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Saxofony::Saxofony ( StkFloat  lowestFrequency)

Class constructor, taking the lowest desired playing frequency.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::Saxofony::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

138 {
139  unsigned int nChannels = lastFrame_.channels();
140 #if defined(_STK_DEBUG_)
141  if ( channel > frames.channels() - nChannels ) {
142  oStream_ << "Saxofony::tick(): channel and StkFrames arguments are incompatible!";
143  handleError( StkError::FUNCTION_ARGUMENT );
144  }
145 #endif
146 
147  StkFloat *samples = &frames[channel];
148  unsigned int j, hop = frames.channels() - nChannels;
149  if ( nChannels == 1 ) {
150  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
151  *samples++ = tick();
152  }
153  else {
154  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
155  *samples++ = tick();
156  for ( j=1; j<nChannels; j++ )
157  *samples++ = lastFrame_[j];
158  }
159  }
160 
161  return frames;
162 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Saxofony.png0000644000076600007660000000111112327015205016364 0ustar gary‰PNG  IHDRVˆJ¼ìšPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ØIDATxímoà „Ïg)ÿÿ'/áÕ$¤i#èÕ›¯?€Íúªªã%ÉÑrì?b%˜™¯?7IkŸbÃ8úîb·cmg³ˆ4Ø»I6ö[ΙJ`Ü$yÔklÊoÓKm_TáªÝüt‰›Ø¶–Ý-‚µÞK¸Ó²T„ܰҲÖM’Gùw‚cŠUU.xW Œ×ì²LáÎÁ®ÔÜI؇½Ç:Ö±ŽPͱŽuì`UUÇ J’£åØïb%˜’¬¶Ÿ÷üßÁʆ\?,9Œ·@ oŽðVÅhð÷±q]J³S!­%N0=Ç&šYSÎTûM…ëá[ŸbÛ"°íoc…´Ö)Â-lºenØ‘TÚÕÞ¾’"Ç:v6VUu¸à]-0^s°Ë2…;»Rgp'aöëXÇ:@5Ç:Ö±?€/Œ–c¿†]'í|k*tt¹Â†ñIöË[Vì¶yzp%£B4oœ—–Ïxò,‹iÁR8¦¼Y`ÿÄ}Ï[×ô*Xvé`[Ï¡læ¥;_`ë*Å¡mÙUÊð€ÀZ›faÓsViY¬Ix"ÍKH›´OÀœgäÙ¬mÊ8¬!ùã±""Ãõœ($ß1IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Shakers-members.html0000644000076600007660000003124312327015205017777 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Shakers Member List

This is the complete list of members for stk::Shakers, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::Shakersvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Shakersvirtual
noteOn(StkFloat instrument, StkFloat amplitude)stk::Shakersvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Instrmntinlinevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
Shakers(int type=0)stk::Shakers
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Shakersinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Shakersinlinevirtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Shakers.html0000644000076600007660000011642512327015205016355 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Shakers Class Reference

PhISEM and PhOLIES class. More...

#include <Shakers.h>

Inheritance diagram for stk::Shakers:
stk::Instrmnt stk::Stk

Public Member Functions

 Shakers (int type=0)
 Class constructor taking instrument type argument.
 
void noteOn (StkFloat instrument, StkFloat amplitude)
 Start a note with the given instrument and amplitude. More...
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

PhISEM and PhOLIES class.

PhISEM (Physically Informed Stochastic Event Modeling) is an algorithmic approach for simulating collisions of multiple independent sound producing objects. This class is a meta-model that can simulate a Maraca, Sekere, Cabasa, Bamboo Wind Chimes, Water Drops, Tambourine, Sleighbells, and a Guiro.

PhOLIES (Physically-Oriented Library of Imitated Environmental Sounds) is a similar approach for the synthesis of environmental sounds. This class implements simulations of breaking sticks, crunchy snow (or not), a wrench, sandpaper, and more.

Control Change Numbers:

  • Shake Energy = 2
  • System Decay = 4
  • Number Of Objects = 11
  • Resonance Frequency = 1
  • Shake Energy = 128
  • Instrument Selection = 1071
  • Maraca = 0
  • Cabasa = 1
  • Sekere = 2
  • Tambourine = 3
  • Sleigh Bells = 4
  • Bamboo Chimes = 5
  • Sand Paper = 6
  • Coke Can = 7
  • Sticks = 8
  • Crunch = 9
  • Big Rocks = 10
  • Little Rocks = 11
  • Next Mug = 12
  • Penny + Mug = 13
  • Nickle + Mug = 14
  • Dime + Mug = 15
  • Quarter + Mug = 16
  • Franc + Mug = 17
  • Peso + Mug = 18
  • Guiro = 19
  • Wrench = 20
  • Water Drops = 21
  • Tuned Bamboo Chimes = 22

by Perry R. Cook with updates by Gary Scavone, 1995–2014.

Member Function Documentation

void stk::Shakers::noteOn ( StkFloat  instrument,
StkFloat  amplitude 
)
virtual

Start a note with the given instrument and amplitude.

Use the instrument numbers above, converted to frequency values as if MIDI note numbers, to select a particular instrument.

Implements stk::Instrmnt.

StkFrames & stk::Shakers::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

304 {
305  unsigned int nChannels = lastFrame_.channels();
306 #if defined(_STK_DEBUG_)
307  if ( channel > frames.channels() - nChannels ) {
308  oStream_ << "Shakers::tick(): channel and StkFrames arguments are incompatible!";
309  handleError( StkError::FUNCTION_ARGUMENT );
310  }
311 #endif
312 
313  StkFloat *samples = &frames[channel];
314  unsigned int j, hop = frames.channels() - nChannels;
315  if ( nChannels == 1 ) {
316  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
317  *samples++ = tick();
318  }
319  else {
320  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
321  *samples++ = tick();
322  for ( j=1; j<nChannels; j++ )
323  *samples++ = lastFrame_[j];
324  }
325  }
326 
327  return frames;
328 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Shakers.png0000644000076600007660000000113612327015205016165 0ustar gary‰PNG  IHDROˆ‘F¸PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2íIDATxíÑnì Dƒ”ÿÿä›–BrÖ•*•ÖS oµ¯Ä££ˆ’ä¦É“¤qÝòB 3_:éQ^ï¹×¼í"ÛmìÞx gÞ²øy+ÎèÍûõý<€/4yãš<€qMÀ¸&`\“ÐQ!8Šà¦ÉWÃ['õ|ëX“»½Á=/Û3ò¶‹äÏOÙPj©º×Ëûd'ìCËÛ¥¨ögåŒYQ–w°¼¼º1g÷ÚóÂo‡g/–ÛS¼½:û5–«Lm´ñkÞ¸ãׯ=¯ºsõhý~Î>zX¿ýV)SÞ±ïà[MÀ¸þ /„üôÓä!µpÔ´WIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Simple-members.html0000644000076600007660000003247212327015205017635 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Simple Member List

This is the complete list of members for stk::Simple, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::Simplevirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::Simple
keyOn(void)stk::Simple
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Simplevirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Simplevirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Simplevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
Simple(void)stk::Simple
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Simpleinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Simpleinlinevirtual
~Simple(void)stk::Simple
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Simple.html0000644000076600007660000011707312327015205016206 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Simple Class Reference

STK wavetable/noise instrument. More...

#include <Simple.h>

Inheritance diagram for stk::Simple:
stk::Instrmnt stk::Stk

Public Member Functions

 Simple (void)
 Class constructor. More...
 
 ~Simple (void)
 Class destructor.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void keyOn (void)
 Start envelope toward "on" target.
 
void keyOff (void)
 Start envelope toward "off" target.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK wavetable/noise instrument.

This class combines a looped wave, a noise source, a biquad resonance filter, a one-pole filter, and an ADSR envelope to create some interesting sounds.

Control Change Numbers:

  • Filter Pole Position = 2
  • Noise/Pitched Cross-Fade = 4
  • Envelope Rate = 11
  • Gain = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Simple::Simple ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::Simple::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

98 {
99  unsigned int nChannels = lastFrame_.channels();
100 #if defined(_STK_DEBUG_)
101  if ( channel > frames.channels() - nChannels ) {
102  oStream_ << "Simple::tick(): channel and StkFrames arguments are incompatible!";
103  handleError( StkError::FUNCTION_ARGUMENT );
104  }
105 #endif
106 
107  StkFloat *samples = &frames[channel];
108  unsigned int j, hop = frames.channels() - nChannels;
109  if ( nChannels == 1 ) {
110  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
111  *samples++ = tick();
112  }
113  else {
114  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
115  *samples++ = tick();
116  for ( j=1; j<nChannels; j++ )
117  *samples++ = lastFrame_[j];
118  }
119  }
120 
121  return frames;
122 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Simple.png0000644000076600007660000000112412327015205016013 0ustar gary‰PNG  IHDRLˆz0ý»PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ãIDATxíÑŽã E©ÿÿÉ“B %M<ãÕŽvúV`ðÛ©úJÎ9{‰,I> ˜$Ùô –Šuó噸¿+ãÍgƒ­WXïÑÖÁÙ} kç—¸=¶$Ù¹%iÐ%¬FA­fóe×¶Zü=l[­›ûi’z«ÑÅúÕ3¬2º\ÚùÇò騡4cš×°¶ü 6¦ùÉ7°$õ6IÓ«yìåoÅŸÁNÝ”¤Ÿ*`’dÓÿË9g'<ÐßøG¸ÕëåHó„-,?š+ìw3`F À¦€Ø0›`SÀú'¥”¼DðQÀlz‡-óÁUºtòµ@g·°2žßþ3l½B}[šw_]Xûe·kO`ÛÖ=ªEnÊ9Åê¡Ç†+X‹«6žÔu ;¢æuœÁj{¦ èÓ ·nt[³S ö f5ͽü­“šÝwà‘®Bþ1ÀL°i}ÿRJÉG_© w¥U©§IEND®B`‚stk-4.5.0/doc/html/classstk_1_1SineWave-members.html0000644000076600007660000003106712327015205020124 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::SineWave Member List

This is the complete list of members for stk::SineWave, including all inherited members.

addPhase(StkFloat phase)stk::SineWave
addPhaseOffset(StkFloat phaseOffset)stk::SineWave
addSampleRateAlert(Stk *ptr)stk::Stkprotected
addTime(StkFloat time)stk::SineWave
channelsOut(void) const stk::Generatorinline
Generator(void)stk::Generatorinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Generatorinline
lastOut(void) const stk::SineWaveinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
reset(void)stk::SineWave
sampleRate(void)stk::Stkinlinestatic
setFrequency(StkFloat frequency)stk::SineWave
setRate(StkFloat rate)stk::SineWaveinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
SineWave(void)stk::SineWave
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(void)stk::SineWaveinline
tick(StkFrames &frames, unsigned int channel=0)stk::SineWaveinlinevirtual
~SineWave(void)stk::SineWave
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1SineWave.html0000644000076600007660000012136212327015205016472 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::SineWave Class Reference

STK sinusoid oscillator class. More...

#include <SineWave.h>

Inheritance diagram for stk::SineWave:
stk::Generator stk::Stk

Public Member Functions

 SineWave (void)
 Default constructor.
 
 ~SineWave (void)
 Class destructor.
 
void reset (void)
 Clear output and reset time pointer to zero.
 
void setRate (StkFloat rate)
 Set the data read rate in samples. The rate can be negative. More...
 
void setFrequency (StkFloat frequency)
 Set the data interpolation rate based on a looping frequency. More...
 
void addTime (StkFloat time)
 Increment the read pointer by time in samples, modulo the table size.
 
void addPhase (StkFloat phase)
 Increment the read pointer by a normalized phase value. More...
 
void addPhaseOffset (StkFloat phaseOffset)
 Add a normalized phase offset to the read pointer. More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (void)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK sinusoid oscillator class.

This class computes and saves a static sine "table" that can be shared by multiple instances. It has an interface similar to the WaveLoop class but inherits from the Generator class. Output values are computed using linear interpolation.

The "table" length, set in SineWave.h, is 2048 samples by default.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::SineWave::setRate ( StkFloat  rate)
inline

Set the data read rate in samples. The rate can be negative.

If the rate value is negative, the data is read in reverse order.

41 { rate_ = rate; };
void stk::SineWave::setFrequency ( StkFloat  frequency)

Set the data interpolation rate based on a looping frequency.

This function determines the interpolation rate based on the file size and the current Stk::sampleRate. The frequency value corresponds to file cycles per second. The frequency can be negative, in which case the loop is read in reverse order.

void stk::SineWave::addPhase ( StkFloat  phase)

Increment the read pointer by a normalized phase value.

This function increments the read pointer by a normalized phase value, such that phase = 1.0 corresponds to a 360 degree phase shift. Positive or negative values are possible.

void stk::SineWave::addPhaseOffset ( StkFloat  phaseOffset)

Add a normalized phase offset to the read pointer.

A phaseOffset = 1.0 corresponds to a 360 degree phase offset. Positive or negative values are possible.

StkFrames & stk::SineWave::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

121 {
122 #if defined(_STK_DEBUG_)
123  if ( channel >= frames.channels() ) {
124  oStream_ << "SineWave::tick(): channel and StkFrames arguments are incompatible!";
125  handleError( StkError::FUNCTION_ARGUMENT );
126  }
127 #endif
128 
129  StkFloat *samples = &frames[channel];
130  StkFloat tmp = 0.0;
131 
132  unsigned int hop = frames.channels();
133  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
134 
135  // Check limits of time address ... if necessary, recalculate modulo
136  // TABLE_SIZE.
137  while ( time_ < 0.0 )
138  time_ += TABLE_SIZE;
139  while ( time_ >= TABLE_SIZE )
140  time_ -= TABLE_SIZE;
141 
142  iIndex_ = (unsigned int) time_;
143  alpha_ = time_ - iIndex_;
144  tmp = table_[ iIndex_ ];
145  tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) );
146  *samples = tmp;
147 
148  // Increment time, which can be negative.
149  time_ += rate_;
150  }
151 
152  lastFrame_[0] = tmp;
153  return frames;
154 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1SineWave.png0000644000076600007660000000120712327015205016305 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IDATxía¤ DEâÿÿɧˆØí½Iïer=©Êj ¬fýL­µÆ˜*IN´$«‹.Mæ~ýMÊ’äüst»ÞkŸ ·ím{´˜~q-K’÷-zì­QR‹Ã”%iæ'tgxÄÈú6‘ç@¦Œþ2 } “6~ˆÕì„üm{ GG}Y’fÎoˆ$«DK²úZt­µ†à}/1ŽC/K;½’£Øè/=!‰œ X%°J4`•hÀ*Ñ€U¢«ÿ]k­1¦JR„-Éê÷Ð¥ÉÖŸ$=y2èÝnÞaߢ·Ým[´ôs¾ùõé¾XÿÓ]Õ¢wbÓyY£MåæóúR½¢ÏéŽèâb¼V} 3t/ºzspžÐ>+ÚçâczÚu‘¬\"w¼îM<ègfœ“¿áNH~C$éʼn–dõµèZk 1Àû^b‡^–0vz%G±Ñ_zB 8%°J4`•hÀ*Ñ€U¢«DVÿº”RbLˆp¢«ßC¯7þ~kô¥ÖÇ Ì|n׳é?CoÛë‡qLÏÚÀ}¡ñþ²³è¸3Îí÷qmÕ³h‡»ÑîU,úd¸´§S·yæoÑ'㚟ÛàþìЦr>¿´ÑâÛèwåéÞÃõu–õ¥/hGôwk6^²'àd߸ó.¿!/N4`õµèRJ ñ—|&>ïIEND®B`‚stk-4.5.0/doc/html/classstk_1_1SingWave-members.html0000644000076600007660000003541312327015205020125 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::SingWave Member List

This is the complete list of members for stk::SingWave, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Generatorinline
Generator(void)stk::Generatorinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Generatorinline
lastOut(void) const stk::SingWaveinline
normalize(void)stk::SingWaveinline
normalize(StkFloat peak)stk::SingWaveinline
noteOff(void)stk::SingWaveinline
noteOn(void)stk::SingWaveinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
reset(void)stk::SingWaveinline
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::SingWave
setGainRate(StkFloat rate)stk::SingWaveinline
setGainTarget(StkFloat target)stk::SingWaveinline
setRandomGain(StkFloat gain)stk::SingWaveinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setSweepRate(StkFloat rate)stk::SingWaveinline
setVibratoGain(StkFloat gain)stk::SingWaveinline
setVibratoRate(StkFloat rate)stk::SingWaveinline
showWarnings(bool status)stk::Stkinlinestatic
SingWave(std::string fileName, bool raw=false)stk::SingWave
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(void)stk::SingWaveinline
tick(StkFrames &frames, unsigned int channel=0)stk::SingWaveinlinevirtual
~SingWave(void)stk::SingWave
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1SingWave.html0000644000076600007660000012156412327015205016500 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::SingWave Class Reference

STK "singing" looped soundfile class. More...

#include <SingWave.h>

Inheritance diagram for stk::SingWave:
stk::Generator stk::Stk

Public Member Functions

 SingWave (std::string fileName, bool raw=false)
 Class constructor taking filename argument. More...
 
 ~SingWave (void)
 Class destructor.
 
void reset (void)
 Reset file to beginning.
 
void normalize (void)
 Normalize the file to a maximum of +-1.0.
 
void normalize (StkFloat peak)
 Normalize the file to a maximum of +- peak.
 
void setFrequency (StkFloat frequency)
 Set looping parameters for a particular frequency.
 
void setVibratoRate (StkFloat rate)
 Set the vibrato frequency in Hz.
 
void setVibratoGain (StkFloat gain)
 Set the vibrato gain.
 
void setRandomGain (StkFloat gain)
 Set the random-ness amount.
 
void setSweepRate (StkFloat rate)
 Set the sweep rate.
 
void setGainRate (StkFloat rate)
 Set the gain rate.
 
void setGainTarget (StkFloat target)
 Set the gain target value.
 
void noteOn (void)
 Start a note.
 
void noteOff (void)
 Stop a note.
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (void)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Generator
 Generator (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK "singing" looped soundfile class.

This class loops a specified soundfile and modulates it both periodically and randomly to produce a pitched musical sound, like a simple voice or violin. In general, it is not be used alone because of "munchkinification" effects from pitch shifting. Within STK, it is used as an excitation source for other instruments.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::SingWave::SingWave ( std::string  fileName,
bool  raw = false 
)

Class constructor taking filename argument.

An StkError will be thrown if the file is not found, its format is unknown, or a read error occurs. If the soundfile has no header, the second argument should be true and the file data will be assumed to consist of 16-bit signed integers in big-endian byte order at a sample rate of 22050 Hz.

Member Function Documentation

StkFrames & stk::SingWave::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Generator.

118 {
119 #if defined(_STK_DEBUG_)
120  if ( channel >= frames.channels() ) {
121  oStream_ << "SingWave::tick(): channel and StkFrames arguments are incompatible!";
122  handleError( StkError::FUNCTION_ARGUMENT );
123  }
124 #endif
125 
126  StkFloat *samples = &frames[channel];
127  unsigned int hop = frames.channels();
128  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
129  *samples = SingWave::tick();
130 
131  return frames;
132 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1SingWave.png0000644000076600007660000000122412327015205016306 0ustar gary‰PNG  IHDRZˆP€ PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2#IDATxí᮳ DCâû?ò§ˆ°k‰ÚÛp¿4w›™T·pÀYêorÎyŽÉ’4ÖdõÑ©ÈܯŸAY’œßG—ë½ö zÛÞ¶G‹©ç²$y_¢ÛÞ å •8LY’F¾CW†G´¬/¹dȨóÚ2hã'XNÈOÛX9šØÚèË’4r¼C$YZ’Õ×¢sÎyŠž{˜ãyèe™Æž‡^ɳØÑ_zB 8° 4`hÀ*ЀU «@VsÎsL–¤´$«ßC§"[X?’tçÁ t¹y¾Do»Û¶hé}¾ùõ×}±úU]Õ¢wbÑyY£Lnåâ~}ªžÑ}º#z€ƒ¸ÏUÈ]‹n…ÚÜ#œ;´äŒö¹ø˜îv$+—ÈU Ð5£‰ÇõÌ´bòw#Ü ‰wˆ$½8Ð’¬¾sÎS ðÜ ÀÏC/Ë4ö<ôJžÅžˆþÒhÀ)ЀU «@V¬ X°ú è”RšcÀ °ú=ôzãï·FŸju\3ÀÈ×èr=šþzÛ^=ŒmBû­ Üj#šÛƒõ;‡ÞÇý:®¬Úôß ÓÑáÒNÝæ™'¾DwÆ9?·Áºµºæqlm ¾ƒ]½\´ _Ú˜Àê]Û9\ã*cíÖÆSÖÇÃ8ÞqýîçÿƇ3ÞEßýO>y‡ô¸r¼T«¯E§”Òÿ¦M&e³ [IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Sitar-members.html0000644000076600007660000003210512327015205017457 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Sitar Member List

This is the complete list of members for stk::Sitar, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Sitarvirtual
controlChange(int number, StkFloat value)stk::Instrmntinlinevirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Sitarvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Sitarvirtual
pluck(StkFloat amplitude)stk::Sitar
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Sitarvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
Sitar(StkFloat lowestFrequency=8.0)stk::Sitar
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Sitarinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Sitarinlinevirtual
~Sitar(void)stk::Sitar
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Sitar.html0000644000076600007660000011424112327015205016031 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Sitar Class Reference

STK sitar string model class. More...

#include <Sitar.h>

Inheritance diagram for stk::Sitar:
stk::Instrmnt stk::Stk

Public Member Functions

 Sitar (StkFloat lowestFrequency=8.0)
 Class constructor, taking the lowest desired playing frequency.
 
 ~Sitar (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void pluck (StkFloat amplitude)
 Pluck the string with the given amplitude using the current frequency.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK sitar string model class.

This class implements a sitar plucked string physical model based on the Karplus-Strong algorithm.

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. There exist at least two patents, assigned to Stanford, bearing the names of Karplus and/or Strong.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

StkFrames & stk::Sitar::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

100 {
101  unsigned int nChannels = lastFrame_.channels();
102 #if defined(_STK_DEBUG_)
103  if ( channel > frames.channels() - nChannels ) {
104  oStream_ << "Sitar::tick(): channel and StkFrames arguments are incompatible!";
105  handleError( StkError::FUNCTION_ARGUMENT );
106  }
107 #endif
108 
109  StkFloat *samples = &frames[channel];
110  unsigned int j, hop = frames.channels() - nChannels;
111  if ( nChannels == 1 ) {
112  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
113  *samples++ = tick();
114  }
115  else {
116  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
117  *samples++ = tick();
118  for ( j=1; j<nChannels; j++ )
119  *samples++ = lastFrame_[j];
120  }
121  }
122 
123  return frames;
124 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Sitar.png0000644000076600007660000000110112327015205015637 0ustar gary‰PNG  IHDRLˆz0ý»PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÐIDATxíán³0 EOn$Þÿ‘!@’¦-î<}•>Sß)Øø¯Û_rÎÙKdIòQÀ$ɦW°T¢¹_¯Iú#XYï9lÛ¶¶±.Æô[ØùþÒwô“MZ’:=…Õ®¾é<³¹Ï6§]uÃ&Xos2›Í6fÓ¼?€jó8þs}Z’:ÅwS’l ˜$Ù´ÂrÎÙI7´xɶ,Ž4OØÊò£¹Â¾xš0*`6 À¦€Ø0›Ö^9çì%²$ù(`’dÓK%Ú[IWŒ÷Cþ`i­?Z^Yo…«¼%ʧ<µWK¾…íÕúp{›¤6jw‰¶:Â*£ñr¾ÿ*¯êަ·ùv–ïÁz›°žü–¤6&6 °êã8þÇþóðg°aš’ô[L’lú`9çì$€úÿÑÞjYiž°•åGs…}ñ4`TÀl €M°)`6¬½RJÉK$ À¦'°5Ùå˨Ó@÷`e½'l°m õWæ,‹5{”g½“ı½û*¶É×°ÚÕ†3;€Às›X·­s@³´6û 6.^Ù0€`ÕæqüÆfÃŽï&Àg €MåJJ)¹è5® WþõÆIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Skini-members.html0000644000076600007660000002560312327015205017457 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Skini Member List

This is the complete list of members for stk::Skini, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
nextMessage(Skini::Message &message)stk::Skini
parseString(std::string &line, Skini::Message &message)stk::Skini
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFile(std::string fileName)stk::Skini
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
Skini()stk::Skini
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
whatsThisController(long number)stk::Skinistatic
whatsThisType(long type)stk::Skinistatic
~Skini()stk::Skini
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Skini.html0000644000076600007660000007444712327015205016041 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


STK SKINI parsing class. More...

#include <Skini.h>

Inheritance diagram for stk::Skini:
stk::Stk

Classes

struct  Message
 A message structure to store and pass parsed SKINI messages. More...
 

Public Member Functions

 Skini ()
 Default constructor.
 
 ~Skini ()
 Class destructor.
 
bool setFile (std::string fileName)
 Set a SKINI formatted file for reading. More...
 
long nextMessage (Skini::Message &message)
 Parse the next file message (if a file is loaded) and return the message type. More...
 
long parseString (std::string &line, Skini::Message &message)
 Attempt to parse the given string and returning the message type. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Static Public Member Functions

static std::string whatsThisType (long type)
 Return the SKINI type string for the given type value.
 
static std::string whatsThisController (long number)
 Return the SKINI controller string for the given controller number.
 
- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 

Additional Inherited Members

- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK SKINI parsing class.

This class parses SKINI formatted text messages. It can be used to parse individual messages or it can be passed an entire file. The SKINI specification is Perry's and his alone, but it's all text so it shouldn't be too hard to figure out.

SKINI (Synthesis toolKit Instrument Network Interface) is like MIDI, but allows for floating-point control changes, note numbers, etc. The following example causes a sharp middle C to be played with a velocity of 111.132:

noteOn 60.01 111.132
See Also
Synthesis toolKit Instrument Network Interface (SKINI)

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

bool stk::Skini::setFile ( std::string  fileName)

Set a SKINI formatted file for reading.

If the file is successfully opened, this function returns true. Otherwise, false is returned.

long stk::Skini::nextMessage ( Skini::Message message)

Parse the next file message (if a file is loaded) and return the message type.

This function skips over lines in a file which cannot be parsed. A type value equal to zero in the referenced message structure (and the returned value) indicates the file end is reached or no file is open for reading.

long stk::Skini::parseString ( std::string &  line,
Skini::Message message 
)

Attempt to parse the given string and returning the message type.

A type value equal to zero in the referenced message structure indicates an invalid message.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Skini.png0000644000076600007660000000057212327015205015645 0ustar gary‰PNG  IHDR<PræaPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2 IDATxíÑŠÄ EOúÿŸ¼££1ºVÆôaØEñ‚ÆsMé;1Æè1„|:ð{Hžfÿ“ðGp^¿ck8•HulbYŒá_°ÞŸójn6mÂ÷pÉê ê›ûðÄö$K -áÞö¤akÛvκ}ß°b»¶KÖ‡ÏBý]8ÆXèðê |]è'ð‹õÓà/vûÀ;:0À† °¡lèÂ""^!>8mú}jiµ“²ZÃy=^8«œJ”O§¹zÖ¦qÒ`{ÞÊåTÓ´nçÝ«õŽzáäÍÕÏ›Øîm ³OY¾yh˜€ Ûµ†6L»Ûbwßàs`C_…EDœúª² ¥þ¶ºaIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Socket-members.html0000644000076600007660000003044212327015205017627 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Socket Member List

This is the complete list of members for stk::Socket, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
close(int socket)stk::Socketstatic
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
id(void) const stk::Socketinline
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
isValid(int socket)stk::Socketinlinestatic
port(void) const stk::Socketinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
readBuffer(void *buffer, long bufferSize, int flags=0)=0stk::Socketpure virtual
readBuffer(int socket, void *buffer, long bufferSize, int flags)stk::Socketstatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setBlocking(int socket, bool enable)stk::Socketstatic
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Socket()stk::Socket
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
writeBuffer(const void *buffer, long bufferSize, int flags=0)=0stk::Socketpure virtual
writeBuffer(int socket, const void *buffer, long bufferSize, int flags)stk::Socketstatic
~Socket()stk::Socketvirtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Socket.html0000644000076600007660000007352612327015205016211 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


STK internet socket abstract base class. More...

#include <Socket.h>

Inheritance diagram for stk::Socket:
stk::Stk stk::TcpClient stk::TcpServer stk::UdpSocket

Public Member Functions

 Socket ()
 Class constructor.
 
virtual ~Socket ()
 Class destructor.
 
int id (void) const
 Return the socket descriptor.
 
int port (void) const
 Return the socket port number.
 
virtual int writeBuffer (const void *buffer, long bufferSize, int flags=0)=0
 Write a buffer over the socket connection. Returns the number of bytes written or -1 if an error occurs.
 
virtual int readBuffer (void *buffer, long bufferSize, int flags=0)=0
 Read an input buffer, up to length bufferSize. Returns the number of bytes read or -1 if an error occurs.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Static Public Member Functions

static void close (int socket)
 Close the socket.
 
static bool isValid (int socket)
 Returns true if the socket descriptor is valid.
 
static void setBlocking (int socket, bool enable)
 If enable = false, the socket is set to non-blocking mode. When first created, sockets are by default in blocking mode.
 
static int writeBuffer (int socket, const void *buffer, long bufferSize, int flags)
 Write a buffer via the specified socket. Returns the number of bytes written or -1 if an error occurs.
 
static int readBuffer (int socket, void *buffer, long bufferSize, int flags)
 Read a buffer via the specified socket. Returns the number of bytes read or -1 if an error occurs.
 
- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 

Additional Inherited Members

- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK internet socket abstract base class.

This class provides common functionality for TCP and UDP internet socket server and client subclasses. This class also provides a number of static functions for use with external socket descriptors.

by Perry R. Cook and Gary P. Scavone, 1995–2014.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Socket.png0000644000076600007660000000223512327015205016016 0ustar gary‰PNG  IHDR+ˆˆ…=rPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2,IDATxíÝ’³: ›qïÿÈg—_œÍ°ßa/¤è ‚âF·A)¥ÜÀQ$é&âJ’<âJ’<âJ’<âJ’<žçj˜¶êøëÓ KÒÇ»šöçX\5%4•QãeÙ9†%éÈ“\mÕ3iYÕLX…%©ÏÃ\-RZ'Û¼zÓ„ëÁ®”¥Üâª×†»•f¶§;óê0ÛÏaI:òÀ\'û6ÛÛ°$õyXJÒ¯‰+Iòˆ+Iòˆ+Iòˆ+Iòˆ+Iòˆ+Iòˆ+Iòø8W¥”reo‰+‹qŒ,‡¸°øRYqàSqàWqàWqàWqàWqàWqàWqàWqàWqàWqàWqàWqàWÏv5 ÃpÄë‰+¸ðˆ+¸ðxŠ«¯xsªûZk¯hx¨«iÿtm\}ÐwÕºö¹¼æ¯åŠé SwŸïj0míò5R]qjÙç¸Zßž[+©ò²ÔØs]mRNMUTíjžûíu¶³ýàjëÁ‡Îöêí¥«æ¢g÷àZ3û»®zîïÁ¹Y«éÿ´øˆ+¸ðˆ+¸ðˆ+¸ðˆ+s5 Ãpeo‰+‹qŒ,‡¸°øRYqàSqàWqàWqàWqàWájÇñƒ¸?zà‘&®<â À#®<â À#®<â À#®<â À#®<â À#®<â À#®<žíª”R|ÆRJñù°4E’n¢^„$ÝÄŸ¥‰+Irˆ+Iòˆ+Iòˆ+Iò8»¦m;š?’Ô°Û‹·¼[„•£›W’Nxiæý%pH/I Md9xçêø³CÚ—ç.-¢{Ÿze’ôÿ䪟筫o¿ß’}µ?í¯åÔü›údý”:‹øEŽù†ß?YãUèBšÍÊïç©f:XWT»šÏÏw©žÊžbù 'W/Nöáç˜W²E÷pº¦j†YA/Ïöµ%éÖÕö›¶¥ûÚթ컋0s¬«$¨/¤©Gu—6Ïú'š§÷¢åjŽ+?Ǿڭ+¶Ç]‡ü4/]užôÖëÂγ½.ÜkuÕ9ùbè^ÉQÝ®vuÀfš¾«Nô˜¨ßƒõv‰ÍІj»ÐƒfŽÃö¶2{ðœ¦?¯^<­¨Óƒ«Òfî¶ï¨¹:ÏïÁcÙ¿l'Ç’bé/|߃‡4û«÷à)O»–júzP’~¢2’ô3Ýæ¤Ÿ¸˜ã·i®ç‰+Iòˆ+Iò¸èJ’.ð»EHÒ%þ,M\I’C\I’G\I’G\I’Ç—«RJ¹‹j¥”r”æ?qOçùÕSïIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Sphere-members.html0000644000076600007660000003125212327015205017625 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Sphere Member List

This is the complete list of members for stk::Sphere, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
addVelocity(StkFloat x, StkFloat y, StkFloat z)stk::Sphere
getMass(void)stk::Sphereinline
getPosition(void)stk::Sphereinline
getRadius(void)stk::Sphereinline
getRelativePosition(Vector3D *position)stk::Sphere
getVelocity(Vector3D *velocity)stk::Sphere
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
isInside(Vector3D *position)stk::Sphere
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setMass(StkFloat mass)stk::Sphereinline
setPosition(StkFloat x, StkFloat y, StkFloat z)stk::Sphereinline
setRadius(StkFloat radius)stk::Sphereinline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setVelocity(StkFloat x, StkFloat y, StkFloat z)stk::Sphereinline
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Sphere(StkFloat radius=1.0)stk::Sphereinline
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat timeIncrement)stk::Sphereinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Sphere.html0000644000076600007660000007427412327015205016210 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Sphere Class Reference

STK sphere class. More...

#include <Sphere.h>

Inheritance diagram for stk::Sphere:
stk::Stk

Public Member Functions

 Sphere (StkFloat radius=1.0)
 Constructor taking an initial radius value.
 
void setPosition (StkFloat x, StkFloat y, StkFloat z)
 Set the 3D center position of the sphere.
 
void setVelocity (StkFloat x, StkFloat y, StkFloat z)
 Set the 3D velocity of the sphere.
 
void setRadius (StkFloat radius)
 Set the radius of the sphere.
 
void setMass (StkFloat mass)
 Set the mass of the sphere.
 
Vector3DgetPosition (void)
 Get the current position of the sphere as a 3D vector.
 
Vector3DgetRelativePosition (Vector3D *position)
 Get the relative position of the given point to the sphere as a 3D vector.
 
StkFloat getVelocity (Vector3D *velocity)
 Set the velcoity of the sphere as a 3D vector.
 
StkFloat isInside (Vector3D *position)
 Returns the distance from the sphere boundary to the given position (< 0 if inside).
 
StkFloat getRadius (void)
 Get the current sphere radius.
 
StkFloat getMass (void)
 Get the current sphere mass.
 
void addVelocity (StkFloat x, StkFloat y, StkFloat z)
 Increase the current sphere velocity by the given 3D components.
 
void tick (StkFloat timeIncrement)
 Move the sphere for the given time increment.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK sphere class.

This class implements a spherical ball with radius, mass, position, and velocity parameters.

by Perry R. Cook, 1995–2014.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Sphere.png0000644000076600007660000000067212327015205016017 0ustar gary‰PNG  IHDRJP‰C¾PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2IIDATxí[ŽÄ ËFšûy^„Lœ•?v%hñnþI)%‘TU=(UU›¾ $·a¾ýË¿@åqY{ƒÚßsÃêà¼ü€êg稙í ˪:µ;T™Cz­–ï .cj²/P³ÁEÙßÛê­e¯[Ñ{ÙçeUZ^Ýàê8èzƒ·2½ˆÿŒxT lÚ?>ýY¡Î12cIEND®B`‚stk-4.5.0/doc/html/classstk_1_1StifKarp-members.html0000644000076600007660000003366412327015205020133 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::StifKarp Member List

This is the complete list of members for stk::StifKarp, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::StifKarpvirtual
controlChange(int number, StkFloat value)stk::StifKarpvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::StifKarpvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::StifKarpvirtual
pluck(StkFloat amplitude)stk::StifKarp
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setBaseLoopGain(StkFloat aGain)stk::StifKarp
setFrequency(StkFloat frequency)stk::StifKarpvirtual
setPickupPosition(StkFloat position)stk::StifKarp
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setStretch(StkFloat stretch)stk::StifKarp
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
StifKarp(StkFloat lowestFrequency=8.0)stk::StifKarp
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::StifKarpinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::StifKarpinlinevirtual
~StifKarp(void)stk::StifKarp
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1StifKarp.html0000644000076600007660000012142312327015205016472 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::StifKarp Class Reference

STK plucked stiff string instrument. More...

#include <StifKarp.h>

Inheritance diagram for stk::StifKarp:
stk::Instrmnt stk::Stk

Public Member Functions

 StifKarp (StkFloat lowestFrequency=8.0)
 Class constructor, taking the lowest desired playing frequency.
 
 ~StifKarp (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setStretch (StkFloat stretch)
 Set the stretch "factor" of the string (0.0 - 1.0).
 
void setPickupPosition (StkFloat position)
 Set the pluck or "excitation" position along the string (0.0 - 1.0).
 
void setBaseLoopGain (StkFloat aGain)
 Set the base loop gain. More...
 
void pluck (StkFloat amplitude)
 Pluck the string with the given amplitude using the current frequency.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK plucked stiff string instrument.

This class implements a simple plucked string algorithm (Karplus Strong) with enhancements (Jaffe-Smith, Smith, and others), including string stiffness and pluck position controls. The stiffness is modeled with allpass filters.

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others.

Control Change Numbers:

  • Pickup Position = 4
  • String Sustain = 11
  • String Stretch = 1

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::StifKarp::setBaseLoopGain ( StkFloat  aGain)

Set the base loop gain.

The actual loop gain is set according to the frequency. Because of high-frequency loop filter roll-off, higher frequency settings have greater loop gains.

StkFrames & stk::StifKarp::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

126 {
127  unsigned int nChannels = lastFrame_.channels();
128 #if defined(_STK_DEBUG_)
129  if ( channel > frames.channels() - nChannels ) {
130  oStream_ << "StifKarp::tick(): channel and StkFrames arguments are incompatible!";
131  handleError( StkError::FUNCTION_ARGUMENT );
132  }
133 #endif
134 
135  StkFloat *samples = &frames[channel];
136  unsigned int j, hop = frames.channels() - nChannels;
137  if ( nChannels == 1 ) {
138  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
139  *samples++ = tick();
140  }
141  else {
142  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
143  *samples++ = tick();
144  for ( j=1; j<nChannels; j++ )
145  *samples++ = lastFrame_[j];
146  }
147  }
148 
149  return frames;
150 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1StifKarp.png0000644000076600007660000000114512327015205016310 0ustar gary‰PNG  IHDRNˆ~Å-†PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ôIDATxíÛnä: K-ÀÿÿÉÇ–eÝ|Y[áÁY&êÀ"Ŷ83y%ÆíD”$+9N’æôˆ i5ûõç"<‰KÏ{ì+nkcë¥-Ícø®ô*êdµ KR¯{\®ëËÊÝݸ}2{Y—›þˆëÍ^Œâ«Ùv]MöË(²Ùce}X’zùgV’æä8IšÓŠ‹1F3¼Ñ`'[ܲ˜òlq+Í’gŒûå“uÀ¤0'ÇÌÉqsrÀœ0(ÆíD”$+9N’æ4âBZíVR]ã~Œÿ=\ØP럖˜ž·DMoô›NíÙïq{>o·AjW®O«Ížq™Ò8*=Ôôðbý fïq%ý×›=ázöqAj×…ÙO¸ìæÄ™PÆp…;MV’~,ÇIÒœþ5\Œ1š àÞþÛx![ܲ˜òlq+Í’gŒûå“uÀ¤0'ÇÌÉqsrÀœ0(„ìD°’ãæ4àÖM¿ß†UÂÇàî;xÆÅ{,ƒŸüTÜÖF~ã”óùa§F+;µê·Ôˆ+G÷Hµ×%ËùÒij¢¾pƒËu½—æîöòšn͸Z7^MÓwoö×›=¢âp©›»FqÂÐw—̓¨WUõ‹þMp5Y€I5„ÿ?οï~¬ô½BFúY¢!WÉ¿-àIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Stk-members.html0000644000076600007660000002205312327015205017137 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Stk Member List

This is the complete list of members for stk::Stk, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Stk.html0000644000076600007660000007241212327015205015513 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


STK base class. More...

#include <Stk.h>

Inheritance diagram for stk::Stk:
stk::Effect stk::FileRead stk::FileWrite stk::Filter stk::Function stk::Generator stk::Guitar stk::Instrmnt stk::Messager stk::MidiFileIn stk::Mutex stk::Phonemes stk::Skini stk::Socket stk::Sphere stk::Thread stk::Twang stk::Vector3D stk::Voicer stk::WvIn stk::WvOut

Public Member Functions

void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Static Public Member Functions

static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 

Static Public Attributes

static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 

Protected Member Functions

 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK base class.

Nearly all STK classes inherit from this class. The global sample rate and rawwave path variables can be queried and modified via Stk. In addition, this class provides error handling and byte-swapping functions.

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. 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.

STK WWW site: http://ccrma.stanford.edu/software/stk/

The Synthesis ToolKit in C++ (STK) Copyright (c) 1995–2014 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 "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Member Function Documentation

static void stk::Stk::setSampleRate ( StkFloat  rate)
static

Static method that sets the STK sample rate.

The sample rate set using this method is queried by all STK classes that depend on its value. It is initialized to the default SRATE set in Stk.h. Many STK classes use the sample rate during instantiation. Therefore, if you wish to use a rate that is different from the default rate, it is imperative that it be set BEFORE STK objects are instantiated. A few classes that make use of the global STK sample rate are automatically notified when the rate changes so that internal class data can be appropriately updated. However, this has not been fully implemented. Specifically, classes that appropriately update their own data when either a setFrequency() or noteOn() function is called do not currently receive the automatic notification of rate change. If the user wants a specific class instance to ignore such notifications, perhaps in a multi-rate context, the function Stk::ignoreSampleRateChange() should be called.

void stk::Stk::ignoreSampleRateChange ( bool  ignore = true)
inline

A function to enable/disable the automatic updating of class data when the STK sample rate changes.

This function allows the user to enable or disable class data updates in response to global sample rate changes on a class by class basis.

173 { ignoreSampleRateChange_ = ignore; };

Member Data Documentation

const StkFormat stk::Stk::STK_SINT8
static

-128 to +127

const StkFormat stk::Stk::STK_SINT16
static

-32768 to +32767

const StkFormat stk::Stk::STK_SINT24
static

Lower 3 bytes of 32-bit signed integer.

const StkFormat stk::Stk::STK_SINT32
static

-2147483648 to +2147483647.

const StkFormat stk::Stk::STK_FLOAT32
static

Normalized between plus/minus 1.0.

const StkFormat stk::Stk::STK_FLOAT64
static

Normalized between plus/minus 1.0.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Stk.png0000644000076600007660000001233012327015205015324 0ustar gary‰PNG  IHDRÀ°šoµçPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2gIDATxíÛ’£:Ó¥þÿ“7òÀr†i.¯ÒèÂÄvJÝò+¯×ëu÷sßc€c,PÅÇþ7ïVïŒ÷Ëv`M£¹?̵/Ðou¿ße°cg; °!^`Þçëïø5OTiB`ŒtýÒ\?‡ØH U#¦yu UЏý*[íj»ˆÇšJx.âõ4@ÿc€*8ÆU,pÌó^¯×ë£x2O躇<]àÿ³ /à[  Db€H,‰"±@$ˆÄ‘X  Db€H,‰"¹*RJ7pžË’t 8Æ’TÅÇ|xå¶ ó'w$-m;nQ xîÃmL`Øä×Êaìäéñ$òT~Œ}IE‹âÎmÜïÂd:ee{VMŒaqM5Ph3…vÛX|~I ëºîõ".SèƒÀº4$iC5°+âGÔÀ˜BS &›XÝBûÿœÂ’Tåééáéáïø-ÐÇÿdÿ_ ¤”Ò=œçª@X  Db€H,‰"±@$ˆÄ‘X  Db€H,‰"±@$ˆäkRJé&ÎsY@’nÁÇX@’ªXà˜À+·e˜?›éqN’6³­Ôº¹W5ˆÈ;ýþ*¦Î87ìü,0Äüˆ˜eˆc7Ëhš\Çõh1’2oÆt_ ,““ᲜB;õ Ì=eÐð7«Ù‹]×uXq™BUuÃNà%•í“@»50¦ÐTµ"þáÂoàw@’~ cIªb€c, IU,pLJ)ÝÀy® 4"±@$ˆÄ‘X  Db€H,‰"±@$ˆÄ‘X  Db€H¾V ¥”nà<—$é,pŒ$©ŠŽÙ ¼r[†ù³™î{•¿iK ÖÝ ¬»qy§ß_¥Ãf“ói¬ú×ßÿ¦¿˜%+,Ãõâvmɯ͙„Œ±•©1”ÀN`ø·ó ß ¬O`Ö© Œ‹º®ë.°.â2…ªÛ2ÞeT#5ð©ˆç¸? ´BS ׊x¾hö ÜB’ô‹Xà HR cIªb€cRJé&ÎsU  ,‰"±@$ˆÄ‘X  Db€H,‰"±@$ˆÄ‘X  Dòµ)¥tç¹, I·`€c, IU,p̯ܖaþLÓåŠ$íiOàãŠ$í È;ýþ*#:yn8‹þ+$iK¤@‘(}lë¤YeQ¦~Ác¤eÞ % —–6#IÂSh'°;ÅH’¶ü«@×uÝ>q™BŸöÕÝ` |(âg¤ÐTÂÕ".o!IÚá_b€c, IUž...ðŽÿÑ}üOÈñÿ•@J)ÝÀy® 4"±@$ˆÄ‘X  Db€H,‰"±@$ˆÄ‘X  Db€H¾V ¥”nà<—$é,pŒ$©ŠŽÙ ¼r[†ù#I6ïJ*Z+’ô‰úî·»t˜:ý3ÏÇ‘Oe|wÌKqCÜC”åp%°Ì¯—K±K(«(O ÔÚÚ o¶)t›@×uÝÖE\¦Ð_ \ ^Õ"ž’üS ´’BS oMæÛ©¸xÖ·P¸€$ý8Æ’T#=\ =\àÿ£úøŸ,ãÿ+”Rº€ó\h Db€H,‰"±@$ˆÄ‘X  Db€H,‰"±@$ˆÄ‘|­@J)ÝÀy. HÒ-Xà HR ³xåVN¼?’tDí¥òàŒAýN÷Û]:,a ñ^”ÆG~yúÃÕìß qç6„º3É!ÎÓ™¥¿™X‚\Žsê*ñ¶³)T'WciOéôK]×uXЏL¡­À:“Ö‰ÕÆ ¼¤²­rè§jF`L¡©„'ñ^šo¡¢.Vo¬n!ÿœÆ’Tåééáéáïø-ÐÇÿdÿ_ ¤”Ò=œçª@X  Db€H,‰"±@$ˆÄ‘X  Db€H,‰"±@$ˆäkRJé&ÎsY@’nÁÇX@’ªXà˜¯Üʉ÷ç‡eIZÑš@ìg$©N @¿Óýv—«N^È2žJ~WRÙ↸‡ ËáF`šÍTN#T` róãžo& I«œB5rÓ§ÞC¿!Ðu]wz—)ô“ÀœB’´¡‰ØŒ)4=ZSh*áIc¼—Æ…ÉcsYù—àŸ°€$U±À1¤*8æù)¥tç¹*ЈđX  Db€H,‰"±@$ˆÄ‘X  Db€H,‰"ùZ”Rº €ó\¤[°À1¤*8¦&ðÊ­JZÚvüaÞÇl^}ðï¯Ò!÷û…e¹ŸÈÿò[Ãjž",‡/©lcĹ•«-ŒqÑÌû¼,oôöišBŸæå;º®ë.°+â2…vk›Oà%•­’B Œ92•ð>æ¹€k ÜB’ô[Xà HRôpôpwüèã²@Žÿ¯RJéÎsU  ,‰"±@$ˆÄ‘X  Db€H,‰"±@$ˆÄ‘X  Dòµ)¥tç¹, I·`€c, IU,pÌZà•[9\=%é4M ƒñ!IÿÀ_ ôQ¾Þ_¥C)ЯÍSÓ÷4(_˜þü†¸sËѬú£ÔKÚ´©·Œ–ãú{1ž"_ª«šX¯L„¥Ð^`Žþ c&­R¨˜^¸*Ðu]w¢ˆË´Ù l®¦ÝÖïn¬¸(Šxá| ĦÐ:ëË >ÜBCø«[艿ĵŠÇ¬òæ‰SîHZµG¥$m±À1¤*8&¥”nà ¼r+‡«çzU’¶´&0 ÆGã}”¯÷WéPô½÷âôÖðÎ^'N`ˆ)·!Ö²? ì{’Ê*0V„õ“ÀêÅVRh/0G_ôŸß躮»@½ˆË´ùI Zï-Õ@QÄ ãÙ,åÜZ)´ÎúB`\j÷’¤_ÀÇX@’ªXà HR “RJ7pž«M`€H,‰"±@$ˆÄ‘X  Db€H,‰"±@$ˆÄ‘X ’¯H)¥›8ÏeIº cIªb€cV¯Ü–aÿ¦%éiA 2'Içøc~«ûý.ã]òAäõÊhzqš¢‚-‡ÃsÖF‹vñgKxµX…¸ x=–B;â¹|°[Úd{5…º®ë.°q™Bgv¹·ù³°Øñ¿§PˆÀ˜BS ¯Mæ:(+bMчÞB’ôËXà HR cIªb€cRJé&ÎsU  ,‰"±@$ˆÄ‘X  Db€H,‰"±@$ˆÄ‘X  Dòµ)¥tç¹, I·`€c, IU,pÌO¯ÜŠñû3LÏß랤¥µ'û[)Iª+Ðou¿ße¼Sg˜Ë­8IZ*PƸl{·œ›_“¤-ÑKŒ›ƒç&©Fk`Ê@1÷ë]×uøXÄe m‹¸L«æk`SÄ/©l§Ð´×sÏ·Î2×òï€$]ÇÇX@’ªXà HR “RJ7pž«M`€H,‰"±@$ˆÄ‘X  Db€H,‰"±@$ˆÄ‘X ’¯H)¥›8ÏeIº cIªb€c>¼r+Æï$­X¿!iÕšÈý]ˆ ô[Ýïwé°t†ƒãy°?¡(!ªÜVAÎ"ÓLñÆ.ã‚ƈÖ!M{^;žFcs¤»œ(·¾ ü t]×] VÄe ­‹x#0§PKEü’ÊöQ`õRƒ)4íîrÓ×Ïr ¹V”¹‰þ HR•§ ¤‡ ¤‡ ¼ã´@ÿ“rü%RJ÷pž«M`€H,‰"±@$ˆÄ‘X  Db€H,‰"±@$ˆÄ‘X ’¯H)¥›8ÏeIº cIªb€cª¯ÜŠñû³Z•¤#Èýe¢m~«ûý.¦Î{¶ïŽüÚ0œûñCܹ ±!º,·ø÷WéP,÷+4B¦àúøö!¯F›cjG` qCÿšŽ$­‰O¡v'#IþU ëºî‹¸L¡mÜ"pÃ(Ã+¢Ï¡ñšöyÒx€$ýO,pŒ$©Fz¸@z¸À;þG ôñ?Y ÇÿW)¥tç¹*ЈđX  Db€H,‰"±@$ˆÄ‘X  Db€H,‰"ùZ”Rº €ó\¤[°À1¤*8æƒÀ+·r83Ͻ?›W$-­uÜÝŽ›è÷µßÜÒ¡(åÄú8"†rÛ…¼ñ¨5!0F´Î¡á߆À? ¿+Ðu]wZ—)´­‚Û®ðS l/™%èò«1…¦}žBÛ ,¿ãõ?o!€+4óK p HR•§ ¤‡ ¤‡ ¼ã´@ÿ“rü%RJ÷ð*¥ l÷$IEND®B`‚stk-4.5.0/doc/html/classstk_1_1StkError-members.html0000644000076600007660000000711212327015205020150 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::StkError Member List

This is the complete list of members for stk::StkError, including all inherited members.

getMessage(void)stk::StkErrorinlinevirtual
getMessageCString(void)stk::StkErrorinlinevirtual
getType(void)stk::StkErrorinlinevirtual
printMessage(void)stk::StkErrorinlinevirtual
StkError(const std::string &message, Type type=StkError::UNSPECIFIED)stk::StkErrorinline
~StkError(void)stk::StkErrorinlinevirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1StkError.html0000644000076600007660000001412612327015205016523 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::StkError Class Reference

STK error handling class. More...

#include <Stk.h>

Public Member Functions

 StkError (const std::string &message, Type type=StkError::UNSPECIFIED)
 The constructor.
 
virtual ~StkError (void)
 The destructor.
 
virtual void printMessage (void)
 Prints thrown error message to stderr.
 
virtual const Type & getType (void)
 Returns the thrown error message type.
 
virtual const std::string & getMessage (void)
 Returns the thrown error message string.
 
virtual const char * getMessageCString (void)
 Returns the thrown error message as a C string.
 

Detailed Description

STK error handling class.

This is a fairly abstract exception handling class. There could be sub-classes to take care of more specific error conditions ... or not.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1StkFrames-members.html0000644000076600007660000001562712327015205020306 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::StkFrames Member List

This is the complete list of members for stk::StkFrames, including all inherited members.

channels(void) const stk::StkFramesinline
dataRate(void) const stk::StkFramesinline
empty() const stk::StkFramesinline
frames(void) const stk::StkFramesinline
interpolate(StkFloat frame, unsigned int channel=0) const stk::StkFrames
operator()(size_t frame, unsigned int channel)stk::StkFramesinline
operator()(size_t frame, unsigned int channel) const stk::StkFramesinline
operator*=(StkFrames &f)stk::StkFramesinline
operator+=(StkFrames &f)stk::StkFramesinline
operator[](size_t n)stk::StkFramesinline
operator[](size_t n) const stk::StkFramesinline
resize(size_t nFrames, unsigned int nChannels=1)stk::StkFrames
resize(size_t nFrames, unsigned int nChannels, StkFloat value)stk::StkFrames
setDataRate(StkFloat rate)stk::StkFramesinline
size() const stk::StkFramesinline
StkFrames(unsigned int nFrames=0, unsigned int nChannels=0)stk::StkFrames
StkFrames(const StkFloat &value, unsigned int nFrames, unsigned int nChannels)stk::StkFrames
~StkFrames()stk::StkFrames

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1StkFrames.html0000644000076600007660000011462412327015205016653 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::StkFrames Class Reference

An STK class to handle vectorized audio data. More...

#include <Stk.h>

Public Member Functions

 StkFrames (unsigned int nFrames=0, unsigned int nChannels=0)
 The default constructor initializes the frame data structure to size zero.
 
 StkFrames (const StkFloat &value, unsigned int nFrames, unsigned int nChannels)
 Overloaded constructor that initializes the frame data to the specified size with value.
 
 ~StkFrames ()
 The destructor.
 
StkFloat & operator[] (size_t n)
 Subscript operator that returns a reference to element n of self. More...
 
StkFloat operator[] (size_t n) const
 Subscript operator that returns the value at element n of self. More...
 
void operator+= (StkFrames &f)
 Assignment by sum operator into self. More...
 
void operator*= (StkFrames &f)
 Assignment by product operator into self. More...
 
StkFloat & operator() (size_t frame, unsigned int channel)
 Channel / frame subscript operator that returns a reference. More...
 
StkFloat operator() (size_t frame, unsigned int channel) const
 Channel / frame subscript operator that returns a value. More...
 
StkFloat interpolate (StkFloat frame, unsigned int channel=0) const
 Return an interpolated value at the fractional frame index and channel. More...
 
size_t size () const
 Returns the total number of audio samples represented by the object.
 
bool empty () const
 Returns true if the object size is zero and false otherwise.
 
void resize (size_t nFrames, unsigned int nChannels=1)
 Resize self to represent the specified number of channels and frames. More...
 
void resize (size_t nFrames, unsigned int nChannels, StkFloat value)
 Resize self to represent the specified number of channels and frames and perform element initialization. More...
 
unsigned int channels (void) const
 Return the number of channels represented by the data.
 
unsigned int frames (void) const
 Return the number of sample frames represented by the data.
 
void setDataRate (StkFloat rate)
 Set the sample rate associated with the StkFrames data. More...
 
StkFloat dataRate (void) const
 Return the sample rate associated with the StkFrames data. More...
 

Detailed Description

An STK class to handle vectorized audio data.

This class can hold single- or multi-channel audio data. The data type is always StkFloat and the channel format is always interleaved. In an effort to maintain efficiency, no out-of-bounds checks are performed in this class unless STK_DEBUG is defined.

Internally, the data is stored in a one-dimensional C array. An indexing operator is available to set and retrieve data values. Alternately, one can use pointers to access the data, using the index operator to get an address for a particular location in the data:

StkFloat* ptr = &myStkFrames[0];

Note that this class can also be used as a table with interpolating lookup.

Possible future improvements in this class could include functions to convert to and return other data types.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

StkFloat & stk::StkFrames::operator[] ( size_t  n)
inline

Subscript operator that returns a reference to element n of self.

The result can be used as an lvalue. This reference is valid until the resize function is called or the array is destroyed. The index n must be between 0 and size less one. No range checking is performed unless STK_DEBUG is defined.

414 {
415 #if defined(_STK_DEBUG_)
416  if ( n >= size_ ) {
417  std::ostringstream error;
418  error << "StkFrames::operator[]: invalid index (" << n << ") value!";
419  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
420  }
421 #endif
422 
423  return data_[n];
424 }
StkFloat stk::StkFrames::operator[] ( size_t  n) const
inline

Subscript operator that returns the value at element n of self.

The index n must be between 0 and size less one. No range checking is performed unless STK_DEBUG is defined.

427 {
428 #if defined(_STK_DEBUG_)
429  if ( n >= size_ ) {
430  std::ostringstream error;
431  error << "StkFrames::operator[]: invalid index (" << n << ") value!";
432  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
433  }
434 #endif
435 
436  return data_[n];
437 }
void stk::StkFrames::operator+= ( StkFrames f)
inline

Assignment by sum operator into self.

The dimensions of the argument are expected to be the same as self. No range checking is performed unless STK_DEBUG is defined.

466 {
467 #if defined(_STK_DEBUG_)
468  if ( f.frames() != nFrames_ || f.channels() != nChannels_ ) {
469  std::ostringstream error;
470  error << "StkFrames::operator+=: frames argument must be of equal dimensions!";
471  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
472  }
473 #endif
474 
475  StkFloat *fptr = &f[0];
476  StkFloat *dptr = data_;
477  for ( unsigned int i=0; i<size_; i++ )
478  *dptr++ += *fptr++;
479 }
void stk::StkFrames::operator*= ( StkFrames f)
inline

Assignment by product operator into self.

The dimensions of the argument are expected to be the same as self. No range checking is performed unless STK_DEBUG is defined.

482 {
483 #if defined(_STK_DEBUG_)
484  if ( f.frames() != nFrames_ || f.channels() != nChannels_ ) {
485  std::ostringstream error;
486  error << "StkFrames::operator*=: frames argument must be of equal dimensions!";
487  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
488  }
489 #endif
490 
491  StkFloat *fptr = &f[0];
492  StkFloat *dptr = data_;
493  for ( unsigned int i=0; i<size_; i++ )
494  *dptr++ *= *fptr++;
495 }
StkFloat & stk::StkFrames::operator() ( size_t  frame,
unsigned int  channel 
)
inline

Channel / frame subscript operator that returns a reference.

The result can be used as an lvalue. This reference is valid until the resize function is called or the array is destroyed. The frame index must be between 0 and frames() - 1. The channel index must be between 0 and channels() - 1. No range checking is performed unless STK_DEBUG is defined.

440 {
441 #if defined(_STK_DEBUG_)
442  if ( frame >= nFrames_ || channel >= nChannels_ ) {
443  std::ostringstream error;
444  error << "StkFrames::operator(): invalid frame (" << frame << ") or channel (" << channel << ") value!";
445  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
446  }
447 #endif
448 
449  return data_[ frame * nChannels_ + channel ];
450 }
StkFloat stk::StkFrames::operator() ( size_t  frame,
unsigned int  channel 
) const
inline

Channel / frame subscript operator that returns a value.

The frame index must be between 0 and frames() - 1. The channel index must be between 0 and channels() - 1. No range checking is performed unless STK_DEBUG is defined.

453 {
454 #if defined(_STK_DEBUG_)
455  if ( frame >= nFrames_ || channel >= nChannels_ ) {
456  std::ostringstream error;
457  error << "StkFrames::operator(): invalid frame (" << frame << ") or channel (" << channel << ") value!";
458  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
459  }
460 #endif
461 
462  return data_[ frame * nChannels_ + channel ];
463 }
StkFloat stk::StkFrames::interpolate ( StkFloat  frame,
unsigned int  channel = 0 
) const

Return an interpolated value at the fractional frame index and channel.

This function performs linear interpolation. The frame index must be between 0.0 and frames() - 1. The channel index must be between 0 and channels() - 1. No range checking is performed unless STK_DEBUG is defined.

void stk::StkFrames::resize ( size_t  nFrames,
unsigned int  nChannels = 1 
)

Resize self to represent the specified number of channels and frames.

Changes the size of self based on the number of frames and channels. No element assignment is performed. No memory deallocation occurs if the new size is smaller than the previous size. Further, no new memory is allocated when the new size is smaller or equal to a previously allocated size.

void stk::StkFrames::resize ( size_t  nFrames,
unsigned int  nChannels,
StkFloat  value 
)

Resize self to represent the specified number of channels and frames and perform element initialization.

Changes the size of self based on the number of frames and channels, and assigns value to every element. No memory deallocation occurs if the new size is smaller than the previous size. Further, no new memory is allocated when the new size is smaller or equal to a previously allocated size.

void stk::StkFrames::setDataRate ( StkFloat  rate)
inline

Set the sample rate associated with the StkFrames data.

By default, this value is set equal to the current STK sample rate at the time of instantiation.

387 { dataRate_ = rate; };
StkFloat stk::StkFrames::dataRate ( void  ) const
inline

Return the sample rate associated with the StkFrames data.

By default, this value is set equal to the current STK sample rate at the time of instantiation.

394 { return dataRate_; };

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TapDelay-members.html0000644000076600007660000003406512327015205020107 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TapDelay Member List

This is the complete list of members for stk::TapDelay, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
getGain(void) const stk::Filterinline
getTapDelays(void) const stk::TapDelayinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(unsigned int tap=0) const stk::TapDelayinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setGain(StkFloat gain)stk::Filterinline
setMaximumDelay(unsigned long delay)stk::TapDelay
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setTapDelays(std::vector< unsigned long > taps)stk::TapDelay
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
TapDelay(std::vector< unsigned long > taps=std::vector< unsigned long >(1, 0), unsigned long maxDelay=4095)stk::TapDelay
tick(StkFloat input, StkFrames &outputs)stk::TapDelayinline
tick(StkFrames &frames, unsigned int channel=0)stk::TapDelayinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0)stk::TapDelayinline
~Stk(void)stk::Stkprotectedvirtual
~TapDelay()stk::TapDelay

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TapDelay.html0000644000076600007660000017146712327015205016467 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TapDelay Class Reference

STK non-interpolating tapped delay line class. More...

#include <TapDelay.h>

Inheritance diagram for stk::TapDelay:
stk::Filter stk::Stk

Public Member Functions

 TapDelay (std::vector< unsigned long > taps=std::vector< unsigned long >(1, 0), unsigned long maxDelay=4095)
 The default constructor creates a delay-line with maximum length of 4095 samples and a single tap at delay = 0. More...
 
 ~TapDelay ()
 Class destructor.
 
void setMaximumDelay (unsigned long delay)
 Set the maximum delay-line length. More...
 
void setTapDelays (std::vector< unsigned long > taps)
 Set the delay-line tap lengths. More...
 
std::vector< unsigned long > getTapDelays (void) const
 Return the current delay-line length.
 
StkFloat lastOut (unsigned int tap=0) const
 Return the specified tap value of the last computed frame. More...
 
StkFramestick (StkFloat input, StkFrames &outputs)
 Input one sample to the delayline and return outputs at all tap positions. More...
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and write outputs back to the same object. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK non-interpolating tapped delay line class.

This class implements a non-interpolating digital delay-line with an arbitrary number of output "taps". If the maximum length and tap delays are not specified during instantiation, a fixed maximum length of 4095 and a single tap delay of zero is set.

A non-interpolating delay line is typically used in fixed delay-length applications, such as for reverberation.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::TapDelay::TapDelay ( std::vector< unsigned long >  taps = std::vector< unsigned long >(1, 0),
unsigned long  maxDelay = 4095 
)

The default constructor creates a delay-line with maximum length of 4095 samples and a single tap at delay = 0.

An StkError will be thrown if any tap delay parameter is less than zero, the maximum delay parameter is less than one, or any tap delay parameter is greater than the maxDelay value.

Member Function Documentation

void stk::TapDelay::setMaximumDelay ( unsigned long  delay)

Set the maximum delay-line length.

This method should generally only be used during initial setup of the delay line. If it is used between calls to the tick() function, without a call to clear(), a signal discontinuity will likely occur. If the current maximum length is greater than the new length, no change will be made.

void stk::TapDelay::setTapDelays ( std::vector< unsigned long >  taps)

Set the delay-line tap lengths.

The valid range for each tap length is from 0 to the maximum delay-line length.

StkFloat stk::TapDelay::lastOut ( unsigned int  tap = 0) const
inline

Return the specified tap value of the last computed frame.

Use the lastFrame() function to get all tap values from the last computed frame. The tap argument must be less than the number of delayline taps (the first tap is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

116 {
117 #if defined(_STK_DEBUG_)
118  if ( tap >= lastFrame_.size() ) {
119  oStream_ << "TapDelay::lastOut(): tap argument and number of taps are incompatible!";
120  handleError( StkError::FUNCTION_ARGUMENT );
121  }
122 #endif
123 
124  return lastFrame_[tap];
125 }
StkFrames & stk::TapDelay::tick ( StkFloat  input,
StkFrames outputs 
)
inline

Input one sample to the delayline and return outputs at all tap positions.

The StkFrames argument reference is returned. The output values are ordered according to the tap positions set using the setTapDelays() function (no sorting is performed). The StkFrames argument must contain at least as many channels as the number of taps. However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

128 {
129 #if defined(_STK_DEBUG_)
130  if ( outputs.channels() < outPoint_.size() ) {
131  oStream_ << "TapDelay::tick(): number of taps > channels in StkFrames argument!";
132  handleError( StkError::FUNCTION_ARGUMENT );
133  }
134 #endif
135 
136  inputs_[inPoint_++] = input * gain_;
137 
138  // Check for end condition
139  if ( inPoint_ == inputs_.size() )
140  inPoint_ = 0;
141 
142  // Read out next values
143  StkFloat *outs = &outputs[0];
144  for ( unsigned int i=0; i<outPoint_.size(); i++ ) {
145  *outs++ = inputs_[outPoint_[i]];
146  lastFrame_[i] = *outs;
147  if ( ++outPoint_[i] == inputs_.size() )
148  outPoint_[i] = 0;
149  }
150 
151  return outputs;
152 }
StkFrames & stk::TapDelay::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and write outputs back to the same object.

The StkFrames argument reference is returned. The output values are ordered according to the tap positions set using the setTapDelays() function (no sorting is performed). The StkFrames argument must contain at least as many channels as the number of taps. However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

155 {
156 #if defined(_STK_DEBUG_)
157  if ( channel >= frames.channels() ) {
158  oStream_ << "TapDelay::tick(): channel and StkFrames arguments are incompatible!";
159  handleError( StkError::FUNCTION_ARGUMENT );
160  }
161  if ( frames.channels() < outPoint_.size() ) {
162  oStream_ << "TapDelay::tick(): number of taps > channels in StkFrames argument!";
163  handleError( StkError::FUNCTION_ARGUMENT );
164  }
165 #endif
166 
167  StkFloat *iSamples = &frames[channel];
168  StkFloat *oSamples = &frames[0];
169  std::size_t j;
170  unsigned int iHop = frames.channels();
171  std::size_t oHop = frames.channels() - outPoint_.size();
172  for ( unsigned long i=0; i<frames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
173  inputs_[inPoint_++] = *iSamples * gain_;
174  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
175  for ( j=0; j<outPoint_.size(); j++ ) {
176  *oSamples++ = inputs_[outPoint_[j]];
177  if ( ++outPoint_[j] == inputs_.size() ) outPoint_[j] = 0;
178  }
179  }
180 
181  oSamples -= frames.channels();
182  for ( j=0; j<outPoint_.size(); j++ ) lastFrame_[j] = *oSamples++;
183  return frames;
184 }
StkFrames & stk::TapDelay::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. The output values are ordered according to the tap positions set using the setTapDelays() function (no sorting is performed). The iChannel argument must be less than the number of channels in the iFrames argument (the first channel is specified by 0). The oFrames argument must contain at least as many channels as the number of taps. However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

187 {
188 #if defined(_STK_DEBUG_)
189  if ( iChannel >= iFrames.channels() ) {
190  oStream_ << "TapDelay::tick(): channel and StkFrames arguments are incompatible!";
191  handleError( StkError::FUNCTION_ARGUMENT );
192  }
193  if ( oFrames.channels() < outPoint_.size() ) {
194  oStream_ << "TapDelay::tick(): number of taps > channels in output StkFrames argument!";
195  handleError( StkError::FUNCTION_ARGUMENT );
196  }
197 #endif
198 
199  StkFloat *iSamples = &iFrames[iChannel];
200  StkFloat *oSamples = &oFrames[0];
201  std::size_t j;
202  unsigned int iHop = iFrames.channels();
203  std::size_t oHop = oFrames.channels() - outPoint_.size();
204  for ( unsigned long i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
205  inputs_[inPoint_++] = *iSamples * gain_;
206  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
207  for ( j=0; j<outPoint_.size(); j++ ) {
208  *oSamples++ = inputs_[outPoint_[j]];
209  if ( ++outPoint_[j] == inputs_.size() ) outPoint_[j] = 0;
210  }
211  }
212 
213  oSamples -= oFrames.channels();
214  for ( j=0; j<outPoint_.size(); j++ ) lastFrame_[j] = *oSamples++;
215  return iFrames;
216 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TapDelay.png0000644000076600007660000000113312327015205016265 0ustar gary‰PNG  IHDRWˆ¥~‡¤PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2êIDATxíá’ƒ „—ÍŒïÿȧ’(x¶g®ã4¬…(_Æú""‚äí )‡šÏŸNš¤‰W¹y¼æÞæ.…-ÕiFìÓ$itÂݪʈŠÉ.¨4IvtÎ-»~ó÷̈ß|èÊ6ÞåZ:}{Û½óðVߊµk[ßlš$;Š÷Cpι_pU8ȉ;M>`'îŒu{qw‚\-‚Üà€Upƒû5\AHòv÷cÜ”£Mó§¦õ’ÜëîðIîÕçæºæ‹ÔAέ•/—<#I«.WívYbwn¬ÈêÕ>â€Þüj/[l"I£±î¡ÞöC$i5ê›öaÄ=6ôº¿ƒ¾ýɇڵnßôy Éâý܇sEDî\ÕrâN“؉;c]À^ÜLJà@‹à7¸`Üà~ 7¥”„·+¸ÿÊ'j^[ @Å>×-ì”Û_”Sú×`¯Æ]j(çî°h-p¾·~Õ5mF;îŠËQn·ºjb{¦=ÐRíkÏm«;›´«ówÛc»vêÀUé:ÚhÊLíáIƒzm¡ªÊŽ¿‡¾uüUm:çj×LßÊ9©ça;¿ö<(w_û¿]xÒ‰«{u#×ô%Þ“妔Òýúø%$¯B}IEND®B`‚stk-4.5.0/doc/html/classstk_1_1TcpClient-members.html0000644000076600007660000003223712327015205020270 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TcpClient Member List

This is the complete list of members for stk::TcpClient, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
close(int socket)stk::Socketstatic
connect(int port, std::string hostname="localhost")stk::TcpClient
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
id(void) const stk::Socketinline
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
isValid(int socket)stk::Socketinlinestatic
port(void) const stk::Socketinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
readBuffer(void *buffer, long bufferSize, int flags=0)stk::TcpClientvirtual
stk::Socket::readBuffer(int socket, void *buffer, long bufferSize, int flags)stk::Socketstatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setBlocking(int socket, bool enable)stk::Socketstatic
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Socket()stk::Socket
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
TcpClient(int port, std::string hostname="localhost")stk::TcpClient
writeBuffer(const void *buffer, long bufferSize, int flags=0)stk::TcpClientvirtual
stk::Socket::writeBuffer(int socket, const void *buffer, long bufferSize, int flags)stk::Socketstatic
~Socket()stk::Socketvirtual
~Stk(void)stk::Stkprotectedvirtual
~TcpClient()stk::TcpClient

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TcpClient.html0000644000076600007660000006343212327015205016641 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TcpClient Class Reference

STK TCP socket client class. More...

#include <TcpClient.h>

Inheritance diagram for stk::TcpClient:
stk::Socket stk::Stk

Public Member Functions

 TcpClient (int port, std::string hostname="localhost")
 Default class constructor creates a socket client connection to the specified host and port. More...
 
 ~TcpClient ()
 The class destructor closes the socket instance, breaking any existing connections.
 
int connect (int port, std::string hostname="localhost")
 Connect the socket client to the specified host and port and returns the resulting socket descriptor. More...
 
int writeBuffer (const void *buffer, long bufferSize, int flags=0)
 Write a buffer over the socket connection. Returns the number of bytes written or -1 if an error occurs.
 
int readBuffer (void *buffer, long bufferSize, int flags=0)
 Read a buffer from the socket connection, up to length bufferSize. Returns the number of bytes read or -1 if an error occurs.
 
- Public Member Functions inherited from stk::Socket
 Socket ()
 Class constructor.
 
virtual ~Socket ()
 Class destructor.
 
int id (void) const
 Return the socket descriptor.
 
int port (void) const
 Return the socket port number.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Socket
static void close (int socket)
 Close the socket.
 
static bool isValid (int socket)
 Returns true if the socket descriptor is valid.
 
static void setBlocking (int socket, bool enable)
 If enable = false, the socket is set to non-blocking mode. When first created, sockets are by default in blocking mode.
 
static int writeBuffer (int socket, const void *buffer, long bufferSize, int flags)
 Write a buffer via the specified socket. Returns the number of bytes written or -1 if an error occurs.
 
static int readBuffer (int socket, void *buffer, long bufferSize, int flags)
 Read a buffer via the specified socket. Returns the number of bytes read or -1 if an error occurs.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK TCP socket client class.

This class provides a uniform cross-platform TCP socket client interface. Methods are provided for reading or writing data buffers to/from connections.

TCP sockets are reliable and connection-oriented. A TCP socket client must be connected to a TCP server before data can be sent or received. Data delivery is guaranteed in order, without loss, error, or duplication. That said, TCP transmissions tend to be slower than those using the UDP protocol and data sent with multiple write() calls can be arbitrarily combined by the underlying system.

The user is responsible for checking the values returned by the read/write methods. Values less than or equal to zero indicate a closed or lost connection or the occurence of an error.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::TcpClient::TcpClient ( int  port,
std::string  hostname = "localhost" 
)

Default class constructor creates a socket client connection to the specified host and port.

An StkError will be thrown if a socket error occurs during instantiation.

Member Function Documentation

int stk::TcpClient::connect ( int  port,
std::string  hostname = "localhost" 
)

Connect the socket client to the specified host and port and returns the resulting socket descriptor.

If the socket client is already connected, that connection is terminated and a new connection is attempted. An StkError will be thrown if a socket error occurs.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TcpClient.png0000644000076600007660000000111512327015205016447 0ustar gary‰PNG  IHDRVˆJ¼ìšPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÜIDATxíëŽë „‡±”÷ä“pµÛ&쪧®<»˜Ofìö7DDæ B’³åØ?Ćj½Û$uÜÅÆç´÷{”uÔ¦ùá¼MÒÄ l­) %Z ¶I²×kl>oWo_¸ð΄áù|‰‡Xk eOMÐ1š„'-Ë&”†Õ–Ùm’ìå¿ ŽýP¬ˆÈtÀUm0_k°Û¶„»»SWpa?lëXÇ:@ Ç:Ö±_€™/IΖcb¨õþ!I#›ARÅ%l|°GYGmšÜRÑé_Έ‹ómÎØ”íø²£2:φ؜gK} ‘+¿„­ç»é256µó}Ë´ ¶e'l5á}Ë©ãG¬IºlB©¤u[@›„ä–jªÿ&8–¤ŠÃŠˆL\Õóµ»mK¸k°;uwöÃ&Á±Žu¬c´p¬cûØB˜/˜-Çþv_¨ué*yÓ&WÀ[lKÐ"î˜#ìQ@8]p)/åæ"M úe¹[Ŧœú‚õO The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TcpServer Member List

This is the complete list of members for stk::TcpServer, including all inherited members.

accept(void)stk::TcpServer
addSampleRateAlert(Stk *ptr)stk::Stkprotected
close(int socket)stk::Socketstatic
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
id(void) const stk::Socketinline
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
isValid(int socket)stk::Socketinlinestatic
port(void) const stk::Socketinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
readBuffer(void *buffer, long bufferSize, int flags=0)stk::TcpServervirtual
stk::Socket::readBuffer(int socket, void *buffer, long bufferSize, int flags)stk::Socketstatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setBlocking(int socket, bool enable)stk::Socketstatic
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Socket()stk::Socket
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
TcpServer(int port=2006)stk::TcpServer
writeBuffer(const void *buffer, long bufferSize, int flags=0)stk::TcpServervirtual
stk::Socket::writeBuffer(int socket, const void *buffer, long bufferSize, int flags)stk::Socketstatic
~Socket()stk::Socketvirtual
~Stk(void)stk::Stkprotectedvirtual
~TcpServer()stk::TcpServer

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TcpServer.html0000644000076600007660000006204312327015205016666 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TcpServer Class Reference

STK TCP socket server class. More...

#include <TcpServer.h>

Inheritance diagram for stk::TcpServer:
stk::Socket stk::Stk

Public Member Functions

 TcpServer (int port=2006)
 Default constructor creates a local socket server on port 2006 (or the specified port number). More...
 
 ~TcpServer ()
 The class destructor closes the socket instance, breaking any existing connections.
 
int accept (void)
 Extract the first pending connection request from the queue and create a new connection, returning the descriptor for the accepted socket. More...
 
int writeBuffer (const void *buffer, long bufferSize, int flags=0)
 Write a buffer over the socket connection. Returns the number of bytes written or -1 if an error occurs.
 
int readBuffer (void *buffer, long bufferSize, int flags=0)
 Read a buffer from the socket connection, up to length bufferSize. Returns the number of bytes read or -1 if an error occurs.
 
- Public Member Functions inherited from stk::Socket
 Socket ()
 Class constructor.
 
virtual ~Socket ()
 Class destructor.
 
int id (void) const
 Return the socket descriptor.
 
int port (void) const
 Return the socket port number.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Socket
static void close (int socket)
 Close the socket.
 
static bool isValid (int socket)
 Returns true if the socket descriptor is valid.
 
static void setBlocking (int socket, bool enable)
 If enable = false, the socket is set to non-blocking mode. When first created, sockets are by default in blocking mode.
 
static int writeBuffer (int socket, const void *buffer, long bufferSize, int flags)
 Write a buffer via the specified socket. Returns the number of bytes written or -1 if an error occurs.
 
static int readBuffer (int socket, void *buffer, long bufferSize, int flags)
 Read a buffer via the specified socket. Returns the number of bytes read or -1 if an error occurs.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK TCP socket server class.

This class provides a uniform cross-platform TCP socket server interface. Methods are provided for reading or writing data buffers to/from connections.

TCP sockets are reliable and connection-oriented. A TCP socket server must accept a connection from a TCP client before data can be sent or received. Data delivery is guaranteed in order, without loss, error, or duplication. That said, TCP transmissions tend to be slower than those using the UDP protocol and data sent with multiple write() calls can be arbitrarily combined by the underlying system.

The user is responsible for checking the values returned by the read/write methods. Values less than or equal to zero indicate a closed or lost connection or the occurence of an error.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::TcpServer::TcpServer ( int  port = 2006)

Default constructor creates a local socket server on port 2006 (or the specified port number).

An StkError will be thrown if a socket error occurs during instantiation.

Member Function Documentation

int stk::TcpServer::accept ( void  )

Extract the first pending connection request from the queue and create a new connection, returning the descriptor for the accepted socket.

If no connection requests are pending and the socket has not been set non-blocking, this function will block until a connection is present. If an error occurs, -1 is returned.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TcpServer.png0000644000076600007660000000122112327015205016475 0ustar gary‰PNG  IHDR]ˆ²\mPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2 IDATxíᎣ0 '_$Þÿ‘¯…ðRØÊ·ªê*£%–;8v¶¿©µÖ0¨’DÚ%Éãïíe^fÿø8aIÚñ ûü¼ÄÞ´?‹|VjMía–¤=çöµÂYÔes_LX’|^Ú›f´¬}Ñš q5íHïÙÇÎ8S}³3vywæ©¶Îô™®SÃ’ä“¿3’ä‘vIòøp{­µFpƒ ŒPû4EêCíy >ÖþÑw&í.iðH;€GÚ<Òà‘v´x|“½ÖZàJRi—$¿²—y™ýã#Ic†$ \¶ÏχïÿÆþ,òY©}Áö°aùÓ2æs6Ͼ|e^ƒa}K˜ŒC#Ïì-}ÌïÕS;Çûª9ÕmíËÄ/OÕvfœêξvæòT‹d×ö!éngz]Û½0—e»3K ÍÜówF’^vIòøp{­µFpƒ ŒPû4EêCíy >ÖþÑw&í.iðH;€GÚ<Òà‘v´x|“½”R ‘vÿjl̾°Ë‹9µ/`Xsèš~³?ëi7Ô–ß«]r—?Ûº¢ÇMh°/ÒyµÔ­ÆhÁ֗͸e˜ÐÞ¾9ü6l…¯gØa·ÇÎ\µ·ÄÞ°Õ3„vSµ9±÷y‘éçp¼¾¦:öÝÚM³†QüЙ^Ã0Õñά÷}½ ûD·3gÜÿ¯þ;À=Òàn/¥”(þK'o¹öųIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Thread-members.html0000644000076600007660000002500612327015205017606 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Thread Member List

This is the complete list of members for stk::Thread, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
cancel(void)stk::Thread
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
start(THREAD_FUNCTION routine, void *ptr=NULL)stk::Thread
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
testCancel(void)stk::Thread
Thread()stk::Thread
wait(void)stk::Thread
~Stk(void)stk::Stkprotectedvirtual
~Thread()stk::Thread

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Thread.html0000644000076600007660000007300012327015205016153 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Thread Class Reference

STK thread class. More...

#include <Thread.h>

Inheritance diagram for stk::Thread:
stk::Stk

Public Member Functions

 Thread ()
 Default constructor.
 
 ~Thread ()
 The class destructor does not attempt to cancel or join a thread.
 
bool start (THREAD_FUNCTION routine, void *ptr=NULL)
 Begin execution of the thread routine. Upon success, true is returned. More...
 
bool cancel (void)
 Signal cancellation of a thread routine, returning true on success. More...
 
bool wait (void)
 Block the calling routine indefinitely until the thread terminates. More...
 
void testCancel (void)
 Create a cancellation point within a thread routine. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK thread class.

This class provides a uniform interface for cross-platform threads. On unix systems, the pthread library is used. Under Windows, the C runtime threadex functions are used.

Each instance of the Thread class can be used to control a single thread process. Routines are provided to signal cancelation and/or joining with a thread, though it is not possible for this class to know the running status of a thread once it is started.

For cross-platform compatability, thread functions should be declared as follows:

THREAD_RETURN THREAD_TYPE thread_function(void *ptr)

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

bool stk::Thread::start ( THREAD_FUNCTION  routine,
void *  ptr = NULL 
)

Begin execution of the thread routine. Upon success, true is returned.

A data pointer can be supplied to the thread routine via the optional ptr argument. If the thread cannot be created, the return value is false.

bool stk::Thread::cancel ( void  )

Signal cancellation of a thread routine, returning true on success.

This function only signals thread cancellation. It does not wait to verify actual routine termination. A true return value only signifies that the cancellation signal was properly executed, not thread cancellation. A thread routine may need to make use of the testCancel() function to specify a cancellation point.

bool stk::Thread::wait ( void  )

Block the calling routine indefinitely until the thread terminates.

This function suspends execution of the calling routine until the thread has terminated. It will return immediately if the thread was already terminated. A true return value signifies successful termination. A false return value indicates a problem with the wait call.

void stk::Thread::testCancel ( void  )

Create a cancellation point within a thread routine.

This function call checks for thread cancellation, allowing the thread to be terminated if a cancellation request was previously signaled.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Thread.png0000644000076600007660000000063712327015205016001 0ustar gary‰PNG  IHDRIPbt¨½PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2.IDATxíÛŽ„ DO‰ÿÿÉ«\\`PtÒ› † ØÒ‡®fæBpA’´H’4×5Éâ¨Þ÷g~OŠë{A:?*¨³ò¢ߓΓcRIŒÞª°¤f\rJ›qöihïÒÝ0%—úœÔºtü…»zŒîîadz»Òï³ãmXR3Ö?X’æZ$Išk'…‚‡¦Ú\äFÚ6/”i9¡üHòî à `®E˜k‘æZ$€¹ ÌÌ\„8h‘æêHûKõþìRò×[RÙö’´Ÿ}Ñ—•7•9íIõ欞”q‘Â+ÛS°Ìõ”ˆ-)ìí‚ñ©øéî )ÞAš/H­»Ûš~—#’A=fînú”Ý•~·¯ë©î.qÆ¿'€/µHsý{’™™‡~&œg¥Û~IEND®B`‚stk-4.5.0/doc/html/classstk_1_1TubeBell-members.html0000644000076600007660000003723312327015205020102 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TubeBell Member List

This is the complete list of members for stk::TubeBell, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::FMvirtual
FM(unsigned int operators=4)stk::FM
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::FM
keyOn(void)stk::FM
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
loadWaves(const char **filenames)stk::FM
noteOff(StkFloat amplitude)stk::FMvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::TubeBellvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setControl1(StkFloat cVal)stk::FMinline
setControl2(StkFloat cVal)stk::FMinline
setFrequency(StkFloat frequency)stk::FMvirtual
setGain(unsigned int waveIndex, StkFloat gain)stk::FM
setModulationDepth(StkFloat mDepth)stk::FMinline
setModulationSpeed(StkFloat mSpeed)stk::FMinline
setRatio(unsigned int waveIndex, StkFloat ratio)stk::FM
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::TubeBellinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::TubeBellinlinevirtual
TubeBell(void)stk::TubeBell
~FM(void)stk::FMvirtual
~Stk(void)stk::Stkprotectedvirtual
~TubeBell(void)stk::TubeBell

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TubeBell.html0000644000076600007660000013676212327015205016461 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TubeBell Class Reference

STK tubular bell (orchestral chime) FM synthesis instrument. More...

#include <TubeBell.h>

Inheritance diagram for stk::TubeBell:
stk::FM stk::Instrmnt stk::Stk

Public Member Functions

 TubeBell (void)
 Class constructor. More...
 
 ~TubeBell (void)
 Class destructor.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::FM
 FM (unsigned int operators=4)
 Class constructor, taking the number of wave/envelope operators to control. More...
 
virtual ~FM (void)
 Class destructor.
 
void loadWaves (const char **filenames)
 Load the rawwave filenames in waves.
 
virtual void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void setRatio (unsigned int waveIndex, StkFloat ratio)
 Set the frequency ratio for the specified wave.
 
void setGain (unsigned int waveIndex, StkFloat gain)
 Set the gain for the specified wave.
 
void setModulationSpeed (StkFloat mSpeed)
 Set the modulation speed in Hz.
 
void setModulationDepth (StkFloat mDepth)
 Set the modulation depth.
 
void setControl1 (StkFloat cVal)
 Set the value of control1.
 
void setControl2 (StkFloat cVal)
 Set the value of control1.
 
void keyOn (void)
 Start envelopes toward "on" targets.
 
void keyOff (void)
 Start envelopes toward "off" targets.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK tubular bell (orchestral chime) FM synthesis instrument.

This class implements two simple FM Pairs summed together, also referred to as algorithm 5 of the TX81Z.

Algorithm 5 is : 4->3--\
+ --> Out
2->1--/

Control Change Numbers:

  • Modulator Index One = 2
  • Crossfade of Outputs = 4
  • LFO Speed = 11
  • LFO Depth = 1
  • ADSR 2 & 4 Target = 128

The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::TubeBell::TubeBell ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::TubeBell::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::FM.

97 {
98  unsigned int nChannels = lastFrame_.channels();
99 #if defined(_STK_DEBUG_)
100  if ( channel > frames.channels() - nChannels ) {
101  oStream_ << "TubeBell::tick(): channel and StkFrames arguments are incompatible!";
102  handleError( StkError::FUNCTION_ARGUMENT );
103  }
104 #endif
105 
106  StkFloat *samples = &frames[channel];
107  unsigned int j, hop = frames.channels() - nChannels;
108  if ( nChannels == 1 ) {
109  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
110  *samples++ = tick();
111  }
112  else {
113  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
114  *samples++ = tick();
115  for ( j=1; j<nChannels; j++ )
116  *samples++ = lastFrame_[j];
117  }
118  }
119 
120  return frames;
121 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TubeBell.png0000644000076600007660000000134712327015205016267 0ustar gary‰PNG  IHDRRÀ \ÄáPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2vIDATxíQ“« F_füÿ?ù* "¢m½éÃNÓåXIä”÷33_0Iò$”’äà eÊ£™ÏŸAXÒ>>Sæû{¢\¶³ì©]^oú°¤f\*·½äÕ«!—Ý„%©çNY×—ngyYù}áõuó”ÇÂíyRx;Fÿ´=µðµ9[{ŽaIê‰ÿqIò!”’äì43sà=&_ü•ÓäîôWÎFo甤ã¡p"”>„À‡PøJB p‹™™/˜$yJIòá¬Ly´SIûèççø·•iÑÍ—Öšï—Äž^ù/?U²9~V–gê’vš¤vTGmv¬¬¦¦ºm/{ºûÁþ°N…_+·ô'Êcá'åÑÿ–2Iíþ±²V¶6çlÙZ3R;.I„R’|øe¥™™+ï1øâ¯œ&w§¿r6z;¿ ü#%€¡ð!”>„À‡PøJ€[ÌÌ|Á$É“PJ’÷Ê”Ç>ÍŸ=Öæž*7uû%é0.•y7ó¥µþŸ²˜òXnÓš,±•ÕÔ¬«GùPYT½²-¡;ç·ÚÓî¡LR;NÊ I:ò¢ðæÔº÷ñR’žJIòá—•ff®¼Çà‹¿ršÜþÊÙèíü‚òt<”N„À‡PøJB àC(nI)%_Hž„À‡N9OšùÚÁ=Ù¿)£•·ÊN3Èì¡‘rùÉúR¼\r¸l«ìnϬÓ^YBeaóÄA¹=Ó¦÷é@¹/¼Úå᫞嵲¨ÞR×¶Ëm:hO[ø‹]6™ÃÁ]å¨=¥yŸe-|mΡ=5Üu|}//;àC(|øeeJ)¹ò ·3Ö&•\zIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Twang-members.html0000644000076600007660000003006312327015206017457 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Twang Member List

This is the complete list of members for stk::Twang, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
clear(void)stk::Twang
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastOut(void)stk::Twanginline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Twang
setLoopFilter(std::vector< StkFloat > coefficients)stk::Twang
setLoopGain(StkFloat loopGain)stk::Twang
setLowestFrequency(StkFloat frequency)stk::Twang
setPluckPosition(StkFloat position)stk::Twang
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::Twanginline
tick(StkFrames &frames, unsigned int channel=0)stk::Twanginline
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::Twanginline
Twang(StkFloat lowestFrequency=50.0)stk::Twang
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Twang.html0000644000076600007660000012217512327015206016035 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Twang Class Reference

STK enhanced plucked string class. More...

#include <Twang.h>

Inheritance diagram for stk::Twang:
stk::Stk

Public Member Functions

 Twang (StkFloat lowestFrequency=50.0)
 Class constructor, taking the lowest desired playing frequency.
 
void clear (void)
 Reset and clear all internal state.
 
void setLowestFrequency (StkFloat frequency)
 Set the delayline parameters to allow frequencies as low as specified.
 
void setFrequency (StkFloat frequency)
 Set the delayline parameters for a particular frequency.
 
void setPluckPosition (StkFloat position)
 Set the pluck or "excitation" position along the string (0.0 - 1.0).
 
void setLoopGain (StkFloat loopGain)
 Set the nominal loop gain. More...
 
void setLoopFilter (std::vector< StkFloat > coefficients)
 Set the loop filter coefficients. More...
 
StkFloat lastOut (void)
 Return an StkFrames reference to the last output sample frame. More...
 
StkFloat tick (StkFloat input)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the iFrames object as inputs to the class and write outputs to the oFrames object. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the effect and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK enhanced plucked string class.

This class implements an enhanced plucked-string physical model, a la Jaffe-Smith, Smith, Karjalainen and others. It includes a comb filter to simulate pluck position. The tick() function takes an input sample, which is added to the delayline input. This can be used to implement commuted synthesis (if the input samples are derived from the impulse response of a body filter) and/or feedback (as in an electric guitar model).

This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::Twang::setLoopGain ( StkFloat  loopGain)

Set the nominal loop gain.

The actual loop gain is based on the value set with this function, but scaled slightly according to the frequency. Higher frequency settings have greater loop gains because of high-frequency loop-filter roll-off.

void stk::Twang::setLoopFilter ( std::vector< StkFloat >  coefficients)

Set the loop filter coefficients.

The loop filter can be any arbitrary FIR filter. By default, the coefficients are set for a first-order lowpass filter with coefficients b = [0.5 0.5].

StkFloat stk::Twang::lastOut ( void  )
inline

Return an StkFrames reference to the last output sample frame.

Return the last computed output value.

74 { return lastOutput_; };
StkFrames & stk::Twang::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inline

Take a channel of the iFrames object as inputs to the class and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

123 {
124 #if defined(_STK_DEBUG_)
125  if ( channel >= frames.channels() ) {
126  oStream_ << "Twang::tick(): channel and StkFrames arguments are incompatible!";
127  handleError( StkError::FUNCTION_ARGUMENT );
128  }
129 #endif
130 
131  StkFloat *samples = &frames[channel];
132  unsigned int hop = frames.channels();
133  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
134  *samples = tick( *samples );
135 
136  return frames;
137 }
StkFrames & stk::Twang::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the effect and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

140 {
141 #if defined(_STK_DEBUG_)
142  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
143  oStream_ << "Twang::tick(): channel and StkFrames arguments are incompatible!";
144  handleError( StkError::FUNCTION_ARGUMENT );
145  }
146 #endif
147 
148  StkFloat *iSamples = &iFrames[iChannel];
149  StkFloat *oSamples = &oFrames[oChannel];
150  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
151  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop )
152  *oSamples = tick( *iSamples );
153 
154  return iFrames;
155 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Twang.png0000644000076600007660000000065012327015205015645 0ustar gary‰PNG  IHDRFP“ó0PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT27IDATxíÛŽÃ Dƒ”ÿÿäMB†:—.<¬´´,û€í¤ÏÄc¿ˆ’Ô«‰‘$_—˜°›Ù¯Çý%f_'ß[Ìvìv¶M9­û“ÏÜ3ά½$ã–dÌÇñuxîSÕUQnüqÉ—˜º(§Åo‹²æMêM‹¢Îç×nIÆæ«)I¾&F’|­˜cìÀ“€~Á,ËÎÌJÁ„ùc“š€ M €¯‰ð51¾&À׿ńB¿½š_ fݘý9€{Ýb’àI³z<öBµÒÝÖ =¤<.f‘íLùÄdXv0%¦)*g™ºËÏgQ˜Ôñ;L]TƒIß&ßðVOªmt‰¿(êl£m±972?'ð À\´à+•eþßø‡ !„ný÷ÞÆç6²8IEND®B`‚stk-4.5.0/doc/html/classstk_1_1TwoPole-members.html0000644000076600007660000003426712327015206020002 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TwoPole Member List

This is the complete list of members for stk::TwoPole, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
getGain(void) const stk::Filterinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::TwoPoleinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::TwoPoleinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
setA1(StkFloat a1)stk::TwoPoleinline
setA2(StkFloat a2)stk::TwoPoleinline
setB0(StkFloat b0)stk::TwoPoleinline
setCoefficients(StkFloat b0, StkFloat a1, StkFloat a2, bool clearState=false)stk::TwoPole
setGain(StkFloat gain)stk::Filterinline
setRawwavePath(std::string path)stk::Stkstatic
setResonance(StkFloat frequency, StkFloat radius, bool normalize=false)stk::TwoPole
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::TwoPoleinline
tick(StkFrames &frames, unsigned int channel=0)stk::TwoPoleinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::TwoPoleinline
TwoPole(void)stk::TwoPole
~Stk(void)stk::Stkprotectedvirtual
~TwoPole()stk::TwoPole

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TwoPole.html0000644000076600007660000013734312327015206016351 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TwoPole Class Reference

STK two-pole filter class. More...

#include <TwoPole.h>

Inheritance diagram for stk::TwoPole:
stk::Filter stk::Stk

Public Member Functions

 TwoPole (void)
 Default constructor creates a second-order pass-through filter.
 
 ~TwoPole ()
 Class destructor.
 
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes.
 
void setB0 (StkFloat b0)
 Set the b[0] coefficient value.
 
void setA1 (StkFloat a1)
 Set the a[1] coefficient value.
 
void setA2 (StkFloat a2)
 Set the a[2] coefficient value.
 
void setCoefficients (StkFloat b0, StkFloat a1, StkFloat a2, bool clearState=false)
 Set all filter coefficients.
 
void setResonance (StkFloat frequency, StkFloat radius, bool normalize=false)
 Sets the filter coefficients for a resonance at frequency (in Hz). More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK two-pole filter class.

This class implements a two-pole digital filter. A method is provided for creating a resonance in the frequency response while maintaining a nearly constant filter gain.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::TwoPole::setResonance ( StkFloat  frequency,
StkFloat  radius,
bool  normalize = false 
)

Sets the filter coefficients for a resonance at frequency (in Hz).

This method determines the filter coefficients corresponding to two complex-conjugate poles with the given frequency (in Hz) and radius from the z-plane origin. If normalize is true, the coefficients are then normalized to produce unity gain at frequency (the actual maximum filter gain tends to be slightly greater than unity when radius is not close to one). The resulting filter frequency response has a resonance at the given frequency. The closer the poles are to the unit-circle (radius close to one), the narrower the resulting resonance width. An unstable filter will result for radius >= 1.0. The frequency value should be between zero and half the sample rate. For a better resonance filter, use a BiQuad filter.

See Also
BiQuad filter class
StkFrames & stk::TwoPole::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

107 {
108 #if defined(_STK_DEBUG_)
109  if ( channel >= frames.channels() ) {
110  oStream_ << "TwoPole::tick(): channel and StkFrames arguments are incompatible!";
111  handleError( StkError::FUNCTION_ARGUMENT );
112  }
113 #endif
114 
115  StkFloat *samples = &frames[channel];
116  unsigned int hop = frames.channels();
117  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
118  inputs_[0] = gain_ * *samples;
119  *samples = b_[0] * inputs_[0] - a_[1] * outputs_[1] - a_[2] * outputs_[2];
120  outputs_[2] = outputs_[1];
121  outputs_[1] = *samples;
122  }
123 
124  lastFrame_[0] = outputs_[1];
125  return frames;
126 }
StkFrames & stk::TwoPole::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

129 {
130 #if defined(_STK_DEBUG_)
131  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
132  oStream_ << "TwoPole::tick(): channel and StkFrames arguments are incompatible!";
133  handleError( StkError::FUNCTION_ARGUMENT );
134  }
135 #endif
136 
137  StkFloat *iSamples = &iFrames[iChannel];
138  StkFloat *oSamples = &oFrames[oChannel];
139  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
140  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
141  inputs_[0] = gain_ * *iSamples;
142  *oSamples = b_[0] * inputs_[0] - a_[1] * outputs_[1] - a_[2] * outputs_[2];
143  outputs_[2] = outputs_[1];
144  outputs_[1] = *oSamples;
145  }
146 
147  lastFrame_[0] = outputs_[1];
148  return iFrames;
149 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TwoPole.png0000644000076600007660000000113012327015206016151 0ustar gary‰PNG  IHDRQˆ¨`÷ãPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2çIDATxíÑ’« ›C•ÿÿÉWQtP°’0/[w²Ó)AiÎæœsv…,IŽ„Q’æy7¦Rf¼~:Ó’®úÊX®÷¹ŒÛf¶ÙÕÇÅ}Z’©‘ñÜIY\¥g3-Iw^ŒÇÒvåyŽÃ¶_»î.=¶þ½±íº“Ì]Ûêeýe2G×5—3™vZ’îÄïZ’æ £$ͳsÎÙ€X\q7.‹·Òݸ •þÆ?‘u#ÀbpÅݸ,ÞJwã*tVúÿDÖap Œó„`ž0ÌF€yÂ0&¥”\!8F€ynÆu`Æ5< ©ÛlûÀ«ññ´¼îŒŒÛ[ÿ¦Ûû ûÞNã5¼6}wQ©ºúi¼Ý¹†ç{ZcÝF¯Áfa=ÇwãnúÐØ‰yÇ-Ûõ͸ÿ½;É$°Õæxϧkt]Oß&c˜¬Ûa'kÂ0ÏkL)%Oþ`"§Ó§L…IEND®B`‚stk-4.5.0/doc/html/classstk_1_1TwoZero-members.html0000644000076600007660000003423112327015206020011 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TwoZero Member List

This is the complete list of members for stk::TwoZero, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsIn(void) const stk::Filterinline
channelsOut(void) const stk::Filterinline
clear(void)stk::Filterinlinevirtual
Filter(void)stk::Filterinline
getGain(void) const stk::Filterinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::TwoZeroinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Filterinline
lastOut(void) const stk::TwoZeroinline
phaseDelay(StkFloat frequency)stk::Filterinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
setB0(StkFloat b0)stk::TwoZeroinline
setB1(StkFloat b1)stk::TwoZeroinline
setB2(StkFloat b2)stk::TwoZeroinline
setCoefficients(StkFloat b0, StkFloat b1, StkFloat b2, bool clearState=false)stk::TwoZero
setGain(StkFloat gain)stk::Filterinline
setNotch(StkFloat frequency, StkFloat radius)stk::TwoZero
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(StkFloat input)stk::TwoZeroinline
tick(StkFrames &frames, unsigned int channel=0)stk::TwoZeroinlinevirtual
tick(StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)stk::TwoZeroinline
TwoZero()stk::TwoZero
~Stk(void)stk::Stkprotectedvirtual
~TwoZero()stk::TwoZero

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TwoZero.html0000644000076600007660000013607412327015206016371 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::TwoZero Class Reference

STK two-zero filter class. More...

#include <TwoZero.h>

Inheritance diagram for stk::TwoZero:
stk::Filter stk::Stk

Public Member Functions

 TwoZero ()
 Default constructor creates a second-order pass-through filter.
 
 ~TwoZero ()
 Class destructor.
 
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes.
 
void setB0 (StkFloat b0)
 Set the b[0] coefficient value.
 
void setB1 (StkFloat b1)
 Set the b[1] coefficient value.
 
void setB2 (StkFloat b2)
 Set the b[2] coefficient value.
 
void setCoefficients (StkFloat b0, StkFloat b1, StkFloat b2, bool clearState=false)
 Set all filter coefficients.
 
void setNotch (StkFloat frequency, StkFloat radius)
 Sets the filter coefficients for a "notch" at frequency (in Hz). More...
 
StkFloat lastOut (void) const
 Return the last computed output value.
 
StkFloat tick (StkFloat input)
 Input one sample to the filter and return one output.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. More...
 
StkFramestick (StkFrames &iFrames, StkFrames &oFrames, unsigned int iChannel=0, unsigned int oChannel=0)
 Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object. More...
 
- Public Member Functions inherited from stk::Filter
 Filter (void)
 Class constructor.
 
unsigned int channelsIn (void) const
 Return the number of input channels for the class.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
virtual void clear (void)
 Clears all internal states of the filter.
 
void setGain (StkFloat gain)
 Set the filter gain. More...
 
StkFloat getGain (void) const
 Return the current filter gain.
 
StkFloat phaseDelay (StkFloat frequency)
 Return the filter phase delay at the specified frequency. More...
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK two-zero filter class.

This class implements a two-zero digital filter. A method is provided for creating a "notch" in the frequency response while maintaining a constant filter gain.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::TwoZero::setNotch ( StkFloat  frequency,
StkFloat  radius 
)

Sets the filter coefficients for a "notch" at frequency (in Hz).

This method determines the filter coefficients corresponding to two complex-conjugate zeros with the given frequency (in Hz) and radius from the z-plane origin. The coefficients are then normalized to produce a maximum filter gain of one (independent of the filter gain parameter). The resulting filter frequency response has a "notch" or anti-resonance at the given frequency. The closer the zeros are to the unit-circle (radius close to or equal to one), the narrower the resulting notch width. The frequency value should be between zero and half the sample rate. The radius value should be positive.

StkFrames & stk::TwoZero::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.

The StkFrames argument reference is returned. The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Filter.

103 {
104 #if defined(_STK_DEBUG_)
105  if ( channel >= frames.channels() ) {
106  oStream_ << "TwoZero::tick(): channel and StkFrames arguments are incompatible!";
107  handleError( StkError::FUNCTION_ARGUMENT );
108  }
109 #endif
110 
111  StkFloat *samples = &frames[channel];
112  unsigned int hop = frames.channels();
113  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
114  inputs_[0] = gain_ * *samples;
115  *samples = b_[2] * inputs_[2] + b_[1] * inputs_[1] + b_[0] * inputs_[0];
116  inputs_[2] = inputs_[1];
117  inputs_[1] = inputs_[0];
118  }
119 
120  lastFrame_[0] = *(samples-hop);
121  return frames;
122 }
StkFrames & stk::TwoZero::tick ( StkFrames iFrames,
StkFrames oFrames,
unsigned int  iChannel = 0,
unsigned int  oChannel = 0 
)
inline

Take a channel of the iFrames object as inputs to the filter and write outputs to the oFrames object.

The iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

125 {
126 #if defined(_STK_DEBUG_)
127  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
128  oStream_ << "TwoZero::tick(): channel and StkFrames arguments are incompatible!";
129  handleError( StkError::FUNCTION_ARGUMENT );
130  }
131 #endif
132 
133  StkFloat *iSamples = &iFrames[iChannel];
134  StkFloat *oSamples = &oFrames[oChannel];
135  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
136  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
137  inputs_[0] = gain_ * *iSamples;
138  *oSamples = b_[2] * inputs_[2] + b_[1] * inputs_[1] + b_[0] * inputs_[0];
139  inputs_[2] = inputs_[1];
140  inputs_[1] = inputs_[0];
141  }
142 
143  lastFrame_[0] = *(oSamples-oHop);
144  return iFrames;
145 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1TwoZero.png0000644000076600007660000000113612327015206016177 0ustar gary‰PNG  IHDRTˆNI<§PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2íIDATxíÑ’¬ ›C•ÿÿÉWœ r—Š[•Ùô, i‰ßÉ9goÈ’äKH%É—Ÿ¤©„™ïŸ‡eI&~)-ãsí;éq¤ã\VP÷eI6æÒë<%¿9JñfY’þ+­Ù}òõLçõÿPþcv-à+i_þC£¾+߯S÷ߨZ~kÓÕ¨~Y’âÝ—$_B*I¾ìÒœsv`‘ À›7¤Ûö‚õ éîô·¾"ýCÝ)€3!ð%¤¾„À—øR€rÎÙ²$ùRIòe.M%>ÓòiËöŠ$õ¬K§W$©çQZN´Ùì6(k癯2“ÔÅ“Ôyìï îž@a<õDZ³mÍç#UÒ'.$Ù˜–?H‡“~î"©‹I£lù3éØÁÅg:iÔ÷å·6=6Êv_’:âÝ—$_B*I¾ìÒœsv`‘ À›7¤Ûö‚õ éîô·¾"ýCÝ)€3!ð%¤¾„À—øR€RJÉ€/!ðå&Ý'fÞz t1[_’ž O¬H;ן˜=l9_Ôù™u]»¤§«DŒÒ6ºœºýºf77j474ôÀPþ²´e×~M¥}ù7éùwOîþOÊïÔ¥ÝÛ5iã¬üÖ Û([vÝuÕݺÿÇ»R_Þ’¦”’3ÿ|)#Ú;[@NIEND®B`‚stk-4.5.0/doc/html/classstk_1_1UdpSocket-members.html0000644000076600007660000003353712327015206020311 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::UdpSocket Member List

This is the complete list of members for stk::UdpSocket, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
close(int socket)stk::Socketstatic
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
id(void) const stk::Socketinline
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
isValid(int socket)stk::Socketinlinestatic
port(void) const stk::Socketinline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
readBuffer(void *buffer, long bufferSize, int flags=0)stk::UdpSocketvirtual
stk::Socket::readBuffer(int socket, void *buffer, long bufferSize, int flags)stk::Socketstatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setAddress(struct sockaddr_in *address, int port=2006, std::string hostname="localhost")stk::UdpSocketprotected
setBlocking(int socket, bool enable)stk::Socketstatic
setDestination(int port=2006, std::string hostname="localhost")stk::UdpSocket
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Socket()stk::Socket
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
UdpSocket(int port=2006)stk::UdpSocket
writeBuffer(const void *buffer, long bufferSize, int flags=0)stk::UdpSocketvirtual
stk::Socket::writeBuffer(int socket, const void *buffer, long bufferSize, int flags)stk::Socketstatic
writeBufferTo(const void *buffer, long bufferSize, int port, std::string hostname="localhost", int flags=0)stk::UdpSocket
~Socket()stk::Socketvirtual
~Stk(void)stk::Stkprotectedvirtual
~UdpSocket()stk::UdpSocket

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1UdpSocket.html0000644000076600007660000006422312327015206016655 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


STK UDP socket server/client class. More...

#include <UdpSocket.h>

Inheritance diagram for stk::UdpSocket:
stk::Socket stk::Stk

Public Member Functions

 UdpSocket (int port=2006)
 Default constructor creates a local UDP socket on port 2006 (or the specified port number). More...
 
 ~UdpSocket ()
 The class destructor closes the socket instance.
 
void setDestination (int port=2006, std::string hostname="localhost")
 Set the address for subsequent outgoing data sent via the writeBuffer() function. More...
 
int writeBuffer (const void *buffer, long bufferSize, int flags=0)
 Send a buffer to the address specified with the setDestination() function. Returns the number of bytes written or -1 if an error occurs. More...
 
int readBuffer (void *buffer, long bufferSize, int flags=0)
 Read an input buffer, up to length bufferSize. Returns the number of bytes read or -1 if an error occurs.
 
int writeBufferTo (const void *buffer, long bufferSize, int port, std::string hostname="localhost", int flags=0)
 Write a buffer to the specified socket. Returns the number of bytes written or -1 if an error occurs.
 
- Public Member Functions inherited from stk::Socket
 Socket ()
 Class constructor.
 
virtual ~Socket ()
 Class destructor.
 
int id (void) const
 Return the socket descriptor.
 
int port (void) const
 Return the socket port number.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Protected Member Functions

void setAddress (struct sockaddr_in *address, int port=2006, std::string hostname="localhost")
 A protected function for use in writing a socket address structure. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Socket
static void close (int socket)
 Close the socket.
 
static bool isValid (int socket)
 Returns true if the socket descriptor is valid.
 
static void setBlocking (int socket, bool enable)
 If enable = false, the socket is set to non-blocking mode. When first created, sockets are by default in blocking mode.
 
static int writeBuffer (int socket, const void *buffer, long bufferSize, int flags)
 Write a buffer via the specified socket. Returns the number of bytes written or -1 if an error occurs.
 
static int readBuffer (int socket, void *buffer, long bufferSize, int flags)
 Read a buffer via the specified socket. Returns the number of bytes read or -1 if an error occurs.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 

Detailed Description

STK UDP socket server/client class.

This class provides a uniform cross-platform UDP socket server/client interface. Methods are provided for reading or writing data buffers. The constructor creates a UDP socket and binds it to the specified port. Note that only one socket can be bound to a given port on the same machine.

UDP sockets provide unreliable, connection-less service. Messages can be lost, duplicated, or received out of order. That said, data transmission tends to be faster than with TCP connections and datagrams are not potentially combined by the underlying system.

The user is responsible for checking the values returned by the read/write methods. Values less than or equal to zero indicate the occurence of an error.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::UdpSocket::UdpSocket ( int  port = 2006)

Default constructor creates a local UDP socket on port 2006 (or the specified port number).

An StkError will be thrown if a socket error occurs during instantiation.

Member Function Documentation

void stk::UdpSocket::setDestination ( int  port = 2006,
std::string  hostname = "localhost" 
)

Set the address for subsequent outgoing data sent via the writeBuffer() function.

An StkError will be thrown if the host is unknown.

int stk::UdpSocket::writeBuffer ( const void *  buffer,
long  bufferSize,
int  flags = 0 
)
virtual

Send a buffer to the address specified with the setDestination() function. Returns the number of bytes written or -1 if an error occurs.

This function will fail if the default address (set with setDestination()) is invalid or has not been specified.

Implements stk::Socket.

void stk::UdpSocket::setAddress ( struct sockaddr_in *  address,
int  port = 2006,
std::string  hostname = "localhost" 
)
protected

A protected function for use in writing a socket address structure.

An StkError will be thrown if the host is unknown.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1UdpSocket.png0000644000076600007660000000122212327015206016463 0ustar gary‰PNG  IHDR]ˆ²\mPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2!IDATxííÒª0 ·Og¸ÿK>ÒH1*èä¼ãX‡ÚP—4©þ&çœÃ KRÓ.IoOå2óÛÇ KÒ7ìe\cÚ×$×L­© ŽaI:òܾeXD]VêbÂ’äóÒÞ4£e«û‹Òœ¨Œ«i[úÌ>VÆéꇕ±—wf>èj«LïéÖÕ1,I>óF’<¦]’<¾ÜžsÎQ\`#Ô¾,‘úPûM¨µõ™™v—ið˜við˜við˜v_²çœsdI bÚ%Éã¯ì©\f~ûHÒÀ¸B’NÛËøîûïØ×$×Lí öAÝB½µeâìͳׯ”k0loé³â®Ïìmù¸¾gkLmWì›æn«6ik¯?ÝU[™±«ûV™Ó]M’½Ú‡EW+ÓóÚÏ…9,û™©%4}Ÿÿ3’ô‚i—$/·çœsXµ/K¤>Ô~“êcí_}f¦ÀeÚ<¦ÀcÚ<¦ÀcÚ<¦Àã—ì)¥ ˆiðø¯öÛÄÎ˸L¼œ`¸Žžwí6zÖ¾¦ÓNè¶póôxÉy\·Poí{eÒ÷¶Ùëê°ÓmØi‰ôך[󞟵·¶À¦Zû­û¦}£*sÚ~ŒîöÚq§«¶2ÏìNt3GÀ«û}WǺ?|çƒ7î•éì' mØœÏLÍbèû…ßêåŸõÏØ.1íáö”RŠâx©'„oç´ÃIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Vector3D-members.html0000644000076600007660000002721412327015206020034 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Vector3D Member List

This is the complete list of members for stk::Vector3D, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
getLength(void)stk::Vector3Dinline
getX(void)stk::Vector3Dinline
getY(void)stk::Vector3Dinline
getZ(void)stk::Vector3Dinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setX(StkFloat x)stk::Vector3Dinline
setXYZ(StkFloat x, StkFloat y, StkFloat z)stk::Vector3Dinline
setY(StkFloat y)stk::Vector3Dinline
setZ(StkFloat z)stk::Vector3Dinline
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
Vector3D(StkFloat x=0.0, StkFloat y=0.0, StkFloat z=0.0)stk::Vector3Dinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Vector3D.html0000644000076600007660000006635512327015206016415 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Vector3D Class Reference

STK 3D vector class. More...

#include <Vector3D.h>

Inheritance diagram for stk::Vector3D:
stk::Stk

Public Member Functions

 Vector3D (StkFloat x=0.0, StkFloat y=0.0, StkFloat z=0.0)
 Default constructor taking optional initial X, Y, and Z values.
 
StkFloat getX (void)
 Get the current X value.
 
StkFloat getY (void)
 Get the current Y value.
 
StkFloat getZ (void)
 Get the current Z value.
 
StkFloat getLength (void)
 Calculate the vector length.
 
void setXYZ (StkFloat x, StkFloat y, StkFloat z)
 Set the X, Y, and Z values simultaniously.
 
void setX (StkFloat x)
 Set the X value.
 
void setY (StkFloat y)
 Set the Y value.
 
void setZ (StkFloat z)
 Set the Z value.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK 3D vector class.

This class implements a three-dimensional vector.

by Perry R. Cook, 1995–2014.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Vector3D.png0000644000076600007660000000064712327015206016225 0ustar gary‰PNG  IHDRWP[æPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT26IDATxíáŽÃ ƒ#õýùZHPÆmô4]&ÜÑtùBh¿B „@’ÓåÜ?æJ\Õýþé„Išõ)7îSì6÷8Øqºš¡›6L’Fn>UDœ˜èB&ÉŽÆ\ØüìïȈß|èô5îr­¾Ýö¡^½y¸Õ7õáìZî› “dGþÿàÜ/ç†Â|À»Ú`q·m xwÇ.¯â~Ý<8×¹Êr®s VÎuî¿áŠˆ,¦Ë¹r÷›ú>í/•ÛÀÑ~¬™ÜÕèù¨pZ:w%OSÎ#¥¯r)ù9Ks37=ˆ«ªß¨|å –k_®æjRkDýž7×4Üó¹öä×úÐrMÃ^›4ô÷ÅHôý}kŽKúÕ¥~5ytì°Œæ¦È¹Î}ˆ+"2_?¨¿ZàÇȨIEND®B`‚stk-4.5.0/doc/html/classstk_1_1Voicer-members.html0000644000076600007660000003373712327015206017641 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Voicer Member List

This is the complete list of members for stk::Voicer, including all inherited members.

addInstrument(Instrmnt *instrument, int group=0)stk::Voicer
addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Voicerinline
controlChange(int number, StkFloat value, int group=0)stk::Voicer
controlChange(long tag, int number, StkFloat value)stk::Voicer
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::Voicerinline
lastOut(unsigned int channel=0)stk::Voicerinline
noteOff(StkFloat noteNumber, StkFloat amplitude, int group=0)stk::Voicer
noteOff(long tag, StkFloat amplitude)stk::Voicer
noteOn(StkFloat noteNumber, StkFloat amplitude, int group=0)stk::Voicer
pitchBend(StkFloat value, int group=0)stk::Voicer
pitchBend(long tag, StkFloat value)stk::Voicer
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeInstrument(Instrmnt *instrument)stk::Voicer
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat noteNumber, int group=0)stk::Voicer
setFrequency(long tag, StkFloat noteNumber)stk::Voicer
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
silence(void)stk::Voicer
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Voicerinline
tick(StkFrames &frames, unsigned int channel=0)stk::Voicerinline
Voicer(StkFloat decayTime=0.2)stk::Voicer
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Voicer.html0000644000076600007660000015362212327015206016205 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Voicer Class Reference

STK voice manager class. More...

#include <Voicer.h>

Inheritance diagram for stk::Voicer:
stk::Stk

Public Member Functions

 Voicer (StkFloat decayTime=0.2)
 Class constructor taking an optional note decay time (in seconds).
 
void addInstrument (Instrmnt *instrument, int group=0)
 Add an instrument with an optional group number to the voice manager. More...
 
void removeInstrument (Instrmnt *instrument)
 Remove the given instrument pointer from the voice manager's control. More...
 
long noteOn (StkFloat noteNumber, StkFloat amplitude, int group=0)
 Initiate a noteOn event with the given note number and amplitude and return a unique note tag. More...
 
void noteOff (StkFloat noteNumber, StkFloat amplitude, int group=0)
 Send a noteOff to all voices having the given noteNumber and optional group (default group = 0). More...
 
void noteOff (long tag, StkFloat amplitude)
 Send a noteOff to the voice with the given note tag. More...
 
void setFrequency (StkFloat noteNumber, int group=0)
 Send a frequency update message to all voices assigned to the optional group argument (default group = 0). More...
 
void setFrequency (long tag, StkFloat noteNumber)
 Send a frequency update message to the voice with the given note tag. More...
 
void pitchBend (StkFloat value, int group=0)
 Send a pitchBend message to all voices assigned to the optional group argument (default group = 0).
 
void pitchBend (long tag, StkFloat value)
 Send a pitchBend message to the voice with the given note tag.
 
void controlChange (int number, StkFloat value, int group=0)
 Send a controlChange to all instruments assigned to the optional group argument (default group = 0).
 
void controlChange (long tag, int number, StkFloat value)
 Send a controlChange to the voice with the given note tag.
 
void silence (void)
 Send a noteOff message to all existing voices.
 
unsigned int channelsOut (void) const
 Return the current number of output channels.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
StkFloat tick (unsigned int channel=0)
 Mix one sample frame of all sounding voices and return the specified channel value. More...
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill the StkFrames argument with computed frames and return the same reference. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK voice manager class.

This class can be used to manage a group of STK instrument classes. Individual voices can be controlled via unique note tags. Instrument groups can be controlled by group number.

A previously constructed STK instrument class is linked with a voice manager using the addInstrument() function. An optional group number argument can be specified to the addInstrument() function as well (default group = 0). The voice manager does not delete any instrument instances ... it is the responsibility of the user to allocate and deallocate all instruments.

The tick() function returns the mix of all sounding voices. Each noteOn returns a unique tag (credits to the NeXT MusicKit), so you can send control changes to specific voices within an ensemble. Alternately, control changes can be sent to all voices in a given group.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

void stk::Voicer::addInstrument ( Instrmnt instrument,
int  group = 0 
)

Add an instrument with an optional group number to the voice manager.

A set of instruments can be grouped by group number and controlled via the functions that take a group number argument.

void stk::Voicer::removeInstrument ( Instrmnt instrument)

Remove the given instrument pointer from the voice manager's control.

It is important that any instruments which are to be deleted by the user while the voice manager is running be first removed from the manager's control via this function!!

long stk::Voicer::noteOn ( StkFloat  noteNumber,
StkFloat  amplitude,
int  group = 0 
)

Initiate a noteOn event with the given note number and amplitude and return a unique note tag.

Send the noteOn message to the first available unused voice. If all voices are sounding, the oldest voice is interrupted and sent the noteOn message. If the optional group argument is non-zero, only voices in that group are used. If no voices are found for a specified non-zero group value, the function returns -1. The amplitude value should be in the range 0.0 - 128.0.

void stk::Voicer::noteOff ( StkFloat  noteNumber,
StkFloat  amplitude,
int  group = 0 
)

Send a noteOff to all voices having the given noteNumber and optional group (default group = 0).

The amplitude value should be in the range 0.0 - 128.0.

void stk::Voicer::noteOff ( long  tag,
StkFloat  amplitude 
)

Send a noteOff to the voice with the given note tag.

The amplitude value should be in the range 0.0 - 128.0.

void stk::Voicer::setFrequency ( StkFloat  noteNumber,
int  group = 0 
)

Send a frequency update message to all voices assigned to the optional group argument (default group = 0).

The noteNumber argument corresponds to a MIDI note number, though it is a floating-point value and can range beyond the normal 0-127 range.

void stk::Voicer::setFrequency ( long  tag,
StkFloat  noteNumber 
)

Send a frequency update message to the voice with the given note tag.

The noteNumber argument corresponds to a MIDI note number, though it is a floating-point value and can range beyond the normal 0-127 range.

StkFloat stk::Voicer::lastOut ( unsigned int  channel = 0)
inline

Return the specified channel value of the last computed frame.

The channel argument must be less than the number of output channels, which can be determined with the channelsOut() function (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

See Also
lastFrame()
166 {
167 #if defined(_STK_DEBUG_)
168  if ( channel >= lastFrame_.channels() ) {
169  oStream_ << "Voicer::lastOut(): channel argument is invalid!";
170  handleError( StkError::FUNCTION_ARGUMENT );
171  }
172 #endif
173 
174  return lastFrame_[channel];
175 }
StkFloat stk::Voicer::tick ( unsigned int  channel = 0)
inline

Mix one sample frame of all sounding voices and return the specified channel value.

The channel argument must be less than the number of output channels, which can be determined with the channelsOut() function (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

179 {
180  unsigned int j;
181  for ( j=0; j<lastFrame_.channels(); j++ ) lastFrame_[j] = 0.0;
182  for ( unsigned int i=0; i<voices_.size(); i++ ) {
183  if ( voices_[i].sounding != 0 ) {
184  voices_[i].instrument->tick();
185  for ( j=0; j<voices_[i].instrument->channelsOut(); j++ ) lastFrame_[j] += voices_[i].instrument->lastOut( j );
186  }
187  if ( voices_[i].sounding < 0 )
188  voices_[i].sounding++;
189  if ( voices_[i].sounding == 0 )
190  voices_[i].noteNumber = -1;
191  }
192 
193  return lastFrame_[channel];
194 }
StkFrames & stk::Voicer::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inline

Fill the StkFrames argument with computed frames and return the same reference.

The number of channels in the StkFrames argument must equal the number of channels in the file data. However, this is only checked if STK_DEBUG is defined during compilation, in which case an incompatibility will trigger an StkError exception. If no file data is loaded, the function does nothing (a warning will be issued if STK_DEBUG is defined during compilation).

197 {
198  unsigned int nChannels = lastFrame_.channels();
199 #if defined(_STK_DEBUG_)
200  if ( channel > frames.channels() - nChannels ) {
201  oStream_ << "Voicer::tick(): channel and StkFrames arguments are incompatible!";
202  handleError( StkError::FUNCTION_ARGUMENT );
203  }
204 #endif
205 
206  StkFloat *samples = &frames[channel];
207  unsigned int j, hop = frames.channels() - nChannels;
208  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
209  tick();
210  for ( j=0; j<nChannels; j++ )
211  *samples++ = lastFrame_[j];
212  }
213 
214  return frames;
215 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Voicer.png0000644000076600007660000000063512327015206016020 0ustar gary‰PNG  IHDRGP|½˜PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2,IDATxíÛ®„ ‹&ñÿ?ù "7™Õ The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::VoicForm Member List

This is the complete list of members for stk::VoicForm, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::VoicFormvirtual
controlChange(int number, StkFloat value)stk::VoicFormvirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::VoicForminlinevirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::VoicFormvirtual
printErrors(bool status)stk::Stkinlinestatic
quiet(void)stk::VoicForm
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFilterSweepRate(unsigned int whichOne, StkFloat rate)stk::VoicForm
setFrequency(StkFloat frequency)stk::VoicFormvirtual
setPhoneme(const char *phoneme)stk::VoicForm
setPitchSweepRate(StkFloat rate)stk::VoicForminline
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
setUnVoiced(StkFloat nGain)stk::VoicForminline
setVoiced(StkFloat vGain)stk::VoicForminline
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
speak(void)stk::VoicForminline
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::VoicForminlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::VoicForminlinevirtual
VoicForm(void)stk::VoicForm
~Stk(void)stk::Stkprotectedvirtual
~VoicForm(void)stk::VoicForm

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1VoicForm.html0000644000076600007660000012516712327015206016505 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::VoicForm Class Reference

Four formant synthesis instrument. More...

#include <VoicForm.h>

Inheritance diagram for stk::VoicForm:
stk::Instrmnt stk::Stk

Public Member Functions

 VoicForm (void)
 Class constructor. More...
 
 ~VoicForm (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
bool setPhoneme (const char *phoneme)
 Set instrument parameters for the given phoneme. Returns false if phoneme not found.
 
void setVoiced (StkFloat vGain)
 Set the voiced component gain.
 
void setUnVoiced (StkFloat nGain)
 Set the unvoiced component gain.
 
void setFilterSweepRate (unsigned int whichOne, StkFloat rate)
 Set the sweep rate for a particular formant filter (0-3).
 
void setPitchSweepRate (StkFloat rate)
 Set voiced component pitch sweep rate.
 
void speak (void)
 Start the voice.
 
void quiet (void)
 Stop the voice.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

Four formant synthesis instrument.

This instrument contains an excitation singing wavetable (looping wave with random and periodic vibrato, smoothing on frequency, etc.), excitation noise, and four sweepable complex resonances.

Measured formant data is included, and enough data is there to support either parallel or cascade synthesis. In the floating point case cascade synthesis is the most natural so that's what you'll find here.

Control Change Numbers:

  • Voiced/Unvoiced Mix = 2
  • Vowel/Phoneme Selection = 4
  • Vibrato Frequency = 11
  • Vibrato Gain = 1
  • Loudness (Spectral Tilt) = 128

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::VoicForm::VoicForm ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::VoicForm::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

133 {
134  unsigned int nChannels = lastFrame_.channels();
135 #if defined(_STK_DEBUG_)
136  if ( channel > frames.channels() - nChannels ) {
137  oStream_ << "VoicForm::tick(): channel and StkFrames arguments are incompatible!";
138  handleError( StkError::FUNCTION_ARGUMENT );
139  }
140 #endif
141 
142  StkFloat *samples = &frames[channel];
143  unsigned int j, hop = frames.channels() - nChannels;
144  if ( nChannels == 1 ) {
145  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
146  *samples++ = tick();
147  }
148  else {
149  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
150  *samples++ = tick();
151  for ( j=1; j<nChannels; j++ )
152  *samples++ = lastFrame_[j];
153  }
154  }
155 
156  return frames;
157 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1VoicForm.png0000644000076600007660000000111612327015206016310 0ustar gary‰PNG  IHDRXˆTuÜ)PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÝIDATxíáró* DËŒßÿ‘¯1F6qÕïfªVÛ dEó›œsöY’žW€ÿàT¢›Ï?ƒ´$ƒËxÍÝ/W[î×Cêà˜–$£+p»WalœbD—–¤Þ€+ÁšÇW^¼µbH¨ä6ØZ1hÞ}+ú½Š{Í«Vl­kͳiI(¾+,IV_ Î9güX€‡¼ÀÓäDöÏ\²ø _E€ pP€ `àXø¯€sÎÙCdIz^þGàT¢ŸJÚã8æ œèü§g—ñRØËK¢ü–Ukµä_וuc?MR•T¢¯^+¯[Õîµ—ÇžíZñÜÊŸƒ­'°=åp’úXq\?ëÖº3«5n¾x’ôŒ`I²ò眳ƒ~¬ ÀC^àir"{g®Ù ü…¯"À8(À° p€¬üWÀ)¥ä!Àó ð¯ƒçI?_Ç{¦­ë3ð±ðB;x9¿>?{Å2[¯WÔFÛÕ7ŽÙÛÀk®Dݘ€ƒöì¾;®hÿ¿èÁuËÑ‹3xóHVÝcÅ ¼ÕûÞl mV<NÐÇàa\{üΊ­umÅîé›WqaÀc p€¬<Á)¥ä ÿ¿À%S%ùÔ"IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Whistle-members.html0000644000076600007660000003251212327015206020017 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Whistle Member List

This is the complete list of members for stk::Whistle, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Whistlevirtual
controlChange(int number, StkFloat value)stk::Whistlevirtual
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
noteOff(StkFloat amplitude)stk::Whistlevirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Whistlevirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setFrequency(StkFloat frequency)stk::Whistlevirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
startBlowing(StkFloat amplitude, StkFloat rate)stk::Whistle
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
stopBlowing(StkFloat rate)stk::Whistle
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Whistlevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Whistleinlinevirtual
Whistle(void)stk::Whistle
~Stk(void)stk::Stkprotectedvirtual
~Whistle(void)stk::Whistle

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Whistle.html0000644000076600007660000011657312327015206016401 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Whistle Class Reference

STK police/referee whistle instrument class. More...

#include <Whistle.h>

Inheritance diagram for stk::Whistle:
stk::Instrmnt stk::Stk

Public Member Functions

 Whistle (void)
 Class constructor. More...
 
 ~Whistle (void)
 Class destructor.
 
void clear (void)
 Reset and clear all internal state.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void startBlowing (StkFloat amplitude, StkFloat rate)
 Apply breath velocity to instrument with given amplitude and rate of increase.
 
void stopBlowing (StkFloat rate)
 Decrease breath velocity with given rate of decrease.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK police/referee whistle instrument class.

This class implements a hybrid physical/spectral model of a police whistle (a la Cook).

Control Change Numbers:

  • Noise Gain = 4
  • Fipple Modulation Frequency = 11
  • Fipple Modulation Gain = 1
  • Blowing Frequency Modulation = 2
  • Volume = 128

by Perry R. Cook 1995–2014.

Constructor & Destructor Documentation

stk::Whistle::Whistle ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::Whistle::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::Instrmnt.

101 {
102  unsigned int nChannels = lastFrame_.channels();
103 #if defined(_STK_DEBUG_)
104  if ( channel > frames.channels() - nChannels ) {
105  oStream_ << "Whistle::tick(): channel and StkFrames arguments are incompatible!";
106  handleError( StkError::FUNCTION_ARGUMENT );
107  }
108 #endif
109 
110  StkFloat *samples = &frames[channel];
111  unsigned int j, hop = frames.channels() - nChannels;
112  if ( nChannels == 1 ) {
113  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
114  *samples++ = tick();
115  }
116  else {
117  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
118  *samples++ = tick();
119  for ( j=1; j<nChannels; j++ )
120  *samples++ = lastFrame_[j];
121  }
122  }
123 
124  return frames;
125 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Whistle.png0000644000076600007660000000111212327015206016177 0ustar gary‰PNG  IHDRLˆz0ý»PLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2ÙIDATxíÑnà E)ÿÿÉKI€Ò¦Þ_ØœVÕ6Áz›“Øl¶1ëæû ¨6ã?Ч%©Sü6%ɦ€I’M+,çœð†/y–őæ [Y~4WØ?îfÀŒ €M°)`6 À¦€µWÎ9{‰,I> ˜$Ù4ÀR‰v(éŠq<ä –6Ðú§å•ûmâšÞåSVí³%ßÂöÙº¸&©Z]¢a•Ñx9÷¿¦‡­º£ém>‡ÓïÁz›°ž|KR›Xõqÿcýyø3ØÐMIú©&I6},çœð†þâ?:À­–Å‘æ [Y~4WØ?îfÀŒ €M°)`6 À¦€µWJ)y‰ࣀØ4ÂÖQ›Øî«júœV~ ölå[_“í¥ëVu°mÁ>ºV–ïGØÎØ«®ÏìN€ôíÖ ¬÷>÷ψ¾.na×Êúcœ6 µ9žZß‡Îæë36a Úxaóðt gOÖ­œvà‡ €MŸK)%'}Çç {]¤û•IEND®B`‚stk-4.5.0/doc/html/classstk_1_1Wurley-members.html0000644000076600007660000003717312327015206017677 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Wurley Member List

This is the complete list of members for stk::Wurley, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::Instrmntinline
clear(void)stk::Instrmntinlinevirtual
controlChange(int number, StkFloat value)stk::FMvirtual
FM(unsigned int operators=4)stk::FM
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
Instrmnt(void)stk::Instrmntinline
keyOff(void)stk::FM
keyOn(void)stk::FM
lastFrame(void) const stk::Instrmntinline
lastOut(unsigned int channel=0)stk::Instrmntinline
loadWaves(const char **filenames)stk::FM
noteOff(StkFloat amplitude)stk::FMvirtual
noteOn(StkFloat frequency, StkFloat amplitude)stk::Wurleyvirtual
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setControl1(StkFloat cVal)stk::FMinline
setControl2(StkFloat cVal)stk::FMinline
setFrequency(StkFloat frequency)stk::Wurleyvirtual
setGain(unsigned int waveIndex, StkFloat gain)stk::FM
setModulationDepth(StkFloat mDepth)stk::FMinline
setModulationSpeed(StkFloat mSpeed)stk::FMinline
setRatio(unsigned int waveIndex, StkFloat ratio)stk::FM
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)stk::Wurleyinlinevirtual
tick(StkFrames &frames, unsigned int channel=0)stk::Wurleyinlinevirtual
Wurley(void)stk::Wurley
~FM(void)stk::FMvirtual
~Stk(void)stk::Stkprotectedvirtual
~Wurley(void)stk::Wurley

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Wurley.html0000644000076600007660000013650112327015206016242 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Wurley Class Reference

STK Wurlitzer electric piano FM synthesis instrument. More...

#include <Wurley.h>

Inheritance diagram for stk::Wurley:
stk::FM stk::Instrmnt stk::Stk

Public Member Functions

 Wurley (void)
 Class constructor. More...
 
 ~Wurley (void)
 Class destructor.
 
void setFrequency (StkFloat frequency)
 Set instrument parameters for a particular frequency.
 
void noteOn (StkFloat frequency, StkFloat amplitude)
 Start a note with the given frequency and amplitude.
 
StkFloat tick (unsigned int channel=0)
 Compute and return one output sample.
 
StkFramestick (StkFrames &frames, unsigned int channel=0)
 Fill a channel of the StkFrames object with computed outputs. More...
 
- Public Member Functions inherited from stk::FM
 FM (unsigned int operators=4)
 Class constructor, taking the number of wave/envelope operators to control. More...
 
virtual ~FM (void)
 Class destructor.
 
void loadWaves (const char **filenames)
 Load the rawwave filenames in waves.
 
void setRatio (unsigned int waveIndex, StkFloat ratio)
 Set the frequency ratio for the specified wave.
 
void setGain (unsigned int waveIndex, StkFloat gain)
 Set the gain for the specified wave.
 
void setModulationSpeed (StkFloat mSpeed)
 Set the modulation speed in Hz.
 
void setModulationDepth (StkFloat mDepth)
 Set the modulation depth.
 
void setControl1 (StkFloat cVal)
 Set the value of control1.
 
void setControl2 (StkFloat cVal)
 Set the value of control1.
 
void keyOn (void)
 Start envelopes toward "on" targets.
 
void keyOff (void)
 Start envelopes toward "off" targets.
 
void noteOff (StkFloat amplitude)
 Stop a note with the given amplitude (speed of decay).
 
virtual void controlChange (int number, StkFloat value)
 Perform the control change specified by number and value (0.0 - 128.0).
 
- Public Member Functions inherited from stk::Instrmnt
 Instrmnt (void)
 Class constructor.
 
virtual void clear (void)
 Reset and clear all internal state (for subclasses). More...
 
unsigned int channelsOut (void) const
 Return the number of output channels for the class.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last output sample frame.
 
StkFloat lastOut (unsigned int channel=0)
 Return the specified channel value of the last computed frame. More...
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK Wurlitzer electric piano FM synthesis instrument.

This class implements two simple FM Pairs summed together, also referred to as algorithm 5 of the TX81Z.

Algorithm 5 is : 4->3--\
+ --> Out
2->1--/

Control Change Numbers:

  • Modulator Index One = 2
  • Crossfade of Outputs = 4
  • LFO Speed = 11
  • LFO Depth = 1
  • ADSR 2 & 4 Target = 128

The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Constructor & Destructor Documentation

stk::Wurley::Wurley ( void  )

Class constructor.

An StkError will be thrown if the rawwave path is incorrectly set.

Member Function Documentation

StkFrames & stk::Wurley::tick ( StkFrames frames,
unsigned int  channel = 0 
)
inlinevirtual

Fill a channel of the StkFrames object with computed outputs.

The channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if STK_DEBUG is defined during compilation, in which case an out-of-range value will trigger an StkError exception.

Implements stk::FM.

100 {
101  unsigned int nChannels = lastFrame_.channels();
102 #if defined(_STK_DEBUG_)
103  if ( channel > frames.channels() - nChannels ) {
104  oStream_ << "Wurley::tick(): channel and StkFrames arguments are incompatible!";
105  handleError( StkError::FUNCTION_ARGUMENT );
106  }
107 #endif
108 
109  StkFloat *samples = &frames[channel];
110  unsigned int j, hop = frames.channels() - nChannels;
111  if ( nChannels == 1 ) {
112  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
113  *samples++ = tick();
114  }
115  else {
116  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
117  *samples++ = tick();
118  for ( j=1; j<nChannels; j++ )
119  *samples++ = lastFrame_[j];
120  }
121  }
122 
123  return frames;
124 }

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1Wurley.png0000644000076600007660000000134012327015206016052 0ustar gary‰PNG  IHDRLÀ™;uºPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2oIDATxíër£0 F?ÍäýyÁrQ«v¦¢>Yl£cK&›¿˜™eIR%“¤¯d­7×_®‹á/Éúý6“­[X÷á÷›yø­ìX¿ÇÝc{’nX’žÊö¨1è¨Ùuž/Ò¼ŒÚ7’i^@,Mß®NóóØÓ¼—ÿ8€qX’ê»)I1J&I1™™YpÈ"Sv»%Ú2e‹+Ï–*ûŧY2€ %ˆQ2€%ˆQ2€%ó—™Y˜$åP2IŠ1ÉZo¾+élsÿO²¶Š–ïë÷ëÄ9½ô¿þÔ6Ûǽl›ÝöÝ&ù¶G÷æggÙîp¹ëŸÓÓRCiÆ4ŸËŽéÏdcš²ÑüFÖ$ß.Ò Èö<îåŒ?Š%›NS’¾KÉ$)Æß‘™™%ð?ñ‹ð–Û-Ñ–)[\y¶TÙ/>Í’)@Œ’Ä(@Œ’Ä(™¿Ì̲À$)‡’IRŒ²ÖÛÙí×9æçâ²Cêÿ‘t¶kYßÁòá}_•mŽÞÖ£»OncÙîp{ɲM2Ëü¶§z¾9Ÿæ÷dMòíAv É·WiºêLïWH&I_ d’ãïÈÌÌ’ø€ŸøExËí–hË”-®<[ªìŸfÉ‚” FÉb” FÉb”Ì_­µ– ‡’ĘeKϬ÷w¦a€‰ÿ%[^“õ¥|NvÞn1ë£ÓJ§l{¾·1|ík>,ñ(ÛçÇ<\nô‰l“|.ë_Ÿ±ÆÃø4çª]íl\ÖlZàù’ûóxšæ=§»ò,Ê1u?ˆ£Êy߀LÙ|Z_eˆ®ÿÏbdËZk-‰(M0 á3‰EIEND®B`‚stk-4.5.0/doc/html/classstk_1_1WvIn-members.html0000644000076600007660000002425712327015206017272 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::WvIn Member List

This is the complete list of members for stk::WvIn, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
channelsOut(void) const stk::WvIninline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
lastFrame(void) const stk::WvIninline
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(unsigned int channel=0)=0stk::WvInpure virtual
tick(StkFrames &frames)=0stk::WvInpure virtual
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1WvIn.html0000644000076600007660000006517512327015206015646 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::WvIn Class Referenceabstract

STK audio input abstract base class. More...

#include <WvIn.h>

Inheritance diagram for stk::WvIn:
stk::Stk stk::FileWvIn stk::InetWvIn stk::RtWvIn stk::FileLoop

Public Member Functions

unsigned int channelsOut (void) const
 Return the number of audio channels in the data or stream.
 
const StkFrameslastFrame (void) const
 Return an StkFrames reference to the last computed sample frame. More...
 
virtual StkFloat tick (unsigned int channel=0)=0
 Compute one sample frame and return the specified channel value.
 
virtual StkFramestick (StkFrames &frames)=0
 Fill the StkFrames argument with computed frames and return the same reference.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK audio input abstract base class.

This class provides common functionality for a variety of audio data input subclasses.

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

const StkFrames& stk::WvIn::lastFrame ( void  ) const
inline

Return an StkFrames reference to the last computed sample frame.

If no file data is loaded, an empty container is returned.

29 { return lastFrame_; };

The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1WvIn.png0000644000076600007660000000225012327015206015447 0ustar gary‰PNG  IHDR ÀËÝPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT27IDATxía“«*ÛCÝüÿŸüŒeŒ{¯ûªÄ“¥A…–¿ü)¥t-·$IÒ•X…UHRÄ*¬B’"ª¦VôÇOeXÒÚž¡b:þŒ=IÅûñ¿÷@¹ìù`;,©hÝ©Xžý´ê¼ò)=ŠaIÚÒ£ŠyÍqÉK­hfHŸ R]ó¼Y¤"&H¥l>)AÊV{ƒ<¥lÎ ’‹æR6ã°$mé1A$é/° «¤ˆUX…$E¬Â*$)b=¨H)¥K蛀±Š`âeV”m4aV°«ˆX…UD¬Â*"Va«° €ˆUX@Ä*¬ bV± «ˆX…UD¬Â*"Va«xŠa†k¸%—ÏÜ*¬ bVéNÅ8\žyg¾¬Ø*ºT1¼5Œ_¥BÅú3^RYwG*ò2ß+Ý/>ô6[§Góbc†|þjb€¢õ– *v»([_e³Lmµx’ŠʶW‘÷Æc$?û,ä‘*þ«° €ˆUX@Ä*¬ b=¨†a¸€¾y«&^va@ÙFva‹° €ˆUX@Ä*¬ bV±Š»ªx½^¯[p-¿ùänÛ*¬ bV± «ˆX…UD¬Â*"Va«xŠ”R:Å+¥”ÎpÛØI’®¤œ®$]ÉïÆ¶ «šUX…$E6*†©­Ýé³~eÖ‘ïÓÝÆ–Ú|þ(ô±ŠÚäOÆ=¡¢vxëØULOü*æƒ-[ά?ã}ùâÊt±óMŸ÷9º­¹5ù÷Í'⋾åÆ"ìÎí¾·^½Ÿn+v‘{›I6B·T´'2îVÅ|Q™!ÝÖHŸ¿Úi©¨Ä®8øú@Åáä¿ÆÝ'Heº¥õ%vŽžB[E+ö2škó·Ð‡ R›ü^E=î¶l–{¬ªbûON«hÄ.î-ÊÜA胲٘|‘(Gq[µ¢U6—{‹ ›„üZ+6esgä8ô‰Z±+›§âÖ$;«•Íù òs­ØËöÍçÿVE{ò9i~¤B’.áðÝ/IÿÀïÆ¶ «šUX…$E¬Â*$)b¥Š”Rº”bº)¥t)ÿOl€#þ«&þØ…UeMØ…U,Â* €há± `Z8A¬À€N«0 …Ä* €há± `Z8A¤"¥”®à–$Iº«° IŠX…UHR¤ÃÔÖîôÙ —HÒ–NUÔûW1=ýñ«´‘æ±i‡¬ƒSoüôzP±¤Á$cíÆ“Å`Ñ›$.'zP±.*ÔŠs*ÖíÒG‚ìTÄ]±ÔÐÎUÄ©ªƒýª¤²µT<¡VÌ ’‹f­læ—E. ½¾A$é( ŒUX…UHR«° IŠX…UHRäÆ*RJéRîÈà%W3 àIEND®B`‚stk-4.5.0/doc/html/classstk_1_1WvOut-members.html0000644000076600007660000002601412327015206017464 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::WvOut Member List

This is the complete list of members for stk::WvOut, including all inherited members.

addSampleRateAlert(Stk *ptr)stk::Stkprotected
clipStatus(void)stk::WvOutinline
getFrameCount(void) const stk::WvOutinline
getTime(void) const stk::WvOutinline
handleError(const char *message, StkError::Type type)stk::Stkstatic
handleError(std::string message, StkError::Type type)stk::Stkstatic
handleError(StkError::Type type) const stk::Stkprotected
ignoreSampleRateChange(bool ignore=true)stk::Stkinline
inRange(StkFloat value, StkFloat min, StkFloat max)stk::Stkinlinestatic
printErrors(bool status)stk::Stkinlinestatic
rawwavePath(void)stk::Stkinlinestatic
removeSampleRateAlert(Stk *ptr)stk::Stkprotected
resetClipStatus(void)stk::WvOutinline
sampleRate(void)stk::Stkinlinestatic
sampleRateChanged(StkFloat newRate, StkFloat oldRate)stk::Stkprotectedvirtual
setRawwavePath(std::string path)stk::Stkstatic
setSampleRate(StkFloat rate)stk::Stkstatic
showWarnings(bool status)stk::Stkinlinestatic
sleep(unsigned long milliseconds)stk::Stkstatic
Stk(void)stk::Stkprotected
STK_FLOAT32stk::Stkstatic
STK_FLOAT64stk::Stkstatic
STK_SINT16stk::Stkstatic
STK_SINT24stk::Stkstatic
STK_SINT32stk::Stkstatic
STK_SINT8stk::Stkstatic
swap16(unsigned char *ptr)stk::Stkstatic
swap32(unsigned char *ptr)stk::Stkstatic
swap64(unsigned char *ptr)stk::Stkstatic
tick(const StkFloat sample)=0stk::WvOutpure virtual
tick(const StkFrames &frames)=0stk::WvOutpure virtual
WvOut(void)stk::WvOutinline
~Stk(void)stk::Stkprotectedvirtual

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1WvOut.html0000644000076600007660000007064312327015206016043 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::WvOut Class Referenceabstract

STK audio output abstract base class. More...

#include <WvOut.h>

Inheritance diagram for stk::WvOut:
stk::Stk stk::FileWvOut stk::InetWvOut stk::RtWvOut

Public Member Functions

 WvOut (void)
 Default constructor.
 
unsigned long getFrameCount (void) const
 Return the number of sample frames output.
 
StkFloat getTime (void) const
 Return the number of seconds of data output.
 
bool clipStatus (void)
 Returns true if clipping has been detected during output since instantiation or the last reset.
 
void resetClipStatus (void)
 Reset the clipping status to false.
 
virtual void tick (const StkFloat sample)=0
 Output a single sample to all channels in a sample frame. More...
 
virtual void tick (const StkFrames &frames)=0
 Output the StkFrames data.
 
- Public Member Functions inherited from stk::Stk
void ignoreSampleRateChange (bool ignore=true)
 A function to enable/disable the automatic updating of class data when the STK sample rate changes. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from stk::Stk
static StkFloat sampleRate (void)
 Static method that returns the current STK sample rate.
 
static void setSampleRate (StkFloat rate)
 Static method that sets the STK sample rate. More...
 
static std::string rawwavePath (void)
 Static method that returns the current rawwave path.
 
static void setRawwavePath (std::string path)
 Static method that sets the STK rawwave path.
 
static void swap16 (unsigned char *ptr)
 Static method that byte-swaps a 16-bit data type.
 
static void swap32 (unsigned char *ptr)
 Static method that byte-swaps a 32-bit data type.
 
static void swap64 (unsigned char *ptr)
 Static method that byte-swaps a 64-bit data type.
 
static void sleep (unsigned long milliseconds)
 Static cross-platform method to sleep for a number of milliseconds.
 
static bool inRange (StkFloat value, StkFloat min, StkFloat max)
 Static method to check whether a value is within a specified range.
 
static void handleError (const char *message, StkError::Type type)
 Static function for error reporting and handling using c-strings.
 
static void handleError (std::string message, StkError::Type type)
 Static function for error reporting and handling using c++ strings.
 
static void showWarnings (bool status)
 Toggle display of WARNING and STATUS messages.
 
static void printErrors (bool status)
 Toggle display of error messages before throwing exceptions.
 
- Static Public Attributes inherited from stk::Stk
static const StkFormat STK_SINT8
 
static const StkFormat STK_SINT16
 
static const StkFormat STK_SINT24
 
static const StkFormat STK_SINT32
 
static const StkFormat STK_FLOAT32
 
static const StkFormat STK_FLOAT64
 
- Protected Member Functions inherited from stk::Stk
 Stk (void)
 Default constructor.
 
virtual ~Stk (void)
 Class destructor.
 
virtual void sampleRateChanged (StkFloat newRate, StkFloat oldRate)
 This function should be implemented in subclasses that depend on the sample rate.
 
void addSampleRateAlert (Stk *ptr)
 Add class pointer to list for sample rate change notification.
 
void removeSampleRateAlert (Stk *ptr)
 Remove class pointer from list for sample rate change notification.
 
void handleError (StkError::Type type) const
 Internal function for error reporting that assumes message in oStream_ variable.
 

Detailed Description

STK audio output abstract base class.

This class provides common functionality for a variety of audio data output subclasses.

Currently, WvOut is non-interpolating and the output rate is always Stk::sampleRate().

by Perry R. Cook and Gary P. Scavone, 1995–2014.

Member Function Documentation

virtual void stk::WvOut::tick ( const StkFloat  sample)
pure virtual

Output a single sample to all channels in a sample frame.

An StkError is thrown if an output error occurs.

Implemented in stk::FileWvOut, stk::RtWvOut, and stk::InetWvOut.


The documentation for this class was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/classstk_1_1WvOut.png0000644000076600007660000000212612327015206015652 0ustar gary‰PNG  IHDR(ˆc²†qPLTEÿÿÿèìõuÂÀÀÀ‰ÜtRNSÿÿÿÿÿÿÿÕÊT2åIDATxíÝ’ª0›IïÿÈGQ0„¿ñÔâÌ.½B̦“/Üü€RJ9 €ËP$é"J’ "J’ "J’ "J’ î&ªŽêúñ³Ò,Isn.j8µEÔgñ h&å}Ò6KRÃ}DMëfp2z ¯j–¤Un%êmd.dÚ£ökïf¥·jä½Ð"jQ}%³Í<¥×îQÍf¾l–¤†Û•Þ¸•O›ù¼Y’V¹UéIÒÿQ’dQ’dQ’dQ’dQ’dQ’dQ’dp1Q¥”r7¥ûDÀ1}S‡DÀ1O1pDDXD€ADD€ADD€ADD€ADD€ADD€ADD€ADD€ADD€ADD€ADD€ADD€ADD€ÁEu]×Àe8q4`Q`Q·õh®ï<ÏGê÷ånGõy°½>ÇÕE=×És±Ô®*QÕGÝ0_^wõúp,Ô4¾ÖÌÝJÔ{äóÚ{ýFÔ¼ôvDU¾n.j^zí.Q+{TûRûÈ©ßzïÅw×Ò×ͨ`!êùž{+{}ëno=€¿!¢ " À ¢ " À ¢ " À ¢ .&ªëºî$nJö‰(€cú>¦‰(€cžb àˆˆ°ˆ&ƒˆ0ˆ(ƒˆ0ˆ(ƒˆ0ˆ(ƒˆ0ˆ(ƒ ˆêû¾¿ gñ›¹¾@JDD€ADD€ADD€ADD€ADD€ADD€ADÜXT)¥øô¥”bs©”"IçPA’ÎáW)%I‡D”$D”$D”$4¢ºáø\?Móól¤þâ¼›½!´)’fÇû¾²/jm@_'¢ÖNW†Óå—ÿVÔFÈw¢>m_$ÌE +çñ§îz<ûgc¤ú¨ÆyYÂFÊó™÷”N÷ÍíéØÐëÙ/f¢&ÍSUÀbWó…°9„­”ª¾gFÈ–¨í}Њzß­×Þ¬¤?}¾~ÿOÔJÊÚÔÚ!;¢vôE²ôV†PÏΔ2&TAž¨­”©u|wø!»¥·6 ¥¨£„v3¯Wꪨ6î?Dm¤,æÔÙÙÌ7T• —°µGmmæSgó^›ÖqIíQÍf¾øÝcZlæ_&¬•Þèvm3Ÿ^‹„¡fÆ^>«}³ô)S9Œ÷ýƒÒ[Ðø¬Ð–ž$ý)ÛE!IůR"J’‰(I2ˆ(I2ˆ(I2ˆ(I2ˆ(I2ˆ(I2xˆ*¥”“¨†PJ)'ñ›”þ©O The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Compiling

The Synthesis ToolKit can be used in a variety of ways, depending on your particular needs. Some people choose the classes they need for a particular project and copy those to their working directory. Others create Makefiles that compile project-specific class objects from common src and include directories. And still others like to compile and link to a common library of object files. STK was not designed with one particular style of use in mind.

"Realtime" vs. "Non-Realtime"

Most of the Synthesis ToolKit classes are platform independent. That means that they should compile on any reasonably current C++ compiler. The functionality needed for realtime audio and MIDI input/output, as well as realtime control message acquistion, is inherently platform and operating-system (OS) dependent. STK classes that require specific platform/OS support include RtAudio, RtWvOut, RtWvIn, RtDuplex, RtMidi, InetWvIn, InetWvOut, Socket, UdpSocket, TcpServer, TcpClient, Thread, and Mutex. These classes currently can only be compiled on Linux, Macintosh OS X, and Windows systems.

Without the "realtime" classes, it is still possible to read SKINI scorefiles for control input and to read and write to/from a variety of audio file formats (WAV, SND, AIFF, MAT-file, and RAW). If compiling for a "little-endian" host processor, the __LITTLE_ENDIAN__ preprocessor definition should be provided.

Unix Systems:

STK compiles with realtime support on the following flavors of the Unix operating system: Linux, Irix, and Macintosh OS X. Aside from differences in compilers, audio/MIDI APIs, and host endianness, the steps necessary to compile STK programs and classes on these platforms are the same. The following table summarizes these differences.

OS: Realtime Audio/MIDI API: Preprocessor Definition: Library or Framework:
Linux ALSA __LINUX_ALSA__, LITTLE_ENDIAN asound, pthread
Linux OSS (version 4.0 only, use ALSA for MIDI support) __LINUX_OSS__, LINUX_ALSA, LITTLE_ENDIAN asound, pthread
Linux and Macintosh OS-X Jack __UNIX_JACK__, LITTLE_ENDIAN asound, pthread, jack
Macintosh OS X CoreAudio __MACOSX_CORE__ pthread, CoreAudio, CoreMidi, CoreFoundation

The available C++ compilers on any of these systems can vary.

One approach in using STK is to simply copy the class files needed for a particular program into a project directory. Taking the sineosc.cpp example from the previous tutorial chapter, it would be necessary to set up a directory that includes the files sineosc.cpp, the rawwave file sinewave.raw in a subdirectory called rawwaves, and the header and source files 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:

g++ -Wall -D__LITTLE_ENDIAN__ -o sineosc Stk.cpp FileRead.cpp FileWrite.cpp FileWvIn.cpp FileLoop.cpp FileWvOut.cpp sineosc.cpp

Note that the sineosc.cpp 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.

When working with a number of different projects that make use of ToolKit classes, the above approach can become cumbersome (especially when trying to synchronize with new STK releases). Most of the STK projects (e.g., demo, effects, ...) contain Makefiles (built by the configure script) that compile project-specific class objects from the distribution src and include directories. This approach makes it relatively easy when upgrading to a new STK release (by making path substitutions in the Makefile or by moving the projects to a similar relative path within the new STK source tree). A Makefile is provided in the projects/examples directory for compiling all the tutorial programs, as well as other example programs. To compile the sineosc.cpp program, for example, one need only type make sineosc from within the projects/examples directory.

Library Use:

The STK distribution provides a Makefile that can be used on Unix systems to build a static library. After unpacking the distribution (tar -xzf stk-4.x.x.tar.gz), run the configure script by typing ./configure from the top level distribution directory (see the INSTALL file in the same directory for more information). Then from within the src directory, type make. After a successful build, you may wish to move the library (libstk.a) and the contents of the include directory to standard library and include search paths on your system. For example, the linux RPM distribution of STK puts the library in /usr/lib/ and the STK header files in /usr/include/stk/.

Assuming the library is located in a standard search path and the header files are located in /usr/include/stk/, the sineosc.cpp example from the previous tutorial chapter can be compiled on a little-endian system using the GNU g++ compiler as follows:

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 #include statements in the sineosc.cpp program as follows:

#include "stk/FileLoop.h"
#include "stk/FileWvOut.h"

and then compile without an explicit include path argument to the compiler:

g++ -Wall -D__LITTLE_ENDIAN__ -o sineosc sineosc.cpp -lstk

Windows:

STK has been tested on Windows platforms using the Visual .NET compiler only. It is assumed here that you're familiar with Visual C++ and its particular idiosyncrasies. STK won't compile in Visual C++ 6.0 any more.

The approach when using Visual C++ is to build a project that includes the necessary ToolKit files from the distribution src and include directories. For the example program from the previous tutorial chapter, create a VC++ console application project, add the Stk, FileRead, FileWrite, WvIn, FileWvIn, FileLoop, WvOut, and FileWvOut class files, as well as sineosc.cpp, and make sure the sinewave.raw file is in the subdirectory rawwaves.

For programs using any of the STK realtime classes mentioned above, it is necessary to link with the DirectSound (dsound.lib), winmm.lib, and Wsock32.lib libraries, select the multithreaded library, and provide the __LITTLE_ENDIAN__, __WINDOWS_DS__, and __WINDOWS_MM__ preprocessor definitions.

For Steinberg ASIO support, use the __WINDOWS_ASIO__ preprocessor definition (and the __WINDOWS_MM__ definition for RtMidi support), include all the files in the src/asio/ directory (i.e., asio.h,cpp, asiodrivers.h,cpp, ...), and link with the winmm.lib, and Wsock32.lib libraries.

[Main tutorial page]   [Next tutorial]


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/controlin.html0000644000076600007660000005407112327015203014550 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Control Input

Each Synthesis ToolKit instrument exposes its relevant control parameters via public functions such as setFrequency() and controlChange(). Programmers are free to implement the control scheme of their choice in exposing those parameters to the user.

A text-based control protocol called SKINI is provided with the Synthesis ToolKit. SKINI extends the MIDI protocol in incremental ways, providing a text-based messaging scheme in human-readable format and making use of floating-point numbers wherever possible. Each SKINI message consists of a message type (e.g., NoteOn, PitchBend), a time specification (absolute or delta), a channel number (scanned as a long integer), and a maximum of two subsequent message-specific field values. Knowing this, it should be relatively clear what the following SKINI "scorefile" specifies:

NoteOn 0.000082 2 55.0 82.3
NoteOff 1.000000 2 55.0 64.0
NoteOn 0.000082 2 69.0 82.8
StringDetune 0.100000 2 10.0
StringDetune 0.100000 2 30.0
StringDetune 0.100000 2 50.0
StringDetune 0.100000 2 40.0
StringDetune 0.100000 2 22.0
StringDetune 0.100000 2 12.0
NoteOff 1.000000 2 69.0 64.0

MIDI messages are easily represented within the SKINI protocol.

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 bethree.cpp program from the previous tutorial chapter and incorporate a stk::Messager class to allow control via SKINI messages read from a SKINI file.

// controlbee.cpp STK tutorial program
#include "BeeThree.h"
#include "RtAudio.h"
#include "Messager.h"
#include "SKINI.msg"
#include <math.h>
#include <algorithm>
using std::min;
using namespace stk;
void usage(void) {
// Error function in case of incorrect command-line
// argument specifications.
std::cout << "\nuseage: controlbee file\n";
std::cout << " where file = a SKINI scorefile.\n\n";
exit(0);
}
// The TickData structure holds all the class instances and data that
// are shared by the various processing functions.
struct TickData {
Instrmnt *instrument;
Messager messager;
Skini::Message message;
int counter;
bool haveMessage;
bool done;
// Default constructor.
TickData()
: instrument(0), counter(0), haveMessage(false), done( false ) {}
};
#define DELTA_CONTROL_TICKS 64 // default sample frames between control input checks
// The processMessage() function encapsulates the handling of control
// messages. It can be easily relocated within a program structure
// depending on the desired scheduling scheme.
void processMessage( TickData* data )
{
register StkFloat value1 = data->message.floatValues[0];
register StkFloat value2 = data->message.floatValues[1];
switch( data->message.type ) {
case __SK_Exit_:
data->done = true;
return;
case __SK_NoteOn_:
if ( value2 == 0.0 ) // velocity is zero ... really a NoteOff
data->instrument->noteOff( 0.5 );
else { // a NoteOn
StkFloat frequency = 220.0 * pow( 2.0, (value1 - 57.0) / 12.0 );
data->instrument->noteOn( frequency, value2 * ONE_OVER_128 );
}
break;
case __SK_NoteOff_:
data->instrument->noteOff( value2 * ONE_OVER_128 );
break;
case __SK_ControlChange_:
data->instrument->controlChange( (int) value1, value2 );
break;
case __SK_AfterTouch_:
data->instrument->controlChange( 128, value1 );
} // end of switch
data->haveMessage = false;
return;
}
// This tick() function handles sample computation and scheduling of
// control updates. It will be called automatically when the system
// needs a new buffer of audio samples.
int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
double streamTime, RtAudioStreamStatus status, void *dataPointer )
{
TickData *data = (TickData *) dataPointer;
register StkFloat *samples = (StkFloat *) outputBuffer;
int counter, nTicks = (int) nBufferFrames;
while ( nTicks > 0 && !data->done ) {
if ( !data->haveMessage ) {
data->messager.popMessage( data->message );
if ( data->message.type > 0 ) {
data->counter = (long) (data->message.time * Stk::sampleRate());
data->haveMessage = true;
}
else
data->counter = DELTA_CONTROL_TICKS;
}
counter = min( nTicks, data->counter );
data->counter -= counter;
for ( int i=0; i<counter; i++ ) {
*samples++ = data->instrument->tick();
nTicks--;
}
if ( nTicks == 0 ) break;
// Process control messages.
if ( data->haveMessage ) processMessage( data );
}
return 0;
}
int main( int argc, char *argv[] )
{
if ( argc != 2 ) usage();
// Set the global sample rate and rawwave path before creating class instances.
Stk::setSampleRate( 44100.0 );
Stk::setRawwavePath( "../../rawwaves/" );
TickData data;
RtAudio dac;
// Figure out how many bytes in an StkFloat and setup the RtAudio stream.
parameters.deviceId = dac.getDefaultOutputDevice();
parameters.nChannels = 1;
RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32;
unsigned int bufferFrames = RT_BUFFER_SIZE;
try {
dac.openStream( &parameters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&data );
}
catch ( RtAudioError &error ) {
error.printMessage();
goto cleanup;
}
try {
// Define and load the BeeThree instrument
data.instrument = new BeeThree();
}
catch ( StkError & ) {
goto cleanup;
}
if ( data.messager.setScoreFile( argv[1] ) == false )
goto cleanup;
try {
dac.startStream();
}
catch ( RtAudioError &error ) {
error.printMessage();
goto cleanup;
}
// Block waiting until callback signals done.
while ( !data.done )
Stk::sleep( 100 );
// Shut down the output stream.
try {
dac.closeStream();
}
catch ( RtAudioError &error ) {
error.printMessage();
}
cleanup:
delete data.instrument;
return 0;
}

A realtime control message will usually have a delta time of zero, in which case it is processed as soon as possible. Non-realtime messages, normally from a scorefile, will usually have non-zero delta times. The scheme used in this example is designed to work for both scorefile and realtime input types. When no message is available from the queue, the instrument is "ticked" for DELTA_CONTROL_TICKS and then the queue is checked again. The value of DELTA_CONTROL_TICKS roughly defines the program "control rate" in a realtime context, though multiple available messages in the queue are processed in immediate succession when their delta time values are zero.

The processMessage() function centralizes the handling of control messages. Other control update schemes can be implemented, perhaps using a separate thread or in the main() function, and this function should work in any context.

Assuming the program is compiled as controlbee and the SKINI scorefile bookert.ski is in the scores directory, the program can be run as:

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 stk::Messager class provides stk::Messager::startStdInput(), stk::Messager::startSocketInput(), and stk::Messager::startMidiInput() functions for this purpose.

[Main tutorial page]   [Next tutorial]


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/crealtime.html0000644000076600007660000003265212327015203014507 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Realtime Audio (callback)

An alternative scheme for audio input/output is to define a specific function in which audio computations are performed and to let the audio system call this function when more input/output data can be accepted by the hardware (referred to as a callback scheme). In this section, we show how the previous rtsine.cpp program can be modified to work in a callback scenario. There is no "single-sample" interface for this functionality. The callback function will be 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 Blocking vs. Callbacks for further information).

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.

// crtsine.cpp STK tutorial program
#include "SineWave.h"
#include "RtAudio.h"
using namespace stk;
// This tick() function handles sample computation only. It will be
// called automatically when the system needs a new buffer of audio
// samples.
int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
double streamTime, RtAudioStreamStatus status, void *dataPointer )
{
SineWave *sine = (SineWave *) dataPointer;
register StkFloat *samples = (StkFloat *) outputBuffer;
for ( unsigned int i=0; i<nBufferFrames; i++ )
*samples++ = sine->tick();
return 0;
}
int main()
{
// Set the global sample rate before creating class instances.
Stk::setSampleRate( 44100.0 );
SineWave sine;
RtAudio dac;
// Figure out how many bytes in an StkFloat and setup the RtAudio stream.
parameters.deviceId = dac.getDefaultOutputDevice();
parameters.nChannels = 1;
RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32;
unsigned int bufferFrames = RT_BUFFER_SIZE;
try {
dac.openStream( &parameters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&sine );
}
catch ( RtAudioError &error ) {
error.printMessage();
goto cleanup;
}
sine.setFrequency(440.0);
try {
dac.startStream();
}
catch ( RtAudioError &error ) {
error.printMessage();
goto cleanup;
}
// Block waiting here.
char keyhit;
std::cout << "\nPlaying ... press <enter> to quit.\n";
std::cin.get( keyhit );
// Shut down the output stream.
try {
dac.closeStream();
}
catch ( RtAudioError &error ) {
error.printMessage();
}
cleanup:
return 0;
}

The sinusoidal oscillator is created as before. The instantiation of RtAudio requires quite a few more parameters, including output/input device and channel specifiers, the data format, and the desired buffer length (in frames). In this example, we request a single output channel using the default output device, zero channels of input, the RtAudio data format which corresponds to an StkFloat, and the RT_BUFFER_SIZE defined in Stk.h. The bufferFrames argument is an API-dependent buffering parameter (see RtAudio for further information).

We also provide the audio system controller with a pointer to our callback function and an optional pointer to data that will be made available in the callback. In this example, we need to pass only the pointer to the oscillator. In more complex programs, it is typically necessary to put all shared data in a struct (see the next tutorial program for an example) or make use of global variables.

Our callback routine is the tick() function. Function arguments include pointers to the audio input and output data buffers, the buffer size (in frames), a stream time argument, a status argument to test for over/underruns, and the data pointer passed in the openStream() function (if it exists). It is necessary to cast these pointers to their corresponding data types before use. Our tick() routine simply "ticks" the oscillator for nBufferFrames counts and writes the result into the audio data buffer before returning.

The main() function blocks at the std::cin.get() call until the user hits the "enter" key, after which the audio controller is shut down and program execution ends.

Blocking vs. Callbacks

Prior to version 4.2.0, all STK example projects and programs used blocking audio input/output functionality (typically with the RtWvIn, RtWvOut, or RtDuplex classes). In many instances, a blocking scheme results in a clearer and more straight-forward program structure. Within a graphical user interface (GUI) programming context, however, callback routines are often more natural.

In order to allow all STK programs to function with equal proficiency on all supported computer platforms, a decision was made to modify the example projects to use audio callback routines. The result is a more complicated code structure, which is unfortunate given that we generally strive to make STK code as clear as possible for educational purposes. This was especially an issue with the demo program because it is designed to function in both realtime and non-realtime contexts. The use of global variables has been avoided by defining data structures to hold all variables that must be accessible to the callback routine and other functions. Alternative schemes for making control updates could be designed depending on particular program needs and constraints.

[Main tutorial page]   [Next tutorial]


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Cubic_8h_source.html0000644000076600007660000004675612327015203015560 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Cubic.h
1 #ifndef STK_CUBIC_H
2 #define STK_CUBIC_H
3 
4 #include "Function.h"
5 #include <cmath>
6 
7 namespace stk {
8 
9 /***************************************************/
27 /***************************************************/
28 
29 class Cubic : public Function
30 {
31 public:
33  Cubic( void ) : a1_(0.5), a2_(0.5), a3_(0.5), gain_(1.0), threshold_(1.0) {};
34 
36  void setA1( StkFloat a1 ) { a1_ = a1; };
37 
39  void setA2( StkFloat a2 ) { a2_ = a2; };
40 
42  void setA3( StkFloat a3 ) { a3_ = a3; };
43 
45  void setGain( StkFloat gain ) { gain_ = gain; };
46 
48  void setThreshold( StkFloat threshold ) { threshold_ = threshold; };
49 
51  StkFloat tick( StkFloat input );
52 
54 
62  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
63 
65 
73  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
74 
75 protected:
76 
77  StkFloat a1_;
78  StkFloat a2_;
79  StkFloat a3_;
80  StkFloat gain_;
81  StkFloat threshold_;
82 };
83 
84 inline StkFloat Cubic :: tick( StkFloat input )
85 {
86  StkFloat inSquared = input * input;
87  StkFloat inCubed = inSquared * input;
88 
89  lastFrame_[0] = gain_ * (a1_ * input + a2_ * inSquared + a3_ * inCubed);
90 
91  // Apply threshold if we are out of range.
92  if ( fabs( lastFrame_[0] ) > threshold_ ) {
93  lastFrame_[0] = ( lastFrame_[0] < 0 ? -threshold_ : threshold_ );
94  }
95 
96  return lastFrame_[0];
97 }
98 
99 inline StkFrames& Cubic :: tick( StkFrames& frames, unsigned int channel )
100 {
101 #if defined(_STK_DEBUG_)
102  if ( channel >= frames.channels() ) {
103  oStream_ << "Cubic::tick(): channel and StkFrames arguments are incompatible!";
104  handleError( StkError::FUNCTION_ARGUMENT );
105  }
106 #endif
107 
108  StkFloat *samples = &frames[channel];
109  unsigned int hop = frames.channels();
110  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
111  *samples = tick( *samples );
112 
113  lastFrame_[0] = *(samples-hop);
114  return frames;
115 }
116 
117 inline StkFrames& Cubic :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
118 {
119 #if defined(_STK_DEBUG_)
120  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
121  oStream_ << "Cubic::tick(): channel and StkFrames arguments are incompatible!";
122  handleError( StkError::FUNCTION_ARGUMENT );
123  }
124 #endif
125 
126  StkFloat *iSamples = &iFrames[iChannel];
127  StkFloat *oSamples = &oFrames[oChannel];
128  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
129  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop )
130  *oSamples = tick( *iSamples );
131 
132  lastFrame_[0] = *(oSamples-oHop);
133  return iFrames;
134 }
135 
136 } // stk namespace
137 
138 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Delay_8h_source.html0000644000076600007660000006172012327015203015555 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Delay.h
1 #ifndef STK_DELAY_H
2 #define STK_DELAY_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
22 /***************************************************/
23 
24 class Delay : public Filter
25 {
26 public:
27 
29 
34  Delay( unsigned long delay = 0, unsigned long maxDelay = 4095 );
35 
37  ~Delay();
38 
40  unsigned long getMaximumDelay( void ) { return inputs_.size() - 1; };
41 
43 
50  void setMaximumDelay( unsigned long delay );
51 
53 
56  void setDelay( unsigned long delay );
57 
59  unsigned long getDelay( void ) const { return delay_; };
60 
62 
67  StkFloat tapOut( unsigned long tapDelay );
68 
70  void tapIn( StkFloat value, unsigned long tapDelay );
71 
73 
78  StkFloat addTo( StkFloat value, unsigned long tapDelay );
79 
81  StkFloat lastOut( void ) const { return lastFrame_[0]; };
82 
84 
87  StkFloat nextOut( void ) { return inputs_[outPoint_]; };
88 
90  StkFloat energy( void ) const;
91 
93  StkFloat tick( StkFloat input );
94 
96 
104  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
105 
107 
115  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
116 
117 protected:
118 
119  unsigned long inPoint_;
120  unsigned long outPoint_;
121  unsigned long delay_;
122 };
123 
124 inline StkFloat Delay :: tick( StkFloat input )
125 {
126  inputs_[inPoint_++] = input * gain_;
127 
128  // Check for end condition
129  if ( inPoint_ == inputs_.size() )
130  inPoint_ = 0;
131 
132  // Read out next value
133  lastFrame_[0] = inputs_[outPoint_++];
134 
135  if ( outPoint_ == inputs_.size() )
136  outPoint_ = 0;
137 
138  return lastFrame_[0];
139 }
140 
141 inline StkFrames& Delay :: tick( StkFrames& frames, unsigned int channel )
142 {
143 #if defined(_STK_DEBUG_)
144  if ( channel >= frames.channels() ) {
145  oStream_ << "Delay::tick(): channel and StkFrames arguments are incompatible!";
146  handleError( StkError::FUNCTION_ARGUMENT );
147  }
148 #endif
149 
150  StkFloat *samples = &frames[channel];
151  unsigned int hop = frames.channels();
152  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
153  inputs_[inPoint_++] = *samples * gain_;
154  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
155  *samples = inputs_[outPoint_++];
156  if ( outPoint_ == inputs_.size() ) outPoint_ = 0;
157  }
158 
159  lastFrame_[0] = *(samples-hop);
160  return frames;
161 }
162 
163 inline StkFrames& Delay :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
164 {
165 #if defined(_STK_DEBUG_)
166  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
167  oStream_ << "Delay::tick(): channel and StkFrames arguments are incompatible!";
168  handleError( StkError::FUNCTION_ARGUMENT );
169  }
170 #endif
171 
172  StkFloat *iSamples = &iFrames[iChannel];
173  StkFloat *oSamples = &oFrames[oChannel];
174  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
175  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
176  inputs_[inPoint_++] = *iSamples * gain_;
177  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
178  *oSamples = inputs_[outPoint_++];
179  if ( outPoint_ == inputs_.size() ) outPoint_ = 0;
180  }
181 
182  lastFrame_[0] = *(oSamples-oHop);
183  return iFrames;
184 }
185 
186 } // stk namespace
187 
188 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/DelayA_8h_source.html0000644000076600007660000006670312327015203015664 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


DelayA.h
1 #ifndef STK_DELAYA_H
2 #define STK_DELAYA_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
26 /***************************************************/
27 
28 class DelayA : public Filter
29 {
30 public:
31 
33 
38  DelayA( StkFloat delay = 0.5, unsigned long maxDelay = 4095 );
39 
41  ~DelayA();
42 
44  void clear( void );
45 
47  unsigned long getMaximumDelay( void ) { return inputs_.size() - 1; };
48 
50 
57  void setMaximumDelay( unsigned long delay );
58 
60 
63  void setDelay( StkFloat delay );
64 
66  StkFloat getDelay( void ) const { return delay_; };
67 
69 
74  StkFloat tapOut( unsigned long tapDelay );
75 
77  void tapIn( StkFloat value, unsigned long tapDelay );
78 
80  StkFloat lastOut( void ) const { return lastFrame_[0]; };
81 
83 
86  StkFloat nextOut( void );
87 
89  StkFloat tick( StkFloat input );
90 
92 
100  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
101 
103 
111  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
112 
113 protected:
114 
115  unsigned long inPoint_;
116  unsigned long outPoint_;
117  StkFloat delay_;
118  StkFloat alpha_;
119  StkFloat coeff_;
120  StkFloat apInput_;
121  StkFloat nextOutput_;
122  bool doNextOut_;
123 };
124 
125 inline StkFloat DelayA :: nextOut( void )
126 {
127  if ( doNextOut_ ) {
128  // Do allpass interpolation delay.
129  nextOutput_ = -coeff_ * lastFrame_[0];
130  nextOutput_ += apInput_ + ( coeff_ * inputs_[outPoint_] );
131  doNextOut_ = false;
132  }
133 
134  return nextOutput_;
135 }
136 
137 inline StkFloat DelayA :: tick( StkFloat input )
138 {
139  inputs_[inPoint_++] = input * gain_;
140 
141  // Increment input pointer modulo length.
142  if ( inPoint_ == inputs_.size() )
143  inPoint_ = 0;
144 
145  lastFrame_[0] = nextOut();
146  doNextOut_ = true;
147 
148  // Save the allpass input and increment modulo length.
149  apInput_ = inputs_[outPoint_++];
150  if ( outPoint_ == inputs_.size() )
151  outPoint_ = 0;
152 
153  return lastFrame_[0];
154 }
155 
156 inline StkFrames& DelayA :: tick( StkFrames& frames, unsigned int channel )
157 {
158 #if defined(_STK_DEBUG_)
159  if ( channel >= frames.channels() ) {
160  oStream_ << "DelayA::tick(): channel and StkFrames arguments are incompatible!";
161  handleError( StkError::FUNCTION_ARGUMENT );
162  }
163 #endif
164 
165  StkFloat *samples = &frames[channel];
166  unsigned int hop = frames.channels();
167  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
168  inputs_[inPoint_++] = *samples * gain_;
169  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
170  *samples = nextOut();
171  lastFrame_[0] = *samples;
172  doNextOut_ = true;
173  apInput_ = inputs_[outPoint_++];
174  if ( outPoint_ == inputs_.size() ) outPoint_ = 0;
175  }
176 
177  return frames;
178 }
179 
180 inline StkFrames& DelayA :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
181 {
182 #if defined(_STK_DEBUG_)
183  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
184  oStream_ << "DelayA::tick(): channel and StkFrames arguments are incompatible!";
185  handleError( StkError::FUNCTION_ARGUMENT );
186  }
187 #endif
188 
189  StkFloat *iSamples = &iFrames[iChannel];
190  StkFloat *oSamples = &oFrames[oChannel];
191  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
192  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
193  inputs_[inPoint_++] = *iSamples * gain_;
194  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
195  *oSamples = nextOut();
196  lastFrame_[0] = *oSamples;
197  doNextOut_ = true;
198  apInput_ = inputs_[outPoint_++];
199  if ( outPoint_ == inputs_.size() ) outPoint_ = 0;
200  }
201 
202  return iFrames;
203 }
204 
205 } // stk namespace
206 
207 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/DelayL_8h_source.html0000644000076600007660000006646012327015203015677 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


DelayL.h
1 #ifndef STK_DELAYL_H
2 #define STK_DELAYL_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
25 /***************************************************/
26 
27 class DelayL : public Filter
28 {
29 public:
30 
32 
37  DelayL( StkFloat delay = 0.0, unsigned long maxDelay = 4095 );
38 
40  ~DelayL();
41 
43  unsigned long getMaximumDelay( void ) { return inputs_.size() - 1; };
44 
46 
53  void setMaximumDelay( unsigned long delay );
54 
56 
59  void setDelay( StkFloat delay );
60 
62  StkFloat getDelay( void ) const { return delay_; };
63 
65 
70  StkFloat tapOut( unsigned long tapDelay );
71 
73  void tapIn( StkFloat value, unsigned long tapDelay );
74 
76  StkFloat lastOut( void ) const { return lastFrame_[0]; };
77 
79 
82  StkFloat nextOut( void );
83 
85  StkFloat tick( StkFloat input );
86 
88 
96  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
97 
99 
107  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
108 
109  protected:
110 
111  unsigned long inPoint_;
112  unsigned long outPoint_;
113  StkFloat delay_;
114  StkFloat alpha_;
115  StkFloat omAlpha_;
116  StkFloat nextOutput_;
117  bool doNextOut_;
118 };
119 
120 inline StkFloat DelayL :: nextOut( void )
121 {
122  if ( doNextOut_ ) {
123  // First 1/2 of interpolation
124  nextOutput_ = inputs_[outPoint_] * omAlpha_;
125  // Second 1/2 of interpolation
126  if (outPoint_+1 < inputs_.size())
127  nextOutput_ += inputs_[outPoint_+1] * alpha_;
128  else
129  nextOutput_ += inputs_[0] * alpha_;
130  doNextOut_ = false;
131  }
132 
133  return nextOutput_;
134 }
135 
136 inline StkFloat DelayL :: tick( StkFloat input )
137 {
138  inputs_[inPoint_++] = input * gain_;
139 
140  // Increment input pointer modulo length.
141  if ( inPoint_ == inputs_.size() )
142  inPoint_ = 0;
143 
144  lastFrame_[0] = nextOut();
145  doNextOut_ = true;
146 
147  // Increment output pointer modulo length.
148  if ( ++outPoint_ == inputs_.size() )
149  outPoint_ = 0;
150 
151  return lastFrame_[0];
152 }
153 
154 inline StkFrames& DelayL :: tick( StkFrames& frames, unsigned int channel )
155 {
156 #if defined(_STK_DEBUG_)
157  if ( channel >= frames.channels() ) {
158  oStream_ << "DelayL::tick(): channel and StkFrames arguments are incompatible!";
159  handleError( StkError::FUNCTION_ARGUMENT );
160  }
161 #endif
162 
163  StkFloat *samples = &frames[channel];
164  unsigned int hop = frames.channels();
165  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
166  inputs_[inPoint_++] = *samples * gain_;
167  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
168  *samples = nextOut();
169  doNextOut_ = true;
170  if ( ++outPoint_ == inputs_.size() ) outPoint_ = 0;
171  }
172 
173  lastFrame_[0] = *(samples-hop);
174  return frames;
175 }
176 
177 inline StkFrames& DelayL :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
178 {
179 #if defined(_STK_DEBUG_)
180  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
181  oStream_ << "DelayL::tick(): channel and StkFrames arguments are incompatible!";
182  handleError( StkError::FUNCTION_ARGUMENT );
183  }
184 #endif
185 
186  StkFloat *iSamples = &iFrames[iChannel];
187  StkFloat *oSamples = &oFrames[oChannel];
188  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
189  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
190  inputs_[inPoint_++] = *iSamples * gain_;
191  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
192  *oSamples = nextOut();
193  doNextOut_ = true;
194  if ( ++outPoint_ == inputs_.size() ) outPoint_ = 0;
195  }
196 
197  lastFrame_[0] = *(oSamples-oHop);
198  return iFrames;
199 }
200 
201 } // stk namespace
202 
203 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html0000644000076600007660000007420312327015206020054 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


include Directory Reference

Files

file  ADSR.h [code]
 
file  Asymp.h [code]
 
file  BandedWG.h [code]
 
file  BeeThree.h [code]
 
file  BiQuad.h [code]
 
file  Blit.h [code]
 
file  BlitSaw.h [code]
 
file  BlitSquare.h [code]
 
file  BlowBotl.h [code]
 
file  BlowHole.h [code]
 
file  Bowed.h [code]
 
file  BowTable.h [code]
 
file  Brass.h [code]
 
file  Chorus.h [code]
 
file  Clarinet.h [code]
 
file  Cubic.h [code]
 
file  Delay.h [code]
 
file  DelayA.h [code]
 
file  DelayL.h [code]
 
file  Drummer.h [code]
 
file  Echo.h [code]
 
file  Effect.h [code]
 
file  Envelope.h [code]
 
file  FileLoop.h [code]
 
file  FileRead.h [code]
 
file  FileWrite.h [code]
 
file  FileWvIn.h [code]
 
file  FileWvOut.h [code]
 
file  Filter.h [code]
 
file  Fir.h [code]
 
file  Flute.h [code]
 
file  FM.h [code]
 
file  FMVoices.h [code]
 
file  FormSwep.h [code]
 
file  FreeVerb.h [code]
 
file  Function.h [code]
 
file  Generator.h [code]
 
file  Granulate.h [code]
 
file  Guitar.h [code]
 
file  HevyMetl.h [code]
 
file  Iir.h [code]
 
file  InetWvIn.h [code]
 
file  InetWvOut.h [code]
 
file  Instrmnt.h [code]
 
file  JCRev.h [code]
 
file  JetTable.h [code]
 
file  LentPitShift.h [code]
 
file  Mandolin.h [code]
 
file  Mesh2D.h [code]
 
file  Messager.h [code]
 
file  MidiFileIn.h [code]
 
file  Modal.h [code]
 
file  ModalBar.h [code]
 
file  Modulate.h [code]
 
file  Moog.h [code]
 
file  Mutex.h [code]
 
file  Noise.h [code]
 
file  NRev.h [code]
 
file  OnePole.h [code]
 
file  OneZero.h [code]
 
file  PercFlut.h [code]
 
file  Phonemes.h [code]
 
file  PitShift.h [code]
 
file  Plucked.h [code]
 
file  PoleZero.h [code]
 
file  PRCRev.h [code]
 
file  ReedTable.h [code]
 
file  Resonate.h [code]
 
file  Rhodey.h [code]
 
file  RtAudio.h [code]
 
file  RtMidi.h [code]
 
file  RtWvIn.h [code]
 
file  RtWvOut.h [code]
 
file  Sampler.h [code]
 
file  Saxofony.h [code]
 
file  Shakers.h [code]
 
file  Simple.h [code]
 
file  SineWave.h [code]
 
file  SingWave.h [code]
 
file  Sitar.h [code]
 
file  Skini.h [code]
 
file  SKINI.msg
 
file  Socket.h [code]
 
file  Sphere.h [code]
 
file  StifKarp.h [code]
 
file  Stk.h [code]
 
file  TapDelay.h [code]
 
file  TcpClient.h [code]
 
file  TcpServer.h [code]
 
file  Thread.h [code]
 
file  TubeBell.h [code]
 
file  Twang.h [code]
 
file  TwoPole.h [code]
 
file  TwoZero.h [code]
 
file  UdpSocket.h [code]
 
file  Vector3D.h [code]
 
file  Voicer.h [code]
 
file  VoicForm.h [code]
 
file  Whistle.h [code]
 
file  Wurley.h [code]
 
file  WvIn.h [code]
 
file  WvOut.h [code]
 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/download.html0000644000076600007660000005441412327015203014351 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Download, Release Notes, and Bug Fixes

Download Version 4.5.0 (26 April 2014):

Release Notes:

Version 4.5.0

  • Updated versions of RtAudio and RtMidi, with associated renaming of RtError class to either RtAudioError or RtMidiError
  • New iOS project files (thanks to Ariel Elkin)
  • Bug fix in FreeVerb that could cause crackling for stereo input
  • Various bug fixes and updates to minimize compiler warnings
  • ADSR fix for decay/release time calculations
  • Various updates to build system

Version 4.4.4

  • New FreeVerb class (thanks to Greg Burlet)
  • New Guitar class
  • New electric guitar project
  • Updated versions of RtAudio and RtMidi
  • Cleaned / revised Shakers class
  • Bug fix in LentPitShift
  • Bug fix in Echo constructor
  • Bug fix in FileWvIn (file size when chunking)
  • Bug fix in StkFrames copy constructor

Version 4.4.3

  • 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.
  • Bug fixes in ADSR and Envelope classes.
  • 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.

Version 4.4.2

  • Added various header file includes for newer compilers.
  • Updates to RtAudio and RtMidi.
  • New LentPitShift class (thanks to Francois Germain).
  • Bug fixes in Voicer class (thanks Richard Dobson!).
  • Added Makefile.in to compile library and all projects, as well as clean and distclean.

Version 4.4.1

  • 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.

Version 4.4.0

  • 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).

Version 4.3.1

  • Further headerless file support in FileRead.
  • Bug fix in RtWvOut.cpp.
  • Added configure support for MinGW.
  • Updates to RtAudio and RtMidi for MinGW.
  • Changes to channel assignment in demo.cpp.

Version 4.3.0

  • 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.
  • Fixes in BlitSquare for frequency, harmonics, and dc offset.
  • Updates to Makefiles for non-realtime compile.
  • Fix in demo.cpp for voice channel assignment.
  • Updated versions of RtMidi and RtAudio.
  • Updated ASIO files for MinGW compiler.
  • New FAQ in documentation.
  • MAT-file bug fix in FileRead class.

Version 4.2.1

  • Greatly expanded StkFrames functionality (including interpolation and indexing by channel/frame).
  • New Blit, BlitSaw, and BlitSquare bandlimited waveform classes (thanks to Robin Davies!).
  • New Granulate granular synthesis class.
  • Removed Table class ... all functionality (including interpolation) now in StkFrames and FileRead classes.
  • Revised Socket class (now abstract) and added TcpServer, TcpClient, and UdpSocket subclasses.
  • Added Stk::showWarnings() and Stk::printErrors() functions to dis/enable warning and error printouts.
  • Extracted file I/O functionality to FileRead and FileWrite classes.
  • Revised WvIn / WvOut class structure (WvIn / WvOut now abstract and file I/O functionality in new FileWvIn / FileWvOut subclasses).
  • New SineWave class which calculates its own static table of variable length (no rawwave dependency).
  • New sinewave.raw file of length 1024 samples (used to be 256).
  • TcpWvIn and TcpWvOut renamed InetWvIn and InetWvOut, with added support for UDP sockets.
  • Fixed bug in WvOut tickFrame( const StkFrames &frames ) function.
  • Fixed bug in demo.cpp when writing output soundfiles without realtime output.
  • Added "binary" open flag to MidiFileIn class for Windows.
  • Fixed oversized MAT-file header in WvOut.cpp
  • Fixed case statement bug in MidiFileIn.cpp for sysex.
  • Added missing getDelay() function to DelayA.cpp.
  • Fixed modDepth omission in Chorus.cpp.
  • Fixed DC blocker initialization bug in Flute.cpp.
  • Changed Filter class behavior so no default clearing of state when changing coefficients.
  • Fixes to RtAudio, especially for Windows DirectSound and ASIO (thanks to Robin Davies).

Version 4.2.0

  • Simultaneous multiple audio APIs supported at compile time.
  • Various changes to better conform to standard C++ programming practices.
  • Fixed hidden overloaded virtual functions.
  • New Asymp exponential envelope class.
  • MY_FLOAT type converted to StkFloat and changed throughout (use treesed utility to search/replace in old files).
  • Most example programs rewritten to use an audio callback paradigm (which works better in OS-X).
  • New StkFrames class for vectorized multichannel data and associated new tick() functions making use of StkFrames.
  • New RtMidi class with MIDI output capabilities (API changes).
  • New MidiFileIn class for reading MIDI files.
  • Revised Filter classes to use std::vectors for coefficients (API changes).
  • Revised Messager class (API changes).
  • New abstract parent Effect class for various effects.
  • New abstract parent Generator class for various signal sources.
  • New abstract parent Function class for tables and various non-linear functions.
  • Skini class completely rewritten (simplified) using the C++ STL (API changes).
  • WvOut classes now clip to -1.0 to +1.0 and report out of range.
  • New Mutex class.
  • Turned Nagle algorithm off by default in Socket class.
  • Error reporting standardized in all classes.

Version 4.1.3

  • Bug fix in RtAudio for Windows DirectSound output only support

Version 4.1.2

  • Added Linux JACK support to RtAudio.
  • Added optional doNormalize argument to WvIn to allow specification of data normalization or not.
  • Added volume control to demo program and various tcl scripts.
  • Added support for dynamic rawwavePath() setting.
  • WaveLoop bug fix.
  • Fixed bug in ADSR::setReleaseTime() method.
  • Fixed missing initialization of apInput in non-default constructor of DelayA class.
  • Added time seeding of random number generator to Noise constructor.
  • Update to the contentsAt() method of Delay class.
  • WAV file fixes (8-bit) in WvIn and WvOut classes.
  • Configure script changes.
  • Updated <iostream> include statements and appended "std::" as necessary throughout for compatibility with gcc 3.

Version 4.1.1

  • Bug fix in RtAudio for Macintosh OS X and Windows ASIO duplex operation.
  • Windows ASIO fix in Stk.h.
  • Documentation updates.
  • Expanded tutorial.
  • Fixed RtDuplex omission in src Makefile.

Version 4.1

  • Macintosh OS X support added.
  • New Whistle class.
  • Added Voicer, SingWave, and VoicForm classes.
  • Improvements/fixes to the banded waveguide instruments.
  • Demo program now uses Voicer, allowing polyphony.
  • Demo tcl/tk scripts changed to use SKINI PitchChange instead of PitchBend.
  • Demo program response to PitchBend modified to octave up/down.
  • Several RtAudio fixes and improvements (OS X and Windows ASIO support added).
  • Added nextOut() method to Delay classes.
  • Documentation fixes for Reverb classes.
  • RAWWAVE_PATH changed to include the "rawwave" directory.
  • "configure" support added for unix systems.
  • Multivoice flag (-n NUMBER) added as command line option to demo program.
  • Sample rate flag added as command line option to example programs.
  • Socket port number added as command line option to example programs.

Version 4.0

  • New documentation and tutorial.
  • Several new instruments, including Saxofony, BlowBotl, and StifKarp.
  • New Stk base class, replacing Object class.
  • New Filter class structure and methods.
  • Extensive modifications to WvIn and WvOut class structures and methods.
  • Looping functionality moved to WaveLoop (subclass of WvIn).
  • Automatic file type detection in WvIn ... hosed WavWvIn, AifWvIn, RawWavIn, SndWavIn, and MatWvIn subclasses.
  • New file type specifier argument in WvOut ... hosed WavWvOut, AifWvOut, RawWavOut, SndWavOut, and MatWvOut subclasses.
  • Some simplifications of Messager class (was Controller).
  • New independent RtAudio class.
  • Extensive revisions in code and a significant number of API changes.

Version 3.2

  • New input control handling class (Controller)
  • Added AIFF file input/output support.
  • New C++ error handling capabilities.
  • New input/output internet streaming support (StrmWvIn/StrmWvOut).
  • Added native ALSA support for linux.
  • Added optional "device" argument to all "Rt" classes (audio and MIDI) and printout of devices when argument is invalid.
  • WvIn classes rewritten to support very big files (incremental load from disk).
  • Changed WvIn/WvOut classes to work with sample frame buffers.
  • Fixed looping and negative rate calculations in WvIn classes.
  • Fixed interpolation bug in RtWvIn.
  • Windoze RtAudio code rewritten (thank Dave!).
  • Simplified byte-swapping functions (in-place swapping).
  • "Stereo-ized" RagaMatic.
  • Miscellaneous renamings.
  • Probably a bunch more fixes that I've long since forgotten about.

Version 3.1

  • New RagaMatic project ... very cool!!!
  • Less clipping in the Shakers class.
  • Added "microphone position" to Mandolin in STKdemo.
  • Fixed MIDI system message exclusion under Irix.
  • Added a few bitmaps for the Shaker instruments.
  • Made destructors virtual for Reverb.h, WvIn.h and Simple.h.
  • Fixed bug setting delay length in DLineA when value too big.
  • Fixed bug in WinMM realtime code (RTSoundIO).
  • Added tick() method to BowTabl, JetTabl, and ReedTabl (same as lookup).
  • Switched to pthread API on SGI platforms.
  • Added some defines to Object.h for random number generation, FPU overflow checking, etc....
  • A few minor changes, some bug fixes ... can't remember all of them.

Version 3.0

  • New #define flags for OS and realtime dependencies (this will probably cause problems for old personal STK code, but it was necessary to make future ports easier).
  • Expanded and cleaned the Shakers class.
  • New BowedBar algorithm/class.
  • Fixed Linux MIDI input bug.
  • Fixed MIDI status masking problem in Windows.
  • OS type defines now in Makefile.
  • New RAWWAVE_PATH define in Object.h.
  • Syntmono project pulled out to separate directory and cleaned up.
  • Socketing capabilities under Unix, as well as Windoze.
  • Multiple simultaneous socket client connections to STK servers now possible.
  • MD2SKINI now can merge MIDI and piped messages under Irix and Linux (for TCL->MD2SKINI->syntmono control).
  • Defined INT16 and INT32 types and fixed various WvIn and WvOut classes.
  • Updated MatWvIn and MatWvOut for new MAT-file documentation from Matlab.
  • New demo Tcl/Tk GUI (TclDemo.tcl).
  • Minor fixes to FM behavior.
  • Added record/duplex capabilities to RTSoundIO (Linux, SGI, and Windoze).
  • Fixed bugs in WavWvOut and MatWvOut header specifications.
  • Added RawWvOut class.
  • New WvIn class with RawWvIn, SndWvIn, WavWvIn, MatWvIn, and RTWvIn subclasses.
  • Removed RawWave, RawShot, RawInterp, and RawLoop classes (supplanted by RawWvIn).
  • Multi-channel data support in WvIn and WvOut classes using MY_MULTI data type (pointer to StkFloat) and the methods mtick() and mlastOutput().
  • Now writing to primary buffer under Windoze when allowed by hardware.
  • Cleaned up Object.h a bit.
  • Pulled various utility and thread functions out of syntmono.cpp (to aid readability of the code).

Version 2.02

  • Created RawWave abstract class, with subclasses of RawLoop (looping rawwave oscillator), RawShot (non-looping, non-interpolating rawwave player ... used to be RawWvIn), and RawInterp (looping or non-looping, interpolating rawwave player ... used to be RawWave).
  • Modified DrumSynt to correctly handle sample rates different than 22050 Hz.
  • Modified syntmono parsing vs. tick routine so that some ticking occurs between each message. When multiple messages are waiting to be processed, the time between message updates is inversely proportional to the number of messages in the buffer.
  • Fixed DirectSound playback bug in WinXX distribution. Sound was being played at 8-bit, 22 kHz in all cases. Playback is now 16-bit and dependent on SRATE.
  • Fixed bug in MD2SKINI which prevented some NoteOff statements from being output.
  • This distribution includes an example STK project, mus151, which demonstrates a means for keeping a user's personal projects separate from the main distribution. This is highly recommended, in order to simplify upgrades to future STK releases.

Version 2

  • Unification of the capabilities of STK across the various platforms. All of the previous SGI functionality has been ported to Linux and Windows, including realtime sound output and MIDI input.
  • MIDI input (with optional time-stamping) supported on SGI, Linux (OSS device drivers only), and Windows operating systems. Time stamping under IRIX and Windows is quantized to milliseconds and under Linux to hundredths of a second.
  • Various Sound Output Options - .wav, .snd, and .mat (Matlab MAT-file) soundfile outputs are supported on all operating systems. I hacked out the MAT-file structure, so you don't have to include any platform-specific libraries. Realtime sound output is provided as well, except under NeXTStep.
  • Multiple Reverberator Implementations - Reverb subclasses of JCRev and NRev (popular reverberator implementations from CCRMA) have been written. Perry's original reverb implementation still exists as PRCRev. All reverberators now take a T60 initializer argument.
  • MD2SKINI - A program which parses a MIDI input stream and spits out SKINI code. The output of MD2SKINI is typically piped into an STK instrument executable (eg. MD2SKINI | syntmono Clarinet -r -i). In addition, you can supply a filename argument to MD2SKINI and have it simultaneously record a SKINI score file for future reuse.
  • Modifications to Object.h for OS_TYPE compilation dependencies. Makefile automatically determines OS_TYPE when invoked (if you have the GNU makefile utilities installed on your system).
  • A single distribution for all platforms. The Unix and Windows versions have been merged into a single set of classes. Makefiles and Visual C++ workspace/project files are provided for compiling.

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/doxygen.css0000644000076600007660000004774412327015202014052 0ustar gary/* The standard CSS for doxygen 1.8.3.1 */ body, table, div, p, dl { font: 400 14px/19px Roboto,sans-serif; } /* @group Heading Levels */ h1.groupheader { font-size: 150%; } .title { font-size: 150%; font-weight: bold; margin: 10px 2px; } h2.groupheader { border-bottom: 1px solid #879ECB; color: #354C7B; font-size: 150%; font-weight: normal; margin-top: 1.75em; padding-top: 8px; padding-bottom: 4px; width: 100%; } h3.groupheader { font-size: 100%; } h1, h2, h3, h4, h5, h6 { -webkit-transition: text-shadow 0.5s linear; -moz-transition: text-shadow 0.5s linear; -ms-transition: text-shadow 0.5s linear; -o-transition: text-shadow 0.5s linear; transition: text-shadow 0.5s linear; margin-right: 15px; } h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { text-shadow: 0 0 15px cyan; } dt { font-weight: bold; } div.multicol { -moz-column-gap: 1em; -webkit-column-gap: 1em; -moz-column-count: 3; -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { margin-top: 2px; } p.endli { margin-bottom: 0px; } p.enddd { margin-bottom: 4px; } p.endtd { margin-bottom: 2px; } /* @end */ caption { font-weight: bold; } span.legend { font-size: 70%; text-align: center; } h3.version { font-size: 90%; text-align: center; } div.qindex, div.navtab{ background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; } div.qindex, div.navpath { width: 100%; line-height: 140%; } div.navtab { margin-right: 15px; } /* @group Link Styling */ a { color: #3D578C; font-weight: normal; text-decoration: none; } .contents a:visited { color: #4665A2; } a:hover { text-decoration: underline; } a.qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #9CAFD4; color: #ffffff; border: 1px double #869DCA; } .contents a.qindexHL:visited { color: #ffffff; } a.el { font-weight: bold; } a.elRef { } a.code, a.code:visited { color: #4665A2; } a.codeRef, a.codeRef:visited { color: #4665A2; } /* @end */ dl.el { margin-left: -1cm; } pre.fragment { border: 1px solid #C4CFE5; background-color: #FBFCFD; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; font-size: 9pt; line-height: 125%; font-family: monospace, fixed; font-size: 105%; } div.fragment { padding: 4px; margin: 4px; background-color: #FBFCFD; border: 1px solid #C4CFE5; } div.line { font-family: monospace, fixed; font-size: 13px; min-height: 13px; line-height: 1.0; text-wrap: unrestricted; white-space: -moz-pre-wrap; /* Moz */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ white-space: pre-wrap; /* CSS3 */ word-wrap: break-word; /* IE 5.5+ */ text-indent: -53px; padding-left: 53px; padding-bottom: 0px; margin: 0px; -webkit-transition-property: background-color, box-shadow; -webkit-transition-duration: 0.5s; -moz-transition-property: background-color, box-shadow; -moz-transition-duration: 0.5s; -ms-transition-property: background-color, box-shadow; -ms-transition-duration: 0.5s; -o-transition-property: background-color, box-shadow; -o-transition-duration: 0.5s; transition-property: background-color, box-shadow; transition-duration: 0.5s; } div.line.glow { background-color: cyan; box-shadow: 0 0 10px cyan; } span.lineno { padding-right: 4px; text-align: right; border-right: 2px solid #0F0; background-color: #E8E8E8; white-space: pre; } span.lineno a { background-color: #D8D8D8; } span.lineno a:hover { background-color: #C8C8C8; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px; padding: 0.2em; border: solid thin #333; border-radius: 0.5em; -webkit-border-radius: .5em; -moz-border-radius: .5em; box-shadow: 2px 2px 3px #999; -webkit-box-shadow: 2px 2px 3px #999; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } div.groupHeader { margin-left: 16px; margin-top: 12px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; } body { background-color: white; color: black; margin: 0; } div.contents { margin-top: 10px; margin-left: 12px; margin-right: 8px; } td.indexkey { background-color: #EBEFF6; font-weight: bold; border: 1px solid #C4CFE5; margin: 2px 0px 2px 0; padding: 2px 10px; white-space: nowrap; vertical-align: top; } td.indexvalue { background-color: #EBEFF6; border: 1px solid #C4CFE5; padding: 2px 10px; margin: 2px 0px; } tr.memlist { background-color: #EEF1F7; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } div.center { text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { border: 0px; } address.footer { text-align: right; padding-right: 12px; } img.footer { border: 0px; vertical-align: middle; } /* @group Code Colorization */ span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } span.vhdldigit { color: #ff00ff } span.vhdlchar { color: #000000 } span.vhdlkeyword { color: #700070 } span.vhdllogic { color: #ff0000 } blockquote { background-color: #F7F8FB; border-left: 2px solid #9CAFD4; margin: 0 24px 0 4px; padding: 0 12px 0 16px; } /* @end */ /* .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } */ td.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #A3B4D7; } th.dirtab { background: #EBEFF6; font-weight: bold; } hr { height: 0px; border: none; border-top: 1px solid #4A6AAA; } hr.footer { height: 1px; } /* @group Member Descriptions */ table.memberdecls { border-spacing: 0px; padding: 0px; } .memberdecls td, .fieldtable tr { -webkit-transition-property: background-color, box-shadow; -webkit-transition-duration: 0.5s; -moz-transition-property: background-color, box-shadow; -moz-transition-duration: 0.5s; -ms-transition-property: background-color, box-shadow; -ms-transition-duration: 0.5s; -o-transition-property: background-color, box-shadow; -o-transition-duration: 0.5s; transition-property: background-color, box-shadow; transition-duration: 0.5s; } .memberdecls td.glow, .fieldtable tr.glow { background-color: cyan; box-shadow: 0 0 15px cyan; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #F9FAFC; border: none; margin: 4px; padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; color: #555; } .memSeparator { border-bottom: 1px solid #DEE4F0; line-height: 1px; margin: 0px; padding: 0px; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } .memItemRight { width: 100%; } .memTemplParams { color: #4665A2; white-space: nowrap; font-size: 80%; } /* @end */ /* @group Member Details */ /* Styles for detailed member documentation */ .memtemplate { font-size: 80%; color: #4665A2; font-weight: normal; margin-left: 9px; } .memnav { background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .mempage { width: 100%; } .memitem { padding: 0; margin-bottom: 10px; margin-right: 5px; -webkit-transition: box-shadow 0.5s linear; -moz-transition: box-shadow 0.5s linear; -ms-transition: box-shadow 0.5s linear; -o-transition: box-shadow 0.5s linear; transition: box-shadow 0.5s linear; display: table !important; width: 100%; } .memitem.glow { box-shadow: 0 0 15px cyan; } .memname { font-weight: bold; margin-left: 6px; } .memname td { vertical-align: bottom; } .memproto, dl.reflist dt { border-top: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 0px 6px 0px; color: #253555; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #E2E8F2; /* opera specific markup */ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); border-top-right-radius: 4px; border-top-left-radius: 4px; /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 4px; -moz-border-radius-topleft: 4px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 4px; -webkit-border-top-left-radius: 4px; } .memdoc, dl.reflist dd { border-bottom: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 10px 2px 10px; background-color: #FBFCFD; border-top-width: 0; background-image:url('nav_g.png'); background-repeat:repeat-x; background-color: #FFFFFF; /* opera specific markup */ border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); /* firefox specific markup */ -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; /* webkit specific markup */ -webkit-border-bottom-left-radius: 4px; -webkit-border-bottom-right-radius: 4px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); } dl.reflist dt { padding: 5px; } dl.reflist dd { margin: 0px 0px 10px 0px; padding: 5px; } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } .paramname code { line-height: 14px; } .params, .retval, .exception, .tparams { margin-left: 0px; padding-left: 0px; } .params .paramname, .retval .paramname { font-weight: bold; vertical-align: top; } .params .paramtype { font-style: italic; vertical-align: top; } .params .paramdir { font-family: "courier new",courier,monospace; vertical-align: top; } table.mlabels { border-spacing: 0px; } td.mlabels-left { width: 100%; padding: 0px; } td.mlabels-right { vertical-align: bottom; padding: 0px; white-space: nowrap; } span.mlabels { margin-left: 8px; } span.mlabel { background-color: #728DC1; border-top:1px solid #5373B4; border-left:1px solid #5373B4; border-right:1px solid #C4CFE5; border-bottom:1px solid #C4CFE5; text-shadow: none; color: white; margin-right: 4px; padding: 2px 3px; border-radius: 3px; font-size: 7pt; white-space: nowrap; vertical-align: middle; } /* @end */ /* these are for tree view when not used as main index */ div.directory { margin: 10px 0px; border-top: 1px solid #A8B8D9; border-bottom: 1px solid #A8B8D9; width: 100%; } .directory table { border-collapse:collapse; } .directory td { margin: 0px; padding: 0px; vertical-align: top; } .directory td.entry { white-space: nowrap; padding-right: 6px; } .directory td.entry a { outline:none; } .directory td.entry a img { border: none; } .directory td.desc { width: 100%; padding-left: 6px; padding-right: 6px; padding-top: 3px; border-left: 1px solid rgba(0,0,0,0.05); } .directory tr.even { padding-left: 6px; background-color: #F7F8FB; } .directory img { vertical-align: -30%; } .directory .levels { white-space: nowrap; width: 100%; text-align: right; font-size: 9pt; } .directory .levels span { cursor: pointer; padding-left: 2px; padding-right: 2px; color: #3D578C; } div.dynheader { margin-top: 8px; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } address { font-style: normal; color: #2A3D61; } table.doxtable { border-collapse:collapse; margin-top: 4px; margin-bottom: 4px; } table.doxtable td, table.doxtable th { border: 1px solid #2D4068; padding: 3px 7px 2px; } table.doxtable th { background-color: #374F7F; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; } table.fieldtable { /*width: 100%;*/ margin-bottom: 10px; border: 1px solid #A8B8D9; border-spacing: 0px; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); } .fieldtable td, .fieldtable th { padding: 3px 7px 2px; } .fieldtable td.fieldtype, .fieldtable td.fieldname { white-space: nowrap; border-right: 1px solid #A8B8D9; border-bottom: 1px solid #A8B8D9; vertical-align: top; } .fieldtable td.fieldname { padding-top: 5px; } .fieldtable td.fielddoc { border-bottom: 1px solid #A8B8D9; /*width: 100%;*/ } .fieldtable td.fielddoc p:first-child { margin-top: 2px; } .fieldtable td.fielddoc p:last-child { margin-bottom: 2px; } .fieldtable tr:last-child td { border-bottom: none; } .fieldtable th { background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #E2E8F2; font-size: 90%; color: #253555; padding-bottom: 4px; padding-top: 5px; text-align:left; -moz-border-radius-topleft: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-left-radius: 4px; -webkit-border-top-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom: 1px solid #A8B8D9; } .tabsearch { top: 0px; left: 10px; height: 36px; background-image: url('tab_b.png'); z-index: 101; overflow: hidden; font-size: 13px; } .navpath ul { font-size: 11px; background-image:url('tab_b.png'); background-repeat:repeat-x; background-position: 0 -5px; height:30px; line-height:30px; color:#8AA0CC; border:solid 1px #C2CDE4; overflow:hidden; margin:0px; padding:0px; } .navpath li { list-style-type:none; float:left; padding-left:10px; padding-right:15px; background-image:url('bc_s.png'); background-repeat:no-repeat; background-position:right; color:#364D7C; } .navpath li.navelem a { height:32px; display:block; text-decoration: none; outline: none; color: #283A5D; font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); text-decoration: none; } .navpath li.navelem a:hover { color:#6884BD; } .navpath li.footer { list-style-type:none; float:right; padding-left:10px; padding-right:15px; background-image:none; background-repeat:no-repeat; background-position:right; color:#364D7C; font-size: 8pt; } div.summary { float: right; font-size: 8pt; padding-right: 5px; width: 50%; text-align: right; } div.summary a { white-space: nowrap; } div.ingroups { font-size: 8pt; width: 50%; text-align: left; } div.ingroups a { white-space: nowrap; } div.header { background-image:url('nav_h.png'); background-repeat:repeat-x; background-color: #F9FAFC; margin: 0px; border-bottom: 1px solid #C4CFE5; } div.headertitle { padding: 5px 5px 5px 10px; } dl { padding: 0 0 0 10px; } /* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ dl.section { margin-left: 0px; padding-left: 0px; } dl.note { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #D0C000; } dl.warning, dl.attention { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #FF0000; } dl.pre, dl.post, dl.invariant { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #00D000; } dl.deprecated { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #505050; } dl.todo { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #00C0E0; } dl.test { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #3030E0; } dl.bug { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #C08050; } dl.section dd { margin-bottom: 6px; } #projectlogo { text-align: center; vertical-align: bottom; border-collapse: separate; } #projectlogo img { border: 0px none; } #projectname { font: 300% Tahoma, Arial,sans-serif; margin: 0px; padding: 2px 0px; } #projectbrief { font: 120% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #projectnumber { font: 50% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #titlearea { padding: 0px; margin: 0px; width: 100%; border-bottom: 1px solid #5373B4; } .image { text-align: center; } .dotgraph { text-align: center; } .mscgraph { text-align: center; } .caption { font-weight: bold; } div.zoom { border: 1px solid #90A5CE; } dl.citelist { margin-bottom:50px; } dl.citelist dt { color:#334975; float:left; font-weight:bold; margin-right:10px; padding:5px; } dl.citelist dd { margin:2px 0; padding:5px 0; } div.toc { padding: 14px 25px; background-color: #F4F6FA; border: 1px solid #D8DFEE; border-radius: 7px 7px 7px 7px; float: right; height: auto; margin: 0 20px 10px 10px; width: 200px; } div.toc li { background: url("bdwn.png") no-repeat scroll 0 5px transparent; font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; margin-top: 5px; padding-left: 10px; padding-top: 2px; } div.toc h3 { font: bold 12px/1.2 Arial,FreeSans,sans-serif; color: #4665A2; border-bottom: 0 none; margin: 0; } div.toc ul { list-style: none outside none; border: medium none; padding: 0px; } div.toc li.level1 { margin-left: 0px; } div.toc li.level2 { margin-left: 15px; } div.toc li.level3 { margin-left: 30px; } div.toc li.level4 { margin-left: 45px; } .inherit_header { font-weight: bold; color: gray; cursor: pointer; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .inherit_header td { padding: 6px 0px 2px 5px; } .inherit { display: none; } tr.heading h2 { margin-top: 12px; margin-bottom: 4px; } @media print { #top { display: none; } #side-nav { display: none; } #nav-path { display: none; } body { overflow:visible; } h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } .summary { display: none; } .memitem { page-break-inside: avoid; } #doc-content { margin-left:0 !important; height:auto !important; width:auto !important; overflow:inherit; display:inline; } } stk-4.5.0/doc/html/doxygen.png0000644000076600007660000000730312327015202014031 0ustar gary‰PNG  IHDRh ;ˆØŠIDATxí]y\•Õº~45%TL Q”PE"q–Û11±]8a„w*©¨(*â" ˆzÀè`8 ¨‰¢mÅ,’òà„p$%”œBó(8k†Ü÷ýÜû6lòö»§k÷Ç÷[ÏÞß·Ö;?k½ëßÕÕÕPxÑêÏ't´ÏùÈ€zÀÇÅ3_€Q4€g@œmÿ ¾ò‰âci‰ôçÿ{ ðÇð¬ù~½Á€4:õHcÂü ðŸÁ³„ª'ÕPÆæ P7^h،♠zb„cóP¨„ 3‚† Ò}çÿO²qÁºNkÝTÛ(É?d Ç~z<’«4Óǡ؞Þv­zµÙ¦õ¬ZâdÛ,Ë6Ók±]Fz< ¾ZçƒsÕ?ìƒsUø2SÉåwê1”c`[ì—}%ѽ.Ô¼6‚BLZ˜û!F8[ ¹…×TéÛ— »Þ#gó]å:vžu?‡vèbÙR˜?wùŽŸ¾ÊÐgbÑÉÌÕ$kF~Ê;عÆ•¢ïX®?ÉèlÆÙôõà»Nʪ¼­,ìHC§gAz•ÆlÓº­gÑú ]œjÎñåM…3ÓÚæoÒ³'=‘$Ò÷f}G•ŸS_‡öèco.Êȹ :ó£ Ãds®Ù:1=¼{ƒå9?÷ý…zqÛvîÓi‰D’p¿Ë šmÙíoÛâýaÖüEqÒµwÌ}¿~{òj€ç{ôºŸFNëí[ëOq·ÇOSúXO]°>‚‚muæÄ¾e¤“5Ë{¨JÕ¯£(›´«bÂçû’ÍlÓÅ}žïú`éUÞy„ac§Á†ÔCºŠóAkl‘±y¥†ô¢ùôs÷Aø¬7ÄõôoJ±äÄ ù.¥Be. Z¬Ð×ÇÈöå¹­ù'Ù-PëìŠyF.ž‚žÝÚ€lp&.êˆð•jò7’re’z19»ã§HGíø%œüq°ïüz׈c¬_k_")ŸHJnÐÑ~ˆÐÖ˜á´äÕ5 µÁq€ÿ5#¸·îà¶+9T‘‚ ðŽ÷Rܸrz“Ï´Ì =Ï…{ðáO£Èf ¡Íwg|Ž’Ü/¢Þ$÷¯¢ëðúÀ;¿à¨Ö™âÒÆ­]¯ÜW"Þ/< ‡÷DÏà°½üB}çyIEc^—ƒ=[V“Ýh²ëMä$l];Kû®¸ýr¦È*Åò ÿtÒõ$]•MŸ÷´;×I€1èó!‚œõ¸M õ¨(fÌæ<ÁÎÎò5~z¿ù¶ž mÌêÕ >–âÚ©âëˆIÎÞçz;ãu[i·eç^ÆÜÙÓ³NÞëF6B\}7†»+üŽÓ,Ã'a ½˜-yHY¿,‘^—ñfú~ß?Hcø¸…¸ñó{Z+4\såƒû·¯Ù·nߣð«íFÆ¡sغëû§D¾?ò<–Ævkx0ÅM±ælذÁIÓxÿd”žÜÉ÷EE»AªM«g*È£YEí7Û™^[uíý®v[wGå†=Ed¼n×¶ÆæÖÅl¡'¨pGÚk+‹æ¢À¬¨C8ªâš2 dz3H£ß ¡¨BÒûSÃÅù[wŘ ~xpçútÁæmö¤Å£¥iQæ­‰AB1ÉfÙ‰›4u¹ïìIÒ]Ë6äò%ÿ†† 1t.’NJph¬zÌ ÎR1Ž"3-"¸‡‹&ìó°1âüžìó[:‡ï„¼‘……N m–“W0®_èÜœ ×õ6ùò&»)Æìꦬýæ}¬ñ~»{múù]z½£M•ºP~^Îá:eQTÙ_*7ÕÄ9É8—·Ëï 3°¶47E•î¿u÷“SÉ»U¯ _ NíºôW¬e¸ÄNÓ|»;™¿;ŒæÅd"ȉôøòÞµõï¾®½"èÄ´ÖMM+bYµ‘_ÉæEÝüÎ]P»¹XKÐI½Þ¥oE<_¹(„EP±Œ|mÇÁ¡‘Ý,ŠÓ©ººZ±Îߺ§×kÝ,kÍMš`Äø…jzeU»æ ™Át3ÓÀ½˜6—ÒöùË·r¨¹Ñ}““wö:Χùë¼ ¿|‚TܵÉQˆKßç_ÁâÀ™œ”pÑÐóໃ¼Ydâ0!®àa –øöçW$ÃÁ‘Á$/\¬$ð 2ÞímÞLH‹Ÿ èd£HVÜ,:ò½»RÍZšJ­a„z*>‹_…NT(ù‚^SVF­U¹8ñEþôñ܈óùnd;«®8™\C]ø=Èêm¬Æ:‚´ÆbãDd=Áãßžˆ‹UU5O‹|]þð®Pèêv‰á\]2ßìÿ"yÈ[ïyʧz£g{Y«{„Ùø5©ÿ;w{N3é­nâĨw§Á¢ÍK¢Ý­ûÏ29Id¿’ì y)ìPÞò8ŒÅ©¯‰±@mPÔñwjl,6 áhWÕ˜d öà uõmÁp®.™á£Ç…twöR x­BδYcŒxg*vo  yò‘•“[¬?ÜVœ˜0ÒN¡O난~Žó’¯·h#´Hkýœ±8kÓß^Àq@]àÓ“ø,56´¯÷Í-κU»n…[>]@nîøÏœp›[œ6# €4tën¯:ŽÒþ}…—8äT9_žY$/´G’K™©ù†•(óÑ’Mø©`ŸÉdѺ;ùO‹B Ó&P{qöhJÉ+Úé–§¦l2«MïöÝ_1ÑÓ«’t¸½±l€ëØya ¦ô©«®½ÆL^¬žêñš¸ùy.¾Û½Š[ u/]½‹iS}øN>²e1™q‡jfÚ&¢©iT\=kÏ›ÀXô-.84V5ðu!TE˜ þ.ŒOH´¶4—zwTr.ï‰¦Ë xõµ·œÖ„HÆù£žÈHùg Ñhñ’T$ßyq¸zþ¨p¿´ë< q•ró÷š‰wÿÍÑð–I]´–æI²é²˜sÂ"×:Õ–bÕ¦“ÈÙL6¢9VÊÓWž§<æ;”3?ý©Mê3AV#µ±ËÞ¯‘ž K£UrÝ9!›qát¦H£Ù+6ÇV…/TS^pÃùqgLP'Ú5E ‚–ÀÞºîÄ Ën"2|Ÿ;®W»Îý"Ö¬TwÖâµtúŽO'› á+W Ã+¦âZÌ–<ÕÆ&nOÝ,IŠ£06.ÁZ.Çñúøh*INÚ’Oe½ÉgBXÐÔZóäøä9èü“hÒíDSš¥¡Ê µA¯/Ôc¸ö“`A§¯"zå|‘ €ÅŸ¨ú;HÍ#‚Î|%ÄOˆƒ«OàÌÉÐÜD ž mÜðâc–ƤÉÂqm¶uË&~÷núÒË £ÇÏ€ZÕj =«_n[‡‡÷nN§ÏÝ$_¾bE˜‚€Õ)ù8¾?6‘lú“ÍÙæÖ}#bW( œ³d-®•p&¡ý’œÖa”"9öõņÐ$’Ú›AÜ!ä;ÐÑõè{~á¹8‘ÛÞ£1ÛÓÉ0ž`²#´kÒuäNÅÖ Q¹bhæ ”8ûÓMáŽa›•¿”w±h²¢®qŠæ°(bK ‚’Z¾Ò%ÐÆémáãÖË(Éý‚ÛJ)@> þ›7% ï{y Á“¾ÆÒîohfòô>{pÿ.­_Î%±ÉèägëlZØ\B2B #™¸ÚüÒºp‚hÝšü®[¥Ü<‹#SpñÌA7’ãØHƒt4:Ÿ|g¨tÓL¶*($Æ©»ì…®ù’ó÷$;b›ÔÙ`=¶£¦M„MÌÄ5ò«·Ç¾“H·ÌH.¼žHeAîº5}r­dõ¨±)ÀT};€Q5iÖ2…O0ü…0óñÃ;óæ,Š´²µ냔}g‘£]‹7å9ˆà©_{üèîêžC>úhê{Ž .ÈìðIIð€?[Kswz6Òuíý¬;µ€ç§OåâJÉa˶zv°éd† ¤µâ‚l´é舊«Åüy¾c÷ÁèÖÍ'ràúÅ™TWÕôÓ°¡L €|ʽŒ¼ì­høBã ÝTëî'ò]Kø£ìâÏ(=¹Kx €¿ LÌ,Pý¤Êµu‡¹…׈ §Å¾÷à1Ý«Äý;¿pGDäxZYÛ kfæ6¸ùóæ7®œ®þ6·ÕoÚ¾ÔH~ò®Þ¸â 8Uø“p<ºw3¡a£ÏÑ’‘3èÏ"€bˆ-ÎܺÏ_ªÅ]+ËM©zü°s“f-êçhÇãÑýÊãôÿ5}ZQNb{Ó?å%ÿ\SUõعIÓæ}~}p[œoÔÄ„êÐMMZáNÅå@>Œ„²á6(?¡Åé âK½+ü?À%ÝÝ·/Ç1‚9áUø?B)”ÕèâÞlÈÒêÏ @=àùÄÞžk­®ÅIEND®B`‚stk-4.5.0/doc/html/Drummer_8h_source.html0000644000076600007660000004231112327015203016125 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Drummer.h
1 #ifndef STK_DRUMMER_H
2 #define STK_DRUMMER_H
3 
4 #include "Instrmnt.h"
5 #include "FileWvIn.h"
6 #include "OnePole.h"
7 
8 namespace stk {
9 
10 /***************************************************/
25 /***************************************************/
26 
27 const int DRUM_NUMWAVES = 11;
28 const int DRUM_POLYPHONY = 4;
29 
30 class Drummer : public Instrmnt
31 {
32  public:
34 
37  Drummer( void );
38 
40  ~Drummer( void );
41 
43 
49  void noteOn( StkFloat instrument, StkFloat amplitude );
50 
52  void noteOff( StkFloat amplitude );
53 
55  StkFloat tick( unsigned int channel = 0 );
56 
58 
65  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
66 
67  protected:
68 
69  FileWvIn waves_[DRUM_POLYPHONY];
70  OnePole filters_[DRUM_POLYPHONY];
71  std::vector<int> soundOrder_;
72  std::vector<int> soundNumber_;
73  int nSounding_;
74 };
75 
76 inline StkFloat Drummer :: tick( unsigned int )
77 {
78  lastFrame_[0] = 0.0;
79  if ( nSounding_ == 0 ) return lastFrame_[0];
80 
81  for ( int i=0; i<DRUM_POLYPHONY; i++ ) {
82  if ( soundOrder_[i] >= 0 ) {
83  if ( waves_[i].isFinished() ) {
84  // Re-order the list.
85  for ( int j=0; j<DRUM_POLYPHONY; j++ ) {
86  if ( soundOrder_[j] > soundOrder_[i] )
87  soundOrder_[j] -= 1;
88  }
89  soundOrder_[i] = -1;
90  nSounding_--;
91  }
92  else
93  lastFrame_[0] += filters_[i].tick( waves_[i].tick() );
94  }
95  }
96 
97  return lastFrame_[0];
98 }
99 
100 inline StkFrames& Drummer :: tick( StkFrames& frames, unsigned int channel )
101 {
102  unsigned int nChannels = lastFrame_.channels();
103 #if defined(_STK_DEBUG_)
104  if ( channel > frames.channels() - nChannels ) {
105  oStream_ << "Drummer::tick(): channel and StkFrames arguments are incompatible!";
106  handleError( StkError::FUNCTION_ARGUMENT );
107  }
108 #endif
109 
110  StkFloat *samples = &frames[channel];
111  unsigned int j, hop = frames.channels() - nChannels;
112  if ( nChannels == 1 ) {
113  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
114  *samples++ = tick();
115  }
116  else {
117  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
118  *samples++ = tick();
119  for ( j=1; j<nChannels; j++ )
120  *samples++ = lastFrame_[j];
121  }
122  }
123 
124  return frames;
125 }
126 
127 
128 } // stk namespace
129 
130 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/dynsections.js0000644000076600007660000000564712327015202014557 0ustar garyfunction toggleVisibility(linkObj) { var base = $(linkObj).attr('id'); var summary = $('#'+base+'-summary'); var content = $('#'+base+'-content'); var trigger = $('#'+base+'-trigger'); var src=$(trigger).attr('src'); if (content.is(':visible')===true) { content.hide(); summary.show(); $(linkObj).addClass('closed').removeClass('opened'); $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); } else { content.show(); summary.hide(); $(linkObj).removeClass('closed').addClass('opened'); $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); } return false; } function updateStripes() { $('table.directory tr'). removeClass('even').filter(':visible:even').addClass('even'); } function toggleLevel(level) { $('table.directory tr').each(function(){ var l = this.id.split('_').length-1; var i = $('#img'+this.id.substring(3)); var a = $('#arr'+this.id.substring(3)); if (l The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Echo.h
1 #ifndef STK_ECHO_H
2 #define STK_ECHO_H
3 
4 #include "Effect.h"
5 #include "Delay.h"
6 
7 namespace stk {
8 
9 /***************************************************/
17 /***************************************************/
18 
19 class Echo : public Effect
20 {
21  public:
23 
26  Echo( unsigned long maximumDelay = (unsigned long) Stk::sampleRate() );
27 
29  void clear();
30 
32  void setMaximumDelay( unsigned long delay );
33 
35  void setDelay( unsigned long delay );
36 
38  StkFloat lastOut( void ) const { return lastFrame_[0]; };
39 
41  StkFloat tick( StkFloat input );
42 
44 
52  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
53 
55 
63  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
64 
65  protected:
66 
67  Delay delayLine_;
68  unsigned long length_;
69 
70 };
71 
72 inline StkFloat Echo :: tick( StkFloat input )
73 {
74  lastFrame_[0] = effectMix_ * ( delayLine_.tick( input ) - input ) + input;
75  return lastFrame_[0];
76 }
77 
78 inline StkFrames& Echo :: tick( StkFrames& frames, unsigned int channel )
79 {
80 #if defined(_STK_DEBUG_)
81  if ( channel >= frames.channels() ) {
82  oStream_ << "Echo::tick(): channel and StkFrames arguments are incompatible!";
83  handleError( StkError::FUNCTION_ARGUMENT );
84  }
85 #endif
86 
87  StkFloat *samples = &frames[channel];
88  unsigned int hop = frames.channels();
89  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
90  *samples = effectMix_ * ( delayLine_.tick( *samples ) - *samples ) + *samples;
91  }
92 
93  lastFrame_[0] = *(samples-hop);
94  return frames;
95 }
96 
97 inline StkFrames& Echo :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
98 {
99 #if defined(_STK_DEBUG_)
100  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
101  oStream_ << "Echo::tick(): channel and StkFrames arguments are incompatible!";
102  handleError( StkError::FUNCTION_ARGUMENT );
103  }
104 #endif
105 
106  StkFloat *iSamples = &iFrames[iChannel];
107  StkFloat *oSamples = &oFrames[oChannel];
108  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
109  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
110  *oSamples = effectMix_ * ( delayLine_.tick( *iSamples ) - *iSamples ) + *iSamples;
111  }
112 
113  lastFrame_[0] = *(oSamples-oHop);
114  return iFrames;
115 }
116 
117 } // stk namespace
118 
119 #endif
120 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Effect_8h_source.html0000644000076600007660000003103012327015203015702 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Effect.h
1 #ifndef STK_EFFECT_H
2 #define STK_EFFECT_H
3 
4 #include "Stk.h"
5 #include <cmath>
6 
7 namespace stk {
8 
9 /***************************************************/
19 /***************************************************/
20 
21 class Effect : public Stk
22 {
23  public:
25  Effect( void ) { lastFrame_.resize( 1, 1, 0.0 ); };
26 
28  unsigned int channelsOut( void ) const { return lastFrame_.channels(); };
29 
31  const StkFrames& lastFrame( void ) const { return lastFrame_; };
32 
34  virtual void clear() = 0;
35 
37  virtual void setEffectMix( StkFloat mix );
38 
39  protected:
40 
41  // Returns true if argument value is prime.
42  bool isPrime( unsigned int number );
43 
44  StkFrames lastFrame_;
45  StkFloat effectMix_;
46 
47 };
48 
49 inline void Effect :: setEffectMix( StkFloat mix )
50 {
51  if ( mix < 0.0 ) {
52  oStream_ << "Effect::setEffectMix: mix parameter is less than zero ... setting to zero!";
53  handleError( StkError::WARNING );
54  effectMix_ = 0.0;
55  }
56  else if ( mix > 1.0 ) {
57  oStream_ << "Effect::setEffectMix: mix parameter is greater than 1.0 ... setting to one!";
58  handleError( StkError::WARNING );
59  effectMix_ = 1.0;
60  }
61  else
62  effectMix_ = mix;
63 }
64 
65 inline bool Effect :: isPrime( unsigned int number )
66 {
67  if ( number == 2 ) return true;
68  if ( number & 1 ) {
69  for ( int i=3; i<(int)sqrt((double)number)+1; i+=2 )
70  if ( (number % i) == 0 ) return false;
71  return true; // prime
72  }
73  else return false; // even
74 }
75 
76 } // stk namespace
77 
78 #endif
79 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Envelope_8h_source.html0000644000076600007660000004242412327015203016274 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Envelope.h
1 #ifndef STK_ENVELOPE_H
2 #define STK_ENVELOPE_H
3 
4 #include "Generator.h"
5 
6 namespace stk {
7 
8 /***************************************************/
19 /***************************************************/
20 
21 class Envelope : public Generator
22 {
23  public:
24 
26  Envelope( void );
27 
29  ~Envelope( void );
30 
32  Envelope& operator= ( const Envelope& e );
33 
35  void keyOn( void ) { this->setTarget( 1.0 ); };
36 
38  void keyOff( void ) { this->setTarget( 0.0 ); };
39 
41 
44  void setRate( StkFloat rate );
45 
47 
51  void setTime( StkFloat time );
52 
54  void setTarget( StkFloat target );
55 
57  void setValue( StkFloat value );
58 
60  int getState( void ) const { return state_; };
61 
63  StkFloat lastOut( void ) const { return lastFrame_[0]; };
64 
66  StkFloat tick( void );
67 
69 
76  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
77 
78  protected:
79 
80  void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
81 
82  StkFloat value_;
83  StkFloat target_;
84  StkFloat rate_;
85  int state_;
86 };
87 
88 inline StkFloat Envelope :: tick( void )
89 {
90  if ( state_ ) {
91  if ( target_ > value_ ) {
92  value_ += rate_;
93  if ( value_ >= target_ ) {
94  value_ = target_;
95  state_ = 0;
96  }
97  }
98  else {
99  value_ -= rate_;
100  if ( value_ <= target_ ) {
101  value_ = target_;
102  state_ = 0;
103  }
104  }
105  lastFrame_[0] = value_;
106  }
107 
108  return value_;
109 }
110 
111 inline StkFrames& Envelope :: tick( StkFrames& frames, unsigned int channel )
112 {
113 #if defined(_STK_DEBUG_)
114  if ( channel >= frames.channels() ) {
115  oStream_ << "Envelope::tick(): channel and StkFrames arguments are incompatible!";
116  handleError( StkError::FUNCTION_ARGUMENT );
117  }
118 #endif
119 
120  StkFloat *samples = &frames[channel];
121  unsigned int hop = frames.channels();
122  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
123  *samples = tick();
124 
125  return frames;
126 }
127 
128 } // stk namespace
129 
130 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/faq.html0000644000076600007660000001510312327015204013302 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Frequently Asked Questions

Does STK have a license?

Yes, we finally made something official for release 4.3.0. It is listed in the Stk class and a few other places in the distribution, but I'll repeat it here for clarity:

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.  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.

STK WWW site: http://ccrma.stanford.edu/software/stk/

The Synthesis ToolKit in C++ (STK)
Copyright (c) 1995--2014 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
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

Any person wishing to distribute modifications to the Software is
asked to send the modifications to the original developer so that they
can be incorporated into the canonical version.  This is, however, not
a binding provision of this license.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Why is my file sample rate wrong?

When the FileWvIn class loads a soundfile, it automatically sets its internal read increment based on the soundfile rate and the current STK sample rate. For example, if the current STK sample rate is 44100 Hz and the soundfile rate is 22050 Hz, the read increment, or rate, will be set to 0.5 and the file will be interpolated so that is sounds correct at 44100 Hz. For most cases, this works fine. However, consider the following example:

FileWvIn input( "infile" ); // read an input soundfile
StkFloat sampleRate = input.getFileRate();
Stk::setSampleRate( sampleRate ); // set a new STK sample rate based on the file rate

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 ignoreSampleRateChange() function for a given class instance.

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 must define the __LITTLE_ENDIAN__ preprocessor definition before compiling. If after reading this you realize you need to make this change, do not forget to recompile all STK classes from scratch.

Why do I get a Tk display error message?

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:

Application initialization failed: this isn't a Tk applicationcouldn't connect to display ":0.0"

Simply start your X server and then try the command again.


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/FileLoop_8h_source.html0000644000076600007660000004076712327015203016240 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


FileLoop.h
1 #ifndef STK_FILELOOP_H
2 #define STK_FILELOOP_H
3 
4 #include "FileWvIn.h"
5 
6 namespace stk {
7 
8 /***************************************************/
24 /***************************************************/
25 
26 class FileLoop : protected FileWvIn
27 {
28  public:
30  FileLoop( unsigned long chunkThreshold = 1000000, unsigned long chunkSize = 1024 );
31 
33  FileLoop( std::string fileName, bool raw = false, bool doNormalize = true,
34  unsigned long chunkThreshold = 1000000, unsigned long chunkSize = 1024 );
35 
37  ~FileLoop( void );
38 
40 
49  void openFile( std::string fileName, bool raw = false, bool doNormalize = true );
50 
52  void closeFile( void ) { FileWvIn::closeFile(); };
53 
55  void reset( void ) { FileWvIn::reset(); };
56 
58  unsigned int channelsOut( void ) const { return data_.channels(); };
59 
61 
65  void normalize( void ) { FileWvIn::normalize( 1.0 ); };
66 
68 
72  void normalize( StkFloat peak ) { FileWvIn::normalize( peak ); };
73 
75  unsigned long getSize( void ) const { return data_.frames(); };
76 
78 
83  StkFloat getFileRate( void ) const { return data_.dataRate(); };
84 
86 
89  void setRate( StkFloat rate );
90 
92 
98  void setFrequency( StkFloat frequency ) { this->setRate( file_.fileSize() * frequency / Stk::sampleRate() ); };
99 
101  void addTime( StkFloat time );
102 
104 
109  void addPhase( StkFloat angle );
110 
112 
117  void addPhaseOffset( StkFloat angle );
118 
120 
129  StkFloat lastOut( unsigned int channel = 0 ) { return FileWvIn::lastOut( channel ); };
130 
132 
141  StkFloat tick( unsigned int channel = 0 );
142 
144 
153  StkFrames& tick( StkFrames& frames );
154 
155  protected:
156 
157  StkFrames firstFrame_;
158  StkFloat phaseOffset_;
159 
160 };
161 
162 } // stk namespace
163 
164 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/FileRead_8h_source.html0000644000076600007660000003506612327015203016176 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


FileRead.h
1 #ifndef STK_FILEREAD_H
2 #define STK_FILEREAD_H
3 
4 #include "Stk.h"
5 
6 namespace stk {
7 
8 /***************************************************/
39 /***************************************************/
40 
41 class FileRead : public Stk
42 {
43 public:
45  FileRead( void );
46 
48 
54  FileRead( std::string fileName, bool typeRaw = false, unsigned int nChannels = 1,
55  StkFormat format = STK_SINT16, StkFloat rate = 22050.0 );
56 
58  ~FileRead( void );
59 
61 
67  void open( std::string fileName, bool typeRaw = false, unsigned int nChannels = 1,
68  StkFormat format = STK_SINT16, StkFloat rate = 22050.0 );
69 
71  void close( void );
72 
74  bool isOpen( void );
75 
77  unsigned long fileSize( void ) const { return fileSize_; };
78 
80  unsigned int channels( void ) const { return channels_; };
81 
83  StkFormat format( void ) const { return dataType_; };
84 
86 
91  StkFloat fileRate( void ) const { return fileRate_; };
92 
94 
106  void read( StkFrames& buffer, unsigned long startFrame = 0, bool doNormalize = true );
107 
108 protected:
109 
110  // Get STK RAW file information.
111  bool getRawInfo( const char *fileName, unsigned int nChannels,
112  StkFormat format, StkFloat rate );
113 
114  // Get WAV file header information.
115  bool getWavInfo( const char *fileName );
116 
117  // Get SND (AU) file header information.
118  bool getSndInfo( const char *fileName );
119 
120  // Get AIFF file header information.
121  bool getAifInfo( const char *fileName );
122 
123  // Get MAT-file header information.
124  bool getMatInfo( const char *fileName );
125 
126  // Helper function for MAT-file parsing.
127  bool findNextMatArray( SINT32 *chunkSize, SINT32 *rows, SINT32 *columns, SINT32 *nametype );
128 
129  FILE *fd_;
130  bool byteswap_;
131  bool wavFile_;
132  unsigned long fileSize_;
133  unsigned long dataOffset_;
134  unsigned int channels_;
135  StkFormat dataType_;
136  StkFloat fileRate_;
137 };
138 
139 } // stk namespace
140 
141 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/files.html0000644000076600007660000006233612327015206013651 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


File List
Here is a list of all documented files with brief descriptions:
o*ADSR.h
o*Asymp.h
o*BandedWG.h
o*BeeThree.h
o*BiQuad.h
o*Blit.h
o*BlitSaw.h
o*BlitSquare.h
o*BlowBotl.h
o*BlowHole.h
o*Bowed.h
o*BowTable.h
o*Brass.h
o*Chorus.h
o*Clarinet.h
o*Cubic.h
o*Delay.h
o*DelayA.h
o*DelayL.h
o*Drummer.h
o*Echo.h
o*Effect.h
o*Envelope.h
o*FileLoop.h
o*FileRead.h
o*FileWrite.h
o*FileWvIn.h
o*FileWvOut.h
o*Filter.h
o*Fir.h
o*Flute.h
o*FM.h
o*FMVoices.h
o*FormSwep.h
o*FreeVerb.h
o*Function.h
o*Generator.h
o*Granulate.h
o*Guitar.h
o*HevyMetl.h
o*Iir.h
o*InetWvIn.h
o*InetWvOut.h
o*Instrmnt.h
o*JCRev.h
o*JetTable.h
o*LentPitShift.h
o*Mandolin.h
o*Mesh2D.h
o*Messager.h
o*MidiFileIn.h
o*Modal.h
o*ModalBar.h
o*Modulate.h
o*Moog.h
o*Mutex.h
o*Noise.h
o*NRev.h
o*OnePole.h
o*OneZero.h
o*PercFlut.h
o*Phonemes.h
o*PitShift.h
o*Plucked.h
o*PoleZero.h
o*PRCRev.h
o*ReedTable.h
o*Resonate.h
o*Rhodey.h
o*RtAudio.h
o*RtMidi.h
o*RtWvIn.h
o*RtWvOut.h
o*Sampler.h
o*Saxofony.h
o*Shakers.h
o*Simple.h
o*SineWave.h
o*SingWave.h
o*Sitar.h
o*Skini.h
o*Socket.h
o*Sphere.h
o*StifKarp.h
o*Stk.h
o*TapDelay.h
o*TcpClient.h
o*TcpServer.h
o*Thread.h
o*TubeBell.h
o*Twang.h
o*TwoPole.h
o*TwoZero.h
o*UdpSocket.h
o*Vector3D.h
o*Voicer.h
o*VoicForm.h
o*Whistle.h
o*Wurley.h
o*WvIn.h
\*WvOut.h

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/FileWrite_8h_source.html0000644000076600007660000003444612327015203016416 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


FileWrite.h
1 #ifndef STK_FILEWRITE_H
2 #define STK_FILEWRITE_H
3 
4 #include "Stk.h"
5 
6 namespace stk {
7 
8 /***************************************************/
29 /***************************************************/
30 
31 class FileWrite : public Stk
32 {
33  public:
34 
35  typedef unsigned long FILE_TYPE;
36 
37  static const FILE_TYPE FILE_RAW;
38  static const FILE_TYPE FILE_WAV;
39  static const FILE_TYPE FILE_SND;
40  static const FILE_TYPE FILE_AIF;
41  static const FILE_TYPE FILE_MAT;
43 
44  FileWrite( void );
45 
47 
50  FileWrite( std::string fileName, unsigned int nChannels = 1, FILE_TYPE type = FILE_WAV, Stk::StkFormat format = STK_SINT16 );
51 
53  virtual ~FileWrite();
54 
56 
59  void open( std::string fileName, unsigned int nChannels = 1,
60  FileWrite::FILE_TYPE type = FILE_WAV, Stk::StkFormat format = STK_SINT16 );
61 
63  void close( void );
64 
66  bool isOpen( void );
67 
69 
74  void write( StkFrames& buffer );
75 
76  protected:
77 
78  // Write STK RAW file header.
79  bool setRawFile( std::string fileName );
80 
81  // Write WAV file header.
82  bool setWavFile( std::string fileName );
83 
84  // Close WAV file, updating the header.
85  void closeWavFile( void );
86 
87  // Write SND (AU) file header.
88  bool setSndFile( std::string fileName );
89 
90  // Close SND file, updating the header.
91  void closeSndFile( void );
92 
93  // Write AIFF file header.
94  bool setAifFile( std::string fileName );
95 
96  // Close AIFF file, updating the header.
97  void closeAifFile( void );
98 
99  // Write MAT-file header.
100  bool setMatFile( std::string fileName );
101 
102  // Close MAT-file, updating the header.
103  void closeMatFile( void );
104 
105  FILE *fd_;
106  FILE_TYPE fileType_;
107  StkFormat dataType_;
108  unsigned int channels_;
109  unsigned long frameCounter_;
110  bool byteswap_;
111 
112 };
113 
114 } // stk namespace
115 
116 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/FileWvIn_8h_source.html0000644000076600007660000004513412327015203016203 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


FileWvIn.h
1 #ifndef STK_FILEWVIN_H
2 #define STK_FILEWVIN_H
3 
4 #include "WvIn.h"
5 #include "FileRead.h"
6 
7 namespace stk {
8 
9 /***************************************************/
40 /***************************************************/
41 
42 class FileWvIn : public WvIn
43 {
44 public:
46  FileWvIn( unsigned long chunkThreshold = 1000000, unsigned long chunkSize = 1024 );
47 
49 
53  FileWvIn( std::string fileName, bool raw = false, bool doNormalize = true,
54  unsigned long chunkThreshold = 1000000, unsigned long chunkSize = 1024 );
55 
57  ~FileWvIn( void );
58 
60 
69  virtual void openFile( std::string fileName, bool raw = false, bool doNormalize = true );
70 
72  virtual void closeFile( void );
73 
75  virtual void reset( void );
76 
78 
82  virtual void normalize( void );
83 
85 
89  virtual void normalize( StkFloat peak );
90 
92  virtual unsigned long getSize( void ) const { return file_.fileSize(); };
93 
95 
100  virtual StkFloat getFileRate( void ) const { return data_.dataRate(); };
101 
103  bool isOpen( void ) { return file_.isOpen(); };
104 
106  bool isFinished( void ) const { return finished_; };
107 
109 
112  virtual void setRate( StkFloat rate );
113 
115 
118  virtual void addTime( StkFloat time );
119 
121 
127  void setInterpolate( bool doInterpolate ) { interpolate_ = doInterpolate; };
128 
130 
139  StkFloat lastOut( unsigned int channel = 0 );
140 
142 
151  virtual StkFloat tick( unsigned int channel = 0 );
152 
154 
162  virtual StkFrames& tick( StkFrames& frames );
163 
164 protected:
165 
166  void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
167 
168  FileRead file_;
169  bool finished_;
170  bool interpolate_;
171  bool normalizing_;
172  bool chunking_;
173  StkFloat time_;
174  StkFloat rate_;
175  unsigned long chunkThreshold_;
176  unsigned long chunkSize_;
177  long chunkPointer_;
178 
179 };
180 
181 inline StkFloat FileWvIn :: lastOut( unsigned int channel )
182 {
183 #if defined(_STK_DEBUG_)
184  if ( channel >= data_.channels() ) {
185  oStream_ << "FileWvIn::lastOut(): channel argument and soundfile data are incompatible!";
186  handleError( StkError::FUNCTION_ARGUMENT );
187  }
188 #endif
189 
190  if ( finished_ ) return 0.0;
191  return lastFrame_[channel];
192 }
193 
194 } // stk namespace
195 
196 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/FileWvOut_8h_source.html0000644000076600007660000002361212327015203016401 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


FileWvOut.h
1 #ifndef STK_FILEWVOUT_H
2 #define STK_FILEWVOUT_H
3 
4 #include "WvOut.h"
5 #include "FileWrite.h"
6 
7 namespace stk {
8 
9 /***************************************************/
30 /***************************************************/
31 
32 class FileWvOut : public WvOut
33 {
34  public:
35 
37 
41  FileWvOut( unsigned int bufferFrames = 1024 );
42 
44 
47  FileWvOut( std::string fileName,
48  unsigned int nChannels = 1,
49  FileWrite::FILE_TYPE type = FileWrite::FILE_WAV,
50  Stk::StkFormat format = STK_SINT16,
51  unsigned int bufferFrames = 1024 );
52 
54  virtual ~FileWvOut();
55 
57 
62  void openFile( std::string fileName,
63  unsigned int nChannels,
64  FileWrite::FILE_TYPE type,
65  Stk::StkFormat format );
66 
68 
72  void closeFile( void );
73 
75 
78  void tick( const StkFloat sample );
79 
81 
87  void tick( const StkFrames& frames );
88 
89  protected:
90 
91  void incrementFrame( void );
92 
93  FileWrite file_;
94  unsigned int bufferFrames_;
95  unsigned int bufferIndex_;
96  unsigned int iData_;
97 
98 };
99 
100 } // stk namespace
101 
102 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Filter_8h_source.html0000644000076600007660000004265712327015203015754 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Filter.h
1 #ifndef STK_FILTER_H
2 #define STK_FILTER_H
3 
4 #include "Stk.h"
5 #include <vector>
6 #include <cmath>
7 
8 namespace stk {
9 
10 /***************************************************/
20 /***************************************************/
21 
22 class Filter : public Stk
23 {
24 public:
26  Filter( void ) { gain_ = 1.0; channelsIn_ = 1; lastFrame_.resize( 1, 1, 0.0 ); };
27 
29  unsigned int channelsIn( void ) const { return channelsIn_; };
30 
32  unsigned int channelsOut( void ) const { return lastFrame_.channels(); };
33 
35  virtual void clear( void );
36 
38 
42  void setGain( StkFloat gain ) { gain_ = gain; };
43 
45  StkFloat getGain( void ) const { return gain_; };
46 
48 
53  StkFloat phaseDelay( StkFloat frequency );
54 
56  const StkFrames& lastFrame( void ) const { return lastFrame_; };
57 
59 
67  virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0;
68 
69 protected:
70 
71  StkFloat gain_;
72  unsigned int channelsIn_;
73  StkFrames lastFrame_;
74 
75  std::vector<StkFloat> b_;
76  std::vector<StkFloat> a_;
77  StkFrames outputs_;
78  StkFrames inputs_;
79 
80 };
81 
82 inline void Filter :: clear( void )
83 {
84  unsigned int i;
85  for ( i=0; i<inputs_.size(); i++ )
86  inputs_[i] = 0.0;
87  for ( i=0; i<outputs_.size(); i++ )
88  outputs_[i] = 0.0;
89  for ( i=0; i<lastFrame_.size(); i++ )
90  lastFrame_[i] = 0.0;
91 }
92 
93 inline StkFloat Filter :: phaseDelay( StkFloat frequency )
94 {
95  if ( frequency <= 0.0 || frequency > 0.5 * Stk::sampleRate() ) {
96  oStream_ << "Filter::phaseDelay: argument (" << frequency << ") is out of range!";
97  handleError( StkError::WARNING ); return 0.0;
98  }
99 
100  StkFloat omegaT = 2 * PI * frequency / Stk::sampleRate();
101  StkFloat real = 0.0, imag = 0.0;
102  for ( unsigned int i=0; i<b_.size(); i++ ) {
103  real += b_[i] * std::cos( i * omegaT );
104  imag -= b_[i] * std::sin( i * omegaT );
105  }
106  real *= gain_;
107  imag *= gain_;
108 
109  StkFloat phase = atan2( imag, real );
110 
111  real = 0.0, imag = 0.0;
112  for ( unsigned int i=0; i<a_.size(); i++ ) {
113  real += a_[i] * std::cos( i * omegaT );
114  imag -= a_[i] * std::sin( i * omegaT );
115  }
116 
117  phase -= std::atan2( imag, real );
118  phase = std::fmod( -phase, 2 * PI );
119  return phase / omegaT;
120 }
121 
122 } // stk namespace
123 
124 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/filtering.html0000644000076600007660000002576212327015204014532 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Using Filters

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 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.

#include "Iir.h"
using namespace stk;
int main()
{
StkFrames output( 20, 1 ); // initialize StkFrames to 20 frames and 1 channel (default: interleaved)
output[0] = 1.0;
std::vector<StkFloat> numerator( 5, 0.1 ); // create and initialize numerator coefficients
std::vector<StkFloat> denominator; // create empty denominator coefficients
denominator.push_back( 1.0 ); // populate our denomintor values
denominator.push_back( 0.3 );
denominator.push_back( -0.5 );
Iir filter( numerator, denominator );
filter.tick( output );
for ( unsigned int i=0; i<output.size(); i++ ) {
std::cout << "i = " << i << " : output = " << output[i] << std::endl;
}
return 0;
}

The stk::Iir class implements the standard difference equation

a[0]*y[n] = b[0]*x[n] + ... + b[nb]*x[n-nb] - a[1]*y[n-1] - ... - a[na]*y[n-na],

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++ vector, a container object provided by the C++ Standard Library.

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.

Resonances:

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.

#include "BiQuad.h"
#include "Noise.h"
using namespace stk;
int main()
{
StkFrames output( 20, 1 ); // initialize StkFrames to 20 frames and 1 channel (default: interleaved)
Noise noise;
BiQuad biquad;
biquad.setResonance( 440.0, 0.98, true ); // automatically normalize for unity peak gain
for ( unsigned int i=0; i<output.size(); i++ ) {
output[i] = biquad.tick( noise.tick() ); // single-sample computations
std::cout << "i = " << i << " : output = " << output[i] << std::endl;
}
return 0;
}

By passing a boolian value of 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:

#include "BiQuad.h"
#include "Noise.h"
using namespace stk;
int main()
{
StkFrames output( 20, 1 ); // initialize StkFrames to 20 frames and 1 channel (default: interleaved)
Noise noise;
BiQuad biquad;
biquad.setResonance( 440.0, 0.98, true ); // automatically normalize for unity peak gain
biquad.tick( noise.tick( output ) ); // vector-based computations
for ( unsigned int i=0; i<output.size(); i++ ) {
std::cout << "i = " << i << " : output = " << output[i] << std::endl;
}
return 0;
}

[Main tutorial page]   [Next tutorial]


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Fir_8h_source.html0000644000076600007660000004757612327015203015254 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Fir.h
1 #ifndef STK_FIR_H
2 #define STK_FIR_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
28 /***************************************************/
29 
30 class Fir : public Filter
31 {
32 public:
34  Fir( void );
35 
37 
41  Fir( std::vector<StkFloat> &coefficients );
42 
44  ~Fir( void );
45 
47 
52  void setCoefficients( std::vector<StkFloat> &coefficients, bool clearState = false );
53 
55  StkFloat lastOut( void ) const { return lastFrame_[0]; };
56 
58  StkFloat tick( StkFloat input );
59 
61 
69  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
70 
72 
80  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
81 
82 protected:
83 
84 };
85 
86 inline StkFloat Fir :: tick( StkFloat input )
87 {
88  lastFrame_[0] = 0.0;
89  inputs_[0] = gain_ * input;
90 
91  for ( unsigned int i=(unsigned int)(b_.size())-1; i>0; i-- ) {
92  lastFrame_[0] += b_[i] * inputs_[i];
93  inputs_[i] = inputs_[i-1];
94  }
95  lastFrame_[0] += b_[0] * inputs_[0];
96 
97  return lastFrame_[0];
98 }
99 
100 inline StkFrames& Fir :: tick( StkFrames& frames, unsigned int channel )
101 {
102 #if defined(_STK_DEBUG_)
103  if ( channel >= frames.channels() ) {
104  oStream_ << "Fir::tick(): channel and StkFrames arguments are incompatible!";
105  handleError( StkError::FUNCTION_ARGUMENT );
106  }
107 #endif
108 
109  StkFloat *samples = &frames[channel];
110  unsigned int i, hop = frames.channels();
111  for ( unsigned int j=0; j<frames.frames(); j++, samples += hop ) {
112  inputs_[0] = gain_ * *samples;
113  *samples = 0.0;
114 
115  for ( i=(unsigned int)b_.size()-1; i>0; i-- ) {
116  *samples += b_[i] * inputs_[i];
117  inputs_[i] = inputs_[i-1];
118  }
119  *samples += b_[0] * inputs_[0];
120  }
121 
122  lastFrame_[0] = *(samples-hop);
123  return frames;
124 }
125 
126 inline StkFrames& Fir :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
127 {
128 #if defined(_STK_DEBUG_)
129  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
130  oStream_ << "Fir::tick(): channel and StkFrames arguments are incompatible!";
131  handleError( StkError::FUNCTION_ARGUMENT );
132  }
133 #endif
134 
135  StkFloat *iSamples = &iFrames[iChannel];
136  StkFloat *oSamples = &oFrames[oChannel];
137  unsigned int i, iHop = iFrames.channels(), oHop = oFrames.channels();
138  for ( unsigned int j=0; j<iFrames.frames(); j++, iSamples += iHop, oSamples += oHop ) {
139  inputs_[0] = gain_ * *iSamples;
140  *oSamples = 0.0;
141 
142  for ( i=(unsigned int)b_.size()-1; i>0; i-- ) {
143  *oSamples += b_[i] * inputs_[i];
144  inputs_[i] = inputs_[i-1];
145  }
146  *oSamples += b_[0] * inputs_[0];
147  }
148 
149  lastFrame_[0] = *(oSamples-oHop);
150  return iFrames;
151 }
152 
153 } // stk namespace
154 
155 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Flute_8h_source.html0000644000076600007660000005614112327015203015577 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Flute.h
1 #ifndef STK_FLUTE_H
2 #define STK_FLUTE_H
3 
4 #include "Instrmnt.h"
5 #include "JetTable.h"
6 #include "DelayL.h"
7 #include "OnePole.h"
8 #include "PoleZero.h"
9 #include "Noise.h"
10 #include "ADSR.h"
11 #include "SineWave.h"
12 
13 namespace stk {
14 
15 /***************************************************/
37 /***************************************************/
38 
39 class Flute : public Instrmnt
40 {
41  public:
43 
46  Flute( StkFloat lowestFrequency );
47 
49  ~Flute( void );
50 
52  void clear( void );
53 
55  void setFrequency( StkFloat frequency );
56 
58  void setJetReflection( StkFloat coefficient ) { jetReflection_ = coefficient; };
59 
61  void setEndReflection( StkFloat coefficient ) { endReflection_ = coefficient; };
62 
64  void setJetDelay( StkFloat aRatio );
65 
67  void startBlowing( StkFloat amplitude, StkFloat rate );
68 
70  void stopBlowing( StkFloat rate );
71 
73  void noteOn( StkFloat frequency, StkFloat amplitude );
74 
76  void noteOff( StkFloat amplitude );
77 
79  void controlChange( int number, StkFloat value );
80 
82  StkFloat tick( unsigned int channel = 0 );
83 
85 
92  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
93 
94  protected:
95 
96  DelayL jetDelay_;
97  DelayL boreDelay_;
98  JetTable jetTable_;
99  OnePole filter_;
100  PoleZero dcBlock_;
101  Noise noise_;
102  ADSR adsr_;
103  SineWave vibrato_;
104 
105  StkFloat lastFrequency_;
106  StkFloat maxPressure_;
107  StkFloat jetReflection_;
108  StkFloat endReflection_;
109  StkFloat noiseGain_;
110  StkFloat vibratoGain_;
111  StkFloat outputGain_;
112  StkFloat jetRatio_;
113 
114 };
115 
116 inline StkFloat Flute :: tick( unsigned int )
117 {
118  StkFloat pressureDiff;
119  StkFloat breathPressure;
120 
121  // Calculate the breath pressure (envelope + noise + vibrato)
122  breathPressure = maxPressure_ * adsr_.tick();
123  breathPressure += breathPressure * ( noiseGain_ * noise_.tick() + vibratoGain_ * vibrato_.tick() );
124 
125  StkFloat temp = -filter_.tick( boreDelay_.lastOut() );
126  temp = dcBlock_.tick( temp ); // Block DC on reflection.
127 
128  pressureDiff = breathPressure - (jetReflection_ * temp);
129  pressureDiff = jetDelay_.tick( pressureDiff );
130  pressureDiff = jetTable_.tick( pressureDiff ) + (endReflection_ * temp);
131  lastFrame_[0] = (StkFloat) 0.3 * boreDelay_.tick( pressureDiff );
132 
133  lastFrame_[0] *= outputGain_;
134  return lastFrame_[0];
135 }
136 
137 inline StkFrames& Flute :: tick( StkFrames& frames, unsigned int channel )
138 {
139  unsigned int nChannels = lastFrame_.channels();
140 #if defined(_STK_DEBUG_)
141  if ( channel > frames.channels() - nChannels ) {
142  oStream_ << "Flute::tick(): channel and StkFrames arguments are incompatible!";
143  handleError( StkError::FUNCTION_ARGUMENT );
144  }
145 #endif
146 
147  StkFloat *samples = &frames[channel];
148  unsigned int j, hop = frames.channels() - nChannels;
149  if ( nChannels == 1 ) {
150  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
151  *samples++ = tick();
152  }
153  else {
154  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
155  *samples++ = tick();
156  for ( j=1; j<nChannels; j++ )
157  *samples++ = lastFrame_[j];
158  }
159  }
160 
161  return frames;
162 }
163 
164 } // stk namespace
165 
166 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/FM_8h_source.html0000644000076600007660000003355012327015203015021 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


FM.h
1 #ifndef STK_FM_H
2 #define STK_FM_H
3 
4 #include "Instrmnt.h"
5 #include "ADSR.h"
6 #include "FileLoop.h"
7 #include "SineWave.h"
8 #include "TwoZero.h"
9 
10 namespace stk {
11 
12 /***************************************************/
35 /***************************************************/
36 
37 class FM : public Instrmnt
38 {
39  public:
41 
44  FM( unsigned int operators = 4 );
45 
47  virtual ~FM( void );
48 
50  void loadWaves( const char **filenames );
51 
53  virtual void setFrequency( StkFloat frequency );
54 
56  void setRatio( unsigned int waveIndex, StkFloat ratio );
57 
59  void setGain( unsigned int waveIndex, StkFloat gain );
60 
62  void setModulationSpeed( StkFloat mSpeed ) { vibrato_.setFrequency( mSpeed ); };
63 
65  void setModulationDepth( StkFloat mDepth ) { modDepth_ = mDepth; };
66 
68  void setControl1( StkFloat cVal ) { control1_ = cVal * 2.0; };
69 
71  void setControl2( StkFloat cVal ) { control2_ = cVal * 2.0; };
72 
74  void keyOn( void );
75 
77  void keyOff( void );
78 
80  void noteOff( StkFloat amplitude );
81 
83  virtual void controlChange( int number, StkFloat value );
84 
86  virtual StkFloat tick( unsigned int ) = 0;
87 
89 
96  virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0;
97 
98  protected:
99 
100  std::vector<ADSR *> adsr_;
101  std::vector<FileLoop *> waves_;
102  SineWave vibrato_;
103  TwoZero twozero_;
104  unsigned int nOperators_;
105  StkFloat baseFrequency_;
106  std::vector<StkFloat> ratios_;
107  std::vector<StkFloat> gains_;
108  StkFloat modDepth_;
109  StkFloat control1_;
110  StkFloat control2_;
111  StkFloat fmGains_[100];
112  StkFloat fmSusLevels_[16];
113  StkFloat fmAttTimes_[32];
114 
115 };
116 
117 } // stk namespace
118 
119 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/FMVoices_8h_source.html0000644000076600007660000004114212327015203016166 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


FMVoices.h
1 #ifndef STK_FMVOICES_H
2 #define STK_FMVOICES_H
3 
4 #include "FM.h"
5 
6 namespace stk {
7 
8 /***************************************************/
38 /***************************************************/
39 
40 class FMVoices : public FM
41 {
42  public:
44 
47  FMVoices( void );
48 
50  ~FMVoices( void );
51 
53  void setFrequency( StkFloat frequency );
54 
56  void noteOn( StkFloat frequency, StkFloat amplitude );
57 
59  void controlChange( int number, StkFloat value );
60 
62  StkFloat tick( unsigned int channel = 0 );
63 
65 
72  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
73 
74  protected:
75 
76  int currentVowel_;
77  StkFloat tilt_[3];
78  StkFloat mods_[3];
79 };
80 
81 inline StkFloat FMVoices :: tick( unsigned int )
82 {
83  StkFloat temp, temp2;
84 
85  temp = gains_[3] * adsr_[3]->tick() * waves_[3]->tick();
86  temp2 = vibrato_.tick() * modDepth_ * 0.1;
87 
88  waves_[0]->setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[0]);
89  waves_[1]->setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[1]);
90  waves_[2]->setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[2]);
91  waves_[3]->setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[3]);
92 
93  waves_[0]->addPhaseOffset(temp * mods_[0]);
94  waves_[1]->addPhaseOffset(temp * mods_[1]);
95  waves_[2]->addPhaseOffset(temp * mods_[2]);
96  waves_[3]->addPhaseOffset( twozero_.lastOut() );
97  twozero_.tick( temp );
98  temp = gains_[0] * tilt_[0] * adsr_[0]->tick() * waves_[0]->tick();
99  temp += gains_[1] * tilt_[1] * adsr_[1]->tick() * waves_[1]->tick();
100  temp += gains_[2] * tilt_[2] * adsr_[2]->tick() * waves_[2]->tick();
101 
102  lastFrame_[0] = temp * 0.33;
103  return lastFrame_[0];
104 }
105 
106 inline StkFrames& FMVoices :: tick( StkFrames& frames, unsigned int channel )
107 {
108  unsigned int nChannels = lastFrame_.channels();
109 #if defined(_STK_DEBUG_)
110  if ( channel > frames.channels() - nChannels ) {
111  oStream_ << "FMVoices::tick(): channel and StkFrames arguments are incompatible!";
112  handleError( StkError::FUNCTION_ARGUMENT );
113  }
114 #endif
115 
116  StkFloat *samples = &frames[channel];
117  unsigned int j, hop = frames.channels() - nChannels;
118  if ( nChannels == 1 ) {
119  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
120  *samples++ = tick();
121  }
122  else {
123  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
124  *samples++ = tick();
125  for ( j=1; j<nChannels; j++ )
126  *samples++ = lastFrame_[j];
127  }
128  }
129 
130  return frames;
131 }
132 
133 } // stk namespace
134 
135 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/FormSwep_8h_source.html0000644000076600007660000006003712327015203016261 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


FormSwep.h
1 #ifndef STK_FORMSWEP_H
2 #define STK_FORMSWEP_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
18 /***************************************************/
19 
20 class FormSwep : public Filter
21 {
22  public:
23 
25  FormSwep( void );
26 
28  ~FormSwep();
29 
31  void ignoreSampleRateChange( bool ignore = true ) { ignoreSampleRateChange_ = ignore; };
32 
34 
47  void setResonance( StkFloat frequency, StkFloat radius );
48 
50  void setStates( StkFloat frequency, StkFloat radius, StkFloat gain = 1.0 );
51 
53  void setTargets( StkFloat frequency, StkFloat radius, StkFloat gain = 1.0 );
54 
56 
64  void setSweepRate( StkFloat rate );
65 
67 
72  void setSweepTime( StkFloat time );
73 
75  StkFloat lastOut( void ) const { return lastFrame_[0]; };
76 
78  StkFloat tick( StkFloat input );
79 
81 
89  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
90 
92 
100  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
101 
102  protected:
103 
104  virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
105 
106  bool dirty_;
107  StkFloat frequency_;
108  StkFloat radius_;
109  StkFloat startFrequency_;
110  StkFloat startRadius_;
111  StkFloat startGain_;
112  StkFloat targetFrequency_;
113  StkFloat targetRadius_;
114  StkFloat targetGain_;
115  StkFloat deltaFrequency_;
116  StkFloat deltaRadius_;
117  StkFloat deltaGain_;
118  StkFloat sweepState_;
119  StkFloat sweepRate_;
120 
121 };
122 
123 inline StkFloat FormSwep :: tick( StkFloat input )
124 {
125  if ( dirty_ ) {
126  sweepState_ += sweepRate_;
127  if ( sweepState_ >= 1.0 ) {
128  sweepState_ = 1.0;
129  dirty_ = false;
130  radius_ = targetRadius_;
131  frequency_ = targetFrequency_;
132  gain_ = targetGain_;
133  }
134  else {
135  radius_ = startRadius_ + (deltaRadius_ * sweepState_);
136  frequency_ = startFrequency_ + (deltaFrequency_ * sweepState_);
137  gain_ = startGain_ + (deltaGain_ * sweepState_);
138  }
139  this->setResonance( frequency_, radius_ );
140  }
141 
142  inputs_[0] = gain_ * input;
143  lastFrame_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2];
144  lastFrame_[0] -= a_[2] * outputs_[2] + a_[1] * outputs_[1];
145  inputs_[2] = inputs_[1];
146  inputs_[1] = inputs_[0];
147  outputs_[2] = outputs_[1];
148  outputs_[1] = lastFrame_[0];
149 
150  return lastFrame_[0];
151 }
152 
153 inline StkFrames& FormSwep :: tick( StkFrames& frames, unsigned int channel )
154 {
155 #if defined(_STK_DEBUG_)
156  if ( channel >= frames.channels() ) {
157  oStream_ << "FormSwep::tick(): channel and StkFrames arguments are incompatible!";
158  handleError( StkError::FUNCTION_ARGUMENT );
159  }
160 #endif
161 
162  StkFloat *samples = &frames[channel];
163  unsigned int hop = frames.channels();
164  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
165  *samples = tick( *samples );
166 
167  return frames;
168 }
169 
170 inline StkFrames& FormSwep :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
171 {
172 #if defined(_STK_DEBUG_)
173  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
174  oStream_ << "FormSwep::tick(): channel and StkFrames arguments are incompatible!";
175  handleError( StkError::FUNCTION_ARGUMENT );
176  }
177 #endif
178 
179  StkFloat *iSamples = &iFrames[iChannel];
180  StkFloat *oSamples = &oFrames[oChannel];
181  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
182  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop )
183  *oSamples = tick( *iSamples );
184 
185  return iFrames;
186 }
187 
188 } // stk namespace
189 
190 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/FreeVerb_8h_source.html0000644000076600007660000007567012327015203016230 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


FreeVerb.h
1 #ifndef STK_FREEVERB_H
2 #define STK_FREEVERB_H
3 
4 #include "Effect.h"
5 #include "Delay.h"
6 #include "OnePole.h"
7 
8 namespace stk {
9 
10 /***********************************************************************/
24 /***********************************************************************/
25 
26 class FreeVerb : public Effect
27 {
28  public:
30 
36  FreeVerb();
37 
39  ~FreeVerb();
40 
42  void setEffectMix( StkFloat mix );
43 
45  void setRoomSize( StkFloat value );
46 
48  StkFloat getRoomSize( void );
49 
51  void setDamping( StkFloat value );
52 
54  StkFloat getDamping( void );
55 
57  void setWidth( StkFloat value );
58 
60  StkFloat getWidth( void );
61 
63  void setMode( bool isFrozen );
64 
66  StkFloat getMode( void );
67 
69  void clear( void );
70 
72 
80  StkFloat lastOut( unsigned int channel = 0 );
81 
83 
90  StkFloat tick( StkFloat inputL, StkFloat inputR = 0.0, unsigned int channel = 0 );
91 
93 
103  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
104 
106 
117  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
118 
119  protected:
121  void update( void );
122 
123  // Clamp very small floats to zero, version from
124  // http://music.columbia.edu/pipermail/linux-audio-user/2004-July/013489.html .
125  // However, this is for 32-bit floats only.
126  //static inline StkFloat undenormalize( volatile StkFloat s ) {
127  // s += 9.8607615E-32f;
128  // return s - 9.8607615E-32f;
129  //}
130 
131  static const int nCombs = 8;
132  static const int nAllpasses = 4;
133  static const int stereoSpread = 23;
134  static const StkFloat fixedGain;
135  static const StkFloat scaleWet;
136  static const StkFloat scaleDry;
137  static const StkFloat scaleDamp;
138  static const StkFloat scaleRoom;
139  static const StkFloat offsetRoom;
140 
141  // Delay line lengths for 44100Hz sampling rate.
142  static int cDelayLengths[nCombs];
143  static int aDelayLengths[nAllpasses];
144 
145  StkFloat g_; // allpass coefficient
146  StkFloat gain_;
147  StkFloat roomSizeMem_, roomSize_;
148  StkFloat dampMem_, damp_;
149  StkFloat wet1_, wet2_;
150  StkFloat dry_;
151  StkFloat width_;
152  bool frozenMode_;
153 
154  // LBFC: Lowpass Feedback Comb Filters
155  Delay combDelayL_[nCombs];
156  Delay combDelayR_[nCombs];
157  OnePole combLPL_[nCombs];
158  OnePole combLPR_[nCombs];
159 
160  // AP: Allpass Filters
161  Delay allPassDelayL_[nAllpasses];
162  Delay allPassDelayR_[nAllpasses];
163 };
164 
165 inline StkFloat FreeVerb :: lastOut( unsigned int channel )
166 {
167 #if defined(_STK_DEBUG_)
168  if ( channel > 1 ) {
169  oStream_ << "FreeVerb::lastOut(): channel argument must be less than 2!";
170  handleError( StkError::FUNCTION_ARGUMENT );
171  }
172 #endif
173 
174  return lastFrame_[channel];
175 }
176 
177 inline StkFloat FreeVerb::tick( StkFloat inputL, StkFloat inputR, unsigned int channel )
178 {
179 #if defined(_STK_DEBUG_)
180  if ( channel > 1 ) {
181  oStream_ << "FreeVerb::tick(): channel argument must be less than 2!";
182  handleError(StkError::FUNCTION_ARGUMENT);
183  }
184 #endif
185 
186  StkFloat fInput = (inputL + inputR) * gain_;
187  StkFloat outL = 0.0;
188  StkFloat outR = 0.0;
189 
190  // Parallel LBCF filters
191  for ( int i = 0; i < nCombs; i++ ) {
192  // Left channel
193  //StkFloat yn = fInput + (roomSize_ * FreeVerb::undenormalize(combLPL_[i].tick(FreeVerb::undenormalize(combDelayL_[i].nextOut()))));
194  StkFloat yn = fInput + (roomSize_ * combLPL_[i].tick( combDelayL_[i].nextOut() ) );
195  combDelayL_[i].tick(yn);
196  outL += yn;
197 
198  // Right channel
199  //yn = fInput + (roomSize_ * FreeVerb::undenormalize(combLPR_[i].tick(FreeVerb::undenormalize(combDelayR_[i].nextOut()))));
200  yn = fInput + (roomSize_ * combLPR_[i].tick( combDelayR_[i].nextOut() ) );
201  combDelayR_[i].tick(yn);
202  outR += yn;
203  }
204 
205  // Series allpass filters
206  for ( int i = 0; i < nAllpasses; i++ ) {
207  // Left channel
208  //StkFloat vn_m = FreeVerb::undenormalize(allPassDelayL_[i].nextOut());
209  StkFloat vn_m = allPassDelayL_[i].nextOut();
210  StkFloat vn = outL + (g_ * vn_m);
211  allPassDelayL_[i].tick(vn);
212 
213  // calculate output
214  outL = -vn + (1.0 + g_)*vn_m;
215 
216  // Right channel
217  //vn_m = FreeVerb::undenormalize(allPassDelayR_[i].nextOut());
218  vn_m = allPassDelayR_[i].nextOut();
219  vn = outR + (g_ * vn_m);
220  allPassDelayR_[i].tick(vn);
221 
222  // calculate output
223  outR = -vn + (1.0 + g_)*vn_m;
224  }
225 
226  // Mix output
227  lastFrame_[0] = outL*wet1_ + outR*wet2_ + inputL*dry_;
228  lastFrame_[1] = outR*wet1_ + outL*wet2_ + inputR*dry_;
229 
230  /*
231  // Hard limiter ... there's not much else we can do at this point
232  if ( lastFrame_[0] >= 1.0 ) {
233  lastFrame_[0] = 0.9999;
234  }
235  if ( lastFrame_[0] <= -1.0 ) {
236  lastFrame_[0] = -0.9999;
237  }
238  if ( lastFrame_[1] >= 1.0 ) {
239  lastFrame_[1] = 0.9999;
240  }
241  if ( lastFrame_[1] <= -1.0 ) {
242  lastFrame_[1] = -0.9999;
243  }
244  */
245 
246  return lastFrame_[channel];
247 }
248 
249 }
250 
251 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/ftv2blank.png0000644000076600007660000000012612327015202014241 0ustar gary‰PNG  IHDRɪ|IDATxíݱðøScOx@ –¨y}IEND®B`‚stk-4.5.0/doc/html/ftv2cl.png0000644000076600007660000000070512327015202013553 0ustar gary‰PNG  IHDRÚ}\ˆŒIDATxíÝ;H#AÇño4Љႇ œ„K‰‡‚á ’ê,m„ØØ vÚžJ°²¹ÚÎþî‚§ XY ÅB|dr³cvo—˜Ä°Ý ù0Ã’™3ÿͤõ”Ëe×´¸Éõ¯1XÞ8Œ‰nQˆ88ööÖ§3*rbñ¯¢û-$¨‚þ´˜“P1Žè@Z…-# Ïú01ÑÏÎêÄ1HkKŸ w¶O@¥ªÈóñ!f§ñu˜åác÷;’sá×Bý[E´Añ±—Í\ß>°ùý¿ÏËÊÂ]–P€zØf| Íñ¯“+Ù´gð5…b  i5ümM³œ_æÍq,ÒcŽõèoÓd´ !¶äò©ô•,ôðÀ{¹¨µYß,€zTÍ8H]𤕘ï7¼»/òó8ËQæ !F€~6ãá?Y ÀA@ŨÁ.@ƒ¶TäÄYïŠËë±r‘µ8Ð*·é>€Šçÿ?€×þŸe[6«xÂIEND®B`‚stk-4.5.0/doc/html/ftv2doc.png0000644000076600007660000000135212327015202013721 0ustar gary‰PNG  IHDRÚ}\ˆ±IDATxíMOS[…Ÿžsúa?-XZ(PD4‚ AWbu`b 77wäHFÆCËÔÂÿà/`vo„ˆAPòq‹P @ ­ûÝè980 îà¤+»§Ýy×^ïZï9SW¹\83g‰3'°Nâçl¹¸_b¯p ïåûÆVÜÖ¡€Ÿ×"¬Ö†X€d]Ðà3“ÉÃÄÌ™xŸ ßMàœ[<çSPkvc—hÈ'…™˜^Åm™hØ7 `Û™¦ èÀåráq›‘œ¾!daeKŸþÆÕ˜:Ì*³_דâèi?I–eP*B7Ÿ¿åô!¹Ýgr6Ër6oKbëþãðôrI”ËTˆüªŒ¨xóö=›ù¢&‰(e+ßóÄkýÇ`ëÁÜb.“¸ÐW×w0¥°jÑzN™¬|©WEãµ¢a¯6[öX†AkÓù*/œ¨‰€ÉY­ ÿV’§–u²jÂ>1W *½·°PGŽzÿ¨/Eg{ ŸÇâaoŠÁVú:è¿™¤1$ôR§W,–ªà¨@ŠË56¾ÀÔÜ-¾,mê¸Î/æè¹– òr5¥T*S(Vf8ö9u’ Õ£w›ùóa=Í<{Ò¡UŒ÷r¯+ÉådDÏF$è°…£é¿`zþ»ÎúöN‘µÜ®0Q3£~_^Ëóâ¯N=ˆvpTà±LžT}ˆîkq†Òm<¼ÎÓ?Zh¿X£ï_þÝ¥[)ƒ `gêÃa_Ô*äÔ2`'=õ´Fÿ2EâÁPú ÷»›l=8‹Wv°%THqÉ¿<"¤ïG¾ÆxH{#ÆÖ«aÔJÕÞ‡—m‹„ çñKsÿàñVŠØ¡°·MâÒ^ TÁ– Ý›r¥ß½ømüÿ_™?ªWİ÷#uIEND®B`‚stk-4.5.0/doc/html/ftv2folderclosed.png0000644000076600007660000000115012327015202015615 0ustar gary‰PNG  IHDRÚ}\ˆ/IDATxí]MOÔ@~ÚúuØlp]ö¿#›Å]PYECˆ\9ù¼yÑß`ÖÄÿàÿÀÉxóâ¢C &=qÐÄ£—vZçv¶3m؃‡vžLûNç}Þ÷}Þ½ZA@n° OäNp ’xóþK°ññ€xÜj”°8sÑ€“ “€œ_¼[Âíæ§ïD'‚•yye+ø¼û 7#rNŸlïük* ¾0Ь_d«_(àñÖ±àôz=ñxõv§÷h©‰z¹€šØP-äóä’̪uý¼$»\DãJc—B4¯ãÝÖ.:£Ï-ÑÏß}µŠLEíºþ #—ûáºÀÏgN;BŠ€6ïýñ䬜…ö@’Ðåñp&™h>p9¤™EEά¨ÎÊ‘" u¥n€$R"?{¹<˜…ë…%PNtâ$‰ß¶±úá+^<é"§2 ªDq”q´\¬«Ò™a–Œ‘©Aÿ€"Ôµ ™êŸèP£}#Eàz{û.8i îp³ê(ADwD¦E<ê¬cE¦$ HdÊÄ ”.:Ù GŽ-`ŒL‚ý¾'¢‰Ä<¤CIª½;ÙÇTZd±i};>èôß‚z×;K×§8t ¤Ž q”:uvÿv•Ý›¬²ÙvEân{„M·FXg¼ÌfZÖ¨°¹‰*›ßÌß©±ù©:›j–YqèÜë#3çÏSøWøÿÿÑr'ø Ôùù‚ ©¡IEND®B`‚stk-4.5.0/doc/html/ftv2folderopen.png0000644000076600007660000000112512327015202015307 0ustar gary‰PNG  IHDRÚ}\ˆIDATxí]?oÓPÿ9iš4i°;ii“¶‰ZЉ‘‰ÀÀ7`bèÔÙ¬Øù,HìU'ô$*Tµ]‚T¡DPÚÄ6wÏ}‰;¡C; a¿ÓߟûÝïîž¼jAÀ­InSþ}€9H“ÓŽ|?íÁ÷ =_ÊÆŠ­†¥Àue*;¯YEäsYäæB¢Ÿ¿þÄ—£sÙ½½ÙŒ† É«›©ÀYÇq !GÇ¿v̇¹ÑØ®š °Œ‚ÔF¹}q¥b]÷7í·0)Úd›¾ÿð-èº}Pfä£ÖY{4™ÑÂ@}úæôñ2ÛüÔ—ñúåNŒI‚ÁǃcçÁº%£¬UаI³mc±ô˜å¼ÔÆüÈ>é¸xþt9Æ$µý OæVE*õU´Ì‚ç#ž×ˆ•ïûr@l$øPÿrHaaÇ¥ ²›dZ®rè‘ãqI„o¼øT\Ž,tªj2FAxv-LŸp׌p TÄI/ \¥sfí½; jViTƒèú¤o^cpÅü¼ûû»Ïb]”€¢¤<†aþÕœ²“ßÓ˜y“£§9:Œîù+À³€ñà,E žf³6éNˆÄE£KU}Ü^;¶ØnZ¢uß­US4— ѬëbížN¶.Úk¦ØjTÄöº%µªâ i¯VÄÊÝò§™ Èù¸)ùÿG€™òºJ@T x”IEND®B`‚stk-4.5.0/doc/html/ftv2lastnode.png0000644000076600007660000000012612327015202014763 0ustar gary‰PNG  IHDRɪ|IDATxíݱðøScOx@ –¨y}IEND®B`‚stk-4.5.0/doc/html/ftv2link.png0000644000076600007660000000135212327015202014111 0ustar gary‰PNG  IHDRÚ}\ˆ±IDATxíMOS[…Ÿžsúa?-XZ(PD4‚ AWbu`b 77wäHFÆCËÔÂÿà/`vo„ˆAPòq‹P @ ­ûÝè980 îà¤+»§Ýy×^ïZï9SW¹\83g‰3'°Nâçl¹¸_b¯p ïåûÆVÜÖ¡€Ÿ×"¬Ö†X€d]Ðà3“ÉÃÄÌ™xŸ ßMàœ[<çSPkvc—hÈ'…™˜^Åm™hØ7 `Û™¦ èÀåráq›‘œ¾!daeKŸþÆÕ˜:Ì*³_דâèi?I–eP*B7Ÿ¿åô!¹Ýgr6Ër6oKbëþãðôrI”ËTˆüªŒ¨xóö=›ù¢&‰(e+ßóÄkýÇ`ëÁÜb.“¸ÐW×w0¥°jÑzN™¬|©WEãµ¢a¯6[öX†AkÓù*/œ¨‰€ÉY­ ÿV’§–u²jÂ>1W *½·°PGŽzÿ¨/Eg{ ŸÇâaoŠÁVú:è¿™¤1$ôR§W,–ªà¨@ŠË56¾ÀÔÜ-¾,mê¸Î/æè¹– òr5¥T*S(Vf8ö9u’ Õ£w›ùóa=Í<{Ò¡UŒ÷r¯+ÉådDÏF$è°…£é¿`zþ»ÎúöN‘µÜ®0Q3£~_^Ëóâ¯N=ˆvpTà±LžT}ˆîkq†Òm<¼ÎÓ?Zh¿X£ï_þÝ¥[)ƒ `gêÃa_Ô*äÔ2`'=õ´Fÿ2EâÁPú ÷»›l=8‹Wv°%THqÉ¿<"¤ïG¾ÆxH{#ÆÖ«aÔJÕÞ‡—m‹„ çñKsÿàñVŠØ¡°·MâÒ^ TÁ– Ý›r¥ß½ømüÿ_™?ªWİ÷#uIEND®B`‚stk-4.5.0/doc/html/ftv2mlastnode.png0000644000076600007660000000036612327015202015146 0ustar gary‰PNG  IHDRɪ|½IDATxíÝ!NAÅñ¤‡à\ ÷à Um@`Ô5iÒ`ëh ‚ÅW7] b§ÝˆŠ&oföÍd¾YÔ4 üšcø ‡€´‹Åòù3v=¼]†§µ\B… I¿‹=B·™B¡®;¸k´µ W°ÍN@vyÍÑÖ4ãß÷]ÈâYìã§|M}]ÔÚx6a }ôdׇØYüú¨>¤||5?Ó>|žB"¡î'¡IEND®B`‚stk-4.5.0/doc/html/ftv2mnode.png0000644000076600007660000000036612327015202014262 0ustar gary‰PNG  IHDRɪ|½IDATxíÝ!NAÅñ¤‡à\ ÷à Um@`Ô5iÒ`ëh ‚ÅW7] b§ÝˆŠ&oföÍd¾YÔ4 üšcø ‡€´‹Åòù3v=¼]†§µ\B… I¿‹=B·™B¡®;¸k´µ W°ÍN@vyÍÑÖ4ãß÷]ÈâYìã§|M}]ÔÚx6a }ôdׇØYüú¨>¤||5?Ó>|žB"¡î'¡IEND®B`‚stk-4.5.0/doc/html/ftv2mo.png0000644000076600007660000000062312327015202013567 0ustar gary‰PNG  IHDRÚ}\ˆZIDATxí1Kû@ÆiƒØB…Ò¡(h¬"EÄI'ÁoàªèÚ©ßÀáâä 8ùçR-‚â B«TPˆï]z¥B’3 _Þã’»ç}ŸË]VÇ÷}€ÌÈdIæ®i쟯JØ–b¸šÍÃõ+º™|KÂ…°,[Pï\ʘMÆ¢#€ä…F`JݤìÛk³úA±àþè?ØY4ck6"¹Z)ê¸0SHM¨@ï㋺WÖmo¼4èHJ¨Àÿö+…QobŒút ¤ú’*Ð~êè8_+3Y-ñðÜå½÷ ˜PwA¶+^ý}ºì£+xìhÏ•MAE]€TD~EÞߴ^R)`ÖAùŸÏ9©pÔq-Û¾õÛ3tÝÊÆ›ˆÃTÐHÈ)€ ½Š’ICªxëd#1ôú§é€ m@Vüý?Zæßgo_½3-³\IEND®B`‚stk-4.5.0/doc/html/ftv2node.png0000644000076600007660000000012612327015202014077 0ustar gary‰PNG  IHDRɪ|IDATxíݱðøScOx@ –¨y}IEND®B`‚stk-4.5.0/doc/html/ftv2ns.png0000644000076600007660000000060412327015202013573 0ustar gary‰PNG  IHDRÚ}\ˆKIDATxíÝ1K1Àñ­ž ØG•â‚n‚Šà ‚âælÁE¿€‹“ (nºêââêäࢋƒÐMAá@°‹ µât¾ÄK¡à%Ü•Û ý]BIïå%áuÍ…a™€,e × v¯ç¥«ˆi‹º¨Õö–î\tòòuénÄ0ã æÜÉoV\Ì$G.&@Y=ÆË%$um·¢ûÛ6–'Úß«9Qó\bÙ)²º0Ðë-Zœ¥TèHÍ`pÀcsm µö5:>Áë‡Þ¦I µØ ‚F‹Çà]» ›jg—ìoÏáõ©[ œõ š­onë €Ô¬¨vqõ„?\Ðç”  6»øüÒTe ÃÉéŸeç ÀÅlQ ¡c”€ª¬ü3*d€ÅWTMÏ\rÿÿh6™ø1±F ‹°fžIEND®B`‚stk-4.5.0/doc/html/ftv2plastnode.png0000644000076600007660000000034512327015202015146 0ustar gary‰PNG  IHDRɪ|¬IDATxí=QF‘Ø¥D«ÔkÄ:‰F©PK؃=V@§Õ³ Õ8SHxñÌ0bnrróŠ{ò½¿¾’$ ÀÏTŠP  ö¼X¬OÛd6êìòð"°²S´±O¥B€(¡àQé)š+YĈ ÒªËRÉÐ>VtÉsˆm9(ê„䜥k‚-@ȧ-Ü$ó b Ò[he ¿Kp-ôl|CùÿApRG'rÍ­aIEND®B`‚stk-4.5.0/doc/html/ftv2pnode.png0000644000076600007660000000034512327015202014262 0ustar gary‰PNG  IHDRɪ|¬IDATxí=QF‘Ø¥D«ÔkÄ:‰F©PK؃=V@§Õ³ Õ8SHxñÌ0bnrróŠ{ò½¿¾’$ ÀÏTŠP  ö¼X¬OÛd6êìòð"°²S´±O¥B€(¡àQé)š+YĈ ÒªËRÉÐ>VtÉsˆm9(ê„䜥k‚-@ȧ-Ü$ó b Ò[he ¿Kp-ôl|CùÿApRG'rÍ­aIEND®B`‚stk-4.5.0/doc/html/ftv2splitbar.png0000644000076600007660000000047212327015202014776 0ustar gary‰PNG  IHDRM¸¿IDATxíÝ¡JCa‡ñç(˜ ëƒ%±Ø4 b±È˜Í¶3˜v^Á±˜…ãó–ŽELƒõ…¥•³ ,ÿb;íç{Ã/¼ðÞÀaYÕ¯åóøq:¼º¹›\òIIIIIIIIIIIIIIIIII-Òçl¹›«õ抢è_t/Ï»ã£ÑíYQVõðêäíã÷´×ùY¬Úÿµ§¦ivók¾_íåýÛ£I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$ýC[Vì=ü[„fÆIEND®B`‚stk-4.5.0/doc/html/ftv2vertline.png0000644000076600007660000000012612327015202015002 0ustar gary‰PNG  IHDRɪ|IDATxíݱðøScOx@ –¨y}IEND®B`‚stk-4.5.0/doc/html/Function_8h_source.html0000644000076600007660000001372712327015203016310 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Function.h
1 #ifndef STK_FUNCTION_H
2 #define STK_FUNCTION_H
3 
4 #include "Stk.h"
5 
6 namespace stk {
7 
8 /***************************************************/
18 /***************************************************/
19 
20 class Function : public Stk
21 {
22  public:
24  Function( void ) { lastFrame_.resize( 1, 1, 0.0 ); };
25 
27  StkFloat lastOut( void ) const { return lastFrame_[0]; };
28 
30  virtual StkFloat tick( StkFloat input ) = 0;
31 
32  protected:
33 
34  StkFrames lastFrame_;
35 
36 };
37 
38 } // stk namespace
39 
40 #endif
41 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions.html0000644000076600007660000000652212327015206014552 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- a -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x62.html0000644000076600007660000000517012327015206015327 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- b -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x63.html0000644000076600007660000002354212327015206015333 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- c -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x64.html0000644000076600007660000000616212327015206015333 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- d -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x65.html0000644000076600007660000000400312327015206015324 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- e -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x66.html0000644000076600007660000001132012327015206015325 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- f -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x67.html0000644000076600007660000002164012327015206015334 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- g -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x68.html0000644000076600007660000000311012327015206015325 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- h -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x69.html0000644000076600007660000001327112327015206015337 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- i -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x6a.html0000644000076600007660000000271412327015206015407 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- j -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x6b.html0000644000076600007660000000530612327015206015410 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- k -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x6c.html0000644000076600007660000001543512327015206015415 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial



The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x6d.html0000644000076600007660000000564412327015206015417 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- m -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x6e.html0000644000076600007660000002207312327015206015413 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial



The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x6f.html0000644000076600007660000000720212327015206015411 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- o -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x70.html0000644000076600007660000000771012327015206015330 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- p -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x71.html0000644000076600007660000000272212327015206015327 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- q -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x72.html0000644000076600007660000001262612327015206015334 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- r -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x73.html0000644000076600007660000010222712327015206015332 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- s -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x74.html0000644000076600007660000003545712327015206015345 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- t -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x75.html0000644000076600007660000000471212327015206015334 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- u -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x76.html0000644000076600007660000000347612327015206015343 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- v -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x77.html0000644000076600007660000000764612327015206015347 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- w -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_0x7e.html0000644000076600007660000002527512327015206015423 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented class members with links to the class documentation for each member:

- ~ -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_enum.html0000644000076600007660000000306512327015206015575 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_eval.html0000644000076600007660000001722312327015206015561 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- a -

- d -

- i -

- l -

- m -

- n -

- r -

- s -

- t -

- u -

- w -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func.html0000644000076600007660000000561512327015206015567 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- a -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x62.html0000644000076600007660000000477412327015206016353 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- b -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x63.html0000644000076600007660000002314012327015206016340 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial



The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x64.html0000644000076600007660000000403112327015206016337 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- d -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x65.html0000644000076600007660000000360712327015206016350 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- e -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x66.html0000644000076600007660000000711312327015206016345 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- f -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x67.html0000644000076600007660000002144412327015206016351 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- g -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x68.html0000644000076600007660000000271412327015206016351 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- h -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x69.html0000644000076600007660000001006612327015206016351 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- i -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x6a.html0000644000076600007660000000252012327015206016415 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- j -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x6b.html0000644000076600007660000000511212327015206016416 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial



The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x6c.html0000644000076600007660000001420412327015206016421 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial



The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x6d.html0000644000076600007660000000441312327015206016423 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- m -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x6e.html0000644000076600007660000002020012327015206016414 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial



The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x6f.html0000644000076600007660000000657312327015206016436 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- o -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x70.html0000644000076600007660000000707612327015206016350 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- p -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x71.html0000644000076600007660000000252612327015206016344 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- q -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x72.html0000644000076600007660000001116312327015206016342 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- r -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x73.html0000644000076600007660000007727412327015206016362 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- s -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x74.html0000644000076600007660000003253312327015206016350 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- t -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x75.html0000644000076600007660000000310612327015206016343 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- u -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x76.html0000644000076600007660000000330212327015206016342 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- v -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x77.html0000644000076600007660000000557512327015206016361 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- w -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_func_0x7e.html0000644000076600007660000002510112327015206016422 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- ~ -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_type.html0000644000076600007660000000243612327015206015613 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/functions_vars.html0000644000076600007660000001375512327015206015613 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

- c -

- d -

- f -

- i -

- n -

- o -

- p -

- r -

- s -

- t -


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/fundamentals.html0000644000076600007660000003033712327015204015222 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


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. Starting with STK version 4.4, all STK classes except RtAudio and RtMidi are defined within the stk namespace.

Computations:

Audio and control signals throughout STK use a floating-point data type, StkFloat, 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 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 (StkFloat) values in the range -1.0 to +1.0:

#include "Noise.h"
using namespace stk;
int main()
{
StkFloat output;
Noise noise;
for ( unsigned int i=0; i<20; i++ ) {
output = noise.tick();
std::cout << "i = " << i << " : output = " << output << std::endl;
}
return 0;
}

Nearly all STK classes implement tick() functions that take and/or return sample values. Within the tick() function, the fundamental sample calculations are performed for a given class. Most STK classes consume/generate a single sample per operation and their tick() method takes/returns each sample "by value". In addition, every class implementing a tick() function also provides one or more overloaded tick() functions that can be used for vectorized computations, as shown in the next example.

#include "Noise.h"
using namespace stk;
int main()
{
StkFrames output(20, 1); // initialize StkFrames to 20 frames and 1 channel (default: interleaved)
Noise noise;
noise.tick( output );
for ( unsigned int i=0; i<output.size(); i++ ) {
std::cout << "i = " << i << " : output = " << output[i] << std::endl;
}
return 0;
}

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.

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:

[Main tutorial page]   [Next tutorial]


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Generator_8h_source.html0000644000076600007660000001635712327015203016453 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Generator.h
1 #ifndef STK_GENERATOR_H
2 #define STK_GENERATOR_H
3 
4 #include "Stk.h"
5 
6 namespace stk {
7 
8 /***************************************************/
18 /***************************************************/
19 
20 class Generator : public Stk
21 {
22  public:
23 
25  Generator( void ) { lastFrame_.resize( 1, 1, 0.0 ); };
26 
28  unsigned int channelsOut( void ) const { return lastFrame_.channels(); };
29 
31  const StkFrames& lastFrame( void ) const { return lastFrame_; };
32 
34 
41  virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0;
42 
43  protected:
44 
45  StkFrames lastFrame_;
46 };
47 
48 } // stk namespace
49 
50 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/globals.html0000644000076600007660000000370312327015206014163 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Here is a list of all documented file members with links to the documentation:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/globals_type.html0000644000076600007660000000353612327015206015230 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Granulate_8h_source.html0000644000076600007660000005643212327015203016445 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Granulate.h
1 #ifndef STK_GRANULATE_H
2 #define STK_GRANULATE_H
3 
4 #include <vector>
5 #include "Generator.h"
6 #include "Envelope.h"
7 #include "Noise.h"
8 
9 namespace stk {
10 
11 /***************************************************/
26 /***************************************************/
27 
28 class Granulate: public Generator
29 {
30  public:
32  Granulate( void );
33 
35  Granulate( unsigned int nVoices, std::string fileName, bool typeRaw = false );
36 
38  ~Granulate( void );
39 
41 
45  void openFile( std::string fileName, bool typeRaw = false );
46 
48 
52  void reset( void );
53 
55 
60  void setVoices( unsigned int nVoices = 1 );
61 
63 
69  void setStretch( unsigned int stretchFactor = 1 );
70 
72 
87  void setGrainParameters( unsigned int duration = 30, unsigned int rampPercent = 50,
88  int offset = 0, unsigned int delay = 0 );
89 
91 
99  void setRandomFactor( StkFloat randomness = 0.1 );
100 
102 
110  StkFloat lastOut( unsigned int channel = 0 );
111 
113  StkFloat tick( unsigned int channel = 0 );
114 
116 
123  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
124 
125  enum GrainState {
126  GRAIN_STOPPED,
127  GRAIN_FADEIN,
128  GRAIN_SUSTAIN,
129  GRAIN_FADEOUT
130  };
131 
132  protected:
133 
134  struct Grain {
135  StkFloat eScaler;
136  StkFloat eRate;
137  unsigned long attackCount;
138  unsigned long sustainCount;
139  unsigned long decayCount;
140  unsigned long delayCount;
141  unsigned long counter;
142  //unsigned long pointer;
143  StkFloat pointer;
144  unsigned long startPointer;
145  unsigned int repeats;
146  GrainState state;
147 
148  // Default constructor.
149  Grain()
150  :eScaler(0.0), eRate(0.0), attackCount(0), sustainCount(0), decayCount(0),
151  delayCount(0), counter(0), pointer(0), startPointer(0), repeats(0), state(GRAIN_STOPPED) {}
152  };
153 
154  void calculateGrain( Granulate::Grain& grain );
155 
156  StkFrames data_;
157  std::vector<Grain> grains_;
158  Noise noise;
159  //long gPointer_;
160  StkFloat gPointer_;
161 
162  // Global grain parameters.
163  unsigned int gDuration_;
164  unsigned int gRampPercent_;
165  unsigned int gDelay_;
166  unsigned int gStretch_;
167  unsigned int stretchCounter_;
168  int gOffset_;
169  StkFloat gRandomFactor_;
170  StkFloat gain_;
171 
172 };
173 
174 inline StkFloat Granulate :: lastOut( unsigned int channel )
175 {
176 #if defined(_STK_DEBUG_)
177  if ( channel >= lastFrame_.channels() ) {
178  oStream_ << "Granulate::lastOut(): channel argument is invalid!";
179  handleError( StkError::FUNCTION_ARGUMENT );
180  }
181 #endif
182 
183  return lastFrame_[channel];
184 }
185 
186 inline StkFrames& Granulate :: tick( StkFrames& frames, unsigned int channel )
187 {
188  unsigned int nChannels = lastFrame_.channels();
189 #if defined(_STK_DEBUG_)
190  if ( channel > frames.channels() - nChannels ) {
191  oStream_ << "Granulate::tick(): channel and StkFrames arguments are incompatible!";
192  handleError( StkError::FUNCTION_ARGUMENT );
193  }
194 #endif
195 
196  StkFloat *samples = &frames[channel];
197  unsigned int j, hop = frames.channels() - nChannels;
198  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
199  *samples++ = tick();
200  for ( j=1; j<nChannels; j++ )
201  *samples++ = lastFrame_[j];
202  }
203 
204  return frames;
205 }
206 
207 } // stk namespace
208 
209 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Guitar_8h_source.html0000644000076600007660000006356512327015203015763 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Guitar.h
1 #ifndef STK_GUITAR_H
2 #define STK_GUITAR_H
3 
4 #include "Stk.h"
5 #include "Twang.h"
6 #include "OnePole.h"
7 #include "OneZero.h"
8 
9 namespace stk {
10 
11 /***************************************************/
39 /***************************************************/
40 
41 class Guitar : public Stk
42 {
43  public:
45  Guitar( unsigned int nStrings = 6, std::string bodyfile = "" );
46 
48  void clear( void );
49 
51 
56  void setBodyFile( std::string bodyfile = "" );
57 
59 
63  void setPluckPosition( StkFloat position, int string = -1 );
64 
66 
70  void setLoopGain( StkFloat gain, int string = -1 );
71 
73  void setFrequency( StkFloat frequency, unsigned int string = 0 );
74 
76 
80  void noteOn( StkFloat frequency, StkFloat amplitude, unsigned int string = 0 );
81 
83  void noteOff( StkFloat amplitude, unsigned int string = 0 );
84 
86 
90  void controlChange( int number, StkFloat value, int string = -1 );
91 
93  StkFloat lastOut( void ) { return lastFrame_[0]; };
94 
96  StkFloat tick( StkFloat input = 0.0 );
97 
99 
107  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
108 
110 
118  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
119 
120  protected:
121 
122  std::vector< stk::Twang > strings_;
123  std::vector< int > stringState_; // 0 = off, 1 = decaying, 2 = on
124  std::vector< unsigned int > decayCounter_;
125  std::vector< unsigned int > filePointer_;
126  std::vector< StkFloat > pluckGains_;
127 
128  OnePole pickFilter_;
129  OnePole couplingFilter_;
130  StkFloat couplingGain_;
131  StkFrames excitation_;
132  StkFrames lastFrame_;
133 };
134 
135 inline StkFloat Guitar :: tick( StkFloat input )
136 {
137  StkFloat temp, output = 0.0;
138  lastFrame_[0] /= strings_.size(); // evenly spread coupling across strings
139  for ( unsigned int i=0; i<strings_.size(); i++ ) {
140  if ( stringState_[i] ) {
141  temp = input;
142  // If pluckGain < 0.2, let string ring but don't pluck it.
143  if ( filePointer_[i] < excitation_.frames() && pluckGains_[i] > 0.2 )
144  temp += pluckGains_[i] * excitation_[filePointer_[i]++];
145  temp += couplingGain_ * couplingFilter_.tick( lastFrame_[0] ); // bridge coupling
146  output += strings_[i].tick( temp );
147  // Check if string energy has decayed sufficiently to turn it off.
148  if ( stringState_[i] == 1 ) {
149  if ( fabs( strings_[i].lastOut() ) < 0.001 ) decayCounter_[i]++;
150  else decayCounter_[i] = 0;
151  if ( decayCounter_[i] > (unsigned int) floor( 0.1 * Stk::sampleRate() ) ) {
152  stringState_[i] = 0;
153  decayCounter_[i] = 0;
154  }
155  }
156  }
157  }
158 
159  return lastFrame_[0] = output;
160 }
161 
162 inline StkFrames& Guitar :: tick( StkFrames& frames, unsigned int channel )
163 {
164 #if defined(_STK_DEBUG_)
165  if ( channel >= frames.channels() ) {
166  oStream_ << "Guitar::tick(): channel and StkFrames arguments are incompatible!";
167  handleError( StkError::FUNCTION_ARGUMENT );
168  }
169 #endif
170 
171  StkFloat *samples = &frames[channel];
172  unsigned int hop = frames.channels();
173  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
174  *samples = tick( *samples );
175 
176  return frames;
177 }
178 
179 inline StkFrames& Guitar :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
180 {
181 #if defined(_STK_DEBUG_)
182  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
183  oStream_ << "Guitar::tick(): channel and StkFrames arguments are incompatible!";
184  handleError( StkError::FUNCTION_ARGUMENT );
185  }
186 #endif
187 
188  StkFloat *iSamples = &iFrames[iChannel];
189  StkFloat *oSamples = &oFrames[oChannel];
190  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
191  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop )
192  *oSamples = tick( *iSamples );
193 
194  return iFrames;
195 }
196 
197 } // stk namespace
198 
199 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/hello.html0000644000076600007660000003342012327015204013640 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Hello Sine!

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, 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 stk::FileWvOut to write the result to a 16-bit, WAV formatted audio file.

// sineosc.cpp
#include "FileLoop.h"
#include "FileWvOut.h"
using namespace stk;
int main()
{
// Set the global sample rate before creating class instances.
Stk::setSampleRate( 44100.0 );
FileLoop input;
FileWvOut output;
// Load the sine wave file.
input.openFile( "rawwaves/sinewave.raw", true );
// Open a 16-bit, one-channel WAV formatted output file
output.openFile( "hellosine.wav", 1, FileWrite::FILE_WAV, Stk::STK_SINT16 );
input.setFrequency( 440.0 );
// Run the oscillator for 40000 samples, writing to the output file
for ( int i=0; i<40000; i++ )
output.tick( input.tick() );
return 0;
}

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.

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.

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 tick() 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 tick() 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 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 tick() functions taking StkFrames reference arguments should be used.

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.

Error Handling

The ToolKit has some basic C++ error handling functionality built in. Classes that access files and/or hardware are most prone to runtime errors. To properly "catch" such errors, the above example should be rewritten as shown below.

// sineosc.cpp STK tutorial program
#include "FileLoop.h"
#include "FileWvOut.h"
#include <cstdlib>
using namespace stk;
int main()
{
// Set the global sample rate before creating class instances.
Stk::setSampleRate( 44100.0 );
int nFrames = 100000;
FileLoop input;
FileWvOut output;
try {
// Load the sine wave file.
input.openFile( "rawwaves/sinewave.raw", true );
// Open a 16-bit, one-channel WAV formatted output file
output.openFile( "hellosine.wav", 1, FileWrite::FILE_WAV, Stk::STK_SINT16 );
}
catch ( StkError & ) {
exit( 1 );
}
input.setFrequency( 440.0 );
// Option 1: Use StkFrames
/*
StkFrames frames( nFrames, 1 );
try {
output.tick( input.tick( frames ) );
}
catch ( StkError & ) {
exit( 1 );
}
*/
// Option 2: Single-sample computations
for ( int i=0; i<nFrames; i++ ) {
try {
output.tick( input.tick() );
}
catch ( StkError & ) {
exit( 1 );
}
}
return 0;
}

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 Class Documentation to determine which constructors and functions can throw an error.

[Main tutorial page]   [Next tutorial]


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/HevyMetl_8h_source.html0000644000076600007660000003732512327015203016260 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


HevyMetl.h
1 #ifndef STK_HEVYMETL_H
2 #define STK_HEVYMETL_H
3 
4 #include "FM.h"
5 
6 namespace stk {
7 
8 /***************************************************/
36 /***************************************************/
37 
38 class HevyMetl : public FM
39 {
40  public:
42 
45  HevyMetl( void );
46 
48  ~HevyMetl( void );
49 
51  void noteOn( StkFloat frequency, StkFloat amplitude );
52 
54  StkFloat tick( unsigned int channel = 0 );
55 
57 
64  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
65 
66  protected:
67 
68 };
69 
70 inline StkFloat HevyMetl :: tick( unsigned int )
71 {
72  StkFloat temp;
73 
74  temp = vibrato_.tick() * modDepth_ * 0.2;
75  waves_[0]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[0]);
76  waves_[1]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[1]);
77  waves_[2]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[2]);
78  waves_[3]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[3]);
79 
80  temp = gains_[2] * adsr_[2]->tick() * waves_[2]->tick();
81  waves_[1]->addPhaseOffset( temp );
82 
83  waves_[3]->addPhaseOffset( twozero_.lastOut() );
84  temp = (1.0 - (control2_ * 0.5)) * gains_[3] * adsr_[3]->tick() * waves_[3]->tick();
85  twozero_.tick(temp);
86 
87  temp += control2_ * 0.5 * gains_[1] * adsr_[1]->tick() * waves_[1]->tick();
88  temp = temp * control1_;
89 
90  waves_[0]->addPhaseOffset( temp );
91  temp = gains_[0] * adsr_[0]->tick() * waves_[0]->tick();
92 
93  lastFrame_[0] = temp * 0.5;
94  return lastFrame_[0];
95 }
96 
97 inline StkFrames& HevyMetl :: tick( StkFrames& frames, unsigned int channel )
98 {
99  unsigned int nChannels = lastFrame_.channels();
100 #if defined(_STK_DEBUG_)
101  if ( channel > frames.channels() - nChannels ) {
102  oStream_ << "HevyMetl::tick(): channel and StkFrames arguments are incompatible!";
103  handleError( StkError::FUNCTION_ARGUMENT );
104  }
105 #endif
106 
107  StkFloat *samples = &frames[channel];
108  unsigned int j, hop = frames.channels() - nChannels;
109  if ( nChannels == 1 ) {
110  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
111  *samples++ = tick();
112  }
113  else {
114  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
115  *samples++ = tick();
116  for ( j=1; j<nChannels; j++ )
117  *samples++ = lastFrame_[j];
118  }
119  }
120 
121  return frames;
122 }
123 
124 } // stk namespace
125 
126 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/hierarchy.html0000644000076600007660000014322012327015206014515 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Class Hierarchy
This inheritance list is sorted roughly, but not completely, alphabetically:
[detail level 1234]
oCRtAudio::DeviceInfoThe public device information structure for returning queried values
oCstd::exceptionSTL class
|oCRtAudioErrorException handling class for RtAudio
|\CRtMidiErrorException handling class for RtMidi
oCstk::Skini::MessageA message structure to store and pass parsed SKINI messages
oCRtAudioRealtime audio i/o C++ classes
oCRtMidiAn abstract base class for realtime MIDI input/output
|oCRtMidiInA realtime MIDI input class
|\CRtMidiOutA realtime MIDI output class
oCstk::StkSTK base class
|oCstk::EffectSTK abstract effects parent class
|oCstk::FileReadSTK audio file input class
|oCstk::FileWriteSTK audio file output class
|oCstk::FilterSTK abstract filter class
|oCstk::FunctionSTK abstract function parent class
|oCstk::GeneratorSTK abstract unit generator parent class
|oCstk::GuitarSTK guitar model class
|oCstk::InstrmntSTK instrument abstract base class
|oCstk::MessagerSTK input control message parser
|oCstk::MidiFileInA standard MIDI file reading/parsing class
|oCstk::MutexSTK mutex class
|oCstk::PhonemesSTK phonemes table
|oCstk::SkiniSTK SKINI parsing class
|oCstk::SocketSTK internet socket abstract base class
|oCstk::SphereSTK sphere class
|oCstk::ThreadSTK thread class
|oCstk::TwangSTK enhanced plucked string class
|oCstk::Vector3DSTK 3D vector class
|oCstk::VoicerSTK voice manager class
|oCstk::WvInSTK audio input abstract base class
|\Cstk::WvOutSTK audio output abstract base class
oCstk::StkErrorSTK error handling class
oCstk::StkFramesAn STK class to handle vectorized audio data
oCRtAudio::StreamOptionsThe structure for specifying stream options
\CRtAudio::StreamParametersThe structure for specifying input or ouput stream parameters

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Iir_8h_source.html0000644000076600007660000005624612327015203015251 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Iir.h
1 #ifndef STK_IIR_H
2 #define STK_IIR_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
32 /***************************************************/
33 
34 class Iir : public Filter
35 {
36 public:
38  Iir( void );
39 
41 
45  Iir( std::vector<StkFloat> &bCoefficients, std::vector<StkFloat> &aCoefficients );
46 
48  ~Iir( void );
49 
51 
58  void setCoefficients( std::vector<StkFloat> &bCoefficients, std::vector<StkFloat> &aCoefficients, bool clearState = false );
59 
61 
68  void setNumerator( std::vector<StkFloat> &bCoefficients, bool clearState = false );
69 
71 
80  void setDenominator( std::vector<StkFloat> &aCoefficients, bool clearState = false );
81 
83  StkFloat lastOut( void ) const { return lastFrame_[0]; };
84 
86  StkFloat tick( StkFloat input );
87 
89 
97  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
98 
100 
108  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
109 
110 protected:
111 
112 };
113 
114 inline StkFloat Iir :: tick( StkFloat input )
115 {
116  size_t i;
117 
118  outputs_[0] = 0.0;
119  inputs_[0] = gain_ * input;
120  for ( i=b_.size()-1; i>0; i-- ) {
121  outputs_[0] += b_[i] * inputs_[i];
122  inputs_[i] = inputs_[i-1];
123  }
124  outputs_[0] += b_[0] * inputs_[0];
125 
126  for ( i=a_.size()-1; i>0; i-- ) {
127  outputs_[0] += -a_[i] * outputs_[i];
128  outputs_[i] = outputs_[i-1];
129  }
130 
131  lastFrame_[0] = outputs_[0];
132  return lastFrame_[0];
133 }
134 
135 inline StkFrames& Iir :: tick( StkFrames& frames, unsigned int channel )
136 {
137 #if defined(_STK_DEBUG_)
138  if ( channel >= frames.channels() ) {
139  oStream_ << "Iir::tick(): channel and StkFrames arguments are incompatible!";
140  handleError( StkError::FUNCTION_ARGUMENT );
141  }
142 #endif
143 
144  StkFloat *samples = &frames[channel];
145  size_t i;
146  unsigned int hop = frames.channels();
147  for ( unsigned int j=0; j<frames.frames(); j++, samples += hop ) {
148  outputs_[0] = 0.0;
149  inputs_[0] = gain_ * *samples;
150  for ( i=b_.size()-1; i>0; i-- ) {
151  outputs_[0] += b_[i] * inputs_[i];
152  inputs_[i] = inputs_[i-1];
153  }
154  outputs_[0] += b_[0] * inputs_[0];
155 
156  for ( i=a_.size()-1; i>0; i-- ) {
157  outputs_[0] += -a_[i] * outputs_[i];
158  outputs_[i] = outputs_[i-1];
159  }
160 
161  *samples = outputs_[0];
162  }
163 
164  lastFrame_[0] = *(samples-hop);
165  return frames;
166 }
167 
168 inline StkFrames& Iir :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
169 {
170 #if defined(_STK_DEBUG_)
171  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
172  oStream_ << "Iir::tick(): channel and StkFrames arguments are incompatible!";
173  handleError( StkError::FUNCTION_ARGUMENT );
174  }
175 #endif
176 
177  StkFloat *iSamples = &iFrames[iChannel];
178  StkFloat *oSamples = &oFrames[oChannel];
179  size_t i;
180  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
181  for ( unsigned int j=0; j<iFrames.frames(); j++, iSamples += iHop, oSamples += oHop ) {
182  outputs_[0] = 0.0;
183  inputs_[0] = gain_ * *iSamples;
184  for ( i=b_.size()-1; i>0; i-- ) {
185  outputs_[0] += b_[i] * inputs_[i];
186  inputs_[i] = inputs_[i-1];
187  }
188  outputs_[0] += b_[0] * inputs_[0];
189 
190  for ( i=a_.size()-1; i>0; i-- ) {
191  outputs_[0] += -a_[i] * outputs_[i];
192  outputs_[i] = outputs_[i-1];
193  }
194 
195  *oSamples = outputs_[0];
196  }
197 
198  lastFrame_[0] = *(oSamples-oHop);
199  return iFrames;
200 }
201 
202 } // stk namespace
203 
204 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/index.html0000644000076600007660000000612512327015206013650 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


The Synthesis ToolKit in C++ (STK)

Perry R. Cook & Gary P. Scavone

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 20 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)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/InetWvIn_8h_source.html0000644000076600007660000003731212327015203016222 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


InetWvIn.h
1 #ifndef STK_INETWVIN_H
2 #define STK_INETWVIN_H
3 
4 #include "WvIn.h"
5 #include "TcpServer.h"
6 #include "UdpSocket.h"
7 #include "Thread.h"
8 #include "Mutex.h"
9 
10 namespace stk {
11 
12 /***************************************************/
36 /***************************************************/
37 
38 typedef struct {
39  bool finished;
40  void *object;
41 } ThreadInfo;
42 
43 class InetWvIn : public WvIn
44 {
45 public:
47 
50  InetWvIn( unsigned long bufferFrames = 1024, unsigned int nBuffers = 8 );
51 
53  ~InetWvIn();
54 
56 
63  void listen( int port = 2006, unsigned int nChannels = 1,
64  Stk::StkFormat format = STK_SINT16,
65  Socket::ProtocolType protocol = Socket::PROTO_TCP );
66 
68 
72  bool isConnected( void );
73 
75 
84  StkFloat lastOut( unsigned int channel = 0 );
85 
87 
97  StkFloat tick( unsigned int channel = 0 );
98 
100 
109  StkFrames& tick( StkFrames& frames );
110 
111  // Called by the thread routine to receive data via the socket connection
112  // and fill the socket buffer. This is not intended for general use but
113  // must be public for access from the thread.
114  void receive( void );
115 
116 protected:
117 
118  // Read buffered socket data into the data buffer ... will block if none available.
119  int readData( void );
120 
121  Socket *soket_;
122  Thread thread_;
123  Mutex mutex_;
124  char *buffer_;
125  unsigned long bufferFrames_;
126  unsigned long bufferBytes_;
127  unsigned long bytesFilled_;
128  unsigned int nBuffers_;
129  unsigned long writePoint_;
130  unsigned long readPoint_;
131  long bufferCounter_;
132  int dataBytes_;
133  bool connected_;
134  int fd_;
135  ThreadInfo threadInfo_;
136  Stk::StkFormat dataType_;
137 
138 };
139 
140 inline StkFloat InetWvIn :: lastOut( unsigned int channel )
141 {
142 #if defined(_STK_DEBUG_)
143  if ( channel >= data_.channels() ) {
144  oStream_ << "InetWvIn::lastOut(): channel argument and data stream are incompatible!";
145  handleError( StkError::FUNCTION_ARGUMENT );
146  }
147 #endif
148 
149  // If no connection and we've output all samples in the queue, return.
150  if ( !connected_ && bytesFilled_ == 0 && bufferCounter_ == 0 ) return 0.0;
151 
152  return lastFrame_[channel];
153 }
154 
155 } // stk namespace
156 
157 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/InetWvOut_8h_source.html0000644000076600007660000002505712327015203016426 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


InetWvOut.h
1 #ifndef STK_INETWVOUT_H
2 #define STK_INETWVOUT_H
3 
4 #include "WvOut.h"
5 #include "Socket.h"
6 
7 namespace stk {
8 
9 /***************************************************/
30 /***************************************************/
31 
32 class InetWvOut : public WvOut
33 {
34  public:
36  InetWvOut( unsigned long packetFrames = 1024 );
37 
39 
42  InetWvOut( int port, Socket::ProtocolType protocol = Socket::PROTO_TCP,
43  std::string hostname = "localhost", unsigned int nChannels = 1, Stk::StkFormat format = STK_SINT16,
44  unsigned long packetFrames = 1024 );
45 
47  ~InetWvOut();
48 
50 
53  void connect( int port, Socket::ProtocolType protocol = Socket::PROTO_TCP,
54  std::string hostname = "localhost", unsigned int nChannels = 1, Stk::StkFormat format = STK_SINT16 );
55 
57  void disconnect( void );
58 
60 
65  void tick( const StkFloat sample );
66 
68 
77  void tick( const StkFrames& frames );
78 
79  protected:
80 
81  void incrementFrame( void );
82 
83  // Write a buffer of length frames via the socket connection.
84  void writeData( unsigned long frames );
85 
86  char *buffer_;
87  Socket *soket_;
88  unsigned long bufferFrames_;
89  unsigned long bufferBytes_;
90  unsigned long bufferIndex_;
91  unsigned long iData_;
92  unsigned int dataBytes_;
93  Stk::StkFormat dataType_;
94 };
95 
96 } // stk namespace
97 
98 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/information.html0000644000076600007660000002722612327015204015071 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


General Information

References

  • ICMC2005 Paper
    A paper by Gary and Perry detailing recent updates to the Synthesis ToolKit in C++.

  • ICMC99 Paper
    A not-so-recent paper by Perry and Gary about the Synthesis ToolKit in C++.

  • Book Chapter: Audio Anecdotes
    Here's a link to a book that includes an chapter on STK.

What is the Synthesis ToolKit?

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 20 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. 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 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. Snd, Cool Edit, Matlab).

What the Synthesis ToolKit is not.

The Synthesis Toolkit is not one particular program. Rather, it is a set of C++ classes that you can use to create your own programs. A few example applications are provided to demonstrate some of the ways to use the classes. If you have specific needs, you will probably have to either modify the example programs or write a new program altogether. Further, the example programs don't have a fancy GUI wrapper. It is easy to embed STK classes inside a GUI environment but we have chosen to focus our energy on the audio signal processing issues. Spending hundreds of hours making platform-dependent graphical user interfaces would go against one of the fundamental design goals of the ToolKit - platform independence.

For those instances where a simple GUI with sliders and buttons is helpful, we use Tcl/Tk (that is freely distributed for all the supported ToolKit platforms). A number of Tcl/Tk GUI scripts are distributed with the ToolKit release. For control, the Synthesis Toolkit uses raw MIDI (on supported platforms), and SKINI (Synthesis ToolKit Instrument Network Interface, a MIDI-like text message synthesis control format).

A brief history of the Synthesis ToolKit in C++.

Perry Cook began developing a pre-cursor to the Synthesis ToolKit (also called STK) under NeXTStep at the Center for Computer Research in Music and Acoustics (CCRMA) at Stanford University in the early-1990s. With his move to Princeton University in 1996, he ported everything to C++ on SGI hardware, added real-time capabilities, and greatly expanded the synthesis techniques available. With the help of Bill Putnam, Perry also made a port of STK to Windows95. Gary Scavone began using STK extensively in the summer of 1997 and completed a full port of STK to Linux early in 1998. He finished the fully compatable Windows port (using Direct Sound API) in June 1998. Numerous improvements and extensions have been made since then.

The Toolkit has been distributed continuously since 1996 via the Princeton Sound Kitchen, Perry Cook's home page at Princeton, Gary Scavone's home page at McGill University, and the Synthesis ToolKit home page. The ToolKit has been included in various collections of software. Much of it has also been ported to Max/MSP on Macintosh computers by Dan Trueman and Luke Dubois of Columbia University, and is distributed as PeRColate. Help on real-time sound and MIDI has been provided over the years by Tim Stilson, Bill Putnam, and Gabriel Maldonado.

Legal and Ethical Notes

This software was designed and created to be made publicly available 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.

Some of the concepts are covered by various patents, some known to us and likely others that are unknown. Many of the ones known to us are administered by the Stanford Office of Technology and Licensing. The good news is that large hunks of the techniques used here are public domain. To avoid subtle legal issues, we will not state what's freely useable here, but we will try to note within the various classes where certain things are likely to be protected by patents.

License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Disclaimer

STK is free and we do not guarantee anything. We've been hacking on this code for a while now and most of it seems to work pretty well. But, there surely are some bugs floating around. Sometimes things work fine on one computer platform but not so fine on another. FPU overflows and underflows cause very weird behavior that also depends on the particular CPU and OS. Let us know about bugs you find and we'll do our best to correct them.

Perry's Notes From the Original Distribution of STK

This whole world was created with no particular hardware in mind. These examples are intended to be tutorial in nature, as a platform for the continuation of my research, and as a possible starting point for a software synthesis system. The basic motivation was to create the necessary unit generators to do the synthesis, processing, and control that I want to do and teach about. Little thought for optimization was given and therefore improvements, especially speed enhancements, should be possible with these classes. It was written with some basic concepts in mind about how to let compilers optimize.

Your question at this point might be, "But Perry, with CMix, CMusic, CSound, CShells, CMonkeys, etc. already cluttering the landscape, why a new set of stupid C functions for music synthesis and processing?" The answers lie below.

  1. I needed to port many of the things I've done into something that is generic enough to port further to different machines.

  2. I really plan to document this stuff, so that you don't have to be me to figure out what's going on. (I'll probably be sorry I said this in a couple of years, when even I can't figure out what I was thinking.)

  3. The classic difficulties most people have in trying to implement physical models are:

    • They have trouble understanding the papers, and/or in turning the theory into practice.

    • The physical model instruments are a pain to get to oscillate, and coming up with stable and meaningful parameter values is required to get the models to work at all.

    This set of C++ unit generators and instruments might help to diminish the scores of emails I get asking what to do with those block diagrams I put in my papers.

  4. I wanted to try some new stuff with modal synthesis, and implement some classic FM patches as well.

  5. I wanted to reimplement, and newly implement more of the intelligent and physical performer models I've talked about in some of my papers. But I wanted to do it in a portable way, and in such a way that I can hook up modules quickly. I also wanted to make these instruments connectable to such player objects, so folks like Brad Garton who really think a lot about the players can connect them to my instruments, a lot about which I think.

  6. More rationalizations to follow ...

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Instrmnt_8h_source.html0000644000076600007660000003620512327015203016335 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Instrmnt.h
1 #ifndef STK_INSTRMNT_H
2 #define STK_INSTRMNT_H
3 
4 #include "Stk.h"
5 
6 namespace stk {
7 
8 /***************************************************/
17 /***************************************************/
18 
19 class Instrmnt : public Stk
20 {
21  public:
23  Instrmnt( void ) { lastFrame_.resize( 1, 1, 0.0 ); };
24 
26 
29  virtual void clear( void ) {};
30 
32  virtual void noteOn( StkFloat frequency, StkFloat amplitude ) = 0;
33 
35  virtual void noteOff( StkFloat amplitude ) = 0;
36 
38  virtual void setFrequency( StkFloat frequency );
39 
41  virtual void controlChange(int number, StkFloat value);
42 
44  unsigned int channelsOut( void ) const { return lastFrame_.channels(); };
45 
47  const StkFrames& lastFrame( void ) const { return lastFrame_; };
48 
50 
58  StkFloat lastOut( unsigned int channel = 0 );
59 
61 
64  virtual StkFloat tick( unsigned int channel = 0 ) = 0;
65 
67 
74  virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0;
75 
76  protected:
77 
78  StkFrames lastFrame_;
79 
80 };
81 
82 inline void Instrmnt :: setFrequency( StkFloat frequency )
83 {
84  oStream_ << "Instrmnt::setFrequency: virtual setFrequency function call!";
85  handleError( StkError::WARNING );
86 }
87 
88 inline StkFloat Instrmnt :: lastOut( unsigned int channel )
89 {
90 #if defined(_STK_DEBUG_)
91  if ( channel >= lastFrame_.channels() ) {
92  oStream_ << "Instrmnt::lastOut(): channel argument is invalid!";
93  handleError( StkError::FUNCTION_ARGUMENT );
94  }
95 #endif
96 
97  return lastFrame_[channel];
98 }
99 
100 inline void Instrmnt :: controlChange( int number, StkFloat value )
101 {
102  oStream_ << "Instrmnt::controlChange: virtual function call!";
103  handleError( StkError::WARNING );
104 }
105 
106 } // stk namespace
107 
108 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/instruments.html0000644000076600007660000003121012327015204015123 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Instruments

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.

// bethree.cpp STK tutorial program
#include "BeeThree.h"
#include "RtAudio.h"
using namespace stk;
// The TickData structure holds all the class instances and data that
// are shared by the various processing functions.
struct TickData {
Instrmnt *instrument;
StkFloat frequency;
StkFloat scaler;
long counter;
bool done;
// Default constructor.
TickData()
: instrument(0), scaler(1.0), counter(0), done( false ) {}
};
// This tick() function handles sample computation only. It will be
// called automatically when the system needs a new buffer of audio
// samples.
int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
double streamTime, RtAudioStreamStatus status, void *userData )
{
TickData *data = (TickData *) userData;
register StkFloat *samples = (StkFloat *) outputBuffer;
for ( unsigned int i=0; i<nBufferFrames; i++ ) {
*samples++ = data->instrument->tick();
if ( ++data->counter % 2000 == 0 ) {
data->scaler += 0.025;
data->instrument->setFrequency( data->frequency * data->scaler );
}
}
if ( data->counter > 80000 )
data->done = true;
return 0;
}
int main()
{
// Set the global sample rate and rawwave path before creating class instances.
Stk::setSampleRate( 44100.0 );
Stk::setRawwavePath( "../../rawwaves/" );
TickData data;
RtAudio dac;
// Figure out how many bytes in an StkFloat and setup the RtAudio stream.
parameters.deviceId = dac.getDefaultOutputDevice();
parameters.nChannels = 1;
RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32;
unsigned int bufferFrames = RT_BUFFER_SIZE;
try {
dac.openStream( &parameters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&data );
}
catch ( RtAudioError& error ) {
error.printMessage();
goto cleanup;
}
try {
// Define and load the BeeThree instrument
data.instrument = new BeeThree();
}
catch ( StkError & ) {
goto cleanup;
}
data.frequency = 220.0;
data.instrument->noteOn( data.frequency, 0.5 );
try {
dac.startStream();
}
catch ( RtAudioError &error ) {
error.printMessage();
goto cleanup;
}
// Block waiting until callback signals done.
while ( !data.done )
Stk::sleep( 100 );
// Shut down the callback and output stream.
try {
dac.closeStream();
}
catch ( RtAudioError &error ) {
error.printMessage();
}
cleanup:
delete data.instrument;
return 0;
}

We have used an Instrmnt pointer when referencing the BeeThree instance above, so it would be simple to replace the BeeThree class 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., 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.

[Main tutorial page]   [Next tutorial]


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/JCRev_8h_source.html0000644000076600007660000005225512327015203015473 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


JCRev.h
1 #ifndef STK_JCREV_H
2 #define STK_JCREV_H
3 
4 #include "Effect.h"
5 #include "Delay.h"
6 #include "OnePole.h"
7 
8 namespace stk {
9 
10 /***************************************************/
29 /***************************************************/
30 
31 class JCRev : public Effect
32 {
33  public:
35  JCRev( StkFloat T60 = 1.0 );
36 
38  void clear( void );
39 
41  void setT60( StkFloat T60 );
42 
44 
52  StkFloat lastOut( unsigned int channel = 0 );
53 
55 
62  StkFloat tick( StkFloat input, unsigned int channel = 0 );
63 
65 
74  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
75 
77 
86  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
87 
88  protected:
89 
90  Delay allpassDelays_[3];
91  Delay combDelays_[4];
92  OnePole combFilters_[4];
93  Delay outLeftDelay_;
94  Delay outRightDelay_;
95  StkFloat allpassCoefficient_;
96  StkFloat combCoefficient_[4];
97 
98 };
99 
100 inline StkFloat JCRev :: lastOut( unsigned int channel )
101 {
102 #if defined(_STK_DEBUG_)
103  if ( channel > 1 ) {
104  oStream_ << "JCRev::lastOut(): channel argument must be less than 2!";
105  handleError( StkError::FUNCTION_ARGUMENT );
106  }
107 #endif
108 
109  return lastFrame_[channel];
110 }
111 
112 inline StkFloat JCRev :: tick( StkFloat input, unsigned int channel )
113 {
114 #if defined(_STK_DEBUG_)
115  if ( channel > 1 ) {
116  oStream_ << "JCRev::tick(): channel argument must be less than 2!";
117  handleError( StkError::FUNCTION_ARGUMENT );
118  }
119 #endif
120 
121  StkFloat temp, temp0, temp1, temp2, temp3, temp4, temp5, temp6;
122  StkFloat filtout;
123 
124  temp = allpassDelays_[0].lastOut();
125  temp0 = allpassCoefficient_ * temp;
126  temp0 += input;
127  allpassDelays_[0].tick(temp0);
128  temp0 = -(allpassCoefficient_ * temp0) + temp;
129 
130  temp = allpassDelays_[1].lastOut();
131  temp1 = allpassCoefficient_ * temp;
132  temp1 += temp0;
133  allpassDelays_[1].tick(temp1);
134  temp1 = -(allpassCoefficient_ * temp1) + temp;
135 
136  temp = allpassDelays_[2].lastOut();
137  temp2 = allpassCoefficient_ * temp;
138  temp2 += temp1;
139  allpassDelays_[2].tick(temp2);
140  temp2 = -(allpassCoefficient_ * temp2) + temp;
141 
142  temp3 = temp2 + ( combFilters_[0].tick( combCoefficient_[0] * combDelays_[0].lastOut() ) );
143  temp4 = temp2 + ( combFilters_[1].tick( combCoefficient_[1] * combDelays_[1].lastOut() ) );
144  temp5 = temp2 + ( combFilters_[2].tick( combCoefficient_[2] * combDelays_[2].lastOut() ) );
145  temp6 = temp2 + ( combFilters_[3].tick( combCoefficient_[3] * combDelays_[3].lastOut() ) );
146 
147  combDelays_[0].tick(temp3);
148  combDelays_[1].tick(temp4);
149  combDelays_[2].tick(temp5);
150  combDelays_[3].tick(temp6);
151 
152  filtout = temp3 + temp4 + temp5 + temp6;
153 
154  lastFrame_[0] = effectMix_ * (outLeftDelay_.tick(filtout));
155  lastFrame_[1] = effectMix_ * (outRightDelay_.tick(filtout));
156  temp = (1.0 - effectMix_) * input;
157  lastFrame_[0] += temp;
158  lastFrame_[1] += temp;
159 
160  return 0.7 * lastFrame_[channel];
161 }
162 
163 } // stk namespace
164 
165 #endif
166 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/JetTable_8h_source.html0000644000076600007660000004113312327015203016205 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


JetTable.h
1 #ifndef STK_JETTABL_H
2 #define STK_JETTABL_H
3 
4 #include "Function.h"
5 
6 namespace stk {
7 
8 /***************************************************/
21 /***************************************************/
22 
23 class JetTable : public Function
24 {
25 public:
26 
28  StkFloat tick( StkFloat input );
29 
31 
39  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
40 
42 
50  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
51 
52 };
53 
54 inline StkFloat JetTable :: tick( StkFloat input )
55 {
56  // Perform "table lookup" using a polynomial
57  // calculation (x^3 - x), which approximates
58  // the jet sigmoid behavior.
59  lastFrame_[0] = input * (input * input - 1.0);
60 
61  // Saturate at +/- 1.0.
62  if ( lastFrame_[0] > 1.0 ) lastFrame_[0] = 1.0;
63  if ( lastFrame_[0] < -1.0 ) lastFrame_[0] = -1.0;
64  return lastFrame_[0];
65 }
66 
67 inline StkFrames& JetTable :: tick( StkFrames& frames, unsigned int channel )
68 {
69 #if defined(_STK_DEBUG_)
70  if ( channel >= frames.channels() ) {
71  oStream_ << "JetTable::tick(): channel and StkFrames arguments are incompatible!";
72  handleError( StkError::FUNCTION_ARGUMENT );
73  }
74 #endif
75 
76  StkFloat *samples = &frames[channel];
77  unsigned int hop = frames.channels();
78  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
79  *samples = *samples * (*samples * *samples - 1.0);
80  if ( *samples > 1.0) *samples = 1.0;
81  if ( *samples < -1.0) *samples = -1.0;
82  }
83 
84  lastFrame_[0] = *(samples-hop);
85  return frames;
86 }
87 
88 inline StkFrames& JetTable :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
89 {
90 #if defined(_STK_DEBUG_)
91  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
92  oStream_ << "JetTable::tick(): channel and StkFrames arguments are incompatible!";
93  handleError( StkError::FUNCTION_ARGUMENT );
94  }
95 #endif
96 
97  StkFloat *iSamples = &iFrames[iChannel];
98  StkFloat *oSamples = &oFrames[oChannel];
99  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
100  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
101  *oSamples = *oSamples * (*oSamples * *oSamples - 1.0);
102  if ( *oSamples > 1.0) *oSamples = 1.0;
103  if ( *oSamples < -1.0) *oSamples = -1.0;
104  }
105 
106  lastFrame_[0] = *(oSamples-oHop);
107  return iFrames;
108 }
109 
110 } // stk namespace
111 
112 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/jquery.js0000644000076600007660000026726112327015202013536 0ustar gary/*! jQuery v1.7.1 jquery.com | jquery.org/license */ (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")), f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() {for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c) {if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); stk-4.5.0/doc/html/LentPitShift_8h_source.html0000644000076600007660000011741712327015203017101 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


LentPitShift.h
1 #ifndef STK_LENTPITSHIFT_H
2 #define STK_LENTPITSHIFT_H
3 
4 #include "Effect.h"
5 #include "Delay.h"
6 
7 namespace stk {
8 
9 /***************************************************/
18 /***************************************************/
19 
20 class LentPitShift : public Effect
21 {
22  public:
24  LentPitShift( StkFloat periodRatio = 1.0, int tMax = RT_BUFFER_SIZE );
25 
26  ~LentPitShift( void ) {
27  delete window;
28  delete dt;
29  delete dpt;
30  delete cumDt;
31  }
32 
34  void clear( void );
35 
37  void setShift( StkFloat shift );
38 
40  StkFloat tick( StkFloat input );
41 
43 
51  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
52 
54 
62  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
63 
64  protected:
65 
67 
71  void process( );
72 
73  // Frame storage vectors for process function
74  StkFrames inputFrames;
75  StkFrames outputFrames;
76  int ptrFrames; // writing pointer
77 
78  // Input delay line
79  Delay inputLine_;
80  int inputPtr;
81 
82  // Output delay line
83  Delay outputLine_;
84  double outputPtr;
85 
86  // Pitch tracker variables
87  unsigned long tMax_; // Maximal period measurable by the pitch tracker.
88  // It is also the size of the window used by the pitch tracker and
89  // the size of the frames that can be computed by the tick function
90 
91  StkFloat threshold_; // Threshold of detection for the pitch tracker
92  unsigned long lastPeriod_; // Result of the last pitch tracking loop
93  StkFloat* dt; // Array containing the euclidian distance coefficients
94  StkFloat* cumDt; // Array containing the cumulative sum of the coefficients in dt
95  StkFloat* dpt; // Array containing the pitch tracking function coefficients
96 
97  // Pitch shifter variables
98  StkFloat env[2]; // Coefficients for the linear interpolation when modifying the output samples
99  StkFloat* window; // Hamming window used for the input portion extraction
100  double periodRatio_; // Ratio of modification of the signal period
101  StkFrames zeroFrame; // Frame of tMax_ zero samples
102 
103 
104  // Coefficient delay line that could be used for a dynamic calculation of the pitch
105  //Delay* coeffLine_;
106 
107 };
108 
110 {
111  StkFloat x_t; // input coefficient
112  StkFloat x_t_T; // previous input coefficient at T samples
113  StkFloat coeff; // new coefficient for the difference function
114 
115  unsigned long alternativePitch = tMax_; // Global minimum storage
116  lastPeriod_ = tMax_+1; // Storage of the lowest local minimum under the threshold
117 
118  // Loop variables
119  unsigned long delay_;
120  unsigned int n;
121 
122  // Initialization of the dt coefficients. Since the
123  // frames are of tMax_ length, there is no overlapping
124  // between the successive windows where pitch tracking
125  // is performed.
126  for ( delay_=1; delay_<=tMax_; delay_++ )
127  dt[delay_] = 0.;
128 
129  // Calculation of the dt coefficients and update of the input delay line.
130  for ( n=0; n<inputFrames.size(); n++ ) {
131  x_t = inputLine_.tick( inputFrames[ n ] );
132  for ( delay_=1; delay_<= tMax_; delay_++ ) {
133  x_t_T = inputLine_.tapOut( delay_ );
134  coeff = x_t - x_t_T;
135  dt[delay_] += coeff * coeff;
136  }
137  }
138 
139  // Calculation of the pitch tracking function and test for the minima.
140  for ( delay_=1; delay_<=tMax_; delay_++ ) {
141  cumDt[delay_] = dt[delay_] + cumDt[delay_-1];
142  dpt[delay_] = dt[delay_] * delay_ / cumDt[delay_];
143 
144  // Look for a minimum
145  if ( dpt[delay_-1]-dpt[delay_-2] < 0 && dpt[delay_]-dpt[delay_-1] > 0 ) {
146  // Check if the minimum is under the threshold
147  if ( dpt[delay_-1] < threshold_ ){
148  lastPeriod_ = delay_-1;
149  // If a minimum is found, we can stop the loop
150  break;
151  }
152  else if ( dpt[alternativePitch] > dpt[delay_-1] )
153  // Otherwise we store it if it is the current global minimum
154  alternativePitch = delay_-1;
155  }
156  }
157 
158  // Test for the last period length.
159  if ( dpt[delay_]-dpt[delay_-1] < 0 ) {
160  if ( dpt[delay_] < threshold_ )
161  lastPeriod_ = delay_;
162  else if ( dpt[alternativePitch] > dpt[delay_] )
163  alternativePitch = delay_;
164  }
165 
166  if ( lastPeriod_ == tMax_+1 )
167  // No period has been under the threshold so we used the global minimum
168  lastPeriod_ = alternativePitch;
169 
170  // We put the new zero output coefficients in the output delay line and
171  // we get the previous calculated coefficients
172  outputLine_.tick( zeroFrame, outputFrames );
173 
174  // Initialization of the Hamming window used in the algorithm
175  for ( int n=-(int)lastPeriod_; n<(int)lastPeriod_; n++ )
176  window[n+lastPeriod_] = (1 + cos(PI*n/lastPeriod_)) / 2 ;
177 
178  long M; // Index of reading in the input delay line
179  long N; // Index of writing in the output delay line
180  double sample; // Temporary storage for the new coefficient
181 
182  // We loop for all the frames of length lastPeriod_ presents between inputPtr and tMax_
183  for ( ; inputPtr<(int)(tMax_-lastPeriod_); inputPtr+=lastPeriod_ ) {
184  // Test for the decision of compression/expansion
185  while ( outputPtr < inputPtr ) {
186  // Coefficients for the linear interpolation
187  env[1] = fmod( outputPtr + tMax_, 1.0 );
188  env[0] = 1.0 - env[1];
189  M = tMax_ - inputPtr + lastPeriod_ - 1; // New reading pointer
190  N = 2*tMax_ - (unsigned long)floor(outputPtr + tMax_) + lastPeriod_ - 1; // New writing pointer
191  for ( unsigned int j=0; j<2*lastPeriod_; j++,M--,N-- ) {
192  sample = inputLine_.tapOut(M) * window[j] / 2.;
193  // Linear interpolation
194  outputLine_.addTo(env[0] * sample, N);
195  outputLine_.addTo(env[1] * sample, N-1);
196  }
197  outputPtr = outputPtr + lastPeriod_ * periodRatio_; // new output pointer
198  }
199  }
200  // Shifting of the pointers waiting for the new frame of length tMax_.
201  outputPtr -= tMax_;
202  inputPtr -= tMax_;
203 }
204 
205 
206 inline StkFloat LentPitShift :: tick( StkFloat input )
207 {
208  StkFloat sample;
209 
210  inputFrames[ptrFrames] = input;
211 
212  sample = outputFrames[ptrFrames++];
213 
214  // Check for end condition
215  if ( ptrFrames == (int) inputFrames.size() ){
216  ptrFrames = 0;
217  process( );
218  }
219 
220  return sample;
221 }
222 
223 inline StkFrames& LentPitShift :: tick( StkFrames& frames, unsigned int channel )
224 {
225 #if defined(_STK_DEBUG_)
226  if ( channel >= frames.channels() ) {
227  oStream_ << "LentPitShift::tick(): channel and StkFrames arguments are incompatible!";
228  handleError( StkError::FUNCTION_ARGUMENT );
229  }
230 #endif
231 
232  StkFloat *samples = &frames[channel];
233  unsigned int hop = frames.channels();
234  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
235  *samples = tick( *samples );
236  }
237 
238  return frames;
239 }
240 
241 inline StkFrames& LentPitShift :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
242 {
243 #if defined(_STK_DEBUG_)
244  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
245  oStream_ << "LentPitShift::tick(): channel and StkFrames arguments are incompatible!";
246  handleError( StkError::FUNCTION_ARGUMENT );
247  }
248 #endif
249 
250  StkFloat *iSamples = &iFrames[iChannel];
251  StkFloat *oSamples = &oFrames[oChannel];
252  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
253  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
254  *oSamples = tick( *iSamples );
255  }
256 
257  return iFrames;
258 }
259 
260 } // stk namespace
261 
262 #endif
263 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/links.html0000644000076600007660000000535012327015204013656 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Miscellaneous Links

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/maillist.html0000644000076600007660000000442212327015204014353 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


The Mail List

An STK mailing list has been set up to facilitate communication among STK users. Subscribing to this list is your best way of keeping on top of new releases, bug fixes, and various user developments.

For answers to frequently asked questions, check the list archives.

To join send a message to <stk-request@ccrma.stanford.edu> with the contents: subscribe

To be removed from the list send a message to <stk-request@ccrma.stanford.edu> with the contents: unsubscribe


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Mandolin_8h_source.html0000644000076600007660000004517512327015203016266 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Mandolin.h
1 #ifndef STK_MANDOLIN_H
2 #define STK_MANDOLIN_H
3 
4 #include "Instrmnt.h"
5 #include "Twang.h"
6 #include "FileWvIn.h"
7 
8 namespace stk {
9 
10 /***************************************************/
36 /***************************************************/
37 
38 class Mandolin : public Instrmnt
39 {
40  public:
42  Mandolin( StkFloat lowestFrequency );
43 
45  ~Mandolin( void );
46 
48  void clear( void );
49 
51  void setDetune( StkFloat detune );
52 
54  void setBodySize( StkFloat size );
55 
57  void setPluckPosition( StkFloat position );
58 
60  void setFrequency( StkFloat frequency );
61 
63  void pluck( StkFloat amplitude );
64 
66  void pluck( StkFloat amplitude,StkFloat position );
67 
69  void noteOn( StkFloat frequency, StkFloat amplitude );
70 
72  void noteOff( StkFloat amplitude );
73 
75  void controlChange( int number, StkFloat value );
76 
78  StkFloat tick( unsigned int channel = 0 );
79 
81 
88  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
89 
90  protected:
91 
92  Twang strings_[2];
93  FileWvIn soundfile_[12];
94 
95  int mic_;
96  StkFloat detuning_;
97  StkFloat frequency_;
98  StkFloat pluckAmplitude_;
99 };
100 
101 inline StkFloat Mandolin :: tick( unsigned int )
102 {
103  StkFloat temp = 0.0;
104  if ( !soundfile_[mic_].isFinished() )
105  temp = soundfile_[mic_].tick() * pluckAmplitude_;
106 
107  lastFrame_[0] = strings_[0].tick( temp );
108  lastFrame_[0] += strings_[1].tick( temp );
109  lastFrame_[0] *= 0.2;
110 
111  return lastFrame_[0];
112 }
113 
114 inline StkFrames& Mandolin :: tick( StkFrames& frames, unsigned int channel )
115 {
116  unsigned int nChannels = lastFrame_.channels();
117 #if defined(_STK_DEBUG_)
118  if ( channel > frames.channels() - nChannels ) {
119  oStream_ << "Mandolin::tick(): channel and StkFrames arguments are incompatible!";
120  handleError( StkError::FUNCTION_ARGUMENT );
121  }
122 #endif
123 
124  StkFloat *samples = &frames[channel];
125  unsigned int j, hop = frames.channels() - nChannels;
126  if ( nChannels == 1 ) {
127  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
128  *samples++ = tick();
129  }
130  else {
131  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
132  *samples++ = tick();
133  for ( j=1; j<nChannels; j++ )
134  *samples++ = lastFrame_[j];
135  }
136  }
137 
138  return frames;
139 }
140 
141 } // stk namespace
142 
143 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/mcgill.gif0000644000076600007660000000734212327015321013611 0ustar garyGIF87aá0÷ÿ£¥ÿ½¾ÿ¾¿þÊËÿÌÍÿ’—ÿ“˜ÿ•™ý”˜ÿ¡¥ÿ¯²ÿ°³ý®±þ²µý±´ÿ¾Àÿ¿Âý½ÀÿËÍÿØÙþרþäåÿæçþåæÿXcÿeoÿgqýfpÿhqÿhrÿw€þwýv~ÿƒŠþ‚‰ÿ„‹ÿ…Œÿ†Œý…‹ÿ‡Žÿ‘˜ÿ“šý“˜ÿ•›ý”šÿ¡¦ÿ¢§ÿ£¨ÿ°µþ¯´ÿ½ÁÿËÎÿÌÏýÙÛÿ7IÿEUÿGUÿGWÿWcÿWdÿXeÿeqþq}ÿs~ÿt~ÿŒ–ÿŽ—þ¸½ÿØÛý×Úþæèÿóôÿôõýòóÿ3Iÿ4Hÿ4Jÿ7JÿEWÿ}Šÿ}ŒÿŠ—þŒ˜ÿ™£ÿ™¤ÿ×Ûÿ<ÿ=ý ;þ">ÿ#=þ;þ<ÿ>ÿ?ÿàåÿåéÿñóÿ1ÿ3ÿ?ÿ#KÿBeþbÿr‹ÿ ±ÿ¿ËÿÀËÿßåÿïòÿ1ÿ3ÿ4ý0ý2ÿ3ÿ4ÿ>ÿAý?þ@ÿAÿ Mÿ#Mÿ0Yÿ0Zý0Yÿ2Yÿ3Zÿ@eÿ@fÿBfÿPsþRsÿStÿ`ÿ`€ÿb€ÿpÿrÿ™þ˜ÿ™ÿ¥ÿ¦ÿ¥ÿ‘¦ÿŸ³ÿ ²ÿ¯¿ÿ°¿ÿ¿ÌÿÀÌÿÏÙÿÐÙÿàæÿßæÿóòþòñÿññþóóÿÿÿ,á0þC H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç™09ÉÈQI’0]Òô±¥Ë—0c lSÉÑ =oæŒÑ9gNÎ7tz¾'hA‰0É\Ê´©ÓP‘3&'O1X縙CÇê¢A…ÎôˆÍÓ³hÓBÄthŒ ]w~“ÃE‹ ¡„ê´B†Ÿsáüt#F%µˆ«ÅDôMÎLº¾Ù:GB¨&BI8 ƒC¨ovÂ=ÐUW:Ž£ÕäO΢‚Ò Š§ÐᆎÈÌ1“I!¦3Aj:ƒg¡Œ˜„æ¤qNOçrfL ò ^Ë¡RÌ‘3»*1³Åþô,ÔpS¤”—Tª4)©ÍÄ6É7#hPýAdÆTúÈÆÑ1Î ÅÕWn6`Oc¹§Ð"nˆ‡Y±±ÈaÑ‘‘Òc ‚Ü8x0¡L`…&4'Æ "rÇ ¡0!hs(°s„’Ã),€Án •sÊ!ø‡‚ý‡\^½6$±qÆsZͱ"”`b–&˜$BF“s,²PO¦•Ú@m x”‰ 9ÍÖÕXY2ÇÐÁD 8ׂ 0'a'Ð\)@Á;DÐxrÅ4DIfÊUNŒD b4è“\tì1ˆ˜9â\QÛÍaIBþm ¡UXdŒgOg ” VAyu"£6ØbäHO”p#%ðÉ:I@Á7|@ƒ9\ð™OM„BCZ¤p€'ˆÂQlC¬ ›_Å’ í±éOEý¡”Gä䆨xܦ%v„Ô½ÙÁªN‘D¨W¡ötP”üÕln’#=¥  B;üdh(0¤Â[o\Q |B oÄñF­ ÙÓN]½ëP"< Ô$i‚)Q; Ñ!Œ&… ¼]¢UUp(d³coœkѱsXa·G„bÄ\9~-PØ¡|]Ot€W‰7Œ×D‰UáN@3ÔþtlTœJkÔÆ€õd„í=Û%%דx 92OZW$¹aÔãqµWSùÄ¡cBÍ6Q!ÎUÔ Mâ9ebìxF‹èÔwN¯JäH¨Œ_tÉVcÈñ†Bû”Så1Ò+pXáóD¹ió‚… OÎ-ñVl]Md³h™7ÈNÅÅ.jïaÂaßâ!ïPšd$õkm"tìl:¹¯;è‚^!žh?y:ñeV!‚B'3xo®sNUæ áôä’Ëfw‘Aü/,tŠ~â°„8b‚\Ñ_Dv—“d“¢`PnЉxÂ'âyƒàƒa þ;éÐDŠIˆ¥} ÑMÚ€  8@è[&(1GP"Š1„hä¯ÅŒ¡@t¨  ƒr@Bä~-0þÒ“+Ô  8XÃP¬ÊŒ c(ÚP"q‹¡ÄP ÇI/„™D!8„=¼)fA6*âiÊš ÁÄ2P4 1A/ÒPœa‚aœ"R;7Üf—T(H0•“:dr&űÊ@<8$\Á$ãÞHlj”q‡äц¸&.`ID’S5À@Ž; b‡9AAkЉWΩ ;ˆF /ˆ&ê; ä9’Ù KÒÄ*«Œq Ý\Sí'–¬iD Y€®p€…o[H&ÒÄ „ ˜CЖX¡(µ>Ê3!ÓÌAgˆú‚2§9¬!#L¼Ä%Fr¯/Ø¡W2L k?FO#•8þe(.à|Å› Äp…† *"Rc­@Q¡œÀ’ pàAÔ' ð<AA!¤C'ŸlT –pÍlèV"i J¥„°æ”GÎÎ5¨e J(1Ò† Ä ’A( ƒäÎqÃ@,`€¾„]|È$†R¬nq v@#ÞÐÅKL†"ÈÄp÷L (‡o¸n(Ž…Ì ýLFÛ£WL“åPÒ„8ÓaQ"„Ü`.Y€ÖœX,p@@3Ñ‚¸ ’¸áŠAp‰2Ô DW%HV»Âªg¾)\K…;²M$…Èt Ë™;=«¬7#² p¹É x¤Ç•1*±B‚â†êNšÏg%ÒV`i†žÁ[oš Ê#$\:˜FŒÑT±%ü8µ. ­ Öˆ„8I` Øqj(%i)(AÈü;+?dEYwæþ0Mš$vÞt(„„51h˜ ‹4s$‚ ·0ºÄd$0B¼2DnÓ+n#À0ÌáHÐCh€U$làÍXD*r@R§I· ‚ÉïT^;ðìä·ÓÃ’B:+äA¹Þ½ "ª×pTtn@3d«"žk³wá‘@ &àܤ°ôCñûå+V™u(þ¦1 !‘z@!"$æÉ0Ák1 ¦éÊÌ] Va" ;,¿³×êÑÁš0½4¤ŠH>ží´;y3¹ ³Ð ¿áAÄ…ECh‡D‚Œ€Aä\À“tƒ`Z<>'wÐþâˆl¤±{ƒÓF(„@Ùñü…NC›ar  pAöQ‚ „ÃntHR¹–@šd»]í¦vc±>¸aíFzƒÀ’‚ ³Ò „@&¦r*ŒõÑR½Á*"h.I8_Á!†·âI ÐJk¡@S%mÐŽ Ýx™ ZÄx*±•Á zÇlp ”p$¡%ï# >!l•R„––)Ppx-°h#zñ^©€˜ˆax a)˜ˆ™˜2ñ„y |Š™’¹CàAa5™š¹™ ƒE"pœ9š¤)›ðfCsYš¬Ùš1Ðûæš´Y›¡ ¢i›ºy;stk-4.5.0/doc/html/Mesh2D_8h_source.html0000644000076600007660000004615012327015203015601 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Mesh2D.h
1 #ifndef STK_MESH2D_H
2 #define STK_MESH2D_H
3 
4 #include "Instrmnt.h"
5 #include "OnePole.h"
6 
7 namespace stk {
8 
9 /***************************************************/
33 /***************************************************/
34 
35 const unsigned short NXMAX = 12;
36 const unsigned short NYMAX = 12;
37 
38 class Mesh2D : public Instrmnt
39 {
40  public:
42  Mesh2D( unsigned short nX, unsigned short nY );
43 
45  ~Mesh2D( void );
46 
48  void clear( void );
49 
51  void setNX( unsigned short lenX );
52 
54  void setNY( unsigned short lenY );
55 
57  void setInputPosition( StkFloat xFactor, StkFloat yFactor );
58 
60  void setDecay( StkFloat decayFactor );
61 
63  void noteOn( StkFloat frequency, StkFloat amplitude );
64 
66  void noteOff( StkFloat amplitude );
67 
69  StkFloat energy( void );
70 
72  StkFloat inputTick( StkFloat input );
73 
75  void controlChange( int number, StkFloat value );
76 
78  StkFloat tick( unsigned int channel = 0 );
79 
81 
88  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
89 
90  protected:
91 
92  StkFloat tick0();
93  StkFloat tick1();
94  void clearMesh();
95 
96  unsigned short NX_, NY_;
97  unsigned short xInput_, yInput_;
98  OnePole filterX_[NXMAX];
99  OnePole filterY_[NYMAX];
100  StkFloat v_[NXMAX-1][NYMAX-1]; // junction velocities
101  StkFloat vxp_[NXMAX][NYMAX]; // positive-x velocity wave
102  StkFloat vxm_[NXMAX][NYMAX]; // negative-x velocity wave
103  StkFloat vyp_[NXMAX][NYMAX]; // positive-y velocity wave
104  StkFloat vym_[NXMAX][NYMAX]; // negative-y velocity wave
105 
106  // Alternate buffers
107  StkFloat vxp1_[NXMAX][NYMAX]; // positive-x velocity wave
108  StkFloat vxm1_[NXMAX][NYMAX]; // negative-x velocity wave
109  StkFloat vyp1_[NXMAX][NYMAX]; // positive-y velocity wave
110  StkFloat vym1_[NXMAX][NYMAX]; // negative-y velocity wave
111 
112  int counter_; // time in samples
113 };
114 
115 inline StkFrames& Mesh2D :: tick( StkFrames& frames, unsigned int channel )
116 {
117  unsigned int nChannels = lastFrame_.channels();
118 #if defined(_STK_DEBUG_)
119  if ( channel > frames.channels() - nChannels ) {
120  oStream_ << "Mesh2D::tick(): channel and StkFrames arguments are incompatible!";
121  handleError( StkError::FUNCTION_ARGUMENT );
122  }
123 #endif
124 
125  StkFloat *samples = &frames[channel];
126  unsigned int j, hop = frames.channels() - nChannels;
127  if ( nChannels == 1 ) {
128  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
129  *samples++ = tick();
130  }
131  else {
132  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
133  *samples++ = tick();
134  for ( j=1; j<nChannels; j++ )
135  *samples++ = lastFrame_[j];
136  }
137  }
138 
139  return frames;
140 }
141 
142 } // stk namespace
143 
144 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Messager_8h_source.html0000644000076600007660000003401512327015203016262 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Messager.h
1 #ifndef STK_MESSAGER_H
2 #define STK_MESSAGER_H
3 
4 #include "Stk.h"
5 #include "Skini.h"
6 #include <queue>
7 
8 #if defined(__STK_REALTIME__)
9 
10 #include "Mutex.h"
11 #include "Thread.h"
12 #include "TcpServer.h"
13 #include "RtMidi.h"
14 
15 #endif // __STK_REALTIME__
16 
17 namespace stk {
18 
19 /***************************************************/
51 /***************************************************/
52 
53 const int DEFAULT_QUEUE_LIMIT = 200;
54 
55 class Messager : public Stk
56 {
57  public:
58 
59  // This structure is used to share data among the various realtime
60  // messager threads. It must be public.
61  struct MessagerData {
62  Skini skini;
63  std::queue<Skini::Message> queue;
64  unsigned int queueLimit;
65  int sources;
66 
67 #if defined(__STK_REALTIME__)
68  Mutex mutex;
69  RtMidiIn *midi;
70  TcpServer *socket;
71  std::vector<int> fd;
72  fd_set mask;
73 #endif
74 
75  // Default constructor.
76  MessagerData()
77  :queueLimit(0), sources(0) {}
78  };
79 
81  Messager();
82 
84  ~Messager();
85 
87 
93  void popMessage( Skini::Message& message );
94 
96  void pushMessage( Skini::Message& message );
97 
99 
107  bool setScoreFile( const char* filename );
108 
109 #if defined(__STK_REALTIME__)
110 
111 
120  bool startStdInput();
121 
123 
134  bool startSocketInput( int port=2001 );
135 
137 
149  bool startMidiInput( int port=0 );
150 
151 #endif
152 
153  protected:
154 
155  MessagerData data_;
156 
157 #if defined(__STK_REALTIME__)
158  Thread stdinThread_;
159  Thread socketThread_;
160 #endif
161 
162 };
163 
164 } // stk namespace
165 
166 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/MidiFileIn_8h_source.html0000644000076600007660000003277412327015203016477 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


MidiFileIn.h
1 #ifndef STK_MIDIFILEIN_H
2 #define STK_MIDIFILEIN_H
3 
4 #include "Stk.h"
5 #include <string>
6 #include <vector>
7 #include <fstream>
8 #include <sstream>
9 
10 namespace stk {
11 
12 /**********************************************************************/
27 /**********************************************************************/
28 
29 class MidiFileIn : public Stk
30 {
31  public:
33 
37  MidiFileIn( std::string fileName );
38 
40  ~MidiFileIn();
41 
43  int getFileFormat() const { return format_; };
44 
46  unsigned int getNumberOfTracks() const { return nTracks_; };
47 
49 
54  int getDivision() const { return division_; };
55 
57 
61  void rewindTrack( unsigned int track = 0 );
62 
64 
71  double getTickSeconds( unsigned int track = 0 );
72 
74 
86  unsigned long getNextEvent( std::vector<unsigned char> *event, unsigned int track = 0 );
87 
89 
99  unsigned long getNextMidiEvent( std::vector<unsigned char> *midiEvent, unsigned int track = 0 );
100 
101  protected:
102 
103  // This protected class function is used for reading variable-length
104  // MIDI file values. It is assumed that this function is called with
105  // the file read pointer positioned at the start of a
106  // variable-length value. The function returns true if the value is
107  // successfully parsed. Otherwise, it returns false.
108  bool readVariableLength( unsigned long *value );
109 
110  std::ifstream file_;
111  unsigned int nTracks_;
112  int format_;
113  int division_;
114  bool usingTimeCode_;
115  std::vector<double> tickSeconds_;
116  std::vector<long> trackPointers_;
117  std::vector<long> trackOffsets_;
118  std::vector<long> trackLengths_;
119  std::vector<char> trackStatus_;
120 
121  // This structure and the following variables are used to save and
122  // keep track of a format 1 tempo map (and the initial tickSeconds
123  // parameter for formats 0 and 2).
124  struct TempoChange {
125  unsigned long count;
126  double tickSeconds;
127  };
128  std::vector<TempoChange> tempoEvents_;
129  std::vector<unsigned long> trackCounters_;
130  std::vector<unsigned int> trackTempoIndex_;
131 };
132 
133 } // stk namespace
134 
135 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Modal_8h_source.html0000644000076600007660000005455612327015203015564 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Modal.h
1 #ifndef STK_MODAL_H
2 #define STK_MODAL_H
3 
4 #include "Instrmnt.h"
5 #include "Envelope.h"
6 #include "FileLoop.h"
7 #include "SineWave.h"
8 #include "BiQuad.h"
9 #include "OnePole.h"
10 
11 namespace stk {
12 
13 /***************************************************/
24 /***************************************************/
25 
26 class Modal : public Instrmnt
27 {
28 public:
30 
33  Modal( unsigned int modes = 4 );
34 
36  virtual ~Modal( void );
37 
39  void clear( void );
40 
42  virtual void setFrequency( StkFloat frequency );
43 
45  void setRatioAndRadius( unsigned int modeIndex, StkFloat ratio, StkFloat radius );
46 
48  void setMasterGain( StkFloat aGain ) { masterGain_ = aGain; };
49 
51  void setDirectGain( StkFloat aGain ) { directGain_ = aGain; };
52 
54  void setModeGain( unsigned int modeIndex, StkFloat gain );
55 
57  virtual void strike( StkFloat amplitude );
58 
60  void damp( StkFloat amplitude );
61 
63  void noteOn( StkFloat frequency, StkFloat amplitude );
64 
66  void noteOff( StkFloat amplitude );
67 
69  virtual void controlChange( int number, StkFloat value ) = 0;
70 
72  StkFloat tick( unsigned int channel = 0 );
73 
75 
82  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
83 
84 protected:
85 
86  Envelope envelope_;
87  FileWvIn *wave_;
88  BiQuad **filters_;
89  OnePole onepole_;
90  SineWave vibrato_;
91 
92  unsigned int nModes_;
93  std::vector<StkFloat> ratios_;
94  std::vector<StkFloat> radii_;
95 
96  StkFloat vibratoGain_;
97  StkFloat masterGain_;
98  StkFloat directGain_;
99  StkFloat stickHardness_;
100  StkFloat strikePosition_;
101  StkFloat baseFrequency_;
102 };
103 
104 inline StkFloat Modal :: tick( unsigned int )
105 {
106  StkFloat temp = masterGain_ * onepole_.tick( wave_->tick() * envelope_.tick() );
107 
108  StkFloat temp2 = 0.0;
109  for ( unsigned int i=0; i<nModes_; i++ )
110  temp2 += filters_[i]->tick(temp);
111 
112  temp2 -= temp2 * directGain_;
113  temp2 += directGain_ * temp;
114 
115  if ( vibratoGain_ != 0.0 ) {
116  // Calculate AM and apply to master out
117  temp = 1.0 + ( vibrato_.tick() * vibratoGain_ );
118  temp2 = temp * temp2;
119  }
120 
121  lastFrame_[0] = temp2;
122  return lastFrame_[0];
123 }
124 
125 inline StkFrames& Modal :: tick( StkFrames& frames, unsigned int channel )
126 {
127  unsigned int nChannels = lastFrame_.channels();
128 #if defined(_STK_DEBUG_)
129  if ( channel > frames.channels() - nChannels ) {
130  oStream_ << "Modal::tick(): channel and StkFrames arguments are incompatible!";
131  handleError( StkError::FUNCTION_ARGUMENT );
132  }
133 #endif
134 
135  StkFloat *samples = &frames[channel];
136  unsigned int j, hop = frames.channels() - nChannels;
137  if ( nChannels == 1 ) {
138  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
139  *samples++ = tick();
140  }
141  else {
142  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
143  *samples++ = tick();
144  for ( j=1; j<nChannels; j++ )
145  *samples++ = lastFrame_[j];
146  }
147  }
148 
149  return frames;
150 }
151 
152 } // stk namespace
153 
154 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/ModalBar_8h_source.html0000644000076600007660000001455612327015203016205 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


ModalBar.h
1 #ifndef STK_MODALBAR_H
2 #define STK_MODALBAR_H
3 
4 #include "Modal.h"
5 
6 namespace stk {
7 
8 /***************************************************/
36 /***************************************************/
37 
38 class ModalBar : public Modal
39 {
40 public:
42  ModalBar( void );
43 
45  ~ModalBar( void );
46 
48  void setStickHardness( StkFloat hardness );
49 
51  void setStrikePosition( StkFloat position );
52 
54  void setPreset( int preset );
55 
57  void setModulationDepth( StkFloat mDepth );
58 
60  void controlChange( int number, StkFloat value );
61 };
62 
63 } // stk namespace
64 
65 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Modulate_8h_source.html0000644000076600007660000003776512327015203016305 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Modulate.h
1 #ifndef STK_MODULATE_H
2 #define STK_MODULATE_H
3 
4 #include "Generator.h"
5 #include "SineWave.h"
6 #include "Noise.h"
7 #include "OnePole.h"
8 
9 namespace stk {
10 
11 /***************************************************/
21 /***************************************************/
22 
23 class Modulate : public Generator
24 {
25  public:
27 
30  Modulate( void );
31 
33  ~Modulate( void );
34 
36  void reset( void ) { lastFrame_[0] = 0.0; };
37 
39  void setVibratoRate( StkFloat rate ) { vibrato_.setFrequency( rate ); };
40 
42  void setVibratoGain( StkFloat gain ) { vibratoGain_ = gain; };
43 
45  void setRandomGain( StkFloat gain );
46 
48  StkFloat lastOut( void ) const { return lastFrame_[0]; };
49 
51  StkFloat tick( void );
52 
54 
61  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
62 
63  protected:
64 
65  void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
66 
67  SineWave vibrato_;
68  Noise noise_;
69  OnePole filter_;
70  StkFloat vibratoGain_;
71  StkFloat randomGain_;
72  unsigned int noiseRate_;
73  unsigned int noiseCounter_;
74 
75 };
76 
77 inline StkFloat Modulate :: tick( void )
78 {
79  // Compute periodic and random modulations.
80  lastFrame_[0] = vibratoGain_ * vibrato_.tick();
81  if ( noiseCounter_++ >= noiseRate_ ) {
82  noise_.tick();
83  noiseCounter_ = 0;
84  }
85  lastFrame_[0] += filter_.tick( noise_.lastOut() );
86  return lastFrame_[0];
87 }
88 
89 inline StkFrames& Modulate :: tick( StkFrames& frames, unsigned int channel )
90 {
91 #if defined(_STK_DEBUG_)
92  if ( channel >= frames.channels() ) {
93  oStream_ << "Modulate::tick(): channel and StkFrames arguments are incompatible!";
94  handleError( StkError::FUNCTION_ARGUMENT );
95  }
96 #endif
97 
98  StkFloat *samples = &frames[channel];
99  unsigned int hop = frames.channels();
100  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
101  *samples = Modulate::tick();
102 
103  return frames;
104 }
105 
106 } // stk namespace
107 
108 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Moog_8h_source.html0000644000076600007660000004204612327015203015420 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Moog.h
1 #ifndef STK_MOOG_H
2 #define STK_MOOG_H
3 
4 #include "Sampler.h"
5 #include "FormSwep.h"
6 
7 namespace stk {
8 
9 /***************************************************/
27 /***************************************************/
28 
29 class Moog : public Sampler
30 {
31  public:
33 
36  Moog( void );
37 
39  ~Moog( void );
40 
42  void setFrequency( StkFloat frequency );
43 
45  void noteOn( StkFloat frequency, StkFloat amplitude );
46 
48  void setModulationSpeed( StkFloat mSpeed ) { loops_[1]->setFrequency( mSpeed ); };
49 
51  void setModulationDepth( StkFloat mDepth ) { modDepth_ = mDepth * 0.5; };
52 
54  void controlChange( int number, StkFloat value );
55 
57  StkFloat tick( unsigned int channel = 0 );
58 
60 
67  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
68 
69  protected:
70 
71  FormSwep filters_[2];
72  StkFloat modDepth_;
73  StkFloat filterQ_;
74  StkFloat filterRate_;
75 
76 };
77 
78 inline StkFloat Moog :: tick( unsigned int )
79 {
80  StkFloat temp;
81 
82  if ( modDepth_ != 0.0 ) {
83  temp = loops_[1]->tick() * modDepth_;
84  loops_[0]->setFrequency( baseFrequency_ * (1.0 + temp) );
85  }
86 
87  temp = attackGain_ * attacks_[0]->tick();
88  temp += loopGain_ * loops_[0]->tick();
89  temp = filter_.tick( temp );
90  temp *= adsr_.tick();
91  temp = filters_[0].tick( temp );
92  lastFrame_[0] = filters_[1].tick( temp );
93  return lastFrame_[0] * 6.0;
94 }
95 
96 inline StkFrames& Moog :: tick( StkFrames& frames, unsigned int channel )
97 {
98  unsigned int nChannels = lastFrame_.channels();
99 #if defined(_STK_DEBUG_)
100  if ( channel > frames.channels() - nChannels ) {
101  oStream_ << "Moog::tick(): channel and StkFrames arguments are incompatible!";
102  handleError( StkError::FUNCTION_ARGUMENT );
103  }
104 #endif
105 
106  StkFloat *samples = &frames[channel];
107  unsigned int j, hop = frames.channels() - nChannels;
108  if ( nChannels == 1 ) {
109  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
110  *samples++ = tick();
111  }
112  else {
113  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
114  *samples++ = tick();
115  for ( j=1; j<nChannels; j++ )
116  *samples++ = lastFrame_[j];
117  }
118  }
119 
120  return frames;
121 }
122 
123 } // stk namespace
124 
125 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/multichannel.html0000644000076600007660000001730712327015204015226 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Multi-Channel I/O

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 sample frame. 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 tick() function. For classes supporting multi-channel data, one must distinguish the tick() functions taking or producing single StkFloat arguments from those taking stk::StkFrames& arguments. If a single-sample version of the tick() 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 tick() 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 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 tick() 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 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.

// foursine.cpp STK tutorial program
#include "SineWave.h"
#include "FileWvOut.h"
#include <cstdlib>
using namespace stk;
int main()
{
// Set the global sample rate before creating class instances.
Stk::setSampleRate( 44100.0 );
int i;
FileWvOut output;
SineWave inputs[4];
// Set the sine wave frequencies.
for ( i=0; i<4; i++ )
inputs[i].setFrequency( 220.0 * (i+1) );
// Define and open a 16-bit, four-channel AIFF formatted output file
try {
output.openFile( "foursine.aif", 4, FileWrite::FILE_AIF, Stk::STK_SINT16 );
}
catch (StkError &) {
exit( 1 );
}
// Write two seconds of four sines to the output file
StkFrames frames( 88200, 4 );
for ( i=0; i<4; i++ )
inputs[i].tick( frames, i );
output.tick( frames );
// Now write the first sine to all four channels for two seconds
for ( i=0; i<88200; i++ ) {
output.tick( inputs[0].tick() );
}
return 0;
}

[Main tutorial page]   [Next tutorial]


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Mutex_8h_source.html0000644000076600007660000002071212327015203015615 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Mutex.h
1 #ifndef STK_MUTEX_H
2 #define STK_MUTEX_H
3 
4 #include "Stk.h"
5 
6 #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
7 
8  #include <pthread.h>
9  typedef pthread_mutex_t MUTEX;
10  typedef pthread_cond_t CONDITION;
11 
12 #elif defined(__OS_WINDOWS__)
13 
14  #include <windows.h>
15  #include <process.h>
16  typedef CRITICAL_SECTION MUTEX;
17  typedef HANDLE CONDITION;
18 
19 #endif
20 
21 namespace stk {
22 
23 /***************************************************/
34 /***************************************************/
35 
36 class Mutex : public Stk
37 {
38  public:
40  Mutex();
41 
43  ~Mutex();
44 
46  void lock(void);
47 
49  void unlock(void);
50 
52 
56  void wait(void);
57 
59 
63  void signal(void);
64 
65  protected:
66 
67  MUTEX mutex_;
68  CONDITION condition_;
69 
70 };
71 
72 } // stk namespace
73 
74 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/namespaces.html0000644000076600007660000000332712327015206014661 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Namespace List
Here is a list of all documented namespaces with brief descriptions:
\NstkThe STK namespace

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/namespacestk.html0000644000076600007660000014036312327015204015220 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk Namespace Reference

The STK namespace. More...

Classes

class  ADSR
 STK ADSR envelope class. More...
 
class  Asymp
 STK asymptotic curve envelope class. More...
 
class  BandedWG
 Banded waveguide modeling class. More...
 
class  BeeThree
 STK Hammond-oid organ FM synthesis instrument. More...
 
class  BiQuad
 STK biquad (two-pole, two-zero) filter class. More...
 
class  Blit
 STK band-limited impulse train class. More...
 
class  BlitSaw
 STK band-limited sawtooth wave class. More...
 
class  BlitSquare
 STK band-limited square wave class. More...
 
class  BlowBotl
 STK blown bottle instrument class. More...
 
class  BlowHole
 STK clarinet physical model with one register hole and one tonehole. More...
 
class  Bowed
 STK bowed string instrument class. More...
 
class  BowTable
 STK bowed string table class. More...
 
class  Brass
 STK simple brass instrument class. More...
 
class  Chorus
 STK chorus effect class. More...
 
class  Clarinet
 STK clarinet physical model class. More...
 
class  Cubic
 STK cubic non-linearity class. More...
 
class  Delay
 STK non-interpolating delay line class. More...
 
class  DelayA
 STK allpass interpolating delay line class. More...
 
class  DelayL
 STK linear interpolating delay line class. More...
 
class  Drummer
 STK drum sample player class. More...
 
class  Echo
 STK echo effect class. More...
 
class  Effect
 STK abstract effects parent class. More...
 
class  Envelope
 STK linear line envelope class. More...
 
class  FileLoop
 STK file looping / oscillator class. More...
 
class  FileRead
 STK audio file input class. More...
 
class  FileWrite
 STK audio file output class. More...
 
class  FileWvIn
 STK audio file input class. More...
 
class  FileWvOut
 STK audio file output class. More...
 
class  Filter
 STK abstract filter class. More...
 
class  Fir
 STK general finite impulse response filter class. More...
 
class  Flute
 STK flute physical model class. More...
 
class  FM
 STK abstract FM synthesis base class. More...
 
class  FMVoices
 STK singing FM synthesis instrument. More...
 
class  FormSwep
 STK sweepable formant filter class. More...
 
class  FreeVerb
 Jezar at Dreampoint's FreeVerb, implemented in STK. More...
 
class  Function
 STK abstract function parent class. More...
 
class  Generator
 STK abstract unit generator parent class. More...
 
class  Granulate
 STK granular synthesis class. More...
 
class  Guitar
 STK guitar model class. More...
 
class  HevyMetl
 STK heavy metal FM synthesis instrument. More...
 
class  Iir
 STK general infinite impulse response filter class. More...
 
class  InetWvIn
 STK internet streaming input class. More...
 
class  InetWvOut
 STK internet streaming output class. More...
 
class  Instrmnt
 STK instrument abstract base class. More...
 
class  JCRev
 John Chowning's reverberator class. More...
 
class  JetTable
 STK jet table class. More...
 
class  LentPitShift
 Pitch shifter effect class based on the Lent algorithm. More...
 
class  Mandolin
 STK mandolin instrument model class. More...
 
class  Mesh2D
 Two-dimensional rectilinear waveguide mesh class. More...
 
class  Messager
 STK input control message parser. More...
 
class  MidiFileIn
 A standard MIDI file reading/parsing class. More...
 
class  Modal
 STK resonance model abstract base class. More...
 
class  ModalBar
 STK resonant bar instrument class. More...
 
class  Modulate
 STK periodic/random modulator. More...
 
class  Moog
 STK moog-like swept filter sampling synthesis class. More...
 
class  Mutex
 STK mutex class. More...
 
class  Noise
 STK noise generator. More...
 
class  NRev
 CCRMA's NRev reverberator class. More...
 
class  OnePole
 STK one-pole filter class. More...
 
class  OneZero
 STK one-zero filter class. More...
 
class  PercFlut
 STK percussive flute FM synthesis instrument. More...
 
class  Phonemes
 STK phonemes table. More...
 
class  PitShift
 STK simple pitch shifter effect class. More...
 
class  Plucked
 STK basic plucked string class. More...
 
class  PoleZero
 STK one-pole, one-zero filter class. More...
 
class  PRCRev
 Perry's simple reverberator class. More...
 
class  ReedTable
 STK reed table class. More...
 
class  Resonate
 STK noise driven formant filter. More...
 
class  Rhodey
 STK Fender Rhodes electric piano FM synthesis instrument. More...
 
class  RtWvIn
 STK realtime audio (blocking) input class. More...
 
class  RtWvOut
 STK realtime audio (blocking) output class. More...
 
class  Sampler
 STK sampling synthesis abstract base class. More...
 
class  Saxofony
 STK faux conical bore reed instrument class. More...
 
class  Shakers
 PhISEM and PhOLIES class. More...
 
class  Simple
 STK wavetable/noise instrument. More...
 
class  SineWave
 STK sinusoid oscillator class. More...
 
class  SingWave
 STK "singing" looped soundfile class. More...
 
class  Sitar
 STK sitar string model class. More...
 
class  Skini
 STK SKINI parsing class. More...
 
class  Socket
 STK internet socket abstract base class. More...
 
class  Sphere
 STK sphere class. More...
 
class  StifKarp
 STK plucked stiff string instrument. More...
 
class  StkError
 STK error handling class. More...
 
class  Stk
 STK base class. More...
 
class  StkFrames
 An STK class to handle vectorized audio data. More...
 
class  TapDelay
 STK non-interpolating tapped delay line class. More...
 
class  TcpClient
 STK TCP socket client class. More...
 
class  TcpServer
 STK TCP socket server class. More...
 
class  Thread
 STK thread class. More...
 
class  TubeBell
 STK tubular bell (orchestral chime) FM synthesis instrument. More...
 
class  Twang
 STK enhanced plucked string class. More...
 
class  TwoPole
 STK two-pole filter class. More...
 
class  TwoZero
 STK two-zero filter class. More...
 
class  UdpSocket
 STK UDP socket server/client class. More...
 
class  Vector3D
 STK 3D vector class. More...
 
class  Voicer
 STK voice manager class. More...
 
class  VoicForm
 Four formant synthesis instrument. More...
 
class  Whistle
 STK police/referee whistle instrument class. More...
 
class  Wurley
 STK Wurlitzer electric piano FM synthesis instrument. More...
 
class  WvIn
 STK audio input abstract base class. More...
 
class  WvOut
 STK audio output abstract base class. More...
 

Detailed Description

The STK namespace.

Most Stk classes are defined within the STK namespace. Exceptions to this include the classes RtAudio and RtMidi.


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/nav_f.png0000644000076600007660000000023112327015202013436 0ustar gary‰PNG  IHDR8³»`IDATxíÝK€ EÑ–·[†øBÑmkâÄÂH—prÓ¼.‚Žó‚ꎤR6Z VI±E‚5j³„lóš›iI˜¬ÞêçJ0ŒÑÑ/Žû›™uøñóÞ¿6sH ÝõyIEND®B`‚stk-4.5.0/doc/html/nav_g.png0000644000076600007660000000013712327015202013444 0ustar gary‰PNG  IHDRô1&IDATxíÝ1 ÁOHf„á_ ->~¸åM iËMèÀƒS½ü‚<IEND®B`‚stk-4.5.0/doc/html/nav_h.png0000644000076600007660000000014212327015202013441 0ustar gary‰PNG  IHDR ,é@)IDATxíÝA @BQ­³šÛ›Ð¢Žáà) )ëý éaÅèÜ¿Æo‡RlÐßIEND®B`‚stk-4.5.0/doc/html/Noise_8h_source.html0000644000076600007660000002642412327015203015576 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Noise.h
1 #ifndef STK_NOISE_H
2 #define STK_NOISE_H
3 
4 #include "Generator.h"
5 #include <stdlib.h>
6 
7 namespace stk {
8 
9 /***************************************************/
19 /***************************************************/
20 
21 class Noise : public Generator
22 {
23 public:
24 
26 
30  Noise( unsigned int seed = 0 );
31 
33 
37  void setSeed( unsigned int seed = 0 );
38 
40  StkFloat lastOut( void ) const { return lastFrame_[0]; };
41 
43  StkFloat tick( void );
44 
46 
53  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
54 
55 protected:
56 
57 };
58 
59 inline StkFloat Noise :: tick( void )
60 {
61  return lastFrame_[0] = (StkFloat) ( 2.0 * rand() / (RAND_MAX + 1.0) - 1.0 );
62 }
63 
64 inline StkFrames& Noise :: tick( StkFrames& frames, unsigned int channel )
65 {
66 #if defined(_STK_DEBUG_)
67  if ( channel >= frames.channels() ) {
68  oStream_ << "Noise::tick(): channel and StkFrames arguments are incompatible!";
69  handleError( StkError::FUNCTION_ARGUMENT );
70  }
71 #endif
72 
73  StkFloat *samples = &frames[channel];
74  unsigned int hop = frames.channels();
75  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
76  *samples = (StkFloat) ( 2.0 * rand() / (RAND_MAX + 1.0) - 1.0 );
77 
78  lastFrame_[0] = *(samples-hop);
79  return frames;
80 }
81 
82 } // stk namespace
83 
84 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/NRev_8h_source.html0000644000076600007660000004617012327015203015373 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


NRev.h
1 #ifndef STK_NREV_H
2 #define STK_NREV_H
3 
4 #include "Effect.h"
5 #include "Delay.h"
6 
7 namespace stk {
8 
9 /***************************************************/
23 /***************************************************/
24 
25 class NRev : public Effect
26 {
27  public:
29  NRev( StkFloat T60 = 1.0 );
30 
32  void clear( void );
33 
35  void setT60( StkFloat T60 );
36 
38 
46  StkFloat lastOut( unsigned int channel = 0 );
47 
49 
56  StkFloat tick( StkFloat input, unsigned int channel = 0 );
57 
59 
68  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
69 
71 
80  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
81 
82  protected:
83 
84  Delay allpassDelays_[8];
85  Delay combDelays_[6];
86  StkFloat allpassCoefficient_;
87  StkFloat combCoefficient_[6];
88  StkFloat lowpassState_;
89 
90 };
91 
92 inline StkFloat NRev :: lastOut( unsigned int channel )
93 {
94 #if defined(_STK_DEBUG_)
95  if ( channel > 1 ) {
96  oStream_ << "NRev::lastOut(): channel argument must be less than 2!";
97  handleError( StkError::FUNCTION_ARGUMENT );
98  }
99 #endif
100 
101  return lastFrame_[channel];
102 }
103 
104 inline StkFloat NRev :: tick( StkFloat input, unsigned int channel )
105 {
106 #if defined(_STK_DEBUG_)
107  if ( channel > 1 ) {
108  oStream_ << "NRev::tick(): channel argument must be less than 2!";
109  handleError( StkError::FUNCTION_ARGUMENT );
110  }
111 #endif
112 
113  StkFloat temp, temp0, temp1, temp2, temp3;
114  int i;
115 
116  temp0 = 0.0;
117  for ( i=0; i<6; i++ ) {
118  temp = input + (combCoefficient_[i] * combDelays_[i].lastOut());
119  temp0 += combDelays_[i].tick(temp);
120  }
121 
122  for ( i=0; i<3; i++ ) {
123  temp = allpassDelays_[i].lastOut();
124  temp1 = allpassCoefficient_ * temp;
125  temp1 += temp0;
126  allpassDelays_[i].tick(temp1);
127  temp0 = -(allpassCoefficient_ * temp1) + temp;
128  }
129 
130  // One-pole lowpass filter.
131  lowpassState_ = 0.7 * lowpassState_ + 0.3 * temp0;
132  temp = allpassDelays_[3].lastOut();
133  temp1 = allpassCoefficient_ * temp;
134  temp1 += lowpassState_;
135  allpassDelays_[3].tick( temp1 );
136  temp1 = -( allpassCoefficient_ * temp1 ) + temp;
137 
138  temp = allpassDelays_[4].lastOut();
139  temp2 = allpassCoefficient_ * temp;
140  temp2 += temp1;
141  allpassDelays_[4].tick( temp2 );
142  lastFrame_[0] = effectMix_*( -( allpassCoefficient_ * temp2 ) + temp );
143 
144  temp = allpassDelays_[5].lastOut();
145  temp3 = allpassCoefficient_ * temp;
146  temp3 += temp1;
147  allpassDelays_[5].tick( temp3 );
148  lastFrame_[1] = effectMix_*( - ( allpassCoefficient_ * temp3 ) + temp );
149 
150  temp = ( 1.0 - effectMix_ ) * input;
151  lastFrame_[0] += temp;
152  lastFrame_[1] += temp;
153 
154  return lastFrame_[channel];
155 }
156 
157 } // stk namespace
158 
159 #endif
160 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/OnePole_8h_source.html0000644000076600007660000004521712327015203016063 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


OnePole.h
1 #ifndef STK_ONEPOLE_H
2 #define STK_ONEPOLE_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
18 /***************************************************/
19 
20 class OnePole : public Filter
21 {
22 public:
23 
25  OnePole( StkFloat thePole = 0.9 );
26 
28  ~OnePole();
29 
31  void setB0( StkFloat b0 ) { b_[0] = b0; };
32 
34  void setA1( StkFloat a1 ) { a_[1] = a1; };
35 
37  void setCoefficients( StkFloat b0, StkFloat a1, bool clearState = false );
38 
40 
48  void setPole( StkFloat thePole );
49 
51  StkFloat lastOut( void ) const { return lastFrame_[0]; };
52 
54  StkFloat tick( StkFloat input );
55 
57 
65  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
66 
68 
76  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
77 
78 };
79 
80 inline StkFloat OnePole :: tick( StkFloat input )
81 {
82  inputs_[0] = gain_ * input;
83  lastFrame_[0] = b_[0] * inputs_[0] - a_[1] * outputs_[1];
84  outputs_[1] = lastFrame_[0];
85 
86  return lastFrame_[0];
87 }
88 
89 inline StkFrames& OnePole :: tick( StkFrames& frames, unsigned int channel )
90 {
91 #if defined(_STK_DEBUG_)
92  if ( channel >= frames.channels() ) {
93  oStream_ << "OnePole::tick(): channel and StkFrames arguments are incompatible!";
94  handleError( StkError::FUNCTION_ARGUMENT );
95  }
96 #endif
97 
98  StkFloat *samples = &frames[channel];
99  unsigned int hop = frames.channels();
100  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
101  inputs_[0] = gain_ * *samples;
102  *samples = b_[0] * inputs_[0] - a_[1] * outputs_[1];
103  outputs_[1] = *samples;
104  }
105 
106  lastFrame_[0] = outputs_[1];
107  return frames;
108 }
109 
110 inline StkFrames& OnePole :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
111 {
112 #if defined(_STK_DEBUG_)
113  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
114  oStream_ << "OnePole::tick(): channel and StkFrames arguments are incompatible!";
115  handleError( StkError::FUNCTION_ARGUMENT );
116  }
117 #endif
118 
119  StkFloat *iSamples = &iFrames[iChannel];
120  StkFloat *oSamples = &oFrames[oChannel];
121  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
122  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
123  inputs_[0] = gain_ * *iSamples;
124  *oSamples = b_[0] * inputs_[0] - a_[1] * outputs_[1];
125  outputs_[1] = *oSamples;
126  }
127 
128  lastFrame_[0] = outputs_[1];
129  return iFrames;
130 }
131 
132 } // stk namespace
133 
134 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/OneZero_8h_source.html0000644000076600007660000004541312327015203016101 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


OneZero.h
1 #ifndef STK_ONEZERO_H
2 #define STK_ONEZERO_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
18 /***************************************************/
19 
20 class OneZero : public Filter
21 {
22  public:
23 
25  OneZero( StkFloat theZero = -1.0 );
26 
28  ~OneZero();
29 
31  void setB0( StkFloat b0 ) { b_[0] = b0; };
32 
34  void setB1( StkFloat b1 ) { b_[1] = b1; };
35 
37  void setCoefficients( StkFloat b0, StkFloat b1, bool clearState = false );
38 
40 
47  void setZero( StkFloat theZero );
48 
50  StkFloat lastOut( void ) const { return lastFrame_[0]; };
51 
53  StkFloat tick( StkFloat input );
54 
56 
64  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
65 
67 
75  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
76 
77 };
78 
79 inline StkFloat OneZero :: tick( StkFloat input )
80 {
81  inputs_[0] = gain_ * input;
82  lastFrame_[0] = b_[1] * inputs_[1] + b_[0] * inputs_[0];
83  inputs_[1] = inputs_[0];
84 
85  return lastFrame_[0];
86 }
87 
88 inline StkFrames& OneZero :: tick( StkFrames& frames, unsigned int channel )
89 {
90 #if defined(_STK_DEBUG_)
91  if ( channel >= frames.channels() ) {
92  oStream_ << "OneZero::tick(): channel and StkFrames arguments are incompatible!";
93  handleError( StkError::FUNCTION_ARGUMENT );
94  }
95 #endif
96 
97  StkFloat *samples = &frames[channel];
98  unsigned int hop = frames.channels();
99  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
100  inputs_[0] = gain_ * *samples;
101  *samples = b_[1] * inputs_[1] + b_[0] * inputs_[0];
102  inputs_[1] = inputs_[0];
103  }
104 
105  lastFrame_[0] = *(samples-hop);
106  return frames;
107 }
108 
109 inline StkFrames& OneZero :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
110 {
111 #if defined(_STK_DEBUG_)
112  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
113  oStream_ << "OneZero::tick(): channel and StkFrames arguments are incompatible!";
114  handleError( StkError::FUNCTION_ARGUMENT );
115  }
116 #endif
117 
118  StkFloat *iSamples = &iFrames[iChannel];
119  StkFloat *oSamples = &oFrames[oChannel];
120  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
121  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
122  inputs_[0] = gain_ * *iSamples;
123  *oSamples = b_[1] * inputs_[1] + b_[0] * inputs_[0];
124  inputs_[1] = inputs_[0];
125  }
126 
127  lastFrame_[0] = *(oSamples-oHop);
128  return iFrames;
129 }
130 
131 } // stk namespace
132 
133 #endif
134 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/open.png0000644000076600007660000000017312327015202013313 0ustar gary‰PNG  IHDR à‘BIDATxíÝÁ €0 Ð׬ՙ\Àº€39—b!©9{|ðI>$#Àß´ý8/¨ÄØzƒ/Ï>2À[ÎgiU,/¬~¼Ï\ Ä9Ù¸IEND®B`‚stk-4.5.0/doc/html/pages.html0000644000076600007660000001265612327015206013646 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Related Pages

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/PercFlut_8h_source.html0000644000076600007660000004012612327015203016240 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


PercFlut.h
1 #ifndef STK_PERCFLUT_H
2 #define STK_PERCFLUT_H
3 
4 #include "FM.h"
5 
6 namespace stk {
7 
8 /***************************************************/
34 /***************************************************/
35 
36 class PercFlut : public FM
37 {
38  public:
40 
43  PercFlut( void );
44 
46  ~PercFlut( void );
47 
49  void setFrequency( StkFloat frequency );
50 
52  void noteOn( StkFloat frequency, StkFloat amplitude );
53 
55  StkFloat tick( unsigned int channel = 0 );
56 
58 
65  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
66 
67  protected:
68 
69 };
70 
71 inline StkFloat PercFlut :: tick( unsigned int )
72 {
73  StkFloat temp;
74 
75  temp = vibrato_.tick() * modDepth_ * 0.2;
76  waves_[0]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[0]);
77  waves_[1]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[1]);
78  waves_[2]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[2]);
79  waves_[3]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[3]);
80 
81  waves_[3]->addPhaseOffset( twozero_.lastOut() );
82  temp = gains_[3] * adsr_[3]->tick() * waves_[3]->tick();
83 
84  twozero_.tick(temp);
85  waves_[2]->addPhaseOffset( temp );
86  temp = (1.0 - (control2_ * 0.5)) * gains_[2] * adsr_[2]->tick() * waves_[2]->tick();
87 
88  temp += control2_ * 0.5 * gains_[1] * adsr_[1]->tick() * waves_[1]->tick();
89  temp = temp * control1_;
90 
91  waves_[0]->addPhaseOffset(temp);
92  temp = gains_[0] * adsr_[0]->tick() * waves_[0]->tick();
93 
94  lastFrame_[0] = temp * 0.5;
95  return lastFrame_[0];
96 }
97 
98 inline StkFrames& PercFlut :: tick( StkFrames& frames, unsigned int channel )
99 {
100  unsigned int nChannels = lastFrame_.channels();
101 #if defined(_STK_DEBUG_)
102  if ( channel > frames.channels() - nChannels ) {
103  oStream_ << "PercFlut::tick(): channel and StkFrames arguments are incompatible!";
104  handleError( StkError::FUNCTION_ARGUMENT );
105  }
106 #endif
107 
108  StkFloat *samples = &frames[channel];
109  unsigned int j, hop = frames.channels() - nChannels;
110  if ( nChannels == 1 ) {
111  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
112  *samples++ = tick();
113  }
114  else {
115  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
116  *samples++ = tick();
117  for ( j=1; j<nChannels; j++ )
118  *samples++ = lastFrame_[j];
119  }
120  }
121 
122  return frames;
123 }
124 
125 } // stk namespace
126 
127 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Phonemes_8h_source.html0000644000076600007660000002065012327015203016272 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Phonemes.h
1 #ifndef STK_PHONEMES_H
2 #define STK_PHONEMES_H
3 
4 #include "Stk.h"
5 
6 namespace stk {
7 
8 /***************************************************/
18 /***************************************************/
19 
20 class Phonemes : public Stk
21 {
22 public:
23 
24  Phonemes( void );
25 
26  ~Phonemes( void );
27 
29  static const char *name( unsigned int index );
30 
32  static StkFloat voiceGain( unsigned int index );
33 
35  static StkFloat noiseGain( unsigned int index );
36 
38  static StkFloat formantFrequency( unsigned int index, unsigned int partial );
39 
41  static StkFloat formantRadius( unsigned int index, unsigned int partial );
42 
44  static StkFloat formantGain( unsigned int index, unsigned int partial );
45 
46 private:
47 
48  static const char phonemeNames[][4];
49  static const StkFloat phonemeGains[][2];
50  static const StkFloat phonemeParameters[][4][3];
51 };
52 
53 } // stk namespace
54 
55 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/PitShift_8h_source.html0000644000076600007660000003351512327015203016252 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


PitShift.h
1 #ifndef STK_PITSHIFT_H
2 #define STK_PITSHIFT_H
3 
4 #include "Effect.h"
5 #include "DelayL.h"
6 
7 namespace stk {
8 
9 /***************************************************/
18 /***************************************************/
19 
20 const int maxDelay = 5024;
21 
22 class PitShift : public Effect
23 {
24  public:
26  PitShift( void );
27 
29  void clear( void );
30 
32  void setShift( StkFloat shift );
33 
35  StkFloat lastOut( void ) const { return lastFrame_[0]; };
36 
38  StkFloat tick( StkFloat input );
39 
41 
49  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
50 
52 
60  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
61 
62  protected:
63 
64  DelayL delayLine_[2];
65  StkFloat delay_[2];
66  StkFloat env_[2];
67  StkFloat rate_;
68  unsigned long delayLength_;
69  unsigned long halfLength_;
70 
71 };
72 
73 inline StkFloat PitShift :: tick( StkFloat input )
74 {
75  // Calculate the two delay length values, keeping them within the
76  // range 12 to maxDelay-12.
77  delay_[0] += rate_;
78  while ( delay_[0] > maxDelay-12 ) delay_[0] -= delayLength_;
79  while ( delay_[0] < 12 ) delay_[0] += delayLength_;
80 
81  delay_[1] = delay_[0] + halfLength_;
82  while ( delay_[1] > maxDelay-12 ) delay_[1] -= delayLength_;
83  while ( delay_[1] < 12 ) delay_[1] += delayLength_;
84 
85  // Set the new delay line lengths.
86  delayLine_[0].setDelay( delay_[0] );
87  delayLine_[1].setDelay( delay_[1] );
88 
89  // Calculate a triangular envelope.
90  env_[1] = fabs( ( delay_[0] - halfLength_ + 12 ) * ( 1.0 / (halfLength_ + 12 ) ) );
91  env_[0] = 1.0 - env_[1];
92 
93  // Delay input and apply envelope.
94  lastFrame_[0] = env_[0] * delayLine_[0].tick( input );
95  lastFrame_[0] += env_[1] * delayLine_[1].tick( input );
96 
97  // Compute effect mix and output.
98  lastFrame_[0] *= effectMix_;
99  lastFrame_[0] += ( 1.0 - effectMix_ ) * input;
100 
101  return lastFrame_[0];
102 }
103 
104 } // stk namespace
105 
106 #endif
107 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Plucked_8h_source.html0000644000076600007660000004042212327015203016102 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Plucked.h
1 #ifndef STK_PLUCKED_H
2 #define STK_PLUCKED_H
3 
4 #include "Instrmnt.h"
5 #include "DelayA.h"
6 #include "OneZero.h"
7 #include "OnePole.h"
8 #include "Noise.h"
9 
10 namespace stk {
11 
12 /***************************************************/
32 /***************************************************/
33 
34 class Plucked : public Instrmnt
35 {
36  public:
38  Plucked( StkFloat lowestFrequency = 10.0 );
39 
41  ~Plucked( void );
42 
44  void clear( void );
45 
47  void setFrequency( StkFloat frequency );
48 
50  void pluck( StkFloat amplitude );
51 
53  void noteOn( StkFloat frequency, StkFloat amplitude );
54 
56  void noteOff( StkFloat amplitude );
57 
59  StkFloat tick( unsigned int channel = 0 );
60 
62 
69  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
70 
71  protected:
72 
73  DelayA delayLine_;
74  OneZero loopFilter_;
75  OnePole pickFilter_;
76  Noise noise_;
77 
78  StkFloat loopGain_;
79 };
80 
81 inline StkFloat Plucked :: tick( unsigned int )
82 {
83  // Here's the whole inner loop of the instrument!!
84  return lastFrame_[0] = 3.0 * delayLine_.tick( loopFilter_.tick( delayLine_.lastOut() * loopGain_ ) );
85 }
86 
87 inline StkFrames& Plucked :: tick( StkFrames& frames, unsigned int channel )
88 {
89  unsigned int nChannels = lastFrame_.channels();
90 #if defined(_STK_DEBUG_)
91  if ( channel > frames.channels() - nChannels ) {
92  oStream_ << "Plucked::tick(): channel and StkFrames arguments are incompatible!";
93  handleError( StkError::FUNCTION_ARGUMENT );
94  }
95 #endif
96 
97  StkFloat *samples = &frames[channel];
98  unsigned int j, hop = frames.channels() - nChannels;
99  if ( nChannels == 1 ) {
100  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
101  *samples++ = tick();
102  }
103  else {
104  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
105  *samples++ = tick();
106  for ( j=1; j<nChannels; j++ )
107  *samples++ = lastFrame_[j];
108  }
109  }
110 
111  return frames;
112 }
113 
114 } // stk namespace
115 
116 #endif
117 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/PoleZero_8h_source.html0000644000076600007660000003447312327015203016263 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


PoleZero.h
1 #ifndef STK_POLEZERO_H
2 #define STK_POLEZERO_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
19 /***************************************************/
20 
21 class PoleZero : public Filter
22 {
23  public:
24 
26  PoleZero();
27 
29  ~PoleZero();
30 
32  void setB0( StkFloat b0 ) { b_[0] = b0; };
33 
35  void setB1( StkFloat b1 ) { b_[1] = b1; };
36 
38  void setA1( StkFloat a1 ) { a_[1] = a1; };
39 
41  void setCoefficients( StkFloat b0, StkFloat b1, StkFloat a1, bool clearState = false );
42 
44 
50  void setAllpass( StkFloat coefficient );
51 
53 
59  void setBlockZero( StkFloat thePole = 0.99 );
60 
62  StkFloat lastOut( void ) const { return lastFrame_[0]; };
63 
65  StkFloat tick( StkFloat input );
66 
68 
75  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
76 
77 };
78 
79 inline StkFloat PoleZero :: tick( StkFloat input )
80 {
81  inputs_[0] = gain_ * input;
82  lastFrame_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] - a_[1] * outputs_[1];
83  inputs_[1] = inputs_[0];
84  outputs_[1] = lastFrame_[0];
85 
86  return lastFrame_[0];
87 }
88 
89 inline StkFrames& PoleZero :: tick( StkFrames& frames, unsigned int channel )
90 {
91 #if defined(_STK_DEBUG_)
92  if ( channel >= frames.channels() ) {
93  oStream_ << "PoleZero::tick(): channel and StkFrames arguments are incompatible!";
94  handleError( StkError::FUNCTION_ARGUMENT );
95  }
96 #endif
97 
98  StkFloat *samples = &frames[channel];
99  unsigned int hop = frames.channels();
100  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
101  inputs_[0] = gain_ * *samples;
102  *samples = b_[0] * inputs_[0] + b_[1] * inputs_[1] - a_[1] * outputs_[1];
103  inputs_[1] = inputs_[0];
104  outputs_[1] = *samples;
105  }
106 
107  lastFrame_[0] = outputs_[1];
108  return frames;
109 }
110 
111 } // stk namespace
112 
113 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/polyvoices.html0000644000076600007660000004676512327015204014751 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


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 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 "group" number. All sounding instrument outputs are summed and returned via the tick() 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 controlbee.cpp program to make use of three stk::BeeThree instruments, all controlled using a stk::Voicer.

// threebees.cpp STK tutorial program
#include "BeeThree.h"
#include "RtAudio.h"
#include "Messager.h"
#include "Voicer.h"
#include "SKINI.msg"
#include <algorithm>
using std::min;
using namespace stk;
// The TickData structure holds all the class instances and data that
// are shared by the various processing functions.
struct TickData {
Voicer voicer;
Messager messager;
Skini::Message message;
int counter;
bool haveMessage;
bool done;
// Default constructor.
TickData()
: counter(0), haveMessage(false), done( false ) {}
};
#define DELTA_CONTROL_TICKS 64 // default sample frames between control input checks
// The processMessage() function encapsulates the handling of control
// messages. It can be easily relocated within a program structure
// depending on the desired scheduling scheme.
void processMessage( TickData* data )
{
register StkFloat value1 = data->message.floatValues[0];
register StkFloat value2 = data->message.floatValues[1];
switch( data->message.type ) {
case __SK_Exit_:
data->done = true;
return;
case __SK_NoteOn_:
if ( value2 == 0.0 ) // velocity is zero ... really a NoteOff
data->voicer.noteOff( value1, 64.0 );
else { // a NoteOn
data->voicer.noteOn( value1, value2 );
}
break;
case __SK_NoteOff_:
data->voicer.noteOff( value1, value2 );
break;
case __SK_ControlChange_:
data->voicer.controlChange( (int) value1, value2 );
break;
case __SK_AfterTouch_:
data->voicer.controlChange( 128, value1 );
case __SK_PitchChange_:
data->voicer.setFrequency( value1 );
break;
case __SK_PitchBend_:
data->voicer.pitchBend( value1 );
} // end of switch
data->haveMessage = false;
return;
}
// This tick() function handles sample computation and scheduling of
// control updates. It will be called automatically when the system
// needs a new buffer of audio samples.
int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
double streamTime, RtAudioStreamStatus status, void *dataPointer )
{
TickData *data = (TickData *) dataPointer;
register StkFloat *samples = (StkFloat *) outputBuffer;
int counter, nTicks = (int) nBufferFrames;
while ( nTicks > 0 && !data->done ) {
if ( !data->haveMessage ) {
data->messager.popMessage( data->message );
if ( data->message.type > 0 ) {
data->counter = (long) (data->message.time * Stk::sampleRate());
data->haveMessage = true;
}
else
data->counter = DELTA_CONTROL_TICKS;
}
counter = min( nTicks, data->counter );
data->counter -= counter;
for ( int i=0; i<counter; i++ ) {
*samples++ = data->voicer.tick();
nTicks--;
}
if ( nTicks == 0 ) break;
// Process control messages.
if ( data->haveMessage ) processMessage( data );
}
return 0;
}
int main()
{
// Set the global sample rate and rawwave path before creating class instances.
Stk::setSampleRate( 44100.0 );
Stk::setRawwavePath( "../../rawwaves/" );
int i;
TickData data;
RtAudio dac;
Instrmnt *instrument[3];
for ( i=0; i<3; i++ ) instrument[i] = 0;
// Figure out how many bytes in an StkFloat and setup the RtAudio stream.
parameters.deviceId = dac.getDefaultOutputDevice();
parameters.nChannels = 1;
RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32;
unsigned int bufferFrames = RT_BUFFER_SIZE;
try {
dac.openStream( &parameters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&data );
}
catch ( RtAudioError &error ) {
error.printMessage();
goto cleanup;
}
try {
// Define and load the BeeThree instruments
for ( i=0; i<3; i++ )
instrument[i] = new BeeThree();
}
catch ( StkError & ) {
goto cleanup;
}
// "Add" the instruments to the voicer.
for ( i=0; i<3; i++ )
data.voicer.addInstrument( instrument[i] );
if ( data.messager.startStdInput() == false )
goto cleanup;
try {
dac.startStream();
}
catch ( RtAudioError &error ) {
error.printMessage();
goto cleanup;
}
// Block waiting until callback signals done.
while ( !data.done )
Stk::sleep( 100 );
// Shut down the callback and output stream.
try {
dac.closeStream();
}
catch ( RtAudioError &error ) {
error.printMessage();
}
cleanup:
for ( i=0; i<3; i++ ) delete instrument[i];
return 0;
}

We have written this program to accept control messages from STDIN. Assuming the program is compiled as threebees, the three-voice SKINI scorefile bachfugue.ski (located in the scores directory with the examples) can be redirected to the program as:

threebees < scores/bachfugue.ski

For more fun, surf to Kern Scores for a huge assortment of other scorefiles that can be downloaded in the SKINI format.

Another easy extension would be to add the stk::Messager::startMidiInput() function to the program and then play the instruments via a MIDI keyboard.

[Main tutorial page]


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/PRCRev_8h_source.html0000644000076600007660000004134612327015203015622 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


PRCRev.h
1 #ifndef STK_PRCREV_H
2 #define STK_PRCREV_H
3 
4 #include "Effect.h"
5 #include "Delay.h"
6 
7 namespace stk {
8 
9 /***************************************************/
22 /***************************************************/
23 
24 class PRCRev : public Effect
25 {
26 public:
28  PRCRev( StkFloat T60 = 1.0 );
29 
31  void clear( void );
32 
34  void setT60( StkFloat T60 );
35 
37 
45  StkFloat lastOut( unsigned int channel = 0 );
46 
48 
55  StkFloat tick( StkFloat input, unsigned int channel = 0 );
56 
58 
67  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
68 
70 
79  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
80 
81 protected:
82 
83  Delay allpassDelays_[2];
84  Delay combDelays_[2];
85  StkFloat allpassCoefficient_;
86  StkFloat combCoefficient_[2];
87 
88 };
89 
90 inline StkFloat PRCRev :: lastOut( unsigned int channel )
91 {
92 #if defined(_STK_DEBUG_)
93  if ( channel > 1 ) {
94  oStream_ << "PRCRev::lastOut(): channel argument must be less than 2!";
95  handleError( StkError::FUNCTION_ARGUMENT );
96  }
97 #endif
98 
99  return lastFrame_[channel];
100 }
101 
102  inline StkFloat PRCRev :: tick( StkFloat input, unsigned int channel )
103 {
104 #if defined(_STK_DEBUG_)
105  if ( channel > 1 ) {
106  oStream_ << "PRCRev::tick(): channel argument must be less than 2!";
107  handleError( StkError::FUNCTION_ARGUMENT );
108  }
109 #endif
110 
111  StkFloat temp, temp0, temp1, temp2, temp3;
112 
113  temp = allpassDelays_[0].lastOut();
114  temp0 = allpassCoefficient_ * temp;
115  temp0 += input;
116  allpassDelays_[0].tick(temp0);
117  temp0 = -(allpassCoefficient_ * temp0) + temp;
118 
119  temp = allpassDelays_[1].lastOut();
120  temp1 = allpassCoefficient_ * temp;
121  temp1 += temp0;
122  allpassDelays_[1].tick(temp1);
123  temp1 = -(allpassCoefficient_ * temp1) + temp;
124 
125  temp2 = temp1 + ( combCoefficient_[0] * combDelays_[0].lastOut() );
126  temp3 = temp1 + ( combCoefficient_[1] * combDelays_[1].lastOut() );
127 
128  lastFrame_[0] = effectMix_ * (combDelays_[0].tick(temp2));
129  lastFrame_[1] = effectMix_ * (combDelays_[1].tick(temp3));
130  temp = (1.0 - effectMix_) * input;
131  lastFrame_[0] += temp;
132  lastFrame_[1] += temp;
133 
134  return lastFrame_[channel];
135 }
136 
137 } // stk namespace
138 
139 #endif
140 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/princeton.gif0000644000076600007660000001254412327015321014343 0ustar garyGIF87aá0õøüøøÌÈøÌ˜ø˜`ø˜0ød0ÈÌÈÈ̘ȘÈȘ˜È˜`Èd`Èd0Èd˜ÌȘ̘˜˜È˜˜˜˜˜`˜dȘd˜˜d`˜d0˜d˜0`dÈ`d˜`d``d0`00`000`000000@ èìèØÜظ¸¸¨¨¨ˆˆˆptpPTP@D@ ,á0þ@ˆÁD,ȤrÉl:ŸÐ¨tJ­> Ã#6»bOÖ°xL.›ÏVnÔË6aÝí·‡Â=¨8p'X°RÄ"Œ™¹«0Ù: 9°Ô5$QÄ9‘w+°°wJ™°Ú­°‰>nb‚4³4IA;ã +¼0$Ÿ í‘Vdøc¤áò·&\EZŠÈFO–õÈíN(\d‹YñèˆÑ S%€” ·ÂØKì¼ZY ÈÌœ¯ˆ§°G§ÄÆv×]ÁÁ¼° ” xïTvͳк²/ÄÝÂQôáÈš}é°ähË’Šë_5誌܃ha©×xÈwד†”Xö*‰ñ;K ¯åêS| Ùëc<ìÃ?6:×Üùºðê¿~GÓ\ì•æBþâɸ÷í·kÁ´ñÝML:º­ ›G¹Ë;‘>`Ý;¤`Vó¯0Ÿ `8‘g N¡´cÍWʲS‚\›8y8ü&@ªåì4Ë«0içîcCLçêØ™^°QÁzÝúê ·i¢3ÂHÀÛ%j3ñ@ E&²2n¯H»Ën1•è­phžPpö LI$BŸ¨Ä,7L$B•k‡Ñœ³¹ Ìb]‹ÓœÎñ«:- XÚù•QŒ¿+N ‹V ø‚…±5$b*L2±îKÂZÀ‚`3+ÉbÃ"0N@Zp)+P@ŠR° œ*KÂò )<óM´h&P’gþŽÁ°&Ö€…ø&ô‰ÅôQj®Iݰˆ%üÁ©(cØê*ÀCÖ9’‡+`i B¬#HA¨‚ŒPÀ Š X °˜ÒʲQ$Hù ±pZp2Ê+µ 8‹\ À ('xG;ÞÑÐDll/T¸—¼£(š†°°h.m#H£¡Ã¶£±Ñ ;5ÌŽé#1üÝPa»á¾:6IJ@a.`Á,”(Ÿi…Ò!#¥¹òvÛ„k/¢?#˜¢[4®–ºi(7dÈM„€ãèæ%Ò¨ÌL¦³ DàOP v2Ž3¥É’œû—®dþ•9D!Ûd„õµ…ÍT*ÐÀƒÅ¿rF’mœ(  ¬ÏaØŽ€'jÇ´PˆÀ"¨@ Ö)t hÔÁL #  ±ˆ }›W¥úFÞRs9Á(gb€[àX˜Vo™€ t@„c­ H,´ B0° x%ã Ht 0 H0dRãØBÖ4 .ÃŒßL©ÒÍ;¡Û©CGþJˆ $ ö‰l–ô$ FOZภÔ$ <0€QZ`”p%« .Ù,@”Õd:˂˾€¡å(pþ€¹¶C¡w} Ðöb`*ðÀ+ŽÚ€ia€£T¦BP€š%¯ P€0°…4Àq@@`ÆL jаf¹™€É|h†Ø‘ŒKã”C›Ú–§5ü°$ÛI@õ-èäoudÏçl„¿Ÿð+*GY€Œ%-pW€P¢  °§Y€Œò(€âjI »¾`¸p{;ðK°×<.Àb°÷vÀë©TÐ/t²¹/@™Ô±Ò€Tƒ@iá6ÕÏC;–Q4p5ƒ±î‡¶•n9A‚ïºÐ$@´¢ÍèÞur»ÄhoŒAic’UMÁcñÚþ'ÆÆÏ­@ðšNZÀÈ5FÁBë1ʹ¸wí@-¤¬P¸¶€ x.*`0`±›ó«¯ ‚çvÀh)ðÀ\°¼À-@TµÄ¨‰s³h0ušçZ`ò•ÓKù¿FÚVé4ʈ;qÊ»ûÝðŽw•a-{*1’†\’+]Ü`ཥ ²¬ %Öp¨ø*ð"á…ŽWÖÊ´yí7S4õ+6éH W7„Hœ‡tK!OÇ+` 'f`òÖ¸C"/Á`bXövÓò]ZvjeǶÓ6Fö IÇfc G•cdt‡# v dd‡gŒ-` ³9ÏJ'0›!Vgd{y³Ù27eSí…’ãàpT w7}u;³èÿ†+pTËYÞU¶cpàœeÕFöT¹¦˜nå$I,PËÖe›€·þt°h »CF˜B÷ iªpK¤çDæwô%J…¶_!õd ðc iVƒQé¤'F^…Wc)vÊ›€WX¶œ uqCVOv‡)£°–·´\ÒÀ&À_J2t8 pƒ&:Õ& @#0Ðiw8¢ÅËåwøtøkf‡DYY°ðŸc“?µ¬PŽÊ ﹊NGzGq ØXŽáWzø &Öšöleª …{¦¡L• „W:J €˜Üç$Ð J P¦Â‚Rbø+ÒÖIðd¶÷hϵ\U:!cRäk @:ïô^HIÝþé* €e!Ð+0\\‡—^æ*½Ötý(}MU0[ÏVPlÊš_ϦPÍê `_©AW™>5b˜TŽXQ¢×cÔõ)&PŽa zj.÷™f¬ì©`e¯P¨/b„˜ðdŨ~uj  Jì5!U—±ÇÉ F¶œÊª @wÐ2À'¨:JÐNJw'Æp ¤?öd@w&r•fhÂ5f` `”9&e¡p‘ALf£·° ðïd`€_pŸ`;¿f“DûN ³Nl嘞ð­-7mRŽ-›¥‡ÊDœ`%eÆ þí¯ JôZ­»`?VÚÁy¯ê¥þ0œif ·œ'`;ËÙt`; €__Uàp«²çšj+0²7j p#J£t+°æI&.@w9F/Û.À_O¶0üÅH7Öraf!S_øåž‡p C´±k´#¶Hs&XQa4øn× UA •ÕZ¥_ËJd 0£‡]«IÖ© …R´Tj³ ÐIÒ«w‡5j ‰*B²!`X'{!3©¸9+©` ð/}“å¤  ðj¾&‡aNŠ0ÅI¼ @þžÏ¦—情ÐP:zÛ`Eñj×KǺY @fù5µêkøU_!ó³ƒJÿiIò¸]¶´¦Ñ Þo¶RŽšFB' ÌÙGO $‡J ¤üÕr"Aèd¶¯ácÑ×c95 po"=¦f%1oJ¡–P}°€=f4P€Ú3®ÐcG°^œ JÆ9`\=&‡ìp`õŽ0h"p*pzÑciв?ÛÇ65­F¡¦²“kú âXýC› —GÙµñNHqua-´h„±€¬4OôÚ «„ ø,rBà-Ûà ð°Åþh zr+E a𵙋÷=·P0DP² Ðy †Éê»XP†¿r? ƒ«ƒÌ½ ø£ª41“‘0°Ò?AÔ1Ûz HX Äš8${3‡ ‹¼¾ÃOT„ ó }ü7Nâ€ùƒ28' J,1)®À ÓÑ$ÐP4Q?A"¶‹êh“ˆ7¿»â&ÙŠZ&èWjJ:„H‰¦<™¦œ‡´ŒÌ͵Žð+³  YHq™æ|@ Ä8 lw¯A„x±-üœJÓñi³qÓ´ÐŒ‘ò %/PÑ9m`|i´½üNC›0 9E‹ò³Ž™0ZCÑ+ÀHþ±KNFW™jj´6)D3šÜüÑ·2õƒSê0®Æ°´&°5Z±ÉK<«4 ƒØÒÓà"ÍLÄ%Ïc òEžâEr! ´ /…bõÒãW“+€ÉïT[‘mÃlÐrÜMtÒ?àÑX}´Š ƒ”™¦_ TôðÇy ‹ ($p¢¸€Y ÊrÎÂhQ€èÁ(4!¬ÈѾL I;ˆRžÂ"J"—ybÖa´ 2éö+−0dƒZ°ô‘- f}Öur0¦ØÕpØ r·*PŽuE·’EZA7wÛ2×á".ÄSÊÃPPöŒ Ô ¼xþ3¤`ü0ŽC •1°\… ( XF1M™NŠ4P¦$bÚ¡ Œ)6®ÅMëH³¥ ª|tGÛ“ÎÒJ»´,ÎâŽ\2â\65r"œ¼ËöíΜA¥ì}HËmd¯ÒÂà¯p§Π>­”!RG †Oyö+˜Œ“çà!é!iÈMåFŠÁbt:„No8!] ±æb2>Hé|Ûà‚±ñ‹Ì  J~ žâFµ0%Ì!à†mäUB߈4[+Ÿ6![óDÖ166!Fƒ] -\aç@ Ýô0ê0[­U¥hnùãJ'‘ŠiÒKt-«qÜ¢•ƒXçÜA¸ÀEŸLS4ܺý.ÅE(BFN ÔÄ¥‰ä —©Æî%îäîÝÞíåžîÆèèþíÆ9îíîîì>ïÞ~îõ~ïæ¾îî¾îünœñ~îñžïþ>ð$Àîðû~ð ¯ðð ðþ>îA;stk-4.5.0/doc/html/realtime.html0000644000076600007660000002555112327015204014345 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Realtime Audio (blocking)

In this section, we modify the sineosc.cpp program in order to send the output to the default audio playback device on your 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.

// rtsine.cpp STK tutorial program
#include "SineWave.h"
#include "RtWvOut.h"
#include <cstdlib>
using namespace stk;
int main()
{
// Set the global sample rate before creating class instances.
Stk::setSampleRate( 44100.0 );
int nFrames = 100000;
SineWave sine;
RtWvOut *dac = 0;
try {
// Define and open the default realtime output device for one-channel playback
dac = new RtWvOut( 1 );
}
catch ( StkError & ) {
exit( 1 );
}
sine.setFrequency( 441.0 );
// Option 1: Use StkFrames
/*
StkFrames frames( nFrames, 1 );
try {
dac->tick( sine.tick( frames ) );
}
catch ( StkError & ) {
goto cleanup;
}
*/
// Option 2: Single-sample computations
for ( int i=0; i<nFrames; i++ ) {
try {
dac->tick( sine.tick() );
}
catch ( StkError & ) {
goto cleanup;
}
}
cleanup:
delete dac;
return 0;
}

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. 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 stk::RtWvIn class exists as well that can be used to read realtime audio data from an input device. See the record.cpp example program in the examples project for more information.

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 effects project or the duplex.cpp example program in the examples project for more information.

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):

g++ -Wall -D__LINUX_ALSA__ -D__LITTLE_ENDIAN__ -o rtsine Stk.cpp Generator.cpp SineWave.cpp WvOut.cpp \ RtWvOut.cpp RtAudio.cpp rtsine.cpp -lpthread -lasound

On a Macintosh OS X system, the syntax would be:

g++ -Wall -D__MACOSX_CORE__ -o rtsine Stk.cpp Generator.cpp SineWave.cpp WvOut.cpp RtWvOut.cpp RtAudio.cpp \ rtsine.cpp -lpthread -framework CoreAudio -framework CoreMIDI -framework CoreFoundation

[Main tutorial page]   [Next tutorial]


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/ReedTable_8h_source.html0000644000076600007660000004616012327015203016347 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


ReedTable.h
1 #ifndef STK_REEDTABLE_H
2 #define STK_REEDTABLE_H
3 
4 #include "Function.h"
5 
6 namespace stk {
7 
8 /***************************************************/
25 /***************************************************/
26 
27 class ReedTable : public Function
28 {
29 public:
31  ReedTable( void ) : offset_(0.6), slope_(-0.8) {};
32 
34 
39  void setOffset( StkFloat offset ) { offset_ = offset; };
40 
42 
47  void setSlope( StkFloat slope ) { slope_ = slope; };
48 
50  StkFloat tick( StkFloat input );
51 
53 
61  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
62 
64 
72  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
73 
74 protected:
75 
76  StkFloat offset_;
77  StkFloat slope_;
78 
79 };
80 
81 inline StkFloat ReedTable :: tick( StkFloat input )
82 {
83  // The input is differential pressure across the reed.
84  lastFrame_[0] = offset_ + (slope_ * input);
85 
86  // If output is > 1, the reed has slammed shut and the
87  // reflection function value saturates at 1.0.
88  if ( lastFrame_[0] > 1.0) lastFrame_[0] = (StkFloat) 1.0;
89 
90  // This is nearly impossible in a physical system, but
91  // a reflection function value of -1.0 corresponds to
92  // an open end (and no discontinuity in bore profile).
93  if ( lastFrame_[0] < -1.0) lastFrame_[0] = (StkFloat) -1.0;
94 
95  return lastFrame_[0];
96 }
97 
98 inline StkFrames& ReedTable :: tick( StkFrames& frames, unsigned int channel )
99 {
100 #if defined(_STK_DEBUG_)
101  if ( channel >= frames.channels() ) {
102  oStream_ << "ReedTable::tick(): channel and StkFrames arguments are incompatible!";
103  handleError( StkError::FUNCTION_ARGUMENT );
104  }
105 #endif
106 
107  StkFloat *samples = &frames[channel];
108  unsigned int hop = frames.channels();
109  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
110  *samples = offset_ + (slope_ * *samples);
111  if ( *samples > 1.0) *samples = 1.0;
112  if ( *samples < -1.0) *samples = -1.0;
113  }
114 
115  lastFrame_[0] = *(samples-hop);
116  return frames;
117 }
118 
119 inline StkFrames& ReedTable :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
120 {
121 #if defined(_STK_DEBUG_)
122  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
123  oStream_ << "ReedTable::tick(): channel and StkFrames arguments are incompatible!";
124  handleError( StkError::FUNCTION_ARGUMENT );
125  }
126 #endif
127 
128  StkFloat *iSamples = &iFrames[iChannel];
129  StkFloat *oSamples = &oFrames[oChannel];
130  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
131  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
132  *oSamples = offset_ + (slope_ * *iSamples);
133  if ( *oSamples > 1.0) *oSamples = 1.0;
134  if ( *oSamples < -1.0) *oSamples = -1.0;
135  }
136 
137  lastFrame_[0] = *(oSamples-oHop);
138  return iFrames;
139 }
140 
141 } // stk namespace
142 
143 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Resonate_8h_source.html0000644000076600007660000004417412327015203016303 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Resonate.h
1 #ifndef STK_RESONATE_H
2 #define STK_RESONATE_H
3 
4 #include "Instrmnt.h"
5 #include "ADSR.h"
6 #include "BiQuad.h"
7 #include "Noise.h"
8 
9 namespace stk {
10 
11 /***************************************************/
28 /***************************************************/
29 
30 class Resonate : public Instrmnt
31 {
32  public:
34  Resonate( void );
35 
37  ~Resonate( void );
38 
40  void setResonance( StkFloat frequency, StkFloat radius );
41 
43  void setNotch( StkFloat frequency, StkFloat radius );
44 
46  void setEqualGainZeroes( void ) { filter_.setEqualGainZeroes(); };
47 
49  void keyOn( void ) { adsr_.keyOn(); };
50 
52  void keyOff( void ) { adsr_.keyOff(); };
53 
55  void noteOn( StkFloat frequency, StkFloat amplitude );
56 
58  void noteOff( StkFloat amplitude );
59 
61  void controlChange( int number, StkFloat value );
62 
64  StkFloat tick( unsigned int channel = 0 );
65 
67 
74  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
75 
76  protected:
77 
78  ADSR adsr_;
79  BiQuad filter_;
80  Noise noise_;
81  StkFloat poleFrequency_;
82  StkFloat poleRadius_;
83  StkFloat zeroFrequency_;
84  StkFloat zeroRadius_;
85 
86 };
87 
88 inline StkFloat Resonate :: tick( unsigned int )
89 {
90  lastFrame_[0] = filter_.tick( noise_.tick() );
91  lastFrame_[0] *= adsr_.tick();
92  return lastFrame_[0];
93 }
94 
95 inline StkFrames& Resonate :: tick( StkFrames& frames, unsigned int channel )
96 {
97  unsigned int nChannels = lastFrame_.channels();
98 #if defined(_STK_DEBUG_)
99  if ( channel > frames.channels() - nChannels ) {
100  oStream_ << "Resonate::tick(): channel and StkFrames arguments are incompatible!";
101  handleError( StkError::FUNCTION_ARGUMENT );
102  }
103 #endif
104 
105  StkFloat *samples = &frames[channel];
106  unsigned int j, hop = frames.channels() - nChannels;
107  if ( nChannels == 1 ) {
108  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
109  *samples++ = tick();
110  }
111  else {
112  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
113  *samples++ = tick();
114  for ( j=1; j<nChannels; j++ )
115  *samples++ = lastFrame_[j];
116  }
117  }
118 
119  return frames;
120 }
121 
122 } // stk namespace
123 
124 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Rhodey_8h_source.html0000644000076600007660000003720212327015203015747 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Rhodey.h
1 #ifndef STK_RHODEY_H
2 #define STK_RHODEY_H
3 
4 #include "FM.h"
5 
6 namespace stk {
7 
8 /***************************************************/
38 /***************************************************/
39 
40 class Rhodey : public FM
41 {
42  public:
44 
47  Rhodey( void );
48 
50  ~Rhodey( void );
51 
53  void setFrequency( StkFloat frequency );
54 
56  void noteOn( StkFloat frequency, StkFloat amplitude );
57 
59  StkFloat tick( unsigned int channel = 0 );
60 
62 
69  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
70 
71  protected:
72 
73 };
74 
75 inline StkFloat Rhodey :: tick( unsigned int )
76 {
77  StkFloat temp, temp2;
78 
79  temp = gains_[1] * adsr_[1]->tick() * waves_[1]->tick();
80  temp = temp * control1_;
81 
82  waves_[0]->addPhaseOffset( temp );
83  waves_[3]->addPhaseOffset( twozero_.lastOut() );
84  temp = gains_[3] * adsr_[3]->tick() * waves_[3]->tick();
85  twozero_.tick(temp);
86 
87  waves_[2]->addPhaseOffset( temp );
88  temp = ( 1.0 - (control2_ * 0.5)) * gains_[0] * adsr_[0]->tick() * waves_[0]->tick();
89  temp += control2_ * 0.5 * gains_[2] * adsr_[2]->tick() * waves_[2]->tick();
90 
91  // Calculate amplitude modulation and apply it to output.
92  temp2 = vibrato_.tick() * modDepth_;
93  temp = temp * (1.0 + temp2);
94 
95  lastFrame_[0] = temp * 0.5;
96  return lastFrame_[0];
97 }
98 
99 inline StkFrames& Rhodey :: tick( StkFrames& frames, unsigned int channel )
100 {
101  unsigned int nChannels = lastFrame_.channels();
102 #if defined(_STK_DEBUG_)
103  if ( channel > frames.channels() - nChannels ) {
104  oStream_ << "Rhodey::tick(): channel and StkFrames arguments are incompatible!";
105  handleError( StkError::FUNCTION_ARGUMENT );
106  }
107 #endif
108 
109  StkFloat *samples = &frames[channel];
110  unsigned int j, hop = frames.channels() - nChannels;
111  if ( nChannels == 1 ) {
112  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
113  *samples++ = tick();
114  }
115  else {
116  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
117  *samples++ = tick();
118  for ( j=1; j<nChannels; j++ )
119  *samples++ = lastFrame_[j];
120  }
121  }
122 
123  return frames;
124 }
125 
126 } // stk namespace
127 
128 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/RtAudio_8h.html0000644000076600007660000004142212327015203014503 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudio.h File Reference

Go to the source code of this file.

Classes

class  RtAudioError
 Exception handling class for RtAudio. More...
 
class  RtAudio
 Realtime audio i/o C++ classes. More...
 
struct  RtAudio::DeviceInfo
 The public device information structure for returning queried values. More...
 
struct  RtAudio::StreamParameters
 The structure for specifying input or ouput stream parameters. More...
 
struct  RtAudio::StreamOptions
 The structure for specifying stream options. More...
 

Typedefs

typedef unsigned long RtAudioFormat
 RtAudio data format type. More...
 
typedef unsigned int RtAudioStreamFlags
 RtAudio stream option flags. More...
 
typedef unsigned int RtAudioStreamStatus
 RtAudio stream status (over- or underflow) flags. More...
 
typedef int(* RtAudioCallback )(void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void *userData)
 RtAudio callback function prototype. More...
 
typedef void(* RtAudioErrorCallback )(RtAudioError::Type type, const std::string &errorText)
 RtAudio error callback function prototype. More...
 

Typedef Documentation

typedef unsigned long RtAudioFormat

RtAudio data format type.

Support for signed integers and floats. Audio data fed to/from an RtAudio stream is assumed to ALWAYS be in host byte order. The internal routines will automatically take care of any necessary byte-swapping between the host format and the soundcard. Thus, endian-ness is not a concern in the following format definitions.

  • RTAUDIO_SINT8: 8-bit signed integer.
  • RTAUDIO_SINT16: 16-bit signed integer.
  • RTAUDIO_SINT24: 24-bit signed integer.
  • RTAUDIO_SINT32: 32-bit signed integer.
  • RTAUDIO_FLOAT32: Normalized between plus/minus 1.0.
  • RTAUDIO_FLOAT64: Normalized between plus/minus 1.0.
typedef unsigned long RtAudioStreamFlags

RtAudio stream option flags.

The following flags can be OR'ed together to allow a client to make changes to the default stream behavior:

  • RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved).
  • RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency.
  • RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use.
  • RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only).

By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with nFrames samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index nFrames (assuming the buffer pointer was recast to the correct data type for the stream).

Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, RtAudio will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance.

If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs.

If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt to select realtime scheduling (round-robin) for the callback thread.

If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to open the "default" PCM device when using the ALSA API. Note that this will override any specified input or output device id.

typedef unsigned long RtAudioStreamStatus

RtAudio stream status (over- or underflow) flags.

Notification of a stream over- or underflow is indicated by a non-zero stream status argument in the RtAudioCallback function. The stream status can be one of the following two options, depending on whether the stream is open for output and/or input:

  • RTAUDIO_INPUT_OVERFLOW: Input data was discarded because of an overflow condition at the driver.
  • RTAUDIO_OUTPUT_UNDERFLOW: The output buffer ran low, likely producing a break in the output sound.
typedef int(* RtAudioCallback)(void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void *userData)

RtAudio callback function prototype.

All RtAudio clients must create a function of type RtAudioCallback to read and/or write data from/to the audio stream. When the underlying audio system is ready for new input or output data, this function will be invoked.

Parameters
outputBufferFor output (or duplex) streams, the client should write nFrames of audio sample frames into this buffer. This argument should be recast to the datatype specified when the stream was opened. For input-only streams, this argument will be NULL.
inputBufferFor input (or duplex) streams, this buffer will hold nFrames of input audio sample frames. This argument should be recast to the datatype specified when the stream was opened. For output-only streams, this argument will be NULL.
nFramesThe number of sample frames of input or output data in the buffers. The actual buffer size in bytes is dependent on the data type and number of channels in use.
streamTimeThe number of seconds that have elapsed since the stream was started.
statusIf non-zero, this argument indicates a data overflow or underflow condition for the stream. The particular condition can be determined by comparison with the RtAudioStreamStatus flags.
userDataA pointer to optional data provided by the client when opening the stream (default = NULL).

To continue normal stream operation, the RtAudioCallback function should return a value of zero. To stop the stream and drain the output buffer, the function should return a value of one. To abort the stream immediately, the client should return a value of two.

typedef void(* RtAudioErrorCallback)(RtAudioError::Type type, const std::string &errorText)

RtAudio error callback function prototype.

Parameters
typeType of error.
errorTextError description.

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/RtAudio_8h_source.html0000644000076600007660000051013212327015203016062 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudio.h
Go to the documentation of this file.
1 /************************************************************************/
39 /************************************************************************/
40 
45 #ifndef __RTAUDIO_H
46 #define __RTAUDIO_H
47 
48 #define RTAUDIO_VERSION "4.1.1"
49 
50 #include <string>
51 #include <vector>
52 #include <exception>
53 #include <iostream>
54 
71 typedef unsigned long RtAudioFormat;
72 static const RtAudioFormat RTAUDIO_SINT8 = 0x1; // 8-bit signed integer.
73 static const RtAudioFormat RTAUDIO_SINT16 = 0x2; // 16-bit signed integer.
74 static const RtAudioFormat RTAUDIO_SINT24 = 0x4; // 24-bit signed integer.
75 static const RtAudioFormat RTAUDIO_SINT32 = 0x8; // 32-bit signed integer.
76 static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; // Normalized between plus/minus 1.0.
77 static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/minus 1.0.
78 
121 typedef unsigned int RtAudioStreamFlags;
122 static const RtAudioStreamFlags RTAUDIO_NONINTERLEAVED = 0x1; // Use non-interleaved buffers (default = interleaved).
123 static const RtAudioStreamFlags RTAUDIO_MINIMIZE_LATENCY = 0x2; // Attempt to set stream parameters for lowest possible latency.
124 static const RtAudioStreamFlags RTAUDIO_HOG_DEVICE = 0x4; // Attempt grab device and prevent use by others.
125 static const RtAudioStreamFlags RTAUDIO_SCHEDULE_REALTIME = 0x8; // Try to select realtime scheduling for callback thread.
126 static const RtAudioStreamFlags RTAUDIO_ALSA_USE_DEFAULT = 0x10; // Use the "default" PCM device (ALSA only).
127 
139 typedef unsigned int RtAudioStreamStatus;
140 static const RtAudioStreamStatus RTAUDIO_INPUT_OVERFLOW = 0x1; // Input data was discarded because of an overflow condition at the driver.
141 static const RtAudioStreamStatus RTAUDIO_OUTPUT_UNDERFLOW = 0x2; // The output buffer ran low, likely causing a gap in the output sound.
142 
144 
182 typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer,
183  unsigned int nFrames,
184  double streamTime,
185  RtAudioStreamStatus status,
186  void *userData );
187 
188 /************************************************************************/
196 /************************************************************************/
197 
198 class RtAudioError : public std::exception
199 {
200  public:
202  enum Type {
214  };
215 
217  RtAudioError( const std::string& message, Type type = RtAudioError::UNSPECIFIED ) throw() : message_(message), type_(type) {}
218 
220  virtual ~RtAudioError( void ) throw() {}
221 
223  virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; }
224 
226  virtual const Type& getType(void) const throw() { return type_; }
227 
229  virtual const std::string& getMessage(void) const throw() { return message_; }
230 
232  virtual const char* what( void ) const throw() { return message_.c_str(); }
233 
234  protected:
235  std::string message_;
236  Type type_;
237 };
238 
240 
244 typedef void (*RtAudioErrorCallback)( RtAudioError::Type type, const std::string &errorText );
245 
246 // **************************************************************** //
247 //
248 // RtAudio class declaration.
249 //
250 // RtAudio is a "controller" used to select an available audio i/o
251 // interface. It presents a common API for the user to call but all
252 // functionality is implemented by the class RtApi and its
253 // subclasses. RtAudio creates an instance of an RtApi subclass
254 // based on the user's API choice. If no choice is made, RtAudio
255 // attempts to make a "logical" API selection.
256 //
257 // **************************************************************** //
258 
259 class RtApi;
260 
261 class RtAudio
262 {
263  public:
264 
266  enum Api {
277  };
278 
280  struct DeviceInfo {
281  bool probed;
282  std::string name;
283  unsigned int outputChannels;
284  unsigned int inputChannels;
285  unsigned int duplexChannels;
288  std::vector<unsigned int> sampleRates;
291  // Default constructor.
292  DeviceInfo()
294  isDefaultOutput(false), isDefaultInput(false), nativeFormats(0) {}
295  };
296 
299  unsigned int deviceId;
300  unsigned int nChannels;
301  unsigned int firstChannel;
303  // Default constructor.
305  : deviceId(0), nChannels(0), firstChannel(0) {}
306  };
307 
309 
365  struct StreamOptions {
367  unsigned int numberOfBuffers;
368  std::string streamName;
369  int priority;
371  // Default constructor.
372  StreamOptions()
373  : flags(0), numberOfBuffers(0), priority(0) {}
374  };
375 
377  static std::string getVersion( void ) throw();
378 
380 
385  static void getCompiledApi( std::vector<RtAudio::Api> &apis ) throw();
386 
388 
396  RtAudio( RtAudio::Api api=UNSPECIFIED );
397 
399 
403  ~RtAudio() throw();
404 
406  RtAudio::Api getCurrentApi( void ) throw();
407 
409 
414  unsigned int getDeviceCount( void ) throw();
415 
417 
427  RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
428 
430 
437  unsigned int getDefaultOutputDevice( void ) throw();
438 
440 
447  unsigned int getDefaultInputDevice( void ) throw();
448 
450 
489  void openStream( RtAudio::StreamParameters *outputParameters,
490  RtAudio::StreamParameters *inputParameters,
491  RtAudioFormat format, unsigned int sampleRate,
492  unsigned int *bufferFrames, RtAudioCallback callback,
493  void *userData = NULL, RtAudio::StreamOptions *options = NULL, RtAudioErrorCallback errorCallback = NULL );
494 
496 
500  void closeStream( void ) throw();
501 
503 
509  void startStream( void );
510 
512 
518  void stopStream( void );
519 
521 
527  void abortStream( void );
528 
530  bool isStreamOpen( void ) const throw();
531 
533  bool isStreamRunning( void ) const throw();
534 
536 
539  double getStreamTime( void );
540 
542 
545  void setStreamTime( double time );
546 
548 
556  long getStreamLatency( void );
557 
559 
564  unsigned int getStreamSampleRate( void );
565 
567  void showWarnings( bool value = true ) throw();
568 
569  protected:
570 
571  void openRtApi( RtAudio::Api api );
572  RtApi *rtapi_;
573 };
574 
575 // Operating system dependent thread functionality.
576 #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__)
577 
578  #ifndef NOMINMAX
579  #define NOMINMAX
580  #endif
581  #include <windows.h>
582  #include <process.h>
583 
584  typedef uintptr_t ThreadHandle;
585  typedef CRITICAL_SECTION StreamMutex;
586 
587 #elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__)
588  // Using pthread library for various flavors of unix.
589  #include <pthread.h>
590 
591  typedef pthread_t ThreadHandle;
592  typedef pthread_mutex_t StreamMutex;
593 
594 #else // Setup for "dummy" behavior
595 
596  #define __RTAUDIO_DUMMY__
597  typedef int ThreadHandle;
598  typedef int StreamMutex;
599 
600 #endif
601 
602 // This global structure type is used to pass callback information
603 // between the private RtAudio stream structure and global callback
604 // handling functions.
605 struct CallbackInfo {
606  void *object; // Used as a "this" pointer.
607  ThreadHandle thread;
608  void *callback;
609  void *userData;
610  void *errorCallback;
611  void *apiInfo; // void pointer for API specific callback information
612  bool isRunning;
613  bool doRealtime;
614  int priority;
615 
616  // Default constructor.
617  CallbackInfo()
618  :object(0), callback(0), userData(0), errorCallback(0), apiInfo(0), isRunning(false), doRealtime(false) {}
619 };
620 
621 // **************************************************************** //
622 //
623 // RtApi class declaration.
624 //
625 // Subclasses of RtApi contain all API- and OS-specific code necessary
626 // to fully implement the RtAudio API.
627 //
628 // Note that RtApi is an abstract base class and cannot be
629 // explicitly instantiated. The class RtAudio will create an
630 // instance of an RtApi subclass (RtApiOss, RtApiAlsa,
631 // RtApiJack, RtApiCore, RtApiDs, or RtApiAsio).
632 //
633 // **************************************************************** //
634 
635 #pragma pack(push, 1)
636 class S24 {
637 
638  protected:
639  unsigned char c3[3];
640 
641  public:
642  S24() {}
643 
644  S24& operator = ( const int& i ) {
645  c3[0] = (i & 0x000000ff);
646  c3[1] = (i & 0x0000ff00) >> 8;
647  c3[2] = (i & 0x00ff0000) >> 16;
648  return *this;
649  }
650 
651  S24( const S24& v ) { *this = v; }
652  S24( const double& d ) { *this = (int) d; }
653  S24( const float& f ) { *this = (int) f; }
654  S24( const signed short& s ) { *this = (int) s; }
655  S24( const char& c ) { *this = (int) c; }
656 
657  int asInt() {
658  int i = c3[0] | (c3[1] << 8) | (c3[2] << 16);
659  if (i & 0x800000) i |= ~0xffffff;
660  return i;
661  }
662 };
663 #pragma pack(pop)
664 
665 #if defined( HAVE_GETTIMEOFDAY )
666  #include <sys/time.h>
667 #endif
668 
669 #include <sstream>
670 
671 class RtApi
672 {
673 public:
674 
675  RtApi();
676  virtual ~RtApi();
677  virtual RtAudio::Api getCurrentApi( void ) = 0;
678  virtual unsigned int getDeviceCount( void ) = 0;
679  virtual RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) = 0;
680  virtual unsigned int getDefaultInputDevice( void );
681  virtual unsigned int getDefaultOutputDevice( void );
682  void openStream( RtAudio::StreamParameters *outputParameters,
683  RtAudio::StreamParameters *inputParameters,
684  RtAudioFormat format, unsigned int sampleRate,
685  unsigned int *bufferFrames, RtAudioCallback callback,
686  void *userData, RtAudio::StreamOptions *options,
687  RtAudioErrorCallback errorCallback );
688  virtual void closeStream( void );
689  virtual void startStream( void ) = 0;
690  virtual void stopStream( void ) = 0;
691  virtual void abortStream( void ) = 0;
692  long getStreamLatency( void );
693  unsigned int getStreamSampleRate( void );
694  virtual double getStreamTime( void );
695  virtual void setStreamTime( double time );
696  bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; }
697  bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; }
698  void showWarnings( bool value ) { showWarnings_ = value; }
699 
700 
701 protected:
702 
703  static const unsigned int MAX_SAMPLE_RATES;
704  static const unsigned int SAMPLE_RATES[];
705 
706  enum { FAILURE, SUCCESS };
707 
708  enum StreamState {
709  STREAM_STOPPED,
710  STREAM_STOPPING,
711  STREAM_RUNNING,
712  STREAM_CLOSED = -50
713  };
714 
715  enum StreamMode {
716  OUTPUT,
717  INPUT,
718  DUPLEX,
719  UNINITIALIZED = -75
720  };
721 
722  // A protected structure used for buffer conversion.
723  struct ConvertInfo {
724  int channels;
725  int inJump, outJump;
726  RtAudioFormat inFormat, outFormat;
727  std::vector<int> inOffset;
728  std::vector<int> outOffset;
729  };
730 
731  // A protected structure for audio streams.
732  struct RtApiStream {
733  unsigned int device[2]; // Playback and record, respectively.
734  void *apiHandle; // void pointer for API specific stream handle information
735  StreamMode mode; // OUTPUT, INPUT, or DUPLEX.
736  StreamState state; // STOPPED, RUNNING, or CLOSED
737  char *userBuffer[2]; // Playback and record, respectively.
738  char *deviceBuffer;
739  bool doConvertBuffer[2]; // Playback and record, respectively.
740  bool userInterleaved;
741  bool deviceInterleaved[2]; // Playback and record, respectively.
742  bool doByteSwap[2]; // Playback and record, respectively.
743  unsigned int sampleRate;
744  unsigned int bufferSize;
745  unsigned int nBuffers;
746  unsigned int nUserChannels[2]; // Playback and record, respectively.
747  unsigned int nDeviceChannels[2]; // Playback and record channels, respectively.
748  unsigned int channelOffset[2]; // Playback and record, respectively.
749  unsigned long latency[2]; // Playback and record, respectively.
750  RtAudioFormat userFormat;
751  RtAudioFormat deviceFormat[2]; // Playback and record, respectively.
752  StreamMutex mutex;
753  CallbackInfo callbackInfo;
754  ConvertInfo convertInfo[2];
755  double streamTime; // Number of elapsed seconds since the stream started.
756 
757 #if defined(HAVE_GETTIMEOFDAY)
758  struct timeval lastTickTimestamp;
759 #endif
760 
761  RtApiStream()
762  :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; }
763  };
764 
765  typedef S24 Int24;
766  typedef signed short Int16;
767  typedef signed int Int32;
768  typedef float Float32;
769  typedef double Float64;
770 
771  std::ostringstream errorStream_;
772  std::string errorText_;
773  bool showWarnings_;
774  RtApiStream stream_;
775  bool firstErrorOccurred_;
776 
784  virtual bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
785  unsigned int firstChannel, unsigned int sampleRate,
786  RtAudioFormat format, unsigned int *bufferSize,
787  RtAudio::StreamOptions *options );
788 
790  void tickStreamTime( void );
791 
793  void clearStreamInfo();
794 
799  void verifyStream( void );
800 
802  void error( RtAudioError::Type type );
803 
808  void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info );
809 
811  void byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format );
812 
814  unsigned int formatBytes( RtAudioFormat format );
815 
817  void setConvertInfo( StreamMode mode, unsigned int firstChannel );
818 };
819 
820 // **************************************************************** //
821 //
822 // Inline RtAudio definitions.
823 //
824 // **************************************************************** //
825 
826 inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
827 inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); }
828 inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); }
829 inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); }
830 inline unsigned int RtAudio :: getDefaultOutputDevice( void ) throw() { return rtapi_->getDefaultOutputDevice(); }
831 inline void RtAudio :: closeStream( void ) throw() { return rtapi_->closeStream(); }
832 inline void RtAudio :: startStream( void ) { return rtapi_->startStream(); }
833 inline void RtAudio :: stopStream( void ) { return rtapi_->stopStream(); }
834 inline void RtAudio :: abortStream( void ) { return rtapi_->abortStream(); }
835 inline bool RtAudio :: isStreamOpen( void ) const throw() { return rtapi_->isStreamOpen(); }
836 inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->isStreamRunning(); }
837 inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); }
838 inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); }
839 inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); }
840 inline void RtAudio :: setStreamTime( double time ) { return rtapi_->setStreamTime( time ); }
841 inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); }
842 
843 // RtApi Subclass prototypes.
844 
845 #if defined(__MACOSX_CORE__)
846 
847 #include <CoreAudio/AudioHardware.h>
848 
849 class RtApiCore: public RtApi
850 {
851 public:
852 
853  RtApiCore();
854  ~RtApiCore();
856  unsigned int getDeviceCount( void );
857  RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
858  unsigned int getDefaultOutputDevice( void );
859  unsigned int getDefaultInputDevice( void );
860  void closeStream( void );
861  void startStream( void );
862  void stopStream( void );
863  void abortStream( void );
864  long getStreamLatency( void );
865 
866  // This function is intended for internal use only. It must be
867  // public because it is called by the internal callback handler,
868  // which is not a member of RtAudio. External use of this function
869  // will most likely produce highly undesireable results!
870  bool callbackEvent( AudioDeviceID deviceId,
871  const AudioBufferList *inBufferList,
872  const AudioBufferList *outBufferList );
873 
874  private:
875 
876  bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
877  unsigned int firstChannel, unsigned int sampleRate,
878  RtAudioFormat format, unsigned int *bufferSize,
879  RtAudio::StreamOptions *options );
880  static const char* getErrorCode( OSStatus code );
881 };
882 
883 #endif
884 
885 #if defined(__UNIX_JACK__)
886 
887 class RtApiJack: public RtApi
888 {
889 public:
890 
891  RtApiJack();
892  ~RtApiJack();
893  RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; }
894  unsigned int getDeviceCount( void );
895  RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
896  void closeStream( void );
897  void startStream( void );
898  void stopStream( void );
899  void abortStream( void );
900  long getStreamLatency( void );
901 
902  // This function is intended for internal use only. It must be
903  // public because it is called by the internal callback handler,
904  // which is not a member of RtAudio. External use of this function
905  // will most likely produce highly undesireable results!
906  bool callbackEvent( unsigned long nframes );
907 
908  private:
909 
910  bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
911  unsigned int firstChannel, unsigned int sampleRate,
912  RtAudioFormat format, unsigned int *bufferSize,
913  RtAudio::StreamOptions *options );
914 };
915 
916 #endif
917 
918 #if defined(__WINDOWS_ASIO__)
919 
920 class RtApiAsio: public RtApi
921 {
922 public:
923 
924  RtApiAsio();
925  ~RtApiAsio();
927  unsigned int getDeviceCount( void );
928  RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
929  void closeStream( void );
930  void startStream( void );
931  void stopStream( void );
932  void abortStream( void );
933  long getStreamLatency( void );
934 
935  // This function is intended for internal use only. It must be
936  // public because it is called by the internal callback handler,
937  // which is not a member of RtAudio. External use of this function
938  // will most likely produce highly undesireable results!
939  bool callbackEvent( long bufferIndex );
940 
941  private:
942 
943  std::vector<RtAudio::DeviceInfo> devices_;
944  void saveDeviceInfo( void );
945  bool coInitialized_;
946  bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
947  unsigned int firstChannel, unsigned int sampleRate,
948  RtAudioFormat format, unsigned int *bufferSize,
949  RtAudio::StreamOptions *options );
950 };
951 
952 #endif
953 
954 #if defined(__WINDOWS_DS__)
955 
956 class RtApiDs: public RtApi
957 {
958 public:
959 
960  RtApiDs();
961  ~RtApiDs();
963  unsigned int getDeviceCount( void );
964  unsigned int getDefaultOutputDevice( void );
965  unsigned int getDefaultInputDevice( void );
966  RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
967  void closeStream( void );
968  void startStream( void );
969  void stopStream( void );
970  void abortStream( void );
971  long getStreamLatency( void );
972 
973  // This function is intended for internal use only. It must be
974  // public because it is called by the internal callback handler,
975  // which is not a member of RtAudio. External use of this function
976  // will most likely produce highly undesireable results!
977  void callbackEvent( void );
978 
979  private:
980 
981  bool coInitialized_;
982  bool buffersRolling;
983  long duplexPrerollBytes;
984  std::vector<struct DsDevice> dsDevices;
985  bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
986  unsigned int firstChannel, unsigned int sampleRate,
987  RtAudioFormat format, unsigned int *bufferSize,
988  RtAudio::StreamOptions *options );
989 };
990 
991 #endif
992 
993 #if defined(__WINDOWS_WASAPI__)
994 
995 struct IMMDeviceEnumerator;
996 
997 class RtApiWasapi : public RtApi
998 {
999 public:
1000  RtApiWasapi();
1001  ~RtApiWasapi();
1002 
1004  unsigned int getDeviceCount( void );
1005  RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
1006  unsigned int getDefaultOutputDevice( void );
1007  unsigned int getDefaultInputDevice( void );
1008  void closeStream( void );
1009  void startStream( void );
1010  void stopStream( void );
1011  void abortStream( void );
1012 
1013 private:
1014  bool coInitialized_;
1015  IMMDeviceEnumerator* deviceEnumerator_;
1016 
1017  bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
1018  unsigned int firstChannel, unsigned int sampleRate,
1019  RtAudioFormat format, unsigned int* bufferSize,
1020  RtAudio::StreamOptions* options );
1021 
1022  static DWORD WINAPI runWasapiThread( void* wasapiPtr );
1023  static DWORD WINAPI stopWasapiThread( void* wasapiPtr );
1024  static DWORD WINAPI abortWasapiThread( void* wasapiPtr );
1025  void wasapiThread();
1026 };
1027 
1028 #endif
1029 
1030 #if defined(__LINUX_ALSA__)
1031 
1032 class RtApiAlsa: public RtApi
1033 {
1034 public:
1035 
1036  RtApiAlsa();
1037  ~RtApiAlsa();
1039  unsigned int getDeviceCount( void );
1040  RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
1041  void closeStream( void );
1042  void startStream( void );
1043  void stopStream( void );
1044  void abortStream( void );
1045 
1046  // This function is intended for internal use only. It must be
1047  // public because it is called by the internal callback handler,
1048  // which is not a member of RtAudio. External use of this function
1049  // will most likely produce highly undesireable results!
1050  void callbackEvent( void );
1051 
1052  private:
1053 
1054  std::vector<RtAudio::DeviceInfo> devices_;
1055  void saveDeviceInfo( void );
1056  bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
1057  unsigned int firstChannel, unsigned int sampleRate,
1058  RtAudioFormat format, unsigned int *bufferSize,
1059  RtAudio::StreamOptions *options );
1060 };
1061 
1062 #endif
1063 
1064 #if defined(__LINUX_PULSE__)
1065 
1066 class RtApiPulse: public RtApi
1067 {
1068 public:
1069  ~RtApiPulse();
1071  unsigned int getDeviceCount( void );
1072  RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
1073  void closeStream( void );
1074  void startStream( void );
1075  void stopStream( void );
1076  void abortStream( void );
1077 
1078  // This function is intended for internal use only. It must be
1079  // public because it is called by the internal callback handler,
1080  // which is not a member of RtAudio. External use of this function
1081  // will most likely produce highly undesireable results!
1082  void callbackEvent( void );
1083 
1084  private:
1085 
1086  std::vector<RtAudio::DeviceInfo> devices_;
1087  void saveDeviceInfo( void );
1088  bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
1089  unsigned int firstChannel, unsigned int sampleRate,
1090  RtAudioFormat format, unsigned int *bufferSize,
1091  RtAudio::StreamOptions *options );
1092 };
1093 
1094 #endif
1095 
1096 #if defined(__LINUX_OSS__)
1097 
1098 class RtApiOss: public RtApi
1099 {
1100 public:
1101 
1102  RtApiOss();
1103  ~RtApiOss();
1105  unsigned int getDeviceCount( void );
1106  RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
1107  void closeStream( void );
1108  void startStream( void );
1109  void stopStream( void );
1110  void abortStream( void );
1111 
1112  // This function is intended for internal use only. It must be
1113  // public because it is called by the internal callback handler,
1114  // which is not a member of RtAudio. External use of this function
1115  // will most likely produce highly undesireable results!
1116  void callbackEvent( void );
1117 
1118  private:
1119 
1120  bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
1121  unsigned int firstChannel, unsigned int sampleRate,
1122  RtAudioFormat format, unsigned int *bufferSize,
1123  RtAudio::StreamOptions *options );
1124 };
1125 
1126 #endif
1127 
1128 #if defined(__RTAUDIO_DUMMY__)
1129 
1130 class RtApiDummy: public RtApi
1131 {
1132 public:
1133 
1134  RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtAudioError::WARNING ); }
1136  unsigned int getDeviceCount( void ) { return 0; }
1137  RtAudio::DeviceInfo getDeviceInfo( unsigned int /*device*/ ) { RtAudio::DeviceInfo info; return info; }
1138  void closeStream( void ) {}
1139  void startStream( void ) {}
1140  void stopStream( void ) {}
1141  void abortStream( void ) {}
1142 
1143  private:
1144 
1145  bool probeDeviceOpen( unsigned int /*device*/, StreamMode /*mode*/, unsigned int /*channels*/,
1146  unsigned int /*firstChannel*/, unsigned int /*sampleRate*/,
1147  RtAudioFormat /*format*/, unsigned int * /*bufferSize*/,
1148  RtAudio::StreamOptions * /*options*/ ) { return false; }
1149 };
1150 
1151 #endif
1152 
1153 #endif
1154 
1155 // Indentation settings for Vim and Emacs
1156 //
1157 // Local Variables:
1158 // c-basic-offset: 2
1159 // indent-tabs-mode: nil
1160 // End:
1161 //
1162 // vim: et sts=2 sw=2

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/RtMidi_8h.html0000644000076600007660000001310612327015203014322 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtMidi.h File Reference

Go to the source code of this file.

Classes

class  RtMidiError
 Exception handling class for RtMidi. More...
 
class  RtMidi
 An abstract base class for realtime MIDI input/output. More...
 
class  RtMidiIn
 A realtime MIDI input class. More...
 
class  RtMidiOut
 A realtime MIDI output class. More...
 

Typedefs

typedef void(* RtMidiErrorCallback )(RtMidiError::Type type, const std::string &errorText)
 RtMidi error callback function prototype. More...
 

Typedef Documentation

typedef void(* RtMidiErrorCallback)(RtMidiError::Type type, const std::string &errorText)

RtMidi error callback function prototype.

Parameters
typeType of error.
errorTextError description.

Note that class behaviour is undefined after a critical error (not a warning) is reported.


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/RtMidi_8h_source.html0000644000076600007660000033353212327015203015712 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtMidi.h
Go to the documentation of this file.
1 /**********************************************************************/
37 /**********************************************************************/
38 
43 #ifndef RTMIDI_H
44 #define RTMIDI_H
45 
46 #define RTMIDI_VERSION "2.1.0"
47 
48 #include <exception>
49 #include <iostream>
50 #include <string>
51 #include <vector>
52 
53 /************************************************************************/
61 /************************************************************************/
62 
63 class RtMidiError : public std::exception
64 {
65  public:
67  enum Type {
79  };
80 
82  RtMidiError( const std::string& message, Type type = RtMidiError::UNSPECIFIED ) throw() : message_(message), type_(type) {}
83 
85  virtual ~RtMidiError( void ) throw() {}
86 
88  virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; }
89 
91  virtual const Type& getType(void) const throw() { return type_; }
92 
94  virtual const std::string& getMessage(void) const throw() { return message_; }
95 
97  virtual const char* what( void ) const throw() { return message_.c_str(); }
98 
99  protected:
100  std::string message_;
101  Type type_;
102 };
103 
105 
112 typedef void (*RtMidiErrorCallback)( RtMidiError::Type type, const std::string &errorText );
113 
114 class MidiApi;
115 
116 class RtMidi
117 {
118  public:
119 
121  enum Api {
128  };
129 
131  static std::string getVersion( void ) throw();
132 
134 
139  static void getCompiledApi( std::vector<RtMidi::Api> &apis ) throw();
140 
142  virtual void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi" ) ) = 0;
143 
145  virtual void openVirtualPort( const std::string portName = std::string( "RtMidi" ) ) = 0;
146 
148  virtual unsigned int getPortCount() = 0;
149 
151  virtual std::string getPortName( unsigned int portNumber = 0 ) = 0;
152 
154  virtual void closePort( void ) = 0;
155 
157  virtual bool isPortOpen( void ) const = 0;
158 
160 
164  virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL ) = 0;
165 
166  protected:
167 
168  RtMidi();
169  virtual ~RtMidi();
170 
171  MidiApi *rtapi_;
172 };
173 
174 /**********************************************************************/
190 /**********************************************************************/
191 
192 // **************************************************************** //
193 //
194 // RtMidiIn and RtMidiOut class declarations.
195 //
196 // RtMidiIn / RtMidiOut are "controllers" used to select an available
197 // MIDI input or output interface. They present common APIs for the
198 // user to call but all functionality is implemented by the classes
199 // MidiInApi, MidiOutApi and their subclasses. RtMidiIn and RtMidiOut
200 // each create an instance of a MidiInApi or MidiOutApi subclass based
201 // on the user's API choice. If no choice is made, they attempt to
202 // make a "logical" API selection.
203 //
204 // **************************************************************** //
205 
206 class RtMidiIn : public RtMidi
207 {
208  public:
209 
211  typedef void (*RtMidiCallback)( double timeStamp, std::vector<unsigned char> *message, void *userData);
212 
214 
232  const std::string clientName = std::string( "RtMidi Input Client"),
233  unsigned int queueSizeLimit = 100 );
234 
236  ~RtMidiIn ( void ) throw();
237 
239  RtMidi::Api getCurrentApi( void ) throw();
240 
242 
247  void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi Input" ) );
248 
250 
259  void openVirtualPort( const std::string portName = std::string( "RtMidi Input" ) );
260 
262 
272  void setCallback( RtMidiCallback callback, void *userData = 0 );
273 
275 
279  void cancelCallback();
280 
282  void closePort( void );
283 
285  virtual bool isPortOpen() const;
286 
288 
291  unsigned int getPortCount();
292 
294 
298  std::string getPortName( unsigned int portNumber = 0 );
299 
301 
308  void ignoreTypes( bool midiSysex = true, bool midiTime = true, bool midiSense = true );
309 
311 
318  double getMessage( std::vector<unsigned char> *message );
319 
321 
325  virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL );
326 
327  protected:
328  void openMidiApi( RtMidi::Api api, const std::string clientName, unsigned int queueSizeLimit );
329 
330 };
331 
332 /**********************************************************************/
346 /**********************************************************************/
347 
348 class RtMidiOut : public RtMidi
349 {
350  public:
351 
353 
361  const std::string clientName = std::string( "RtMidi Output Client") );
362 
364  ~RtMidiOut( void ) throw();
365 
367  RtMidi::Api getCurrentApi( void ) throw();
368 
370 
376  void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi Output" ) );
377 
379  void closePort( void );
380 
382  virtual bool isPortOpen() const;
383 
385 
393  void openVirtualPort( const std::string portName = std::string( "RtMidi Output" ) );
394 
396  unsigned int getPortCount( void );
397 
399 
402  std::string getPortName( unsigned int portNumber = 0 );
403 
405 
409  void sendMessage( std::vector<unsigned char> *message );
410 
412 
416  virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL );
417 
418  protected:
419  void openMidiApi( RtMidi::Api api, const std::string clientName );
420 };
421 
422 
423 // **************************************************************** //
424 //
425 // MidiInApi / MidiOutApi class declarations.
426 //
427 // Subclasses of MidiInApi and MidiOutApi contain all API- and
428 // OS-specific code necessary to fully implement the RtMidi API.
429 //
430 // Note that MidiInApi and MidiOutApi are abstract base classes and
431 // cannot be explicitly instantiated. RtMidiIn and RtMidiOut will
432 // create instances of a MidiInApi or MidiOutApi subclass.
433 //
434 // **************************************************************** //
435 
436 class MidiApi
437 {
438  public:
439 
440  MidiApi();
441  virtual ~MidiApi();
442  virtual RtMidi::Api getCurrentApi( void ) = 0;
443  virtual void openPort( unsigned int portNumber, const std::string portName ) = 0;
444  virtual void openVirtualPort( const std::string portName ) = 0;
445  virtual void closePort( void ) = 0;
446 
447  virtual unsigned int getPortCount( void ) = 0;
448  virtual std::string getPortName( unsigned int portNumber ) = 0;
449 
450  inline bool isPortOpen() const { return connected_; }
451  void setErrorCallback( RtMidiErrorCallback errorCallback );
452 
454  void error( RtMidiError::Type type, std::string errorString );
455 
456 protected:
457  virtual void initialize( const std::string& clientName ) = 0;
458 
459  void *apiData_;
460  bool connected_;
461  std::string errorString_;
462  RtMidiErrorCallback errorCallback_;
463 };
464 
465 class MidiInApi : public MidiApi
466 {
467  public:
468 
469  MidiInApi( unsigned int queueSizeLimit );
470  virtual ~MidiInApi( void );
471  void setCallback( RtMidiIn::RtMidiCallback callback, void *userData );
472  void cancelCallback( void );
473  virtual void ignoreTypes( bool midiSysex, bool midiTime, bool midiSense );
474  double getMessage( std::vector<unsigned char> *message );
475 
476  // A MIDI structure used internally by the class to store incoming
477  // messages. Each message represents one and only one MIDI message.
478  struct MidiMessage {
479  std::vector<unsigned char> bytes;
480  double timeStamp;
481 
482  // Default constructor.
483  MidiMessage()
484  :bytes(0), timeStamp(0.0) {}
485  };
486 
487  struct MidiQueue {
488  unsigned int front;
489  unsigned int back;
490  unsigned int size;
491  unsigned int ringSize;
492  MidiMessage *ring;
493 
494  // Default constructor.
495  MidiQueue()
496  :front(0), back(0), size(0), ringSize(0) {}
497  };
498 
499  // The RtMidiInData structure is used to pass private class data to
500  // the MIDI input handling function or thread.
501  struct RtMidiInData {
502  MidiQueue queue;
503  MidiMessage message;
504  unsigned char ignoreFlags;
505  bool doInput;
506  bool firstMessage;
507  void *apiData;
508  bool usingCallback;
509  RtMidiIn::RtMidiCallback userCallback;
510  void *userData;
511  bool continueSysex;
512 
513  // Default constructor.
514  RtMidiInData()
515  : ignoreFlags(7), doInput(false), firstMessage(true),
516  apiData(0), usingCallback(false), userCallback(0), userData(0),
517  continueSysex(false) {}
518  };
519 
520  protected:
521  RtMidiInData inputData_;
522 };
523 
524 class MidiOutApi : public MidiApi
525 {
526  public:
527 
528  MidiOutApi( void );
529  virtual ~MidiOutApi( void );
530  virtual void sendMessage( std::vector<unsigned char> *message ) = 0;
531 };
532 
533 // **************************************************************** //
534 //
535 // Inline RtMidiIn and RtMidiOut definitions.
536 //
537 // **************************************************************** //
538 
539 inline RtMidi::Api RtMidiIn :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
540 inline void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { rtapi_->openPort( portNumber, portName ); }
541 inline void RtMidiIn :: openVirtualPort( const std::string portName ) { rtapi_->openVirtualPort( portName ); }
542 inline void RtMidiIn :: closePort( void ) { rtapi_->closePort(); }
543 inline bool RtMidiIn :: isPortOpen() const { return rtapi_->isPortOpen(); }
544 inline void RtMidiIn :: setCallback( RtMidiCallback callback, void *userData ) { ((MidiInApi *)rtapi_)->setCallback( callback, userData ); }
545 inline void RtMidiIn :: cancelCallback( void ) { ((MidiInApi *)rtapi_)->cancelCallback(); }
546 inline unsigned int RtMidiIn :: getPortCount( void ) { return rtapi_->getPortCount(); }
547 inline std::string RtMidiIn :: getPortName( unsigned int portNumber ) { return rtapi_->getPortName( portNumber ); }
548 inline void RtMidiIn :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { ((MidiInApi *)rtapi_)->ignoreTypes( midiSysex, midiTime, midiSense ); }
549 inline double RtMidiIn :: getMessage( std::vector<unsigned char> *message ) { return ((MidiInApi *)rtapi_)->getMessage( message ); }
550 inline void RtMidiIn :: setErrorCallback( RtMidiErrorCallback errorCallback ) { rtapi_->setErrorCallback(errorCallback); }
551 
552 inline RtMidi::Api RtMidiOut :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
553 inline void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { rtapi_->openPort( portNumber, portName ); }
554 inline void RtMidiOut :: openVirtualPort( const std::string portName ) { rtapi_->openVirtualPort( portName ); }
555 inline void RtMidiOut :: closePort( void ) { rtapi_->closePort(); }
556 inline bool RtMidiOut :: isPortOpen() const { return rtapi_->isPortOpen(); }
557 inline unsigned int RtMidiOut :: getPortCount( void ) { return rtapi_->getPortCount(); }
558 inline std::string RtMidiOut :: getPortName( unsigned int portNumber ) { return rtapi_->getPortName( portNumber ); }
559 inline void RtMidiOut :: sendMessage( std::vector<unsigned char> *message ) { ((MidiOutApi *)rtapi_)->sendMessage( message ); }
560 inline void RtMidiOut :: setErrorCallback( RtMidiErrorCallback errorCallback ) { rtapi_->setErrorCallback(errorCallback); }
561 
562 // **************************************************************** //
563 //
564 // MidiInApi and MidiOutApi subclass prototypes.
565 //
566 // **************************************************************** //
567 
568 #if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__)
569  #define __RTMIDI_DUMMY__
570 #endif
571 
572 #if defined(__MACOSX_CORE__)
573 
574 class MidiInCore: public MidiInApi
575 {
576  public:
577  MidiInCore( const std::string clientName, unsigned int queueSizeLimit );
578  ~MidiInCore( void );
579  RtMidi::Api getCurrentApi( void ) { return RtMidi::MACOSX_CORE; };
580  void openPort( unsigned int portNumber, const std::string portName );
581  void openVirtualPort( const std::string portName );
582  void closePort( void );
583  unsigned int getPortCount( void );
584  std::string getPortName( unsigned int portNumber );
585 
586  protected:
587  void initialize( const std::string& clientName );
588 };
589 
590 class MidiOutCore: public MidiOutApi
591 {
592  public:
593  MidiOutCore( const std::string clientName );
594  ~MidiOutCore( void );
595  RtMidi::Api getCurrentApi( void ) { return RtMidi::MACOSX_CORE; };
596  void openPort( unsigned int portNumber, const std::string portName );
597  void openVirtualPort( const std::string portName );
598  void closePort( void );
599  unsigned int getPortCount( void );
600  std::string getPortName( unsigned int portNumber );
601  void sendMessage( std::vector<unsigned char> *message );
602 
603  protected:
604  void initialize( const std::string& clientName );
605 };
606 
607 #endif
608 
609 #if defined(__UNIX_JACK__)
610 
611 class MidiInJack: public MidiInApi
612 {
613  public:
614  MidiInJack( const std::string clientName, unsigned int queueSizeLimit );
615  ~MidiInJack( void );
616  RtMidi::Api getCurrentApi( void ) { return RtMidi::UNIX_JACK; };
617  void openPort( unsigned int portNumber, const std::string portName );
618  void openVirtualPort( const std::string portName );
619  void closePort( void );
620  unsigned int getPortCount( void );
621  std::string getPortName( unsigned int portNumber );
622 
623  protected:
624  std::string clientName;
625 
626  void connect( void );
627  void initialize( const std::string& clientName );
628 };
629 
630 class MidiOutJack: public MidiOutApi
631 {
632  public:
633  MidiOutJack( const std::string clientName );
634  ~MidiOutJack( void );
635  RtMidi::Api getCurrentApi( void ) { return RtMidi::UNIX_JACK; };
636  void openPort( unsigned int portNumber, const std::string portName );
637  void openVirtualPort( const std::string portName );
638  void closePort( void );
639  unsigned int getPortCount( void );
640  std::string getPortName( unsigned int portNumber );
641  void sendMessage( std::vector<unsigned char> *message );
642 
643  protected:
644  std::string clientName;
645 
646  void connect( void );
647  void initialize( const std::string& clientName );
648 };
649 
650 #endif
651 
652 #if defined(__LINUX_ALSA__)
653 
654 class MidiInAlsa: public MidiInApi
655 {
656  public:
657  MidiInAlsa( const std::string clientName, unsigned int queueSizeLimit );
658  ~MidiInAlsa( void );
659  RtMidi::Api getCurrentApi( void ) { return RtMidi::LINUX_ALSA; };
660  void openPort( unsigned int portNumber, const std::string portName );
661  void openVirtualPort( const std::string portName );
662  void closePort( void );
663  unsigned int getPortCount( void );
664  std::string getPortName( unsigned int portNumber );
665 
666  protected:
667  void initialize( const std::string& clientName );
668 };
669 
670 class MidiOutAlsa: public MidiOutApi
671 {
672  public:
673  MidiOutAlsa( const std::string clientName );
674  ~MidiOutAlsa( void );
675  RtMidi::Api getCurrentApi( void ) { return RtMidi::LINUX_ALSA; };
676  void openPort( unsigned int portNumber, const std::string portName );
677  void openVirtualPort( const std::string portName );
678  void closePort( void );
679  unsigned int getPortCount( void );
680  std::string getPortName( unsigned int portNumber );
681  void sendMessage( std::vector<unsigned char> *message );
682 
683  protected:
684  void initialize( const std::string& clientName );
685 };
686 
687 #endif
688 
689 #if defined(__WINDOWS_MM__)
690 
691 class MidiInWinMM: public MidiInApi
692 {
693  public:
694  MidiInWinMM( const std::string clientName, unsigned int queueSizeLimit );
695  ~MidiInWinMM( void );
696  RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_MM; };
697  void openPort( unsigned int portNumber, const std::string portName );
698  void openVirtualPort( const std::string portName );
699  void closePort( void );
700  unsigned int getPortCount( void );
701  std::string getPortName( unsigned int portNumber );
702 
703  protected:
704  void initialize( const std::string& clientName );
705 };
706 
707 class MidiOutWinMM: public MidiOutApi
708 {
709  public:
710  MidiOutWinMM( const std::string clientName );
711  ~MidiOutWinMM( void );
712  RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_MM; };
713  void openPort( unsigned int portNumber, const std::string portName );
714  void openVirtualPort( const std::string portName );
715  void closePort( void );
716  unsigned int getPortCount( void );
717  std::string getPortName( unsigned int portNumber );
718  void sendMessage( std::vector<unsigned char> *message );
719 
720  protected:
721  void initialize( const std::string& clientName );
722 };
723 
724 #endif
725 
726 #if defined(__RTMIDI_DUMMY__)
727 
728 class MidiInDummy: public MidiInApi
729 {
730  public:
731  MidiInDummy( const std::string /*clientName*/, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ = "MidiInDummy: This class provides no functionality."; error( RtMidiError::WARNING, errorString_ ); }
732  RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; }
733  void openPort( unsigned int /*portNumber*/, const std::string /*portName*/ ) {}
734  void openVirtualPort( const std::string /*portName*/ ) {}
735  void closePort( void ) {}
736  unsigned int getPortCount( void ) { return 0; }
737  std::string getPortName( unsigned int portNumber ) { return ""; }
738 
739  protected:
740  void initialize( const std::string& /*clientName*/ ) {}
741 };
742 
743 class MidiOutDummy: public MidiOutApi
744 {
745  public:
746  MidiOutDummy( const std::string /*clientName*/ ) { errorString_ = "MidiOutDummy: This class provides no functionality."; error( RtMidiError::WARNING, errorString_ ); }
747  RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; }
748  void openPort( unsigned int /*portNumber*/, const std::string /*portName*/ ) {}
749  void openVirtualPort( const std::string /*portName*/ ) {}
750  void closePort( void ) {}
751  unsigned int getPortCount( void ) { return 0; }
752  std::string getPortName( unsigned int /*portNumber*/ ) { return ""; }
753  void sendMessage( std::vector<unsigned char> * /*message*/ ) {}
754 
755  protected:
756  void initialize( const std::string& /*clientName*/ ) {}
757 };
758 
759 #endif
760 
761 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/RtWvIn_8h_source.html0000644000076600007660000003035112327015203015704 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtWvIn.h
1 #ifndef STK_RTWVIN_H
2 #define STK_RTWVIN_H
3 
4 #include "WvIn.h"
5 #include "RtAudio.h"
6 #include "Mutex.h"
7 
8 namespace stk {
9 
10 /***************************************************/
29 /***************************************************/
30 
31 class RtWvIn : public WvIn
32 {
33 public:
35 
42  RtWvIn( unsigned int nChannels = 1, StkFloat sampleRate = Stk::sampleRate(),
43  int device = 0, int bufferFrames = RT_BUFFER_SIZE, int nBuffers = 20 );
44 
46  ~RtWvIn();
47 
49 
53  void start( void );
54 
56 
60  void stop( void );
61 
63 
72  StkFloat lastOut( unsigned int channel = 0 );
73 
75 
84  StkFloat tick( unsigned int channel = 0 );
85 
87 
94  StkFrames& tick( StkFrames& frames );
95 
96  // This function is not intended for general use but must be
97  // public for access from the audio callback function.
98  void fillBuffer( void *buffer, unsigned int nFrames );
99 
100 protected:
101 
102  RtAudio adc_;
103  Mutex mutex_;
104  bool stopped_;
105  unsigned int readIndex_;
106  unsigned int writeIndex_;
107  unsigned int framesFilled_;
108 
109 };
110 
111 inline StkFloat RtWvIn :: lastOut( unsigned int channel )
112 {
113 #if defined(_STK_DEBUG_)
114  if ( channel >= data_.channels() ) {
115  oStream_ << "RtWvIn::lastOut(): channel argument and audio stream are incompatible!";
116  handleError( StkError::FUNCTION_ARGUMENT );
117  }
118 #endif
119 
120  return lastFrame_[channel];
121 }
122 
123 } // stk namespace
124 
125 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/RtWvOut_8h_source.html0000644000076600007660000002345412327015203016113 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtWvOut.h
1 #ifndef STK_RTWVOUT_H
2 #define STK_RTWVOUT_H
3 
4 #include "WvOut.h"
5 #include "RtAudio.h"
6 #include "Mutex.h"
7 
8 namespace stk {
9 
10 /***************************************************/
28 /***************************************************/
29 
30 class RtWvOut : public WvOut
31 {
32  public:
33 
35 
42  RtWvOut( unsigned int nChannels = 1, StkFloat sampleRate = Stk::sampleRate(),
43  int device = 0, int bufferFrames = RT_BUFFER_SIZE, int nBuffers = 20 );
44 
46  ~RtWvOut();
47 
49 
53  void start( void );
54 
56 
60  void stop( void );
61 
63 
66  void tick( const StkFloat sample );
67 
69 
76  void tick( const StkFrames& frames );
77 
78  // This function is not intended for general use but must be
79  // public for access from the audio callback function.
80  int readBuffer( void *buffer, unsigned int frameCount );
81 
82  protected:
83 
84  RtAudio dac_;
85  Mutex mutex_;
86  bool stopped_;
87  unsigned int readIndex_;
88  unsigned int writeIndex_;
89  long framesFilled_;
90  unsigned int status_; // running = 0, emptying buffer = 1, finished = 2
91 
92 };
93 
94 } // stk namespace
95 
96 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Sampler_8h_source.html0000644000076600007660000002341412327015203016120 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Sampler.h
1 #ifndef STK_SAMPLER_H
2 #define STK_SAMPLER_H
3 
4 #include "Instrmnt.h"
5 #include "ADSR.h"
6 #include "FileLoop.h"
7 #include "OnePole.h"
8 
9 namespace stk {
10 
11 /***************************************************/
20 /***************************************************/
21 
22 class Sampler : public Instrmnt
23 {
24  public:
26  Sampler( void );
27 
29  virtual ~Sampler( void );
30 
32  virtual void setFrequency( StkFloat frequency ) = 0;
33 
35  void keyOn( void );
36 
38  void keyOff( void );
39 
41  virtual void noteOff( StkFloat amplitude );
42 
44  virtual void controlChange( int number, StkFloat value ) = 0;
45 
47  virtual StkFloat tick( unsigned int channel = 0 ) = 0;
48 
50 
57  virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0;
58 
59  protected:
60 
61  ADSR adsr_;
62  std::vector<FileWvIn *> attacks_;
63  std::vector<FileLoop *> loops_;
64  OnePole filter_;
65  StkFloat baseFrequency_;
66  std::vector<StkFloat> attackRatios_;
67  std::vector<StkFloat> loopRatios_;
68  StkFloat attackGain_;
69  StkFloat loopGain_;
70 
71 };
72 
73 } // stk namespace
74 
75 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Saxofony_8h_source.html0000644000076600007660000005221312327015203016322 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Saxofony.h
1 #ifndef STK_SAXOFONY_H
2 #define STK_SAXOFONY_H
3 
4 #include "Instrmnt.h"
5 #include "DelayL.h"
6 #include "ReedTable.h"
7 #include "OneZero.h"
8 #include "Envelope.h"
9 #include "Noise.h"
10 #include "SineWave.h"
11 
12 namespace stk {
13 
14 /***************************************************/
49 /***************************************************/
50 
51 class Saxofony : public Instrmnt
52 {
53  public:
55 
58  Saxofony( StkFloat lowestFrequency );
59 
61  ~Saxofony( void );
62 
64  void clear( void );
65 
67  void setFrequency( StkFloat frequency );
68 
70  void setBlowPosition( StkFloat aPosition );
71 
73  void startBlowing( StkFloat amplitude, StkFloat rate );
74 
76  void stopBlowing( StkFloat rate );
77 
79  void noteOn( StkFloat frequency, StkFloat amplitude );
80 
82  void noteOff( StkFloat amplitude );
83 
85  void controlChange( int number, StkFloat value );
86 
88  StkFloat tick( unsigned int channel = 0 );
89 
91 
98  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
99 
100  protected:
101 
102  DelayL delays_[2];
103  ReedTable reedTable_;
104  OneZero filter_;
105  Envelope envelope_;
106  Noise noise_;
107  SineWave vibrato_;
108 
109  StkFloat outputGain_;
110  StkFloat noiseGain_;
111  StkFloat vibratoGain_;
112  StkFloat position_;
113 
114 };
115 
116 inline StkFloat Saxofony :: tick( unsigned int )
117 {
118  StkFloat pressureDiff;
119  StkFloat breathPressure;
120  StkFloat temp;
121 
122  // Calculate the breath pressure (envelope + noise + vibrato)
123  breathPressure = envelope_.tick();
124  breathPressure += breathPressure * noiseGain_ * noise_.tick();
125  breathPressure += breathPressure * vibratoGain_ * vibrato_.tick();
126 
127  temp = -0.95 * filter_.tick( delays_[0].lastOut() );
128  lastFrame_[0] = temp - delays_[1].lastOut();
129  pressureDiff = breathPressure - lastFrame_[0];
130  delays_[1].tick( temp );
131  delays_[0].tick( breathPressure - (pressureDiff * reedTable_.tick(pressureDiff)) - temp );
132 
133  lastFrame_[0] *= outputGain_;
134  return lastFrame_[0];
135 }
136 
137 inline StkFrames& Saxofony :: tick( StkFrames& frames, unsigned int channel )
138 {
139  unsigned int nChannels = lastFrame_.channels();
140 #if defined(_STK_DEBUG_)
141  if ( channel > frames.channels() - nChannels ) {
142  oStream_ << "Saxofony::tick(): channel and StkFrames arguments are incompatible!";
143  handleError( StkError::FUNCTION_ARGUMENT );
144  }
145 #endif
146 
147  StkFloat *samples = &frames[channel];
148  unsigned int j, hop = frames.channels() - nChannels;
149  if ( nChannels == 1 ) {
150  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
151  *samples++ = tick();
152  }
153  else {
154  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
155  *samples++ = tick();
156  for ( j=1; j<nChannels; j++ )
157  *samples++ = lastFrame_[j];
158  }
159  }
160 
161  return frames;
162 }
163 
164 } // stk namespace
165 
166 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Shakers_8h_source.html0000644000076600007660000011704512327015203016121 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Shakers.h
1 #ifndef STK_SHAKERS_H
2 #define STK_SHAKERS_H
3 
4 #include "Instrmnt.h"
5 #include <cmath>
6 #include <stdlib.h>
7 
8 namespace stk {
9 
10 /***************************************************/
58 /***************************************************/
59 
60 class Shakers : public Instrmnt
61 {
62  public:
64  Shakers( int type = 0 );
65 
67 
71  void noteOn( StkFloat instrument, StkFloat amplitude );
72 
74  void noteOff( StkFloat amplitude );
75 
77  void controlChange( int number, StkFloat value );
78 
80  StkFloat tick( unsigned int channel = 0 );
81 
83 
90  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
91 
92  struct BiQuad {
93  StkFloat gain;
94  StkFloat b[3];
95  StkFloat a[3]; // a0 term assumed equal to 1.0
96  StkFloat inputs[3];
97  StkFloat outputs[3];
98 
99  // Default constructor.
100  BiQuad()
101  {
102  gain = 0.0;
103  for ( int i=0; i<3; i++ ) {
104  b[i] = 0.0;
105  a[i] = 0.0;
106  inputs[i] = 0.0;
107  outputs[i] = 0.0;
108  }
109  }
110  };
111 
112  protected:
113 
114  void setType( int type );
115  void setResonance( BiQuad &filter, StkFloat frequency, StkFloat radius );
116  StkFloat tickResonance( BiQuad &filter, StkFloat input );
117  void setEqualization( StkFloat b0, StkFloat b1, StkFloat b2 );
118  StkFloat tickEqualize( StkFloat input );
119  int randomInt( int max );
120  StkFloat randomFloat( StkFloat max = 1.0 );
121  StkFloat noise( void );
122  void waterDrop( void );
123 
124  int shakerType_;
125  unsigned int nResonances_;
126  StkFloat shakeEnergy_;
127  StkFloat soundDecay_;
128  StkFloat systemDecay_;
129  StkFloat nObjects_;
130  StkFloat sndLevel_;
131  StkFloat baseGain_;
132  StkFloat currentGain_;
133  StkFloat baseDecay_;
134  StkFloat baseObjects_;
135  StkFloat decayScale_;
136  BiQuad equalizer_;
137  StkFloat ratchetCount_;
138  StkFloat ratchetDelta_;
139  StkFloat baseRatchetDelta_;
140  int lastRatchetValue_;
141 
142  std::vector< BiQuad > filters_;
143  std::vector< StkFloat > baseFrequencies_;
144  std::vector< StkFloat > baseRadii_;
145  std::vector< bool > doVaryFrequency_;
146  std::vector< StkFloat > tempFrequencies_;
147  StkFloat varyFactor_;
148 };
149 
150 inline void Shakers :: setResonance( BiQuad &filter, StkFloat frequency, StkFloat radius )
151 {
152  filter.a[1] = -2.0 * radius * cos( TWO_PI * frequency / Stk::sampleRate());
153  filter.a[2] = radius * radius;
154 }
155 
156 inline StkFloat Shakers :: tickResonance( BiQuad &filter, StkFloat input )
157 {
158  filter.outputs[0] = input * filter.gain * currentGain_;
159  filter.outputs[0] -= filter.a[1] * filter.outputs[1] + filter.a[2] * filter.outputs[2];
160  filter.outputs[2] = filter.outputs[1];
161  filter.outputs[1] = filter.outputs[0];
162  return filter.outputs[0];
163 }
164 
165 inline void Shakers :: setEqualization( StkFloat b0, StkFloat b1, StkFloat b2 )
166 {
167  equalizer_.b[0] = b0;
168  equalizer_.b[1] = b1;
169  equalizer_.b[2] = b2;
170 }
171 
172 inline StkFloat Shakers :: tickEqualize( StkFloat input )
173 {
174  equalizer_.inputs[0] = input;
175  equalizer_.outputs[0] = equalizer_.b[0] * equalizer_.inputs[0] + equalizer_.b[1] * equalizer_.inputs[1] + equalizer_.b[2] * equalizer_.inputs[2];
176  equalizer_.inputs[2] = equalizer_.inputs[1];
177  equalizer_.inputs[1] = equalizer_.inputs[0];
178  return equalizer_.outputs[0];
179 }
180 
181 inline int Shakers :: randomInt( int max ) // Return random integer between 0 and max-1
182 {
183  return (int) ((float)max * rand() / (RAND_MAX + 1.0) );
184 }
185 
186 inline StkFloat Shakers :: randomFloat( StkFloat max ) // Return random float between 0.0 and max
187 {
188  return (StkFloat) (max * rand() / (RAND_MAX + 1.0) );
189 }
190 
191 inline StkFloat Shakers :: noise( void ) // Return random StkFloat float between -1.0 and 1.0
192 {
193  return ( (StkFloat) ( 2.0 * rand() / (RAND_MAX + 1.0) ) - 1.0 );
194 }
195 
196 const StkFloat MIN_ENERGY = 0.001;
197 const StkFloat WATER_FREQ_SWEEP = 1.0001;
198 
199 inline void Shakers :: waterDrop( void )
200 {
201  if ( randomInt( 32767 ) < nObjects_) {
202  sndLevel_ = shakeEnergy_;
203  unsigned int j = randomInt( 3 );
204  if ( j == 0 && filters_[0].gain == 0.0 ) { // don't change unless fully decayed
205  tempFrequencies_[0] = baseFrequencies_[1] * (0.75 + (0.25 * noise()));
206  filters_[0].gain = fabs( noise() );
207  }
208  else if (j == 1 && filters_[1].gain == 0.0) {
209  tempFrequencies_[1] = baseFrequencies_[1] * (1.0 + (0.25 * noise()));
210  filters_[1].gain = fabs( noise() );
211  }
212  else if ( filters_[2].gain == 0.0 ) {
213  tempFrequencies_[2] = baseFrequencies_[1] * (1.25 + (0.25 * noise()));
214  filters_[2].gain = fabs( noise() );
215  }
216  }
217 
218  // Sweep center frequencies.
219  for ( unsigned int i=0; i<3; i++ ) { // WATER_RESONANCES = 3
220  filters_[i].gain *= baseRadii_[i];
221  if ( filters_[i].gain > 0.001 ) {
222  tempFrequencies_[i] *= WATER_FREQ_SWEEP;
223  filters_[i].a[1] = -2.0 * baseRadii_[i] * cos( TWO_PI * tempFrequencies_[i] / Stk::sampleRate() );
224  }
225  else
226  filters_[i].gain = 0.0;
227  }
228 }
229 
230 inline StkFloat Shakers :: tick( unsigned int )
231 {
232  unsigned int iTube = 0;
233  StkFloat input = 0.0;
234  if ( shakerType_ == 19 || shakerType_ == 20 ) {
235  if ( ratchetCount_ <= 0 ) return lastFrame_[0] = 0.0;
236 
237  shakeEnergy_ -= ( ratchetDelta_ + ( 0.002 * shakeEnergy_ ) );
238  if ( shakeEnergy_ < 0.0 ) {
239  shakeEnergy_ = 1.0;
240  ratchetCount_--;
241  }
242 
243  if ( randomFloat( 1024 ) < nObjects_ )
244  sndLevel_ += shakeEnergy_ * shakeEnergy_;
245 
246  // Sound is enveloped noise
247  input = sndLevel_ * noise() * shakeEnergy_;
248  }
249  else {
250  if ( shakeEnergy_ < MIN_ENERGY ) return lastFrame_[0] = 0.0;
251 
252  // Exponential system decay
253  shakeEnergy_ *= systemDecay_;
254 
255  // Random events
256  if ( shakerType_ == 21 ) {
257  waterDrop();
258  input = sndLevel_;
259  }
260  else {
261  if ( randomFloat( 1024.0 ) < nObjects_ ) {
262  sndLevel_ += shakeEnergy_;
263  input = sndLevel_;
264  // Vary resonance frequencies if specified.
265  for ( unsigned int i=0; i<nResonances_; i++ ) {
266  if ( doVaryFrequency_[i] ) {
267  StkFloat tempRand = baseFrequencies_[i] * ( 1.0 + ( varyFactor_ * noise() ) );
268  filters_[i].a[1] = -2.0 * baseRadii_[i] * cos( TWO_PI * tempRand / Stk::sampleRate() );
269  }
270  }
271  if ( shakerType_ == 22 ) iTube = randomInt( 7 ); // ANGKLUNG_RESONANCES
272  }
273  }
274  }
275 
276  // Exponential sound decay
277  sndLevel_ *= soundDecay_;
278 
279  // Do resonance filtering
280  lastFrame_[0] = 0.0;
281  if ( shakerType_ == 22 ) {
282  for ( unsigned int i=0; i<nResonances_; i++ ) {
283  if ( i == iTube )
284  lastFrame_[0] += tickResonance( filters_[i], input );
285  else
286  lastFrame_[0] += tickResonance( filters_[i], 0.0 );
287  }
288  }
289  else {
290  for ( unsigned int i=0; i<nResonances_; i++ )
291  lastFrame_[0] += tickResonance( filters_[i], input );
292  }
293 
294  // Do final FIR filtering (lowpass or highpass)
295  lastFrame_[0] = tickEqualize( lastFrame_[0] );
296 
297  //if ( std::abs(lastFrame_[0]) > 1.0 )
298  // std::cout << "lastOutput = " << lastFrame_[0] << std::endl;
299 
300  return lastFrame_[0];
301 }
302 
303 inline StkFrames& Shakers :: tick( StkFrames& frames, unsigned int channel )
304 {
305  unsigned int nChannels = lastFrame_.channels();
306 #if defined(_STK_DEBUG_)
307  if ( channel > frames.channels() - nChannels ) {
308  oStream_ << "Shakers::tick(): channel and StkFrames arguments are incompatible!";
309  handleError( StkError::FUNCTION_ARGUMENT );
310  }
311 #endif
312 
313  StkFloat *samples = &frames[channel];
314  unsigned int j, hop = frames.channels() - nChannels;
315  if ( nChannels == 1 ) {
316  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
317  *samples++ = tick();
318  }
319  else {
320  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
321  *samples++ = tick();
322  for ( j=1; j<nChannels; j++ )
323  *samples++ = lastFrame_[j];
324  }
325  }
326 
327  return frames;
328 }
329 
330 } // stk namespace
331 
332 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Simple_8h_source.html0000644000076600007660000004355512327015203015756 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Simple.h
1 #ifndef STK_SIMPLE_H
2 #define STK_SIMPLE_H
3 
4 #include "Instrmnt.h"
5 #include "ADSR.h"
6 #include "FileLoop.h"
7 #include "OnePole.h"
8 #include "BiQuad.h"
9 #include "Noise.h"
10 
11 namespace stk {
12 
13 /***************************************************/
30 /***************************************************/
31 
32 class Simple : public Instrmnt
33 {
34  public:
36 
39  Simple( void );
40 
42  ~Simple( void );
43 
45  void setFrequency( StkFloat frequency );
46 
48  void keyOn( void );
49 
51  void keyOff( void );
52 
54  void noteOn( StkFloat frequency, StkFloat amplitude );
55 
57  void noteOff( StkFloat amplitude );
58 
60  void controlChange( int number, StkFloat value );
61 
63  StkFloat tick( unsigned int channel = 0 );
64 
66 
73  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
74 
75  protected:
76 
77  ADSR adsr_;
78  FileLoop *loop_;
79  OnePole filter_;
80  BiQuad biquad_;
81  Noise noise_;
82  StkFloat baseFrequency_;
83  StkFloat loopGain_;
84 
85 };
86 
87 inline StkFloat Simple :: tick( unsigned int )
88 {
89  lastFrame_[0] = loopGain_ * loop_->tick();
90  biquad_.tick( noise_.tick() );
91  lastFrame_[0] += (1.0 - loopGain_) * biquad_.lastOut();
92  lastFrame_[0] = filter_.tick( lastFrame_[0] );
93  lastFrame_[0] *= adsr_.tick();
94  return lastFrame_[0];
95 }
96 
97 inline StkFrames& Simple :: tick( StkFrames& frames, unsigned int channel )
98 {
99  unsigned int nChannels = lastFrame_.channels();
100 #if defined(_STK_DEBUG_)
101  if ( channel > frames.channels() - nChannels ) {
102  oStream_ << "Simple::tick(): channel and StkFrames arguments are incompatible!";
103  handleError( StkError::FUNCTION_ARGUMENT );
104  }
105 #endif
106 
107  StkFloat *samples = &frames[channel];
108  unsigned int j, hop = frames.channels() - nChannels;
109  if ( nChannels == 1 ) {
110  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
111  *samples++ = tick();
112  }
113  else {
114  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
115  *samples++ = tick();
116  for ( j=1; j<nChannels; j++ )
117  *samples++ = lastFrame_[j];
118  }
119  }
120 
121  return frames;
122 }
123 
124 } // stk namespace
125 
126 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/SineWave_8h_source.html0000644000076600007660000004575412327015203016251 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


SineWave.h
1 #ifndef STK_SINEWAVE_H
2 #define STK_SINEWAVE_H
3 
4 const unsigned long TABLE_SIZE = 2048;
5 
6 #include "Generator.h"
7 
8 namespace stk {
9 
10 /***************************************************/
23 /***************************************************/
24 
25 class SineWave : public Generator
26 {
27 public:
29  SineWave( void );
30 
32  ~SineWave( void );
33 
35  void reset( void );
36 
38 
41  void setRate( StkFloat rate ) { rate_ = rate; };
42 
44 
50  void setFrequency( StkFloat frequency );
51 
53  void addTime( StkFloat time );
54 
56 
61  void addPhase( StkFloat phase );
62 
64 
68  void addPhaseOffset( StkFloat phaseOffset );
69 
71  StkFloat lastOut( void ) const { return lastFrame_[0]; };
72 
74  StkFloat tick( void );
75 
77 
84  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
85 
86 protected:
87 
88  void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
89 
90  static StkFrames table_;
91  StkFloat time_;
92  StkFloat rate_;
93  StkFloat phaseOffset_;
94  unsigned int iIndex_;
95  StkFloat alpha_;
96 
97 };
98 
99 inline StkFloat SineWave :: tick( void )
100 {
101  // Check limits of time address ... if necessary, recalculate modulo
102  // TABLE_SIZE.
103  while ( time_ < 0.0 )
104  time_ += TABLE_SIZE;
105  while ( time_ >= TABLE_SIZE )
106  time_ -= TABLE_SIZE;
107 
108  iIndex_ = (unsigned int) time_;
109  alpha_ = time_ - iIndex_;
110  StkFloat tmp = table_[ iIndex_ ];
111  tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) );
112 
113  // Increment time, which can be negative.
114  time_ += rate_;
115 
116  lastFrame_[0] = tmp;
117  return lastFrame_[0];
118 }
119 
120 inline StkFrames& SineWave :: tick( StkFrames& frames, unsigned int channel )
121 {
122 #if defined(_STK_DEBUG_)
123  if ( channel >= frames.channels() ) {
124  oStream_ << "SineWave::tick(): channel and StkFrames arguments are incompatible!";
125  handleError( StkError::FUNCTION_ARGUMENT );
126  }
127 #endif
128 
129  StkFloat *samples = &frames[channel];
130  StkFloat tmp = 0.0;
131 
132  unsigned int hop = frames.channels();
133  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
134 
135  // Check limits of time address ... if necessary, recalculate modulo
136  // TABLE_SIZE.
137  while ( time_ < 0.0 )
138  time_ += TABLE_SIZE;
139  while ( time_ >= TABLE_SIZE )
140  time_ -= TABLE_SIZE;
141 
142  iIndex_ = (unsigned int) time_;
143  alpha_ = time_ - iIndex_;
144  tmp = table_[ iIndex_ ];
145  tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) );
146  *samples = tmp;
147 
148  // Increment time, which can be negative.
149  time_ += rate_;
150  }
151 
152  lastFrame_[0] = tmp;
153  return frames;
154 }
155 
156 } // stk namespace
157 
158 #endif
159 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/SingWave_8h_source.html0000644000076600007660000005121212327015203016235 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


SingWave.h
1 #ifndef STK_SINGWAVE_H
2 #define STK_SINGWAVE_H
3 
4 #include "FileLoop.h"
5 #include "Modulate.h"
6 #include "Envelope.h"
7 
8 namespace stk {
9 
10 /***************************************************/
23 /***************************************************/
24 
25 class SingWave : public Generator
26 {
27  public:
29 
36  SingWave( std::string fileName, bool raw = false );
37 
39  ~SingWave( void );
40 
42  void reset( void ) { wave_.reset(); lastFrame_[0] = 0.0; };
43 
45  void normalize( void ) { wave_.normalize(); };
46 
48  void normalize( StkFloat peak ) { wave_.normalize( peak ); };
49 
51  void setFrequency( StkFloat frequency );
52 
54  void setVibratoRate( StkFloat rate ) { modulator_.setVibratoRate( rate ); };
55 
57  void setVibratoGain( StkFloat gain ) { modulator_.setVibratoGain( gain ); };
58 
60  void setRandomGain( StkFloat gain ) { modulator_.setRandomGain( gain ); };
61 
63  void setSweepRate( StkFloat rate ) { sweepRate_ = rate; };
64 
66  void setGainRate( StkFloat rate ) { envelope_.setRate( rate ); };
67 
69  void setGainTarget( StkFloat target ) { envelope_.setTarget( target ); };
70 
72  void noteOn( void ) { envelope_.keyOn(); };
73 
75  void noteOff( void ) { envelope_.keyOff(); };
76 
78  StkFloat lastOut( void ) const { return lastFrame_[0]; };
79 
81  StkFloat tick( void );
82 
84 
91  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
92 
93  protected:
94 
95  FileLoop wave_;
96  Modulate modulator_;
97  Envelope envelope_;
98  Envelope pitchEnvelope_;
99  StkFloat rate_;
100  StkFloat sweepRate_;
101 
102 };
103 
104 inline StkFloat SingWave :: tick( void )
105 {
106  // Set the wave rate.
107  StkFloat newRate = pitchEnvelope_.tick();
108  newRate += newRate * modulator_.tick();
109  wave_.setRate( newRate );
110 
111  lastFrame_[0] = wave_.tick();
112  lastFrame_[0] *= envelope_.tick();
113 
114  return lastFrame_[0];
115 }
116 
117 inline StkFrames& SingWave :: tick( StkFrames& frames, unsigned int channel )
118 {
119 #if defined(_STK_DEBUG_)
120  if ( channel >= frames.channels() ) {
121  oStream_ << "SingWave::tick(): channel and StkFrames arguments are incompatible!";
122  handleError( StkError::FUNCTION_ARGUMENT );
123  }
124 #endif
125 
126  StkFloat *samples = &frames[channel];
127  unsigned int hop = frames.channels();
128  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
129  *samples = SingWave::tick();
130 
131  return frames;
132 }
133 
134 } // stk namespace
135 
136 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Sitar_8h_source.html0000644000076600007660000004431612327015203015603 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Sitar.h
1 #ifndef STK_SITAR_H
2 #define STK_SITAR_H
3 
4 #include "Instrmnt.h"
5 #include "DelayA.h"
6 #include "OneZero.h"
7 #include "Noise.h"
8 #include "ADSR.h"
9 #include <cmath>
10 
11 namespace stk {
12 
13 /***************************************************/
30 /***************************************************/
31 
32 class Sitar : public Instrmnt
33 {
34  public:
36  Sitar( StkFloat lowestFrequency = 8.0 );
37 
39  ~Sitar( void );
40 
42  void clear( void );
43 
45  void setFrequency( StkFloat frequency );
46 
48  void pluck( StkFloat amplitude );
49 
51  void noteOn( StkFloat frequency, StkFloat amplitude );
52 
54  void noteOff( StkFloat amplitude );
55 
57  StkFloat tick( unsigned int channel = 0 );
58 
60 
67  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
68 
69  protected:
70 
71  DelayA delayLine_;
72  OneZero loopFilter_;
73  Noise noise_;
74  ADSR envelope_;
75 
76  StkFloat loopGain_;
77  StkFloat amGain_;
78  StkFloat delay_;
79  StkFloat targetDelay_;
80 
81 };
82 
83 inline StkFloat Sitar :: tick( unsigned int )
84 {
85  if ( fabs(targetDelay_ - delay_) > 0.001 ) {
86  if ( targetDelay_ < delay_ )
87  delay_ *= 0.99999;
88  else
89  delay_ *= 1.00001;
90  delayLine_.setDelay( delay_ );
91  }
92 
93  lastFrame_[0] = delayLine_.tick( loopFilter_.tick( delayLine_.lastOut() * loopGain_ ) +
94  (amGain_ * envelope_.tick() * noise_.tick()));
95 
96  return lastFrame_[0];
97 }
98 
99 inline StkFrames& Sitar :: tick( StkFrames& frames, unsigned int channel )
100 {
101  unsigned int nChannels = lastFrame_.channels();
102 #if defined(_STK_DEBUG_)
103  if ( channel > frames.channels() - nChannels ) {
104  oStream_ << "Sitar::tick(): channel and StkFrames arguments are incompatible!";
105  handleError( StkError::FUNCTION_ARGUMENT );
106  }
107 #endif
108 
109  StkFloat *samples = &frames[channel];
110  unsigned int j, hop = frames.channels() - nChannels;
111  if ( nChannels == 1 ) {
112  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
113  *samples++ = tick();
114  }
115  else {
116  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
117  *samples++ = tick();
118  for ( j=1; j<nChannels; j++ )
119  *samples++ = lastFrame_[j];
120  }
121  }
122 
123  return frames;
124 }
125 
126 } // stk namespace
127 
128 #endif
129 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/skini.html0000644000076600007660000006037612327015204013664 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Synthesis toolKit Instrument Network Interface (SKINI)

This describes the latest (version 1.1) implementation of SKINI for the Synthesis ToolKit in C++ (STK) by Perry R. Cook.

Too good to be true?
Have control and read it too?
A SKINI haiku.

Profound thanks to Dan trueman, Brad Garton, and Gary Scavone for input on this revision. Thanks also to MIDI, the NeXT MusicKit, ZIPI and all the creators and modifiers of these for good bases upon/from which to build and depart.

MIDI Compatibility

SKINI was designed to be MIDI compatible wherever possible, and extend MIDI in incremental, then maybe profound ways.

Differences from MIDI, and motivations, include:

  • Text-based messages are used, with meaningful names wherever possible. This allows any language or system capable of formatted printing to generate SKINI. Similarly, any system capable of reading in a string and turning delimited fields into strings, floats, and ints can consume SKINI for control. More importantly, humans can actually read, and even write if they want, SKINI files and streams. Use an editor and search/replace or macros to change a channel or control number. Load a SKINI score into a spread sheet to apply transformations to time, control parameters, MIDI velocities, etc. Put a monkey on a special typewriter and get your next great work. Life's too short to debug bit/nybble packed variable length mumble messages. Disk space gets cheaper, available bandwidth increases, music takes up so little space and bandwidth compared to video and graphics. Live a little.
  • Floating point numbers are used wherever possible. Note Numbers, Velocities, Controller Values, and Delta and Absolute Times are all represented and scanned as ASCII double-precision floats. MIDI byte values are preserved, so that incoming MIDI bytes from an interface can be put directly into SKINI messages. 60.0 or 60 is middle C, 127.0 or 127 is maximum velocity etc. But, unlike MIDI, 60.5 can cause a 50 cent sharp middle C to be played. As with MIDI byte values like velocity, use of the integer and SKINI-added fractional parts is up to the implementor of the algorithm being controlled by SKINI messages. But the extra precision is there to be used or ignored.

Why SKINI?

SKINI was designed to be extensable and hackable for a number of applications: imbedded synthesis in a game or VR simulation, scoring and mixing tasks, real-time and non-real time applications which could benefit from controllable sound synthesis, JAVA controlled synthesis, or eventually maybe JAVA synthesis, etc. SKINI is not intended to be "the mother of scorefiles," but since the entire system is based on text representations of names, floats, and ints, converters from one scorefile language to SKINI, or back, should be easily created.

I am basically a bottom-up designer with an awareness of top-down design ideas, so SKINI above all reflects the needs of my particular research and creative projects as they have arisen and developed. SKINI 1.1 represents a profound advance beyond versions 0.8 and 0.9 (the first versions), future SKINI's might reflect some changes. Compatibility with prior scorefiles will be attempted, but there aren't that many scorefiles out there yet.

SKINI Messages

A basic SKINI message is a line of text. There are only three required fields, the message type (an ASCII name), the time (either delta or absolute), and the channel number. Don't freak out and think that this is MIDI channel 0-15 (which is supported), because the channel number is scanned as a long int. Channels could be socket numbers, machine IDs, serial numbers, or even unique tags for each event in a synthesis. Other fields might be used, as specified in the SKINI.tbl file. This is described in more detail later.

Fields in a SKINI line are delimited by spaces, commas, or tabs. The SKINI parser only operates on a line at a time, so a newline means the message is over. Multiple messages are NOT allowed directly on a single line (by use of the ; for example in C). This could be supported, but it isn't in version 1.1.

Message types include standard MIDI types like NoteOn, NoteOff, ControlChange, etc. MIDI extension message types (messages which look better than MIDI but actually get turned into MIDI-like messages) include LipTension, StringDamping, etc. Non-MIDI message types include SetPath (sets a path for file use later), and OpenReadFile (for streaming, mixing, and applying effects to soundfiles along with synthesis, for example). Other non-MIDI message types include Trilling, HammerOn, etc. (these translate to gestures, behaviors, and contexts for use by intelligent players and instruments using SKINI). Where possible I will still use these as MIDI extension messages, so foot switches, etc. can be used to control them in real time.

All fields other than type, time, and channel are optional, and the types and useage of the additional fields is defined in the file SKINI.tbl.

The other important file used by SKINI is SKINI.msg, which is a set of #defines to make C code more readable, and to allow reasonably quick re-mapping of control numbers, etc.. All of these defined symbols are assigned integer values. For Java, the #defines could be replaced by declaration and assignment statements, preserving the look and behavior of the rest of the code.

Files Used To Implement SKINI

Skini is a C++ class which can either open a SKINI file and successively read and parse lines of text as SKINI strings, or accept strings from another object and parse them. The latter functionality would be used by a socket, pipe, or other connection receiving SKINI messages a line at a time, usually in real time, but not restricted to real time.

SKINI.msg should be included by anything wanting to use the Skini object. This is not mandatory, but use of the __SK_blah_ symbols which are defined in the .msg file will help to ensure clarity and consistency when messages are added and changed.

SKINI.tbl is used only by the Skini parser object (Skini.cpp). In the file SKINI.tbl, an array of structures is declared and assigned values which instruct the parser as to what the message types are, and what the fields mean for those message types. This table is compiled and linked into applications using SKINI, but could be dynamically loaded and changed in a future version of SKINI.

SKINI Messages and the SKINI Parser:

The parser isn't all that smart, but neither am I. Here are the basic rules governing a valid SKINI message:

  • If the first (non-delimiter ... see below) character in a SKINI string is '/' that line is treated as a comment and echoed to stdout.
  • Spaces, commas, and tabs delimit the fields in a SKINI message line. (We might allow for multiple messages per line later using the semicolon, but probably not. A series of lines with deltaTimes of 0.0 denotes simultaneous events. For read-ability, multiple messages per line doesn't help much, so it's unlikely to be supported later).
  • The first field must be a SKINI message name (like NoteOn). These might become case-insensitive in future versions, so don't plan on exciting clever overloading of names (like noTeOn being different from NoTeON). There can be a number of leading spaces or tabs, but don't exceed 32 or so.
  • The second field must be a time specification in seconds. A time field can be either delta-time (most common and the only one supported in version 0.8), or absolute time. Absolute time messages have an '=' appended to the beginning of the floating point number with no space. So 0.10000 means delta time of 100 ms, while =0.10000 means absolute time of 100 ms. Absolute time messages make most sense in score files, but could also be used for (loose) synchronization in a real-time context. Real-time messages should be time-ordered AND time-correct. That is, if you've sent 100 total delta-time messages of 1.0 seconds, and then send an absolute time message of =90.0 seconds, or if you send two absolute time messages of =100.0 and =90.0 in that order, things will get really fouled up. The SKINI parser doesn't know about time, however. The WvOut device is the master time keeper in the Synthesis Toolkit, so it should be queried to see if absolute time messages are making sense. There's an example of how to do that later in this document. Absolute times are returned by the parser as negative numbers (since negative deltaTimes are not allowed).
  • The third field must be an integer channel number. Don't go crazy and think that this is just MIDI channel 0-15 (which is supported). The channel number is scanned as a long int. Channels 0-15 are in general to be treated as MIDI channels. After that it's wide open. Channels could be socket numbers, machine IDs, serial numbers, or even unique tags for each event in a synthesis. A -1 channel can be used as don't care, omni, or other functions depending on your needs and taste.
  • All remaining fields are specified in the SKINI.tbl file. In general, there are maximum two more fields, which are either SK_INT (long), SK_DBL (double float), or SK_STR (string). The latter is the mechanism by which more arguments can be specified on the line, but the object using SKINI must take that string apart (retrived by using getRemainderString()) and scan it. Any excess fields are stashed in remainderString.

A Short SKINI File:

/* Howdy!!! Welcome to SKINI, by P. Cook 1999
NoteOn 0.000082 2 55 82
NoteOff 1.000000 2 55 0
NoteOn 0.000082 2 69 82
StringDetune 0.100000 2 10
StringDetune 0.100000 2 30
StringDetune 0.100000 2 50
NoteOn 0.000000 2 69 82
StringDetune 0.100000 2 40
StringDetune 0.100000 2 22
StringDetune 0.100000 2 12
//
StringDamping 0.000100 2 0.0
NoteOn 0.000082 2 55 82
NoteOn 0.200000 2 62 82
NoteOn 0.100000 2 71 82
NoteOn 0.200000 2 79 82
NoteOff 1.000000 2 55 82
NoteOff 0.000000 2 62 82
NoteOff 0.000000 2 71 82
NoteOff 0.000000 2 79 82
StringDamping =4.000000 2 0.0
NoteOn 0.000082 2 55 82
NoteOn 0.200000 2 62 82
NoteOn 0.100000 2 71 82
NoteOn 0.200000 2 79 82
NoteOff 1.000000 2 55 82
NoteOff 0.000000 2 62 82
NoteOff 0.000000 2 71 82
NoteOff 0.000000 2 79 82

The SKINI.tbl File and Message Parsing:

The SKINI.tbl file contains an array of structures which are accessed by the parser object Skini.cpp. The struct is:

struct SKINISpec {
char messageString[32];
long type;
long data2;
long data3;
};

so an assignment of one of these structs looks like:

MessageStr$ ,type, data2, data3,

type is the message type sent back from the SKINI line parser.

data<n> is either:

  • NOPE : field not used, specifically, there aren't going to be any more fields on this line. So if there is is NOPE in data2, data3 won't even be checked.
  • SK_INT : byte (actually scanned as 32 bit signed long int). If it's a MIDI data field which is required to be an integer, like a controller number, it's 0-127. Otherwise, get creative with SK_INTs.
  • SK_DBL : double precision floating point. SKINI uses these in the MIDI context for note numbers with micro tuning, velocities, controller values, etc.
  • SK_STR : only valid in final field. This allows (nearly) arbitrary message types to be supported by simply scanning the string to EOL (End Of Line) and then passing it to a more intelligent handler. For example, MIDI SYSEX (system exclusive) messages can be read as space-delimited integers into the SK_STR buffer. Longer bulk dumps, soundfiles, etc. should be handled as a new message type pointing to a FileName, Socket, or something else stored in the SK_STR field, or as a new type of multi-line message.

Each individual SKINI message is parsed and saved to a Skini::Message structure of the form:

struct Message {
long type;
long channel;
StkFloat time;
std::vector<StkFloat> floatValues;
std::vector<long> intValues;
std::string remainder;
};

Here's a couple of lines from the SKINI.tbl file

{"NoteOff" , __SK_NoteOff_, SK_DBL, SK_DBL},
{"NoteOn" , __SK_NoteOn_, SK_DBL, SK_DBL},
{"ControlChange" , __SK_ControlChange_, SK_INT, SK_DBL},
{"Volume" , __SK_ControlChange_, __SK_Volume_ , SK_DBL},
{"StringDamping" , __SK_ControlChange_, __SK_StringDamping_, SK_DBL},
{"StringDetune" , __SK_ControlChange_, __SK_StringDetune_, SK_DBL},

The first three are basic MIDI messages. The first two would cause the parser, after recognizing a match of the string "NoteOff" or "NoteOn", to set the message type to 128 or 144 (__SK_NoteOff_ and __SK_NoteOn_ are #defined in the file SKINI.msg to be the MIDI byte value, without channel, of the actual MIDI messages for NoteOn and NoteOff). The parser would then set the time or delta time (this is always done and is therefore not described in the SKINI Message Struct). The next two fields would be scanned either as double-precision floats or as long ints, depending on the format specified in SKINI.tbl, and saved to the corresponding C++ vector variables in the Skini::Message structure (either floatValues or intValues). Floating-point values are also cast to ints (and vice-versa) and stored to their respective variables. For example, an expected integer value of 64 will also be saved as 64.0 in the corresponding floatValues variable of the Skini::Message structure. The remainder of the line is stashed in the remainderString variable.

The ControlChange spec is basically the same as NoteOn and NoteOff, but the second data byte is set to an integer (for checking later as to what MIDI control is being changed).

The Volume spec is a MIDI Extension message, which behaves like a ControlChange message with the controller number set explicitly to the value for MIDI Volume (7). Thus the following two lines would accomplish the same changing of MIDI volume on channel 2:

ControlChange 0.000000 2 7 64.1
Volume 0.000000 2 64.1

I like the second line better, thus my motivation for SKINI in the first place.

The StringDamping and StringDetune messages behave the same as the Volume message, but use Control Numbers which aren't specifically nailed-down in MIDI. Note that these Control Numbers are carried around as long ints, so we're not limited to 0-127. If, however, you want to use a MIDI controller to play an instrument, using controller numbers in the 0-127 range might make sense.

Using SKINI:

Here's a simple example of code which uses the Skini object to read a SKINI file and control a single instrument.

Skini score;
Skini::Message message;
instrument = new Mandolin(50.0);
score.setFile( argv[1] );
while ( score.nextMessage( message ) != 0 ) {
tempDouble = message.time;
if (tempDouble < 0) {
tempDouble = - tempDouble;
tempDouble = tempDouble - output.getTime();
if (tempDouble < 0) {
printf("Bad News Here!!! Backward Absolute Time Required.\n");
tempDouble = 0.0;
}
}
tempLong = (long) ( tempDouble * Stk::sampleRate() );
for ( i=0; i<tempLong; i++ ) {
output.tick( instrument->tick() );
}
tempDouble3 = message.floatValues[1] * NORM_MIDI;
if ( message.type == __SK_NoteOn_ ) {
if ( tempDouble3 == 0.0 ) {
tempDouble3 = 0.5;
instrument->noteOff( tempDouble3 );
}
else {
tempLong = message.intValues[0];
tempDouble2 = Midi2Pitch[tempLong];
instrument->noteOn( tempDouble2, tempDouble3 );
}
}
else if ( message.type == __SK_NoteOff_ ) {
instrument->noteOff( tempDouble3 );
}
else if ( message.type == __SK_ControlChange_ ) {
tempLong = message.intValues[0];
instrument->controlChange( tempLong, tempDouble3 );
}
}

When a SKINI score is passed to a Skini object using the Skini::setFile() function, valid messages are read from the file and returned using the Skini::nextMessage() function.

The "time" member of a Skini::Message is the deltaTime until the current message should occur. If this is greater than 0, synthesis occurs until the deltaTime has elapsed. If deltaTime is less than zero, the time is interpreted as absolute time and the output device is queried as to what time it is now. That is used to form a deltaTime, and if it's positive we synthesize. If it's negative, we print an error, pretend this never happened and we hang around hoping to eventually catch up.

The rest of the code sorts out message types NoteOn, NoteOff (including NoteOn with velocity 0), and ControlChange. The code implicitly takes into account the integer type of the control number, but all other data is treated as double float.


The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Skini_8h_source.html0000644000076600007660000003503512327015203015574 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Skini.h
1 #ifndef STK_SKINI_H
2 #define STK_SKINI_H
3 
4 #include "Stk.h"
5 #include <vector>
6 #include <string>
7 #include <fstream>
8 
9 namespace stk {
10 
11 /***************************************************/
36 /***************************************************/
37 
38 class Skini : public Stk
39 {
40  public:
41 
43  struct Message {
44  long type;
45  long channel;
46  StkFloat time;
47  std::vector<StkFloat> floatValues;
48  std::vector<long> intValues;
49  std::string remainder;
51  // Default constructor.
52  Message()
53  :type(0), channel(0), time(0.0), floatValues(2), intValues(2) {}
54  };
55 
57  Skini();
58 
60  ~Skini();
61 
63 
67  bool setFile( std::string fileName );
68 
70 
76  long nextMessage( Skini::Message& message );
77 
79 
83  long parseString( std::string& line, Skini::Message& message );
84 
86  static std::string whatsThisType(long type);
87 
89  static std::string whatsThisController(long number);
90 
91  protected:
92 
93  void tokenize( const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters );
94 
95  std::ifstream file_;
96 };
97 
99 static const double Midi2Pitch[129] = {
100  8.176, 8.662, 9.177, 9.723, 10.301, 10.913, 11.562, 12.25,
101  12.978, 13.75, 14.568, 15.434, 16.352, 17.324, 18.354, 19.445,
102  20.602, 21.827, 23.125, 24.50, 25.957, 27.50, 29.135, 30.868,
103  32.703, 34.648, 36.708, 38.891, 41.203, 43.654, 46.249, 49.0,
104  51.913, 55.0, 58.271, 61.735, 65.406, 69.296, 73.416, 77.782,
105  82.407, 87.307, 92.499, 97.999, 103.826, 110.0, 116.541, 123.471,
106  130.813, 138.591, 146.832, 155.563, 164.814, 174.614, 184.997, 195.998,
107  207.652, 220.0, 233.082, 246.942, 261.626, 277.183, 293.665, 311.127,
108  329.628, 349.228, 369.994, 391.995, 415.305, 440.0, 466.164, 493.883,
109  523.251, 554.365, 587.33, 622.254, 659.255, 698.456, 739.989, 783.991,
110  830.609, 880.0, 932.328, 987.767, 1046.502, 1108.731, 1174.659, 1244.508,
111  1318.51, 1396.913, 1479.978, 1567.982, 1661.219, 1760.0, 1864.655, 1975.533,
112  2093.005, 2217.461, 2349.318, 2489.016, 2637.02, 2793.826, 2959.955, 3135.963,
113  3322.438, 3520.0, 3729.31, 3951.066, 4186.009, 4434.922, 4698.636, 4978.032,
114  5274.041, 5587.652, 5919.911, 6271.927, 6644.875, 7040.0, 7458.62, 7902.133,
115  8372.018, 8869.844, 9397.273, 9956.063, 10548.082, 11175.303, 11839.822, 12543.854,
116  13289.75};
117 
118 } // stk namespace
119 
120 #endif
121 
122 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Socket_8h_source.html0000644000076600007660000003162112327015203015744 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Socket.h
1 #ifndef STK_SOCKET_H
2 #define STK_SOCKET_H
3 
4 #include "Stk.h"
5 
6 #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
7 
8  #include <sys/socket.h>
9  #include <sys/types.h>
10  #include <arpa/inet.h>
11  #include <netdb.h>
12  #include <unistd.h>
13  #include <fcntl.h>
14  #include <netinet/in.h>
15  #include <netinet/tcp.h>
16 
17 #elif defined(__OS_WINDOWS__)
18 
19  #include <winsock.h>
20 
21 #endif
22 
23 namespace stk {
24 
25 /***************************************************/
36 /***************************************************/
37 
38 class Socket : public Stk
39 {
40  public:
41 
42  enum ProtocolType {
43  PROTO_TCP,
44  PROTO_UDP
45  };
46 
48  Socket();
49 
51  virtual ~Socket();
52 
54  static void close( int socket );
55 
57  int id( void ) const { return soket_; };
58 
60  int port( void ) const { return port_; };
61 
63  static bool isValid( int socket ) { return socket != -1; };
64 
66  static void setBlocking( int socket, bool enable );
67 
69  virtual int writeBuffer(const void *buffer, long bufferSize, int flags = 0) = 0;
70 
72  virtual int readBuffer(void *buffer, long bufferSize, int flags = 0) = 0;
73 
75  static int writeBuffer(int socket, const void *buffer, long bufferSize, int flags );
76 
78  static int readBuffer(int socket, void *buffer, long bufferSize, int flags );
79 
80  protected:
81 
82  int soket_;
83  int port_;
84 
85 };
86 
87 } // stk namespace
88 
89 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Sphere_8h_source.html0000644000076600007660000003254512327015203015750 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Sphere.h
1 #ifndef STK_SPHERE_H
2 #define STK_SPHERE_H
3 
4 #include "Stk.h"
5 #include "Vector3D.h"
6 
7 namespace stk {
8 
9 /***************************************************/
18 /***************************************************/
19 
20 class Sphere : public Stk
21 {
22 public:
24  Sphere( StkFloat radius = 1.0 ) { radius_ = radius; mass_ = 1.0; };
25 
27  void setPosition( StkFloat x, StkFloat y, StkFloat z ) { position_.setXYZ(x, y, z); };
28 
30  void setVelocity( StkFloat x, StkFloat y, StkFloat z ) { velocity_.setXYZ(x, y, z); };
31 
33  void setRadius( StkFloat radius ) { radius_ = radius; };
34 
36  void setMass( StkFloat mass ) { mass_ = mass; };
37 
39  Vector3D* getPosition( void ) { return &position_; };
40 
43 
45  StkFloat getVelocity( Vector3D* velocity );
46 
48  StkFloat isInside( Vector3D *position );
49 
51  StkFloat getRadius( void ) { return radius_; };
52 
54  StkFloat getMass( void ) { return mass_; };
55 
57  void addVelocity( StkFloat x, StkFloat y, StkFloat z );
58 
60  void tick( StkFloat timeIncrement );
61 
62 private:
63  Vector3D position_;
64  Vector3D velocity_;
65  Vector3D workingVector_;
66  StkFloat radius_;
67  StkFloat mass_;
68 };
69 
70 inline void Sphere::tick( StkFloat timeIncrement )
71 {
72  position_.setX(position_.getX() + (timeIncrement * velocity_.getX()));
73  position_.setY(position_.getY() + (timeIncrement * velocity_.getY()));
74  position_.setZ(position_.getZ() + (timeIncrement * velocity_.getZ()));
75 };
76 
77 } // stk namespace
78 
79 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/StifKarp_8h_source.html0000644000076600007660000005075312327015203016246 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


StifKarp.h
1 #ifndef STK_STIFKARP_H
2 #define STK_STIFKARP_H
3 
4 #include "Instrmnt.h"
5 #include "DelayL.h"
6 #include "DelayA.h"
7 #include "OneZero.h"
8 #include "Noise.h"
9 #include "BiQuad.h"
10 
11 namespace stk {
12 
13 /***************************************************/
34 /***************************************************/
35 
36 class StifKarp : public Instrmnt
37 {
38  public:
40  StifKarp( StkFloat lowestFrequency = 8.0 );
41 
43  ~StifKarp( void );
44 
46  void clear( void );
47 
49  void setFrequency( StkFloat frequency );
50 
52  void setStretch( StkFloat stretch );
53 
55  void setPickupPosition( StkFloat position );
56 
58 
63  void setBaseLoopGain( StkFloat aGain );
64 
66  void pluck( StkFloat amplitude );
67 
69  void noteOn( StkFloat frequency, StkFloat amplitude );
70 
72  void noteOff( StkFloat amplitude );
73 
75  void controlChange( int number, StkFloat value );
76 
78  StkFloat tick( unsigned int channel = 0 );
79 
81 
88  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
89 
90  protected:
91 
92  DelayA delayLine_;
93  DelayL combDelay_;
94  OneZero filter_;
95  Noise noise_;
96  BiQuad biquad_[4];
97 
98  unsigned long length_;
99  StkFloat loopGain_;
100  StkFloat baseLoopGain_;
101  StkFloat lastFrequency_;
102  StkFloat lastLength_;
103  StkFloat stretching_;
104  StkFloat pluckAmplitude_;
105  StkFloat pickupPosition_;
106 
107 };
108 
109 inline StkFloat StifKarp :: tick( unsigned int )
110 {
111  StkFloat temp = delayLine_.lastOut() * loopGain_;
112 
113  // Calculate allpass stretching.
114  for (int i=0; i<4; i++)
115  temp = biquad_[i].tick(temp);
116 
117  // Moving average filter.
118  temp = filter_.tick(temp);
119 
120  lastFrame_[0] = delayLine_.tick(temp);
121  lastFrame_[0] = lastFrame_[0] - combDelay_.tick( lastFrame_[0] );
122  return lastFrame_[0];
123 }
124 
125 inline StkFrames& StifKarp :: tick( StkFrames& frames, unsigned int channel )
126 {
127  unsigned int nChannels = lastFrame_.channels();
128 #if defined(_STK_DEBUG_)
129  if ( channel > frames.channels() - nChannels ) {
130  oStream_ << "StifKarp::tick(): channel and StkFrames arguments are incompatible!";
131  handleError( StkError::FUNCTION_ARGUMENT );
132  }
133 #endif
134 
135  StkFloat *samples = &frames[channel];
136  unsigned int j, hop = frames.channels() - nChannels;
137  if ( nChannels == 1 ) {
138  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
139  *samples++ = tick();
140  }
141  else {
142  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
143  *samples++ = tick();
144  for ( j=1; j<nChannels; j++ )
145  *samples++ = lastFrame_[j];
146  }
147  }
148 
149  return frames;
150 }
151 
152 } // stk namespace
153 
154 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Stk_8h_source.html0000644000076600007660000017665612327015203015277 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Stk.h
1 #ifndef STK_STK_H
2 #define STK_STK_H
3 
4 #include <string>
5 #include <cstring>
6 #include <iostream>
7 #include <sstream>
8 #include <vector>
9 //#include <cstdlib>
10 
17 namespace stk {
18 
19 /***************************************************/
69 /***************************************************/
70 
71 //#define _STK_DEBUG_
72 
73 // Most data in STK is passed and calculated with the
74 // following user-definable floating-point type. You
75 // can change this to "float" if you prefer or perhaps
76 // a "long double" in the future.
77 typedef double StkFloat;
78 
80 
85 class StkError
86 {
87 public:
88  enum Type {
89  STATUS,
90  WARNING,
91  DEBUG_PRINT,
92  MEMORY_ALLOCATION,
93  MEMORY_ACCESS,
94  FUNCTION_ARGUMENT,
95  FILE_NOT_FOUND,
96  FILE_UNKNOWN_FORMAT,
97  FILE_ERROR,
98  PROCESS_THREAD,
99  PROCESS_SOCKET,
100  PROCESS_SOCKET_IPADDR,
101  AUDIO_SYSTEM,
102  MIDI_SYSTEM,
103  UNSPECIFIED
104  };
105 
106 protected:
107  std::string message_;
108  Type type_;
109 
110 public:
112  StkError(const std::string& message, Type type = StkError::UNSPECIFIED)
113  : message_(message), type_(type) {}
114 
116  virtual ~StkError(void) {};
117 
119  virtual void printMessage(void) { std::cerr << '\n' << message_ << "\n\n"; }
120 
122  virtual const Type& getType(void) { return type_; }
123 
125  virtual const std::string& getMessage(void) { return message_; }
126 
128  virtual const char *getMessageCString(void) { return message_.c_str(); }
129 };
130 
131 
132 class Stk
133 {
134 public:
135 
136  typedef unsigned long StkFormat;
137  static const StkFormat STK_SINT8;
138  static const StkFormat STK_SINT16;
139  static const StkFormat STK_SINT24;
140  static const StkFormat STK_SINT32;
141  static const StkFormat STK_FLOAT32;
142  static const StkFormat STK_FLOAT64;
144 
145  static StkFloat sampleRate( void ) { return srate_; }
146 
148 
165  static void setSampleRate( StkFloat rate );
166 
168 
173  void ignoreSampleRateChange( bool ignore = true ) { ignoreSampleRateChange_ = ignore; };
174 
176  static std::string rawwavePath(void) { return rawwavepath_; }
177 
179  static void setRawwavePath( std::string path );
180 
182  static void swap16( unsigned char *ptr );
183 
185  static void swap32( unsigned char *ptr );
186 
188  static void swap64( unsigned char *ptr );
189 
191  static void sleep( unsigned long milliseconds );
192 
194  static bool inRange( StkFloat value, StkFloat min, StkFloat max ) {
195  if ( value < min ) return false;
196  else if ( value > max ) return false;
197  else return true;
198  }
199 
201  static void handleError( const char *message, StkError::Type type );
202 
204  static void handleError( std::string message, StkError::Type type );
205 
207  static void showWarnings( bool status ) { showWarnings_ = status; }
208 
210  static void printErrors( bool status ) { printErrors_ = status; }
211 
212 private:
213  static StkFloat srate_;
214  static std::string rawwavepath_;
215  static bool showWarnings_;
216  static bool printErrors_;
217  static std::vector<Stk *> alertList_;
218 
219 protected:
220 
221  static std::ostringstream oStream_;
222  bool ignoreSampleRateChange_;
223 
225  Stk( void );
226 
228  virtual ~Stk( void );
229 
231  virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
232 
234  void addSampleRateAlert( Stk *ptr );
235 
237  void removeSampleRateAlert( Stk *ptr );
238 
240  void handleError( StkError::Type type ) const;
241 };
242 
243 
244 /***************************************************/
270 /***************************************************/
271 
273 {
274 public:
275 
277  StkFrames( unsigned int nFrames = 0, unsigned int nChannels = 0 );
278 
280  StkFrames( const StkFloat& value, unsigned int nFrames, unsigned int nChannels );
281 
283  ~StkFrames();
284 
285  // A copy constructor.
286  StkFrames( const StkFrames& f );
287 
288  // Assignment operator that returns a reference to self.
289  StkFrames& operator= ( const StkFrames& f );
290 
292 
298  StkFloat& operator[] ( size_t n );
299 
301 
305  StkFloat operator[] ( size_t n ) const;
306 
308 
313  void operator+= ( StkFrames& f );
314 
316 
321  void operator*= ( StkFrames& f );
322 
324 
331  StkFloat& operator() ( size_t frame, unsigned int channel );
332 
334 
339  StkFloat operator() ( size_t frame, unsigned int channel ) const;
340 
342 
348  StkFloat interpolate( StkFloat frame, unsigned int channel = 0 ) const;
349 
351  size_t size() const { return size_; };
352 
354  bool empty() const;
355 
357 
364  void resize( size_t nFrames, unsigned int nChannels = 1 );
365 
367 
374  void resize( size_t nFrames, unsigned int nChannels, StkFloat value );
375 
377  unsigned int channels( void ) const { return nChannels_; };
378 
380  unsigned int frames( void ) const { return (unsigned int)nFrames_; };
381 
383 
387  void setDataRate( StkFloat rate ) { dataRate_ = rate; };
388 
390 
394  StkFloat dataRate( void ) const { return dataRate_; };
395 
396 private:
397 
398  StkFloat *data_;
399  StkFloat dataRate_;
400  size_t nFrames_;
401  unsigned int nChannels_;
402  size_t size_;
403  size_t bufferSize_;
404 
405 };
406 
407 inline bool StkFrames :: empty() const
408 {
409  if ( size_ > 0 ) return false;
410  else return true;
411 }
412 
413 inline StkFloat& StkFrames :: operator[] ( size_t n )
414 {
415 #if defined(_STK_DEBUG_)
416  if ( n >= size_ ) {
417  std::ostringstream error;
418  error << "StkFrames::operator[]: invalid index (" << n << ") value!";
419  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
420  }
421 #endif
422 
423  return data_[n];
424 }
425 
426 inline StkFloat StkFrames :: operator[] ( size_t n ) const
427 {
428 #if defined(_STK_DEBUG_)
429  if ( n >= size_ ) {
430  std::ostringstream error;
431  error << "StkFrames::operator[]: invalid index (" << n << ") value!";
432  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
433  }
434 #endif
435 
436  return data_[n];
437 }
438 
439 inline StkFloat& StkFrames :: operator() ( size_t frame, unsigned int channel )
440 {
441 #if defined(_STK_DEBUG_)
442  if ( frame >= nFrames_ || channel >= nChannels_ ) {
443  std::ostringstream error;
444  error << "StkFrames::operator(): invalid frame (" << frame << ") or channel (" << channel << ") value!";
445  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
446  }
447 #endif
448 
449  return data_[ frame * nChannels_ + channel ];
450 }
451 
452 inline StkFloat StkFrames :: operator() ( size_t frame, unsigned int channel ) const
453 {
454 #if defined(_STK_DEBUG_)
455  if ( frame >= nFrames_ || channel >= nChannels_ ) {
456  std::ostringstream error;
457  error << "StkFrames::operator(): invalid frame (" << frame << ") or channel (" << channel << ") value!";
458  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
459  }
460 #endif
461 
462  return data_[ frame * nChannels_ + channel ];
463 }
464 
466 {
467 #if defined(_STK_DEBUG_)
468  if ( f.frames() != nFrames_ || f.channels() != nChannels_ ) {
469  std::ostringstream error;
470  error << "StkFrames::operator+=: frames argument must be of equal dimensions!";
471  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
472  }
473 #endif
474 
475  StkFloat *fptr = &f[0];
476  StkFloat *dptr = data_;
477  for ( unsigned int i=0; i<size_; i++ )
478  *dptr++ += *fptr++;
479 }
480 
482 {
483 #if defined(_STK_DEBUG_)
484  if ( f.frames() != nFrames_ || f.channels() != nChannels_ ) {
485  std::ostringstream error;
486  error << "StkFrames::operator*=: frames argument must be of equal dimensions!";
487  Stk::handleError( error.str(), StkError::MEMORY_ACCESS );
488  }
489 #endif
490 
491  StkFloat *fptr = &f[0];
492  StkFloat *dptr = data_;
493  for ( unsigned int i=0; i<size_; i++ )
494  *dptr++ *= *fptr++;
495 }
496 
497 // Here are a few other useful typedefs.
498 typedef unsigned short UINT16;
499 typedef unsigned int UINT32;
500 typedef signed short SINT16;
501 typedef signed int SINT32;
502 typedef float FLOAT32;
503 typedef double FLOAT64;
504 
505 // The default sampling rate.
506 const StkFloat SRATE = 44100.0;
507 
508 // The default real-time audio input and output buffer size. If
509 // clicks are occuring in the input and/or output sound stream, a
510 // larger buffer size may help. Larger buffer sizes, however, produce
511 // more latency.
512 const unsigned int RT_BUFFER_SIZE = 512;
513 
514 // The default rawwave path value is set with the preprocessor
515 // definition RAWWAVE_PATH. This can be specified as an argument to
516 // the configure script, in an integrated development environment, or
517 // below. The global STK rawwave path variable can be dynamically set
518 // with the Stk::setRawwavePath() function. This value is
519 // concatenated to the beginning of all references to rawwave files in
520 // the various STK core classes (ex. Clarinet.cpp). If you wish to
521 // move the rawwaves directory to a different location in your file
522 // system, you will need to set this path definition appropriately.
523 #if !defined(RAWWAVE_PATH)
524  #define RAWWAVE_PATH "../../rawwaves/"
525 #endif
526 
527 const StkFloat PI = 3.14159265358979;
528 const StkFloat TWO_PI = 2 * PI;
529 const StkFloat ONE_OVER_128 = 0.0078125;
530 
531 #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_MM__)
532  #define __OS_WINDOWS__
533  #define __STK_REALTIME__
534 #elif defined(__LINUX_OSS__) || defined(__LINUX_ALSA__) || defined(__UNIX_JACK__)
535  #define __OS_LINUX__
536  #define __STK_REALTIME__
537 #elif defined(__IRIX_AL__)
538  #define __OS_IRIX__
539 #elif defined(__MACOSX_CORE__) || defined(__UNIX_JACK__)
540  #define __OS_MACOSX__
541  #define __STK_REALTIME__
542 #endif
543 
544 } // stk namespace
545 
546 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/structRtAudio_1_1DeviceInfo-members.html0000644000076600007660000001007112327015204021372 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudio::DeviceInfo Member List

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/structRtAudio_1_1DeviceInfo.html0000644000076600007660000002230312327015204017743 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudio::DeviceInfo Struct Reference

The public device information structure for returning queried values. More...

#include <RtAudio.h>

Public Attributes

bool probed
 
std::string name
 
unsigned int outputChannels
 
unsigned int inputChannels
 
unsigned int duplexChannels
 
bool isDefaultOutput
 
bool isDefaultInput
 
std::vector< unsigned int > sampleRates
 
RtAudioFormat nativeFormats
 

Detailed Description

The public device information structure for returning queried values.

Member Data Documentation

bool RtAudio::DeviceInfo::probed

true if the device capabilities were successfully probed.

std::string RtAudio::DeviceInfo::name

Character string device identifier.

unsigned int RtAudio::DeviceInfo::outputChannels

Maximum output channels supported by device.

unsigned int RtAudio::DeviceInfo::inputChannels

Maximum input channels supported by device.

unsigned int RtAudio::DeviceInfo::duplexChannels

Maximum simultaneous input/output channels supported by device.

bool RtAudio::DeviceInfo::isDefaultOutput

true if this is the default output device.

bool RtAudio::DeviceInfo::isDefaultInput

true if this is the default input device.

std::vector<unsigned int> RtAudio::DeviceInfo::sampleRates

Supported sample rates (queried from list of standard rates).

RtAudioFormat RtAudio::DeviceInfo::nativeFormats

Bit mask of supported data formats.


The documentation for this struct was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/structRtAudio_1_1StreamOptions-members.html0000644000076600007660000000544112327015204022173 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudio::StreamOptions Member List

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/structRtAudio_1_1StreamOptions.html0000644000076600007660000002311112327015204020535 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudio::StreamOptions Struct Reference

The structure for specifying stream options. More...

#include <RtAudio.h>

Public Attributes

RtAudioStreamFlags flags
 
unsigned int numberOfBuffers
 
std::string streamName
 
int priority
 

Detailed Description

The structure for specifying stream options.

The following flags can be OR'ed together to allow a client to make changes to the default stream behavior:

  • RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved).
  • RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency.
  • RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use.
  • RTAUDIO_SCHEDULE_REALTIME: Attempt to select realtime scheduling for callback thread.
  • RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only).

By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with nFrames samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index nFrames (assuming the buffer pointer was recast to the correct data type for the stream).

Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, RtAudio will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance.

If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs.

If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt to select realtime scheduling (round-robin) for the callback thread. The priority parameter will only be used if the RTAUDIO_SCHEDULE_REALTIME flag is set. It defines the thread's realtime priority.

If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to open the "default" PCM device when using the ALSA API. Note that this will override any specified input or output device id.

The numberOfBuffers parameter can be used to control stream latency in the Windows DirectSound, Linux OSS, and Linux Alsa APIs only. A value of two is usually the smallest allowed. Larger numbers can potentially result in more robust stream performance, though likely at the cost of stream latency. The value set by the user is replaced during execution of the RtAudio::openStream() function by the value actually used by the system.

The streamName parameter can be used to set the client name when using the Jack API. By default, the client name is set to RtApiJack. However, if you wish to create multiple instances of RtAudio with Jack, each instance must have a unique client name.

Member Data Documentation

RtAudioStreamFlags RtAudio::StreamOptions::flags

A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE, RTAUDIO_ALSA_USE_DEFAULT).

unsigned int RtAudio::StreamOptions::numberOfBuffers

Number of stream buffers.

std::string RtAudio::StreamOptions::streamName

A stream name (currently used only in Jack).

int RtAudio::StreamOptions::priority

Scheduling priority of callback thread (only used with flag RTAUDIO_SCHEDULE_REALTIME).


The documentation for this struct was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/structRtAudio_1_1StreamParameters-members.html0000644000076600007660000000507712327015204022650 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudio::StreamParameters Member List

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/structRtAudio_1_1StreamParameters.html0000644000076600007660000001147112327015204021213 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


RtAudio::StreamParameters Struct Reference

The structure for specifying input or ouput stream parameters. More...

#include <RtAudio.h>

Public Attributes

unsigned int deviceId
 
unsigned int nChannels
 
unsigned int firstChannel
 

Detailed Description

The structure for specifying input or ouput stream parameters.

Member Data Documentation

unsigned int RtAudio::StreamParameters::deviceId

Device index (0 to getDeviceCount() - 1).

unsigned int RtAudio::StreamParameters::nChannels

Number of channels.

unsigned int RtAudio::StreamParameters::firstChannel

First channel index on device (default = 0).


The documentation for this struct was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/structstk_1_1Skini_1_1Message-members.html0000644000076600007660000000653012327015205021641 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Skini::Message Member List

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/structstk_1_1Skini_1_1Message.html0000644000076600007660000001564212327015205020215 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk::Skini::Message Struct Reference

A message structure to store and pass parsed SKINI messages. More...

#include <Skini.h>

Public Attributes

long type
 
long channel
 
StkFloat time
 
std::vector< StkFloat > floatValues
 
std::vector< long > intValues
 
std::string remainder
 

Detailed Description

A message structure to store and pass parsed SKINI messages.

Member Data Documentation

long stk::Skini::Message::type

The message type, as defined in SKINI.msg.

long stk::Skini::Message::channel

The message channel (not limited to 16!).

StkFloat stk::Skini::Message::time

The message time stamp in seconds (delta or absolute).

std::vector<StkFloat> stk::Skini::Message::floatValues

The message values read as floats (values are type-specific).

std::vector<long> stk::Skini::Message::intValues

The message values read as ints (number and values are type-specific).

std::string stk::Skini::Message::remainder

Any remaining message data, read as ascii text.


The documentation for this struct was generated from the following file:

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/sync_off.png0000644000076600007660000000152512327015202014162 0ustar gary‰PNG  IHDRàw=øIDATxíÝKhTWÀñÿä1I&3™8M¦Iš™†I3Ú©b$cÌ I1V1±-(Tö±±Ð.* t!‚K[¥Ä¥ˆ„¨´f£`l(øl©"Y”¤6ÆgÌTú}·sgîܹ ±d{8?æÌ¹÷;çÜuíÚ`:!±F¬¢BäŠ?ŰÄm'yÊÅ>ÑlU¯½üý‰è_‹?€Œê ]€Y(ŠNñ±8fý1°Öqún-eâ¨øtºmâÈ Ó0}b›ù%·©µ×Œ®=Ÿ0´³?Š1sŸ‹0€¯8À‘;_ ‹W|%\ Zð— >舽ln¨p©.aÇ{ )t;Ú b nŸš¯›65°¢¡2çÅÔ?Žž>Oдàuönm¤¢Ì`×­Z¬WjC~>‘Ö¾0+á {{©fÝ×Mæ·æÅ•ìÙ¼˜` Ý›%uA6´½ÅÆö¨Á,]k¢ÄW¼™u±›]‹ˆ7§¯iòh€ ¶¶¬ÏÖu1 ló —Ҷ̺–:ÞÍ\ÄcãÏxøhR²Êè‡Qt$¿ß§¨ ª fdºü<4BÿÙ[•f¸d7=.Mé9/—éªÃëù/ÿO Üaàò}€,‘j?Ÿõ.5Úšm?œÿŸ®ŽXÿ2¬#¸d píæ(£?cÛú¼!½›a1¥Þ—ŽòØ©ܾ7dÔK:‚ùÒ‰ì)Ê3‚Ü™àÌà]€,±H€µ+køöäu<|`·LhC7¹ÔeÍ Ÿ×Ÿ˜tÜ‹ óH$^2%l.êaeÐäýE”ÌÉ|ÅÜìî‰Ýsä }¸ýDû^hzé~ðR›¦Ã¡¿]|#ü¯@×—Ö‡[k¹–<|š(Ç*€Ý¹dÇtMé:Ýñø«Ø,êÅû¢]”' øXÓ_nò¡Æ|Øý /c§fžâOIEND®B`‚stk-4.5.0/doc/html/sync_on.png0000644000076600007660000000151512327015202014023 0ustar gary‰PNG  IHDRàw=øIDATxíÝ_HTYÀñï8ã¤ó§i§4-g6ÆËÕ&kQ)¨Ô!Š0ÒURKÚ…„ê¡/»PEÁ>ìK-+KÁ²Ñ.Y”¾dEPaA‰ø°¥¶›ZSÓïÜ;3wºŠ–¯—߯gfîïœsçœWKÇñ.€ÉøD­¨a‘'¬âq_ôˆk¢ÀŒ ÀDŽøQ´ÄïC¨¶åñÏÿgÅ ñ 0„Y‚:qZ¦Á)~õâ€èLý0HVñ× žz-¿‰C“%¨g¦˜6€é8%Úõ¬ëwêÙUÏ¿˜ª³Ä }? ?€·3ÀÀž©Š À”K• @hà a±ðaÇæUe‹ sù~ë2²ì“&Ú&B*AÄljæºììi*˨,Ëçí»÷oÆ£T”,d[˜¼3-*ÁÀ…>å‡Ë çLÉŸçfk˜Ò éw#*AEjKUy>ûšËÉõ&{µ¢8—m5Ki¬ jjƒD*¿NŽÖigwÃ7Dª’mz骹úKÛ¾±ˆ¶M!æ¤ÍkÐ?šoý¬_åÓlXí#Ò~–¸¬ê×ÒÑXŠÓ‘ùRÙ*Eû‚ՂדðEÜ;6«e"Q(²Ù=–¿Ezæ5Kؼָ_ 1òzBªJë ±XŒì96åªjL^7{ùãJÑ÷1½i@%8'7M©_\Qœ#ÓUŒËñýÿyõ Wo Éx8¼s¥v¯ªì|×SnÜ q_m Ýé î>bèÕí[JX,½4[Tú{R£ë¼ôˆ¾þa€tÝjjzzÅ'ÅìȶiIžŽòwÏs ¡€—ÕKøõâC^ŽŒ˜Y­¨µÉ%6¨´êˆº]vÛðhâ½iWv–hôëê°Ò¨¾'æÌ‚·ñ|[ßìúÅ^€YrD=<ýDû]äÇ÷s€Ïõ‹8™ºCì? À ¨—t4õᩎ¡Jã‡W‹É± îr¼cjMɘìx| šE©øNÔ‰œøA¢þ«–€Z¼ñ‡jó î#™§¢¢4gIEND®B`‚stk-4.5.0/doc/html/system.html0000644000076600007660000000775312327015204014073 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


System Requirements

General:

  • A MIDI interface to use MIDI input/output controls. (NOTE: This may be built into the soundcard on your computer.)
  • Tcl/Tk version 8.0 or higher to use the simple Tcl/Tk GUIs provided with the STK distribution (available free over the WWW for all supported realtime platforms).

Linux (specific):

  • A soundcard to use realtime audio input/output capabilities. In order to use the effects project, the soundcard and drivers must support full duplex mode.
  • ALSA device drivers and library for realtime sound and MIDI input/output.
  • OSS device drivers (version 4.0 and higher only) can be used for audio input/output, but MIDI support requires the ALSA library to compile.

Macintosh OS X (specific):

  • 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.
  • If you experience frequent audio input/output "glitches", try increasing the RT_BUFFER_SIZE specified in Stk.h.
  • 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.

Windows95/98/2000/XP/7 (specific):

  • A soundcard to use realtime audio input/output capabilities. In order to use the effects project, the soundcard and drivers must support full duplex mode.
  • DirectX 5.0 (or higher) runtime libraries.
  • For compiling the source (if not already in your system):
    • dsound.h header file (DirectX 6.1) - put somewhere in your header search path
    • dsound.lib library file (DirectX 6.1) - put somewhere in your library search path

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/tab_a.png0000644000076600007660000000021612327015202013416 0ustar gary‰PNG  IHDR$ÇÇ[UIDATxíK €0C'o¤(Šˆ[Žà%Üxÿ#Ù©­ç ùÁöó¦W¦e# 3t I 3+¼øEã~\D½9¯Ûàè’wM·¿öÿ}Yõ_êA4Yžã}IEND®B`‚stk-4.5.0/doc/html/tab_b.png0000644000076600007660000000025112327015202013416 0ustar gary‰PNG  IHDR$ÇÇ[pIDATxíÝMƒ EáÇ»ÐÔ¸¸u`âÀ´V0РÆ}:t]DÁ²s¿ä®‚¶ýËu¥ø|’xùî½À>ÿ1»& mÄ8ÜSÙÑxÜLÀUûšÞ²ÄiE–ŠåOs„¢’nxàÒêÓKN²~jIEND®B`‚stk-4.5.0/doc/html/tab_h.png0000644000076600007660000000026112327015202013425 0ustar gary‰PNG  IHDR$ÇÇ[xIDATxíÝMÁ@†áž~¥ÜÆÎ’Evˆ¿"!•²‘d*×rGq=Š{¼ßSݧçë­ÓÉHÇ uO^õø[À_‡¢ãXvyËþÒ±=·VCffææ{°öŠó´Rçœ%_õçÿŽ¢ö·°Çrug¶(?gh\i>|sIEND®B`‚stk-4.5.0/doc/html/tab_s.png0000644000076600007660000000027012327015202013440 0ustar gary‰PNG  IHDR$ÇÇ[IDATxíÝ ‚@@Ñ£?Q…¤"š¢%¦I‘—Šf–6[´HÃäQƒ<Þâõþ]ždr Í’s?ˆO=Ñññw'ÌF‡Ž íðö-~rÃ[œèŠ­ì¬mƒÖ¬ƒݯнŠÕF)Yº% §`nÌ,9B ™’©!ÑŒ\ý<Å#üîî•IEND®B`‚stk-4.5.0/doc/html/tabs.css0000644000076600007660000000221312327015202013304 0ustar gary.tabs, .tabs2, .tabs3 { background-image: url('tab_b.png'); width: 100%; z-index: 101; font-size: 13px; font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; } .tabs2 { font-size: 10px; } .tabs3 { font-size: 9px; } .tablist { margin: 0; padding: 0; display: table; } .tablist li { float: left; display: table-cell; background-image: url('tab_b.png'); line-height: 36px; list-style: none; } .tablist a { display: block; padding: 0 20px; font-weight: bold; background-image:url('tab_s.png'); background-repeat:no-repeat; background-position:right; color: #283A5D; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); text-decoration: none; outline: none; } .tabs3 .tablist a { padding: 0 10px; } .tablist a:hover { background-image: url('tab_h.png'); background-repeat:repeat-x; color: #fff; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); text-decoration: none; } .tablist li.current a { background-image: url('tab_a.png'); background-repeat:repeat-x; color: #fff; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); } stk-4.5.0/doc/html/TapDelay_8h_source.html0000644000076600007660000007346412327015203016232 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


TapDelay.h
1 #ifndef STK_TAPDELAY_H
2 #define STK_TAPDELAY_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
22 /***************************************************/
23 
24 class TapDelay : public Filter
25 {
26  public:
27 
29 
34  TapDelay( std::vector<unsigned long> taps = std::vector<unsigned long>( 1, 0 ), unsigned long maxDelay = 4095 );
35 
37  ~TapDelay();
38 
40 
47  void setMaximumDelay( unsigned long delay );
48 
50 
53  void setTapDelays( std::vector<unsigned long> taps );
54 
56  std::vector<unsigned long> getTapDelays( void ) const { return delays_; };
57 
59 
67  StkFloat lastOut( unsigned int tap = 0 ) const;
68 
70 
79  StkFrames& tick( StkFloat input, StkFrames& outputs );
80 
82 
91  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
92 
94 
105  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0 );
106 
107  protected:
108 
109  unsigned long inPoint_;
110  std::vector<unsigned long> outPoint_;
111  std::vector<unsigned long> delays_;
112 
113 };
114 
115 inline StkFloat TapDelay :: lastOut( unsigned int tap ) const
116 {
117 #if defined(_STK_DEBUG_)
118  if ( tap >= lastFrame_.size() ) {
119  oStream_ << "TapDelay::lastOut(): tap argument and number of taps are incompatible!";
120  handleError( StkError::FUNCTION_ARGUMENT );
121  }
122 #endif
123 
124  return lastFrame_[tap];
125 }
126 
127 inline StkFrames& TapDelay :: tick( StkFloat input, StkFrames& outputs )
128 {
129 #if defined(_STK_DEBUG_)
130  if ( outputs.channels() < outPoint_.size() ) {
131  oStream_ << "TapDelay::tick(): number of taps > channels in StkFrames argument!";
132  handleError( StkError::FUNCTION_ARGUMENT );
133  }
134 #endif
135 
136  inputs_[inPoint_++] = input * gain_;
137 
138  // Check for end condition
139  if ( inPoint_ == inputs_.size() )
140  inPoint_ = 0;
141 
142  // Read out next values
143  StkFloat *outs = &outputs[0];
144  for ( unsigned int i=0; i<outPoint_.size(); i++ ) {
145  *outs++ = inputs_[outPoint_[i]];
146  lastFrame_[i] = *outs;
147  if ( ++outPoint_[i] == inputs_.size() )
148  outPoint_[i] = 0;
149  }
150 
151  return outputs;
152 }
153 
154 inline StkFrames& TapDelay :: tick( StkFrames& frames, unsigned int channel )
155 {
156 #if defined(_STK_DEBUG_)
157  if ( channel >= frames.channels() ) {
158  oStream_ << "TapDelay::tick(): channel and StkFrames arguments are incompatible!";
159  handleError( StkError::FUNCTION_ARGUMENT );
160  }
161  if ( frames.channels() < outPoint_.size() ) {
162  oStream_ << "TapDelay::tick(): number of taps > channels in StkFrames argument!";
163  handleError( StkError::FUNCTION_ARGUMENT );
164  }
165 #endif
166 
167  StkFloat *iSamples = &frames[channel];
168  StkFloat *oSamples = &frames[0];
169  std::size_t j;
170  unsigned int iHop = frames.channels();
171  std::size_t oHop = frames.channels() - outPoint_.size();
172  for ( unsigned long i=0; i<frames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
173  inputs_[inPoint_++] = *iSamples * gain_;
174  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
175  for ( j=0; j<outPoint_.size(); j++ ) {
176  *oSamples++ = inputs_[outPoint_[j]];
177  if ( ++outPoint_[j] == inputs_.size() ) outPoint_[j] = 0;
178  }
179  }
180 
181  oSamples -= frames.channels();
182  for ( j=0; j<outPoint_.size(); j++ ) lastFrame_[j] = *oSamples++;
183  return frames;
184 }
185 
186 inline StkFrames& TapDelay :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel )
187 {
188 #if defined(_STK_DEBUG_)
189  if ( iChannel >= iFrames.channels() ) {
190  oStream_ << "TapDelay::tick(): channel and StkFrames arguments are incompatible!";
191  handleError( StkError::FUNCTION_ARGUMENT );
192  }
193  if ( oFrames.channels() < outPoint_.size() ) {
194  oStream_ << "TapDelay::tick(): number of taps > channels in output StkFrames argument!";
195  handleError( StkError::FUNCTION_ARGUMENT );
196  }
197 #endif
198 
199  StkFloat *iSamples = &iFrames[iChannel];
200  StkFloat *oSamples = &oFrames[0];
201  std::size_t j;
202  unsigned int iHop = iFrames.channels();
203  std::size_t oHop = oFrames.channels() - outPoint_.size();
204  for ( unsigned long i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
205  inputs_[inPoint_++] = *iSamples * gain_;
206  if ( inPoint_ == inputs_.size() ) inPoint_ = 0;
207  for ( j=0; j<outPoint_.size(); j++ ) {
208  *oSamples++ = inputs_[outPoint_[j]];
209  if ( ++outPoint_[j] == inputs_.size() ) outPoint_[j] = 0;
210  }
211  }
212 
213  oSamples -= oFrames.channels();
214  for ( j=0; j<outPoint_.size(); j++ ) lastFrame_[j] = *oSamples++;
215  return iFrames;
216 }
217 
218 #endif
219 
220 } // stk namespace

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/TcpClient_8h_source.html0000644000076600007660000001555212327015203016406 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


TcpClient.h
1 #ifndef STK_TCPCLIENT_H
2 #define STK_TCPCLIENT_H
3 
4 #include "Socket.h"
5 
6 namespace stk {
7 
8 /***************************************************/
31 /***************************************************/
32 
33 class TcpClient : public Socket
34 {
35  public:
37 
40  TcpClient( int port, std::string hostname = "localhost" );
41 
43  ~TcpClient();
44 
46 
51  int connect( int port, std::string hostname = "localhost" );
52 
54  int writeBuffer(const void *buffer, long bufferSize, int flags = 0);
55 
57  int readBuffer(void *buffer, long bufferSize, int flags = 0);
58 
59  protected:
60 
61 };
62 
63 } // stk namespace
64 
65 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/TcpServer_8h_source.html0000644000076600007660000001535712327015203016441 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


TcpServer.h
1 #ifndef STK_TCPSERVER_H
2 #define STK_TCPSERVER_H
3 
4 #include "Socket.h"
5 
6 namespace stk {
7 
8 /***************************************************/
31 /***************************************************/
32 
33 class TcpServer : public Socket
34 {
35  public:
37 
40  TcpServer( int port = 2006 );
41 
43  ~TcpServer();
44 
46 
51  int accept( void );
52 
54  int writeBuffer(const void *buffer, long bufferSize, int flags = 0);
55 
57  int readBuffer(void *buffer, long bufferSize, int flags = 0);
58 
59  protected:
60 
61 };
62 
63 } // stk namespace
64 
65 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Thread_8h_source.html0000644000076600007660000002325312327015203015725 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Thread.h
1 #ifndef STK_THREAD_H
2 #define STK_THREAD_H
3 
4 #include "Stk.h"
5 
6 #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
7 
8  #include <pthread.h>
9  #define THREAD_TYPE
10  typedef pthread_t THREAD_HANDLE;
11  typedef void * THREAD_RETURN;
12  typedef void * (*THREAD_FUNCTION)(void *);
13 
14 #elif defined(__OS_WINDOWS__)
15 
16  #include <windows.h>
17  #include <process.h>
18  #define THREAD_TYPE __stdcall
19  typedef unsigned long THREAD_HANDLE;
20  typedef unsigned THREAD_RETURN;
21  typedef unsigned (__stdcall *THREAD_FUNCTION)(void *);
22 
23 #endif
24 
25 namespace stk {
26 
27 /***************************************************/
47 /***************************************************/
48 
49 class Thread : public Stk
50 {
51  public:
53  Thread();
54 
56  ~Thread();
57 
59 
64  bool start( THREAD_FUNCTION routine, void * ptr = NULL );
65 
67 
74  bool cancel(void);
75 
77 
80  bool wait(void);
81 
83 
88  void testCancel(void);
89 
90  protected:
91 
92  THREAD_HANDLE thread_;
93 
94 };
95 
96 } // stk namespace
97 
98 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/TubeBell_8h_source.html0000644000076600007660000003645512327015203016224 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


TubeBell.h
1 #ifndef STK_TUBEBELL_H
2 #define STK_TUBEBELL_H
3 
4 #include "FM.h"
5 
6 namespace stk {
7 
8 /***************************************************/
38 /***************************************************/
39 
40 class TubeBell : public FM
41 {
42  public:
44 
47  TubeBell( void );
48 
50  ~TubeBell( void );
51 
53  void noteOn( StkFloat frequency, StkFloat amplitude );
54 
56  StkFloat tick( unsigned int channel = 0 );
57 
59 
66  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
67 
68  protected:
69 
70 };
71 
72 inline StkFloat TubeBell :: tick( unsigned int )
73 {
74  StkFloat temp, temp2;
75 
76  temp = gains_[1] * adsr_[1]->tick() * waves_[1]->tick();
77  temp = temp * control1_;
78 
79  waves_[0]->addPhaseOffset( temp );
80  waves_[3]->addPhaseOffset( twozero_.lastOut() );
81  temp = gains_[3] * adsr_[3]->tick() * waves_[3]->tick();
82  twozero_.tick( temp );
83 
84  waves_[2]->addPhaseOffset( temp );
85  temp = ( 1.0 - (control2_ * 0.5)) * gains_[0] * adsr_[0]->tick() * waves_[0]->tick();
86  temp += control2_ * 0.5 * gains_[2] * adsr_[2]->tick() * waves_[2]->tick();
87 
88  // Calculate amplitude modulation and apply it to output.
89  temp2 = vibrato_.tick() * modDepth_;
90  temp = temp * (1.0 + temp2);
91 
92  lastFrame_[0] = temp * 0.5;
93  return lastFrame_[0];
94 }
95 
96 inline StkFrames& TubeBell :: tick( StkFrames& frames, unsigned int channel )
97 {
98  unsigned int nChannels = lastFrame_.channels();
99 #if defined(_STK_DEBUG_)
100  if ( channel > frames.channels() - nChannels ) {
101  oStream_ << "TubeBell::tick(): channel and StkFrames arguments are incompatible!";
102  handleError( StkError::FUNCTION_ARGUMENT );
103  }
104 #endif
105 
106  StkFloat *samples = &frames[channel];
107  unsigned int j, hop = frames.channels() - nChannels;
108  if ( nChannels == 1 ) {
109  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
110  *samples++ = tick();
111  }
112  else {
113  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
114  *samples++ = tick();
115  for ( j=1; j<nChannels; j++ )
116  *samples++ = lastFrame_[j];
117  }
118  }
119 
120  return frames;
121 }
122 
123 } // stk namespace
124 
125 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/tutorial.html0000644000076600007660000000564012327015204014403 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Tutorial

The Synthesis ToolKit is a set of C++ classes. In order to go beyond the simple example programs we provide, it is necessary to know some basics about programming in C and C++. STK's "target audience" includes people who:

  • want to create audio DSP and/or synthesis programs
  • want to use our unit generators and input/output routines rather than code their own
  • want to learn about synthesis and processing algorithms
  • wish to teach real-time synthesis and processing and wish to use some of our classes and examples

Most ToolKit programmers will likely end up writing a class or two for their own particular needs, but this task is typically simplified by making use of pre-existing STK classes (filters, oscillators, etc.).

The following tutorial chapters describe many of the fundamental ToolKit concepts and classes. All tutorial programs are included in the projects/examples directory.

  1. STK Fundamentals
  2. Hello Sine!
  3. Compiling
  4. Using Filters
  5. Realtime Audio (blocking)
  6. Realtime Audio (callback)
  7. Instruments
  8. Control Input
  9. Multi-Channel I/O
  10. Voice Management

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Twang_8h_source.html0000644000076600007660000005214612327015203015601 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Twang.h
1 #ifndef STK_TWANG_H
2 #define STK_TWANG_H
3 
4 #include "Stk.h"
5 #include "DelayA.h"
6 #include "DelayL.h"
7 #include "Fir.h"
8 
9 namespace stk {
10 
11 /***************************************************/
32 /***************************************************/
33 
34 class Twang : public Stk
35 {
36  public:
38  Twang( StkFloat lowestFrequency = 50.0 );
39 
41  void clear( void );
42 
44  void setLowestFrequency( StkFloat frequency );
45 
47  void setFrequency( StkFloat frequency );
48 
50  void setPluckPosition( StkFloat position );
51 
53 
59  void setLoopGain( StkFloat loopGain );
60 
62 
67  void setLoopFilter( std::vector<StkFloat> coefficients );
68 
70  //const StkFrames& lastFrame( void ) const { return lastFrame_; };
71 
73  // StkFloat lastOut( void ) { return lastFrame_[0]; };
74  StkFloat lastOut( void ) { return lastOutput_; };
75 
77  StkFloat tick( StkFloat input );
78 
80 
88  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
89 
91 
99  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
100 
101  protected:
102 
103  DelayA delayLine_;
104  DelayL combDelay_;
105  Fir loopFilter_;
106 
107  StkFloat lastOutput_;
108  StkFloat frequency_;
109  StkFloat loopGain_;
110  StkFloat pluckPosition_;
111 };
112 
113 inline StkFloat Twang :: tick( StkFloat input )
114 {
115  lastOutput_ = delayLine_.tick( input + loopFilter_.tick( delayLine_.lastOut() ) );
116  lastOutput_ -= combDelay_.tick( lastOutput_ ); // comb filtering on output
117  lastOutput_ *= 0.5;
118 
119  return lastOutput_;
120 }
121 
122 inline StkFrames& Twang :: tick( StkFrames& frames, unsigned int channel )
123 {
124 #if defined(_STK_DEBUG_)
125  if ( channel >= frames.channels() ) {
126  oStream_ << "Twang::tick(): channel and StkFrames arguments are incompatible!";
127  handleError( StkError::FUNCTION_ARGUMENT );
128  }
129 #endif
130 
131  StkFloat *samples = &frames[channel];
132  unsigned int hop = frames.channels();
133  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
134  *samples = tick( *samples );
135 
136  return frames;
137 }
138 
139 inline StkFrames& Twang :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
140 {
141 #if defined(_STK_DEBUG_)
142  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
143  oStream_ << "Twang::tick(): channel and StkFrames arguments are incompatible!";
144  handleError( StkError::FUNCTION_ARGUMENT );
145  }
146 #endif
147 
148  StkFloat *iSamples = &iFrames[iChannel];
149  StkFloat *oSamples = &oFrames[oChannel];
150  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
151  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop )
152  *oSamples = tick( *iSamples );
153 
154  return iFrames;
155 }
156 
157 } // stk namespace
158 
159 #endif
160 

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/TwoPole_8h_source.html0000644000076600007660000005127512327015203016114 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


TwoPole.h
1 #ifndef STK_TWOPOLE_H
2 #define STK_TWOPOLE_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
18 /***************************************************/
19 
20 class TwoPole : public Filter
21 {
22  public:
23 
25  TwoPole( void );
26 
28  ~TwoPole();
29 
31  void ignoreSampleRateChange( bool ignore = true ) { ignoreSampleRateChange_ = ignore; };
32 
34  void setB0( StkFloat b0 ) { b_[0] = b0; };
35 
37  void setA1( StkFloat a1 ) { a_[1] = a1; };
38 
40  void setA2( StkFloat a2 ) { a_[2] = a2; };
41 
43  void setCoefficients( StkFloat b0, StkFloat a1, StkFloat a2, bool clearState = false );
44 
46 
61  void setResonance(StkFloat frequency, StkFloat radius, bool normalize = false);
62 
64  StkFloat lastOut( void ) const { return lastFrame_[0]; };
65 
67  StkFloat tick( StkFloat input );
68 
70 
78  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
79 
81 
89  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
90 
91  protected:
92 
93  virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
94 };
95 
96 inline StkFloat TwoPole :: tick( StkFloat input )
97 {
98  inputs_[0] = gain_ * input;
99  lastFrame_[0] = b_[0] * inputs_[0] - a_[1] * outputs_[1] - a_[2] * outputs_[2];
100  outputs_[2] = outputs_[1];
101  outputs_[1] = lastFrame_[0];
102 
103  return lastFrame_[0];
104 }
105 
106 inline StkFrames& TwoPole :: tick( StkFrames& frames, unsigned int channel )
107 {
108 #if defined(_STK_DEBUG_)
109  if ( channel >= frames.channels() ) {
110  oStream_ << "TwoPole::tick(): channel and StkFrames arguments are incompatible!";
111  handleError( StkError::FUNCTION_ARGUMENT );
112  }
113 #endif
114 
115  StkFloat *samples = &frames[channel];
116  unsigned int hop = frames.channels();
117  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
118  inputs_[0] = gain_ * *samples;
119  *samples = b_[0] * inputs_[0] - a_[1] * outputs_[1] - a_[2] * outputs_[2];
120  outputs_[2] = outputs_[1];
121  outputs_[1] = *samples;
122  }
123 
124  lastFrame_[0] = outputs_[1];
125  return frames;
126 }
127 
128 inline StkFrames& TwoPole :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
129 {
130 #if defined(_STK_DEBUG_)
131  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
132  oStream_ << "TwoPole::tick(): channel and StkFrames arguments are incompatible!";
133  handleError( StkError::FUNCTION_ARGUMENT );
134  }
135 #endif
136 
137  StkFloat *iSamples = &iFrames[iChannel];
138  StkFloat *oSamples = &oFrames[oChannel];
139  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
140  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
141  inputs_[0] = gain_ * *iSamples;
142  *oSamples = b_[0] * inputs_[0] - a_[1] * outputs_[1] - a_[2] * outputs_[2];
143  outputs_[2] = outputs_[1];
144  outputs_[1] = *oSamples;
145  }
146 
147  lastFrame_[0] = outputs_[1];
148  return iFrames;
149 }
150 
151 } // stk namespace
152 
153 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/TwoZero_8h_source.html0000644000076600007660000005070512327015203016131 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


TwoZero.h
1 #ifndef STK_TWOZERO_H
2 #define STK_TWOZERO_H
3 
4 #include "Filter.h"
5 
6 namespace stk {
7 
8 /***************************************************/
18 /***************************************************/
19 
20 class TwoZero : public Filter
21 {
22  public:
24  TwoZero();
25 
27  ~TwoZero();
28 
30  void ignoreSampleRateChange( bool ignore = true ) { ignoreSampleRateChange_ = ignore; };
31 
33  void setB0( StkFloat b0 ) { b_[0] = b0; };
34 
36  void setB1( StkFloat b1 ) { b_[1] = b1; };
37 
39  void setB2( StkFloat b2 ) { b_[2] = b2; };
40 
42  void setCoefficients( StkFloat b0, StkFloat b1, StkFloat b2, bool clearState = false );
43 
45 
57  void setNotch( StkFloat frequency, StkFloat radius );
58 
60  StkFloat lastOut( void ) const { return lastFrame_[0]; };
61 
63  StkFloat tick( StkFloat input );
64 
66 
74  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
75 
77 
85  StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
86 
87  protected:
88 
89  void sampleRateChanged( StkFloat newRate, StkFloat oldRate );
90 };
91 
92 inline StkFloat TwoZero :: tick( StkFloat input )
93 {
94  inputs_[0] = gain_ * input;
95  lastFrame_[0] = b_[2] * inputs_[2] + b_[1] * inputs_[1] + b_[0] * inputs_[0];
96  inputs_[2] = inputs_[1];
97  inputs_[1] = inputs_[0];
98 
99  return lastFrame_[0];
100 }
101 
102 inline StkFrames& TwoZero :: tick( StkFrames& frames, unsigned int channel )
103 {
104 #if defined(_STK_DEBUG_)
105  if ( channel >= frames.channels() ) {
106  oStream_ << "TwoZero::tick(): channel and StkFrames arguments are incompatible!";
107  handleError( StkError::FUNCTION_ARGUMENT );
108  }
109 #endif
110 
111  StkFloat *samples = &frames[channel];
112  unsigned int hop = frames.channels();
113  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
114  inputs_[0] = gain_ * *samples;
115  *samples = b_[2] * inputs_[2] + b_[1] * inputs_[1] + b_[0] * inputs_[0];
116  inputs_[2] = inputs_[1];
117  inputs_[1] = inputs_[0];
118  }
119 
120  lastFrame_[0] = *(samples-hop);
121  return frames;
122 }
123 
124 inline StkFrames& TwoZero :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
125 {
126 #if defined(_STK_DEBUG_)
127  if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
128  oStream_ << "TwoZero::tick(): channel and StkFrames arguments are incompatible!";
129  handleError( StkError::FUNCTION_ARGUMENT );
130  }
131 #endif
132 
133  StkFloat *iSamples = &iFrames[iChannel];
134  StkFloat *oSamples = &oFrames[oChannel];
135  unsigned int iHop = iFrames.channels(), oHop = oFrames.channels();
136  for ( unsigned int i=0; i<iFrames.frames(); i++, iSamples += iHop, oSamples += oHop ) {
137  inputs_[0] = gain_ * *iSamples;
138  *oSamples = b_[2] * inputs_[2] + b_[1] * inputs_[1] + b_[0] * inputs_[0];
139  inputs_[2] = inputs_[1];
140  inputs_[1] = inputs_[0];
141  }
142 
143  lastFrame_[0] = *(oSamples-oHop);
144  return iFrames;
145 }
146 
147 } // stk namespace
148 
149 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/UdpSocket_8h_source.html0000644000076600007660000002144612327015203016421 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


UdpSocket.h
1 #ifndef STK_UDPSOCKET_H
2 #define STK_UDPSOCKET_H
3 
4 #include "Socket.h"
5 
6 namespace stk {
7 
8 /***************************************************/
29 /***************************************************/
30 
31 class UdpSocket : public Socket
32 {
33  public:
35 
38  UdpSocket( int port = 2006 );
39 
41  ~UdpSocket();
42 
44 
47  void setDestination( int port = 2006, std::string hostname = "localhost" );
48 
50 
53  int writeBuffer(const void *buffer, long bufferSize, int flags = 0);
54 
56  int readBuffer(void *buffer, long bufferSize, int flags = 0);
57 
59  int writeBufferTo(const void *buffer, long bufferSize, int port, std::string hostname = "localhost", int flags = 0 );
60 
61  protected:
62 
64 
67  void setAddress( struct sockaddr_in *address, int port = 2006, std::string hostname = "localhost" );
68 
69  struct sockaddr_in address_;
70  bool validAddress_;
71 
72 };
73 
74 } // stk namespace
75 
76 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/usage.html0000644000076600007660000004637012327015204013651 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Usage Documentation

Directory Structure:

The top level distribution contains the following directories:

  • The src directory contains the source .cpp files for all the STK unit generator and algorithm classes.

  • The include directory contains the header files for all the STK unit generator and algorithm classes.

  • The rawwaves directory contains various raw, monophonic, 16-bit, big-endian, 22050 Hz soundfiles used with the STK classes.

  • The doc directory contains documentation about STK.

  • The projects directory contains various demo and example STK programs.

This release of STK comes with four separate "project" directories:

  1. The demo project is used to demonstrate nearly all of the STK instruments. The demo program has been written to allow a variety of control input and sound data output options. Simple graphical user interfaces (GUIs) are also provided.

  2. The effects project demonstrates realtime duplex mode (simultaneous audio input and output) operation, when available, as well as various delay-line based effects algorithms.

  3. The ragamatic project is just cool. Fire it up and be enlightened.

  4. The eguitar project demonstrates how to make an electric guitar with feedback and distortion.

  5. The examples project contains several simple programs that demonstrate audio input/output, including the audio internet streaming classes, as well as most of the tutorial programs.

Compiling:

  • Windows95/98/2000/XP/7: Realtime support is available using either DirectSound, ASIO or WASAPI audio drivers. For DirectSound support, use the __WINDOWS_DS__ preprocessor definition and link with the dsound.lib, winmm.lib, and Wsock32.lib libraries. For ASIO support, use the __WINDOWS_ASIO__ preprocessor definition, include all the files in the src/asio/ directory (i.e. asio.h,cpp, asiodrivers.h,cpp, ...), and link with the winmm.lib, and Wsock32.lib libraries. For WASAPI support, use the __WINDOWS_WASAPI__ preprocessor definition. In addition, the __LITTLE_ENDIAN__ and __WINDOWS_MM__ 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.

  • Unix (and MinGW) Systems: A GNU configure shell script is included in the distribution for unix-based systems. From the top-level distribution directory, type './configure' and the script will create Makefiles in each project directory specific to the characteristics of the host computer. Then from within any given project directory (example demo), type 'make' to compile the project. In addition, an STK library can be compiled from within the src directory.

    Several options can be supplied to the configure script to customize the build behavior:

    • –disable-realtime to only compile generic non-realtime classes
    • –enable-debug to enable various debug output
    • –with-alsa to choose native ALSA API support (default, linux only)
    • –with-oss to choose native OSS audio API support (linux only, no native OSS MIDI support)
    • –with-jack to choose native JACK API support (linux and Macintosh OS-X)
    • –with-core to choose Core Audio API support (Macintosh OS-X)
    • –with-asio to choose ASIO Audio API support (Windows)
    • –with-ds to choose Windows Direct Sound Audio API support (Windows)

    Note that it is possible to specify as many of the "&ndash;with-" options as desired to compile multi-API support. In addition, it is possible to specify the location of the STK rawwaves and the STK include path as follows:

    ./configure RAWWAVE_PATH="/home/gary/rawwaves/"
    ./configure INCLUDE_PATH="/home/gary/include/"

    For novice STK users, the default configuration should be adequate.

For those who wish to create their own system-specific Makefiles:

  • Linux: Realtime audio support is enabled with either the __LINUX_ALSA__, __UNIX_JACK__, and/or __LINUX_OSS__ preprocessor definitions, which are used to select the underlying audio system API(s). 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__ preprocessor definition must be included for MIDI support. Note that native OSS MIDI support no longer exists in RtMidi. If the __LINUX_OSS__ preprocessor definition is specified, only OSS (version 4.0) audio support will be compiled and RtMidi will still be compiled using the ALSA API (assuming the __LINUX_ALSASEQ__ definition is defined). For this reason, STK now requires the asound library for realtime support. Realtime programs must also link with the pthread library. In addition, the __LITTLE_ENDIAN__ preprocessor definition is necessary if compiling on a little-endian system. See the README-Linux file for further system configuration information.

  • Macintosh OS X: Realtime support is enabled with the __MACOSX_CORE__ and __UNIX_JACK__ preprocessor definitions, which incorporate the CoreAudio audio/MIDI API and/or the JACK API. Realtime programs must also link with the pthread library and the CoreAudio, CoreMIDI, and CoreFoundation frameworks (for Core Audio support) and/or the JACK library. See the README-MacOSX file for further system configuration information.

  • Generic (non-realtime): Most STK classes are operating system independent 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 __LITTLE_ENDIAN__ preprocessor definition to your compiler. The demo 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 cannot 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 effects, ragamatic, and most of the examples projects for non-realtime use.

Debugging:

When developing applications with STK, it is recommended that you define the preprocessor definition _STK_DEBUG_ when compiling (or specify the –enable-debug option to the configure 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.

Control Data:

All STK programs in this distribution take input control data in the form of SKINI or MIDI messages only. The Messager class unifies the various means of acquiring control data under a single, easy to use set of functions. The way that SKINI messages can be sent to the programs is dependent upon the operating system in use, as well as whether the program is running in realtime or not. In general, it is possible to:

  1. Redirect or pipe SKINI scorefiles to an executable.
  2. Pipe realtime SKINI input messages to an executable (not possible under Windows95/98).
  3. Acquire realtime MIDI messages from a MIDI port on your computer.

Tcl/Tk graphical user interfaces (GUI) are provided with this distribution that can generate realtime SKINI messages. Note that the Messager class allows multiple simultaneous socket client connections, together with MIDI and/or piped input. The Md2Skini program (in the demo directory) is mostly obsolete but can be used to create SKINI scorefiles from realtime MIDI input.

Demo: STK Instruments

The demo project demonstrates the behavior of all the distributed STK instruments. The instruments available with this release include:

  • Clarinet: Pretty good physical model of the clarinet
  • BlowHole: A clarinet physical model with one tonehole and one register vent
  • Saxofony: A psuedo-conical bore reed instrument that sometimes sounds like a saxophone
  • Flute: Pretty good physical model of the flute
  • Brass: Not so bad physical model of a brass instrument
  • BlowBotl: A basic helmholtz resonator and air jet model
  • Bowed: Not hideous physical model of a bowed string instrument
  • Plucked: Yer basic plucked string physical model
  • StifKarp: A simple plucked, stiff string physical model
  • Sitar: A simple sitar/plucked string physical model
  • Mandolin: Two-string mandolin physical model
  • Rhodey: Rhodes-like electric piano FM synthesis model
  • Wurley: Wurlitzer-like electric piano FM synthesis model
  • TubeBell: FM synthesis model
  • HevyMetl: Distorted synthesizer FM synthesis model
  • PercFlut: Percussive flute-like FM synthesis model
  • BeeThree: Cheezy organ FM synthesis model
  • Moog: Swept filter sampler
  • FMVoices: Three-formant FM voice synthesis
  • VoicForm: Four-formant resonance filter voice synthesis
  • Resonate: Noise through a BiQuad filter
  • Drummer: Sampling synthesis
  • BandedWG: Banded waveguide meta-object for bowed bars, tibetan bowls, etc.
  • Shakers: Various stochastic event models of shaker instruments
  • ModalBar: Various four-resonance presets (marimba, vibraphone, etc...)
  • Mesh2D: Two-dimensional, rectilinear digital waveguide mesh
  • Whistle: Hybrid physical/spectral model of a police whistle

Demo: Non-Realtime Use

See the information above with respect to compiling STK for non-realtime use.

In non-realtime mode, it is assumed that input control messages are provided from a SKINI scorefile and that audio output is written to a soundfile (.snd, .wav, .aif, .mat, .raw). A number of SKINI scorefiles are provided in the scores directory of the demo project. Assuming a successful compilation of the demo program, typing:

demo BeeThree -ow myfile.wav -if scores/bookert.ski

from the demo directory will play the scorefile bookert.ski using the STK BeeThree instrument and write the resulting audio data to a WAV formatted soundfile called "myfile.wav" (note that you may need to append ./ to the program name if your default shell setup is not set to look in the current directory). Typing demo without any arguments will provide a full program usage description.

Demo: Realtime Use

STK realtime audio and MIDI input/output and realtime SKINI control input via socketing support is provided for Linux, Mac OS-X, and Windows95/98/2000/XP operating systems. STK realtime SKINI control input via piping is possible under Linux, Mac OS X, and Windows2000/XP only.

Control input and audio output options are typically specified as command-line arguments to STK programs. For example, the demo program is invoked as:

demo instrument flags

where instruments include those described above and flags can be any or all of:

  • -or for realtime audio output,
  • -ow <file name> for WAV soundfile output,
  • -os <file name> for SND (AU) soundfile output,
  • -om <file name> for MAT-file output,
  • -if <file name> for a SKINI formatted control file,
  • -ip for realtime SKINI control input via piping,
  • -im <port> for MIDI control input (with optional port, -1 = virtual port where possible),
  • -s RATE to specify a sample rate,
  • -n NUMBER to specify multivoice polyphony

The -ip flag must be used when piping realtime SKINI control data to an STK program. The -im 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 demo program, typing:

demo BeeThree -or -if scores/bookert.ski

from the demo directory will play the scorefile bookert.ski using the STK BeeThree instrument and stream the resulting audio data in realtime to the audio output channel of your computer. Typing demo without any arguments will provide a full program usage description.

Realtime Control Input using Tcl/Tk Graphical User Interfaces:

There are a number of Tcl/Tk GUIs supplied with the STK projects. These scripts require Tcl/Tk version 8.0 or later, which can be downloaded for free over the WWW. On Unix and Windows2000/XP platforms, you can run the various executable scripts (e.g. StkDemo.bat) provided with each project to start everything up (you may need to symbolically link the wishXX executable to the name wish). The Physical.bat script just implements the following command-line sequence:

wish < tcl/Physical.tcl | demo Clarinet -or -ip

Realtime MIDI Control Input:

On all supported realtime platforms, you can direct realtime MIDI input to the STK Clarinet by typing:

demo Clarinet -or -im

This will attempt to use the default MIDI port for input. An optional MIDI port number can be specified after the -im flag. Valid MIDI ports are numbered from 0 (default) and higher. On Linux and Macintosh OS-X systems, it is possible to open a virtual MIDI input port (that other software applications can connect to) by specifying a port identifier of -1.

Polyphony:

The demo program supports an arbitrary number of voices via the -n NUMBER command-line flag and argument. For example, you can play eight BeeThree instruments with realtime output and control them from a MIDI device by typing:

demo BeeThree -n 8 -or -im

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Vector3D_8h_source.html0000644000076600007660000002360712327015203016152 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Vector3D.h
1 #ifndef STK_VECTOR3D_H
2 #define STK_VECTOR3D_H
3 
4 #include "Stk.h"
5 #include <cmath>
6 
7 namespace stk {
8 
9 /***************************************************/
17 /***************************************************/
18 
19 class Vector3D : public Stk
20 {
21 
22 public:
24  Vector3D( StkFloat x = 0.0, StkFloat y = 0.0, StkFloat z = 0.0 ) { setXYZ( x, y, z ); };
25 
27  StkFloat getX( void ) { return X_; };
28 
30  StkFloat getY( void ) { return Y_; };
31 
33  StkFloat getZ( void ) { return Z_; };
34 
36  StkFloat getLength( void );
37 
39  void setXYZ( StkFloat x, StkFloat y, StkFloat z ) { X_ = x; Y_ = y; Z_ = z; };
40 
42  void setX( StkFloat x ) { X_ = x; };
43 
45  void setY( StkFloat y ) { Y_ = y; };
46 
48  void setZ( StkFloat z ) { Z_ = z; };
49 
50 protected:
51  StkFloat X_;
52  StkFloat Y_;
53  StkFloat Z_;
54 };
55 
56 inline StkFloat Vector3D :: getLength( void )
57 {
58  StkFloat temp;
59  temp = X_ * X_;
60  temp += Y_ * Y_;
61  temp += Z_ * Z_;
62  temp = sqrt( temp );
63  return temp;
64 }
65 
66 } // stk namespace
67 
68 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Voicer_8h_source.html0000644000076600007660000006323612327015203015752 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Voicer.h
1 #ifndef STK_VOICER_H
2 #define STK_VOICER_H
3 
4 #include "Instrmnt.h"
5 #include <vector>
6 
7 namespace stk {
8 
9 /***************************************************/
32 /***************************************************/
33 
34 class Voicer : public Stk
35 {
36  public:
38  Voicer( StkFloat decayTime = 0.2 );
39 
41 
45  void addInstrument( Instrmnt *instrument, int group=0 );
46 
48 
53  void removeInstrument( Instrmnt *instrument );
54 
56 
64  long noteOn( StkFloat noteNumber, StkFloat amplitude, int group=0 );
65 
67 
70  void noteOff( StkFloat noteNumber, StkFloat amplitude, int group=0 );
71 
73 
76  void noteOff( long tag, StkFloat amplitude );
77 
79 
82  void setFrequency( StkFloat noteNumber, int group=0 );
83 
85 
88  void setFrequency( long tag, StkFloat noteNumber );
89 
91  void pitchBend( StkFloat value, int group=0 );
92 
94  void pitchBend( long tag, StkFloat value );
95 
97  void controlChange( int number, StkFloat value, int group=0 );
98 
100  void controlChange( long tag, int number, StkFloat value );
101 
103  void silence( void );
104 
106  unsigned int channelsOut( void ) const { return lastFrame_.channels(); };
107 
109  const StkFrames& lastFrame( void ) const { return lastFrame_; };
110 
112 
120  StkFloat lastOut( unsigned int channel = 0 );
121 
123 
131  StkFloat tick( unsigned int channel = 0 );
132 
134 
142  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
143 
144  protected:
145 
146  struct Voice {
147  Instrmnt *instrument;
148  long tag;
149  StkFloat noteNumber;
150  StkFloat frequency;
151  int sounding;
152  int group;
153 
154  // Default constructor.
155  Voice()
156  :instrument(0), tag(0), noteNumber(-1.0), frequency(0.0), sounding(0), group(0) {}
157  };
158 
159  std::vector<Voice> voices_;
160  long tags_;
161  int muteTime_;
162  StkFrames lastFrame_;
163 };
164 
165 inline StkFloat Voicer :: lastOut( unsigned int channel )
166 {
167 #if defined(_STK_DEBUG_)
168  if ( channel >= lastFrame_.channels() ) {
169  oStream_ << "Voicer::lastOut(): channel argument is invalid!";
170  handleError( StkError::FUNCTION_ARGUMENT );
171  }
172 #endif
173 
174  return lastFrame_[channel];
175 }
176 
177 
178 inline StkFloat Voicer :: tick( unsigned int channel )
179 {
180  unsigned int j;
181  for ( j=0; j<lastFrame_.channels(); j++ ) lastFrame_[j] = 0.0;
182  for ( unsigned int i=0; i<voices_.size(); i++ ) {
183  if ( voices_[i].sounding != 0 ) {
184  voices_[i].instrument->tick();
185  for ( j=0; j<voices_[i].instrument->channelsOut(); j++ ) lastFrame_[j] += voices_[i].instrument->lastOut( j );
186  }
187  if ( voices_[i].sounding < 0 )
188  voices_[i].sounding++;
189  if ( voices_[i].sounding == 0 )
190  voices_[i].noteNumber = -1;
191  }
192 
193  return lastFrame_[channel];
194 }
195 
196 inline StkFrames& Voicer :: tick( StkFrames& frames, unsigned int channel )
197 {
198  unsigned int nChannels = lastFrame_.channels();
199 #if defined(_STK_DEBUG_)
200  if ( channel > frames.channels() - nChannels ) {
201  oStream_ << "Voicer::tick(): channel and StkFrames arguments are incompatible!";
202  handleError( StkError::FUNCTION_ARGUMENT );
203  }
204 #endif
205 
206  StkFloat *samples = &frames[channel];
207  unsigned int j, hop = frames.channels() - nChannels;
208  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
209  tick();
210  for ( j=0; j<nChannels; j++ )
211  *samples++ = lastFrame_[j];
212  }
213 
214  return frames;
215 }
216 
217 } // stk namespace
218 
219 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/VoicForm_8h_source.html0000644000076600007660000005645512327015203016254 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


VoicForm.h
1 #ifndef STK_VOICFORM_H
2 #define STK_VOICFORM_H
3 
4 #include "Instrmnt.h"
5 #include "Envelope.h"
6 #include "Noise.h"
7 #include "SingWave.h"
8 #include "FormSwep.h"
9 #include "OnePole.h"
10 #include "OneZero.h"
11 
12 namespace stk {
13 
14 /***************************************************/
39 /***************************************************/
40 
41 class VoicForm : public Instrmnt
42 {
43  public:
45 
48  VoicForm( void );
49 
51  ~VoicForm( void );
52 
54  void clear( void );
55 
57  void setFrequency( StkFloat frequency );
58 
60  bool setPhoneme( const char* phoneme );
61 
63  void setVoiced( StkFloat vGain ) { voiced_->setGainTarget(vGain); };
64 
66  void setUnVoiced( StkFloat nGain ) { noiseEnv_.setTarget(nGain); };
67 
69  void setFilterSweepRate( unsigned int whichOne, StkFloat rate );
70 
72  void setPitchSweepRate( StkFloat rate ) { voiced_->setSweepRate(rate); };
73 
75  void speak( void ) { voiced_->noteOn(); };
76 
78  void quiet( void );
79 
81  void noteOn( StkFloat frequency, StkFloat amplitude );
82 
84  void noteOff( StkFloat amplitude ) { this->quiet(); };
85 
87  void controlChange( int number, StkFloat value );
88 
90  StkFloat tick( unsigned int channel = 0 );
91 
93 
100  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
101 
102 protected:
103 
104  SingWave *voiced_;
105  Noise noise_;
106  Envelope noiseEnv_;
107  FormSwep filters_[4];
108  OnePole onepole_;
109  OneZero onezero_;
110 
111 };
112 
113 inline StkFloat VoicForm :: tick( unsigned int )
114 {
115  StkFloat temp;
116  temp = onepole_.tick( onezero_.tick( voiced_->tick() ) );
117  temp += noiseEnv_.tick() * noise_.tick();
118  lastFrame_[0] = filters_[0].tick(temp);
119  lastFrame_[0] += filters_[1].tick(temp);
120  lastFrame_[0] += filters_[2].tick(temp);
121  lastFrame_[0] += filters_[3].tick(temp);
122  /*
123  temp += noiseEnv_.tick() * noise_.tick();
124  lastFrame_[0] = filters_[0].tick(temp);
125  lastFrame_[0] = filters_[1].tick(lastFrame_[0]);
126  lastFrame_[0] = filters_[2].tick(lastFrame_[0]);
127  lastFrame_[0] = filters_[3].tick(lastFrame_[0]);
128  */
129  return lastFrame_[0];
130 }
131 
132 inline StkFrames& VoicForm :: tick( StkFrames& frames, unsigned int channel )
133 {
134  unsigned int nChannels = lastFrame_.channels();
135 #if defined(_STK_DEBUG_)
136  if ( channel > frames.channels() - nChannels ) {
137  oStream_ << "VoicForm::tick(): channel and StkFrames arguments are incompatible!";
138  handleError( StkError::FUNCTION_ARGUMENT );
139  }
140 #endif
141 
142  StkFloat *samples = &frames[channel];
143  unsigned int j, hop = frames.channels() - nChannels;
144  if ( nChannels == 1 ) {
145  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
146  *samples++ = tick();
147  }
148  else {
149  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
150  *samples++ = tick();
151  for ( j=1; j<nChannels; j++ )
152  *samples++ = lastFrame_[j];
153  }
154  }
155 
156  return frames;
157 }
158 
159 } // stk namespace
160 
161 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Whistle_8h_source.html0000644000076600007660000004312012327015203016130 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Whistle.h
1 #ifndef STK_WHISTLE_H
2 #define STK_WHISTLE_H
3 
4 #include "Instrmnt.h"
5 #include "Sphere.h"
6 #include "Vector3D.h"
7 #include "Noise.h"
8 #include "SineWave.h"
9 #include "OnePole.h"
10 #include "Envelope.h"
11 
12 namespace stk {
13 
14 /***************************************************/
30 /***************************************************/
31 
32 class Whistle : public Instrmnt
33 {
34 public:
36 
39  Whistle( void );
40 
42  ~Whistle( void );
43 
45  void clear( void );
46 
48  void setFrequency( StkFloat frequency );
49 
51  void startBlowing( StkFloat amplitude, StkFloat rate );
52 
54  void stopBlowing( StkFloat rate );
55 
57  void noteOn( StkFloat frequency, StkFloat amplitude );
58 
60  void noteOff( StkFloat amplitude );
61 
63  void controlChange( int number, StkFloat value );
64 
66  StkFloat tick( unsigned int channel = 0 );
67 
69 
76  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
77 
78 protected:
79 
80  Vector3D *tempVectorP_;
81  Vector3D tempVector_;
82  OnePole onepole_;
83  Noise noise_;
84  Envelope envelope_;
85  Sphere can_; // Declare a Spherical "can".
86  Sphere pea_, bumper_; // One spherical "pea", and a spherical "bumper".
87 
88  SineWave sine_;
89 
90  StkFloat baseFrequency_;
91  StkFloat noiseGain_;
92  StkFloat fippleFreqMod_;
93  StkFloat fippleGainMod_;
94  StkFloat blowFreqMod_;
95  StkFloat tickSize_;
96  StkFloat canLoss_;
97  int subSample_, subSampCount_;
98 };
99 
100 inline StkFrames& Whistle :: tick( StkFrames& frames, unsigned int channel )
101 {
102  unsigned int nChannels = lastFrame_.channels();
103 #if defined(_STK_DEBUG_)
104  if ( channel > frames.channels() - nChannels ) {
105  oStream_ << "Whistle::tick(): channel and StkFrames arguments are incompatible!";
106  handleError( StkError::FUNCTION_ARGUMENT );
107  }
108 #endif
109 
110  StkFloat *samples = &frames[channel];
111  unsigned int j, hop = frames.channels() - nChannels;
112  if ( nChannels == 1 ) {
113  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
114  *samples++ = tick();
115  }
116  else {
117  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
118  *samples++ = tick();
119  for ( j=1; j<nChannels; j++ )
120  *samples++ = lastFrame_[j];
121  }
122  }
123 
124  return frames;
125 }
126 
127 } // stk namespace
128 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/Wurley_8h_source.html0000644000076600007660000003717612327015203016016 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Wurley.h
1 #ifndef STK_WURLEY_H
2 #define STK_WURLEY_H
3 
4 #include "FM.h"
5 
6 namespace stk {
7 
8 /***************************************************/
38 /***************************************************/
39 
40 class Wurley : public FM
41 {
42  public:
44 
47  Wurley( void );
48 
50  ~Wurley( void );
51 
53  void setFrequency( StkFloat frequency );
54 
56  void noteOn( StkFloat frequency, StkFloat amplitude );
57 
59  StkFloat tick( unsigned int channel = 0 );
60 
62 
69  StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
70 
71  protected:
72 
73 };
74 
75 inline StkFloat Wurley :: tick( unsigned int )
76 {
77  StkFloat temp, temp2;
78 
79  temp = gains_[1] * adsr_[1]->tick() * waves_[1]->tick();
80  temp = temp * control1_;
81 
82  waves_[0]->addPhaseOffset( temp );
83  waves_[3]->addPhaseOffset( twozero_.lastOut() );
84  temp = gains_[3] * adsr_[3]->tick() * waves_[3]->tick();
85  twozero_.tick(temp);
86 
87  waves_[2]->addPhaseOffset( temp );
88  temp = ( 1.0 - (control2_ * 0.5)) * gains_[0] * adsr_[0]->tick() * waves_[0]->tick();
89  temp += control2_ * 0.5 * gains_[2] * adsr_[2]->tick() * waves_[2]->tick();
90 
91  // Calculate amplitude modulation and apply it to output.
92  temp2 = vibrato_.tick() * modDepth_;
93  temp = temp * (1.0 + temp2);
94 
95  lastFrame_[0] = temp * 0.5;
96  return lastFrame_[0];
97 }
98 
99 inline StkFrames& Wurley :: tick( StkFrames& frames, unsigned int channel )
100 {
101  unsigned int nChannels = lastFrame_.channels();
102 #if defined(_STK_DEBUG_)
103  if ( channel > frames.channels() - nChannels ) {
104  oStream_ << "Wurley::tick(): channel and StkFrames arguments are incompatible!";
105  handleError( StkError::FUNCTION_ARGUMENT );
106  }
107 #endif
108 
109  StkFloat *samples = &frames[channel];
110  unsigned int j, hop = frames.channels() - nChannels;
111  if ( nChannels == 1 ) {
112  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
113  *samples++ = tick();
114  }
115  else {
116  for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
117  *samples++ = tick();
118  for ( j=1; j<nChannels; j++ )
119  *samples++ = lastFrame_[j];
120  }
121  }
122 
123  return frames;
124 }
125 
126 } // stk namespace
127 
128 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/WvIn_8h_source.html0000644000076600007660000001617312327015203015404 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


WvIn.h
1 #ifndef STK_WVIN_H
2 #define STK_WVIN_H
3 
4 #include "Stk.h"
5 
6 namespace stk {
7 
8 /***************************************************/
17 /***************************************************/
18 
19 class WvIn : public Stk
20 {
21 public:
23  unsigned int channelsOut( void ) const { return data_.channels(); };
24 
26 
29  const StkFrames& lastFrame( void ) const { return lastFrame_; };
30 
32  virtual StkFloat tick( unsigned int channel = 0 ) = 0;
33 
35  virtual StkFrames& tick( StkFrames& frames ) = 0;
36 
37 protected:
38 
39  StkFrames data_;
40  StkFrames lastFrame_;
41 
42 };
43 
44 } // stk namespace
45 
46 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/html/WvOut_8h_source.html0000644000076600007660000002767212327015203015613 0ustar gary The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


WvOut.h
1 #ifndef STK_WVOUT_H
2 #define STK_WVOUT_H
3 
4 #include "Stk.h"
5 
6 namespace stk {
7 
8 /***************************************************/
20 /***************************************************/
21 
22 class WvOut : public Stk
23 {
24  public:
25 
27  WvOut( void ) : frameCounter_(0), clipping_(false) {};
28 
30  unsigned long getFrameCount( void ) const { return frameCounter_; };
31 
33  StkFloat getTime( void ) const { return (StkFloat) frameCounter_ / Stk::sampleRate(); };
34 
36  bool clipStatus( void ) { return clipping_; };
37 
39  void resetClipStatus( void ) { clipping_ = false; };
40 
42 
45  virtual void tick( const StkFloat sample ) = 0;
46 
48  virtual void tick( const StkFrames& frames ) = 0;
49 
50  protected:
51 
52  // Check for sample clipping and clamp.
53  StkFloat& clipTest( StkFloat& sample );
54 
55  StkFrames data_;
56  unsigned long frameCounter_;
57  bool clipping_;
58 
59 };
60 
61 inline StkFloat& WvOut :: clipTest( StkFloat& sample )
62 {
63  bool clip = false;
64  if ( sample > 1.0 ) {
65  sample = 1.0;
66  clip = true;
67  }
68  else if ( sample < -1.0 ) {
69  sample = -1.0;
70  clip = true;
71  }
72 
73  if ( clip == true && clipping_ == false ) {
74  // First occurrence of clipping since instantiation or reset.
75  clipping_ = true;
76  oStream_ << "WvOut: data value(s) outside +-1.0 detected ... clamping at outer bound!";
77  handleError( StkError::WARNING );
78  }
79 
80  return sample;
81 }
82 
83 } // stk namespace
84 
85 #endif

The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.0/doc/README-Linux.txt0000644000076600007660000000277212327014024013503 0ustar garyThe Synthesis ToolKit in C++ (STK) By Perry R. Cook and Gary P. Scavone, 1995--2014. 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. 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. 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. 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). stk-4.5.0/doc/README-MacOSX.txt0000644000076600007660000000175012327014024013471 0ustar garyThe Synthesis ToolKit in C++ (STK) By Perry R. Cook and Gary P. Scavone, 1995--2014. 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 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: 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. stk-4.5.0/doc/README-SGI.txt0000644000076600007660000000064712327014024013025 0ustar garyThe Synthesis ToolKit in C++ (STK) By Perry R. Cook and Gary P. Scavone, 1995--2014. Please read the file README and INSTALL for more general STK information. 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. stk-4.5.0/doc/README-Win.txt0000644000076600007660000000630412327014024013134 0ustar garyThe Synthesis ToolKit in C++ (STK) By Perry R. Cook and Gary P. Scavone, 1995--2014. Please read the file README for more general STK information. 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. 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. The DirectSound, WASAPI 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 all supported APIs. In order to use the ASIO API, it is necessary to use the preprocessor definition __WINDOWS_ASIO__, as well as include most of 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 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. Visual C++ workspaces have been created for the various STK projects. Everything has already been configured for you. The intermediate .obj files will be written to either the "Release" or "Debug" directories, but the executable files will be written to the main project directories (where they need to be for proper execution). If you should somehow lose or hose the VC++ workspace file for a project, then you will have to do a LOT of configuring to recreate it ... it's probably easier just to download the distribution again from our WWW sites. Anyway, for your benefit and mine, here is a list of things that need to be added to the various "Project Settings" (this was for VC 6.0 ... things have changed with the newer versions of the VC compiler): 1. Under General: Set "Output files:" to (this will put the executable in the main project directory. 2. Under C/C++ > Code Generation: Set "Use run-time library:" to Multithreaded (use "debug" versions for the debug configuration). 3. Under Link > General: Add winmm.lib, dsound.lib, and Wsock32.lib to the end of the Object/library modules list. 4. Under C/C++ > Preprocessor: Add "../../include" directory to the "extra include" field. 5. Under C/C++ > Preprocessor: Add "__WINDOWS_DS__", "__WINDOWS_MM__", and "__LITTLE_ENDIAN__ to the definitions field. 6. Add all the necessary files to the project. 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. stk-4.5.0/doc/ReleaseNotes.txt0000644000076600007660000003357512327014024014047 0ustar garyThe Synthesis ToolKit in C++ (STK) By Perry R. Cook and Gary P. Scavone, 1995--2014. v4.5.0: (26 April 2014) - updated versions of RtAudio and RtMidi, with associated renaming of RtError class to either RtAudioError or RtMidiError and addition of WASAPI support in Windows - added support in FileRead for little-endian AIFC file format - new iOS project files (thanks to Ariel Elkin) - bug fix in FreeVerb that could cause crackling for stereo input - various bug fixes and updates to minimize compiler warnings - ADSR fix for decay/release time calculations - various updates to build system 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 - bug fix in RtWvOut.cpp - added configure support for MinGW - updates to RtAudio and RtMidi for MinGW - changes to channel assignment in demo.cpp 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 - fixes in BlitSquare for frequency, harmonics, and dc offset - updates to Makefiles for non-realtime compile - fix in demo.cpp for voice channel assignment - updated versions of RtMidi and RtAudio - updated ASIO files for MinGW compiler - new FAQ in documentation - MAT-file bug fix in FileRead class v4.2.1: (14 October 2005) - greatly expanded StkFrames functionality (including interpolation and indexing by channel/frame) - new Granulate granular synthesis class - new Blit, BlitSaw, and BlitSquare bandlimited waveform classes (thanks to Robin Davies!) - removed Table class ... all functionality (including interpolation) now in StkFrames and FileRead classes - revised Socket class (now abstract) and added TcpServer, TcpClient, and UdpSocket subclasses - added Stk::showWarnings() and Stk::printErrors() functions to dis/enable warning and error printouts - extracted file I/O functionality to new FileRead and FileWrite classes - revised WvIn / WvOut class structure (WvIn / WvOut now abstract and file I/O functionality in new FileWvIn / FileWvOut subclasses) - new SineWave class which calculates its own static table of variable length (no rawwave dependency) - new sinewave.raw file of length 1024 samples (used to be 256) - TcpWvIn and TcpWvOut renamed InetWvIn and InetWvOut, with added support for UDP sockets - fixed bug in WvOut tickFrame( const StkFrames &frames ) function - fixed bug in demo.cpp when writing output soundfiles without realtime output - added "binary" open flag to MidiFileIn class for Windows - fixed oversized MAT-file header in WvOut.cpp - fixed case statement bug in MidiFileIn.cpp for sysex - added missing getDelay() function to DelayA.cpp - fixed modDepth omission in Chorus.cpp - fixed DC blocker initialization bug in Flute.cpp - changed Filter class behavior so no default clearing of state when changing coefficients - bug fixes to RtAudio, especially for Windows DirectSound and ASIO (thanks to Robin Davies) - bug fixes to RtMidi, especially for Linux (thanks to Pedro Pedro Lopez-Cabanillas) v4.2.0: (4 October 2004) - simultaneous multiple audio APIs supported at compile time - fixed hidden overloaded virtual functions - new Asymp exponential envelope class - various changes to better conform to standard C++ programming practices - MY_FLOAT type converted to StkFloat and changed throughout (use treesed utility to search/replace in old files) - most example programs rewritten to use an audio callback paradigm (which works better in OS-X) - new StkFrames class for vectorized multichannel data and associated new tick() functions making use of StkFrames - new RtMidi class with MIDI output capabilities (API changes) - new MidiFileIn class for reading MIDI files - revised Filter classes to use std::vectors for coefficients (API changes) - revised Messager class (now queues messages for retrieval) (API changes) - new abstract parent Effect class for various effects - added setT60 function to all reverbs - new abstract parent Generator class for various signal sources - new abstract parent Function class for tables and various non-linear functions - Skini class completely rewritten (simplified) using the C++ STL (API changes) - WvOut classes now clip to -1.0 to +1.0 and report out of range - new Mutex class - turned Nagle algorithm off by default in Socket class - error reporting standardized in all classes v4.1.3: (22 March 2004) - bug fix in RtAudio for Windows DirectSound output only support v4.1.2: (15 March 2004) - added Linux JACK support to RtAudio - added optional doNormalize argument to WvIn to allow specification of data normalization or not - added volume control to demo program and various tcl scripts - added support for dynamic rawwavePath() setting - WaveLoop bug fix - fixed bug in ADSR::setReleaseTime() method - fixed missing initialization of apInput in non-default constructor of DelayA class - added time seeding of random number generator to Noise constructor - update to the contentsAt() method of Delay class - WAV file fixes (8-bit) in WvIn and WvOut classes - configure changes - updated include statements and appended "std::" as necessary throughout for compatibility with gcc 3 v4.1.1: (24 October 2002) - bug fix in RtAudio for Macintosh OS X and Windows ASIO duplex operation - windows ASIO fix in Stk.h - documentation updates - expanded tutorial - fixed RtDuplex omission in src Makefile v4.1: (8 October 2002) - Macintosh OS X support added - new Whistle class - added Voicer, SingWave, and VoicForm classes - improvements/fixes to the banded waveguide instruments - demo program now uses Voicer, allowing polyphony - demo tcl/tk scripts changed to use SKINI PitchChange instead of PitchBend - demo program response to PitchBend modified to octave up/down - several RtAudio fixes and improvements (OS X and Windows ASIO support added) - added nextOut() method to Delay classes - documentation fixes for Reverb classes - RAWWAVE_PATH changed to include the "rawwave" directory - "configure" support added for unix systems - multivoice flag (-n NUMBER) added as command line option to demo program - sample rate flag added as command line option to all example programs - socket port number added as command line option to all example programs v4.0: (April 2002) - new documentation and tutorial - several new instruments, including Saxofony, BlowBotl, and StifKarp - new Stk base class, replacing Object class - new Filter class structure and methods - extensive modifications to WvIn and WvOut class structures and methods - looping functionality moved to WaveLoop (subclass of WvIn) - automatic file type detection in WvIn ... hosed WavWvIn, AifWvIn, RawWavIn, SndWavIn, and MatWvIn subclasses - new file type specifier argument in WvOut ... hosed WavWvOut, AifWvOut, RawWavOut, SndWavOut, and MatWvOut subclasses - some simplifications of Messager class (was Controller) - new independent RtAudio class - extensive revisions in code and a significant number of API changes v3.2: (13 November 2000) - new control handling class (Controller) - added AIFF file input/output support - stklib.a Makefile in src directory - added C++ error handling capabilities - added input/output internet streaming support (StrmWvIn/StrmWvOut) - added native ALSA support for linux - added optional "device" argument to all "Rt" classes (audio and MIDI) and printout of devices when argument is invalid - WvIn classes rewritten to support very big files (incremental load from disk) - changed WvIn/WvOut classes to work with sample frame buffers - fixed looping and negative rate calculations in WvIn classes - fixed interpolation bug in RtWvIn - windoze RtAudio code rewritten (thanks Dave!) - simplified byte-swapping functions (in-place swapping) - new FIR filter class (thanks Julius!) - "stereo-ized" RagaMatic - probably a bunch more fixes that I've long since forgotten about v3.1: (13 March 2000) - new RagaMatic project!!! - added "microphone position" to Mandolin in STKdemo - fixed MIDI system message exclusion under Irix - added a few bitmaps for the Shaker instruments - made destructors virtual for Reverb.h, WvIn.h and Simple.h - fixed bug setting delay length in DLineA when value too big - fixed bug in WinMM realtime code (RTSoundIO) - added tick() method to BowTabl, JetTabl, and ReedTabl (same as lookup) - switched to pthread API on SGI platforms - added some defines to Object.h for random number generation, FPU overflow checking, etc... - a lot of minor changes, some bug fixes ... can't remember all of them v3.0: (10 October 1999) - new #define flags for OS and realtime dependencies (this will probably cause problems for most everyone, but it was necessary to make future ports easier) - fixed Linux MIDI input bug - fixed MIDI status masking problem in Windows - OS type defines now in Makefile - new RAWWAVE_PATH define in Object.h - syntmono pulled out to separate directory and cleaned up - socketing capabilities under Unix, as well as Windoze - multiple simultaneous socket client connections to STK servers now possible - MD2SKINI now can merge MIDI and piped messages under Irix and Linux (for TCL->MD2SKINI->syntmono control) - defined INT16 and INT32 types and fixed various WvIn and WvOut classes - updated MatWvIn and MatWvOut for new MAT-file documentation from Matlab - new demo GUI - minor fixes to FM behavior - added record/duplex capabilities to RTSoundIO (Linux, SGI, and Windoze) - fixed bugs in WavWvOut and MatWvOut header specifications - added RawWvOut class - new WvIn class with RawWvIn, SndWvIn, WavWvIn, MatWvIn, and RTWvIn subclasses - removed RawWave, RawShot, RawInterp, and RawLoop classes (supplanted by RawWvIn) - multi-channel data support in WvIn and WvOut classes using MY_MULTI data type (pointer to StkFloat) and the methods mtick() and mlastOutput() - now writing to primary buffer under Windoze when allowed by hardware - cleaned up Object.h a bit - pulled various utility and thread functions out of syntmono.cpp (to aid readability of the code) v2.02: (16 November 1998) - created RawWave abstract class, with subclasses of RawLoop (looping rawwave oscillator), RawShot (non-looping, non-interpolating rawwave player ... used to be RawWvIn), and RawInterp (looping or non-looping, interpolating rawwave player ... used to be RawWave). - modified DrumSynt to correctly handle sample rates different than 22050 Hz. - modified syntmono parsing vs. tick routine so that some ticking occurs between each message. When multiple messages are waiting to be processed, the time between message updates is inversely proportional to the number of messages in the buffer. - fixed DirectSound playback bug in Win distribution. Sound was being played at 8-bit, 22 kHz in all cases. Playback is now 16-bit and dependent on SRATE. - fixed bug in MD2SKINI which prevented some NoteOff statements from being output. v2.01: (27 July 1998) - Corrected extraneous ^M line return characters that were incompatible with SGI. v2.0: (20 July 1998) - The first true release by Gary, with unified capabilities across SGI, Linux, and Win platforms. See WWW pages (http://www-ccrma.stanford.edu/CCRMA/Software/STK/) for more info. v1.1: - More linux support and other changes that happened so long ago that I can't remember anymore. Never officially released. v1.0: - Linux support added with the help of Tim Stilson. Never officially released. v0.8: - One of (if not THE) original distributions for SGI, NeXTStep, and basic Win support. I think this came out in 1996. stk-4.5.0/doc/SKINI.txt0000644000076600007660000004503112327014024012321 0ustar garyThis describes the latest (version 1.1) implementation of SKINI. Synthesis toolKit Instrument Network Interface for the Synthesis Toolkit in C++ by Perry R. Cook. ********************************* * Too good to be true? * * Have control and read it too? * * A SKINI Haiku. * ********************************* Profound thanks to Dan trueman, Brad Garton, and Gary Scavone for input on this revision. Thanks also to MIDI, the NeXT MusicKit, ZIPI and all the creators and modifiers of these for good bases upon/from which to build and depart. 1) MIDI Compatibility SKINI was designed to be MIDI compatible wherever possible, and extend MIDI in incremental, then maybe profound ways. Differences from MIDI, and motivations, include: Text-based messages are used, with meaningful names wherever possible. This allows any language or system capable of formatted printing to generate SKINI. Similarly, any system capable of reading in a string and turning delimited fields into strings, floats, and ints can consume SKINI for control. More importantly, humans can actually read, and even write if they want, SKINI files and streams. Use an editor and search/ replace or macros to change a channel or control number. Load a SKINI score into a spread sheet to apply transformations to time, control parameters, MIDI velocities, etc. Put a monkey on a special typewriter and get your next great work. Life's too short to debug bit/nybble packed variable length mumble messages. Disk space gets cheaper, available bandwidth increases, music takes up so little space and bandwidth compared to video and grapics. Live a little. Floating point numbers are used wherever possible. Note Numbers, Velocities, Controller Values, and Delta and Absolute Times are all represented and scanned as ASCII double-precision floats. MIDI byte values are preserved, so that incoming MIDI bytes from an interface can be put directly into SKINI messages. 60.0 or 60 is middle C, 127.0 or 127 is maximum velocity etc. But, unlike MIDI, 60.5 can cause a 50cent sharp middle C to be played. As with MIDI byte values like velocity, use of the integer and SKINI-added fractional parts is up to the implementor of the algorithm being controlled by SKINI messages. But the extra precision is there to be used or ignored. 2) WHY SKINI? SKINI was designed to be extensable and hackable for a number of applications: imbedded synthesis in a game or VR simulation, scoring and mixing tasks, real-time and non-real time applications which could benefit from controllable sound synthesis, JAVA controlled synthesis, or eventually maybe JAVA synthesis, etc. SKINI is not intended to be "the mother of scorefiles," but since the entire system is based on text representations of names, floats, and ints, converters from one scorefile language to SKINI, or back, should be easily created. I am basically a bottom-up designer with an awareness of top- down design ideas, so SKINI above all reflects the needs of my particular research and creative projects as they have arisen and developed. SKINI 1.1 represents a profound advance beyond versions 0.8 and 0.9 (the first versions), future SKINI's might reflect some changes. Compatibility with prior scorefiles will be attempted, but there aren't that many scorefiles out there yet. 3) SKINI MESSAGES A basic SKINI message is a line of text. There are only three required fields, the message type (an ASCII name), the time (either delta or absolute), and the channel number. Don't freak out and think that this is MIDI channel 0-15 (which is supported), because the channel number is scanned as a long int. Channels could be socket numbers, machine IDs, serial numbers, or even unique tags for each event in a synthesis. Other fields might be used, as specified in the SKINI.tbl file. This is described in more detail later. Fields in a SKINI line are delimited by spaces, commas, or tabs. The SKINI parser only operates on a line at a time, so a newline means the message is over. Multiple messages are NOT allowed directly on a single line (by use of the ; for example in C). This could be supported, but it isn't in version 1.1. Message types include standard MIDI types like NoteOn, NoteOff, ControlChange, etc. MIDI extension message types (messages which look better than MIDI but actually get turned into MIDI-like messages) include LipTension, StringDamping, etc. NonMIDI message types include SetPath (sets a path for file use later), and OpenReadFile (for streaming, mixing, and applying effects to soundfiles along with synthesis, for example). Other non-MIDI message types include Trilling, HammerOn, etc. (these translate to gestures, behaviors, and contexts for use by intellegent players and instruments using SKINI). Where possible I will still use these as MIDI extension messages, so foot switches, etc. can be used to control them in real time. All fields other than type, time, and channel are optional, and the types and useage of the additional fields is defined in the file SKINI.tbl. The other important file used by SKINI is SKINI.msg, which is a set of #defines to make C code more readable, and to allow reasonably quick re-mapping of control numbers, etc.. All of these defined symbols are assigned integer values. For JAVA, the #defines could be replaced by declaration and assignment statements, preserving the look and behavior of the rest of the code. 4) C Files Used To Implement SKINI Skini.cpp is an object which can either open a SKINI file, and successively read and parse lines of text as SKINI strings, or accept strings from another object and parse them. The latter functionality would be used by a socket, pipe, or other connection receiving SKINI messages a line at a time, usually in real time, but not restricted to real time. SKINI.msg should be included by anything wanting to use the Skini.cpp object. This is not mandatory, but use of the __SK_blah_ symbols which are defined in the .msg file will help to ensure clarity and consistency when messages are added and changed. SKINI.tbl is used only by the SKINI parser object (Skini.cpp). In the file SKINI.tbl, an array of structures is declared and assigned values which instruct the parser as to what the message types are, and what the fields mean for those message types. This table is compiled and linked into applications using SKINI, but could be dynamically loaded and changed in a future version of SKINI. 5) SKINI Messages and the SKINI Parser: The parser isn't all that smart, but neither am I. Here are the basic rules governing a valid SKINI message: a) If the first (non-delimiter (see c)) character in a SKINI string is '/' that line is treated as a comment and echoed to stdout. b) If there are no characters on a line, that line is treated as blank and echoed to stdout. Tabs and spaces are treated as non-characters. c) Spaces, commas, and tabs delimit the fields in a SKINI message line. (We might allow for multiple messages per line later using the semicolon, but probably not. A series of lines with deltaTimes of 0.0 denotes simultaneous events. For read-ability, multiple messages per line doesn't help much, so it's unlikely to be supported later). d) The first field must be a SKINI message name. (like NoteOn). These might become case-insensitive in future versions, so don't plan on exciting clever overloading of names (like noTeOn being different from NoTeON). There can be a number of leading spaces or tabs, but don't exceed 32 or so. e) The second field must be a time specification in seconds. A time field can be either delta-time (most common and the only one supported in version 0.8), or absolute time. Absolute time messages have an '=' appended to the beginning of the floating point number with no space. So 0.10000 means delta time of 100 ms, while =0.10000 means absolute time of 100 ms. Absolute time messages make most sense in score files, but could also be used for (loose) synchronization in a real-time context. Real time messages should be time-ordered AND time-correct. That is, if you've sent 100 total delta-time messages of 1.0 seconds, and then send an absolute time message of =90.0 seconds, or if you send two absolute time messages of =100.0 and =90.0 in that order, things will get really fouled up. The SKINI parser doesn't know about time, however. The WvOut device is the master time keeper in the Synthesis Toolkit, so it should be queried to see if absolute time messages are making sense. There's an example of how to do that later in this document. Absolute times are returned by the parser as negative numbers (since negative deltaTimes are not allowed). f) The third field must be an integer channel number. Don't go crazy and think that this is just MIDI channel 0-15 (which is supported). The channel number is scanned as a long int. Channels 0-15 are in general to be treated as MIDI channels. After that it's wide open. Channels could be socket numbers, machine IDs, serial numbers, or even unique tags for each event in a synthesis. A -1 channel can be used as don't care, omni, or other functions depending on your needs and taste. g) All remaining fields are specified in the SKINI.tbl file. In general, there are maximum two more fields, which are either SK_INT (long), SK_DBL (double float), or SK_STR (string). The latter is the mechanism by which more arguments can be specified on the line, but the object using SKINI must take that string apart (retrived by using getRemainderString()) and scan it. Any excess fields are stashed in remainderString. 6) A Short SKINI File: /* Howdy!!! Welcome to SKINI, by P. Cook 1999 NoteOn 0.000082 2 55 82 NoteOff 1.000000 2 55 0 NoteOn 0.000082 2 69 82 StringDetune 0.100000 2 10 StringDetune 0.100000 2 30 StringDetune 0.100000 2 50 NoteOn 0.000000 2 69 82 StringDetune 0.100000 2 40 StringDetune 0.100000 2 22 StringDetune 0.100000 2 12 // StringDamping 0.000100 2 0.0 NoteOn 0.000082 2 55 82 NoteOn 0.200000 2 62 82 NoteOn 0.100000 2 71 82 NoteOn 0.200000 2 79 82 NoteOff 1.000000 2 55 82 NoteOff 0.000000 2 62 82 NoteOff 0.000000 2 71 82 NoteOff 0.000000 2 79 82 StringDamping =4.000000 2 0.0 NoteOn 0.000082 2 55 82 NoteOn 0.200000 2 62 82 NoteOn 0.100000 2 71 82 NoteOn 0.200000 2 79 82 NoteOff 1.000000 2 55 82 NoteOff 0.000000 2 62 82 NoteOff 0.000000 2 71 82 NoteOff 0.000000 2 79 82 7) The SKINI.tbl File, How Messages are Parsed: The SKINI.tbl file contains an array of structures which are accessed by the parser object Skini.cpp. The struct is: struct SKINISpec { char messageString[32]; long type; long data2; long data3; }; so an assignment of one of these structs looks like: MessageStr$ ,type, data2, data3, type is the message type sent back from the SKINI line parser. data is either NOPE : field not used, specifically, there aren't going to be any more fields on this line. So if there is is NOPE in data2, data3 won't even be checked SK_INT : byte (actually scanned as 32 bit signed long int) If it's a MIDI data field which is required to be an integer, like a controller number, it's 0-127. Otherwise) get creative with SK_INTs SK_DBL : double precision floating point. SKINI uses these in the MIDI context for note numbers with micro tuning, velocities, controller values, etc. SK_STR : only valid in final field. This allows (nearly) arbitrary message types to be supported by simply scanning the string to EndOfLine and then passing it to a more intellegent handler. For example, MIDI SYSEX (system exclusive) messages of up to 256 bytes can be read as space-delimited integers into the 1K SK_STR buffer. Longer bulk dumps, soundfiles, etc. should be handled as a new message type pointing to a FileName, Socket, or something else stored in the SK_STR field, or as a new type of multi-line message. Here's a couple of lines from the SKINI.tbl file {"NoteOff" , __SK_NoteOff_, SK_DBL, SK_DBL}, {"NoteOn" , __SK_NoteOn_, SK_DBL, SK_DBL}, {"ControlChange" , __SK_ControlChange_, SK_INT, SK_DBL}, {"Volume" , __SK_ControlChange_, __SK_Volume_ , SK_DBL}, {"StringDamping" , __SK_ControlChange_, __SK_StringDamping_, SK_DBL}, {"StringDetune" , __SK_ControlChange_, __SK_StringDetune_, SK_DBL}, The first three are basic MIDI messages. The first two would cause the parser, after recognizing a match of the string "NoteOff" or "NoteOn", to set the message type to 128 or 144 (__SK_NoteOff_ and __SK_NoteOn_ are #defined in the file SKINI.msg to be the MIDI byte value, without channel, of the actual MIDI messages for NoteOn and NoteOff). The parser would then set the time or delta time (this is always done and is therefore not described in the SKINI Message Struct). The next two fields would be scanned as double-precision floats and assigned to the byteTwo and byteThree variables of the SKINI parser. The remainder of the line is stashed in the remainderString variable. The ControlChange spec is basically the same as NoteOn and NoteOff, but the second data byte is set to an integer (for checking later as to what MIDI control is being changed). The Volume spec is a MIDI Extension message, which behaves like a ControlChange message with the controller number set explicitly to the value for MIDI Volume (7). Thus the following two lines would accomplish the same changing of MIDI volume on channel 2: ControlChange 0.000000 2 7 64.1 Volume 0.000000 2 64.1 I like the 2nd line better, thus my motivation for SKINI in the first place. The StringDamping and StringDetune messages behave the same as the Volume message, but use Control Numbers which aren't specifically nailed-down in MIDI. Note that these Control Numbers are carried around as long ints, so we're not limited to 0-127. If, however, you want to use a MIDI controller to play an instrument, using controller numbers in the 0-127 range might make sense. 8) Objects using SKINI Here's a simple example of code which uses the Skini object to read a SKINI file and control a single instrument. Skini score; Skini::Message message; instrument = new Mandolin(50.0); score.setFile( argv[1] ); while ( score.nextMessage( message ) != 0 ) { tempDouble = message.time; if (tempDouble < 0) { tempDouble = - tempDouble; tempDouble = tempDouble - output.getTime(); if (tempDouble < 0) { printf("Bad News Here!!! Backward Absolute Time Required.\n"); tempDouble = 0.0; } } tempLong = (long) ( tempDouble * Stk::sampleRate() ); for ( i=0; itick() ); } tempDouble3 = message.floatValues[1] * NORM_MIDI; if ( message.type == __SK_NoteOn_ ) { if ( tempDouble3 == 0.0 ) { tempDouble3 = 0.5; instrument->noteOff( tempDouble3 ); } else { tempLong = message.intValues[0]; tempDouble2 = Midi2Pitch[tempLong]; instrument->noteOn( tempDouble2, tempDouble3 ); } } else if ( message.type == __SK_NoteOff_ ) { instrument->noteOff( tempDouble3 ); } else if ( message.type == __SK_ControlChange_ ) { tempLong = message.intValues[0]; instrument->controlChange( tempLong, tempDouble3 ); } } When a SKINI score is passed to a Skini object using the Skini::setFile() function, valid messages are read from the file and returned using the Skini::nextMessage() function. A Skini::Message structure contains all the information parsed from a single SKINI message. A returned message type of zero indicates either an invalid message or the end of a scorefile. The "time" member of a Skini::Message is the deltaTime until the current message should occur. If this is greater than 0, synthesis occurs until the deltaTime has elapsed. If deltaTime is less than zero, the time is interpreted as absolute time and the output device is queried as to what time it is now. That is used to form a deltaTime, and if it's positive we synthesize. If it's negative, we print an error, pretend this never happened and we hang around hoping to eventually catch up. The rest of the code sorts out message types NoteOn, NoteOff (including NoteOn with velocity 0), and ControlChange. The code implicitly takes into account the integer type of the control number, but all other data is treated as double float. stk-4.5.0/doc/treesed.html0000644000076600007660000001276112327014024013230 0ustar gary Treesed Usage

How to Use Treesed

Go to the directory where you want to search or make changes.

There are two choices you can make when using treesed:

  1. Do I just want to search for a text, or do I want to search for a text and replace it with something else?
    If you are just searching you are using Treesed in "search mode", otherwise it is in "replace mode."
  2. Do I want to search/replace only in files in my current directory, or should files in all subdirectories (and all directories below that) also be done?
Some examples will make this clear.

Searching

Say you are faced with the situation that the author of a slew of web-pages, Nathan Brazil, has left and has been succeeded by Mavra Chang. First, let us see which files are affected by this (what you type in is shown in bold):
[localhost] treesed "Nathan Brazil" -files *.html
search_pattern: Nathan\ Brazil
replacement_pattern: 

** Search mode

.
midnight.html: 1 lines on: 2
..
well.html: 1 lines on: 3
We notice the following:
  • The search text "Nathan Brazil" is enclosed in double-quotes (").
  • You specify which files to search with -files followed by a list of file names--in this case *.html.
  • Treesed reports the search pattern ("pattern" is just a fancy word for "text") you specified (you can ignore that \).
  • Treesed reports an empty replacement_pattern. This is correct, because you haven't entered one.
  • It therefore deduces that is is in search mode.
  • It finds two files containing "Nathan Brazil", and reports on which lines of these files it found it; it does not show the lines themselves.
Because you used -files, Treesed will search in the files you specify in the current directory. You can also search files in the current directory and all directories below it. However, in that case you can not specify which file names to use, all files will be searched:
[localhost] treesed "Nathan Brazil" -tree
search_pattern: Nathan\ Brazil
replacement_pattern: 

** Search mode

.
midnight.html: 1 lines on: 2
...
well.html: 1 lines on: 3
.
new/echoes.html: 1 lines on: 2
We notice the following:
  • Instead of -files we now see -tree.
  • We do not see a specification of file names.
  • Treesed finds an occurence of "Nathan Brazil" in the file echoes.html in the subdirectory new; it did not find this file in the previous example (as it shouldn't).

Replacing

To replace a text you simply add the replacement text right after the search text:
[localhost] treesed "Nathan Brazil" "Mavra Change" -files *.html
search_pattern: Nathan\ Brazil
replacement_pattern: Mavra Chang

** EDIT MODE!

.
midnight.html: 1 lines on: 2

Replaced Nathan\ Brazil by Mavra Chang on 1 lines in midnight.html
..
well.html: 1 lines on: 3

Replaced Nathan\ Brazil by Mavra Chang on 1 lines in well.html
We notice the following:
  • Right after the search text "Nathan Brazil" you specify the replacement text "Mavra Chang".
  • As a result, Treesed now reports a non-empty replacement_pattern.
  • Hence it concludes it is in "edit mode", which means replacment mode.
  • Treesed dutifully reports on which lines in which files it did the replacement.
To replace a text in all files in the current directory and the ones below it, we do the following:
[localhost] treesed "Nathan Brazil" "Mavra Chang" -tree
search_pattern: Nathan\ Brazil
replacement_pattern: Mavra Chang

** EDIT MODE!

.
midnight.html: 1 lines on: 2

Replaced Nathan\ Brazil by Mavra Chang on 1 lines in midnight.html

....
well.html: 1 lines on: 3

Replaced Nathan\ Brazil by Mavra Chang on 1 lines in well.html
.
new/echoes.html: 1 lines on: 2

Replaced Nathan\ Brazil by Mavra Chang on 1 lines in new/echoes.html
and we get the expected results, including the replace in new/echoes.html.

Old Versions

Treesed leaves behind quite a mess of old versions of the files it changed (only in change-mode, of course). These old files have the same name as the original file, with .ddddd appended to it. For example, if treesed makes a change to midnight.html it will leave the original version as something like midnight.html.26299. You'll have to remove these files lest your disk area clutters up. Here is a command that does that, but beware! This command removes all files in the current directory and all below it, that end in a period followed by one or more digits:
find . -name "*.[0-9]*" -exec rm {} \;
It is interesting to note that if you use treesed again without cleaning up, you may get files like midnight.html.26299.27654. These will also be cleaned up by the above slightly dangerous command.

About Treesed

treesed is public domain software developed and designed by Rick Jansen from Sara, Amsterdam, Netherlands, January 1996.

About This Document

This usage document was created by the Division of Information Technology Services at The University of Western Ontario. stk-4.5.0/include/0000755000076600007660000000000012327014024011556 5ustar garystk-4.5.0/include/ADSR.h0000644000076600007660000001115612327014024012464 0ustar gary#ifndef STK_ADSR_H #define STK_ADSR_H #include "Generator.h" namespace stk { /***************************************************/ /*! \class ADSR \brief STK ADSR envelope class. This class implements a traditional ADSR (Attack, Decay, Sustain, Release) envelope. It responds to simple keyOn and keyOff messages, keeping track of its state. The \e state = ADSR::IDLE before being triggered and after the envelope value reaches 0.0 in the ADSR::RELEASE state. All rate, target and level settings must be non-negative. All time settings are in seconds and must be positive. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class ADSR : public Generator { public: //! ADSR envelope states. enum { ATTACK, /*!< Attack */ DECAY, /*!< Decay */ SUSTAIN, /*!< Sustain */ RELEASE, /*!< Release */ IDLE /*!< Before attack / after release */ }; //! Default constructor. ADSR( void ); //! Class destructor. ~ADSR( void ); //! Set target = 1, state = \e ADSR::ATTACK. void keyOn( void ); //! Set target = 0, state = \e ADSR::RELEASE. void keyOff( void ); //! Set the attack rate (gain / sample). void setAttackRate( StkFloat rate ); //! Set the target value for the attack (default = 1.0). void setAttackTarget( StkFloat target ); //! Set the decay rate (gain / sample). void setDecayRate( StkFloat rate ); //! Set the sustain level. void setSustainLevel( StkFloat level ); //! Set the release rate (gain / sample). void setReleaseRate( StkFloat rate ); //! Set the attack rate based on a time duration (seconds). void setAttackTime( StkFloat time ); //! Set the decay rate based on a time duration (seconds). void setDecayTime( StkFloat time ); //! Set the release rate based on a time duration (seconds). void setReleaseTime( StkFloat time ); //! Set sustain level and attack, decay, and release time durations (seconds). void setAllTimes( StkFloat aTime, StkFloat dTime, StkFloat sLevel, StkFloat rTime ); //! Set a sustain target value and attack or decay from current value to target. void setTarget( StkFloat target ); //! Return the current envelope \e state (ATTACK, DECAY, SUSTAIN, RELEASE, IDLE). int getState( void ) const { return state_; }; //! Set to state = ADSR::SUSTAIN with current and target values of \e value. void setValue( StkFloat value ); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Compute and return one output sample. StkFloat tick( void ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: void sampleRateChanged( StkFloat newRate, StkFloat oldRate ); int state_; StkFloat value_; StkFloat target_; StkFloat attackRate_; StkFloat decayRate_; StkFloat releaseRate_; StkFloat releaseTime_; StkFloat sustainLevel_; }; inline StkFloat ADSR :: tick( void ) { switch ( state_ ) { case ATTACK: value_ += attackRate_; if ( value_ >= target_ ) { value_ = target_; target_ = sustainLevel_; state_ = DECAY; } lastFrame_[0] = value_; break; case DECAY: if ( value_ > sustainLevel_ ) { value_ -= decayRate_; if ( value_ <= sustainLevel_ ) { value_ = sustainLevel_; state_ = SUSTAIN; } } else { value_ += decayRate_; // attack target < sustain level if ( value_ >= sustainLevel_ ) { value_ = sustainLevel_; state_ = SUSTAIN; } } lastFrame_[0] = value_; break; case RELEASE: value_ -= releaseRate_; if ( value_ <= 0.0 ) { value_ = 0.0; state_ = IDLE; } lastFrame_[0] = value_; } return value_; } inline StkFrames& ADSR :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "ADSR::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i 0). /*! The rate is computed as described above. The value of \e tau must be greater than zero. Values of \e tau close to zero produce fast approach rates, while values greater than 1.0 produce rather slow rates. */ void setTau( StkFloat tau ); //! Set the asymptotic rate based on a time duration (must be > 0). void setTime( StkFloat time ); //! Set the asymptotic rate such that the target value is perceptually reached (to within -60dB of the target) in \e t60 seconds. void setT60( StkFloat t60 ); //! Set the target value. void setTarget( StkFloat target ); //! Set current and target values to \e value. void setValue( StkFloat value ); //! Return the current envelope \e state (0 = at target, 1 otherwise). int getState( void ) const { return state_; }; //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Compute and return one output sample. StkFloat tick( void ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: void sampleRateChanged( StkFloat newRate, StkFloat oldRate ); StkFloat value_; StkFloat target_; StkFloat factor_; StkFloat constant_; int state_; }; inline StkFloat Asymp :: tick( void ) { if ( state_ ) { value_ = factor_ * value_ + constant_; // Check threshold. if ( target_ > value_ ) { if ( target_ - value_ <= TARGET_THRESHOLD ) { value_ = target_; state_ = 0; } } else { if ( value_ - target_ <= TARGET_THRESHOLD ) { value_ = target_; state_ = 0; } } lastFrame_[0] = value_; } return value_; } inline StkFrames& Asymp :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "Asymp::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i frames.channels() - nChannels ) { oStream_ << "BandedWG::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i Out 3 -/| 4 -- \endcode Control Change Numbers: - Operator 4 (feedback) Gain = 2 - Operator 3 Gain = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class BeeThree : public FM { public: //! Class constructor. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ BeeThree( void ); //! Class destructor. ~BeeThree( void ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: }; inline StkFloat BeeThree :: tick( unsigned int ) { StkFloat temp; if ( modDepth_ > 0.0 ) { temp = 1.0 + ( modDepth_ * vibrato_.tick() * 0.1 ); waves_[0]->setFrequency( baseFrequency_ * temp * ratios_[0] ); waves_[1]->setFrequency( baseFrequency_ * temp * ratios_[1] ); waves_[2]->setFrequency( baseFrequency_ * temp * ratios_[2] ); waves_[3]->setFrequency( baseFrequency_ * temp * ratios_[3] ); } waves_[3]->addPhaseOffset( twozero_.lastOut() ); temp = control1_ * 2.0 * gains_[3] * adsr_[3]->tick() * waves_[3]->tick(); twozero_.tick( temp ); temp += control2_ * 2.0 * gains_[2] * adsr_[2]->tick() * waves_[2]->tick(); temp += gains_[1] * adsr_[1]->tick() * waves_[1]->tick(); temp += gains_[0] * adsr_[0]->tick() * waves_[0]->tick(); lastFrame_[0] = temp * 0.125; return lastFrame_[0]; } inline StkFrames& BeeThree :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "BeeThree::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i= 1.0. The \e frequency value should be between zero and half the sample rate. */ void setResonance( StkFloat frequency, StkFloat radius, bool normalize = false ); //! Set the filter coefficients for a notch at \e frequency (in Hz). /*! This method determines the filter coefficients corresponding to two complex-conjugate zeros with the given \e frequency (in Hz) and \e radius from the z-plane origin. No filter normalization is attempted. The \e frequency value should be between zero and half the sample rate. The \e radius value should be positive. */ void setNotch( StkFloat frequency, StkFloat radius ); //! Sets the filter zeroes for equal resonance gain. /*! When using the filter as a resonator, zeroes places at z = 1, z = -1 will result in a constant gain at resonance of 1 / (1 - R), where R is the pole radius setting. */ void setEqualGainZeroes( void ); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Input one sample to the filter and return a reference to one output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the filter and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate ); }; inline StkFloat BiQuad :: tick( StkFloat input ) { inputs_[0] = gain_ * input; lastFrame_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2]; lastFrame_[0] -= a_[2] * outputs_[2] + a_[1] * outputs_[1]; inputs_[2] = inputs_[1]; inputs_[1] = inputs_[0]; outputs_[2] = outputs_[1]; outputs_[1] = lastFrame_[0]; return lastFrame_[0]; } inline StkFrames& BiQuad :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "BiQuad::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "BiQuad::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i #include namespace stk { /***************************************************/ /*! \class Blit \brief STK band-limited impulse train class. This class generates a band-limited impulse train using a closed-form algorithm reported by Stilson and Smith in "Alias-Free Digital Synthesis of Classic Analog Waveforms", 1996. The user can specify both the fundamental frequency of the impulse train and the number of harmonics contained in the resulting signal. The signal is normalized so that the peak value is +/-1.0. If nHarmonics is 0, then the signal will contain all harmonics up to half the sample rate. Note, however, that this setting may produce aliasing in the signal when the frequency is changing (no automatic modification of the number of harmonics is performed by the setFrequency() function). Original code by Robin Davies, 2005. Revisions by Gary Scavone for STK, 2005. */ /***************************************************/ class Blit: public Generator { public: //! Default constructor that initializes BLIT frequency to 220 Hz. Blit( StkFloat frequency = 220.0 ); //! Class destructor. ~Blit(); //! Resets the oscillator state and phase to 0. void reset(); //! Set the phase of the signal. /*! Set the phase of the signal, in the range 0 to 1. */ void setPhase( StkFloat phase ) { phase_ = PI * phase; }; //! Get the current phase of the signal. /*! Get the phase of the signal, in the range [0 to 1.0). */ StkFloat getPhase() const { return phase_ / PI; }; //! Set the impulse train rate in terms of a frequency in Hz. void setFrequency( StkFloat frequency ); //! Set the number of harmonics generated in the signal. /*! This function sets the number of harmonics contained in the resulting signal. It is equivalent to (2 * M) + 1 in the BLIT algorithm. The default value of 0 sets the algorithm for maximum harmonic content (harmonics up to half the sample rate). This parameter is not checked against the current sample rate and fundamental frequency. Thus, aliasing can result if one or more harmonics for a given fundamental frequency exceeds fs / 2. This behavior was chosen over the potentially more problematic solution of automatically modifying the M parameter, which can produce audible clicks in the signal. */ void setHarmonics( unsigned int nHarmonics = 0 ); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Compute and return one output sample. StkFloat tick( void ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: void updateHarmonics( void ); unsigned int nHarmonics_; unsigned int m_; StkFloat rate_; StkFloat phase_; StkFloat p_; }; inline StkFloat Blit :: tick( void ) { // The code below implements the SincM algorithm of Stilson and // Smith with an additional scale factor of P / M applied to // normalize the output. // A fully optimized version of this code would replace the two sin // calls with a pair of fast sin oscillators, for which stable fast // two-multiply algorithms are well known. In the spirit of STK, // which favors clarity over performance, the optimization has not // been made here. // Avoid a divide by zero at the sinc peak, which has a limiting // value of 1.0. StkFloat tmp, denominator = sin( phase_ ); if ( denominator <= std::numeric_limits::epsilon() ) tmp = 1.0; else { tmp = sin( m_ * phase_ ); tmp /= m_ * denominator; } phase_ += rate_; if ( phase_ >= PI ) phase_ -= PI; lastFrame_[0] = tmp; return lastFrame_[0]; } inline StkFrames& Blit :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "Blit::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i #include namespace stk { /***************************************************/ /*! \class BlitSaw \brief STK band-limited sawtooth wave class. This class generates a band-limited sawtooth waveform using a closed-form algorithm reported by Stilson and Smith in "Alias-Free Digital Synthesis of Classic Analog Waveforms", 1996. The user can specify both the fundamental frequency of the sawtooth and the number of harmonics contained in the resulting signal. If nHarmonics is 0, then the signal will contain all harmonics up to half the sample rate. Note, however, that this setting may produce aliasing in the signal when the frequency is changing (no automatic modification of the number of harmonics is performed by the setFrequency() function). Based on initial code of Robin Davies, 2005. Modified algorithm code by Gary Scavone, 2005. */ /***************************************************/ class BlitSaw: public Generator { public: //! Class constructor. BlitSaw( StkFloat frequency = 220.0 ); //! Class destructor. ~BlitSaw(); //! Resets the oscillator state and phase to 0. void reset(); //! Set the sawtooth oscillator rate in terms of a frequency in Hz. void setFrequency( StkFloat frequency ); //! Set the number of harmonics generated in the signal. /*! This function sets the number of harmonics contained in the resulting signal. It is equivalent to (2 * M) + 1 in the BLIT algorithm. The default value of 0 sets the algorithm for maximum harmonic content (harmonics up to half the sample rate). This parameter is not checked against the current sample rate and fundamental frequency. Thus, aliasing can result if one or more harmonics for a given fundamental frequency exceeds fs / 2. This behavior was chosen over the potentially more problematic solution of automatically modifying the M parameter, which can produce audible clicks in the signal. */ void setHarmonics( unsigned int nHarmonics = 0 ); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Compute and return one output sample. StkFloat tick( void ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: void updateHarmonics( void ); unsigned int nHarmonics_; unsigned int m_; StkFloat rate_; StkFloat phase_; StkFloat p_; StkFloat C2_; StkFloat a_; StkFloat state_; }; inline StkFloat BlitSaw :: tick( void ) { // The code below implements the BLIT algorithm of Stilson and // Smith, followed by a summation and filtering operation to produce // a sawtooth waveform. After experimenting with various approaches // to calculate the average value of the BLIT over one period, I // found that an estimate of C2_ = 1.0 / period (in samples) worked // most consistently. A "leaky integrator" is then applied to the // difference of the BLIT output and C2_. (GPS - 1 October 2005) // A fully optimized version of this code would replace the two sin // calls with a pair of fast sin oscillators, for which stable fast // two-multiply algorithms are well known. In the spirit of STK, // which favors clarity over performance, the optimization has // not been made here. // Avoid a divide by zero, or use of a denormalized divisor // at the sinc peak, which has a limiting value of m_ / p_. StkFloat tmp, denominator = sin( phase_ ); if ( fabs(denominator) <= std::numeric_limits::epsilon() ) tmp = a_; else { tmp = sin( m_ * phase_ ); tmp /= p_ * denominator; } tmp += state_ - C2_; state_ = tmp * 0.995; phase_ += rate_; if ( phase_ >= PI ) phase_ -= PI; lastFrame_[0] = tmp; return lastFrame_[0]; } inline StkFrames& BlitSaw :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "BlitSaw::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i #include namespace stk { /***************************************************/ /*! \class BlitSquare \brief STK band-limited square wave class. This class generates a band-limited square wave signal. It is derived in part from the approach reported by Stilson and Smith in "Alias-Free Digital Synthesis of Classic Analog Waveforms", 1996. The algorithm implemented in this class uses a SincM function with an even M value to achieve a bipolar bandlimited impulse train. This signal is then integrated to achieve a square waveform. The integration process has an associated DC offset so a DC blocking filter is applied at the output. The user can specify both the fundamental frequency of the waveform and the number of harmonics contained in the resulting signal. If nHarmonics is 0, then the signal will contain all harmonics up to half the sample rate. Note, however, that this setting may produce aliasing in the signal when the frequency is changing (no automatic modification of the number of harmonics is performed by the setFrequency() function). Also note that the harmonics of a square wave fall at odd integer multiples of the fundamental, so aliasing will happen with a lower fundamental than with the other Blit waveforms. This class is not guaranteed to be well behaved in the presence of significant aliasing. Based on initial code of Robin Davies, 2005. Modified algorithm code by Gary Scavone, 2005 - 2006. */ /***************************************************/ class BlitSquare: public Generator { public: //! Default constructor that initializes BLIT frequency to 220 Hz. BlitSquare( StkFloat frequency = 220.0 ); //! Class destructor. ~BlitSquare(); //! Resets the oscillator state and phase to 0. void reset(); //! Set the phase of the signal. /*! Set the phase of the signal, in the range 0 to 1. */ void setPhase( StkFloat phase ) { phase_ = PI * phase; }; //! Get the current phase of the signal. /*! Get the phase of the signal, in the range [0 to 1.0). */ StkFloat getPhase() const { return phase_ / PI; }; //! Set the impulse train rate in terms of a frequency in Hz. void setFrequency( StkFloat frequency ); //! Set the number of harmonics generated in the signal. /*! This function sets the number of harmonics contained in the resulting signal. It is equivalent to (2 * M) + 1 in the BLIT algorithm. The default value of 0 sets the algorithm for maximum harmonic content (harmonics up to half the sample rate). This parameter is not checked against the current sample rate and fundamental frequency. Thus, aliasing can result if one or more harmonics for a given fundamental frequency exceeds fs / 2. This behavior was chosen over the potentially more problematic solution of automatically modifying the M parameter, which can produce audible clicks in the signal. */ void setHarmonics( unsigned int nHarmonics = 0 ); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Compute and return one output sample. StkFloat tick( void ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: void updateHarmonics( void ); unsigned int nHarmonics_; unsigned int m_; StkFloat rate_; StkFloat phase_; StkFloat p_; StkFloat a_; StkFloat lastBlitOutput_; StkFloat dcbState_; }; inline StkFloat BlitSquare :: tick( void ) { StkFloat temp = lastBlitOutput_; // A fully optimized version of this would replace the two sin calls // with a pair of fast sin oscillators, for which stable fast // two-multiply algorithms are well known. In the spirit of STK, // which favors clarity over performance, the optimization has // not been made here. // Avoid a divide by zero, or use of a denomralized divisor // at the sinc peak, which has a limiting value of 1.0. StkFloat denominator = sin( phase_ ); if ( fabs( denominator ) < std::numeric_limits::epsilon() ) { // Inexact comparison safely distinguishes betwen *close to zero*, and *close to PI*. if ( phase_ < 0.1f || phase_ > TWO_PI - 0.1f ) lastBlitOutput_ = a_; else lastBlitOutput_ = -a_; } else { lastBlitOutput_ = sin( m_ * phase_ ); lastBlitOutput_ /= p_ * denominator; } lastBlitOutput_ += temp; // Now apply DC blocker. lastFrame_[0] = lastBlitOutput_ - dcbState_ + 0.999 * lastFrame_[0]; dcbState_ = lastBlitOutput_; phase_ += rate_; if ( phase_ >= TWO_PI ) phase_ -= TWO_PI; return lastFrame_[0]; } inline StkFrames& BlitSquare :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "BlitSquare::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i frames.channels() - nChannels ) { oStream_ << "BlowBotl::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i frames.channels() - nChannels ) { oStream_ << "BlowHole::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i 0.0 ) { neckDelay_.setDelay( (baseDelay_ * (1.0 - betaRatio_) ) + (baseDelay_ * vibratoGain_ * vibrato_.tick()) ); } lastFrame_[0] = 0.1248 * bodyFilters_[5].tick( bodyFilters_[4].tick( bodyFilters_[3].tick( bodyFilters_[2].tick( bodyFilters_[1].tick( bodyFilters_[0].tick( bridgeDelay_.lastOut() ) ) ) ) ) ); return lastFrame_[0]; } inline StkFrames& Bowed :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Bowed::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i namespace stk { /***************************************************/ /*! \class BowTable \brief STK bowed string table class. This class implements a simple bowed string non-linear function, as described by Smith (1986). The output is an instantaneous reflection coefficient value. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class BowTable : public Function { public: //! Default constructor. BowTable( void ) : offset_(0.0), slope_(0.1), minOutput_(0.01), maxOutput_(0.98) {}; //! Set the table offset value. /*! The table offset is a bias which controls the symmetry of the friction. If you want the friction to vary with direction, use a non-zero value for the offset. The default value is zero. */ void setOffset( StkFloat offset ) { offset_ = offset; }; //! Set the table slope value. /*! The table slope controls the width of the friction pulse, which is related to bow force. */ void setSlope( StkFloat slope ) { slope_ = slope; }; //! Set the minimum table output value (0.0 - 1.0). void setMinOutput( StkFloat minimum ) { minOutput_ = minimum; }; //! Set the maximum table output value (0.0 - 1.0). void setMaxOutput( StkFloat maximum ) { maxOutput_ = maximum; }; //! Take one sample input and map to one sample of output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the table and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the table and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: StkFloat offset_; StkFloat slope_; StkFloat minOutput_; StkFloat maxOutput_; }; inline StkFloat BowTable :: tick( StkFloat input ) { // The input represents differential string vs. bow velocity. StkFloat sample = input + offset_; // add bias to input sample *= slope_; // then scale it lastFrame_[0] = (StkFloat) fabs( (double) sample ) + (StkFloat) 0.75; lastFrame_[0] = (StkFloat) pow( lastFrame_[0], (StkFloat) -4.0 ); // Set minimum threshold if ( lastFrame_[0] < minOutput_ ) lastFrame_[0] = minOutput_; // Set maximum threshold if ( lastFrame_[0] > maxOutput_ ) lastFrame_[0] = maxOutput_; return lastFrame_[0]; } inline StkFrames& BowTable :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "BowTable::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i 1.0) *samples = 1.0; } lastFrame_[0] = *(samples-hop); return frames; } inline StkFrames& BowTable :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel ) { #if defined(_STK_DEBUG_) if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "BowTable::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i 1.0) *oSamples = 1.0; } lastFrame_[0] = *(oSamples-oHop); return iFrames; } } // stk namespace #endif stk-4.5.0/include/Brass.h0000644000076600007660000001040312327014024012777 0ustar gary#ifndef STK_BRASS_H #define STK_BRASS_H #include "Instrmnt.h" #include "DelayA.h" #include "BiQuad.h" #include "PoleZero.h" #include "ADSR.h" #include "SineWave.h" namespace stk { /***************************************************/ /*! \class Brass \brief STK simple brass instrument class. This class implements a simple brass instrument waveguide model, a la Cook (TBone, HosePlayer). This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Lip Tension = 2 - Slide Length = 4 - Vibrato Frequency = 11 - Vibrato Gain = 1 - Volume = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Brass: public Instrmnt { public: //! Class constructor, taking the lowest desired playing frequency. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ Brass( StkFloat lowestFrequency = 8.0 ); //! Class destructor. ~Brass( ); //! Reset and clear all internal state. void clear( ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Set the lips frequency. void setLip( StkFloat frequency ); //! Apply breath pressure to instrument with given amplitude and rate of increase. void startBlowing( StkFloat amplitude, StkFloat rate ); //! Decrease breath pressure with given rate of decrease. void stopBlowing( StkFloat rate ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). void controlChange( int number, StkFloat value ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: DelayA delayLine_; BiQuad lipFilter_; PoleZero dcBlock_; ADSR adsr_; SineWave vibrato_; StkFloat lipTarget_; StkFloat slideTarget_; StkFloat vibratoGain_; StkFloat maxPressure_; }; inline StkFloat Brass :: tick( unsigned int ) { StkFloat breathPressure = maxPressure_ * adsr_.tick(); breathPressure += vibratoGain_ * vibrato_.tick(); StkFloat mouthPressure = 0.3 * breathPressure; StkFloat borePressure = 0.85 * delayLine_.lastOut(); StkFloat deltaPressure = mouthPressure - borePressure; // Differential pressure. deltaPressure = lipFilter_.tick( deltaPressure ); // Force - > position. deltaPressure *= deltaPressure; // Basic position to area mapping. if ( deltaPressure > 1.0 ) deltaPressure = 1.0; // Non-linear saturation. // The following input scattering assumes the mouthPressure = area. lastFrame_[0] = deltaPressure * mouthPressure + ( 1.0 - deltaPressure) * borePressure; lastFrame_[0] = delayLine_.tick( dcBlock_.tick( lastFrame_[0] ) ); return lastFrame_[0]; } inline StkFrames& Brass :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Brass::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i 1 ) { oStream_ << "Chorus::lastOut(): channel argument must be less than 2!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif return lastFrame_[channel]; } inline StkFloat Chorus :: tick( StkFloat input, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel > 1 ) { oStream_ << "Chorus::tick(): channel argument must be less than 2!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif delayLine_[0].setDelay( baseLength_ * 0.707 * ( 1.0 + modDepth_ * mods_[0].tick() ) ); delayLine_[1].setDelay( baseLength_ * 0.5 * ( 1.0 - modDepth_ * mods_[1].tick() ) ); lastFrame_[0] = effectMix_ * ( delayLine_[0].tick( input ) - input ) + input; lastFrame_[1] = effectMix_ * ( delayLine_[1].tick( input ) - input ) + input; return lastFrame_[channel]; } inline StkFrames& Chorus :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() - 1 ) { oStream_ << "Chorus::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels() - 1; for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() - 1 ) { oStream_ << "Chorus::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i frames.channels() - nChannels ) { oStream_ << "Clarinet::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i namespace stk { /***************************************************/ /*! \class Cubic \brief STK cubic non-linearity class. This class implements the cubic non-linearity that was used in SynthBuilder. The formula implemented is: \code output = gain * (a1 * input + a2 * input^2 + a3 * input^3) \endcode followed by a limiter for values outside +-threshold. Ported to STK by Nick Porcaro, 2007. Updated for inclusion in STK distribution by Gary Scavone, 2011. */ /***************************************************/ class Cubic : public Function { public: //! Default constructor. Cubic( void ) : a1_(0.5), a2_(0.5), a3_(0.5), gain_(1.0), threshold_(1.0) {}; //! Set the a1 coefficient value. void setA1( StkFloat a1 ) { a1_ = a1; }; //! Set the a2 coefficient value. void setA2( StkFloat a2 ) { a2_ = a2; }; //! Set the a3 coefficient value. void setA3( StkFloat a3 ) { a3_ = a3; }; //! Set the gain value. void setGain( StkFloat gain ) { gain_ = gain; }; //! Set the threshold value. void setThreshold( StkFloat threshold ) { threshold_ = threshold; }; //! Input one sample to the function and return one output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the function and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the function and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: StkFloat a1_; StkFloat a2_; StkFloat a3_; StkFloat gain_; StkFloat threshold_; }; inline StkFloat Cubic :: tick( StkFloat input ) { StkFloat inSquared = input * input; StkFloat inCubed = inSquared * input; lastFrame_[0] = gain_ * (a1_ * input + a2_ * inSquared + a3_ * inCubed); // Apply threshold if we are out of range. if ( fabs( lastFrame_[0] ) > threshold_ ) { lastFrame_[0] = ( lastFrame_[0] < 0 ? -threshold_ : threshold_ ); } return lastFrame_[0]; } inline StkFrames& Cubic :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "Cubic::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "Cubic::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i= frames.channels() ) { oStream_ << "Delay::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "Delay::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i= frames.channels() ) { oStream_ << "DelayA::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "DelayA::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i= frames.channels() ) { oStream_ << "DelayL::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "DelayL::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i soundOrder_; std::vector soundNumber_; int nSounding_; }; inline StkFloat Drummer :: tick( unsigned int ) { lastFrame_[0] = 0.0; if ( nSounding_ == 0 ) return lastFrame_[0]; for ( int i=0; i= 0 ) { if ( waves_[i].isFinished() ) { // Re-order the list. for ( int j=0; j soundOrder_[i] ) soundOrder_[j] -= 1; } soundOrder_[i] = -1; nSounding_--; } else lastFrame_[0] += filters_[i].tick( waves_[i].tick() ); } } return lastFrame_[0]; } inline StkFrames& Drummer :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Drummer::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i= frames.channels() ) { oStream_ << "Echo::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "Echo::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i namespace stk { /***************************************************/ /*! \class Effect \brief STK abstract effects parent class. This class provides common functionality for STK effects subclasses. It is general enough to support both monophonic and polyphonic input/output classes. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Effect : public Stk { public: //! Class constructor. Effect( void ) { lastFrame_.resize( 1, 1, 0.0 ); }; //! Return the number of output channels for the class. unsigned int channelsOut( void ) const { return lastFrame_.channels(); }; //! Return an StkFrames reference to the last output sample frame. const StkFrames& lastFrame( void ) const { return lastFrame_; }; //! Reset and clear all internal state. virtual void clear() = 0; //! Set the mixture of input and "effected" levels in the output (0.0 = input only, 1.0 = effect only). virtual void setEffectMix( StkFloat mix ); protected: // Returns true if argument value is prime. bool isPrime( unsigned int number ); StkFrames lastFrame_; StkFloat effectMix_; }; inline void Effect :: setEffectMix( StkFloat mix ) { if ( mix < 0.0 ) { oStream_ << "Effect::setEffectMix: mix parameter is less than zero ... setting to zero!"; handleError( StkError::WARNING ); effectMix_ = 0.0; } else if ( mix > 1.0 ) { oStream_ << "Effect::setEffectMix: mix parameter is greater than 1.0 ... setting to one!"; handleError( StkError::WARNING ); effectMix_ = 1.0; } else effectMix_ = mix; } inline bool Effect :: isPrime( unsigned int number ) { if ( number == 2 ) return true; if ( number & 1 ) { for ( int i=3; i<(int)sqrt((double)number)+1; i+=2 ) if ( (number % i) == 0 ) return false; return true; // prime } else return false; // even } } // stk namespace #endif stk-4.5.0/include/Envelope.h0000644000076600007660000000631712327014024013513 0ustar gary#ifndef STK_ENVELOPE_H #define STK_ENVELOPE_H #include "Generator.h" namespace stk { /***************************************************/ /*! \class Envelope \brief STK linear line envelope class. This class implements a simple linear line envelope generator which is capable of ramping to an arbitrary target value by a specified \e rate. It also responds to simple \e keyOn and \e keyOff messages, ramping to 1.0 on keyOn and to 0.0 on keyOff. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Envelope : public Generator { public: //! Default constructor. Envelope( void ); //! Class destructor. ~Envelope( void ); //! Assignment operator. Envelope& operator= ( const Envelope& e ); //! Set target = 1. void keyOn( void ) { this->setTarget( 1.0 ); }; //! Set target = 0. void keyOff( void ) { this->setTarget( 0.0 ); }; //! Set the \e rate. /*! The \e rate must be positive (though a value of 0.0 is allowed). */ void setRate( StkFloat rate ); //! Set the \e rate based on a positive time duration (seconds). /*! The \e rate is calculated such that the envelope will ramp from a value of 0.0 to 1.0 in the specified time duration. */ void setTime( StkFloat time ); //! Set the target value. void setTarget( StkFloat target ); //! Set current and target values to \e value. void setValue( StkFloat value ); //! Return the current envelope \e state (0 = at target, 1 otherwise). int getState( void ) const { return state_; }; //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Compute and return one output sample. StkFloat tick( void ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: void sampleRateChanged( StkFloat newRate, StkFloat oldRate ); StkFloat value_; StkFloat target_; StkFloat rate_; int state_; }; inline StkFloat Envelope :: tick( void ) { if ( state_ ) { if ( target_ > value_ ) { value_ += rate_; if ( value_ >= target_ ) { value_ = target_; state_ = 0; } } else { value_ -= rate_; if ( value_ <= target_ ) { value_ = target_; state_ = 0; } } lastFrame_[0] = value_; } return value_; } inline StkFrames& Envelope :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "Envelope::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; isetRate( file_.fileSize() * frequency / Stk::sampleRate() ); }; //! Increment the read pointer by \e time samples, modulo file size. void addTime( StkFloat time ); //! Increment current read pointer by \e angle, relative to a looping frequency. /*! This function increments the read pointer based on the file size and the current Stk::sampleRate. The \e anAngle value is a multiple of file size. */ void addPhase( StkFloat angle ); //! Add a phase offset to the current read pointer. /*! This function determines a time offset based on the file size and the current Stk::sampleRate. The \e angle value is a multiple of file size. */ void addPhaseOffset( StkFloat angle ); //! Return the specified channel value of the last computed frame. /*! For multi-channel files, use the lastFrame() function to get all values from the last computed frame. If no file data is loaded, the returned value is 0.0. The \c channel argument must be less than the number of channels in the file data (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFloat lastOut( unsigned int channel = 0 ) { return FileWvIn::lastOut( channel ); }; //! Compute a sample frame and return the specified \c channel value. /*! For multi-channel files, use the lastFrame() function to get all values from the computed frame. If no file data is loaded, the returned value is 0.0. The \c channel argument must be less than the number of channels in the file data (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFloat tick( unsigned int channel = 0 ); //! Fill the StkFrames argument with computed frames and return the same reference. /*! The number of channels in the StkFrames argument should equal the number of channels in the file data. However, this is only checked if _STK_DEBUG_ is defined during compilation, in which case an incompatibility will trigger an StkError exception. If no file data is loaded, the function does nothing (a warning will be issued if _STK_DEBUG_ is defined during compilation and Stk::showWarnings() has been set to \e true). */ StkFrames& tick( StkFrames& frames ); protected: StkFrames firstFrame_; StkFloat phaseOffset_; }; } // stk namespace #endif stk-4.5.0/include/FileRead.h0000644000076600007660000001145712327014024013412 0ustar gary#ifndef STK_FILEREAD_H #define STK_FILEREAD_H #include "Stk.h" namespace stk { /***************************************************/ /*! \class FileRead \brief STK audio file input class. This class provides input support for various audio file formats. Multi-channel (>2) soundfiles are supported. The file data is returned via an external StkFrames object passed to the read() function. This class does not store its own copy of the file data, rather the data is read directly from disk. FileRead currently supports uncompressed WAV, AIFF/AIFC, SND (AU), MAT-file (Matlab), and STK RAW file formats. Signed integer (8-, 16-, 24-, and 32-bit) and floating-point (32- and 64-bit) data types are supported. Compressed data types are not supported. STK RAW files have no header and are assumed to contain a monophonic stream of 16-bit signed integers in big-endian byte order at a sample rate of 22050 Hz. MAT-file data should be saved in an array with each data channel filling a matrix row. The sample rate for MAT-files should be specified in a variable named "fs". If no such variable is found, the sample rate is assumed to be 44100 Hz. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class FileRead : public Stk { public: //! Default constructor. FileRead( void ); //! Overloaded constructor that opens a file during instantiation. /*! An StkError will be thrown if the file is not found or its format is unknown or unsupported. The optional arguments allow a headerless file type to be supported. If \c typeRaw is false (the default), the subsequent parameters are ignored. */ FileRead( std::string fileName, bool typeRaw = false, unsigned int nChannels = 1, StkFormat format = STK_SINT16, StkFloat rate = 22050.0 ); //! Class destructor. ~FileRead( void ); //! Open the specified file and determine its formatting. /*! An StkError will be thrown if the file is not found or its format is unknown or unsupported. The optional arguments allow a headerless file type to be supported. If \c typeRaw is false (the default), the subsequent parameters are ignored. */ void open( std::string fileName, bool typeRaw = false, unsigned int nChannels = 1, StkFormat format = STK_SINT16, StkFloat rate = 22050.0 ); //! If a file is open, close it. void close( void ); //! Returns \e true if a file is currently open. bool isOpen( void ); //! Return the file size in sample frames. unsigned long fileSize( void ) const { return fileSize_; }; //! Return the number of audio channels in the file. unsigned int channels( void ) const { return channels_; }; //! Return the data format of the file. StkFormat format( void ) const { return dataType_; }; //! Return the file sample rate in Hz. /*! WAV, SND, and AIF formatted files specify a sample rate in their headers. By definition, STK RAW files have a sample rate of 22050 Hz. MAT-files are assumed to have a rate of 44100 Hz. */ StkFloat fileRate( void ) const { return fileRate_; }; //! Read sample frames from the file into an StkFrames object. /*! The number of sample frames to read will be determined from the number of frames of the StkFrames argument. If this size is larger than the available data in the file (given the file size and starting frame index), the extra frames will be unaffected (the StkFrames object will not be resized). Optional parameters are provided to specify the starting sample frame within the file (default = 0) and whether to normalize the data with respect to fixed-point limits (default = true). An StkError will be thrown if a file error occurs or if the number of channels in the StkFrames argument is not equal to that in the file. */ void read( StkFrames& buffer, unsigned long startFrame = 0, bool doNormalize = true ); protected: // Get STK RAW file information. bool getRawInfo( const char *fileName, unsigned int nChannels, StkFormat format, StkFloat rate ); // Get WAV file header information. bool getWavInfo( const char *fileName ); // Get SND (AU) file header information. bool getSndInfo( const char *fileName ); // Get AIFF file header information. bool getAifInfo( const char *fileName ); // Get MAT-file header information. bool getMatInfo( const char *fileName ); // Helper function for MAT-file parsing. bool findNextMatArray( SINT32 *chunkSize, SINT32 *rows, SINT32 *columns, SINT32 *nametype ); FILE *fd_; bool byteswap_; bool wavFile_; unsigned long fileSize_; unsigned long dataOffset_; unsigned int channels_; StkFormat dataType_; StkFloat fileRate_; }; } // stk namespace #endif stk-4.5.0/include/FileWrite.h0000644000076600007660000000663512327014024013633 0ustar gary#ifndef STK_FILEWRITE_H #define STK_FILEWRITE_H #include "Stk.h" namespace stk { /***************************************************/ /*! \class FileWrite \brief STK audio file output class. This class provides output support for various audio file formats. FileWrite writes samples to an audio file. It supports multi-channel data. FileWrite currently supports uncompressed WAV, AIFF, AIFC, SND (AU), MAT-file (Matlab), and STK RAW file formats. Signed integer (8-, 16-, 24-, and 32-bit) and floating- point (32- and 64-bit) data types are supported. STK RAW files use 16-bit integers by definition. MAT-files will always be written as 64-bit floats. If a data type specification does not match the specified file type, the data type will automatically be modified. Compressed data types are not supported. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class FileWrite : public Stk { public: typedef unsigned long FILE_TYPE; static const FILE_TYPE FILE_RAW; /*!< STK RAW file type. */ static const FILE_TYPE FILE_WAV; /*!< WAV file type. */ static const FILE_TYPE FILE_SND; /*!< SND (AU) file type. */ static const FILE_TYPE FILE_AIF; /*!< AIFF file type. */ static const FILE_TYPE FILE_MAT; /*!< Matlab MAT-file type. */ //! Default constructor. FileWrite( void ); //! Overloaded constructor used to specify a file name, type, and data format with this object. /*! An StkError is thrown for invalid argument values or if an error occurs when initializing the output file. */ FileWrite( std::string fileName, unsigned int nChannels = 1, FILE_TYPE type = FILE_WAV, Stk::StkFormat format = STK_SINT16 ); //! Class destructor. virtual ~FileWrite(); //! Create a file of the specified type and name and output samples to it in the given data format. /*! An StkError is thrown for invalid argument values or if an error occurs when initializing the output file. */ void open( std::string fileName, unsigned int nChannels = 1, FileWrite::FILE_TYPE type = FILE_WAV, Stk::StkFormat format = STK_SINT16 ); //! If a file is open, write out samples in the queue and then close it. void close( void ); //! Returns \e true if a file is currently open. bool isOpen( void ); //! Write sample frames from the StkFrames object to the file. /*! An StkError will be thrown if the number of channels in the StkFrames argument does not agree with the number of channels specified when opening the file. */ void write( StkFrames& buffer ); protected: // Write STK RAW file header. bool setRawFile( std::string fileName ); // Write WAV file header. bool setWavFile( std::string fileName ); // Close WAV file, updating the header. void closeWavFile( void ); // Write SND (AU) file header. bool setSndFile( std::string fileName ); // Close SND file, updating the header. void closeSndFile( void ); // Write AIFF file header. bool setAifFile( std::string fileName ); // Close AIFF file, updating the header. void closeAifFile( void ); // Write MAT-file header. bool setMatFile( std::string fileName ); // Close MAT-file, updating the header. void closeMatFile( void ); FILE *fd_; FILE_TYPE fileType_; StkFormat dataType_; unsigned int channels_; unsigned long frameCounter_; bool byteswap_; }; } // stk namespace #endif stk-4.5.0/include/FileWvIn.h0000644000076600007660000001532712327014024013422 0ustar gary#ifndef STK_FILEWVIN_H #define STK_FILEWVIN_H #include "WvIn.h" #include "FileRead.h" namespace stk { /***************************************************/ /*! \class FileWvIn \brief STK audio file input class. This class inherits from WvIn. It provides a "tick-level" interface to the FileRead class. It also provides variable-rate playback functionality. Audio file support is provided by the FileRead class. Linear interpolation is used for fractional read rates. FileWvIn supports multi-channel data. It is important to distinguish the tick() method that computes a single frame (and returns only the specified sample of a multi-channel frame) from the overloaded one that takes an StkFrames object for multi-channel and/or multi-frame data. FileWvIn will either load the entire content of an audio file into local memory or incrementally read file data from disk in chunks. This behavior is controlled by the optional constructor arguments \e chunkThreshold and \e chunkSize. File sizes greater than \e chunkThreshold (in sample frames) will be read incrementally in chunks of \e chunkSize each (also in sample frames). When the file end is reached, subsequent calls to the tick() functions return zeros and isFinished() returns \e true. See the FileRead class for a description of the supported audio file formats. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class FileWvIn : public WvIn { public: //! Default constructor. FileWvIn( unsigned long chunkThreshold = 1000000, unsigned long chunkSize = 1024 ); //! Overloaded constructor for file input. /*! An StkError will be thrown if the file is not found, its format is unknown, or a read error occurs. */ FileWvIn( std::string fileName, bool raw = false, bool doNormalize = true, unsigned long chunkThreshold = 1000000, unsigned long chunkSize = 1024 ); //! Class destructor. ~FileWvIn( void ); //! Open the specified file and load its data. /*! Data from a previously opened file will be overwritten by this function. An StkError will be thrown if the file is not found, its format is unknown, or a read error occurs. If the file data is to be loaded incrementally from disk and normalization is specified, a scaling will be applied with respect to fixed-point limits. If the data format is floating-point, no scaling is performed. */ virtual void openFile( std::string fileName, bool raw = false, bool doNormalize = true ); //! Close a file if one is open. virtual void closeFile( void ); //! Clear outputs and reset time (file) pointer to zero. virtual void reset( void ); //! Normalize data to a maximum of +-1.0. /*! This function has no effect when data is incrementally loaded from disk. */ virtual void normalize( void ); //! Normalize data to a maximum of \e +-peak. /*! This function has no effect when data is incrementally loaded from disk. */ virtual void normalize( StkFloat peak ); //! Return the file size in sample frames. virtual unsigned long getSize( void ) const { return file_.fileSize(); }; //! Return the input file sample rate in Hz (not the data read rate). /*! WAV, SND, and AIF formatted files specify a sample rate in their headers. STK RAW files have a sample rate of 22050 Hz by definition. MAT-files are assumed to have a rate of 44100 Hz. */ virtual StkFloat getFileRate( void ) const { return data_.dataRate(); }; //! Query whether a file is open. bool isOpen( void ) { return file_.isOpen(); }; //! Query whether reading is complete. bool isFinished( void ) const { return finished_; }; //! Set the data read rate in samples. The rate can be negative. /*! If the rate value is negative, the data is read in reverse order. */ virtual void setRate( StkFloat rate ); //! Increment the read pointer by \e time samples. /*! Note that this function will not modify the interpolation flag status. */ virtual void addTime( StkFloat time ); //! Turn linear interpolation on/off. /*! Interpolation is automatically off when the read rate is an integer value. If interpolation is turned off for a fractional rate, the time index is truncated to an integer value. */ void setInterpolate( bool doInterpolate ) { interpolate_ = doInterpolate; }; //! Return the specified channel value of the last computed frame. /*! If no file is loaded, the returned value is 0.0. The \c channel argument must be less than the number of output channels, which can be determined with the channelsOut() function (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. \sa lastFrame() */ StkFloat lastOut( unsigned int channel = 0 ); //! Compute a sample frame and return the specified \c channel value. /*! For multi-channel files, use the lastFrame() function to get all values from the computed frame. If no file data is loaded, the returned value is 0.0. The \c channel argument must be less than the number of channels in the file data (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ virtual StkFloat tick( unsigned int channel = 0 ); //! Fill the StkFrames argument with computed frames and return the same reference. /*! The number of channels in the StkFrames argument must equal the number of channels in the file data. However, this is only checked if _STK_DEBUG_ is defined during compilation, in which case an incompatibility will trigger an StkError exception. If no file data is loaded, the function does nothing (a warning will be issued if _STK_DEBUG_ is defined during compilation). */ virtual StkFrames& tick( StkFrames& frames ); protected: void sampleRateChanged( StkFloat newRate, StkFloat oldRate ); FileRead file_; bool finished_; bool interpolate_; bool normalizing_; bool chunking_; StkFloat time_; StkFloat rate_; unsigned long chunkThreshold_; unsigned long chunkSize_; long chunkPointer_; }; inline StkFloat FileWvIn :: lastOut( unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= data_.channels() ) { oStream_ << "FileWvIn::lastOut(): channel argument and soundfile data are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif if ( finished_ ) return 0.0; return lastFrame_[channel]; } } // stk namespace #endif stk-4.5.0/include/FileWvOut.h0000644000076600007660000000567612327014024013631 0ustar gary#ifndef STK_FILEWVOUT_H #define STK_FILEWVOUT_H #include "WvOut.h" #include "FileWrite.h" namespace stk { /***************************************************/ /*! \class FileWvOut \brief STK audio file output class. This class inherits from WvOut. It provides a "tick-level" interface to the FileWrite class. FileWvOut writes samples to an audio file and supports multi-channel data. It is important to distinguish the tick() method that outputs a single sample to all channels in a sample frame from the overloaded one that takes a reference to an StkFrames object for multi-channel and/or multi-frame data. See the FileWrite class for a description of the supported audio file formats. Currently, FileWvOut is non-interpolating and the output rate is always Stk::sampleRate(). by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class FileWvOut : public WvOut { public: //! Default constructor with optional output buffer size argument. /*! The output buffer size defines the number of frames that are accumulated between writes to disk. */ FileWvOut( unsigned int bufferFrames = 1024 ); //! Overloaded constructor used to specify a file name, type, and data format with this object. /*! An StkError is thrown for invalid argument values or if an error occurs when initializing the output file. */ FileWvOut( std::string fileName, unsigned int nChannels = 1, FileWrite::FILE_TYPE type = FileWrite::FILE_WAV, Stk::StkFormat format = STK_SINT16, unsigned int bufferFrames = 1024 ); //! Class destructor. virtual ~FileWvOut(); //! Open a new file with the specified parameters. /*! If a file was previously open, it will be closed. An StkError will be thrown if any of the specified arguments are invalid or a file error occurs during opening. */ void openFile( std::string fileName, unsigned int nChannels, FileWrite::FILE_TYPE type, Stk::StkFormat format ); //! Close a file if one is open. /*! Any data remaining in the internal buffer will be written to the file before closing. */ void closeFile( void ); //! Output a single sample to all channels in a sample frame. /*! An StkError is thrown if an output error occurs. */ void tick( const StkFloat sample ); //! Output the StkFrames data. /*! An StkError will be thrown if an output error occurs. An StkError will also be thrown if _STK_DEBUG_ is defined during compilation and there is an incompatability between the number of channels in the FileWvOut object and that in the StkFrames object. */ void tick( const StkFrames& frames ); protected: void incrementFrame( void ); FileWrite file_; unsigned int bufferFrames_; unsigned int bufferIndex_; unsigned int iData_; }; } // stk namespace #endif stk-4.5.0/include/Filter.h0000644000076600007660000000704112327014024013156 0ustar gary#ifndef STK_FILTER_H #define STK_FILTER_H #include "Stk.h" #include #include namespace stk { /***************************************************/ /*! \class Filter \brief STK abstract filter class. This class provides limited common functionality for STK digital filter subclasses. It is general enough to support both monophonic and polyphonic input/output classes. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Filter : public Stk { public: //! Class constructor. Filter( void ) { gain_ = 1.0; channelsIn_ = 1; lastFrame_.resize( 1, 1, 0.0 ); }; //! Return the number of input channels for the class. unsigned int channelsIn( void ) const { return channelsIn_; }; //! Return the number of output channels for the class. unsigned int channelsOut( void ) const { return lastFrame_.channels(); }; //! Clears all internal states of the filter. virtual void clear( void ); //! Set the filter gain. /*! The gain is applied at the filter input and does not affect the coefficient values. The default gain value is 1.0. */ void setGain( StkFloat gain ) { gain_ = gain; }; //! Return the current filter gain. StkFloat getGain( void ) const { return gain_; }; //! Return the filter phase delay at the specified frequency. /*! Note that the phase delay calculation accounts for the filter gain. The frequency value should be greater than 0.0 and less than or equal to one-half the sample rate. */ StkFloat phaseDelay( StkFloat frequency ); //! Return an StkFrames reference to the last output sample frame. const StkFrames& lastFrame( void ) const { return lastFrame_; }; //! Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0; protected: StkFloat gain_; unsigned int channelsIn_; StkFrames lastFrame_; std::vector b_; std::vector a_; StkFrames outputs_; StkFrames inputs_; }; inline void Filter :: clear( void ) { unsigned int i; for ( i=0; i 0.5 * Stk::sampleRate() ) { oStream_ << "Filter::phaseDelay: argument (" << frequency << ") is out of range!"; handleError( StkError::WARNING ); return 0.0; } StkFloat omegaT = 2 * PI * frequency / Stk::sampleRate(); StkFloat real = 0.0, imag = 0.0; for ( unsigned int i=0; i &coefficients ); //! Class destructor. ~Fir( void ); //! Set filter coefficients. /*! An StkError can be thrown if the coefficient vector size is zero. The internal state of the filter is not cleared unless the \e clearState flag is \c true. */ void setCoefficients( std::vector &coefficients, bool clearState = false ); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Input one sample to the filter and return one output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the filter and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: }; inline StkFloat Fir :: tick( StkFloat input ) { lastFrame_[0] = 0.0; inputs_[0] = gain_ * input; for ( unsigned int i=(unsigned int)(b_.size())-1; i>0; i-- ) { lastFrame_[0] += b_[i] * inputs_[i]; inputs_[i] = inputs_[i-1]; } lastFrame_[0] += b_[0] * inputs_[0]; return lastFrame_[0]; } inline StkFrames& Fir :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "Fir::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int i, hop = frames.channels(); for ( unsigned int j=0; j0; i-- ) { *samples += b_[i] * inputs_[i]; inputs_[i] = inputs_[i-1]; } *samples += b_[0] * inputs_[0]; } lastFrame_[0] = *(samples-hop); return frames; } inline StkFrames& Fir :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel ) { #if defined(_STK_DEBUG_) if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "Fir::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int i, iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int j=0; j0; i-- ) { *oSamples += b_[i] * inputs_[i]; inputs_[i] = inputs_[i-1]; } *oSamples += b_[0] * inputs_[0]; } lastFrame_[0] = *(oSamples-oHop); return iFrames; } } // stk namespace #endif stk-4.5.0/include/Flute.h0000644000076600007660000001144112327014024013007 0ustar gary#ifndef STK_FLUTE_H #define STK_FLUTE_H #include "Instrmnt.h" #include "JetTable.h" #include "DelayL.h" #include "OnePole.h" #include "PoleZero.h" #include "Noise.h" #include "ADSR.h" #include "SineWave.h" namespace stk { /***************************************************/ /*! \class Flute \brief STK flute physical model class. This class implements a simple flute physical model, as discussed by Karjalainen, Smith, Waryznyk, etc. The jet model uses a polynomial, a la Cook. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Jet Delay = 2 - Noise Gain = 4 - Vibrato Frequency = 11 - Vibrato Gain = 1 - Breath Pressure = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Flute : public Instrmnt { public: //! Class constructor, taking the lowest desired playing frequency. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ Flute( StkFloat lowestFrequency ); //! Class destructor. ~Flute( void ); //! Reset and clear all internal state. void clear( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Set the reflection coefficient for the jet delay (-1.0 - 1.0). void setJetReflection( StkFloat coefficient ) { jetReflection_ = coefficient; }; //! Set the reflection coefficient for the air column delay (-1.0 - 1.0). void setEndReflection( StkFloat coefficient ) { endReflection_ = coefficient; }; //! Set the length of the jet delay in terms of a ratio of jet delay to air column delay lengths. void setJetDelay( StkFloat aRatio ); //! Apply breath velocity to instrument with given amplitude and rate of increase. void startBlowing( StkFloat amplitude, StkFloat rate ); //! Decrease breath velocity with given rate of decrease. void stopBlowing( StkFloat rate ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). void controlChange( int number, StkFloat value ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: DelayL jetDelay_; DelayL boreDelay_; JetTable jetTable_; OnePole filter_; PoleZero dcBlock_; Noise noise_; ADSR adsr_; SineWave vibrato_; StkFloat lastFrequency_; StkFloat maxPressure_; StkFloat jetReflection_; StkFloat endReflection_; StkFloat noiseGain_; StkFloat vibratoGain_; StkFloat outputGain_; StkFloat jetRatio_; }; inline StkFloat Flute :: tick( unsigned int ) { StkFloat pressureDiff; StkFloat breathPressure; // Calculate the breath pressure (envelope + noise + vibrato) breathPressure = maxPressure_ * adsr_.tick(); breathPressure += breathPressure * ( noiseGain_ * noise_.tick() + vibratoGain_ * vibrato_.tick() ); StkFloat temp = -filter_.tick( boreDelay_.lastOut() ); temp = dcBlock_.tick( temp ); // Block DC on reflection. pressureDiff = breathPressure - (jetReflection_ * temp); pressureDiff = jetDelay_.tick( pressureDiff ); pressureDiff = jetTable_.tick( pressureDiff ) + (endReflection_ * temp); lastFrame_[0] = (StkFloat) 0.3 * boreDelay_.tick( pressureDiff ); lastFrame_[0] *= outputGain_; return lastFrame_[0]; } inline StkFrames& Flute :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Flute::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i adsr_; std::vector waves_; SineWave vibrato_; TwoZero twozero_; unsigned int nOperators_; StkFloat baseFrequency_; std::vector ratios_; std::vector gains_; StkFloat modDepth_; StkFloat control1_; StkFloat control2_; StkFloat fmGains_[100]; StkFloat fmSusLevels_[16]; StkFloat fmAttTimes_[32]; }; } // stk namespace #endif stk-4.5.0/include/FMVoices.h0000644000076600007660000000751512327014024013412 0ustar gary#ifndef STK_FMVOICES_H #define STK_FMVOICES_H #include "FM.h" namespace stk { /***************************************************/ /*! \class FMVoices \brief STK singing FM synthesis instrument. This class implements 3 carriers and a common modulator, also referred to as algorithm 6 of the TX81Z. \code Algorithm 6 is : /->1 -\ 4-|-->2 - +-> Out \->3 -/ \endcode Control Change Numbers: - Vowel = 2 - Spectral Tilt = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class FMVoices : public FM { public: //! Class constructor. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ FMVoices( void ); //! Class destructor. ~FMVoices( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). void controlChange( int number, StkFloat value ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: int currentVowel_; StkFloat tilt_[3]; StkFloat mods_[3]; }; inline StkFloat FMVoices :: tick( unsigned int ) { StkFloat temp, temp2; temp = gains_[3] * adsr_[3]->tick() * waves_[3]->tick(); temp2 = vibrato_.tick() * modDepth_ * 0.1; waves_[0]->setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[0]); waves_[1]->setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[1]); waves_[2]->setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[2]); waves_[3]->setFrequency(baseFrequency_ * (1.0 + temp2) * ratios_[3]); waves_[0]->addPhaseOffset(temp * mods_[0]); waves_[1]->addPhaseOffset(temp * mods_[1]); waves_[2]->addPhaseOffset(temp * mods_[2]); waves_[3]->addPhaseOffset( twozero_.lastOut() ); twozero_.tick( temp ); temp = gains_[0] * tilt_[0] * adsr_[0]->tick() * waves_[0]->tick(); temp += gains_[1] * tilt_[1] * adsr_[1]->tick() * waves_[1]->tick(); temp += gains_[2] * tilt_[2] * adsr_[2]->tick() * waves_[2]->tick(); lastFrame_[0] = temp * 0.33; return lastFrame_[0]; } inline StkFrames& FMVoices :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "FMVoices::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i= 1.0. The \e frequency value should be between zero and half the sample rate. */ void setResonance( StkFloat frequency, StkFloat radius ); //! Set both the current and target resonance parameters. void setStates( StkFloat frequency, StkFloat radius, StkFloat gain = 1.0 ); //! Set target resonance parameters. void setTargets( StkFloat frequency, StkFloat radius, StkFloat gain = 1.0 ); //! Set the sweep rate (between 0.0 - 1.0). /*! The formant parameters are varied in increments of the sweep rate between their current and target values. A sweep rate of 1.0 will produce an immediate change in resonance parameters from their current values to the target values. A sweep rate of 0.0 will produce no change in resonance parameters. */ void setSweepRate( StkFloat rate ); //! Set the sweep rate in terms of a time value in seconds. /*! This method adjusts the sweep rate based on a given time for the formant parameters to reach their target values. */ void setSweepTime( StkFloat time ); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Input one sample to the filter and return a reference to one output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the filter and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate ); bool dirty_; StkFloat frequency_; StkFloat radius_; StkFloat startFrequency_; StkFloat startRadius_; StkFloat startGain_; StkFloat targetFrequency_; StkFloat targetRadius_; StkFloat targetGain_; StkFloat deltaFrequency_; StkFloat deltaRadius_; StkFloat deltaGain_; StkFloat sweepState_; StkFloat sweepRate_; }; inline StkFloat FormSwep :: tick( StkFloat input ) { if ( dirty_ ) { sweepState_ += sweepRate_; if ( sweepState_ >= 1.0 ) { sweepState_ = 1.0; dirty_ = false; radius_ = targetRadius_; frequency_ = targetFrequency_; gain_ = targetGain_; } else { radius_ = startRadius_ + (deltaRadius_ * sweepState_); frequency_ = startFrequency_ + (deltaFrequency_ * sweepState_); gain_ = startGain_ + (deltaGain_ * sweepState_); } this->setResonance( frequency_, radius_ ); } inputs_[0] = gain_ * input; lastFrame_[0] = b_[0] * inputs_[0] + b_[1] * inputs_[1] + b_[2] * inputs_[2]; lastFrame_[0] -= a_[2] * outputs_[2] + a_[1] * outputs_[1]; inputs_[2] = inputs_[1]; inputs_[1] = inputs_[0]; outputs_[2] = outputs_[1]; outputs_[1] = lastFrame_[0]; return lastFrame_[0]; } inline StkFrames& FormSwep :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "FormSwep::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "FormSwep::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i 1 ) { oStream_ << "FreeVerb::lastOut(): channel argument must be less than 2!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif return lastFrame_[channel]; } inline StkFloat FreeVerb::tick( StkFloat inputL, StkFloat inputR, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel > 1 ) { oStream_ << "FreeVerb::tick(): channel argument must be less than 2!"; handleError(StkError::FUNCTION_ARGUMENT); } #endif StkFloat fInput = (inputL + inputR) * gain_; StkFloat outL = 0.0; StkFloat outR = 0.0; // Parallel LBCF filters for ( int i = 0; i < nCombs; i++ ) { // Left channel //StkFloat yn = fInput + (roomSize_ * FreeVerb::undenormalize(combLPL_[i].tick(FreeVerb::undenormalize(combDelayL_[i].nextOut())))); StkFloat yn = fInput + (roomSize_ * combLPL_[i].tick( combDelayL_[i].nextOut() ) ); combDelayL_[i].tick(yn); outL += yn; // Right channel //yn = fInput + (roomSize_ * FreeVerb::undenormalize(combLPR_[i].tick(FreeVerb::undenormalize(combDelayR_[i].nextOut())))); yn = fInput + (roomSize_ * combLPR_[i].tick( combDelayR_[i].nextOut() ) ); combDelayR_[i].tick(yn); outR += yn; } // Series allpass filters for ( int i = 0; i < nAllpasses; i++ ) { // Left channel //StkFloat vn_m = FreeVerb::undenormalize(allPassDelayL_[i].nextOut()); StkFloat vn_m = allPassDelayL_[i].nextOut(); StkFloat vn = outL + (g_ * vn_m); allPassDelayL_[i].tick(vn); // calculate output outL = -vn + (1.0 + g_)*vn_m; // Right channel //vn_m = FreeVerb::undenormalize(allPassDelayR_[i].nextOut()); vn_m = allPassDelayR_[i].nextOut(); vn = outR + (g_ * vn_m); allPassDelayR_[i].tick(vn); // calculate output outR = -vn + (1.0 + g_)*vn_m; } // Mix output lastFrame_[0] = outL*wet1_ + outR*wet2_ + inputL*dry_; lastFrame_[1] = outR*wet1_ + outL*wet2_ + inputR*dry_; /* // Hard limiter ... there's not much else we can do at this point if ( lastFrame_[0] >= 1.0 ) { lastFrame_[0] = 0.9999; } if ( lastFrame_[0] <= -1.0 ) { lastFrame_[0] = -0.9999; } if ( lastFrame_[1] >= 1.0 ) { lastFrame_[1] = 0.9999; } if ( lastFrame_[1] <= -1.0 ) { lastFrame_[1] = -0.9999; } */ return lastFrame_[channel]; } } #endif stk-4.5.0/include/Function.h0000644000076600007660000000154512327014024013521 0ustar gary#ifndef STK_FUNCTION_H #define STK_FUNCTION_H #include "Stk.h" namespace stk { /***************************************************/ /*! \class Function \brief STK abstract function parent class. This class provides common functionality for STK classes that implement tables or other types of input to output function mappings. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Function : public Stk { public: //! Class constructor. Function( void ) { lastFrame_.resize( 1, 1, 0.0 ); }; //! Return the last computed output sample. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Take one sample input and compute one sample of output. virtual StkFloat tick( StkFloat input ) = 0; protected: StkFrames lastFrame_; }; } // stk namespace #endif stk-4.5.0/include/Generator.h0000644000076600007660000000275112327014024013662 0ustar gary#ifndef STK_GENERATOR_H #define STK_GENERATOR_H #include "Stk.h" namespace stk { /***************************************************/ /*! \class Generator \brief STK abstract unit generator parent class. This class provides limited common functionality for STK unit generator sample-source subclasses. It is general enough to support both monophonic and polyphonic output classes. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Generator : public Stk { public: //! Class constructor. Generator( void ) { lastFrame_.resize( 1, 1, 0.0 ); }; //! Return the number of output channels for the class. unsigned int channelsOut( void ) const { return lastFrame_.channels(); }; //! Return an StkFrames reference to the last output sample frame. const StkFrames& lastFrame( void ) const { return lastFrame_; }; //! Fill the StkFrames object with computed sample frames, starting at the specified channel. /*! The \c channel argument plus the number of output channels must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0; protected: StkFrames lastFrame_; }; } // stk namespace #endif stk-4.5.0/include/Granulate.h0000644000076600007660000001557412327014024013665 0ustar gary#ifndef STK_GRANULATE_H #define STK_GRANULATE_H #include #include "Generator.h" #include "Envelope.h" #include "Noise.h" namespace stk { /***************************************************/ /*! \class Granulate \brief STK granular synthesis class. This class implements a real-time granular synthesis algorithm that operates on an input soundfile. Multi-channel files are supported. Various functions are provided to allow control over voice and grain parameters. The functionality of this class is based on the program MacPod by Chris Rolfe and Damian Keller, though there are likely to be a number of differences in the actual implementation. by Gary Scavone, 2005 - 2010. */ /***************************************************/ class Granulate: public Generator { public: //! Default constructor. Granulate( void ); //! Constructor taking input audio file and number of voices arguments. Granulate( unsigned int nVoices, std::string fileName, bool typeRaw = false ); //! Class destructor. ~Granulate( void ); //! Load a monophonic soundfile to be "granulated". /*! An StkError will be thrown if the file is not found, its format is unknown or unsupported, or the file has more than one channel. */ void openFile( std::string fileName, bool typeRaw = false ); //! Reset the file pointer and all existing grains to the file start. /*! Multiple grains are offset from one another in time by grain duration / nVoices. */ void reset( void ); //! Set the number of simultaneous grain "voices" to use. /*! Multiple grains are offset from one another in time by grain duration / nVoices. For this reason, it is best to set the grain parameters before calling this function (during initialization). */ void setVoices( unsigned int nVoices = 1 ); //! Set the stretch factor used for grain playback (1 - 1000). /*! Granular synthesis allows for time-stetching without affecting the original pitch of a sound. A stretch factor of 4 will produce a resulting sound of length 4 times the orignal sound. The default parameter of 1 produces no stretching. */ void setStretch( unsigned int stretchFactor = 1 ); //! Set global grain parameters used to determine individual grain settings. /*! Each grain is defined as having a length of \e duration milliseconds which must be greater than zero. For values of \e rampPercent (0 - 100) greater than zero, a linear envelope will be applied to each grain. If \e rampPercent = 100, the resultant grain "window" is triangular while \e rampPercent = 50 produces a trapezoidal window. In addition, each grain can have a time delay of length \e delay and a grain pointer increment of length \e offset, which can be negative, before the next ramp onset (in milliseconds). The \e offset parameter controls grain pointer jumps between enveloped grain segments, while the \e delay parameter causes grain calculations to pause between grains. The actual values calculated for each grain will be randomized by a factor set using the setRandomFactor() function. */ void setGrainParameters( unsigned int duration = 30, unsigned int rampPercent = 50, int offset = 0, unsigned int delay = 0 ); //! This factor is used when setting individual grain parameters (0.0 - 1.0). /*! This random factor is applied when all grain state durations are calculated. If set to 0.0, no randomness occurs. When randomness = 1.0, a grain segment of length \e duration will be randomly augmented by up to +- \e duration seconds (i.e., a 30 millisecond length will be augmented by an extra length of up to +30 or -30 milliseconds). */ void setRandomFactor( StkFloat randomness = 0.1 ); //! Return the specified channel value of the last computed frame. /*! The \c channel argument must be less than the number of output channels, which can be determined with the channelsOut() function (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. \sa lastFrame() */ StkFloat lastOut( unsigned int channel = 0 ); //! Compute one sample frame and return the specified \c channel value. StkFloat tick( unsigned int channel = 0 ); //! Fill the StkFrames object with computed sample frames, starting at the specified channel. /*! The \c channel argument plus the number of output channels must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); enum GrainState { GRAIN_STOPPED, GRAIN_FADEIN, GRAIN_SUSTAIN, GRAIN_FADEOUT }; protected: struct Grain { StkFloat eScaler; StkFloat eRate; unsigned long attackCount; unsigned long sustainCount; unsigned long decayCount; unsigned long delayCount; unsigned long counter; //unsigned long pointer; StkFloat pointer; unsigned long startPointer; unsigned int repeats; GrainState state; // Default constructor. Grain() :eScaler(0.0), eRate(0.0), attackCount(0), sustainCount(0), decayCount(0), delayCount(0), counter(0), pointer(0), startPointer(0), repeats(0), state(GRAIN_STOPPED) {} }; void calculateGrain( Granulate::Grain& grain ); StkFrames data_; std::vector grains_; Noise noise; //long gPointer_; StkFloat gPointer_; // Global grain parameters. unsigned int gDuration_; unsigned int gRampPercent_; unsigned int gDelay_; unsigned int gStretch_; unsigned int stretchCounter_; int gOffset_; StkFloat gRandomFactor_; StkFloat gain_; }; inline StkFloat Granulate :: lastOut( unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= lastFrame_.channels() ) { oStream_ << "Granulate::lastOut(): channel argument is invalid!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif return lastFrame_[channel]; } inline StkFrames& Granulate :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Granulate::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; for ( unsigned int i=0; i strings_; std::vector< int > stringState_; // 0 = off, 1 = decaying, 2 = on std::vector< unsigned int > decayCounter_; std::vector< unsigned int > filePointer_; std::vector< StkFloat > pluckGains_; OnePole pickFilter_; OnePole couplingFilter_; StkFloat couplingGain_; StkFrames excitation_; StkFrames lastFrame_; }; inline StkFloat Guitar :: tick( StkFloat input ) { StkFloat temp, output = 0.0; lastFrame_[0] /= strings_.size(); // evenly spread coupling across strings for ( unsigned int i=0; i 0.2 ) temp += pluckGains_[i] * excitation_[filePointer_[i]++]; temp += couplingGain_ * couplingFilter_.tick( lastFrame_[0] ); // bridge coupling output += strings_[i].tick( temp ); // Check if string energy has decayed sufficiently to turn it off. if ( stringState_[i] == 1 ) { if ( fabs( strings_[i].lastOut() ) < 0.001 ) decayCounter_[i]++; else decayCounter_[i] = 0; if ( decayCounter_[i] > (unsigned int) floor( 0.1 * Stk::sampleRate() ) ) { stringState_[i] = 0; decayCounter_[i] = 0; } } } } return lastFrame_[0] = output; } inline StkFrames& Guitar :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "Guitar::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "Guitar::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i2-- + -->1-->Out \endcode Control Change Numbers: - Total Modulator Index = 2 - Modulator Crossfade = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class HevyMetl : public FM { public: //! Class constructor. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ HevyMetl( void ); //! Class destructor. ~HevyMetl( void ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: }; inline StkFloat HevyMetl :: tick( unsigned int ) { StkFloat temp; temp = vibrato_.tick() * modDepth_ * 0.2; waves_[0]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[0]); waves_[1]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[1]); waves_[2]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[2]); waves_[3]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[3]); temp = gains_[2] * adsr_[2]->tick() * waves_[2]->tick(); waves_[1]->addPhaseOffset( temp ); waves_[3]->addPhaseOffset( twozero_.lastOut() ); temp = (1.0 - (control2_ * 0.5)) * gains_[3] * adsr_[3]->tick() * waves_[3]->tick(); twozero_.tick(temp); temp += control2_ * 0.5 * gains_[1] * adsr_[1]->tick() * waves_[1]->tick(); temp = temp * control1_; waves_[0]->addPhaseOffset( temp ); temp = gains_[0] * adsr_[0]->tick() * waves_[0]->tick(); lastFrame_[0] = temp * 0.5; return lastFrame_[0]; } inline StkFrames& HevyMetl :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "HevyMetl::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i &bCoefficients, std::vector &aCoefficients ); //! Class destructor. ~Iir( void ); //! Set filter coefficients. /*! An StkError can be thrown if either of the coefficient vector sizes is zero, or if the a[0] coefficient is equal to zero. If a[0] is not equal to 1, the filter coeffcients are normalized by a[0]. The internal state of the filter is not cleared unless the \e clearState flag is \c true. */ void setCoefficients( std::vector &bCoefficients, std::vector &aCoefficients, bool clearState = false ); //! Set numerator coefficients. /*! An StkError can be thrown if coefficient vector is empty. Any previously set denominator coefficients are left unaffected. Note that the default constructor sets the single denominator coefficient a[0] to 1.0. The internal state of the filter is not cleared unless the \e clearState flag is \c true. */ void setNumerator( std::vector &bCoefficients, bool clearState = false ); //! Set denominator coefficients. /*! An StkError can be thrown if the coefficient vector is empty or if the a[0] coefficient is equal to zero. Previously set numerator coefficients are unaffected unless a[0] is not equal to 1, in which case all coeffcients are normalized by a[0]. Note that the default constructor sets the single numerator coefficient b[0] to 1.0. The internal state of the filter is not cleared unless the \e clearState flag is \c true. */ void setDenominator( std::vector &aCoefficients, bool clearState = false ); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Input one sample to the filter and return one output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the filter and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: }; inline StkFloat Iir :: tick( StkFloat input ) { size_t i; outputs_[0] = 0.0; inputs_[0] = gain_ * input; for ( i=b_.size()-1; i>0; i-- ) { outputs_[0] += b_[i] * inputs_[i]; inputs_[i] = inputs_[i-1]; } outputs_[0] += b_[0] * inputs_[0]; for ( i=a_.size()-1; i>0; i-- ) { outputs_[0] += -a_[i] * outputs_[i]; outputs_[i] = outputs_[i-1]; } lastFrame_[0] = outputs_[0]; return lastFrame_[0]; } inline StkFrames& Iir :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "Iir::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; size_t i; unsigned int hop = frames.channels(); for ( unsigned int j=0; j0; i-- ) { outputs_[0] += b_[i] * inputs_[i]; inputs_[i] = inputs_[i-1]; } outputs_[0] += b_[0] * inputs_[0]; for ( i=a_.size()-1; i>0; i-- ) { outputs_[0] += -a_[i] * outputs_[i]; outputs_[i] = outputs_[i-1]; } *samples = outputs_[0]; } lastFrame_[0] = *(samples-hop); return frames; } inline StkFrames& Iir :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel ) { #if defined(_STK_DEBUG_) if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "Iir::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; size_t i; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int j=0; j0; i-- ) { outputs_[0] += b_[i] * inputs_[i]; inputs_[i] = inputs_[i-1]; } outputs_[0] += b_[0] * inputs_[0]; for ( i=a_.size()-1; i>0; i-- ) { outputs_[0] += -a_[i] * outputs_[i]; outputs_[i] = outputs_[i-1]; } *oSamples = outputs_[0]; } lastFrame_[0] = *(oSamples-oHop); return iFrames; } } // stk namespace #endif stk-4.5.0/include/InetWvIn.h0000644000076600007660000001261712327014024013441 0ustar gary#ifndef STK_INETWVIN_H #define STK_INETWVIN_H #include "WvIn.h" #include "TcpServer.h" #include "UdpSocket.h" #include "Thread.h" #include "Mutex.h" namespace stk { /***************************************************/ /*! \class InetWvIn \brief STK internet streaming input class. This Wvin subclass reads streamed audio data over a network via a TCP or UDP socket connection. The data is assumed in big-endian, or network, byte order. Only a single socket connection is supported. InetWvIn supports multi-channel data. It is important to distinguish the tick() method that computes a single frame (and returns only the specified sample of a multi-channel frame) from the overloaded one that takes an StkFrames object for multi-channel and/or multi-frame data. This class implements a socket server. When using the TCP protocol, the server "listens" for a single remote connection within the InetWvIn::start() function. For the UDP protocol, no attempt is made to verify packet delivery or order. The default data type for the incoming stream is signed 16-bit integers, though any of the defined StkFormats are permissible. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ typedef struct { bool finished; void *object; } ThreadInfo; class InetWvIn : public WvIn { public: //! Default constructor. /*! An StkError will be thrown if an error occurs while initializing the input thread. */ InetWvIn( unsigned long bufferFrames = 1024, unsigned int nBuffers = 8 ); //! Class destructor. ~InetWvIn(); //! Wait for a (new) socket connection with specified protocol, port, data channels and format. /*! For the UDP protocol, this function will create a socket instance and return. For the TCP protocol, this function will block until a connection is established. An StkError will be thrown if a socket error occurs or an invalid function argument is provided. */ void listen( int port = 2006, unsigned int nChannels = 1, Stk::StkFormat format = STK_SINT16, Socket::ProtocolType protocol = Socket::PROTO_TCP ); //! Returns true is an input connection exists or input data remains in the queue. /*! This method will not return false after an input connection has been closed until all buffered input data has been read out. */ bool isConnected( void ); //! Return the specified channel value of the last computed frame. /*! For multi-channel files, use the lastFrame() function to get all values from the last computed frame. If no connection exists, the returned value is 0.0. The \c channel argument must be less than the number of channels in the data stream (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFloat lastOut( unsigned int channel = 0 ); //! Compute a sample frame and return the specified \c channel value. /*! For multi-channel files, use the lastFrame() function to get all values from the computed frame. If no connection exists, the returned value is 0.0 (and a warning will be issued if _STK_DEBUG_ is defined during compilation). The \c channel argument must be less than the number of channels in the data stream (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFloat tick( unsigned int channel = 0 ); //! Fill the StkFrames argument with computed frames and return the same reference. /*! The number of channels in the StkFrames argument must equal the number of channels specified in the listen() function. However, this is only checked if _STK_DEBUG_ is defined during compilation, in which case an incompatibility will trigger an StkError exception. If no connection exists, the function does nothing (a warning will be issued if _STK_DEBUG_ is defined during compilation). */ StkFrames& tick( StkFrames& frames ); // Called by the thread routine to receive data via the socket connection // and fill the socket buffer. This is not intended for general use but // must be public for access from the thread. void receive( void ); protected: // Read buffered socket data into the data buffer ... will block if none available. int readData( void ); Socket *soket_; Thread thread_; Mutex mutex_; char *buffer_; unsigned long bufferFrames_; unsigned long bufferBytes_; unsigned long bytesFilled_; unsigned int nBuffers_; unsigned long writePoint_; unsigned long readPoint_; long bufferCounter_; int dataBytes_; bool connected_; int fd_; ThreadInfo threadInfo_; Stk::StkFormat dataType_; }; inline StkFloat InetWvIn :: lastOut( unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= data_.channels() ) { oStream_ << "InetWvIn::lastOut(): channel argument and data stream are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif // If no connection and we've output all samples in the queue, return. if ( !connected_ && bytesFilled_ == 0 && bufferCounter_ == 0 ) return 0.0; return lastFrame_[channel]; } } // stk namespace #endif stk-4.5.0/include/InetWvOut.h0000644000076600007660000000651412327014024013641 0ustar gary#ifndef STK_INETWVOUT_H #define STK_INETWVOUT_H #include "WvOut.h" #include "Socket.h" namespace stk { /***************************************************/ /*! \class InetWvOut \brief STK internet streaming output class. This WvOut subclass can stream data over a network via a TCP or UDP socket connection. The data is converted to big-endian byte order, if necessary, before being transmitted. InetWvOut supports multi-channel data. It is important to distinguish the tick() method that outputs a single sample to all channels in a sample frame from the overloaded one that takes a reference to an StkFrames object for multi-channel and/or multi-frame data. This class connects to a socket server, the port and IP address of which must be specified as constructor arguments. The default data type is signed 16-bit integers but any of the defined StkFormats are permissible. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class InetWvOut : public WvOut { public: //! Default constructor ... the socket is not instantiated. InetWvOut( unsigned long packetFrames = 1024 ); //! Overloaded constructor which opens a network connection during instantiation. /*! An StkError is thrown if a socket error occurs or an invalid argument is specified. */ InetWvOut( int port, Socket::ProtocolType protocol = Socket::PROTO_TCP, std::string hostname = "localhost", unsigned int nChannels = 1, Stk::StkFormat format = STK_SINT16, unsigned long packetFrames = 1024 ); //! Class destructor. ~InetWvOut(); //! Connect to the specified host and port and prepare to stream \e nChannels of data in the given data format. /*! An StkError is thrown if a socket error occurs or an invalid argument is specified. */ void connect( int port, Socket::ProtocolType protocol = Socket::PROTO_TCP, std::string hostname = "localhost", unsigned int nChannels = 1, Stk::StkFormat format = STK_SINT16 ); //! If a connection is open, write out remaining samples in the queue and then disconnect. void disconnect( void ); //! Output a single sample to all channels in a sample frame. /*! An StkError is thrown if an output error occurs. If a socket connection does not exist, the function does nothing (a warning will be issued if _STK_DEBUG_ is defined during compilation). */ void tick( const StkFloat sample ); //! Output the StkFrames data. /*! An StkError will be thrown if an output error occurs. An StkError will also be thrown if _STK_DEBUG_ is defined during compilation and there is an incompatability between the number of channels in the FileWvOut object and that in the StkFrames object. If a socket connection does not exist, the function does nothing (a warning will be issued if _STK_DEBUG_ is defined during compilation). */ void tick( const StkFrames& frames ); protected: void incrementFrame( void ); // Write a buffer of length frames via the socket connection. void writeData( unsigned long frames ); char *buffer_; Socket *soket_; unsigned long bufferFrames_; unsigned long bufferBytes_; unsigned long bufferIndex_; unsigned long iData_; unsigned int dataBytes_; Stk::StkFormat dataType_; }; } // stk namespace #endif stk-4.5.0/include/Instrmnt.h0000644000076600007660000000646512327014024013560 0ustar gary#ifndef STK_INSTRMNT_H #define STK_INSTRMNT_H #include "Stk.h" namespace stk { /***************************************************/ /*! \class Instrmnt \brief STK instrument abstract base class. This class provides a common interface for all STK instruments. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Instrmnt : public Stk { public: //! Class constructor. Instrmnt( void ) { lastFrame_.resize( 1, 1, 0.0 ); }; //! Reset and clear all internal state (for subclasses). /*! Not all subclasses implement a clear() function. */ virtual void clear( void ) {}; //! Start a note with the given frequency and amplitude. virtual void noteOn( StkFloat frequency, StkFloat amplitude ) = 0; //! Stop a note with the given amplitude (speed of decay). virtual void noteOff( StkFloat amplitude ) = 0; //! Set instrument parameters for a particular frequency. virtual void setFrequency( StkFloat frequency ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). virtual void controlChange(int number, StkFloat value); //! Return the number of output channels for the class. unsigned int channelsOut( void ) const { return lastFrame_.channels(); }; //! Return an StkFrames reference to the last output sample frame. const StkFrames& lastFrame( void ) const { return lastFrame_; }; //! Return the specified channel value of the last computed frame. /*! The \c channel argument must be less than the number of output channels, which can be determined with the channelsOut() function (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. \sa lastFrame() */ StkFloat lastOut( unsigned int channel = 0 ); //! Compute one sample frame and return the specified \c channel value. /*! For monophonic instruments, the \c channel argument is ignored. */ virtual StkFloat tick( unsigned int channel = 0 ) = 0; //! Fill the StkFrames object with computed sample frames, starting at the specified channel. /*! The \c channel argument plus the number of output channels must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0; protected: StkFrames lastFrame_; }; inline void Instrmnt :: setFrequency( StkFloat frequency ) { oStream_ << "Instrmnt::setFrequency: virtual setFrequency function call!"; handleError( StkError::WARNING ); } inline StkFloat Instrmnt :: lastOut( unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= lastFrame_.channels() ) { oStream_ << "Instrmnt::lastOut(): channel argument is invalid!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif return lastFrame_[channel]; } inline void Instrmnt :: controlChange( int number, StkFloat value ) { oStream_ << "Instrmnt::controlChange: virtual function call!"; handleError( StkError::WARNING ); } } // stk namespace #endif stk-4.5.0/include/JCRev.h0000644000076600007660000001313412327014024012702 0ustar gary#ifndef STK_JCREV_H #define STK_JCREV_H #include "Effect.h" #include "Delay.h" #include "OnePole.h" namespace stk { /***************************************************/ /*! \class JCRev \brief John Chowning's reverberator class. This class takes a monophonic input signal and produces a stereo output signal. It is derived from the CLM JCRev function, which is based on the use of networks of simple allpass and comb delay filters. This class implements three series allpass units, followed by four parallel comb filters, and two decorrelation delay lines in parallel at the output. Although not in the original JC reverberator, one-pole lowpass filters have been added inside the feedback comb filters. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class JCRev : public Effect { public: //! Class constructor taking a T60 decay time argument (one second default value). JCRev( StkFloat T60 = 1.0 ); //! Reset and clear all internal state. void clear( void ); //! Set the reverberation T60 decay time. void setT60( StkFloat T60 ); //! Return the specified channel value of the last computed stereo frame. /*! Use the lastFrame() function to get both values of the last computed stereo frame. The \c channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFloat lastOut( unsigned int channel = 0 ); //! Input one sample to the effect and return the specified \c channel value of the computed stereo frame. /*! Use the lastFrame() function to get both values of the computed stereo output frame. The \c channel argument must be 0 or 1 (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFloat tick( StkFloat input, unsigned int channel = 0 ); //! Take a channel of the StkFrames object as inputs to the effect and replace with stereo outputs. /*! The StkFrames argument reference is returned. The stereo outputs are written to the StkFrames argument starting at the specified \c channel. Therefore, the \c channel argument must be less than ( channels() - 1 ) of the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the effect and write stereo outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. The \c iChannel argument must be less than the number of channels in the \c iFrames argument (the first channel is specified by 0). The \c oChannel argument must be less than ( channels() - 1 ) of the \c oFrames argument. However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: Delay allpassDelays_[3]; Delay combDelays_[4]; OnePole combFilters_[4]; Delay outLeftDelay_; Delay outRightDelay_; StkFloat allpassCoefficient_; StkFloat combCoefficient_[4]; }; inline StkFloat JCRev :: lastOut( unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel > 1 ) { oStream_ << "JCRev::lastOut(): channel argument must be less than 2!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif return lastFrame_[channel]; } inline StkFloat JCRev :: tick( StkFloat input, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel > 1 ) { oStream_ << "JCRev::tick(): channel argument must be less than 2!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat temp, temp0, temp1, temp2, temp3, temp4, temp5, temp6; StkFloat filtout; temp = allpassDelays_[0].lastOut(); temp0 = allpassCoefficient_ * temp; temp0 += input; allpassDelays_[0].tick(temp0); temp0 = -(allpassCoefficient_ * temp0) + temp; temp = allpassDelays_[1].lastOut(); temp1 = allpassCoefficient_ * temp; temp1 += temp0; allpassDelays_[1].tick(temp1); temp1 = -(allpassCoefficient_ * temp1) + temp; temp = allpassDelays_[2].lastOut(); temp2 = allpassCoefficient_ * temp; temp2 += temp1; allpassDelays_[2].tick(temp2); temp2 = -(allpassCoefficient_ * temp2) + temp; temp3 = temp2 + ( combFilters_[0].tick( combCoefficient_[0] * combDelays_[0].lastOut() ) ); temp4 = temp2 + ( combFilters_[1].tick( combCoefficient_[1] * combDelays_[1].lastOut() ) ); temp5 = temp2 + ( combFilters_[2].tick( combCoefficient_[2] * combDelays_[2].lastOut() ) ); temp6 = temp2 + ( combFilters_[3].tick( combCoefficient_[3] * combDelays_[3].lastOut() ) ); combDelays_[0].tick(temp3); combDelays_[1].tick(temp4); combDelays_[2].tick(temp5); combDelays_[3].tick(temp6); filtout = temp3 + temp4 + temp5 + temp6; lastFrame_[0] = effectMix_ * (outLeftDelay_.tick(filtout)); lastFrame_[1] = effectMix_ * (outRightDelay_.tick(filtout)); temp = (1.0 - effectMix_) * input; lastFrame_[0] += temp; lastFrame_[1] += temp; return 0.7 * lastFrame_[channel]; } } // stk namespace #endif stk-4.5.0/include/JetTable.h0000644000076600007660000000721712327014024013430 0ustar gary#ifndef STK_JETTABL_H #define STK_JETTABL_H #include "Function.h" namespace stk { /***************************************************/ /*! \class JetTable \brief STK jet table class. This class implements a flue jet non-linear function, computed by a polynomial calculation. Contrary to the name, this is not a "table". Consult Fletcher and Rossing, Karjalainen, Cook, and others for more information. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class JetTable : public Function { public: //! Take one sample input and map to one sample of output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the table and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the table and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); }; inline StkFloat JetTable :: tick( StkFloat input ) { // Perform "table lookup" using a polynomial // calculation (x^3 - x), which approximates // the jet sigmoid behavior. lastFrame_[0] = input * (input * input - 1.0); // Saturate at +/- 1.0. if ( lastFrame_[0] > 1.0 ) lastFrame_[0] = 1.0; if ( lastFrame_[0] < -1.0 ) lastFrame_[0] = -1.0; return lastFrame_[0]; } inline StkFrames& JetTable :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "JetTable::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i 1.0) *samples = 1.0; if ( *samples < -1.0) *samples = -1.0; } lastFrame_[0] = *(samples-hop); return frames; } inline StkFrames& JetTable :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel ) { #if defined(_STK_DEBUG_) if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "JetTable::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i 1.0) *oSamples = 1.0; if ( *oSamples < -1.0) *oSamples = -1.0; } lastFrame_[0] = *(oSamples-oHop); return iFrames; } } // stk namespace #endif stk-4.5.0/include/LentPitShift.h0000644000076600007660000002124012327014024014303 0ustar gary#ifndef STK_LENTPITSHIFT_H #define STK_LENTPITSHIFT_H #include "Effect.h" #include "Delay.h" namespace stk { /***************************************************/ /*! \class LentPitShift \brief Pitch shifter effect class based on the Lent algorithm. This class implements a pitch shifter using pitch tracking and sample windowing and shifting. by Francois Germain, 2009. */ /***************************************************/ class LentPitShift : public Effect { public: //! Class constructor. LentPitShift( StkFloat periodRatio = 1.0, int tMax = RT_BUFFER_SIZE ); ~LentPitShift( void ) { delete window; delete dt; delete dpt; delete cumDt; } //! Reset and clear all internal state. void clear( void ); //! Set the pitch shift factor (1.0 produces no shift). void setShift( StkFloat shift ); //! Input one sample to the filter and return one output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the filter and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: //! Apply the effect on the input samples and store it. /*! The samples stored in the input frame vector are processed and the delayed result are stored in the output frame vector. */ void process( ); // Frame storage vectors for process function StkFrames inputFrames; StkFrames outputFrames; int ptrFrames; // writing pointer // Input delay line Delay inputLine_; int inputPtr; // Output delay line Delay outputLine_; double outputPtr; // Pitch tracker variables unsigned long tMax_; // Maximal period measurable by the pitch tracker. // It is also the size of the window used by the pitch tracker and // the size of the frames that can be computed by the tick function StkFloat threshold_; // Threshold of detection for the pitch tracker unsigned long lastPeriod_; // Result of the last pitch tracking loop StkFloat* dt; // Array containing the euclidian distance coefficients StkFloat* cumDt; // Array containing the cumulative sum of the coefficients in dt StkFloat* dpt; // Array containing the pitch tracking function coefficients // Pitch shifter variables StkFloat env[2]; // Coefficients for the linear interpolation when modifying the output samples StkFloat* window; // Hamming window used for the input portion extraction double periodRatio_; // Ratio of modification of the signal period StkFrames zeroFrame; // Frame of tMax_ zero samples // Coefficient delay line that could be used for a dynamic calculation of the pitch //Delay* coeffLine_; }; inline void LentPitShift::process() { StkFloat x_t; // input coefficient StkFloat x_t_T; // previous input coefficient at T samples StkFloat coeff; // new coefficient for the difference function unsigned long alternativePitch = tMax_; // Global minimum storage lastPeriod_ = tMax_+1; // Storage of the lowest local minimum under the threshold // Loop variables unsigned long delay_; unsigned int n; // Initialization of the dt coefficients. Since the // frames are of tMax_ length, there is no overlapping // between the successive windows where pitch tracking // is performed. for ( delay_=1; delay_<=tMax_; delay_++ ) dt[delay_] = 0.; // Calculation of the dt coefficients and update of the input delay line. for ( n=0; n 0 ) { // Check if the minimum is under the threshold if ( dpt[delay_-1] < threshold_ ){ lastPeriod_ = delay_-1; // If a minimum is found, we can stop the loop break; } else if ( dpt[alternativePitch] > dpt[delay_-1] ) // Otherwise we store it if it is the current global minimum alternativePitch = delay_-1; } } // Test for the last period length. if ( dpt[delay_]-dpt[delay_-1] < 0 ) { if ( dpt[delay_] < threshold_ ) lastPeriod_ = delay_; else if ( dpt[alternativePitch] > dpt[delay_] ) alternativePitch = delay_; } if ( lastPeriod_ == tMax_+1 ) // No period has been under the threshold so we used the global minimum lastPeriod_ = alternativePitch; // We put the new zero output coefficients in the output delay line and // we get the previous calculated coefficients outputLine_.tick( zeroFrame, outputFrames ); // Initialization of the Hamming window used in the algorithm for ( int n=-(int)lastPeriod_; n<(int)lastPeriod_; n++ ) window[n+lastPeriod_] = (1 + cos(PI*n/lastPeriod_)) / 2 ; long M; // Index of reading in the input delay line long N; // Index of writing in the output delay line double sample; // Temporary storage for the new coefficient // We loop for all the frames of length lastPeriod_ presents between inputPtr and tMax_ for ( ; inputPtr<(int)(tMax_-lastPeriod_); inputPtr+=lastPeriod_ ) { // Test for the decision of compression/expansion while ( outputPtr < inputPtr ) { // Coefficients for the linear interpolation env[1] = fmod( outputPtr + tMax_, 1.0 ); env[0] = 1.0 - env[1]; M = tMax_ - inputPtr + lastPeriod_ - 1; // New reading pointer N = 2*tMax_ - (unsigned long)floor(outputPtr + tMax_) + lastPeriod_ - 1; // New writing pointer for ( unsigned int j=0; j<2*lastPeriod_; j++,M--,N-- ) { sample = inputLine_.tapOut(M) * window[j] / 2.; // Linear interpolation outputLine_.addTo(env[0] * sample, N); outputLine_.addTo(env[1] * sample, N-1); } outputPtr = outputPtr + lastPeriod_ * periodRatio_; // new output pointer } } // Shifting of the pointers waiting for the new frame of length tMax_. outputPtr -= tMax_; inputPtr -= tMax_; } inline StkFloat LentPitShift :: tick( StkFloat input ) { StkFloat sample; inputFrames[ptrFrames] = input; sample = outputFrames[ptrFrames++]; // Check for end condition if ( ptrFrames == (int) inputFrames.size() ){ ptrFrames = 0; process( ); } return sample; } inline StkFrames& LentPitShift :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "LentPitShift::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "LentPitShift::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i frames.channels() - nChannels ) { oStream_ << "Mandolin::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i frames.channels() - nChannels ) { oStream_ << "Mesh2D::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i #if defined(__STK_REALTIME__) #include "Mutex.h" #include "Thread.h" #include "TcpServer.h" #include "RtMidi.h" #endif // __STK_REALTIME__ namespace stk { /***************************************************/ /*! \class Messager \brief STK input control message parser. This class reads and parses control messages from a variety of sources, such as a scorefile, MIDI port, socket connection, or stdin. MIDI messages are retrieved using the RtMidi class. All other input sources (scorefile, socket, or stdin) are assumed to provide SKINI formatted messages. This class can be compiled with generic, non-realtime support, in which case only scorefile reading is possible. The various \e realtime message acquisition mechanisms (from MIDI, socket, or stdin) take place asynchronously, filling the message queue. A call to popMessage() will pop the next available control message from the queue and return it via the referenced Message structure. When a \e non-realtime scorefile is set, it is not possible to start reading realtime input messages (from MIDI, socket, or stdin). Likewise, it is not possible to read from a scorefile when a realtime input mechanism is running. When MIDI input is started, input is also automatically read from stdin. This allows for program termination via the terminal window. An __SK_Exit_ message is pushed onto the stack whenever an "exit" or "Exit" message is received from stdin or when all socket connections close and no stdin thread is running. This class is primarily for use in STK example programs but it is generic enough to work in many other contexts. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ const int DEFAULT_QUEUE_LIMIT = 200; class Messager : public Stk { public: // This structure is used to share data among the various realtime // messager threads. It must be public. struct MessagerData { Skini skini; std::queue queue; unsigned int queueLimit; int sources; #if defined(__STK_REALTIME__) Mutex mutex; RtMidiIn *midi; TcpServer *socket; std::vector fd; fd_set mask; #endif // Default constructor. MessagerData() :queueLimit(0), sources(0) {} }; //! Default constructor. Messager(); //! Class destructor. ~Messager(); //! Pop the next message from the queue and write it to the referenced message structure. /*! Invalid messages (or an empty queue) are indicated by type values of zero, in which case all other message structure values are undefined. The user MUST verify the returned message type is valid before reading other message values. */ void popMessage( Skini::Message& message ); //! Push the referenced message onto the message stack. void pushMessage( Skini::Message& message ); //! Specify a SKINI formatted scorefile from which messages should be read. /*! A return value of \c true indicates the call was successful. A return value of \c false can occur if the file is not found, cannot be opened, another file is currently still open, or if a realtime input mechanism is running. Scorefile input is considered to be a non-realtime control mechanism that cannot run concurrently with realtime input. */ bool setScoreFile( const char* filename ); #if defined(__STK_REALTIME__) //! Initiate the "realtime" retreival from stdin of control messages into the queue. /*! This function initiates a thread for asynchronous retrieval of SKINI formatted messages from stdin. A return value of \c true indicates the call was successful. A return value of \c false can occur if a scorefile is being read, a stdin thread is already running, or a thread error occurs during startup. Stdin input is considered to be a realtime control mechanism that cannot run concurrently with non-realtime scorefile input. */ bool startStdInput(); //! Start a socket server, accept connections, and read "realtime" control messages into the message queue. /*! This function creates a socket server on the optional port (default = 2001) and starts a thread for asynchronous retrieval of SKINI formatted messages from socket connections. A return value of \c true indicates the call was successful. A return value of \c false can occur if a scorefile is being read, a socket thread is already running, or an error occurs during the socket server or thread initialization stages. Socket input is considered to be a realtime control mechanism that cannot run concurrently with non-realtime scorefile input. */ bool startSocketInput( int port=2001 ); //! Start MIDI input, with optional device and port identifiers. /*! This function creates an RtMidiIn instance for MIDI input. The RtMidiIn class invokes a local callback function to read incoming messages into the queue. If \c port = -1, RtMidiIn will open a virtual port to which other software applications can connect (OS X and Linux only). A return value of \c true indicates the call was successful. A return value of \c false can occur if a scorefile is being read, MIDI input is already running, or an error occurs during RtMidiIn construction. Midi input is considered to be a realtime control mechanism that cannot run concurrently with non-realtime scorefile input. */ bool startMidiInput( int port=0 ); #endif protected: MessagerData data_; #if defined(__STK_REALTIME__) Thread stdinThread_; Thread socketThread_; #endif }; } // stk namespace #endif stk-4.5.0/include/MidiFileIn.h0000644000076600007660000001215312327014024013702 0ustar gary#ifndef STK_MIDIFILEIN_H #define STK_MIDIFILEIN_H #include "Stk.h" #include #include #include #include namespace stk { /**********************************************************************/ /*! \class MidiFileIn \brief A standard MIDI file reading/parsing class. This class can be used to read events from a standard MIDI file. Event bytes are copied to a C++ vector and must be subsequently interpreted by the user. The function getNextMidiEvent() skips meta and sysex events, returning only MIDI channel messages. Event delta-times are returned in the form of "ticks" and a function is provided to determine the current "seconds per tick". Tempo changes are internally tracked by the class and reflected in the values returned by the function getTickSeconds(). by Gary P. Scavone, 2003 - 2010. */ /**********************************************************************/ class MidiFileIn : public Stk { public: //! Default constructor. /*! If an error occurs while opening or parsing the file header, an StkError exception will be thrown. */ MidiFileIn( std::string fileName ); //! Class destructor. ~MidiFileIn(); //! Return the MIDI file format (0, 1, or 2). int getFileFormat() const { return format_; }; //! Return the number of tracks in the MIDI file. unsigned int getNumberOfTracks() const { return nTracks_; }; //! Return the MIDI file division value from the file header. /*! Note that this value must be "parsed" in accordance with the MIDI File Specification. In particular, if the MSB is set, the file uses time-code representations for delta-time values. */ int getDivision() const { return division_; }; //! Move the specified track event reader to the beginning of its track. /*! The relevant track tempo value is reset as well. If an invalid track number is specified, an StkError exception will be thrown. */ void rewindTrack( unsigned int track = 0 ); //! Get the current value, in seconds, of delta-time ticks for the specified track. /*! This value can change as events are read (via "Set Tempo" Meta-Events). Therefore, one should call this function after every call to getNextEvent() or getNextMidiEvent(). If an invalid track number is specified, an StkError exception will be thrown. */ double getTickSeconds( unsigned int track = 0 ); //! Fill the user-provided vector with the next event in the specified track and return the event delta-time in ticks. /*! MIDI File events consist of a delta time and a sequence of event bytes. This function returns the delta-time value and writes the subsequent event bytes directly to the event vector. The user must parse the event bytes in accordance with the MIDI File Specification. All returned MIDI channel events are complete ... a status byte is provided even when running status is used in the file. If the track has reached its end, no bytes will be written and the event vector size will be zero. If an invalid track number is specified or an error occurs while reading the file, an StkError exception will be thrown. */ unsigned long getNextEvent( std::vector *event, unsigned int track = 0 ); //! Fill the user-provided vector with the next MIDI channel event in the specified track and return the event delta time in ticks. /*! All returned MIDI events are complete ... a status byte is provided even when running status is used in the file. Meta and sysex events in the track are skipped though "Set Tempo" events are properly parsed for use by the getTickSeconds() function. If the track has reached its end, no bytes will be written and the event vector size will be zero. If an invalid track number is specified or an error occurs while reading the file, an StkError exception will be thrown. */ unsigned long getNextMidiEvent( std::vector *midiEvent, unsigned int track = 0 ); protected: // This protected class function is used for reading variable-length // MIDI file values. It is assumed that this function is called with // the file read pointer positioned at the start of a // variable-length value. The function returns true if the value is // successfully parsed. Otherwise, it returns false. bool readVariableLength( unsigned long *value ); std::ifstream file_; unsigned int nTracks_; int format_; int division_; bool usingTimeCode_; std::vector tickSeconds_; std::vector trackPointers_; std::vector trackOffsets_; std::vector trackLengths_; std::vector trackStatus_; // This structure and the following variables are used to save and // keep track of a format 1 tempo map (and the initial tickSeconds // parameter for formats 0 and 2). struct TempoChange { unsigned long count; double tickSeconds; }; std::vector tempoEvents_; std::vector trackCounters_; std::vector trackTempoIndex_; }; } // stk namespace #endif stk-4.5.0/include/Modal.h0000644000076600007660000001031512327014024012763 0ustar gary#ifndef STK_MODAL_H #define STK_MODAL_H #include "Instrmnt.h" #include "Envelope.h" #include "FileLoop.h" #include "SineWave.h" #include "BiQuad.h" #include "OnePole.h" namespace stk { /***************************************************/ /*! \class Modal \brief STK resonance model abstract base class. This class contains an excitation wavetable, an envelope, an oscillator, and N resonances (non-sweeping BiQuad filters), where N is set during instantiation. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Modal : public Instrmnt { public: //! Class constructor, taking the desired number of modes to create. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ Modal( unsigned int modes = 4 ); //! Class destructor. virtual ~Modal( void ); //! Reset and clear all internal state. void clear( void ); //! Set instrument parameters for a particular frequency. virtual void setFrequency( StkFloat frequency ); //! Set the ratio and radius for a specified mode filter. void setRatioAndRadius( unsigned int modeIndex, StkFloat ratio, StkFloat radius ); //! Set the master gain. void setMasterGain( StkFloat aGain ) { masterGain_ = aGain; }; //! Set the direct gain. void setDirectGain( StkFloat aGain ) { directGain_ = aGain; }; //! Set the gain for a specified mode filter. void setModeGain( unsigned int modeIndex, StkFloat gain ); //! Initiate a strike with the given amplitude (0.0 - 1.0). virtual void strike( StkFloat amplitude ); //! Damp modes with a given decay factor (0.0 - 1.0). void damp( StkFloat amplitude ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). virtual void controlChange( int number, StkFloat value ) = 0; //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: Envelope envelope_; FileWvIn *wave_; BiQuad **filters_; OnePole onepole_; SineWave vibrato_; unsigned int nModes_; std::vector ratios_; std::vector radii_; StkFloat vibratoGain_; StkFloat masterGain_; StkFloat directGain_; StkFloat stickHardness_; StkFloat strikePosition_; StkFloat baseFrequency_; }; inline StkFloat Modal :: tick( unsigned int ) { StkFloat temp = masterGain_ * onepole_.tick( wave_->tick() * envelope_.tick() ); StkFloat temp2 = 0.0; for ( unsigned int i=0; itick(temp); temp2 -= temp2 * directGain_; temp2 += directGain_ * temp; if ( vibratoGain_ != 0.0 ) { // Calculate AM and apply to master out temp = 1.0 + ( vibrato_.tick() * vibratoGain_ ); temp2 = temp * temp2; } lastFrame_[0] = temp2; return lastFrame_[0]; } inline StkFrames& Modal :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Modal::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i= noiseRate_ ) { noise_.tick(); noiseCounter_ = 0; } lastFrame_[0] += filter_.tick( noise_.lastOut() ); return lastFrame_[0]; } inline StkFrames& Modulate :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "Modulate::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; isetFrequency( mSpeed ); }; //! Set the modulation (vibrato) depth. void setModulationDepth( StkFloat mDepth ) { modDepth_ = mDepth * 0.5; }; //! Perform the control change specified by \e number and \e value (0.0 - 128.0). void controlChange( int number, StkFloat value ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: FormSwep filters_[2]; StkFloat modDepth_; StkFloat filterQ_; StkFloat filterRate_; }; inline StkFloat Moog :: tick( unsigned int ) { StkFloat temp; if ( modDepth_ != 0.0 ) { temp = loops_[1]->tick() * modDepth_; loops_[0]->setFrequency( baseFrequency_ * (1.0 + temp) ); } temp = attackGain_ * attacks_[0]->tick(); temp += loopGain_ * loops_[0]->tick(); temp = filter_.tick( temp ); temp *= adsr_.tick(); temp = filters_[0].tick( temp ); lastFrame_[0] = filters_[1].tick( temp ); return lastFrame_[0] * 6.0; } inline StkFrames& Moog :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Moog::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i typedef pthread_mutex_t MUTEX; typedef pthread_cond_t CONDITION; #elif defined(__OS_WINDOWS__) #include #include typedef CRITICAL_SECTION MUTEX; typedef HANDLE CONDITION; #endif namespace stk { /***************************************************/ /*! \class Mutex \brief STK mutex class. This class provides a uniform interface for cross-platform mutex use. On Linux and IRIX systems, the pthread library is used. Under Windows, critical sections are used. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Mutex : public Stk { public: //! Default constructor. Mutex(); //! Class destructor. ~Mutex(); //! Lock the mutex. void lock(void); //! Unlock the mutex. void unlock(void); //! Wait indefinitely on the mutex condition variable. /*! The mutex must be locked before calling this function, and then subsequently unlocked after this function returns. */ void wait(void); //! Signal the condition variable. /*! The mutex must be locked before calling this function, and then subsequently unlocked after this function returns. */ void signal(void); protected: MUTEX mutex_; CONDITION condition_; }; } // stk namespace #endif stk-4.5.0/include/Noise.h0000644000076600007660000000443412327014024013011 0ustar gary#ifndef STK_NOISE_H #define STK_NOISE_H #include "Generator.h" #include namespace stk { /***************************************************/ /*! \class Noise \brief STK noise generator. Generic random number generation using the C rand() function. The quality of the rand() function varies from one OS to another. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Noise : public Generator { public: //! Default constructor that can also take a specific seed value. /*! If the seed value is zero (the default value), the random number generator is seeded with the system time. */ Noise( unsigned int seed = 0 ); //! Seed the random number generator with a specific seed value. /*! If no seed is provided or the seed value is zero, the random number generator is seeded with the current system time. */ void setSeed( unsigned int seed = 0 ); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Compute and return one output sample. StkFloat tick( void ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: }; inline StkFloat Noise :: tick( void ) { return lastFrame_[0] = (StkFloat) ( 2.0 * rand() / (RAND_MAX + 1.0) - 1.0 ); } inline StkFrames& Noise :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "Noise::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i 1 ) { oStream_ << "NRev::lastOut(): channel argument must be less than 2!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif return lastFrame_[channel]; } inline StkFloat NRev :: tick( StkFloat input, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel > 1 ) { oStream_ << "NRev::tick(): channel argument must be less than 2!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat temp, temp0, temp1, temp2, temp3; int i; temp0 = 0.0; for ( i=0; i<6; i++ ) { temp = input + (combCoefficient_[i] * combDelays_[i].lastOut()); temp0 += combDelays_[i].tick(temp); } for ( i=0; i<3; i++ ) { temp = allpassDelays_[i].lastOut(); temp1 = allpassCoefficient_ * temp; temp1 += temp0; allpassDelays_[i].tick(temp1); temp0 = -(allpassCoefficient_ * temp1) + temp; } // One-pole lowpass filter. lowpassState_ = 0.7 * lowpassState_ + 0.3 * temp0; temp = allpassDelays_[3].lastOut(); temp1 = allpassCoefficient_ * temp; temp1 += lowpassState_; allpassDelays_[3].tick( temp1 ); temp1 = -( allpassCoefficient_ * temp1 ) + temp; temp = allpassDelays_[4].lastOut(); temp2 = allpassCoefficient_ * temp; temp2 += temp1; allpassDelays_[4].tick( temp2 ); lastFrame_[0] = effectMix_*( -( allpassCoefficient_ * temp2 ) + temp ); temp = allpassDelays_[5].lastOut(); temp3 = allpassCoefficient_ * temp; temp3 += temp1; allpassDelays_[5].tick( temp3 ); lastFrame_[1] = effectMix_*( - ( allpassCoefficient_ * temp3 ) + temp ); temp = ( 1.0 - effectMix_ ) * input; lastFrame_[0] += temp; lastFrame_[1] += temp; return lastFrame_[channel]; } } // stk namespace #endif stk-4.5.0/include/OnePole.h0000644000076600007660000001056412327014024013276 0ustar gary#ifndef STK_ONEPOLE_H #define STK_ONEPOLE_H #include "Filter.h" namespace stk { /***************************************************/ /*! \class OnePole \brief STK one-pole filter class. This class implements a one-pole digital filter. A method is provided for setting the pole position along the real axis of the z-plane while maintaining a constant peak filter gain. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class OnePole : public Filter { public: //! The default constructor creates a low-pass filter (pole at z = 0.9). OnePole( StkFloat thePole = 0.9 ); //! Class destructor. ~OnePole(); //! Set the b[0] coefficient value. void setB0( StkFloat b0 ) { b_[0] = b0; }; //! Set the a[1] coefficient value. void setA1( StkFloat a1 ) { a_[1] = a1; }; //! Set all filter coefficients. void setCoefficients( StkFloat b0, StkFloat a1, bool clearState = false ); //! Set the pole position in the z-plane. /*! This method sets the pole position along the real-axis of the z-plane and normalizes the coefficients for a maximum gain of one. A positive pole value produces a low-pass filter, while a negative pole value produces a high-pass filter. This method does not affect the filter \e gain value. The argument magnitude should be less than one to maintain filter stability. */ void setPole( StkFloat thePole ); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Input one sample to the filter and return one output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the filter and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); }; inline StkFloat OnePole :: tick( StkFloat input ) { inputs_[0] = gain_ * input; lastFrame_[0] = b_[0] * inputs_[0] - a_[1] * outputs_[1]; outputs_[1] = lastFrame_[0]; return lastFrame_[0]; } inline StkFrames& OnePole :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "OnePole::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "OnePole::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i= frames.channels() ) { oStream_ << "OneZero::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "OneZero::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i3--\ 2-- + -->1-->Out \endcode Control Change Numbers: - Total Modulator Index = 2 - Modulator Crossfade = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class PercFlut : public FM { public: //! Class constructor. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ PercFlut( void ); //! Class destructor. ~PercFlut( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: }; inline StkFloat PercFlut :: tick( unsigned int ) { StkFloat temp; temp = vibrato_.tick() * modDepth_ * 0.2; waves_[0]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[0]); waves_[1]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[1]); waves_[2]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[2]); waves_[3]->setFrequency(baseFrequency_ * (1.0 + temp) * ratios_[3]); waves_[3]->addPhaseOffset( twozero_.lastOut() ); temp = gains_[3] * adsr_[3]->tick() * waves_[3]->tick(); twozero_.tick(temp); waves_[2]->addPhaseOffset( temp ); temp = (1.0 - (control2_ * 0.5)) * gains_[2] * adsr_[2]->tick() * waves_[2]->tick(); temp += control2_ * 0.5 * gains_[1] * adsr_[1]->tick() * waves_[1]->tick(); temp = temp * control1_; waves_[0]->addPhaseOffset(temp); temp = gains_[0] * adsr_[0]->tick() * waves_[0]->tick(); lastFrame_[0] = temp * 0.5; return lastFrame_[0]; } inline StkFrames& PercFlut :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "PercFlut::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i maxDelay-12 ) delay_[0] -= delayLength_; while ( delay_[0] < 12 ) delay_[0] += delayLength_; delay_[1] = delay_[0] + halfLength_; while ( delay_[1] > maxDelay-12 ) delay_[1] -= delayLength_; while ( delay_[1] < 12 ) delay_[1] += delayLength_; // Set the new delay line lengths. delayLine_[0].setDelay( delay_[0] ); delayLine_[1].setDelay( delay_[1] ); // Calculate a triangular envelope. env_[1] = fabs( ( delay_[0] - halfLength_ + 12 ) * ( 1.0 / (halfLength_ + 12 ) ) ); env_[0] = 1.0 - env_[1]; // Delay input and apply envelope. lastFrame_[0] = env_[0] * delayLine_[0].tick( input ); lastFrame_[0] += env_[1] * delayLine_[1].tick( input ); // Compute effect mix and output. lastFrame_[0] *= effectMix_; lastFrame_[0] += ( 1.0 - effectMix_ ) * input; return lastFrame_[0]; } } // stk namespace #endif stk-4.5.0/include/Plucked.h0000644000076600007660000000626312327014024013325 0ustar gary#ifndef STK_PLUCKED_H #define STK_PLUCKED_H #include "Instrmnt.h" #include "DelayA.h" #include "OneZero.h" #include "OnePole.h" #include "Noise.h" namespace stk { /***************************************************/ /*! \class Plucked \brief STK basic plucked string class. This class implements a simple plucked string physical model based on the Karplus-Strong algorithm. For a more advanced plucked string implementation, see the stk::Twang class. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. There exist at least two patents, assigned to Stanford, bearing the names of Karplus and/or Strong. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Plucked : public Instrmnt { public: //! Class constructor, taking the lowest desired playing frequency. Plucked( StkFloat lowestFrequency = 10.0 ); //! Class destructor. ~Plucked( void ); //! Reset and clear all internal state. void clear( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Pluck the string with the given amplitude using the current frequency. void pluck( StkFloat amplitude ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: DelayA delayLine_; OneZero loopFilter_; OnePole pickFilter_; Noise noise_; StkFloat loopGain_; }; inline StkFloat Plucked :: tick( unsigned int ) { // Here's the whole inner loop of the instrument!! return lastFrame_[0] = 3.0 * delayLine_.tick( loopFilter_.tick( delayLine_.lastOut() * loopGain_ ) ); } inline StkFrames& Plucked :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Plucked::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i= frames.channels() ) { oStream_ << "PoleZero::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i 1 ) { oStream_ << "PRCRev::lastOut(): channel argument must be less than 2!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif return lastFrame_[channel]; } inline StkFloat PRCRev :: tick( StkFloat input, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel > 1 ) { oStream_ << "PRCRev::tick(): channel argument must be less than 2!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat temp, temp0, temp1, temp2, temp3; temp = allpassDelays_[0].lastOut(); temp0 = allpassCoefficient_ * temp; temp0 += input; allpassDelays_[0].tick(temp0); temp0 = -(allpassCoefficient_ * temp0) + temp; temp = allpassDelays_[1].lastOut(); temp1 = allpassCoefficient_ * temp; temp1 += temp0; allpassDelays_[1].tick(temp1); temp1 = -(allpassCoefficient_ * temp1) + temp; temp2 = temp1 + ( combCoefficient_[0] * combDelays_[0].lastOut() ); temp3 = temp1 + ( combCoefficient_[1] * combDelays_[1].lastOut() ); lastFrame_[0] = effectMix_ * (combDelays_[0].tick(temp2)); lastFrame_[1] = effectMix_ * (combDelays_[1].tick(temp3)); temp = (1.0 - effectMix_) * input; lastFrame_[0] += temp; lastFrame_[1] += temp; return lastFrame_[channel]; } } // stk namespace #endif stk-4.5.0/include/ReedTable.h0000644000076600007660000001113612327014024013560 0ustar gary#ifndef STK_REEDTABLE_H #define STK_REEDTABLE_H #include "Function.h" namespace stk { /***************************************************/ /*! \class ReedTable \brief STK reed table class. This class implements a simple one breakpoint, non-linear reed function, as described by Smith (1986). This function is based on a memoryless non-linear spring model of the reed (the reed mass is ignored) which saturates when the reed collides with the mouthpiece facing. See McIntyre, Schumacher, & Woodhouse (1983), Smith (1986), Hirschman, Cook, Scavone, and others for more information. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class ReedTable : public Function { public: //! Default constructor. ReedTable( void ) : offset_(0.6), slope_(-0.8) {}; //! Set the table offset value. /*! The table offset roughly corresponds to the size of the initial reed tip opening (a greater offset represents a smaller opening). */ void setOffset( StkFloat offset ) { offset_ = offset; }; //! Set the table slope value. /*! The table slope roughly corresponds to the reed stiffness (a greater slope represents a harder reed). */ void setSlope( StkFloat slope ) { slope_ = slope; }; //! Take one sample input and map to one sample of output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the table and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the table and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: StkFloat offset_; StkFloat slope_; }; inline StkFloat ReedTable :: tick( StkFloat input ) { // The input is differential pressure across the reed. lastFrame_[0] = offset_ + (slope_ * input); // If output is > 1, the reed has slammed shut and the // reflection function value saturates at 1.0. if ( lastFrame_[0] > 1.0) lastFrame_[0] = (StkFloat) 1.0; // This is nearly impossible in a physical system, but // a reflection function value of -1.0 corresponds to // an open end (and no discontinuity in bore profile). if ( lastFrame_[0] < -1.0) lastFrame_[0] = (StkFloat) -1.0; return lastFrame_[0]; } inline StkFrames& ReedTable :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "ReedTable::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i 1.0) *samples = 1.0; if ( *samples < -1.0) *samples = -1.0; } lastFrame_[0] = *(samples-hop); return frames; } inline StkFrames& ReedTable :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel ) { #if defined(_STK_DEBUG_) if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "ReedTable::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i 1.0) *oSamples = 1.0; if ( *oSamples < -1.0) *oSamples = -1.0; } lastFrame_[0] = *(oSamples-oHop); return iFrames; } } // stk namespace #endif stk-4.5.0/include/Resonate.h0000644000076600007660000000661512327014024013517 0ustar gary#ifndef STK_RESONATE_H #define STK_RESONATE_H #include "Instrmnt.h" #include "ADSR.h" #include "BiQuad.h" #include "Noise.h" namespace stk { /***************************************************/ /*! \class Resonate \brief STK noise driven formant filter. This instrument contains a noise source, which excites a biquad resonance filter, with volume controlled by an ADSR. Control Change Numbers: - Resonance Frequency (0-Nyquist) = 2 - Pole Radii = 4 - Notch Frequency (0-Nyquist) = 11 - Zero Radii = 1 - Envelope Gain = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Resonate : public Instrmnt { public: //! Class constructor. Resonate( void ); //! Class destructor. ~Resonate( void ); //! Set the filter for a resonance at the given frequency (Hz) and radius. void setResonance( StkFloat frequency, StkFloat radius ); //! Set the filter for a notch at the given frequency (Hz) and radius. void setNotch( StkFloat frequency, StkFloat radius ); //! Set the filter zero coefficients for contant resonance gain. void setEqualGainZeroes( void ) { filter_.setEqualGainZeroes(); }; //! Initiate the envelope with a key-on event. void keyOn( void ) { adsr_.keyOn(); }; //! Signal a key-off event to the envelope. void keyOff( void ) { adsr_.keyOff(); }; //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). void controlChange( int number, StkFloat value ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: ADSR adsr_; BiQuad filter_; Noise noise_; StkFloat poleFrequency_; StkFloat poleRadius_; StkFloat zeroFrequency_; StkFloat zeroRadius_; }; inline StkFloat Resonate :: tick( unsigned int ) { lastFrame_[0] = filter_.tick( noise_.tick() ); lastFrame_[0] *= adsr_.tick(); return lastFrame_[0]; } inline StkFrames& Resonate :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Resonate::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i3--\ + --> Out 2->1--/ \endcode Control Change Numbers: - Modulator Index One = 2 - Crossfade of Outputs = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Rhodey : public FM { public: //! Class constructor. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ Rhodey( void ); //! Class destructor. ~Rhodey( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: }; inline StkFloat Rhodey :: tick( unsigned int ) { StkFloat temp, temp2; temp = gains_[1] * adsr_[1]->tick() * waves_[1]->tick(); temp = temp * control1_; waves_[0]->addPhaseOffset( temp ); waves_[3]->addPhaseOffset( twozero_.lastOut() ); temp = gains_[3] * adsr_[3]->tick() * waves_[3]->tick(); twozero_.tick(temp); waves_[2]->addPhaseOffset( temp ); temp = ( 1.0 - (control2_ * 0.5)) * gains_[0] * adsr_[0]->tick() * waves_[0]->tick(); temp += control2_ * 0.5 * gains_[2] * adsr_[2]->tick() * waves_[2]->tick(); // Calculate amplitude modulation and apply it to output. temp2 = vibrato_.tick() * modDepth_; temp = temp * (1.0 + temp2); lastFrame_[0] = temp * 0.5; return lastFrame_[0]; } inline StkFrames& Rhodey :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Rhodey::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i #include #include #include /*! \typedef typedef unsigned long RtAudioFormat; \brief RtAudio data format type. Support for signed integers and floats. Audio data fed to/from an RtAudio stream is assumed to ALWAYS be in host byte order. The internal routines will automatically take care of any necessary byte-swapping between the host format and the soundcard. Thus, endian-ness is not a concern in the following format definitions. - \e RTAUDIO_SINT8: 8-bit signed integer. - \e RTAUDIO_SINT16: 16-bit signed integer. - \e RTAUDIO_SINT24: 24-bit signed integer. - \e RTAUDIO_SINT32: 32-bit signed integer. - \e RTAUDIO_FLOAT32: Normalized between plus/minus 1.0. - \e RTAUDIO_FLOAT64: Normalized between plus/minus 1.0. */ typedef unsigned long RtAudioFormat; static const RtAudioFormat RTAUDIO_SINT8 = 0x1; // 8-bit signed integer. static const RtAudioFormat RTAUDIO_SINT16 = 0x2; // 16-bit signed integer. static const RtAudioFormat RTAUDIO_SINT24 = 0x4; // 24-bit signed integer. static const RtAudioFormat RTAUDIO_SINT32 = 0x8; // 32-bit signed integer. static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; // Normalized between plus/minus 1.0. static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/minus 1.0. /*! \typedef typedef unsigned long RtAudioStreamFlags; \brief RtAudio stream option flags. The following flags can be OR'ed together to allow a client to make changes to the default stream behavior: - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. - \e RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only). By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with \c nFrames samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index \c nFrames (assuming the \c buffer pointer was recast to the correct data type for the stream). Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, RtAudio will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance. If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs. If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt to select realtime scheduling (round-robin) for the callback thread. If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to open the "default" PCM device when using the ALSA API. Note that this will override any specified input or output device id. */ typedef unsigned int RtAudioStreamFlags; static const RtAudioStreamFlags RTAUDIO_NONINTERLEAVED = 0x1; // Use non-interleaved buffers (default = interleaved). static const RtAudioStreamFlags RTAUDIO_MINIMIZE_LATENCY = 0x2; // Attempt to set stream parameters for lowest possible latency. static const RtAudioStreamFlags RTAUDIO_HOG_DEVICE = 0x4; // Attempt grab device and prevent use by others. static const RtAudioStreamFlags RTAUDIO_SCHEDULE_REALTIME = 0x8; // Try to select realtime scheduling for callback thread. static const RtAudioStreamFlags RTAUDIO_ALSA_USE_DEFAULT = 0x10; // Use the "default" PCM device (ALSA only). /*! \typedef typedef unsigned long RtAudioStreamStatus; \brief RtAudio stream status (over- or underflow) flags. Notification of a stream over- or underflow is indicated by a non-zero stream \c status argument in the RtAudioCallback function. The stream status can be one of the following two options, depending on whether the stream is open for output and/or input: - \e RTAUDIO_INPUT_OVERFLOW: Input data was discarded because of an overflow condition at the driver. - \e RTAUDIO_OUTPUT_UNDERFLOW: The output buffer ran low, likely producing a break in the output sound. */ typedef unsigned int RtAudioStreamStatus; static const RtAudioStreamStatus RTAUDIO_INPUT_OVERFLOW = 0x1; // Input data was discarded because of an overflow condition at the driver. static const RtAudioStreamStatus RTAUDIO_OUTPUT_UNDERFLOW = 0x2; // The output buffer ran low, likely causing a gap in the output sound. //! RtAudio callback function prototype. /*! All RtAudio clients must create a function of type RtAudioCallback to read and/or write data from/to the audio stream. When the underlying audio system is ready for new input or output data, this function will be invoked. \param outputBuffer For output (or duplex) streams, the client should write \c nFrames of audio sample frames into this buffer. This argument should be recast to the datatype specified when the stream was opened. For input-only streams, this argument will be NULL. \param inputBuffer For input (or duplex) streams, this buffer will hold \c nFrames of input audio sample frames. This argument should be recast to the datatype specified when the stream was opened. For output-only streams, this argument will be NULL. \param nFrames The number of sample frames of input or output data in the buffers. The actual buffer size in bytes is dependent on the data type and number of channels in use. \param streamTime The number of seconds that have elapsed since the stream was started. \param status If non-zero, this argument indicates a data overflow or underflow condition for the stream. The particular condition can be determined by comparison with the RtAudioStreamStatus flags. \param userData A pointer to optional data provided by the client when opening the stream (default = NULL). To continue normal stream operation, the RtAudioCallback function should return a value of zero. To stop the stream and drain the output buffer, the function should return a value of one. To abort the stream immediately, the client should return a value of two. */ typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void *userData ); /************************************************************************/ /*! \class RtAudioError \brief Exception handling class for RtAudio. The RtAudioError class is quite simple but it does allow errors to be "caught" by RtAudioError::Type. See the RtAudio documentation to know which methods can throw an RtAudioError. */ /************************************************************************/ class RtAudioError : public std::exception { public: //! Defined RtAudioError types. enum Type { WARNING, /*!< A non-critical error. */ DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ UNSPECIFIED, /*!< The default, unspecified error type. */ NO_DEVICES_FOUND, /*!< No devices found on system. */ INVALID_DEVICE, /*!< An invalid device ID was specified. */ MEMORY_ERROR, /*!< An error occured during memory allocation. */ INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ INVALID_USE, /*!< The function was called incorrectly. */ DRIVER_ERROR, /*!< A system driver error occured. */ SYSTEM_ERROR, /*!< A system error occured. */ THREAD_ERROR /*!< A thread error occured. */ }; //! The constructor. RtAudioError( const std::string& message, Type type = RtAudioError::UNSPECIFIED ) throw() : message_(message), type_(type) {} //! The destructor. virtual ~RtAudioError( void ) throw() {} //! Prints thrown error message to stderr. virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; } //! Returns the thrown error message type. virtual const Type& getType(void) const throw() { return type_; } //! Returns the thrown error message string. virtual const std::string& getMessage(void) const throw() { return message_; } //! Returns the thrown error message as a c-style string. virtual const char* what( void ) const throw() { return message_.c_str(); } protected: std::string message_; Type type_; }; //! RtAudio error callback function prototype. /*! \param type Type of error. \param errorText Error description. */ typedef void (*RtAudioErrorCallback)( RtAudioError::Type type, const std::string &errorText ); // **************************************************************** // // // RtAudio class declaration. // // RtAudio is a "controller" used to select an available audio i/o // interface. It presents a common API for the user to call but all // functionality is implemented by the class RtApi and its // subclasses. RtAudio creates an instance of an RtApi subclass // based on the user's API choice. If no choice is made, RtAudio // attempts to make a "logical" API selection. // // **************************************************************** // class RtApi; class RtAudio { public: //! Audio API specifier arguments. enum Api { UNSPECIFIED, /*!< Search for a working compiled API. */ LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ LINUX_PULSE, /*!< The Linux PulseAudio API. */ LINUX_OSS, /*!< The Linux Open Sound System API. */ UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */ MACOSX_CORE, /*!< Macintosh OS-X Core Audio API. */ WINDOWS_WASAPI, /*!< The Microsoft WASAPI API. */ WINDOWS_ASIO, /*!< The Steinberg Audio Stream I/O API. */ WINDOWS_DS, /*!< The Microsoft Direct Sound API. */ RTAUDIO_DUMMY /*!< A compilable but non-functional API. */ }; //! The public device information structure for returning queried values. struct DeviceInfo { bool probed; /*!< true if the device capabilities were successfully probed. */ std::string name; /*!< Character string device identifier. */ unsigned int outputChannels; /*!< Maximum output channels supported by device. */ unsigned int inputChannels; /*!< Maximum input channels supported by device. */ unsigned int duplexChannels; /*!< Maximum simultaneous input/output channels supported by device. */ bool isDefaultOutput; /*!< true if this is the default output device. */ bool isDefaultInput; /*!< true if this is the default input device. */ std::vector sampleRates; /*!< Supported sample rates (queried from list of standard rates). */ RtAudioFormat nativeFormats; /*!< Bit mask of supported data formats. */ // Default constructor. DeviceInfo() :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0), isDefaultOutput(false), isDefaultInput(false), nativeFormats(0) {} }; //! The structure for specifying input or ouput stream parameters. struct StreamParameters { unsigned int deviceId; /*!< Device index (0 to getDeviceCount() - 1). */ unsigned int nChannels; /*!< Number of channels. */ unsigned int firstChannel; /*!< First channel index on device (default = 0). */ // Default constructor. StreamParameters() : deviceId(0), nChannels(0), firstChannel(0) {} }; //! The structure for specifying stream options. /*! The following flags can be OR'ed together to allow a client to make changes to the default stream behavior: - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. - \e RTAUDIO_SCHEDULE_REALTIME: Attempt to select realtime scheduling for callback thread. - \e RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only). By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with \c nFrames samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index \c nFrames (assuming the \c buffer pointer was recast to the correct data type for the stream). Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, RtAudio will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance. If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs. If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt to select realtime scheduling (round-robin) for the callback thread. The \c priority parameter will only be used if the RTAUDIO_SCHEDULE_REALTIME flag is set. It defines the thread's realtime priority. If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to open the "default" PCM device when using the ALSA API. Note that this will override any specified input or output device id. The \c numberOfBuffers parameter can be used to control stream latency in the Windows DirectSound, Linux OSS, and Linux Alsa APIs only. A value of two is usually the smallest allowed. Larger numbers can potentially result in more robust stream performance, though likely at the cost of stream latency. The value set by the user is replaced during execution of the RtAudio::openStream() function by the value actually used by the system. The \c streamName parameter can be used to set the client name when using the Jack API. By default, the client name is set to RtApiJack. However, if you wish to create multiple instances of RtAudio with Jack, each instance must have a unique client name. */ struct StreamOptions { RtAudioStreamFlags flags; /*!< A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE, RTAUDIO_ALSA_USE_DEFAULT). */ unsigned int numberOfBuffers; /*!< Number of stream buffers. */ std::string streamName; /*!< A stream name (currently used only in Jack). */ int priority; /*!< Scheduling priority of callback thread (only used with flag RTAUDIO_SCHEDULE_REALTIME). */ // Default constructor. StreamOptions() : flags(0), numberOfBuffers(0), priority(0) {} }; //! A static function to determine the current RtAudio version. static std::string getVersion( void ) throw(); //! A static function to determine the available compiled audio APIs. /*! The values returned in the std::vector can be compared against the enumerated list values. Note that there can be more than one API compiled for certain operating systems. */ static void getCompiledApi( std::vector &apis ) throw(); //! The class constructor. /*! The constructor performs minor initialization tasks. An exception can be thrown if no API support is compiled. If no API argument is specified and multiple API support has been compiled, the default order of use is JACK, ALSA, OSS (Linux systems) and ASIO, DS (Windows systems). */ RtAudio( RtAudio::Api api=UNSPECIFIED ); //! The destructor. /*! If a stream is running or open, it will be stopped and closed automatically. */ ~RtAudio() throw(); //! Returns the audio API specifier for the current instance of RtAudio. RtAudio::Api getCurrentApi( void ) throw(); //! A public function that queries for the number of audio devices available. /*! This function performs a system query of available devices each time it is called, thus supporting devices connected \e after instantiation. If a system error occurs during processing, a warning will be issued. */ unsigned int getDeviceCount( void ) throw(); //! Return an RtAudio::DeviceInfo structure for a specified device number. /*! Any device integer between 0 and getDeviceCount() - 1 is valid. If an invalid argument is provided, an RtAudioError (type = INVALID_USE) will be thrown. If a device is busy or otherwise unavailable, the structure member "probed" will have a value of "false" and all other members are undefined. If the specified device is the current default input or output device, the corresponding "isDefault" member will have a value of "true". */ RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); //! A function that returns the index of the default output device. /*! If the underlying audio API does not provide a "default device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream. */ unsigned int getDefaultOutputDevice( void ) throw(); //! A function that returns the index of the default input device. /*! If the underlying audio API does not provide a "default device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream. */ unsigned int getDefaultInputDevice( void ) throw(); //! A public function for opening a stream with the specified parameters. /*! An RtAudioError (type = SYSTEM_ERROR) is thrown if a stream cannot be opened with the specified parameters or an error occurs during processing. An RtAudioError (type = INVALID_USE) is thrown if any invalid device ID or channel number parameters are specified. \param outputParameters Specifies output stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For input-only streams, this argument should be NULL. The device ID is an index value between 0 and getDeviceCount() - 1. \param inputParameters Specifies input stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For output-only streams, this argument should be NULL. The device ID is an index value between 0 and getDeviceCount() - 1. \param format An RtAudioFormat specifying the desired sample data format. \param sampleRate The desired sample rate (sample frames per second). \param *bufferFrames A pointer to a value indicating the desired internal buffer size in sample frames. The actual value used by the device is returned via the same pointer. A value of zero can be specified, in which case the lowest allowable value is determined. \param callback A client-defined function that will be invoked when input data is available and/or output data is needed. \param userData An optional pointer to data that can be accessed from within the callback function. \param options An optional pointer to a structure containing various global stream options, including a list of OR'ed RtAudioStreamFlags and a suggested number of stream buffers that can be used to control stream latency. More buffers typically result in more robust performance, though at a cost of greater latency. If a value of zero is specified, a system-specific median value is chosen. If the RTAUDIO_MINIMIZE_LATENCY flag bit is set, the lowest allowable value is used. The actual value used is returned via the structure argument. The parameter is API dependent. \param errorCallback A client-defined function that will be invoked when an error has occured. */ void openStream( RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData = NULL, RtAudio::StreamOptions *options = NULL, RtAudioErrorCallback errorCallback = NULL ); //! A function that closes a stream and frees any associated stream memory. /*! If a stream is not open, this function issues a warning and returns (no exception is thrown). */ void closeStream( void ) throw(); //! A function that starts a stream. /*! An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtAudioError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already running. */ void startStream( void ); //! Stop a stream, allowing any samples remaining in the output queue to be played. /*! An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtAudioError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped. */ void stopStream( void ); //! Stop a stream, discarding any samples remaining in the input/output queue. /*! An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtAudioError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped. */ void abortStream( void ); //! Returns true if a stream is open and false if not. bool isStreamOpen( void ) const throw(); //! Returns true if the stream is running and false if it is stopped or not open. bool isStreamRunning( void ) const throw(); //! Returns the number of elapsed seconds since the stream was started. /*! If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. */ double getStreamTime( void ); //! Set the stream time to a time in seconds greater than or equal to 0.0. /*! If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. */ void setStreamTime( double time ); //! Returns the internal stream latency in sample frames. /*! The stream latency refers to delay in audio input and/or output caused by internal buffering by the audio system and/or hardware. For duplex streams, the returned value will represent the sum of the input and output latencies. If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. If the API does not report latency, the return value will be zero. */ long getStreamLatency( void ); //! Returns actual sample rate in use by the stream. /*! On some systems, the sample rate used may be slightly different than that specified in the stream parameters. If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. */ unsigned int getStreamSampleRate( void ); //! Specify whether warning messages should be printed to stderr. void showWarnings( bool value = true ) throw(); protected: void openRtApi( RtAudio::Api api ); RtApi *rtapi_; }; // Operating system dependent thread functionality. #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) #ifndef NOMINMAX #define NOMINMAX #endif #include #include typedef uintptr_t ThreadHandle; typedef CRITICAL_SECTION StreamMutex; #elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) // Using pthread library for various flavors of unix. #include typedef pthread_t ThreadHandle; typedef pthread_mutex_t StreamMutex; #else // Setup for "dummy" behavior #define __RTAUDIO_DUMMY__ typedef int ThreadHandle; typedef int StreamMutex; #endif // This global structure type is used to pass callback information // between the private RtAudio stream structure and global callback // handling functions. struct CallbackInfo { void *object; // Used as a "this" pointer. ThreadHandle thread; void *callback; void *userData; void *errorCallback; void *apiInfo; // void pointer for API specific callback information bool isRunning; bool doRealtime; int priority; // Default constructor. CallbackInfo() :object(0), callback(0), userData(0), errorCallback(0), apiInfo(0), isRunning(false), doRealtime(false) {} }; // **************************************************************** // // // RtApi class declaration. // // Subclasses of RtApi contain all API- and OS-specific code necessary // to fully implement the RtAudio API. // // Note that RtApi is an abstract base class and cannot be // explicitly instantiated. The class RtAudio will create an // instance of an RtApi subclass (RtApiOss, RtApiAlsa, // RtApiJack, RtApiCore, RtApiDs, or RtApiAsio). // // **************************************************************** // #pragma pack(push, 1) class S24 { protected: unsigned char c3[3]; public: S24() {} S24& operator = ( const int& i ) { c3[0] = (i & 0x000000ff); c3[1] = (i & 0x0000ff00) >> 8; c3[2] = (i & 0x00ff0000) >> 16; return *this; } S24( const S24& v ) { *this = v; } S24( const double& d ) { *this = (int) d; } S24( const float& f ) { *this = (int) f; } S24( const signed short& s ) { *this = (int) s; } S24( const char& c ) { *this = (int) c; } int asInt() { int i = c3[0] | (c3[1] << 8) | (c3[2] << 16); if (i & 0x800000) i |= ~0xffffff; return i; } }; #pragma pack(pop) #if defined( HAVE_GETTIMEOFDAY ) #include #endif #include class RtApi { public: RtApi(); virtual ~RtApi(); virtual RtAudio::Api getCurrentApi( void ) = 0; virtual unsigned int getDeviceCount( void ) = 0; virtual RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) = 0; virtual unsigned int getDefaultInputDevice( void ); virtual unsigned int getDefaultOutputDevice( void ); void openStream( RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData, RtAudio::StreamOptions *options, RtAudioErrorCallback errorCallback ); virtual void closeStream( void ); virtual void startStream( void ) = 0; virtual void stopStream( void ) = 0; virtual void abortStream( void ) = 0; long getStreamLatency( void ); unsigned int getStreamSampleRate( void ); virtual double getStreamTime( void ); virtual void setStreamTime( double time ); bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; } bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; } void showWarnings( bool value ) { showWarnings_ = value; } protected: static const unsigned int MAX_SAMPLE_RATES; static const unsigned int SAMPLE_RATES[]; enum { FAILURE, SUCCESS }; enum StreamState { STREAM_STOPPED, STREAM_STOPPING, STREAM_RUNNING, STREAM_CLOSED = -50 }; enum StreamMode { OUTPUT, INPUT, DUPLEX, UNINITIALIZED = -75 }; // A protected structure used for buffer conversion. struct ConvertInfo { int channels; int inJump, outJump; RtAudioFormat inFormat, outFormat; std::vector inOffset; std::vector outOffset; }; // A protected structure for audio streams. struct RtApiStream { unsigned int device[2]; // Playback and record, respectively. void *apiHandle; // void pointer for API specific stream handle information StreamMode mode; // OUTPUT, INPUT, or DUPLEX. StreamState state; // STOPPED, RUNNING, or CLOSED char *userBuffer[2]; // Playback and record, respectively. char *deviceBuffer; bool doConvertBuffer[2]; // Playback and record, respectively. bool userInterleaved; bool deviceInterleaved[2]; // Playback and record, respectively. bool doByteSwap[2]; // Playback and record, respectively. unsigned int sampleRate; unsigned int bufferSize; unsigned int nBuffers; unsigned int nUserChannels[2]; // Playback and record, respectively. unsigned int nDeviceChannels[2]; // Playback and record channels, respectively. unsigned int channelOffset[2]; // Playback and record, respectively. unsigned long latency[2]; // Playback and record, respectively. RtAudioFormat userFormat; RtAudioFormat deviceFormat[2]; // Playback and record, respectively. StreamMutex mutex; CallbackInfo callbackInfo; ConvertInfo convertInfo[2]; double streamTime; // Number of elapsed seconds since the stream started. #if defined(HAVE_GETTIMEOFDAY) struct timeval lastTickTimestamp; #endif RtApiStream() :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; } }; typedef S24 Int24; typedef signed short Int16; typedef signed int Int32; typedef float Float32; typedef double Float64; std::ostringstream errorStream_; std::string errorText_; bool showWarnings_; RtApiStream stream_; bool firstErrorOccurred_; /*! Protected, api-specific method that attempts to open a device with the given parameters. This function MUST be implemented by all subclasses. If an error is encountered during the probe, a "warning" message is reported and FAILURE is returned. A successful probe is indicated by a return value of SUCCESS. */ virtual bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); //! A protected function used to increment the stream time. void tickStreamTime( void ); //! Protected common method to clear an RtApiStream structure. void clearStreamInfo(); /*! Protected common method that throws an RtAudioError (type = INVALID_USE) if a stream is not open. */ void verifyStream( void ); //! Protected common error method to allow global control over error handling. void error( RtAudioError::Type type ); /*! Protected method used to perform format, channel number, and/or interleaving conversions between the user and device buffers. */ void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info ); //! Protected common method used to perform byte-swapping on buffers. void byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format ); //! Protected common method that returns the number of bytes for a given format. unsigned int formatBytes( RtAudioFormat format ); //! Protected common method that sets up the parameters for buffer conversion. void setConvertInfo( StreamMode mode, unsigned int firstChannel ); }; // **************************************************************** // // // Inline RtAudio definitions. // // **************************************************************** // inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); } inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); } inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); } inline unsigned int RtAudio :: getDefaultOutputDevice( void ) throw() { return rtapi_->getDefaultOutputDevice(); } inline void RtAudio :: closeStream( void ) throw() { return rtapi_->closeStream(); } inline void RtAudio :: startStream( void ) { return rtapi_->startStream(); } inline void RtAudio :: stopStream( void ) { return rtapi_->stopStream(); } inline void RtAudio :: abortStream( void ) { return rtapi_->abortStream(); } inline bool RtAudio :: isStreamOpen( void ) const throw() { return rtapi_->isStreamOpen(); } inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->isStreamRunning(); } inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); } inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); } inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); } inline void RtAudio :: setStreamTime( double time ) { return rtapi_->setStreamTime( time ); } inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); } // RtApi Subclass prototypes. #if defined(__MACOSX_CORE__) #include class RtApiCore: public RtApi { public: RtApiCore(); ~RtApiCore(); RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; } unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); unsigned int getDefaultOutputDevice( void ); unsigned int getDefaultInputDevice( void ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! bool callbackEvent( AudioDeviceID deviceId, const AudioBufferList *inBufferList, const AudioBufferList *outBufferList ); private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); static const char* getErrorCode( OSStatus code ); }; #endif #if defined(__UNIX_JACK__) class RtApiJack: public RtApi { public: RtApiJack(); ~RtApiJack(); RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; } unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! bool callbackEvent( unsigned long nframes ); private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__WINDOWS_ASIO__) class RtApiAsio: public RtApi { public: RtApiAsio(); ~RtApiAsio(); RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; } unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! bool callbackEvent( long bufferIndex ); private: std::vector devices_; void saveDeviceInfo( void ); bool coInitialized_; bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__WINDOWS_DS__) class RtApiDs: public RtApi { public: RtApiDs(); ~RtApiDs(); RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; } unsigned int getDeviceCount( void ); unsigned int getDefaultOutputDevice( void ); unsigned int getDefaultInputDevice( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( void ); private: bool coInitialized_; bool buffersRolling; long duplexPrerollBytes; std::vector dsDevices; bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__WINDOWS_WASAPI__) struct IMMDeviceEnumerator; class RtApiWasapi : public RtApi { public: RtApiWasapi(); ~RtApiWasapi(); RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_WASAPI; } unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); unsigned int getDefaultOutputDevice( void ); unsigned int getDefaultInputDevice( void ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); private: bool coInitialized_; IMMDeviceEnumerator* deviceEnumerator_; bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int* bufferSize, RtAudio::StreamOptions* options ); static DWORD WINAPI runWasapiThread( void* wasapiPtr ); static DWORD WINAPI stopWasapiThread( void* wasapiPtr ); static DWORD WINAPI abortWasapiThread( void* wasapiPtr ); void wasapiThread(); }; #endif #if defined(__LINUX_ALSA__) class RtApiAlsa: public RtApi { public: RtApiAlsa(); ~RtApiAlsa(); RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; } unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( void ); private: std::vector devices_; void saveDeviceInfo( void ); bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__LINUX_PULSE__) class RtApiPulse: public RtApi { public: ~RtApiPulse(); RtAudio::Api getCurrentApi() { return RtAudio::LINUX_PULSE; } unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( void ); private: std::vector devices_; void saveDeviceInfo( void ); bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__LINUX_OSS__) class RtApiOss: public RtApi { public: RtApiOss(); ~RtApiOss(); RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; } unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( void ); private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__RTAUDIO_DUMMY__) class RtApiDummy: public RtApi { public: RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtAudioError::WARNING ); } RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; } unsigned int getDeviceCount( void ) { return 0; } RtAudio::DeviceInfo getDeviceInfo( unsigned int /*device*/ ) { RtAudio::DeviceInfo info; return info; } void closeStream( void ) {} void startStream( void ) {} void stopStream( void ) {} void abortStream( void ) {} private: bool probeDeviceOpen( unsigned int /*device*/, StreamMode /*mode*/, unsigned int /*channels*/, unsigned int /*firstChannel*/, unsigned int /*sampleRate*/, RtAudioFormat /*format*/, unsigned int * /*bufferSize*/, RtAudio::StreamOptions * /*options*/ ) { return false; } }; #endif #endif // Indentation settings for Vim and Emacs // // Local Variables: // c-basic-offset: 2 // indent-tabs-mode: nil // End: // // vim: et sts=2 sw=2 stk-4.5.0/include/RtMidi.h0000644000076600007660000007015612327014024013130 0ustar gary/**********************************************************************/ /*! \class RtMidi \brief An abstract base class for realtime MIDI input/output. This class implements some common functionality for the realtime MIDI input/output subclasses RtMidiIn and RtMidiOut. RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/ RtMidi: realtime MIDI i/o C++ classes Copyright (c) 2003-2014 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**********************************************************************/ /*! \file RtMidi.h */ #ifndef RTMIDI_H #define RTMIDI_H #define RTMIDI_VERSION "2.1.0" #include #include #include #include /************************************************************************/ /*! \class RtMidiError \brief Exception handling class for RtMidi. The RtMidiError class is quite simple but it does allow errors to be "caught" by RtMidiError::Type. See the RtMidi documentation to know which methods can throw an RtMidiError. */ /************************************************************************/ class RtMidiError : public std::exception { public: //! Defined RtMidiError types. enum Type { WARNING, /*!< A non-critical error. */ DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ UNSPECIFIED, /*!< The default, unspecified error type. */ NO_DEVICES_FOUND, /*!< No devices found on system. */ INVALID_DEVICE, /*!< An invalid device ID was specified. */ MEMORY_ERROR, /*!< An error occured during memory allocation. */ INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ INVALID_USE, /*!< The function was called incorrectly. */ DRIVER_ERROR, /*!< A system driver error occured. */ SYSTEM_ERROR, /*!< A system error occured. */ THREAD_ERROR /*!< A thread error occured. */ }; //! The constructor. RtMidiError( const std::string& message, Type type = RtMidiError::UNSPECIFIED ) throw() : message_(message), type_(type) {} //! The destructor. virtual ~RtMidiError( void ) throw() {} //! Prints thrown error message to stderr. virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; } //! Returns the thrown error message type. virtual const Type& getType(void) const throw() { return type_; } //! Returns the thrown error message string. virtual const std::string& getMessage(void) const throw() { return message_; } //! Returns the thrown error message as a c-style string. virtual const char* what( void ) const throw() { return message_.c_str(); } protected: std::string message_; Type type_; }; //! RtMidi error callback function prototype. /*! \param type Type of error. \param errorText Error description. Note that class behaviour is undefined after a critical error (not a warning) is reported. */ typedef void (*RtMidiErrorCallback)( RtMidiError::Type type, const std::string &errorText ); class MidiApi; class RtMidi { public: //! MIDI API specifier arguments. enum Api { UNSPECIFIED, /*!< Search for a working compiled API. */ MACOSX_CORE, /*!< Macintosh OS-X Core Midi API. */ LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ UNIX_JACK, /*!< The JACK Low-Latency MIDI Server API. */ WINDOWS_MM, /*!< The Microsoft Multimedia MIDI API. */ RTMIDI_DUMMY /*!< A compilable but non-functional API. */ }; //! A static function to determine the current RtMidi version. static std::string getVersion( void ) throw(); //! A static function to determine the available compiled MIDI APIs. /*! The values returned in the std::vector can be compared against the enumerated list values. Note that there can be more than one API compiled for certain operating systems. */ static void getCompiledApi( std::vector &apis ) throw(); //! Pure virtual openPort() function. virtual void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi" ) ) = 0; //! Pure virtual openVirtualPort() function. virtual void openVirtualPort( const std::string portName = std::string( "RtMidi" ) ) = 0; //! Pure virtual getPortCount() function. virtual unsigned int getPortCount() = 0; //! Pure virtual getPortName() function. virtual std::string getPortName( unsigned int portNumber = 0 ) = 0; //! Pure virtual closePort() function. virtual void closePort( void ) = 0; //! Returns true if a port is open and false if not. virtual bool isPortOpen( void ) const = 0; //! Set an error callback function to be invoked when an error has occured. /*! The callback function will be called whenever an error has occured. It is best to set the error callback function before opening a port. */ virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL ) = 0; protected: RtMidi(); virtual ~RtMidi(); MidiApi *rtapi_; }; /**********************************************************************/ /*! \class RtMidiIn \brief A realtime MIDI input class. This class provides a common, platform-independent API for realtime MIDI input. It allows access to a single MIDI input port. Incoming MIDI messages are either saved to a queue for retrieval using the getMessage() function or immediately passed to a user-specified callback function. Create multiple instances of this class to connect to more than one MIDI device at the same time. With the OS-X, Linux ALSA, and JACK MIDI APIs, it is also possible to open a virtual input port to which other MIDI software clients can connect. by Gary P. Scavone, 2003-2014. */ /**********************************************************************/ // **************************************************************** // // // RtMidiIn and RtMidiOut class declarations. // // RtMidiIn / RtMidiOut are "controllers" used to select an available // MIDI input or output interface. They present common APIs for the // user to call but all functionality is implemented by the classes // MidiInApi, MidiOutApi and their subclasses. RtMidiIn and RtMidiOut // each create an instance of a MidiInApi or MidiOutApi subclass based // on the user's API choice. If no choice is made, they attempt to // make a "logical" API selection. // // **************************************************************** // class RtMidiIn : public RtMidi { public: //! User callback function type definition. typedef void (*RtMidiCallback)( double timeStamp, std::vector *message, void *userData); //! Default constructor that allows an optional api, client name and queue size. /*! An exception will be thrown if a MIDI system initialization error occurs. The queue size defines the maximum number of messages that can be held in the MIDI queue (when not using a callback function). If the queue size limit is reached, incoming messages will be ignored. If no API argument is specified and multiple API support has been compiled, the default order of use is ALSA, JACK (Linux) and CORE, JACK (OS-X). \param api An optional API id can be specified. \param clientName An optional client name can be specified. This will be used to group the ports that are created by the application. \param queueSizeLimit An optional size of the MIDI input queue can be specified. */ RtMidiIn( RtMidi::Api api=UNSPECIFIED, const std::string clientName = std::string( "RtMidi Input Client"), unsigned int queueSizeLimit = 100 ); //! If a MIDI connection is still open, it will be closed by the destructor. ~RtMidiIn ( void ) throw(); //! Returns the MIDI API specifier for the current instance of RtMidiIn. RtMidi::Api getCurrentApi( void ) throw(); //! Open a MIDI input connection given by enumeration number. /*! \param portNumber An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. \param portName An optional name for the application port that is used to connect to portId can be specified. */ void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi Input" ) ); //! Create a virtual input port, with optional name, to allow software connections (OS X, JACK and ALSA only). /*! This function creates a virtual MIDI input port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X, any JACK, and Linux ALSA APIs (the function returns an error for the other APIs). \param portName An optional name for the application port that is used to connect to portId can be specified. */ void openVirtualPort( const std::string portName = std::string( "RtMidi Input" ) ); //! Set a callback function to be invoked for incoming MIDI messages. /*! The callback function will be called whenever an incoming MIDI message is received. While not absolutely necessary, it is best to set the callback function before opening a MIDI port to avoid leaving some messages in the queue. \param callback A callback function must be given. \param userData Optionally, a pointer to additional data can be passed to the callback function whenever it is called. */ void setCallback( RtMidiCallback callback, void *userData = 0 ); //! Cancel use of the current callback function (if one exists). /*! Subsequent incoming MIDI messages will be written to the queue and can be retrieved with the \e getMessage function. */ void cancelCallback(); //! Close an open MIDI connection (if one exists). void closePort( void ); //! Returns true if a port is open and false if not. virtual bool isPortOpen() const; //! Return the number of available MIDI input ports. /*! \return This function returns the number of MIDI ports of the selected API. */ unsigned int getPortCount(); //! Return a string identifier for the specified MIDI input port number. /*! \return The name of the port with the given Id is returned. \retval An empty string is returned if an invalid port specifier is provided. */ std::string getPortName( unsigned int portNumber = 0 ); //! Specify whether certain MIDI message types should be queued or ignored during input. /*! By default, MIDI timing and active sensing messages are ignored during message input because of their relative high data rates. MIDI sysex messages are ignored by default as well. Variable values of "true" imply that the respective message type will be ignored. */ void ignoreTypes( bool midiSysex = true, bool midiTime = true, bool midiSense = true ); //! Fill the user-provided vector with the data bytes for the next available MIDI message in the input queue and return the event delta-time in seconds. /*! This function returns immediately whether a new message is available or not. A valid message is indicated by a non-zero vector size. An exception is thrown if an error occurs during message retrieval or an input connection was not previously established. */ double getMessage( std::vector *message ); //! Set an error callback function to be invoked when an error has occured. /*! The callback function will be called whenever an error has occured. It is best to set the error callback function before opening a port. */ virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL ); protected: void openMidiApi( RtMidi::Api api, const std::string clientName, unsigned int queueSizeLimit ); }; /**********************************************************************/ /*! \class RtMidiOut \brief A realtime MIDI output class. This class provides a common, platform-independent API for MIDI output. It allows one to probe available MIDI output ports, to connect to one such port, and to send MIDI bytes immediately over the connection. Create multiple instances of this class to connect to more than one MIDI device at the same time. With the OS-X, Linux ALSA and JACK MIDI APIs, it is also possible to open a virtual port to which other MIDI software clients can connect. by Gary P. Scavone, 2003-2014. */ /**********************************************************************/ class RtMidiOut : public RtMidi { public: //! Default constructor that allows an optional client name. /*! An exception will be thrown if a MIDI system initialization error occurs. If no API argument is specified and multiple API support has been compiled, the default order of use is ALSA, JACK (Linux) and CORE, JACK (OS-X). */ RtMidiOut( RtMidi::Api api=UNSPECIFIED, const std::string clientName = std::string( "RtMidi Output Client") ); //! The destructor closes any open MIDI connections. ~RtMidiOut( void ) throw(); //! Returns the MIDI API specifier for the current instance of RtMidiOut. RtMidi::Api getCurrentApi( void ) throw(); //! Open a MIDI output connection. /*! An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. An exception is thrown if an error occurs while attempting to make the port connection. */ void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi Output" ) ); //! Close an open MIDI connection (if one exists). void closePort( void ); //! Returns true if a port is open and false if not. virtual bool isPortOpen() const; //! Create a virtual output port, with optional name, to allow software connections (OS X, JACK and ALSA only). /*! This function creates a virtual MIDI output port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X, Linux ALSA and JACK APIs (the function does nothing with the other APIs). An exception is thrown if an error occurs while attempting to create the virtual port. */ void openVirtualPort( const std::string portName = std::string( "RtMidi Output" ) ); //! Return the number of available MIDI output ports. unsigned int getPortCount( void ); //! Return a string identifier for the specified MIDI port type and number. /*! An empty string is returned if an invalid port specifier is provided. */ std::string getPortName( unsigned int portNumber = 0 ); //! Immediately send a single message out an open MIDI output port. /*! An exception is thrown if an error occurs during output or an output connection was not previously established. */ void sendMessage( std::vector *message ); //! Set an error callback function to be invoked when an error has occured. /*! The callback function will be called whenever an error has occured. It is best to set the error callback function before opening a port. */ virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL ); protected: void openMidiApi( RtMidi::Api api, const std::string clientName ); }; // **************************************************************** // // // MidiInApi / MidiOutApi class declarations. // // Subclasses of MidiInApi and MidiOutApi contain all API- and // OS-specific code necessary to fully implement the RtMidi API. // // Note that MidiInApi and MidiOutApi are abstract base classes and // cannot be explicitly instantiated. RtMidiIn and RtMidiOut will // create instances of a MidiInApi or MidiOutApi subclass. // // **************************************************************** // class MidiApi { public: MidiApi(); virtual ~MidiApi(); virtual RtMidi::Api getCurrentApi( void ) = 0; virtual void openPort( unsigned int portNumber, const std::string portName ) = 0; virtual void openVirtualPort( const std::string portName ) = 0; virtual void closePort( void ) = 0; virtual unsigned int getPortCount( void ) = 0; virtual std::string getPortName( unsigned int portNumber ) = 0; inline bool isPortOpen() const { return connected_; } void setErrorCallback( RtMidiErrorCallback errorCallback ); //! A basic error reporting function for RtMidi classes. void error( RtMidiError::Type type, std::string errorString ); protected: virtual void initialize( const std::string& clientName ) = 0; void *apiData_; bool connected_; std::string errorString_; RtMidiErrorCallback errorCallback_; }; class MidiInApi : public MidiApi { public: MidiInApi( unsigned int queueSizeLimit ); virtual ~MidiInApi( void ); void setCallback( RtMidiIn::RtMidiCallback callback, void *userData ); void cancelCallback( void ); virtual void ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ); double getMessage( std::vector *message ); // A MIDI structure used internally by the class to store incoming // messages. Each message represents one and only one MIDI message. struct MidiMessage { std::vector bytes; double timeStamp; // Default constructor. MidiMessage() :bytes(0), timeStamp(0.0) {} }; struct MidiQueue { unsigned int front; unsigned int back; unsigned int size; unsigned int ringSize; MidiMessage *ring; // Default constructor. MidiQueue() :front(0), back(0), size(0), ringSize(0) {} }; // The RtMidiInData structure is used to pass private class data to // the MIDI input handling function or thread. struct RtMidiInData { MidiQueue queue; MidiMessage message; unsigned char ignoreFlags; bool doInput; bool firstMessage; void *apiData; bool usingCallback; RtMidiIn::RtMidiCallback userCallback; void *userData; bool continueSysex; // Default constructor. RtMidiInData() : ignoreFlags(7), doInput(false), firstMessage(true), apiData(0), usingCallback(false), userCallback(0), userData(0), continueSysex(false) {} }; protected: RtMidiInData inputData_; }; class MidiOutApi : public MidiApi { public: MidiOutApi( void ); virtual ~MidiOutApi( void ); virtual void sendMessage( std::vector *message ) = 0; }; // **************************************************************** // // // Inline RtMidiIn and RtMidiOut definitions. // // **************************************************************** // inline RtMidi::Api RtMidiIn :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } inline void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { rtapi_->openPort( portNumber, portName ); } inline void RtMidiIn :: openVirtualPort( const std::string portName ) { rtapi_->openVirtualPort( portName ); } inline void RtMidiIn :: closePort( void ) { rtapi_->closePort(); } inline bool RtMidiIn :: isPortOpen() const { return rtapi_->isPortOpen(); } inline void RtMidiIn :: setCallback( RtMidiCallback callback, void *userData ) { ((MidiInApi *)rtapi_)->setCallback( callback, userData ); } inline void RtMidiIn :: cancelCallback( void ) { ((MidiInApi *)rtapi_)->cancelCallback(); } inline unsigned int RtMidiIn :: getPortCount( void ) { return rtapi_->getPortCount(); } inline std::string RtMidiIn :: getPortName( unsigned int portNumber ) { return rtapi_->getPortName( portNumber ); } inline void RtMidiIn :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { ((MidiInApi *)rtapi_)->ignoreTypes( midiSysex, midiTime, midiSense ); } inline double RtMidiIn :: getMessage( std::vector *message ) { return ((MidiInApi *)rtapi_)->getMessage( message ); } inline void RtMidiIn :: setErrorCallback( RtMidiErrorCallback errorCallback ) { rtapi_->setErrorCallback(errorCallback); } inline RtMidi::Api RtMidiOut :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } inline void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { rtapi_->openPort( portNumber, portName ); } inline void RtMidiOut :: openVirtualPort( const std::string portName ) { rtapi_->openVirtualPort( portName ); } inline void RtMidiOut :: closePort( void ) { rtapi_->closePort(); } inline bool RtMidiOut :: isPortOpen() const { return rtapi_->isPortOpen(); } inline unsigned int RtMidiOut :: getPortCount( void ) { return rtapi_->getPortCount(); } inline std::string RtMidiOut :: getPortName( unsigned int portNumber ) { return rtapi_->getPortName( portNumber ); } inline void RtMidiOut :: sendMessage( std::vector *message ) { ((MidiOutApi *)rtapi_)->sendMessage( message ); } inline void RtMidiOut :: setErrorCallback( RtMidiErrorCallback errorCallback ) { rtapi_->setErrorCallback(errorCallback); } // **************************************************************** // // // MidiInApi and MidiOutApi subclass prototypes. // // **************************************************************** // #if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__) #define __RTMIDI_DUMMY__ #endif #if defined(__MACOSX_CORE__) class MidiInCore: public MidiInApi { public: MidiInCore( const std::string clientName, unsigned int queueSizeLimit ); ~MidiInCore( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::MACOSX_CORE; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); protected: void initialize( const std::string& clientName ); }; class MidiOutCore: public MidiOutApi { public: MidiOutCore( const std::string clientName ); ~MidiOutCore( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::MACOSX_CORE; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); void sendMessage( std::vector *message ); protected: void initialize( const std::string& clientName ); }; #endif #if defined(__UNIX_JACK__) class MidiInJack: public MidiInApi { public: MidiInJack( const std::string clientName, unsigned int queueSizeLimit ); ~MidiInJack( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::UNIX_JACK; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); protected: std::string clientName; void connect( void ); void initialize( const std::string& clientName ); }; class MidiOutJack: public MidiOutApi { public: MidiOutJack( const std::string clientName ); ~MidiOutJack( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::UNIX_JACK; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); void sendMessage( std::vector *message ); protected: std::string clientName; void connect( void ); void initialize( const std::string& clientName ); }; #endif #if defined(__LINUX_ALSA__) class MidiInAlsa: public MidiInApi { public: MidiInAlsa( const std::string clientName, unsigned int queueSizeLimit ); ~MidiInAlsa( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::LINUX_ALSA; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); protected: void initialize( const std::string& clientName ); }; class MidiOutAlsa: public MidiOutApi { public: MidiOutAlsa( const std::string clientName ); ~MidiOutAlsa( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::LINUX_ALSA; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); void sendMessage( std::vector *message ); protected: void initialize( const std::string& clientName ); }; #endif #if defined(__WINDOWS_MM__) class MidiInWinMM: public MidiInApi { public: MidiInWinMM( const std::string clientName, unsigned int queueSizeLimit ); ~MidiInWinMM( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_MM; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); protected: void initialize( const std::string& clientName ); }; class MidiOutWinMM: public MidiOutApi { public: MidiOutWinMM( const std::string clientName ); ~MidiOutWinMM( void ); RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_MM; }; void openPort( unsigned int portNumber, const std::string portName ); void openVirtualPort( const std::string portName ); void closePort( void ); unsigned int getPortCount( void ); std::string getPortName( unsigned int portNumber ); void sendMessage( std::vector *message ); protected: void initialize( const std::string& clientName ); }; #endif #if defined(__RTMIDI_DUMMY__) class MidiInDummy: public MidiInApi { public: MidiInDummy( const std::string /*clientName*/, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ = "MidiInDummy: This class provides no functionality."; error( RtMidiError::WARNING, errorString_ ); } RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; } void openPort( unsigned int /*portNumber*/, const std::string /*portName*/ ) {} void openVirtualPort( const std::string /*portName*/ ) {} void closePort( void ) {} unsigned int getPortCount( void ) { return 0; } std::string getPortName( unsigned int portNumber ) { return ""; } protected: void initialize( const std::string& /*clientName*/ ) {} }; class MidiOutDummy: public MidiOutApi { public: MidiOutDummy( const std::string /*clientName*/ ) { errorString_ = "MidiOutDummy: This class provides no functionality."; error( RtMidiError::WARNING, errorString_ ); } RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; } void openPort( unsigned int /*portNumber*/, const std::string /*portName*/ ) {} void openVirtualPort( const std::string /*portName*/ ) {} void closePort( void ) {} unsigned int getPortCount( void ) { return 0; } std::string getPortName( unsigned int /*portNumber*/ ) { return ""; } void sendMessage( std::vector * /*message*/ ) {} protected: void initialize( const std::string& /*clientName*/ ) {} }; #endif #endif stk-4.5.0/include/RtWvIn.h0000644000076600007660000001032512327014024013121 0ustar gary#ifndef STK_RTWVIN_H #define STK_RTWVIN_H #include "WvIn.h" #include "RtAudio.h" #include "Mutex.h" namespace stk { /***************************************************/ /*! \class RtWvIn \brief STK realtime audio (blocking) input class. This class provides a simplified interface to RtAudio for realtime audio input. It is a subclass of WvIn. This class makes use of RtAudio's callback functionality by creating a large ring-buffer from which data is read. This class should not be used when low-latency is desired. RtWvIn supports multi-channel data in both interleaved and non-interleaved formats. It is important to distinguish the tick() method that computes a single frame (and returns only the specified sample of a multi-channel frame) from the overloaded one that takes an StkFrames object for multi-channel and/or multi-frame data. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class RtWvIn : public WvIn { public: //! Default constructor. /*! The default \e device argument value (zero) will select the default input device on your system. The first device enumerated by the underlying audio API is specified with a value of one. The default buffer size of RT_BUFFER_SIZE is defined in Stk.h. An StkError will be thrown if an error occurs duing instantiation. */ RtWvIn( unsigned int nChannels = 1, StkFloat sampleRate = Stk::sampleRate(), int device = 0, int bufferFrames = RT_BUFFER_SIZE, int nBuffers = 20 ); //! Class destructor. ~RtWvIn(); //! Start the audio input stream. /*! The stream is started automatically, if necessary, when a tick() or tickFrame() method is called. */ void start( void ); //! Stop the audio input stream. /*! It may be necessary to use this method to avoid audio underflow problems if you wish to temporarily stop audio input. */ void stop( void ); //! Return the specified channel value of the last computed frame. /*! For multi-channel files, use the lastFrame() function to get all values from the last computed frame. If the device is stopped, the returned value is 0.0. The \c channel argument must be less than the number of channels in the audio stream (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFloat lastOut( unsigned int channel = 0 ); //! Compute a sample frame and return the specified \c channel value. /*! For multi-channel files, use the lastFrame() function to get all values from the computed frame. If the device is "stopped", it is "started". The \c channel argument must be less than the number of channels in the audio stream (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFloat tick( unsigned int channel = 0 ); //! Fill the StkFrames argument with computed frames and return the same reference. /*! If the device is "stopped", it is "started". The number of channels in the StkFrames argument must equal the number of channels specified during instantiation. However, this is only checked if _STK_DEBUG_ is defined during compilation, in which case an incompatibility will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames ); // This function is not intended for general use but must be // public for access from the audio callback function. void fillBuffer( void *buffer, unsigned int nFrames ); protected: RtAudio adc_; Mutex mutex_; bool stopped_; unsigned int readIndex_; unsigned int writeIndex_; unsigned int framesFilled_; }; inline StkFloat RtWvIn :: lastOut( unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= data_.channels() ) { oStream_ << "RtWvIn::lastOut(): channel argument and audio stream are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif return lastFrame_[channel]; } } // stk namespace #endif stk-4.5.0/include/RtWvOut.h0000644000076600007660000000562712327014024013333 0ustar gary#ifndef STK_RTWVOUT_H #define STK_RTWVOUT_H #include "WvOut.h" #include "RtAudio.h" #include "Mutex.h" namespace stk { /***************************************************/ /*! \class RtWvOut \brief STK realtime audio (blocking) output class. This class provides a simplified interface to RtAudio for realtime audio output. It is a subclass of WvOut. This class makes use of RtAudio's callback functionality by creating a large ring-buffer into which data is written. This class should not be used when low-latency is desired. RtWvOut supports multi-channel data in interleaved format. It is important to distinguish the tick() method that outputs a single sample to all channels in a sample frame from the overloaded one that takes a reference to an StkFrames object for multi-channel and/or multi-frame data. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class RtWvOut : public WvOut { public: //! Default constructor. /*! The default \e device argument value (zero) will select the default output device on your system. The first device enumerated by the underlying audio API is specified with a value of one. The default buffer size of RT_BUFFER_SIZE is defined in Stk.h. An StkError will be thrown if an error occurs duing instantiation. */ RtWvOut( unsigned int nChannels = 1, StkFloat sampleRate = Stk::sampleRate(), int device = 0, int bufferFrames = RT_BUFFER_SIZE, int nBuffers = 20 ); //! Class destructor. ~RtWvOut(); //! Start the audio output stream. /*! The stream is started automatically, if necessary, when a tick() method is called. */ void start( void ); //! Stop the audio output stream. /*! It may be necessary to use this method to avoid undesireable audio buffer cycling if you wish to temporarily stop audio output. */ void stop( void ); //! Output a single sample to all channels in a sample frame. /*! If the device is "stopped", it is "started". */ void tick( const StkFloat sample ); //! Output the StkFrames data. /*! If the device is "stopped", it is "started". The number of channels in the StkFrames argument must equal the number of channels specified during instantiation. However, this is only checked if _STK_DEBUG_ is defined during compilation, in which case an incompatibility will trigger an StkError exception. */ void tick( const StkFrames& frames ); // This function is not intended for general use but must be // public for access from the audio callback function. int readBuffer( void *buffer, unsigned int frameCount ); protected: RtAudio dac_; Mutex mutex_; bool stopped_; unsigned int readIndex_; unsigned int writeIndex_; long framesFilled_; unsigned int status_; // running = 0, emptying buffer = 1, finished = 2 }; } // stk namespace #endif stk-4.5.0/include/Sampler.h0000644000076600007660000000404012327014024013330 0ustar gary#ifndef STK_SAMPLER_H #define STK_SAMPLER_H #include "Instrmnt.h" #include "ADSR.h" #include "FileLoop.h" #include "OnePole.h" namespace stk { /***************************************************/ /*! \class Sampler \brief STK sampling synthesis abstract base class. This instrument provides an ADSR envelope, a one-pole filter, and structures for an arbitrary number of attack and looped files. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Sampler : public Instrmnt { public: //! Default constructor. Sampler( void ); //! Class destructor. virtual ~Sampler( void ); //! Set instrument parameters for a particular frequency. virtual void setFrequency( StkFloat frequency ) = 0; //! Initiate the envelopes with a key-on event and reset the attack waves. void keyOn( void ); //! Signal a key-off event to the envelopes. void keyOff( void ); //! Stop a note with the given amplitude (speed of decay). virtual void noteOff( StkFloat amplitude ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). virtual void controlChange( int number, StkFloat value ) = 0; //! Compute and return one output sample. virtual StkFloat tick( unsigned int channel = 0 ) = 0; //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0; protected: ADSR adsr_; std::vector attacks_; std::vector loops_; OnePole filter_; StkFloat baseFrequency_; std::vector attackRatios_; std::vector loopRatios_; StkFloat attackGain_; StkFloat loopGain_; }; } // stk namespace #endif stk-4.5.0/include/Saxofony.h0000644000076600007660000001163212327014024013540 0ustar gary#ifndef STK_SAXOFONY_H #define STK_SAXOFONY_H #include "Instrmnt.h" #include "DelayL.h" #include "ReedTable.h" #include "OneZero.h" #include "Envelope.h" #include "Noise.h" #include "SineWave.h" namespace stk { /***************************************************/ /*! \class Saxofony \brief STK faux conical bore reed instrument class. This class implements a "hybrid" digital waveguide instrument that can generate a variety of wind-like sounds. It has also been referred to as the "blowed string" model. The waveguide section is essentially that of a string, with one rigid and one lossy termination. The non-linear function is a reed table. The string can be "blown" at any point between the terminations, though just as with strings, it is impossible to excite the system at either end. If the excitation is placed at the string mid-point, the sound is that of a clarinet. At points closer to the "bridge", the sound is closer to that of a saxophone. See Scavone (2002) for more details. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Reed Stiffness = 2 - Reed Aperture = 26 - Noise Gain = 4 - Blow Position = 11 - Vibrato Frequency = 29 - Vibrato Gain = 1 - Breath Pressure = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Saxofony : public Instrmnt { public: //! Class constructor, taking the lowest desired playing frequency. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ Saxofony( StkFloat lowestFrequency ); //! Class destructor. ~Saxofony( void ); //! Reset and clear all internal state. void clear( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Set the "blowing" position between the air column terminations (0.0 - 1.0). void setBlowPosition( StkFloat aPosition ); //! Apply breath pressure to instrument with given amplitude and rate of increase. void startBlowing( StkFloat amplitude, StkFloat rate ); //! Decrease breath pressure with given rate of decrease. void stopBlowing( StkFloat rate ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). void controlChange( int number, StkFloat value ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: DelayL delays_[2]; ReedTable reedTable_; OneZero filter_; Envelope envelope_; Noise noise_; SineWave vibrato_; StkFloat outputGain_; StkFloat noiseGain_; StkFloat vibratoGain_; StkFloat position_; }; inline StkFloat Saxofony :: tick( unsigned int ) { StkFloat pressureDiff; StkFloat breathPressure; StkFloat temp; // Calculate the breath pressure (envelope + noise + vibrato) breathPressure = envelope_.tick(); breathPressure += breathPressure * noiseGain_ * noise_.tick(); breathPressure += breathPressure * vibratoGain_ * vibrato_.tick(); temp = -0.95 * filter_.tick( delays_[0].lastOut() ); lastFrame_[0] = temp - delays_[1].lastOut(); pressureDiff = breathPressure - lastFrame_[0]; delays_[1].tick( temp ); delays_[0].tick( breathPressure - (pressureDiff * reedTable_.tick(pressureDiff)) - temp ); lastFrame_[0] *= outputGain_; return lastFrame_[0]; } inline StkFrames& Saxofony :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Saxofony::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i #include namespace stk { /***************************************************/ /*! \class Shakers \brief PhISEM and PhOLIES class. PhISEM (Physically Informed Stochastic Event Modeling) is an algorithmic approach for simulating collisions of multiple independent sound producing objects. This class is a meta-model that can simulate a Maraca, Sekere, Cabasa, Bamboo Wind Chimes, Water Drops, Tambourine, Sleighbells, and a Guiro. PhOLIES (Physically-Oriented Library of Imitated Environmental Sounds) is a similar approach for the synthesis of environmental sounds. This class implements simulations of breaking sticks, crunchy snow (or not), a wrench, sandpaper, and more. Control Change Numbers: - Shake Energy = 2 - System Decay = 4 - Number Of Objects = 11 - Resonance Frequency = 1 - Shake Energy = 128 - Instrument Selection = 1071 - Maraca = 0 - Cabasa = 1 - Sekere = 2 - Tambourine = 3 - Sleigh Bells = 4 - Bamboo Chimes = 5 - Sand Paper = 6 - Coke Can = 7 - Sticks = 8 - Crunch = 9 - Big Rocks = 10 - Little Rocks = 11 - Next Mug = 12 - Penny + Mug = 13 - Nickle + Mug = 14 - Dime + Mug = 15 - Quarter + Mug = 16 - Franc + Mug = 17 - Peso + Mug = 18 - Guiro = 19 - Wrench = 20 - Water Drops = 21 - Tuned Bamboo Chimes = 22 by Perry R. Cook with updates by Gary Scavone, 1995--2014. */ /***************************************************/ class Shakers : public Instrmnt { public: //! Class constructor taking instrument type argument. Shakers( int type = 0 ); //! Start a note with the given instrument and amplitude. /*! Use the instrument numbers above, converted to frequency values as if MIDI note numbers, to select a particular instrument. */ void noteOn( StkFloat instrument, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). void controlChange( int number, StkFloat value ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); struct BiQuad { StkFloat gain; StkFloat b[3]; StkFloat a[3]; // a0 term assumed equal to 1.0 StkFloat inputs[3]; StkFloat outputs[3]; // Default constructor. BiQuad() { gain = 0.0; for ( int i=0; i<3; i++ ) { b[i] = 0.0; a[i] = 0.0; inputs[i] = 0.0; outputs[i] = 0.0; } } }; protected: void setType( int type ); void setResonance( BiQuad &filter, StkFloat frequency, StkFloat radius ); StkFloat tickResonance( BiQuad &filter, StkFloat input ); void setEqualization( StkFloat b0, StkFloat b1, StkFloat b2 ); StkFloat tickEqualize( StkFloat input ); int randomInt( int max ); StkFloat randomFloat( StkFloat max = 1.0 ); StkFloat noise( void ); void waterDrop( void ); int shakerType_; unsigned int nResonances_; StkFloat shakeEnergy_; StkFloat soundDecay_; StkFloat systemDecay_; StkFloat nObjects_; StkFloat sndLevel_; StkFloat baseGain_; StkFloat currentGain_; StkFloat baseDecay_; StkFloat baseObjects_; StkFloat decayScale_; BiQuad equalizer_; StkFloat ratchetCount_; StkFloat ratchetDelta_; StkFloat baseRatchetDelta_; int lastRatchetValue_; std::vector< BiQuad > filters_; std::vector< StkFloat > baseFrequencies_; std::vector< StkFloat > baseRadii_; std::vector< bool > doVaryFrequency_; std::vector< StkFloat > tempFrequencies_; StkFloat varyFactor_; }; inline void Shakers :: setResonance( BiQuad &filter, StkFloat frequency, StkFloat radius ) { filter.a[1] = -2.0 * radius * cos( TWO_PI * frequency / Stk::sampleRate()); filter.a[2] = radius * radius; } inline StkFloat Shakers :: tickResonance( BiQuad &filter, StkFloat input ) { filter.outputs[0] = input * filter.gain * currentGain_; filter.outputs[0] -= filter.a[1] * filter.outputs[1] + filter.a[2] * filter.outputs[2]; filter.outputs[2] = filter.outputs[1]; filter.outputs[1] = filter.outputs[0]; return filter.outputs[0]; } inline void Shakers :: setEqualization( StkFloat b0, StkFloat b1, StkFloat b2 ) { equalizer_.b[0] = b0; equalizer_.b[1] = b1; equalizer_.b[2] = b2; } inline StkFloat Shakers :: tickEqualize( StkFloat input ) { equalizer_.inputs[0] = input; equalizer_.outputs[0] = equalizer_.b[0] * equalizer_.inputs[0] + equalizer_.b[1] * equalizer_.inputs[1] + equalizer_.b[2] * equalizer_.inputs[2]; equalizer_.inputs[2] = equalizer_.inputs[1]; equalizer_.inputs[1] = equalizer_.inputs[0]; return equalizer_.outputs[0]; } inline int Shakers :: randomInt( int max ) // Return random integer between 0 and max-1 { return (int) ((float)max * rand() / (RAND_MAX + 1.0) ); } inline StkFloat Shakers :: randomFloat( StkFloat max ) // Return random float between 0.0 and max { return (StkFloat) (max * rand() / (RAND_MAX + 1.0) ); } inline StkFloat Shakers :: noise( void ) // Return random StkFloat float between -1.0 and 1.0 { return ( (StkFloat) ( 2.0 * rand() / (RAND_MAX + 1.0) ) - 1.0 ); } const StkFloat MIN_ENERGY = 0.001; const StkFloat WATER_FREQ_SWEEP = 1.0001; inline void Shakers :: waterDrop( void ) { if ( randomInt( 32767 ) < nObjects_) { sndLevel_ = shakeEnergy_; unsigned int j = randomInt( 3 ); if ( j == 0 && filters_[0].gain == 0.0 ) { // don't change unless fully decayed tempFrequencies_[0] = baseFrequencies_[1] * (0.75 + (0.25 * noise())); filters_[0].gain = fabs( noise() ); } else if (j == 1 && filters_[1].gain == 0.0) { tempFrequencies_[1] = baseFrequencies_[1] * (1.0 + (0.25 * noise())); filters_[1].gain = fabs( noise() ); } else if ( filters_[2].gain == 0.0 ) { tempFrequencies_[2] = baseFrequencies_[1] * (1.25 + (0.25 * noise())); filters_[2].gain = fabs( noise() ); } } // Sweep center frequencies. for ( unsigned int i=0; i<3; i++ ) { // WATER_RESONANCES = 3 filters_[i].gain *= baseRadii_[i]; if ( filters_[i].gain > 0.001 ) { tempFrequencies_[i] *= WATER_FREQ_SWEEP; filters_[i].a[1] = -2.0 * baseRadii_[i] * cos( TWO_PI * tempFrequencies_[i] / Stk::sampleRate() ); } else filters_[i].gain = 0.0; } } inline StkFloat Shakers :: tick( unsigned int ) { unsigned int iTube = 0; StkFloat input = 0.0; if ( shakerType_ == 19 || shakerType_ == 20 ) { if ( ratchetCount_ <= 0 ) return lastFrame_[0] = 0.0; shakeEnergy_ -= ( ratchetDelta_ + ( 0.002 * shakeEnergy_ ) ); if ( shakeEnergy_ < 0.0 ) { shakeEnergy_ = 1.0; ratchetCount_--; } if ( randomFloat( 1024 ) < nObjects_ ) sndLevel_ += shakeEnergy_ * shakeEnergy_; // Sound is enveloped noise input = sndLevel_ * noise() * shakeEnergy_; } else { if ( shakeEnergy_ < MIN_ENERGY ) return lastFrame_[0] = 0.0; // Exponential system decay shakeEnergy_ *= systemDecay_; // Random events if ( shakerType_ == 21 ) { waterDrop(); input = sndLevel_; } else { if ( randomFloat( 1024.0 ) < nObjects_ ) { sndLevel_ += shakeEnergy_; input = sndLevel_; // Vary resonance frequencies if specified. for ( unsigned int i=0; i 1.0 ) // std::cout << "lastOutput = " << lastFrame_[0] << std::endl; return lastFrame_[0]; } inline StkFrames& Shakers :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Shakers::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; itick(); biquad_.tick( noise_.tick() ); lastFrame_[0] += (1.0 - loopGain_) * biquad_.lastOut(); lastFrame_[0] = filter_.tick( lastFrame_[0] ); lastFrame_[0] *= adsr_.tick(); return lastFrame_[0]; } inline StkFrames& Simple :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Simple::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i= TABLE_SIZE ) time_ -= TABLE_SIZE; iIndex_ = (unsigned int) time_; alpha_ = time_ - iIndex_; StkFloat tmp = table_[ iIndex_ ]; tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) ); // Increment time, which can be negative. time_ += rate_; lastFrame_[0] = tmp; return lastFrame_[0]; } inline StkFrames& SineWave :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "SineWave::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; StkFloat tmp = 0.0; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= TABLE_SIZE ) time_ -= TABLE_SIZE; iIndex_ = (unsigned int) time_; alpha_ = time_ - iIndex_; tmp = table_[ iIndex_ ]; tmp += ( alpha_ * ( table_[ iIndex_ + 1 ] - tmp ) ); *samples = tmp; // Increment time, which can be negative. time_ += rate_; } lastFrame_[0] = tmp; return frames; } } // stk namespace #endif stk-4.5.0/include/SingWave.h0000644000076600007660000000763312327014024013463 0ustar gary#ifndef STK_SINGWAVE_H #define STK_SINGWAVE_H #include "FileLoop.h" #include "Modulate.h" #include "Envelope.h" namespace stk { /***************************************************/ /*! \class SingWave \brief STK "singing" looped soundfile class. This class loops a specified soundfile and modulates it both periodically and randomly to produce a pitched musical sound, like a simple voice or violin. In general, it is not be used alone because of "munchkinification" effects from pitch shifting. Within STK, it is used as an excitation source for other instruments. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class SingWave : public Generator { public: //! Class constructor taking filename argument. /*! An StkError will be thrown if the file is not found, its format is unknown, or a read error occurs. If the soundfile has no header, the second argument should be \e true and the file data will be assumed to consist of 16-bit signed integers in big-endian byte order at a sample rate of 22050 Hz. */ SingWave( std::string fileName, bool raw = false ); //! Class destructor. ~SingWave( void ); //! Reset file to beginning. void reset( void ) { wave_.reset(); lastFrame_[0] = 0.0; }; //! Normalize the file to a maximum of +-1.0. void normalize( void ) { wave_.normalize(); }; //! Normalize the file to a maximum of \e +- peak. void normalize( StkFloat peak ) { wave_.normalize( peak ); }; //! Set looping parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Set the vibrato frequency in Hz. void setVibratoRate( StkFloat rate ) { modulator_.setVibratoRate( rate ); }; //! Set the vibrato gain. void setVibratoGain( StkFloat gain ) { modulator_.setVibratoGain( gain ); }; //! Set the random-ness amount. void setRandomGain( StkFloat gain ) { modulator_.setRandomGain( gain ); }; //! Set the sweep rate. void setSweepRate( StkFloat rate ) { sweepRate_ = rate; }; //! Set the gain rate. void setGainRate( StkFloat rate ) { envelope_.setRate( rate ); }; //! Set the gain target value. void setGainTarget( StkFloat target ) { envelope_.setTarget( target ); }; //! Start a note. void noteOn( void ) { envelope_.keyOn(); }; //! Stop a note. void noteOff( void ) { envelope_.keyOff(); }; //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Compute and return one output sample. StkFloat tick( void ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: FileLoop wave_; Modulate modulator_; Envelope envelope_; Envelope pitchEnvelope_; StkFloat rate_; StkFloat sweepRate_; }; inline StkFloat SingWave :: tick( void ) { // Set the wave rate. StkFloat newRate = pitchEnvelope_.tick(); newRate += newRate * modulator_.tick(); wave_.setRate( newRate ); lastFrame_[0] = wave_.tick(); lastFrame_[0] *= envelope_.tick(); return lastFrame_[0]; } inline StkFrames& SingWave :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "SingWave::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i namespace stk { /***************************************************/ /*! \class Sitar \brief STK sitar string model class. This class implements a sitar plucked string physical model based on the Karplus-Strong algorithm. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. There exist at least two patents, assigned to Stanford, bearing the names of Karplus and/or Strong. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Sitar : public Instrmnt { public: //! Class constructor, taking the lowest desired playing frequency. Sitar( StkFloat lowestFrequency = 8.0 ); //! Class destructor. ~Sitar( void ); //! Reset and clear all internal state. void clear( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Pluck the string with the given amplitude using the current frequency. void pluck( StkFloat amplitude ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: DelayA delayLine_; OneZero loopFilter_; Noise noise_; ADSR envelope_; StkFloat loopGain_; StkFloat amGain_; StkFloat delay_; StkFloat targetDelay_; }; inline StkFloat Sitar :: tick( unsigned int ) { if ( fabs(targetDelay_ - delay_) > 0.001 ) { if ( targetDelay_ < delay_ ) delay_ *= 0.99999; else delay_ *= 1.00001; delayLine_.setDelay( delay_ ); } lastFrame_[0] = delayLine_.tick( loopFilter_.tick( delayLine_.lastOut() * loopGain_ ) + (amGain_ * envelope_.tick() * noise_.tick())); return lastFrame_[0]; } inline StkFrames& Sitar :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Sitar::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i #include #include namespace stk { /***************************************************/ /*! \class Skini \brief STK SKINI parsing class This class parses SKINI formatted text messages. It can be used to parse individual messages or it can be passed an entire file. The SKINI specification is Perry's and his alone, but it's all text so it shouldn't be too hard to figure out. SKINI (Synthesis toolKit Instrument Network Interface) is like MIDI, but allows for floating-point control changes, note numbers, etc. The following example causes a sharp middle C to be played with a velocity of 111.132: \code noteOn 60.01 111.132 \endcode \sa \ref skini by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Skini : public Stk { public: //! A message structure to store and pass parsed SKINI messages. struct Message { long type; /*!< The message type, as defined in SKINI.msg. */ long channel; /*!< The message channel (not limited to 16!). */ StkFloat time; /*!< The message time stamp in seconds (delta or absolute). */ std::vector floatValues; /*!< The message values read as floats (values are type-specific). */ std::vector intValues; /*!< The message values read as ints (number and values are type-specific). */ std::string remainder; /*!< Any remaining message data, read as ascii text. */ // Default constructor. Message() :type(0), channel(0), time(0.0), floatValues(2), intValues(2) {} }; //! Default constructor. Skini(); //! Class destructor ~Skini(); //! Set a SKINI formatted file for reading. /*! If the file is successfully opened, this function returns \e true. Otherwise, \e false is returned. */ bool setFile( std::string fileName ); //! Parse the next file message (if a file is loaded) and return the message type. /*! This function skips over lines in a file which cannot be parsed. A type value equal to zero in the referenced message structure (and the returned value) indicates the file end is reached or no file is open for reading. */ long nextMessage( Skini::Message& message ); //! Attempt to parse the given string and returning the message type. /*! A type value equal to zero in the referenced message structure indicates an invalid message. */ long parseString( std::string& line, Skini::Message& message ); //! Return the SKINI type string for the given type value. static std::string whatsThisType(long type); //! Return the SKINI controller string for the given controller number. static std::string whatsThisController(long number); protected: void tokenize( const std::string& str, std::vector& tokens, const std::string& delimiters ); std::ifstream file_; }; //! A static table of equal-tempered MIDI to frequency (Hz) values. static const double Midi2Pitch[129] = { 8.176, 8.662, 9.177, 9.723, 10.301, 10.913, 11.562, 12.25, 12.978, 13.75, 14.568, 15.434, 16.352, 17.324, 18.354, 19.445, 20.602, 21.827, 23.125, 24.50, 25.957, 27.50, 29.135, 30.868, 32.703, 34.648, 36.708, 38.891, 41.203, 43.654, 46.249, 49.0, 51.913, 55.0, 58.271, 61.735, 65.406, 69.296, 73.416, 77.782, 82.407, 87.307, 92.499, 97.999, 103.826, 110.0, 116.541, 123.471, 130.813, 138.591, 146.832, 155.563, 164.814, 174.614, 184.997, 195.998, 207.652, 220.0, 233.082, 246.942, 261.626, 277.183, 293.665, 311.127, 329.628, 349.228, 369.994, 391.995, 415.305, 440.0, 466.164, 493.883, 523.251, 554.365, 587.33, 622.254, 659.255, 698.456, 739.989, 783.991, 830.609, 880.0, 932.328, 987.767, 1046.502, 1108.731, 1174.659, 1244.508, 1318.51, 1396.913, 1479.978, 1567.982, 1661.219, 1760.0, 1864.655, 1975.533, 2093.005, 2217.461, 2349.318, 2489.016, 2637.02, 2793.826, 2959.955, 3135.963, 3322.438, 3520.0, 3729.31, 3951.066, 4186.009, 4434.922, 4698.636, 4978.032, 5274.041, 5587.652, 5919.911, 6271.927, 6644.875, 7040.0, 7458.62, 7902.133, 8372.018, 8869.844, 9397.273, 9956.063, 10548.082, 11175.303, 11839.822, 12543.854, 13289.75}; } // stk namespace #endif stk-4.5.0/include/SKINI.msg0000644000076600007660000001056012327014024013145 0ustar gary/*********************************************************/ /* Definition of SKINI Message Types and Special Symbols Synthesis toolKit Instrument Network Interface These symbols should have the form: \c __SK__ where is the string used in the SKINI stream. by Perry R. Cook, 1995--2014. */ /*********************************************************/ namespace stk { #define NOPE -32767 #define YEP 1 #define SK_DBL -32766 #define SK_INT -32765 #define SK_STR -32764 #define __SK_Exit_ 999 /***** MIDI COMPATIBLE MESSAGES *****/ /*** (Status bytes for channel=0) ***/ #define __SK_NoteOff_ 128 #define __SK_NoteOn_ 144 #define __SK_PolyPressure_ 160 #define __SK_ControlChange_ 176 #define __SK_ProgramChange_ 192 #define __SK_AfterTouch_ 208 #define __SK_ChannelPressure_ __SK_AfterTouch_ #define __SK_PitchWheel_ 224 #define __SK_PitchBend_ __SK_PitchWheel_ #define __SK_PitchChange_ 49 #define __SK_Clock_ 248 #define __SK_SongStart_ 250 #define __SK_Continue_ 251 #define __SK_SongStop_ 252 #define __SK_ActiveSensing_ 254 #define __SK_SystemReset_ 255 #define __SK_Volume_ 7 #define __SK_ModWheel_ 1 #define __SK_Modulation_ __SK_ModWheel_ #define __SK_Breath_ 2 #define __SK_FootControl_ 4 #define __SK_Portamento_ 65 #define __SK_Balance_ 8 #define __SK_Pan_ 10 #define __SK_Sustain_ 64 #define __SK_Damper_ __SK_Sustain_ #define __SK_Expression_ 11 #define __SK_AfterTouch_Cont_ 128 #define __SK_ModFrequency_ __SK_Expression_ #define __SK_ProphesyRibbon_ 16 #define __SK_ProphesyWheelUp_ 2 #define __SK_ProphesyWheelDown_ 3 #define __SK_ProphesyPedal_ 18 #define __SK_ProphesyKnob1_ 21 #define __SK_ProphesyKnob2_ 22 /*** Instrument Family Specific ***/ #define __SK_NoiseLevel_ __SK_FootControl_ #define __SK_PickPosition_ __SK_FootControl_ #define __SK_StringDamping_ __SK_Expression_ #define __SK_StringDetune_ __SK_ModWheel_ #define __SK_BodySize_ __SK_Breath_ #define __SK_BowPressure_ __SK_Breath_ #define __SK_BowPosition_ __SK_PickPosition_ #define __SK_BowBeta_ __SK_BowPosition_ #define __SK_ReedStiffness_ __SK_Breath_ #define __SK_ReedRestPos_ __SK_FootControl_ #define __SK_FluteEmbouchure_ __SK_Breath_ #define __SK_JetDelay_ __SK_FluteEmbouchure_ #define __SK_LipTension_ __SK_Breath_ #define __SK_SlideLength_ __SK_FootControl_ #define __SK_StrikePosition_ __SK_PickPosition_ #define __SK_StickHardness_ __SK_Breath_ #define __SK_TrillDepth_ 1051 #define __SK_TrillSpeed_ 1052 #define __SK_StrumSpeed_ __SK_TrillSpeed_ #define __SK_RollSpeed_ __SK_TrillSpeed_ #define __SK_FilterQ_ __SK_Breath_ #define __SK_FilterFreq_ 1062 #define __SK_FilterSweepRate_ __SK_FootControl_ #define __SK_ShakerInst_ 1071 #define __SK_ShakerEnergy_ __SK_Breath_ #define __SK_ShakerDamping_ __SK_ModFrequency_ #define __SK_ShakerNumObjects_ __SK_FootControl_ #define __SK_Strumming_ 1090 #define __SK_NotStrumming_ 1091 #define __SK_Trilling_ 1092 #define __SK_NotTrilling_ 1093 #define __SK_Rolling_ __SK_Strumming_ #define __SK_NotRolling_ __SK_NotStrumming_ #define __SK_PlayerSkill_ 2001 #define __SK_Chord_ 2002 #define __SK_ChordOff_ 2003 #define __SK_SINGER_FilePath_ 3000 #define __SK_SINGER_Frequency_ 3001 #define __SK_SINGER_NoteName_ 3002 #define __SK_SINGER_Shape_ 3003 #define __SK_SINGER_Glot_ 3004 #define __SK_SINGER_VoicedUnVoiced_ 3005 #define __SK_SINGER_Synthesize_ 3006 #define __SK_SINGER_Silence_ 3007 #define __SK_SINGER_VibratoAmt_ __SK_ModWheel_ #define __SK_SINGER_RndVibAmt_ 3008 #define __SK_SINGER_VibFreq_ __SK_Expression_ } // stk namespace stk-4.5.0/include/SKINI.tbl0000644000076600007660000002071212327014024013140 0ustar gary #include "SKINI.msg" namespace stk { #define __SK_MaxMsgTypes_ 80 struct SkiniSpec { char messageString[32]; long type; long data2; long data3; }; /* SEE COMMENT BLOCK AT BOTTOM FOR FIELDS AND USES */ /* MessageString , type, data2, data3 */ struct SkiniSpec skini_msgs[__SK_MaxMsgTypes_] = { {"NoteOff" , __SK_NoteOff_, SK_DBL, SK_DBL}, {"NoteOn" , __SK_NoteOn_, SK_DBL, SK_DBL}, {"PolyPressure" , __SK_PolyPressure_, SK_DBL, SK_DBL}, {"ControlChange" , __SK_ControlChange_, SK_INT, SK_DBL}, {"ProgramChange" , __SK_ProgramChange_, SK_DBL, NOPE}, {"AfterTouch" , __SK_AfterTouch_, SK_DBL, NOPE}, {"ChannelPressure" ,__SK_ChannelPressure_, SK_DBL, NOPE}, {"PitchWheel" , __SK_PitchWheel_, SK_DBL, NOPE}, {"PitchBend" , __SK_PitchBend_, SK_DBL, NOPE}, {"PitchChange" , __SK_PitchChange_, SK_DBL, NOPE}, {"Clock" , __SK_Clock_, NOPE, NOPE}, {"Undefined" , 249, NOPE, NOPE}, {"SongStart" , __SK_SongStart_, NOPE, NOPE}, {"Continue" , __SK_Continue_, NOPE, NOPE}, {"SongStop" , __SK_SongStop_, NOPE, NOPE}, {"Undefined" , 253, NOPE, NOPE}, {"ActiveSensing" , __SK_ActiveSensing_, NOPE, NOPE}, {"SystemReset" , __SK_SystemReset_, NOPE, NOPE}, {"Volume" , __SK_ControlChange_, __SK_Volume_ , SK_DBL}, {"ModWheel" , __SK_ControlChange_, __SK_ModWheel_ , SK_DBL}, {"Modulation" , __SK_ControlChange_, __SK_Modulation_ , SK_DBL}, {"Breath" , __SK_ControlChange_, __SK_Breath_ , SK_DBL}, {"FootControl" , __SK_ControlChange_, __SK_FootControl_ , SK_DBL}, {"Portamento" , __SK_ControlChange_, __SK_Portamento_ , SK_DBL}, {"Balance" , __SK_ControlChange_, __SK_Balance_ , SK_DBL}, {"Pan" , __SK_ControlChange_, __SK_Pan_ , SK_DBL}, {"Sustain" , __SK_ControlChange_, __SK_Sustain_ , SK_DBL}, {"Damper" , __SK_ControlChange_, __SK_Damper_ , SK_DBL}, {"Expression" , __SK_ControlChange_, __SK_Expression_ , SK_DBL}, {"NoiseLevel" , __SK_ControlChange_, __SK_NoiseLevel_ , SK_DBL}, {"PickPosition" , __SK_ControlChange_, __SK_PickPosition_ , SK_DBL}, {"StringDamping" , __SK_ControlChange_, __SK_StringDamping_ , SK_DBL}, {"StringDetune" , __SK_ControlChange_, __SK_StringDetune_ , SK_DBL}, {"BodySize" , __SK_ControlChange_, __SK_BodySize_ , SK_DBL}, {"BowPressure" , __SK_ControlChange_, __SK_BowPressure_ , SK_DBL}, {"BowPosition" , __SK_ControlChange_, __SK_BowPosition_ , SK_DBL}, {"BowBeta" , __SK_ControlChange_, __SK_BowBeta_ , SK_DBL}, {"ReedStiffness" , __SK_ControlChange_, __SK_ReedStiffness_ , SK_DBL}, {"ReedRestPos" , __SK_ControlChange_, __SK_ReedRestPos_ , SK_DBL}, {"FluteEmbouchure" , __SK_ControlChange_, __SK_FluteEmbouchure_ , SK_DBL}, {"LipTension" , __SK_ControlChange_, __SK_LipTension_ , SK_DBL}, {"StrikePosition" , __SK_ControlChange_, __SK_StrikePosition_ , SK_DBL}, {"StickHardness" , __SK_ControlChange_, __SK_StickHardness_ , SK_DBL}, {"TrillDepth" , __SK_ControlChange_, __SK_TrillDepth_ , SK_DBL}, {"TrillSpeed" , __SK_ControlChange_, __SK_TrillSpeed_ , SK_DBL}, {"Strumming" , __SK_ControlChange_, __SK_Strumming_ , 127 }, {"NotStrumming" , __SK_ControlChange_, __SK_Strumming_ , 0 }, {"PlayerSkill" , __SK_ControlChange_, __SK_PlayerSkill_ , SK_DBL}, {"Chord" , __SK_Chord_ , SK_DBL, SK_STR}, {"ChordOff" , __SK_ChordOff_ , SK_DBL, NOPE}, {"ShakerInst" , __SK_ControlChange_, __SK_ShakerInst_ , SK_DBL}, {"Maraca" , __SK_ControlChange_, __SK_ShakerInst_ , 0 }, {"Sekere" , __SK_ControlChange_, __SK_ShakerInst_ , 1 }, {"Cabasa" , __SK_ControlChange_, __SK_ShakerInst_ , 2 }, {"Bamboo" , __SK_ControlChange_, __SK_ShakerInst_ , 3 }, {"Waterdrp" , __SK_ControlChange_, __SK_ShakerInst_ , 4 }, {"Tambourn" , __SK_ControlChange_, __SK_ShakerInst_ , 5 }, {"Sleighbl" , __SK_ControlChange_, __SK_ShakerInst_ , 6 }, {"Guiro" , __SK_ControlChange_, __SK_ShakerInst_ , 7 }, {"OpenFile" , 256, SK_STR, NOPE}, {"SetPath" , 257, SK_STR, NOPE}, {"FilePath" , __SK_SINGER_FilePath_ , SK_STR, NOPE}, {"Frequency" , __SK_SINGER_Frequency_ , SK_STR, NOPE}, {"NoteName" , __SK_SINGER_NoteName_ , SK_STR, NOPE}, {"VocalShape" , __SK_SINGER_Shape_ , SK_STR, NOPE}, {"Glottis" , __SK_SINGER_Glot_ , SK_STR, NOPE}, {"VoicedUnVoiced" , __SK_SINGER_VoicedUnVoiced_, SK_DBL, SK_STR}, {"Synthesize" , __SK_SINGER_Synthesize_ , SK_STR, NOPE}, {"Silence" , __SK_SINGER_Silence_ , SK_STR, NOPE}, {"RndVibAmt" , __SK_SINGER_RndVibAmt_ , SK_STR, NOPE}, {"VibratoAmt" , __SK_ControlChange_ ,__SK_SINGER_VibratoAmt_,SK_DBL}, {"VibFreq" , __SK_ControlChange_ ,__SK_SINGER_VibFreq_ ,SK_DBL} }; /** FORMAT: *************************************************************/ /* */ /* MessageStr$ , type, data2, data3, */ /* */ /* type is the message type sent back from the SKINI line parser. */ /* data is either */ /* NOPE : field not used, specifically, there aren't going */ /* to be any more fields on this line. So if there */ /* is NOPE in data2, data3 won't even be checked */ /* SK_INT : byte (actually scanned as 32 bit signed integer) */ /* If it's a MIDI data field which is required to */ /* be an integer, like a controller number, it's */ /* 0-127. Otherwise, get creative with SK_INTs. */ /* SK_DBL : double precision floating point. SKINI uses these */ /* in the MIDI context for note numbers with micro */ /* tuning, velocities, controller values, etc. */ /* SK_STR : only valid in final field. This allows (nearly) */ /* arbitrary message types to be supported by simply */ /* scanning the string to EndOfLine and then passing */ /* it to a more intelligent handler. For example, */ /* MIDI SYSEX (system exclusive) messages of up to */ /* 256 bytes can be read as space-delimited integers */ /* into the SK_STR buffer. Longer bulk dumps, */ /* soundfiles, etc. should be handled as a new */ /* message type pointing to a FileName stored in the */ /* SK_STR field, or as a new type of multi-line */ /* message. */ /* */ /*************************************************************************/ } // stk namespace stk-4.5.0/include/Socket.h0000644000076600007660000000455512327014024013170 0ustar gary#ifndef STK_SOCKET_H #define STK_SOCKET_H #include "Stk.h" #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) #include #include #include #include #include #include #include #include #elif defined(__OS_WINDOWS__) #include #endif namespace stk { /***************************************************/ /*! \class Socket \brief STK internet socket abstract base class. This class provides common functionality for TCP and UDP internet socket server and client subclasses. This class also provides a number of static functions for use with external socket descriptors. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Socket : public Stk { public: enum ProtocolType { PROTO_TCP, PROTO_UDP }; //! Class constructor Socket(); //! Class destructor. virtual ~Socket(); //! Close the socket. static void close( int socket ); //! Return the socket descriptor. int id( void ) const { return soket_; }; //! Return the socket port number. int port( void ) const { return port_; }; //! Returns true if the socket descriptor is valid. static bool isValid( int socket ) { return socket != -1; }; //! If enable = false, the socket is set to non-blocking mode. When first created, sockets are by default in blocking mode. static void setBlocking( int socket, bool enable ); //! Write a buffer over the socket connection. Returns the number of bytes written or -1 if an error occurs. virtual int writeBuffer(const void *buffer, long bufferSize, int flags = 0) = 0; //! Read an input buffer, up to length \e bufferSize. Returns the number of bytes read or -1 if an error occurs. virtual int readBuffer(void *buffer, long bufferSize, int flags = 0) = 0; //! Write a buffer via the specified socket. Returns the number of bytes written or -1 if an error occurs. static int writeBuffer(int socket, const void *buffer, long bufferSize, int flags ); //! Read a buffer via the specified socket. Returns the number of bytes read or -1 if an error occurs. static int readBuffer(int socket, void *buffer, long bufferSize, int flags ); protected: int soket_; int port_; }; } // stk namespace #endif stk-4.5.0/include/Sphere.h0000644000076600007660000000441212327014024013156 0ustar gary#ifndef STK_SPHERE_H #define STK_SPHERE_H #include "Stk.h" #include "Vector3D.h" namespace stk { /***************************************************/ /*! \class Sphere \brief STK sphere class. This class implements a spherical ball with radius, mass, position, and velocity parameters. by Perry R. Cook, 1995--2014. */ /***************************************************/ class Sphere : public Stk { public: //! Constructor taking an initial radius value. Sphere( StkFloat radius = 1.0 ) { radius_ = radius; mass_ = 1.0; }; //! Set the 3D center position of the sphere. void setPosition( StkFloat x, StkFloat y, StkFloat z ) { position_.setXYZ(x, y, z); }; //! Set the 3D velocity of the sphere. void setVelocity( StkFloat x, StkFloat y, StkFloat z ) { velocity_.setXYZ(x, y, z); }; //! Set the radius of the sphere. void setRadius( StkFloat radius ) { radius_ = radius; }; //! Set the mass of the sphere. void setMass( StkFloat mass ) { mass_ = mass; }; //! Get the current position of the sphere as a 3D vector. Vector3D* getPosition( void ) { return &position_; }; //! Get the relative position of the given point to the sphere as a 3D vector. Vector3D* getRelativePosition( Vector3D *position ); //! Set the velcoity of the sphere as a 3D vector. StkFloat getVelocity( Vector3D* velocity ); //! Returns the distance from the sphere boundary to the given position (< 0 if inside). StkFloat isInside( Vector3D *position ); //! Get the current sphere radius. StkFloat getRadius( void ) { return radius_; }; //! Get the current sphere mass. StkFloat getMass( void ) { return mass_; }; //! Increase the current sphere velocity by the given 3D components. void addVelocity( StkFloat x, StkFloat y, StkFloat z ); //! Move the sphere for the given time increment. void tick( StkFloat timeIncrement ); private: Vector3D position_; Vector3D velocity_; Vector3D workingVector_; StkFloat radius_; StkFloat mass_; }; inline void Sphere::tick( StkFloat timeIncrement ) { position_.setX(position_.getX() + (timeIncrement * velocity_.getX())); position_.setY(position_.getY() + (timeIncrement * velocity_.getY())); position_.setZ(position_.getZ() + (timeIncrement * velocity_.getZ())); }; } // stk namespace #endif stk-4.5.0/include/StifKarp.h0000644000076600007660000001034012327014024013450 0ustar gary#ifndef STK_STIFKARP_H #define STK_STIFKARP_H #include "Instrmnt.h" #include "DelayL.h" #include "DelayA.h" #include "OneZero.h" #include "Noise.h" #include "BiQuad.h" namespace stk { /***************************************************/ /*! \class StifKarp \brief STK plucked stiff string instrument. This class implements a simple plucked string algorithm (Karplus Strong) with enhancements (Jaffe-Smith, Smith, and others), including string stiffness and pluck position controls. The stiffness is modeled with allpass filters. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Pickup Position = 4 - String Sustain = 11 - String Stretch = 1 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class StifKarp : public Instrmnt { public: //! Class constructor, taking the lowest desired playing frequency. StifKarp( StkFloat lowestFrequency = 8.0 ); //! Class destructor. ~StifKarp( void ); //! Reset and clear all internal state. void clear( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Set the stretch "factor" of the string (0.0 - 1.0). void setStretch( StkFloat stretch ); //! Set the pluck or "excitation" position along the string (0.0 - 1.0). void setPickupPosition( StkFloat position ); //! Set the base loop gain. /*! The actual loop gain is set according to the frequency. Because of high-frequency loop filter roll-off, higher frequency settings have greater loop gains. */ void setBaseLoopGain( StkFloat aGain ); //! Pluck the string with the given amplitude using the current frequency. void pluck( StkFloat amplitude ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ); //! Perform the control change specified by \e number and \e value (0.0 - 128.0). void controlChange( int number, StkFloat value ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: DelayA delayLine_; DelayL combDelay_; OneZero filter_; Noise noise_; BiQuad biquad_[4]; unsigned long length_; StkFloat loopGain_; StkFloat baseLoopGain_; StkFloat lastFrequency_; StkFloat lastLength_; StkFloat stretching_; StkFloat pluckAmplitude_; StkFloat pickupPosition_; }; inline StkFloat StifKarp :: tick( unsigned int ) { StkFloat temp = delayLine_.lastOut() * loopGain_; // Calculate allpass stretching. for (int i=0; i<4; i++) temp = biquad_[i].tick(temp); // Moving average filter. temp = filter_.tick(temp); lastFrame_[0] = delayLine_.tick(temp); lastFrame_[0] = lastFrame_[0] - combDelay_.tick( lastFrame_[0] ); return lastFrame_[0]; } inline StkFrames& StifKarp :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "StifKarp::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i #include #include #include #include //#include /*! \namespace stk \brief The STK namespace. Most Stk classes are defined within the STK namespace. Exceptions to this include the classes RtAudio and RtMidi. */ namespace stk { /***************************************************/ /*! \class Stk \brief STK base class Nearly all STK classes inherit from this class. The global sample rate and rawwave path variables can be queried and modified via Stk. In addition, this class provides error handling and byte-swapping functions. 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. 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. STK WWW site: http://ccrma.stanford.edu/software/stk/ The Synthesis ToolKit in C++ (STK) Copyright (c) 1995--2014 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 "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /***************************************************/ //#define _STK_DEBUG_ // Most data in STK is passed and calculated with the // following user-definable floating-point type. You // can change this to "float" if you prefer or perhaps // a "long double" in the future. typedef double StkFloat; //! STK error handling class. /*! This is a fairly abstract exception handling class. There could be sub-classes to take care of more specific error conditions ... or not. */ class StkError { public: enum Type { STATUS, WARNING, DEBUG_PRINT, MEMORY_ALLOCATION, MEMORY_ACCESS, FUNCTION_ARGUMENT, FILE_NOT_FOUND, FILE_UNKNOWN_FORMAT, FILE_ERROR, PROCESS_THREAD, PROCESS_SOCKET, PROCESS_SOCKET_IPADDR, AUDIO_SYSTEM, MIDI_SYSTEM, UNSPECIFIED }; protected: std::string message_; Type type_; public: //! The constructor. StkError(const std::string& message, Type type = StkError::UNSPECIFIED) : message_(message), type_(type) {} //! The destructor. virtual ~StkError(void) {}; //! Prints thrown error message to stderr. virtual void printMessage(void) { std::cerr << '\n' << message_ << "\n\n"; } //! Returns the thrown error message type. virtual const Type& getType(void) { return type_; } //! Returns the thrown error message string. virtual const std::string& getMessage(void) { return message_; } //! Returns the thrown error message as a C string. virtual const char *getMessageCString(void) { return message_.c_str(); } }; class Stk { public: typedef unsigned long StkFormat; static const StkFormat STK_SINT8; /*!< -128 to +127 */ static const StkFormat STK_SINT16; /*!< -32768 to +32767 */ static const StkFormat STK_SINT24; /*!< Lower 3 bytes of 32-bit signed integer. */ static const StkFormat STK_SINT32; /*!< -2147483648 to +2147483647. */ static const StkFormat STK_FLOAT32; /*!< Normalized between plus/minus 1.0. */ static const StkFormat STK_FLOAT64; /*!< Normalized between plus/minus 1.0. */ //! Static method that returns the current STK sample rate. static StkFloat sampleRate( void ) { return srate_; } //! Static method that sets the STK sample rate. /*! The sample rate set using this method is queried by all STK classes that depend on its value. It is initialized to the default SRATE set in Stk.h. Many STK classes use the sample rate during instantiation. Therefore, if you wish to use a rate that is different from the default rate, it is imperative that it be set \e BEFORE STK objects are instantiated. A few classes that make use of the global STK sample rate are automatically notified when the rate changes so that internal class data can be appropriately updated. However, this has not been fully implemented. Specifically, classes that appropriately update their own data when either a setFrequency() or noteOn() function is called do not currently receive the automatic notification of rate change. If the user wants a specific class instance to ignore such notifications, perhaps in a multi-rate context, the function Stk::ignoreSampleRateChange() should be called. */ static void setSampleRate( StkFloat rate ); //! A function to enable/disable the automatic updating of class data when the STK sample rate changes. /*! This function allows the user to enable or disable class data updates in response to global sample rate changes on a class by class basis. */ void ignoreSampleRateChange( bool ignore = true ) { ignoreSampleRateChange_ = ignore; }; //! Static method that returns the current rawwave path. static std::string rawwavePath(void) { return rawwavepath_; } //! Static method that sets the STK rawwave path. static void setRawwavePath( std::string path ); //! Static method that byte-swaps a 16-bit data type. static void swap16( unsigned char *ptr ); //! Static method that byte-swaps a 32-bit data type. static void swap32( unsigned char *ptr ); //! Static method that byte-swaps a 64-bit data type. static void swap64( unsigned char *ptr ); //! Static cross-platform method to sleep for a number of milliseconds. static void sleep( unsigned long milliseconds ); //! Static method to check whether a value is within a specified range. static bool inRange( StkFloat value, StkFloat min, StkFloat max ) { if ( value < min ) return false; else if ( value > max ) return false; else return true; } //! Static function for error reporting and handling using c-strings. static void handleError( const char *message, StkError::Type type ); //! Static function for error reporting and handling using c++ strings. static void handleError( std::string message, StkError::Type type ); //! Toggle display of WARNING and STATUS messages. static void showWarnings( bool status ) { showWarnings_ = status; } //! Toggle display of error messages before throwing exceptions. static void printErrors( bool status ) { printErrors_ = status; } private: static StkFloat srate_; static std::string rawwavepath_; static bool showWarnings_; static bool printErrors_; static std::vector alertList_; protected: static std::ostringstream oStream_; bool ignoreSampleRateChange_; //! Default constructor. Stk( void ); //! Class destructor. virtual ~Stk( void ); //! This function should be implemented in subclasses that depend on the sample rate. virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate ); //! Add class pointer to list for sample rate change notification. void addSampleRateAlert( Stk *ptr ); //! Remove class pointer from list for sample rate change notification. void removeSampleRateAlert( Stk *ptr ); //! Internal function for error reporting that assumes message in \c oStream_ variable. void handleError( StkError::Type type ) const; }; /***************************************************/ /*! \class StkFrames \brief An STK class to handle vectorized audio data. This class can hold single- or multi-channel audio data. The data type is always StkFloat and the channel format is always interleaved. In an effort to maintain efficiency, no out-of-bounds checks are performed in this class unless _STK_DEBUG_ is defined. Internally, the data is stored in a one-dimensional C array. An indexing operator is available to set and retrieve data values. Alternately, one can use pointers to access the data, using the index operator to get an address for a particular location in the data: StkFloat* ptr = &myStkFrames[0]; Note that this class can also be used as a table with interpolating lookup. Possible future improvements in this class could include functions to convert to and return other data types. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class StkFrames { public: //! The default constructor initializes the frame data structure to size zero. StkFrames( unsigned int nFrames = 0, unsigned int nChannels = 0 ); //! Overloaded constructor that initializes the frame data to the specified size with \c value. StkFrames( const StkFloat& value, unsigned int nFrames, unsigned int nChannels ); //! The destructor. ~StkFrames(); // A copy constructor. StkFrames( const StkFrames& f ); // Assignment operator that returns a reference to self. StkFrames& operator= ( const StkFrames& f ); //! Subscript operator that returns a reference to element \c n of self. /*! The result can be used as an lvalue. This reference is valid until the resize function is called or the array is destroyed. The index \c n must be between 0 and size less one. No range checking is performed unless _STK_DEBUG_ is defined. */ StkFloat& operator[] ( size_t n ); //! Subscript operator that returns the value at element \c n of self. /*! The index \c n must be between 0 and size less one. No range checking is performed unless _STK_DEBUG_ is defined. */ StkFloat operator[] ( size_t n ) const; //! Assignment by sum operator into self. /*! The dimensions of the argument are expected to be the same as self. No range checking is performed unless _STK_DEBUG_ is defined. */ void operator+= ( StkFrames& f ); //! Assignment by product operator into self. /*! The dimensions of the argument are expected to be the same as self. No range checking is performed unless _STK_DEBUG_ is defined. */ void operator*= ( StkFrames& f ); //! Channel / frame subscript operator that returns a reference. /*! The result can be used as an lvalue. This reference is valid until the resize function is called or the array is destroyed. The \c frame index must be between 0 and frames() - 1. The \c channel index must be between 0 and channels() - 1. No range checking is performed unless _STK_DEBUG_ is defined. */ StkFloat& operator() ( size_t frame, unsigned int channel ); //! Channel / frame subscript operator that returns a value. /*! The \c frame index must be between 0 and frames() - 1. The \c channel index must be between 0 and channels() - 1. No range checking is performed unless _STK_DEBUG_ is defined. */ StkFloat operator() ( size_t frame, unsigned int channel ) const; //! Return an interpolated value at the fractional frame index and channel. /*! This function performs linear interpolation. The \c frame index must be between 0.0 and frames() - 1. The \c channel index must be between 0 and channels() - 1. No range checking is performed unless _STK_DEBUG_ is defined. */ StkFloat interpolate( StkFloat frame, unsigned int channel = 0 ) const; //! Returns the total number of audio samples represented by the object. size_t size() const { return size_; }; //! Returns \e true if the object size is zero and \e false otherwise. bool empty() const; //! Resize self to represent the specified number of channels and frames. /*! Changes the size of self based on the number of frames and channels. No element assignment is performed. No memory deallocation occurs if the new size is smaller than the previous size. Further, no new memory is allocated when the new size is smaller or equal to a previously allocated size. */ void resize( size_t nFrames, unsigned int nChannels = 1 ); //! Resize self to represent the specified number of channels and frames and perform element initialization. /*! Changes the size of self based on the number of frames and channels, and assigns \c value to every element. No memory deallocation occurs if the new size is smaller than the previous size. Further, no new memory is allocated when the new size is smaller or equal to a previously allocated size. */ void resize( size_t nFrames, unsigned int nChannels, StkFloat value ); //! Return the number of channels represented by the data. unsigned int channels( void ) const { return nChannels_; }; //! Return the number of sample frames represented by the data. unsigned int frames( void ) const { return (unsigned int)nFrames_; }; //! Set the sample rate associated with the StkFrames data. /*! By default, this value is set equal to the current STK sample rate at the time of instantiation. */ void setDataRate( StkFloat rate ) { dataRate_ = rate; }; //! Return the sample rate associated with the StkFrames data. /*! By default, this value is set equal to the current STK sample rate at the time of instantiation. */ StkFloat dataRate( void ) const { return dataRate_; }; private: StkFloat *data_; StkFloat dataRate_; size_t nFrames_; unsigned int nChannels_; size_t size_; size_t bufferSize_; }; inline bool StkFrames :: empty() const { if ( size_ > 0 ) return false; else return true; } inline StkFloat& StkFrames :: operator[] ( size_t n ) { #if defined(_STK_DEBUG_) if ( n >= size_ ) { std::ostringstream error; error << "StkFrames::operator[]: invalid index (" << n << ") value!"; Stk::handleError( error.str(), StkError::MEMORY_ACCESS ); } #endif return data_[n]; } inline StkFloat StkFrames :: operator[] ( size_t n ) const { #if defined(_STK_DEBUG_) if ( n >= size_ ) { std::ostringstream error; error << "StkFrames::operator[]: invalid index (" << n << ") value!"; Stk::handleError( error.str(), StkError::MEMORY_ACCESS ); } #endif return data_[n]; } inline StkFloat& StkFrames :: operator() ( size_t frame, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( frame >= nFrames_ || channel >= nChannels_ ) { std::ostringstream error; error << "StkFrames::operator(): invalid frame (" << frame << ") or channel (" << channel << ") value!"; Stk::handleError( error.str(), StkError::MEMORY_ACCESS ); } #endif return data_[ frame * nChannels_ + channel ]; } inline StkFloat StkFrames :: operator() ( size_t frame, unsigned int channel ) const { #if defined(_STK_DEBUG_) if ( frame >= nFrames_ || channel >= nChannels_ ) { std::ostringstream error; error << "StkFrames::operator(): invalid frame (" << frame << ") or channel (" << channel << ") value!"; Stk::handleError( error.str(), StkError::MEMORY_ACCESS ); } #endif return data_[ frame * nChannels_ + channel ]; } inline void StkFrames :: operator+= ( StkFrames& f ) { #if defined(_STK_DEBUG_) if ( f.frames() != nFrames_ || f.channels() != nChannels_ ) { std::ostringstream error; error << "StkFrames::operator+=: frames argument must be of equal dimensions!"; Stk::handleError( error.str(), StkError::MEMORY_ACCESS ); } #endif StkFloat *fptr = &f[0]; StkFloat *dptr = data_; for ( unsigned int i=0; i taps = std::vector( 1, 0 ), unsigned long maxDelay = 4095 ); //! Class destructor. ~TapDelay(); //! Set the maximum delay-line length. /*! This method should generally only be used during initial setup of the delay line. If it is used between calls to the tick() function, without a call to clear(), a signal discontinuity will likely occur. If the current maximum length is greater than the new length, no change will be made. */ void setMaximumDelay( unsigned long delay ); //! Set the delay-line tap lengths. /*! The valid range for each tap length is from 0 to the maximum delay-line length. */ void setTapDelays( std::vector taps ); //! Return the current delay-line length. std::vector getTapDelays( void ) const { return delays_; }; //! Return the specified tap value of the last computed frame. /*! Use the lastFrame() function to get all tap values from the last computed frame. The \c tap argument must be less than the number of delayline taps (the first tap is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFloat lastOut( unsigned int tap = 0 ) const; //! Input one sample to the delayline and return outputs at all tap positions. /*! The StkFrames argument reference is returned. The output values are ordered according to the tap positions set using the setTapDelays() function (no sorting is performed). The StkFrames argument must contain at least as many channels as the number of taps. However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFloat input, StkFrames& outputs ); //! Take a channel of the StkFrames object as inputs to the filter and write outputs back to the same object. /*! The StkFrames argument reference is returned. The output values are ordered according to the tap positions set using the setTapDelays() function (no sorting is performed). The StkFrames argument must contain at least as many channels as the number of taps. However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the filter and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. The output values are ordered according to the tap positions set using the setTapDelays() function (no sorting is performed). The \c iChannel argument must be less than the number of channels in the \c iFrames argument (the first channel is specified by 0). The \c oFrames argument must contain at least as many channels as the number of taps. However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0 ); protected: unsigned long inPoint_; std::vector outPoint_; std::vector delays_; }; inline StkFloat TapDelay :: lastOut( unsigned int tap ) const { #if defined(_STK_DEBUG_) if ( tap >= lastFrame_.size() ) { oStream_ << "TapDelay::lastOut(): tap argument and number of taps are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif return lastFrame_[tap]; } inline StkFrames& TapDelay :: tick( StkFloat input, StkFrames& outputs ) { #if defined(_STK_DEBUG_) if ( outputs.channels() < outPoint_.size() ) { oStream_ << "TapDelay::tick(): number of taps > channels in StkFrames argument!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif inputs_[inPoint_++] = input * gain_; // Check for end condition if ( inPoint_ == inputs_.size() ) inPoint_ = 0; // Read out next values StkFloat *outs = &outputs[0]; for ( unsigned int i=0; i= frames.channels() ) { oStream_ << "TapDelay::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( frames.channels() < outPoint_.size() ) { oStream_ << "TapDelay::tick(): number of taps > channels in StkFrames argument!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &frames[channel]; StkFloat *oSamples = &frames[0]; std::size_t j; unsigned int iHop = frames.channels(); std::size_t oHop = frames.channels() - outPoint_.size(); for ( unsigned long i=0; i= iFrames.channels() ) { oStream_ << "TapDelay::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( oFrames.channels() < outPoint_.size() ) { oStream_ << "TapDelay::tick(): number of taps > channels in output StkFrames argument!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[0]; std::size_t j; unsigned int iHop = iFrames.channels(); std::size_t oHop = oFrames.channels() - outPoint_.size(); for ( unsigned long i=0; i #define THREAD_TYPE typedef pthread_t THREAD_HANDLE; typedef void * THREAD_RETURN; typedef void * (*THREAD_FUNCTION)(void *); #elif defined(__OS_WINDOWS__) #include #include #define THREAD_TYPE __stdcall typedef unsigned long THREAD_HANDLE; typedef unsigned THREAD_RETURN; typedef unsigned (__stdcall *THREAD_FUNCTION)(void *); #endif namespace stk { /***************************************************/ /*! \class Thread \brief STK thread class. This class provides a uniform interface for cross-platform threads. On unix systems, the pthread library is used. Under Windows, the C runtime threadex functions are used. Each instance of the Thread class can be used to control a single thread process. Routines are provided to signal cancelation and/or joining with a thread, though it is not possible for this class to know the running status of a thread once it is started. For cross-platform compatability, thread functions should be declared as follows: THREAD_RETURN THREAD_TYPE thread_function(void *ptr) by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Thread : public Stk { public: //! Default constructor. Thread(); //! The class destructor does not attempt to cancel or join a thread. ~Thread(); //! Begin execution of the thread \e routine. Upon success, true is returned. /*! A data pointer can be supplied to the thread routine via the optional \e ptr argument. If the thread cannot be created, the return value is false. */ bool start( THREAD_FUNCTION routine, void * ptr = NULL ); //! Signal cancellation of a thread routine, returning \e true on success. /*! This function only signals thread cancellation. It does not wait to verify actual routine termination. A \e true return value only signifies that the cancellation signal was properly executed, not thread cancellation. A thread routine may need to make use of the testCancel() function to specify a cancellation point. */ bool cancel(void); //! Block the calling routine indefinitely until the thread terminates. /*! This function suspends execution of the calling routine until the thread has terminated. It will return immediately if the thread was already terminated. A \e true return value signifies successful termination. A \e false return value indicates a problem with the wait call. */ bool wait(void); //! Create a cancellation point within a thread routine. /*! This function call checks for thread cancellation, allowing the thread to be terminated if a cancellation request was previously signaled. */ void testCancel(void); protected: THREAD_HANDLE thread_; }; } // stk namespace #endif stk-4.5.0/include/TubeBell.h0000644000076600007660000000653612327014024013437 0ustar gary#ifndef STK_TUBEBELL_H #define STK_TUBEBELL_H #include "FM.h" namespace stk { /***************************************************/ /*! \class TubeBell \brief STK tubular bell (orchestral chime) FM synthesis instrument. This class implements two simple FM Pairs summed together, also referred to as algorithm 5 of the TX81Z. \code Algorithm 5 is : 4->3--\ + --> Out 2->1--/ \endcode Control Change Numbers: - Modulator Index One = 2 - Crossfade of Outputs = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class TubeBell : public FM { public: //! Class constructor. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ TubeBell( void ); //! Class destructor. ~TubeBell( void ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: }; inline StkFloat TubeBell :: tick( unsigned int ) { StkFloat temp, temp2; temp = gains_[1] * adsr_[1]->tick() * waves_[1]->tick(); temp = temp * control1_; waves_[0]->addPhaseOffset( temp ); waves_[3]->addPhaseOffset( twozero_.lastOut() ); temp = gains_[3] * adsr_[3]->tick() * waves_[3]->tick(); twozero_.tick( temp ); waves_[2]->addPhaseOffset( temp ); temp = ( 1.0 - (control2_ * 0.5)) * gains_[0] * adsr_[0]->tick() * waves_[0]->tick(); temp += control2_ * 0.5 * gains_[2] * adsr_[2]->tick() * waves_[2]->tick(); // Calculate amplitude modulation and apply it to output. temp2 = vibrato_.tick() * modDepth_; temp = temp * (1.0 + temp2); lastFrame_[0] = temp * 0.5; return lastFrame_[0]; } inline StkFrames& TubeBell :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "TubeBell::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i coefficients ); //! Return an StkFrames reference to the last output sample frame. //const StkFrames& lastFrame( void ) const { return lastFrame_; }; //! Return the last computed output value. // StkFloat lastOut( void ) { return lastFrame_[0]; }; StkFloat lastOut( void ) { return lastOutput_; }; //! Compute and return one output sample. StkFloat tick( StkFloat input ); //! Take a channel of the \c iFrames object as inputs to the class and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the effect and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: DelayA delayLine_; DelayL combDelay_; Fir loopFilter_; StkFloat lastOutput_; StkFloat frequency_; StkFloat loopGain_; StkFloat pluckPosition_; }; inline StkFloat Twang :: tick( StkFloat input ) { lastOutput_ = delayLine_.tick( input + loopFilter_.tick( delayLine_.lastOut() ) ); lastOutput_ -= combDelay_.tick( lastOutput_ ); // comb filtering on output lastOutput_ *= 0.5; return lastOutput_; } inline StkFrames& Twang :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "Twang::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "Twang::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i= 1.0. The \e frequency value should be between zero and half the sample rate. For a better resonance filter, use a BiQuad filter. \sa BiQuad filter class */ void setResonance(StkFloat frequency, StkFloat radius, bool normalize = false); //! Return the last computed output value. StkFloat lastOut( void ) const { return lastFrame_[0]; }; //! Input one sample to the filter and return one output. StkFloat tick( StkFloat input ); //! Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs. /*! The StkFrames argument reference is returned. The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); //! Take a channel of the \c iFrames object as inputs to the filter and write outputs to the \c oFrames object. /*! The \c iFrames object reference is returned. Each channel argument must be less than the number of channels in the corresponding StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 ); protected: virtual void sampleRateChanged( StkFloat newRate, StkFloat oldRate ); }; inline StkFloat TwoPole :: tick( StkFloat input ) { inputs_[0] = gain_ * input; lastFrame_[0] = b_[0] * inputs_[0] - a_[1] * outputs_[1] - a_[2] * outputs_[2]; outputs_[2] = outputs_[1]; outputs_[1] = lastFrame_[0]; return lastFrame_[0]; } inline StkFrames& TwoPole :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "TwoPole::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "TwoPole::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i= frames.channels() ) { oStream_ << "TwoZero::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "TwoZero::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; i namespace stk { /***************************************************/ /*! \class Vector3D \brief STK 3D vector class. This class implements a three-dimensional vector. by Perry R. Cook, 1995--2014. */ /***************************************************/ class Vector3D : public Stk { public: //! Default constructor taking optional initial X, Y, and Z values. Vector3D( StkFloat x = 0.0, StkFloat y = 0.0, StkFloat z = 0.0 ) { setXYZ( x, y, z ); }; //! Get the current X value. StkFloat getX( void ) { return X_; }; //! Get the current Y value. StkFloat getY( void ) { return Y_; }; //! Get the current Z value. StkFloat getZ( void ) { return Z_; }; //! Calculate the vector length. StkFloat getLength( void ); //! Set the X, Y, and Z values simultaniously. void setXYZ( StkFloat x, StkFloat y, StkFloat z ) { X_ = x; Y_ = y; Z_ = z; }; //! Set the X value. void setX( StkFloat x ) { X_ = x; }; //! Set the Y value. void setY( StkFloat y ) { Y_ = y; }; //! Set the Z value. void setZ( StkFloat z ) { Z_ = z; }; protected: StkFloat X_; StkFloat Y_; StkFloat Z_; }; inline StkFloat Vector3D :: getLength( void ) { StkFloat temp; temp = X_ * X_; temp += Y_ * Y_; temp += Z_ * Z_; temp = sqrt( temp ); return temp; } } // stk namespace #endif stk-4.5.0/include/Voicer.h0000644000076600007660000001737112327014024013167 0ustar gary#ifndef STK_VOICER_H #define STK_VOICER_H #include "Instrmnt.h" #include namespace stk { /***************************************************/ /*! \class Voicer \brief STK voice manager class. This class can be used to manage a group of STK instrument classes. Individual voices can be controlled via unique note tags. Instrument groups can be controlled by group number. A previously constructed STK instrument class is linked with a voice manager using the addInstrument() function. An optional group number argument can be specified to the addInstrument() function as well (default group = 0). The voice manager does not delete any instrument instances ... it is the responsibility of the user to allocate and deallocate all instruments. The tick() function returns the mix of all sounding voices. Each noteOn returns a unique tag (credits to the NeXT MusicKit), so you can send control changes to specific voices within an ensemble. Alternately, control changes can be sent to all voices in a given group. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Voicer : public Stk { public: //! Class constructor taking an optional note decay time (in seconds). Voicer( StkFloat decayTime = 0.2 ); //! Add an instrument with an optional group number to the voice manager. /*! A set of instruments can be grouped by group number and controlled via the functions that take a group number argument. */ void addInstrument( Instrmnt *instrument, int group=0 ); //! Remove the given instrument pointer from the voice manager's control. /*! It is important that any instruments which are to be deleted by the user while the voice manager is running be first removed from the manager's control via this function!! */ void removeInstrument( Instrmnt *instrument ); //! Initiate a noteOn event with the given note number and amplitude and return a unique note tag. /*! Send the noteOn message to the first available unused voice. If all voices are sounding, the oldest voice is interrupted and sent the noteOn message. If the optional group argument is non-zero, only voices in that group are used. If no voices are found for a specified non-zero group value, the function returns -1. The amplitude value should be in the range 0.0 - 128.0. */ long noteOn( StkFloat noteNumber, StkFloat amplitude, int group=0 ); //! Send a noteOff to all voices having the given noteNumber and optional group (default group = 0). /*! The amplitude value should be in the range 0.0 - 128.0. */ void noteOff( StkFloat noteNumber, StkFloat amplitude, int group=0 ); //! Send a noteOff to the voice with the given note tag. /*! The amplitude value should be in the range 0.0 - 128.0. */ void noteOff( long tag, StkFloat amplitude ); //! Send a frequency update message to all voices assigned to the optional group argument (default group = 0). /*! The \e noteNumber argument corresponds to a MIDI note number, though it is a floating-point value and can range beyond the normal 0-127 range. */ void setFrequency( StkFloat noteNumber, int group=0 ); //! Send a frequency update message to the voice with the given note tag. /*! The \e noteNumber argument corresponds to a MIDI note number, though it is a floating-point value and can range beyond the normal 0-127 range. */ void setFrequency( long tag, StkFloat noteNumber ); //! Send a pitchBend message to all voices assigned to the optional group argument (default group = 0). void pitchBend( StkFloat value, int group=0 ); //! Send a pitchBend message to the voice with the given note tag. void pitchBend( long tag, StkFloat value ); //! Send a controlChange to all instruments assigned to the optional group argument (default group = 0). void controlChange( int number, StkFloat value, int group=0 ); //! Send a controlChange to the voice with the given note tag. void controlChange( long tag, int number, StkFloat value ); //! Send a noteOff message to all existing voices. void silence( void ); //! Return the current number of output channels. unsigned int channelsOut( void ) const { return lastFrame_.channels(); }; //! Return an StkFrames reference to the last output sample frame. const StkFrames& lastFrame( void ) const { return lastFrame_; }; //! Return the specified channel value of the last computed frame. /*! The \c channel argument must be less than the number of output channels, which can be determined with the channelsOut() function (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. \sa lastFrame() */ StkFloat lastOut( unsigned int channel = 0 ); //! Mix one sample frame of all sounding voices and return the specified \c channel value. /*! The \c channel argument must be less than the number of output channels, which can be determined with the channelsOut() function (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFloat tick( unsigned int channel = 0 ); //! Fill the StkFrames argument with computed frames and return the same reference. /*! The number of channels in the StkFrames argument must equal the number of channels in the file data. However, this is only checked if _STK_DEBUG_ is defined during compilation, in which case an incompatibility will trigger an StkError exception. If no file data is loaded, the function does nothing (a warning will be issued if _STK_DEBUG_ is defined during compilation). */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: struct Voice { Instrmnt *instrument; long tag; StkFloat noteNumber; StkFloat frequency; int sounding; int group; // Default constructor. Voice() :instrument(0), tag(0), noteNumber(-1.0), frequency(0.0), sounding(0), group(0) {} }; std::vector voices_; long tags_; int muteTime_; StkFrames lastFrame_; }; inline StkFloat Voicer :: lastOut( unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= lastFrame_.channels() ) { oStream_ << "Voicer::lastOut(): channel argument is invalid!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif return lastFrame_[channel]; } inline StkFloat Voicer :: tick( unsigned int channel ) { unsigned int j; for ( j=0; jtick(); for ( j=0; jchannelsOut(); j++ ) lastFrame_[j] += voices_[i].instrument->lastOut( j ); } if ( voices_[i].sounding < 0 ) voices_[i].sounding++; if ( voices_[i].sounding == 0 ) voices_[i].noteNumber = -1; } return lastFrame_[channel]; } inline StkFrames& Voicer :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Voicer::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; for ( unsigned int i=0; isetGainTarget(vGain); }; //! Set the unvoiced component gain. void setUnVoiced( StkFloat nGain ) { noiseEnv_.setTarget(nGain); }; //! Set the sweep rate for a particular formant filter (0-3). void setFilterSweepRate( unsigned int whichOne, StkFloat rate ); //! Set voiced component pitch sweep rate. void setPitchSweepRate( StkFloat rate ) { voiced_->setSweepRate(rate); }; //! Start the voice. void speak( void ) { voiced_->noteOn(); }; //! Stop the voice. void quiet( void ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ) { this->quiet(); }; //! Perform the control change specified by \e number and \e value (0.0 - 128.0). void controlChange( int number, StkFloat value ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: SingWave *voiced_; Noise noise_; Envelope noiseEnv_; FormSwep filters_[4]; OnePole onepole_; OneZero onezero_; }; inline StkFloat VoicForm :: tick( unsigned int ) { StkFloat temp; temp = onepole_.tick( onezero_.tick( voiced_->tick() ) ); temp += noiseEnv_.tick() * noise_.tick(); lastFrame_[0] = filters_[0].tick(temp); lastFrame_[0] += filters_[1].tick(temp); lastFrame_[0] += filters_[2].tick(temp); lastFrame_[0] += filters_[3].tick(temp); /* temp += noiseEnv_.tick() * noise_.tick(); lastFrame_[0] = filters_[0].tick(temp); lastFrame_[0] = filters_[1].tick(lastFrame_[0]); lastFrame_[0] = filters_[2].tick(lastFrame_[0]); lastFrame_[0] = filters_[3].tick(lastFrame_[0]); */ return lastFrame_[0]; } inline StkFrames& VoicForm :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "VoicForm::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i frames.channels() - nChannels ) { oStream_ << "Whistle::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i3--\ + --> Out 2->1--/ \endcode Control Change Numbers: - Modulator Index One = 2 - Crossfade of Outputs = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Wurley : public FM { public: //! Class constructor. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ Wurley( void ); //! Class destructor. ~Wurley( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: }; inline StkFloat Wurley :: tick( unsigned int ) { StkFloat temp, temp2; temp = gains_[1] * adsr_[1]->tick() * waves_[1]->tick(); temp = temp * control1_; waves_[0]->addPhaseOffset( temp ); waves_[3]->addPhaseOffset( twozero_.lastOut() ); temp = gains_[3] * adsr_[3]->tick() * waves_[3]->tick(); twozero_.tick(temp); waves_[2]->addPhaseOffset( temp ); temp = ( 1.0 - (control2_ * 0.5)) * gains_[0] * adsr_[0]->tick() * waves_[0]->tick(); temp += control2_ * 0.5 * gains_[2] * adsr_[2]->tick() * waves_[2]->tick(); // Calculate amplitude modulation and apply it to output. temp2 = vibrato_.tick() * modDepth_; temp = temp * (1.0 + temp2); lastFrame_[0] = temp * 0.5; return lastFrame_[0]; } inline StkFrames& Wurley :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Wurley::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i 1.0 ) { sample = 1.0; clip = true; } else if ( sample < -1.0 ) { sample = -1.0; clip = true; } if ( clip == true && clipping_ == false ) { // First occurrence of clipping since instantiation or reset. clipping_ = true; oStream_ << "WvOut: data value(s) outside +-1.0 detected ... clamping at outer bound!"; handleError( StkError::WARNING ); } return sample; } } // stk namespace #endif stk-4.5.0/INSTALL.md0000644000076600007660000000600612327014024011565 0ustar gary% The Synthesis ToolKit in C++ (STK) % Perry R. Cook and Gary P. Scavone % 1995--2014 # The Synthesis ToolKit in C++ (STK) By Perry R. Cook and Gary P. Scavone, 1995--2014. The Synthesis ToolKit in C++ can be used in a variety of ways, depending on your particular needs. Some people simply 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. ## Unix systems and MinGW 1. If you downloaded the software from the git repository, first run autoconf, autoconf otherwise, if you downloaded the software from the STK source distribution, unpack the tar file, tar -xzf stk-4.x.x.tar.gz 2. From within the directory containing this file, run configure: ./configure 3. From within each project directory, type `make`. 4. To compile a library of objects, type `make` from within the `src` directory. Several options can be passed to configure, including: --disable-realtime = only compile generic non-realtime classes --enable-debug = enable various debug output --with-alsa = choose native ALSA API support (default, linux only) --with-oss = choose native OSS API support (linux only) --with-jack = choose native JACK server API support (linux and macintosh OS-X) --with-core = choose OS-X Core Audio API (macintosh OS-X only) --with-asio = choose ASIO API support (windows only) --with-ds = choose DirectSound API support (windows only) --with-wasapi = choose Windows Audio Session API support (windows only) 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/' The ending "/" is required for the RAWWAVES path. The default behavior will set a relative path that works for the project files included with the distribution (assuming they are not moved). You can also change the RAWWAVE_PATH dynamically via the static Stk::setRawwavePath() function. If you wish to use a different compiler than that selected by configure, specify that compiler in the command line (ex. to use CC): ./configure CXX=CC ## Windows 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. ##iOS You can integrate the STK in iOS projects either by using its iOS static library or Cocoapods. See the [iOS README file](iOS/README-iOS.md) for instructions. stk-4.5.0/iOS/0000755000076600007660000000000012327014024010625 5ustar garystk-4.5.0/iOS/demo/0000755000076600007660000000000012327014024011551 5ustar garystk-4.5.0/iOS/demo/iOS Demo/0000755000076600007660000000000012327014024013110 5ustar garystk-4.5.0/iOS/demo/iOS Demo/AppDelegate.h0000644000076600007660000000034012327014024015431 0ustar gary// // AppDelegate.h // iOS Demo // // Created by Ariel Elkin on 03/03/2014. // #import @interface AppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @end stk-4.5.0/iOS/demo/iOS Demo/AppDelegate.m0000644000076600007660000000106012327014024015436 0ustar gary// // AppDelegate.m // iOS Demo // // Created by Ariel Elkin on 03/03/2014. // #import "AppDelegate.h" #import "ViewController.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; ViewController *vc = [[ViewController alloc] initWithNibName:nil bundle:nil]; [self.window setRootViewController:vc]; [self.window makeKeyAndVisible]; return YES; } @end stk-4.5.0/iOS/demo/iOS Demo/en.lproj/0000755000076600007660000000000012327014024014637 5ustar garystk-4.5.0/iOS/demo/iOS Demo/en.lproj/InfoPlist.strings0000644000076600007660000000005512327014024020161 0ustar gary/* Localized versions of Info.plist keys */ stk-4.5.0/iOS/demo/iOS Demo/Images.xcassets/0000755000076600007660000000000012327014024016151 5ustar garystk-4.5.0/iOS/demo/iOS Demo/Images.xcassets/AppIcon.appiconset/0000755000076600007660000000000012327014024021646 5ustar garystk-4.5.0/iOS/demo/iOS Demo/Images.xcassets/AppIcon.appiconset/Contents.json0000644000076600007660000000051512327014024024337 0ustar gary{ "images" : [ { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } }stk-4.5.0/iOS/demo/iOS Demo/Images.xcassets/LaunchImage.launchimage/0000755000076600007660000000000012327014024022602 5ustar garystk-4.5.0/iOS/demo/iOS Demo/Images.xcassets/LaunchImage.launchimage/Contents.json0000644000076600007660000000067212327014024025277 0ustar gary{ "images" : [ { "orientation" : "portrait", "idiom" : "iphone", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", "subtype" : "retina4", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } }stk-4.5.0/iOS/demo/iOS Demo/iOS Demo-Info.plist0000644000076600007660000000221012327014024016410 0ustar gary CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier stk.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight stk-4.5.0/iOS/demo/iOS Demo/iOS Demo-Prefix.pch0000644000076600007660000000053012327014024016374 0ustar gary// // Prefix header // // The contents of this file are implicitly included at the beginning of every source file. // #import #ifndef __IPHONE_3_0 #warning "This project uses features only available in iOS SDK 3.0 and later." #endif #ifdef __OBJC__ #import #import #endif stk-4.5.0/iOS/demo/iOS Demo/main.m0000644000076600007660000000052512327014024014214 0ustar gary// // main.m // iOS Demo // // Created by Ariel Elkin on 03/03/2014. // Copyright (c) 2014 Ariel Elkin. All rights reserved. // #import #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } stk-4.5.0/iOS/demo/iOS Demo/ViewController.h0000644000076600007660000000024212327014024016235 0ustar gary// // ViewController.h // iOS Demo // // Created by Ariel Elkin on 03/03/2014. // #import @interface ViewController : UIViewController @end stk-4.5.0/iOS/demo/iOS Demo/ViewController.mm0000644000076600007660000000616012327014024016424 0ustar gary// // ViewController.m // iOS Demo // // Created by Ariel Elkin on 03/03/2014. // #import "ViewController.h" #import "SineWave.h" #import "Brass.h" #import "Mandolin.h" @implementation ViewController { stk::SineWave *sineWave; stk::Brass *brass; } - (void)loadView { self.view = [UIView new]; [self.view setBackgroundColor:[UIColor whiteColor]]; [self setupUI]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; NSUInteger samplesToGenerate = 1000; //Test SineWave: sineWave = new stk::SineWave(); for (NSUInteger i = 0; i < samplesToGenerate; i ++) { float sample = sineWave->tick(); NSLog(@"SineWave sample: %f", sample); } //Test Brass: brass = new stk::Brass(); brass->noteOn(400, 1); for (NSUInteger i = 0; i < samplesToGenerate; i ++) { float sample = brass->tick(); NSLog(@"Brass sample: %f", sample); } //Test Mandolin: stk::Mandolin *mandolin = new stk::Mandolin(400); mandolin->pluck(1); for (NSUInteger i = 0; i < samplesToGenerate; i ++) { float sample = mandolin->tick(); NSLog(@"Mandolin sample: %f", sample); } #pragma mark TODO - Audio playback } - (void)sineSliderMoved:(UISlider *)slider { sineWave->setFrequency(slider.value); NSLog(@"Setting SineWave frequency to %.2f", slider.value); } - (void)brassSliderMoved:(UISlider *)slider { brass->setFrequency(slider.value); NSLog(@"Setting Brass frequency to %.2f", slider.value); } - (void)setupUI { //Add slider to control sine wave frequency: UISlider *sineSlider = [[UISlider alloc] init]; [sineSlider addTarget:self action:@selector(sineSliderMoved:) forControlEvents:UIControlEventValueChanged]; [sineSlider setMinimumValue:0]; [sineSlider setMaximumValue:800]; [sineSlider setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.view addSubview:sineSlider]; NSDictionary *metrics = @{@"sliderWidth": @200}; NSArray *sliderConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-40-[sineSlider(sliderWidth)]" options:0 metrics:metrics views:@{@"sineSlider": sineSlider}]; [self.view addConstraints:sliderConstraints]; //Add slider to control brass's frequency: UISlider *brassSlider = [[UISlider alloc] init]; [brassSlider addTarget:self action:@selector(brassSliderMoved:) forControlEvents:UIControlEventValueChanged]; [brassSlider setMinimumValue:0]; [brassSlider setMaximumValue:800]; [brassSlider setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.view addSubview:brassSlider]; sliderConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-40-[brassSlider(sliderWidth)]" options:0 metrics:metrics views:@{@"brassSlider": brassSlider}]; [self.view addConstraints:sliderConstraints]; sliderConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[sineSlider]-[brassSlider]" options:0 metrics:nil views:@{@"sineSlider": sineSlider, @"brassSlider": brassSlider}]; [self.view addConstraints:sliderConstraints]; } @end stk-4.5.0/iOS/demo/iOS Demo.xcodeproj/0000755000076600007660000000000012327014024015104 5ustar garystk-4.5.0/iOS/demo/iOS Demo.xcodeproj/project.pbxproj0000644000076600007660000005232012327014024020162 0ustar gary// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ B02FD53618C520D60009ECA9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B02FD53518C520D60009ECA9 /* Foundation.framework */; }; B02FD53818C520D60009ECA9 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B02FD53718C520D60009ECA9 /* CoreGraphics.framework */; }; B02FD53A18C520D60009ECA9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B02FD53918C520D60009ECA9 /* UIKit.framework */; }; B02FD54018C520D60009ECA9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B02FD53E18C520D60009ECA9 /* InfoPlist.strings */; }; B02FD54218C520D60009ECA9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B02FD54118C520D60009ECA9 /* main.m */; }; B02FD54618C520D60009ECA9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B02FD54518C520D60009ECA9 /* AppDelegate.m */; }; B02FD54818C520D60009ECA9 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B02FD54718C520D60009ECA9 /* Images.xcassets */; }; B02FD54F18C520D70009ECA9 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B02FD54E18C520D70009ECA9 /* XCTest.framework */; }; B02FD55018C520D70009ECA9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B02FD53518C520D60009ECA9 /* Foundation.framework */; }; B02FD55118C520D70009ECA9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B02FD53918C520D60009ECA9 /* UIKit.framework */; }; B02FD55918C520D70009ECA9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B02FD55718C520D70009ECA9 /* InfoPlist.strings */; }; B02FD55B18C520D70009ECA9 /* iOS_DemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B02FD55A18C520D70009ECA9 /* iOS_DemoTests.m */; }; B02FD57018C521560009ECA9 /* ViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = B02FD56F18C521560009ECA9 /* ViewController.mm */; }; B0779A8718D376F5004DA9B7 /* libSTK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B0779A8418D376A6004DA9B7 /* libSTK.a */; }; B0779A8B18D37C13004DA9B7 /* rawwaves.bundle in Resources */ = {isa = PBXBuildFile; fileRef = B0779A8618D376A6004DA9B7 /* rawwaves.bundle */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ B02FD55218C520D70009ECA9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = B02FD52A18C520D60009ECA9 /* Project object */; proxyType = 1; remoteGlobalIDString = B02FD53118C520D60009ECA9; remoteInfo = "iOS Demo"; }; B0779A8318D376A6004DA9B7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = B0779A7E18D376A5004DA9B7 /* STK.xcodeproj */; proxyType = 2; remoteGlobalIDString = B0AC5BEE18CB31DE00D860C0; remoteInfo = STK; }; B0779A8518D376A6004DA9B7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = B0779A7E18D376A5004DA9B7 /* STK.xcodeproj */; proxyType = 2; remoteGlobalIDString = B0EC33B718CB73A70005787B; remoteInfo = rawwaves; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ B02FD53218C520D60009ECA9 /* iOS Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; B02FD53518C520D60009ECA9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; B02FD53718C520D60009ECA9 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; B02FD53918C520D60009ECA9 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; B02FD53D18C520D60009ECA9 /* iOS Demo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iOS Demo-Info.plist"; sourceTree = ""; }; B02FD53F18C520D60009ECA9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; B02FD54118C520D60009ECA9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; B02FD54318C520D60009ECA9 /* iOS Demo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iOS Demo-Prefix.pch"; sourceTree = ""; }; B02FD54418C520D60009ECA9 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; B02FD54518C520D60009ECA9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; B02FD54718C520D60009ECA9 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; B02FD54D18C520D70009ECA9 /* iOS DemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "iOS DemoTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; B02FD54E18C520D70009ECA9 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; B02FD55618C520D70009ECA9 /* iOS DemoTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iOS DemoTests-Info.plist"; sourceTree = ""; }; B02FD55818C520D70009ECA9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; B02FD55A18C520D70009ECA9 /* iOS_DemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iOS_DemoTests.m; sourceTree = ""; }; B02FD56E18C521560009ECA9 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; B02FD56F18C521560009ECA9 /* ViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ViewController.mm; sourceTree = ""; }; B0779A7E18D376A5004DA9B7 /* STK.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = STK.xcodeproj; path = ../STK.xcodeproj; sourceTree = ""; }; B0779A8918D37977004DA9B7 /* README.MD */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.MD; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ B02FD52F18C520D60009ECA9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( B0779A8718D376F5004DA9B7 /* libSTK.a in Frameworks */, B02FD53818C520D60009ECA9 /* CoreGraphics.framework in Frameworks */, B02FD53A18C520D60009ECA9 /* UIKit.framework in Frameworks */, B02FD53618C520D60009ECA9 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; B02FD54A18C520D70009ECA9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( B02FD54F18C520D70009ECA9 /* XCTest.framework in Frameworks */, B02FD55118C520D70009ECA9 /* UIKit.framework in Frameworks */, B02FD55018C520D70009ECA9 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ B02FD52918C520D60009ECA9 = { isa = PBXGroup; children = ( B0779A8918D37977004DA9B7 /* README.MD */, B0779A7E18D376A5004DA9B7 /* STK.xcodeproj */, B02FD53B18C520D60009ECA9 /* iOS Demo */, B02FD55418C520D70009ECA9 /* iOS DemoTests */, B02FD53418C520D60009ECA9 /* Frameworks */, B02FD53318C520D60009ECA9 /* Products */, ); sourceTree = ""; }; B02FD53318C520D60009ECA9 /* Products */ = { isa = PBXGroup; children = ( B02FD53218C520D60009ECA9 /* iOS Demo.app */, B02FD54D18C520D70009ECA9 /* iOS DemoTests.xctest */, ); name = Products; sourceTree = ""; }; B02FD53418C520D60009ECA9 /* Frameworks */ = { isa = PBXGroup; children = ( B02FD53518C520D60009ECA9 /* Foundation.framework */, B02FD53718C520D60009ECA9 /* CoreGraphics.framework */, B02FD53918C520D60009ECA9 /* UIKit.framework */, B02FD54E18C520D70009ECA9 /* XCTest.framework */, ); name = Frameworks; sourceTree = ""; }; B02FD53B18C520D60009ECA9 /* iOS Demo */ = { isa = PBXGroup; children = ( B02FD54418C520D60009ECA9 /* AppDelegate.h */, B02FD54518C520D60009ECA9 /* AppDelegate.m */, B02FD56E18C521560009ECA9 /* ViewController.h */, B02FD56F18C521560009ECA9 /* ViewController.mm */, B02FD54718C520D60009ECA9 /* Images.xcassets */, B02FD53C18C520D60009ECA9 /* Supporting Files */, ); path = "iOS Demo"; sourceTree = ""; }; B02FD53C18C520D60009ECA9 /* Supporting Files */ = { isa = PBXGroup; children = ( B02FD53D18C520D60009ECA9 /* iOS Demo-Info.plist */, B02FD53E18C520D60009ECA9 /* InfoPlist.strings */, B02FD54118C520D60009ECA9 /* main.m */, B02FD54318C520D60009ECA9 /* iOS Demo-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; }; B02FD55418C520D70009ECA9 /* iOS DemoTests */ = { isa = PBXGroup; children = ( B02FD55A18C520D70009ECA9 /* iOS_DemoTests.m */, B02FD55518C520D70009ECA9 /* Supporting Files */, ); path = "iOS DemoTests"; sourceTree = ""; }; B02FD55518C520D70009ECA9 /* Supporting Files */ = { isa = PBXGroup; children = ( B02FD55618C520D70009ECA9 /* iOS DemoTests-Info.plist */, B02FD55718C520D70009ECA9 /* InfoPlist.strings */, ); name = "Supporting Files"; sourceTree = ""; }; B0779A7F18D376A5004DA9B7 /* Products */ = { isa = PBXGroup; children = ( B0779A8418D376A6004DA9B7 /* libSTK.a */, B0779A8618D376A6004DA9B7 /* rawwaves.bundle */, ); name = Products; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ B02FD53118C520D60009ECA9 /* iOS Demo */ = { isa = PBXNativeTarget; buildConfigurationList = B02FD55E18C520D70009ECA9 /* Build configuration list for PBXNativeTarget "iOS Demo" */; buildPhases = ( B02FD52E18C520D60009ECA9 /* Sources */, B02FD52F18C520D60009ECA9 /* Frameworks */, B02FD53018C520D60009ECA9 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = "iOS Demo"; productName = "iOS Demo"; productReference = B02FD53218C520D60009ECA9 /* iOS Demo.app */; productType = "com.apple.product-type.application"; }; B02FD54C18C520D70009ECA9 /* iOS DemoTests */ = { isa = PBXNativeTarget; buildConfigurationList = B02FD56118C520D70009ECA9 /* Build configuration list for PBXNativeTarget "iOS DemoTests" */; buildPhases = ( B02FD54918C520D70009ECA9 /* Sources */, B02FD54A18C520D70009ECA9 /* Frameworks */, B02FD54B18C520D70009ECA9 /* Resources */, ); buildRules = ( ); dependencies = ( B02FD55318C520D70009ECA9 /* PBXTargetDependency */, ); name = "iOS DemoTests"; productName = "iOS DemoTests"; productReference = B02FD54D18C520D70009ECA9 /* iOS DemoTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ B02FD52A18C520D60009ECA9 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0510; ORGANIZATIONNAME = "Ariel Elkin"; TargetAttributes = { B02FD54C18C520D70009ECA9 = { TestTargetID = B02FD53118C520D60009ECA9; }; }; }; buildConfigurationList = B02FD52D18C520D60009ECA9 /* Build configuration list for PBXProject "iOS Demo" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = B02FD52918C520D60009ECA9; productRefGroup = B02FD53318C520D60009ECA9 /* Products */; projectDirPath = ""; projectReferences = ( { ProductGroup = B0779A7F18D376A5004DA9B7 /* Products */; ProjectRef = B0779A7E18D376A5004DA9B7 /* STK.xcodeproj */; }, ); projectRoot = ""; targets = ( B02FD53118C520D60009ECA9 /* iOS Demo */, B02FD54C18C520D70009ECA9 /* iOS DemoTests */, ); }; /* End PBXProject section */ /* Begin PBXReferenceProxy section */ B0779A8418D376A6004DA9B7 /* libSTK.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libSTK.a; remoteRef = B0779A8318D376A6004DA9B7 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; B0779A8618D376A6004DA9B7 /* rawwaves.bundle */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = rawwaves.bundle; remoteRef = B0779A8518D376A6004DA9B7 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ B02FD53018C520D60009ECA9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( B0779A8B18D37C13004DA9B7 /* rawwaves.bundle in Resources */, B02FD54018C520D60009ECA9 /* InfoPlist.strings in Resources */, B02FD54818C520D60009ECA9 /* Images.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; B02FD54B18C520D70009ECA9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( B02FD55918C520D70009ECA9 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ B02FD52E18C520D60009ECA9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( B02FD57018C521560009ECA9 /* ViewController.mm in Sources */, B02FD54618C520D60009ECA9 /* AppDelegate.m in Sources */, B02FD54218C520D60009ECA9 /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; B02FD54918C520D70009ECA9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( B02FD55B18C520D70009ECA9 /* iOS_DemoTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ B02FD55318C520D70009ECA9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = B02FD53118C520D60009ECA9 /* iOS Demo */; targetProxy = B02FD55218C520D70009ECA9 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ B02FD53E18C520D60009ECA9 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( B02FD53F18C520D60009ECA9 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; B02FD55718C520D70009ECA9 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( B02FD55818C520D70009ECA9 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ B02FD55C18C520D70009ECA9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; }; B02FD55D18C520D70009ECA9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; B02FD55F18C520D70009ECA9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "iOS Demo/iOS Demo-Prefix.pch"; HEADER_SEARCH_PATHS = ( ../../include/, "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "iOS Demo/iOS Demo-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Debug; }; B02FD56018C520D70009ECA9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "iOS Demo/iOS Demo-Prefix.pch"; HEADER_SEARCH_PATHS = ( ../../include/, "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "iOS Demo/iOS Demo-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Release; }; B02FD56218C520D70009ECA9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/iOS Demo.app/iOS Demo"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", "$(DEVELOPER_FRAMEWORKS_DIR)", ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "iOS Demo/iOS Demo-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); INFOPLIST_FILE = "iOS DemoTests/iOS DemoTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUNDLE_LOADER)"; WRAPPER_EXTENSION = xctest; }; name = Debug; }; B02FD56318C520D70009ECA9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/iOS Demo.app/iOS Demo"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", "$(DEVELOPER_FRAMEWORKS_DIR)", ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "iOS Demo/iOS Demo-Prefix.pch"; INFOPLIST_FILE = "iOS DemoTests/iOS DemoTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUNDLE_LOADER)"; WRAPPER_EXTENSION = xctest; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ B02FD52D18C520D60009ECA9 /* Build configuration list for PBXProject "iOS Demo" */ = { isa = XCConfigurationList; buildConfigurations = ( B02FD55C18C520D70009ECA9 /* Debug */, B02FD55D18C520D70009ECA9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; B02FD55E18C520D70009ECA9 /* Build configuration list for PBXNativeTarget "iOS Demo" */ = { isa = XCConfigurationList; buildConfigurations = ( B02FD55F18C520D70009ECA9 /* Debug */, B02FD56018C520D70009ECA9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; B02FD56118C520D70009ECA9 /* Build configuration list for PBXNativeTarget "iOS DemoTests" */ = { isa = XCConfigurationList; buildConfigurations = ( B02FD56218C520D70009ECA9 /* Debug */, B02FD56318C520D70009ECA9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = B02FD52A18C520D60009ECA9 /* Project object */; } stk-4.5.0/iOS/demo/iOS Demo.xcodeproj/project.xcworkspace/0000755000076600007660000000000012327014024021102 5ustar garystk-4.5.0/iOS/demo/iOS Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata0000644000076600007660000000023112327014024026040 0ustar gary stk-4.5.0/iOS/demo/iOS Demo.xcodeproj/project.xcworkspace/xcshareddata/0000755000076600007660000000000012327014024023535 5ustar garystk-4.5.0/iOS/demo/iOS Demo.xcodeproj/project.xcworkspace/xcshareddata/iOS Demo.xccheckout0000644000076600007660000000271512327014024027163 0ustar gary IDESourceControlProjectFavoriteDictionaryKey IDESourceControlProjectIdentifier 4E1BA790-84C0-4F40-AECE-98269B537CE6 IDESourceControlProjectName iOS Demo IDESourceControlProjectOriginsDictionary CB047168-D1C4-40BC-85A3-6EB0A20AD217 ssh://github.com/arielelkin/stk.git IDESourceControlProjectPath iOS/Demo/iOS Demo.xcodeproj/project.xcworkspace IDESourceControlProjectRelativeInstallPathDictionary CB047168-D1C4-40BC-85A3-6EB0A20AD217 ../../../.. IDESourceControlProjectURL ssh://github.com/arielelkin/stk.git IDESourceControlProjectVersion 110 IDESourceControlProjectWCCIdentifier CB047168-D1C4-40BC-85A3-6EB0A20AD217 IDESourceControlProjectWCConfigurations IDESourceControlRepositoryExtensionIdentifierKey public.vcs.git IDESourceControlWCCIdentifierKey CB047168-D1C4-40BC-85A3-6EB0A20AD217 IDESourceControlWCCName stk stk-4.5.0/iOS/demo/iOS DemoTests/0000755000076600007660000000000012327014024014133 5ustar garystk-4.5.0/iOS/demo/iOS DemoTests/en.lproj/0000755000076600007660000000000012327014024015662 5ustar garystk-4.5.0/iOS/demo/iOS DemoTests/en.lproj/InfoPlist.strings0000644000076600007660000000005512327014024021204 0ustar gary/* Localized versions of Info.plist keys */ stk-4.5.0/iOS/demo/iOS DemoTests/iOS DemoTests-Info.plist0000644000076600007660000000125312327014024020464 0ustar gary CFBundleDevelopmentRegion en CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier stk.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 stk-4.5.0/iOS/demo/iOS DemoTests/iOS_DemoTests.m0000644000076600007660000000120312327014024016766 0ustar gary// // iOS_DemoTests.m // iOS DemoTests // // Created by Ariel Elkin on 03/03/2014. // Copyright (c) 2014 Ariel Elkin. All rights reserved. // #import @interface iOS_DemoTests : XCTestCase @end @implementation iOS_DemoTests - (void)setUp { [super setUp]; // Put setup code here. This method is called before the invocation of each test method in the class. } - (void)tearDown { // Put teardown code here. This method is called after the invocation of each test method in the class. [super tearDown]; } - (void)testExample { XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); } @end stk-4.5.0/iOS/demo/README.MD0000644000076600007660000000127112327014024012731 0ustar gary##iOS Demo Xcode project This project briefly shows how to manually integrate the STK static library into an Xcode project. See the **README** file in the STK's `iOS` directory for precise instructions. Currently, this project does not output sound, it only shows how to generate audio samples from the STK classes within an iOS project, and how to control STK objects via UI controls. Note the following: * ViewController needs to be renamed with the **.mm** extension as it's importing STK files, which are C++. * The header search paths in the *Build Settings* of **iOS Demo.xcodeproj** point to `../../include/` because the STK's `include` directory is two directories up relative to it.stk-4.5.0/iOS/README-iOS.md0000644000076600007660000000625012327014024012577 0ustar gary##Setup 1. Clone or [download][download_link] the STK into your project's directory. 1. Open the **STK for iOS** folder, and drag and drop **STK.xcodeproj** into your Xcode project. 1. Open your project's settings, open the *Build Phases* tab. In the *Link Binary with Libraries* section, add **libSTK.a**. ![][linking_libSTK_screenshot] 1. In your project's settings, open the *Build Settings* tab. In the *Search Paths* section, double click on the field to the right of *Header Search Paths*, and add the path to the STK's **include** directory relative to your Xcode project's directory. ![][header_search_paths_screenshot] ##Usage 1. Import the STK classes in the source files you require. * E.g. `#import "SineWave.h"` 1. Change the extension of Objective-C files that import STK files to **.mm**. * E.g. **ViewController.m** —> **ViewController.mm** You can also look at the [iOS Demo project](..projects/demo/iOS%20Demo) for a sample usage. ##Troubleshooting ###'FileName.h' file not found If you get this error when `#import`ing an STK header, you have added the wrong header search path for the STK in your project's settings (see Step 4 in Setup) The STK's header search path you need to add is the path to the STK's **include** directory relative to your project's directory (as if you were `cd`ing into it). For example, it is `stk/include/` if the stk directory is inside your project's directory, but it is `../stk/include/` if both share the same directory. If this problem doesn't go away: 1. Delete **STK.xcodeproj** from your Xcode project 1. Move the STK directory within your project's directory. 1. Follow step 1 from **Setup**, add `stk/include` to the *Header Search Paths*. ###FileRead::open: could not open or find file (../../rawwaves/filename.raw)! If you use a class that makes use of raw waves (such as `Mandolin`, `Wurley`, or `Rhodey`) you need to copy the STK's raw wave files into your bundle. You'll know you need to if you get this runtime error: `FileRead::open: could not open or find file (../../rawwaves/filename.raw)!` 1. Open your project's settings, open the *Build Phases* tab. 1. In the *Copy Bundle Resources*, drag and drop **rawwaves.bundle** (it's located in **STK.xcodeproj**'s **Helpers** folder). 1. Then add this code before using a class that needs the raw waves: ```objective-c NSBundle *rawwaveBundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"rawwaves" withExtension:@"bundle"]]; stk::Stk::setRawwavePath([[rawwaveBundle resourcePath] UTF8String]); ``` ###rawwaves.bundle: No such file or directory This means that **rawwaves.bundle** hasn't been copied to the build folder, so you'll need to do it manually: Select the rawwaves scheme: ![][rawwaves_scheme_screenshot] Build it (⌘+B) then build your project's main scheme. ###Apple Mach-O Linker Error This means that **STKLib.a** isn't being linked to your binary. Follow step 2 above in [Setup](#setup). [download_link]: https://github.com/thestk/stk/archive/master.zip [linking_libSTK_screenshot]: http://i.imgur.com/cLbGrtq.png [header_search_paths_screenshot]: http://i.imgur.com/iBTC06h.png [rawwaves_scheme_screenshot]: http://i.imgur.com/PKd7epf.png stk-4.5.0/iOS/STK.xcodeproj/0000755000076600007660000000000012327014024013262 5ustar garystk-4.5.0/iOS/STK.xcodeproj/project.pbxproj0000644000076600007660000023615012327014024016345 0ustar gary// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ B0AC5BF218CB330100D860C0 /* ADSR.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F612618BA9B1800C14A90 /* ADSR.cpp */; }; B0AC5BF318CB330100D860C0 /* Asymp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F612718BA9B1800C14A90 /* Asymp.cpp */; }; B0AC5BF418CB330100D860C0 /* Blit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F612B18BA9B1800C14A90 /* Blit.cpp */; }; B0AC5BF518CB330100D860C0 /* BlitSaw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F612C18BA9B1800C14A90 /* BlitSaw.cpp */; }; B0AC5BF618CB330100D860C0 /* BlitSquare.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F612D18BA9B1800C14A90 /* BlitSquare.cpp */; }; B0AC5BF718CB330100D860C0 /* Envelope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613918BA9B1800C14A90 /* Envelope.cpp */; }; B0AC5BF818CB330100D860C0 /* Granulate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F614518BA9B1800C14A90 /* Granulate.cpp */; }; B0AC5BF918CB330100D860C0 /* Modulate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616318BA9B1800C14A90 /* Modulate.cpp */; }; B0AC5BFA18CB330100D860C0 /* Noise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616618BA9B1800C14A90 /* Noise.cpp */; }; B0AC5BFB18CB330100D860C0 /* SineWave.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617A18BA9B1800C14A90 /* SineWave.cpp */; }; B0AC5BFC18CB330100D860C0 /* BandedWG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F612818BA9B1800C14A90 /* BandedWG.cpp */; }; B0AC5BFD18CB330100D860C0 /* BeeThree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F612918BA9B1800C14A90 /* BeeThree.cpp */; }; B0AC5BFE18CB330100D860C0 /* BlowBotl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F612E18BA9B1800C14A90 /* BlowBotl.cpp */; }; B0AC5BFF18CB330100D860C0 /* BlowHole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F612F18BA9B1800C14A90 /* BlowHole.cpp */; }; B0AC5C0018CB330100D860C0 /* Bowed.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613018BA9B1800C14A90 /* Bowed.cpp */; }; B0AC5C0118CB330100D860C0 /* Brass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613118BA9B1800C14A90 /* Brass.cpp */; }; B0AC5C0218CB330100D860C0 /* Clarinet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613318BA9B1800C14A90 /* Clarinet.cpp */; }; B0AC5C0318CB330100D860C0 /* Drummer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613718BA9B1800C14A90 /* Drummer.cpp */; }; B0AC5C0418CB330100D860C0 /* Flute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F614018BA9B1800C14A90 /* Flute.cpp */; }; B0AC5C0518CB330100D860C0 /* FMVoices.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F614218BA9B1800C14A90 /* FMVoices.cpp */; }; B0AC5C0618CB330100D860C0 /* Guitar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F614618BA9B1800C14A90 /* Guitar.cpp */; }; B0AC5C0718CB330100D860C0 /* HevyMetl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F614718BA9B1800C14A90 /* HevyMetl.cpp */; }; B0AC5C0818CB330100D860C0 /* Mandolin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F615D18BA9B1800C14A90 /* Mandolin.cpp */; }; B0AC5C0918CB330100D860C0 /* ModalBar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616218BA9B1800C14A90 /* ModalBar.cpp */; }; B0AC5C0A18CB330100D860C0 /* Moog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616418BA9B1800C14A90 /* Moog.cpp */; }; B0AC5C0B18CB330100D860C0 /* Mesh2D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F615E18BA9B1800C14A90 /* Mesh2D.cpp */; }; B0AC5C0C18CB330100D860C0 /* PercFlut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616A18BA9B1800C14A90 /* PercFlut.cpp */; }; B0AC5C0D18CB330100D860C0 /* Plucked.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616D18BA9B1800C14A90 /* Plucked.cpp */; }; B0AC5C0E18CB330100D860C0 /* Resonate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617018BA9B1800C14A90 /* Resonate.cpp */; }; B0AC5C0F18CB330100D860C0 /* Rhodey.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617118BA9B1800C14A90 /* Rhodey.cpp */; }; B0AC5C1018CB330100D860C0 /* Sampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617618BA9B1800C14A90 /* Sampler.cpp */; }; B0AC5C1118CB330100D860C0 /* Saxofony.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617718BA9B1800C14A90 /* Saxofony.cpp */; }; B0AC5C1218CB330100D860C0 /* Shakers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617818BA9B1800C14A90 /* Shakers.cpp */; }; B0AC5C1318CB330100D860C0 /* Simple.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617918BA9B1800C14A90 /* Simple.cpp */; }; B0AC5C1418CB330100D860C0 /* Sitar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617C18BA9B1800C14A90 /* Sitar.cpp */; }; B0AC5C1518CB330100D860C0 /* StifKarp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618018BA9B1800C14A90 /* StifKarp.cpp */; }; B0AC5C1618CB330100D860C0 /* TubeBell.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618618BA9B1800C14A90 /* TubeBell.cpp */; }; B0AC5C1718CB330100D860C0 /* Twang.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618718BA9B1900C14A90 /* Twang.cpp */; }; B0AC5C1818CB330100D860C0 /* VoicForm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618C18BA9B1900C14A90 /* VoicForm.cpp */; }; B0AC5C1918CB330100D860C0 /* Whistle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618D18BA9B1900C14A90 /* Whistle.cpp */; }; B0AC5C1A18CB330100D860C0 /* Wurley.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618E18BA9B1900C14A90 /* Wurley.cpp */; }; B0AC5C1B18CB330100D860C0 /* Chorus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613218BA9B1800C14A90 /* Chorus.cpp */; }; B0AC5C1C18CB330100D860C0 /* Echo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613818BA9B1800C14A90 /* Echo.cpp */; }; B0AC5C1D18CB330100D860C0 /* LentPitShift.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F615B18BA9B1800C14A90 /* LentPitShift.cpp */; }; B0AC5C1E18CB330100D860C0 /* PitShift.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616C18BA9B1800C14A90 /* PitShift.cpp */; }; B0AC5C1F18CB330100D860C0 /* FreeVerb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F614418BA9B1800C14A90 /* FreeVerb.cpp */; }; B0AC5C2018CB330100D860C0 /* JCRev.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F615A18BA9B1800C14A90 /* JCRev.cpp */; }; B0AC5C2118CB330100D860C0 /* NRev.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616718BA9B1800C14A90 /* NRev.cpp */; }; B0AC5C2218CB330100D860C0 /* PRCRev.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616F18BA9B1800C14A90 /* PRCRev.cpp */; }; B0AC5C2318CB330100D860C0 /* Delay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613418BA9B1800C14A90 /* Delay.cpp */; }; B0AC5C2418CB330100D860C0 /* DelayA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613518BA9B1800C14A90 /* DelayA.cpp */; }; B0AC5C2518CB330100D860C0 /* DelayL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613618BA9B1800C14A90 /* DelayL.cpp */; }; B0AC5C2618CB330100D860C0 /* TapDelay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618218BA9B1800C14A90 /* TapDelay.cpp */; }; B0AC5C2718CB330100D860C0 /* BiQuad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F612A18BA9B1800C14A90 /* BiQuad.cpp */; }; B0AC5C2818CB330100D860C0 /* Fir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613F18BA9B1800C14A90 /* Fir.cpp */; }; B0AC5C2918CB330100D860C0 /* FormSwep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F614318BA9B1800C14A90 /* FormSwep.cpp */; }; B0AC5C2A18CB330100D860C0 /* Iir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F614818BA9B1800C14A90 /* Iir.cpp */; }; B0AC5C2B18CB330100D860C0 /* OnePole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616818BA9B1800C14A90 /* OnePole.cpp */; }; B0AC5C2C18CB330100D860C0 /* OneZero.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616918BA9B1800C14A90 /* OneZero.cpp */; }; B0AC5C2D18CB330100D860C0 /* PoleZero.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616E18BA9B1800C14A90 /* PoleZero.cpp */; }; B0AC5C2E18CB330100D860C0 /* TwoPole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618818BA9B1900C14A90 /* TwoPole.cpp */; }; B0AC5C2F18CB330100D860C0 /* TwoZero.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618918BA9B1900C14A90 /* TwoZero.cpp */; }; B0AC5C3018CB330100D860C0 /* Stk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618118BA9B1800C14A90 /* Stk.cpp */; }; B0AC5C3118CB330100D860C0 /* FM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F614118BA9B1800C14A90 /* FM.cpp */; }; B0AC5C3218CB330100D860C0 /* Modal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616118BA9B1800C14A90 /* Modal.cpp */; }; B0AC5C3318CB330100D860C0 /* Messager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F615F18BA9B1800C14A90 /* Messager.cpp */; }; B0AC5C3418CB330100D860C0 /* MidiFileIn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616018BA9B1800C14A90 /* MidiFileIn.cpp */; }; B0AC5C3518CB330100D860C0 /* Phonemes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F616B18BA9B1800C14A90 /* Phonemes.cpp */; }; B0AC5C3618CB330100D860C0 /* SingWave.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617B18BA9B1800C14A90 /* SingWave.cpp */; }; B0AC5C3718CB330100D860C0 /* Sphere.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617F18BA9B1800C14A90 /* Sphere.cpp */; }; B0AC5C3818CB330100D860C0 /* Voicer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F618B18BA9B1900C14A90 /* Voicer.cpp */; }; B0AC5C3918CB330100D860C0 /* FileRead.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613B18BA9B1800C14A90 /* FileRead.cpp */; }; B0AC5C3A18CB330100D860C0 /* FileWrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613C18BA9B1800C14A90 /* FileWrite.cpp */; }; B0AC5C3B18CB330100D860C0 /* FileWvIn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613D18BA9B1800C14A90 /* FileWvIn.cpp */; }; B0AC5C3C18CB330100D860C0 /* FileLoop.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613A18BA9B1800C14A90 /* FileLoop.cpp */; }; B0AC5C3D18CB330100D860C0 /* FileWvOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F613E18BA9B1800C14A90 /* FileWvOut.cpp */; }; B0AC5C3E18CB330100D860C0 /* Skini.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B08F617D18BA9B1800C14A90 /* Skini.cpp */; }; B0EC338E18CB736C0005787B /* ahh.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F60F818BA9B1800C14A90 /* ahh.raw */; }; B0EC338F18CB736C0005787B /* bassdrum.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F60F918BA9B1800C14A90 /* bassdrum.raw */; }; B0EC339018CB736C0005787B /* britestk.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F60FA18BA9B1800C14A90 /* britestk.raw */; }; B0EC339118CB736C0005787B /* cowbell1.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F60FB18BA9B1800C14A90 /* cowbell1.raw */; }; B0EC339218CB736C0005787B /* crashcym.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F60FC18BA9B1800C14A90 /* crashcym.raw */; }; B0EC339318CB736C0005787B /* dope.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F60FD18BA9B1800C14A90 /* dope.raw */; }; B0EC339418CB736C0005787B /* eee.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F60FE18BA9B1800C14A90 /* eee.raw */; }; B0EC339518CB736C0005787B /* fwavblnk.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F60FF18BA9B1800C14A90 /* fwavblnk.raw */; }; B0EC339618CB736C0005787B /* halfwave.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610018BA9B1800C14A90 /* halfwave.raw */; }; B0EC339718CB736C0005787B /* hihatcym.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610118BA9B1800C14A90 /* hihatcym.raw */; }; B0EC339818CB736C0005787B /* impuls10.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610218BA9B1800C14A90 /* impuls10.raw */; }; B0EC339918CB736C0005787B /* impuls20.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610318BA9B1800C14A90 /* impuls20.raw */; }; B0EC339A18CB736C0005787B /* impuls40.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610418BA9B1800C14A90 /* impuls40.raw */; }; B0EC339B18CB736C0005787B /* mand1.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610818BA9B1800C14A90 /* mand1.raw */; }; B0EC339C18CB736C0005787B /* mand10.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610918BA9B1800C14A90 /* mand10.raw */; }; B0EC339D18CB736C0005787B /* mand11.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610A18BA9B1800C14A90 /* mand11.raw */; }; B0EC339E18CB736C0005787B /* mand12.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610B18BA9B1800C14A90 /* mand12.raw */; }; B0EC339F18CB736C0005787B /* mand2.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610C18BA9B1800C14A90 /* mand2.raw */; }; B0EC33A018CB736C0005787B /* mand3.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610D18BA9B1800C14A90 /* mand3.raw */; }; B0EC33A118CB736C0005787B /* mand4.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610E18BA9B1800C14A90 /* mand4.raw */; }; B0EC33A218CB736C0005787B /* mand5.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F610F18BA9B1800C14A90 /* mand5.raw */; }; B0EC33A318CB736C0005787B /* mand6.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611018BA9B1800C14A90 /* mand6.raw */; }; B0EC33A418CB736C0005787B /* mand7.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611118BA9B1800C14A90 /* mand7.raw */; }; B0EC33A518CB736C0005787B /* mand8.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611218BA9B1800C14A90 /* mand8.raw */; }; B0EC33A618CB736C0005787B /* mand9.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611318BA9B1800C14A90 /* mand9.raw */; }; B0EC33A718CB736C0005787B /* mandpluk.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611418BA9B1800C14A90 /* mandpluk.raw */; }; B0EC33A818CB736C0005787B /* marmstk1.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611518BA9B1800C14A90 /* marmstk1.raw */; }; B0EC33A918CB736C0005787B /* ooo.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611618BA9B1800C14A90 /* ooo.raw */; }; B0EC33AA18CB736C0005787B /* peksblnk.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611718BA9B1800C14A90 /* peksblnk.raw */; }; B0EC33AB18CB736C0005787B /* ppksblnk.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611818BA9B1800C14A90 /* ppksblnk.raw */; }; B0EC33AC18CB736C0005787B /* ridecymb.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611918BA9B1800C14A90 /* ridecymb.raw */; }; B0EC33AD18CB736C0005787B /* silence.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611A18BA9B1800C14A90 /* silence.raw */; }; B0EC33AE18CB736C0005787B /* sineblnk.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611C18BA9B1800C14A90 /* sineblnk.raw */; }; B0EC33AF18CB736C0005787B /* sinewave.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611D18BA9B1800C14A90 /* sinewave.raw */; }; B0EC33B018CB736C0005787B /* snardrum.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611E18BA9B1800C14A90 /* snardrum.raw */; }; B0EC33B118CB736C0005787B /* snglpeak.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F611F18BA9B1800C14A90 /* snglpeak.raw */; }; B0EC33B218CB736C0005787B /* tambourn.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F612018BA9B1800C14A90 /* tambourn.raw */; }; B0EC33B318CB736C0005787B /* tomhidrm.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F612118BA9B1800C14A90 /* tomhidrm.raw */; }; B0EC33B418CB736C0005787B /* tomlowdr.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F612218BA9B1800C14A90 /* tomlowdr.raw */; }; B0EC33B518CB736C0005787B /* tommiddr.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F612318BA9B1800C14A90 /* tommiddr.raw */; }; B0EC33B618CB736C0005787B /* twopeaks.raw in Resources */ = {isa = PBXBuildFile; fileRef = B08F612418BA9B1800C14A90 /* twopeaks.raw */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ B08F608F18BA9B1800C14A90 /* ADSR.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ADSR.h; path = ../include/ADSR.h; sourceTree = ""; }; B08F609018BA9B1800C14A90 /* Asymp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Asymp.h; path = ../include/Asymp.h; sourceTree = ""; }; B08F609118BA9B1800C14A90 /* BandedWG.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BandedWG.h; sourceTree = ""; }; B08F609218BA9B1800C14A90 /* BeeThree.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BeeThree.h; sourceTree = ""; }; B08F609318BA9B1800C14A90 /* BiQuad.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BiQuad.h; path = ../include/BiQuad.h; sourceTree = ""; }; B08F609418BA9B1800C14A90 /* Blit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Blit.h; path = ../include/Blit.h; sourceTree = ""; }; B08F609518BA9B1800C14A90 /* BlitSaw.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BlitSaw.h; path = ../include/BlitSaw.h; sourceTree = ""; }; B08F609618BA9B1800C14A90 /* BlitSquare.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BlitSquare.h; path = ../include/BlitSquare.h; sourceTree = ""; }; B08F609718BA9B1800C14A90 /* BlowBotl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BlowBotl.h; sourceTree = ""; }; B08F609818BA9B1800C14A90 /* BlowHole.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BlowHole.h; sourceTree = ""; }; B08F609918BA9B1800C14A90 /* Bowed.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Bowed.h; sourceTree = ""; }; B08F609A18BA9B1800C14A90 /* BowTable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BowTable.h; path = ../include/BowTable.h; sourceTree = ""; }; B08F609B18BA9B1800C14A90 /* Brass.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Brass.h; sourceTree = ""; }; B08F609C18BA9B1800C14A90 /* Chorus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Chorus.h; path = ../include/Chorus.h; sourceTree = ""; }; B08F609D18BA9B1800C14A90 /* Clarinet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Clarinet.h; sourceTree = ""; }; B08F609E18BA9B1800C14A90 /* Cubic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Cubic.h; path = ../include/Cubic.h; sourceTree = ""; }; B08F609F18BA9B1800C14A90 /* Delay.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Delay.h; path = ../include/Delay.h; sourceTree = ""; }; B08F60A018BA9B1800C14A90 /* DelayA.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DelayA.h; path = ../include/DelayA.h; sourceTree = ""; }; B08F60A118BA9B1800C14A90 /* DelayL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DelayL.h; path = ../include/DelayL.h; sourceTree = ""; }; B08F60A218BA9B1800C14A90 /* Drummer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Drummer.h; sourceTree = ""; }; B08F60A318BA9B1800C14A90 /* Echo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Echo.h; path = ../include/Echo.h; sourceTree = ""; }; B08F60A418BA9B1800C14A90 /* Effect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Effect.h; path = ../include/Effect.h; sourceTree = ""; }; B08F60A518BA9B1800C14A90 /* Envelope.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Envelope.h; path = ../include/Envelope.h; sourceTree = ""; }; B08F60A618BA9B1800C14A90 /* FileLoop.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileLoop.h; path = ../include/FileLoop.h; sourceTree = ""; }; B08F60A718BA9B1800C14A90 /* FileRead.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileRead.h; path = ../include/FileRead.h; sourceTree = ""; }; B08F60A818BA9B1800C14A90 /* FileWrite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileWrite.h; path = ../include/FileWrite.h; sourceTree = ""; }; B08F60A918BA9B1800C14A90 /* FileWvIn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileWvIn.h; path = ../include/FileWvIn.h; sourceTree = ""; }; B08F60AA18BA9B1800C14A90 /* FileWvOut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileWvOut.h; path = ../include/FileWvOut.h; sourceTree = ""; }; B08F60AB18BA9B1800C14A90 /* Filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Filter.h; path = ../include/Filter.h; sourceTree = ""; }; B08F60AC18BA9B1800C14A90 /* Fir.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Fir.h; path = ../include/Fir.h; sourceTree = ""; }; B08F60AD18BA9B1800C14A90 /* Flute.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Flute.h; sourceTree = ""; }; B08F60AE18BA9B1800C14A90 /* FM.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FM.h; path = ../include/FM.h; sourceTree = ""; }; B08F60AF18BA9B1800C14A90 /* FMVoices.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FMVoices.h; sourceTree = ""; }; B08F60B018BA9B1800C14A90 /* FormSwep.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FormSwep.h; path = ../include/FormSwep.h; sourceTree = ""; }; B08F60B118BA9B1800C14A90 /* FreeVerb.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FreeVerb.h; path = ../include/FreeVerb.h; sourceTree = ""; }; B08F60B218BA9B1800C14A90 /* Function.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Function.h; path = ../include/Function.h; sourceTree = ""; }; B08F60B318BA9B1800C14A90 /* Generator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Generator.h; path = ../include/Generator.h; sourceTree = ""; }; B08F60B418BA9B1800C14A90 /* Granulate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Granulate.h; path = ../include/Granulate.h; sourceTree = ""; }; B08F60B518BA9B1800C14A90 /* Guitar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Guitar.h; sourceTree = ""; }; B08F60B618BA9B1800C14A90 /* HevyMetl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HevyMetl.h; sourceTree = ""; }; B08F60B718BA9B1800C14A90 /* Iir.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Iir.h; path = ../include/Iir.h; sourceTree = ""; }; B08F60BA18BA9B1800C14A90 /* Instrmnt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Instrmnt.h; path = ../include/Instrmnt.h; sourceTree = ""; }; B08F60BB18BA9B1800C14A90 /* JCRev.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JCRev.h; path = ../include/JCRev.h; sourceTree = ""; }; B08F60BC18BA9B1800C14A90 /* JetTable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JetTable.h; path = ../include/JetTable.h; sourceTree = ""; }; B08F60BD18BA9B1800C14A90 /* LentPitShift.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LentPitShift.h; path = ../include/LentPitShift.h; sourceTree = ""; }; B08F60BE18BA9B1800C14A90 /* Mandolin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Mandolin.h; sourceTree = ""; }; B08F60BF18BA9B1800C14A90 /* Mesh2D.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Mesh2D.h; sourceTree = ""; }; B08F60C018BA9B1800C14A90 /* Messager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Messager.h; path = ../include/Messager.h; sourceTree = ""; }; B08F60C118BA9B1800C14A90 /* MidiFileIn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MidiFileIn.h; path = ../include/MidiFileIn.h; sourceTree = ""; }; B08F60C218BA9B1800C14A90 /* Modal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Modal.h; path = ../include/Modal.h; sourceTree = ""; }; B08F60C318BA9B1800C14A90 /* ModalBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ModalBar.h; sourceTree = ""; }; B08F60C418BA9B1800C14A90 /* Modulate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Modulate.h; path = ../include/Modulate.h; sourceTree = ""; }; B08F60C518BA9B1800C14A90 /* Moog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Moog.h; sourceTree = ""; }; B08F60C718BA9B1800C14A90 /* Noise.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Noise.h; path = ../include/Noise.h; sourceTree = ""; }; B08F60C818BA9B1800C14A90 /* NRev.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = NRev.h; path = ../include/NRev.h; sourceTree = ""; }; B08F60C918BA9B1800C14A90 /* OnePole.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OnePole.h; path = ../include/OnePole.h; sourceTree = ""; }; B08F60CA18BA9B1800C14A90 /* OneZero.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OneZero.h; path = ../include/OneZero.h; sourceTree = ""; }; B08F60CB18BA9B1800C14A90 /* PercFlut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PercFlut.h; sourceTree = ""; }; B08F60CC18BA9B1800C14A90 /* Phonemes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Phonemes.h; path = ../include/Phonemes.h; sourceTree = ""; }; B08F60CD18BA9B1800C14A90 /* PitShift.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PitShift.h; path = ../include/PitShift.h; sourceTree = ""; }; B08F60CE18BA9B1800C14A90 /* Plucked.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Plucked.h; sourceTree = ""; }; B08F60CF18BA9B1800C14A90 /* PoleZero.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PoleZero.h; path = ../include/PoleZero.h; sourceTree = ""; }; B08F60D018BA9B1800C14A90 /* PRCRev.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PRCRev.h; path = ../include/PRCRev.h; sourceTree = ""; }; B08F60D118BA9B1800C14A90 /* ReedTable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReedTable.h; path = ../include/ReedTable.h; sourceTree = ""; }; B08F60D218BA9B1800C14A90 /* Resonate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Resonate.h; sourceTree = ""; }; B08F60D318BA9B1800C14A90 /* Rhodey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Rhodey.h; sourceTree = ""; }; B08F60D918BA9B1800C14A90 /* Sampler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Sampler.h; sourceTree = ""; }; B08F60DA18BA9B1800C14A90 /* Saxofony.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Saxofony.h; sourceTree = ""; }; B08F60DB18BA9B1800C14A90 /* Shakers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Shakers.h; sourceTree = ""; }; B08F60DC18BA9B1800C14A90 /* Simple.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Simple.h; sourceTree = ""; }; B08F60DD18BA9B1800C14A90 /* SineWave.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SineWave.h; path = ../include/SineWave.h; sourceTree = ""; }; B08F60DE18BA9B1800C14A90 /* SingWave.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SingWave.h; path = ../include/SingWave.h; sourceTree = ""; }; B08F60DF18BA9B1800C14A90 /* Sitar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Sitar.h; sourceTree = ""; }; B08F60E018BA9B1800C14A90 /* Skini.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Skini.h; path = ../include/Skini.h; sourceTree = ""; }; B08F60E118BA9B1800C14A90 /* SKINI.msg */ = {isa = PBXFileReference; lastKnownFileType = text; name = SKINI.msg; path = ../include/SKINI.msg; sourceTree = ""; }; B08F60E218BA9B1800C14A90 /* SKINI.tbl */ = {isa = PBXFileReference; lastKnownFileType = text; name = SKINI.tbl; path = ../include/SKINI.tbl; sourceTree = ""; }; B08F60E418BA9B1800C14A90 /* Sphere.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Sphere.h; path = ../include/Sphere.h; sourceTree = ""; }; B08F60E518BA9B1800C14A90 /* StifKarp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StifKarp.h; sourceTree = ""; }; B08F60E618BA9B1800C14A90 /* Stk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Stk.h; path = ../include/Stk.h; sourceTree = ""; }; B08F60E718BA9B1800C14A90 /* TapDelay.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TapDelay.h; path = ../include/TapDelay.h; sourceTree = ""; }; B08F60EB18BA9B1800C14A90 /* TubeBell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TubeBell.h; sourceTree = ""; }; B08F60EC18BA9B1800C14A90 /* Twang.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Twang.h; sourceTree = ""; }; B08F60ED18BA9B1800C14A90 /* TwoPole.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TwoPole.h; path = ../include/TwoPole.h; sourceTree = ""; }; B08F60EE18BA9B1800C14A90 /* TwoZero.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TwoZero.h; path = ../include/TwoZero.h; sourceTree = ""; }; B08F60F018BA9B1800C14A90 /* Vector3D.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Vector3D.h; path = ../include/Vector3D.h; sourceTree = ""; }; B08F60F118BA9B1800C14A90 /* Voicer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Voicer.h; path = ../include/Voicer.h; sourceTree = ""; }; B08F60F218BA9B1800C14A90 /* VoicForm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VoicForm.h; sourceTree = ""; }; B08F60F318BA9B1800C14A90 /* Whistle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Whistle.h; sourceTree = ""; }; B08F60F418BA9B1800C14A90 /* Wurley.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Wurley.h; sourceTree = ""; }; B08F60F518BA9B1800C14A90 /* WvIn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WvIn.h; path = ../include/WvIn.h; sourceTree = ""; }; B08F60F618BA9B1800C14A90 /* WvOut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WvOut.h; path = ../include/WvOut.h; sourceTree = ""; }; B08F60F818BA9B1800C14A90 /* ahh.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = ahh.raw; sourceTree = ""; }; B08F60F918BA9B1800C14A90 /* bassdrum.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = bassdrum.raw; sourceTree = ""; }; B08F60FA18BA9B1800C14A90 /* britestk.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = britestk.raw; sourceTree = ""; }; B08F60FB18BA9B1800C14A90 /* cowbell1.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = cowbell1.raw; sourceTree = ""; }; B08F60FC18BA9B1800C14A90 /* crashcym.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = crashcym.raw; sourceTree = ""; }; B08F60FD18BA9B1800C14A90 /* dope.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = dope.raw; sourceTree = ""; }; B08F60FE18BA9B1800C14A90 /* eee.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = eee.raw; sourceTree = ""; }; B08F60FF18BA9B1800C14A90 /* fwavblnk.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = fwavblnk.raw; sourceTree = ""; }; B08F610018BA9B1800C14A90 /* halfwave.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = halfwave.raw; sourceTree = ""; }; B08F610118BA9B1800C14A90 /* hihatcym.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = hihatcym.raw; sourceTree = ""; }; B08F610218BA9B1800C14A90 /* impuls10.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = impuls10.raw; sourceTree = ""; }; B08F610318BA9B1800C14A90 /* impuls20.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = impuls20.raw; sourceTree = ""; }; B08F610418BA9B1800C14A90 /* impuls40.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = impuls40.raw; sourceTree = ""; }; B08F610818BA9B1800C14A90 /* mand1.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand1.raw; sourceTree = ""; }; B08F610918BA9B1800C14A90 /* mand10.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand10.raw; sourceTree = ""; }; B08F610A18BA9B1800C14A90 /* mand11.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand11.raw; sourceTree = ""; }; B08F610B18BA9B1800C14A90 /* mand12.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand12.raw; sourceTree = ""; }; B08F610C18BA9B1800C14A90 /* mand2.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand2.raw; sourceTree = ""; }; B08F610D18BA9B1800C14A90 /* mand3.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand3.raw; sourceTree = ""; }; B08F610E18BA9B1800C14A90 /* mand4.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand4.raw; sourceTree = ""; }; B08F610F18BA9B1800C14A90 /* mand5.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand5.raw; sourceTree = ""; }; B08F611018BA9B1800C14A90 /* mand6.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand6.raw; sourceTree = ""; }; B08F611118BA9B1800C14A90 /* mand7.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand7.raw; sourceTree = ""; }; B08F611218BA9B1800C14A90 /* mand8.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand8.raw; sourceTree = ""; }; B08F611318BA9B1800C14A90 /* mand9.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mand9.raw; sourceTree = ""; }; B08F611418BA9B1800C14A90 /* mandpluk.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = mandpluk.raw; sourceTree = ""; }; B08F611518BA9B1800C14A90 /* marmstk1.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = marmstk1.raw; sourceTree = ""; }; B08F611618BA9B1800C14A90 /* ooo.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = ooo.raw; sourceTree = ""; }; B08F611718BA9B1800C14A90 /* peksblnk.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = peksblnk.raw; sourceTree = ""; }; B08F611818BA9B1800C14A90 /* ppksblnk.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = ppksblnk.raw; sourceTree = ""; }; B08F611918BA9B1800C14A90 /* ridecymb.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = ridecymb.raw; sourceTree = ""; }; B08F611A18BA9B1800C14A90 /* silence.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = silence.raw; sourceTree = ""; }; B08F611C18BA9B1800C14A90 /* sineblnk.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = sineblnk.raw; sourceTree = ""; }; B08F611D18BA9B1800C14A90 /* sinewave.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = sinewave.raw; sourceTree = ""; }; B08F611E18BA9B1800C14A90 /* snardrum.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = snardrum.raw; sourceTree = ""; }; B08F611F18BA9B1800C14A90 /* snglpeak.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = snglpeak.raw; sourceTree = ""; }; B08F612018BA9B1800C14A90 /* tambourn.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = tambourn.raw; sourceTree = ""; }; B08F612118BA9B1800C14A90 /* tomhidrm.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = tomhidrm.raw; sourceTree = ""; }; B08F612218BA9B1800C14A90 /* tomlowdr.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = tomlowdr.raw; sourceTree = ""; }; B08F612318BA9B1800C14A90 /* tommiddr.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = tommiddr.raw; sourceTree = ""; }; B08F612418BA9B1800C14A90 /* twopeaks.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = twopeaks.raw; sourceTree = ""; }; B08F612618BA9B1800C14A90 /* ADSR.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ADSR.cpp; sourceTree = ""; }; B08F612718BA9B1800C14A90 /* Asymp.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Asymp.cpp; sourceTree = ""; }; B08F612818BA9B1800C14A90 /* BandedWG.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BandedWG.cpp; path = ../src/BandedWG.cpp; sourceTree = ""; }; B08F612918BA9B1800C14A90 /* BeeThree.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BeeThree.cpp; path = ../src/BeeThree.cpp; sourceTree = ""; }; B08F612A18BA9B1800C14A90 /* BiQuad.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = BiQuad.cpp; sourceTree = ""; }; B08F612B18BA9B1800C14A90 /* Blit.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Blit.cpp; sourceTree = ""; }; B08F612C18BA9B1800C14A90 /* BlitSaw.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = BlitSaw.cpp; sourceTree = ""; }; B08F612D18BA9B1800C14A90 /* BlitSquare.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = BlitSquare.cpp; sourceTree = ""; }; B08F612E18BA9B1800C14A90 /* BlowBotl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BlowBotl.cpp; path = ../src/BlowBotl.cpp; sourceTree = ""; }; B08F612F18BA9B1800C14A90 /* BlowHole.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BlowHole.cpp; path = ../src/BlowHole.cpp; sourceTree = ""; }; B08F613018BA9B1800C14A90 /* Bowed.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Bowed.cpp; path = ../src/Bowed.cpp; sourceTree = ""; }; B08F613118BA9B1800C14A90 /* Brass.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Brass.cpp; path = ../src/Brass.cpp; sourceTree = ""; }; B08F613218BA9B1800C14A90 /* Chorus.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Chorus.cpp; sourceTree = ""; }; B08F613318BA9B1800C14A90 /* Clarinet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Clarinet.cpp; path = ../src/Clarinet.cpp; sourceTree = ""; }; B08F613418BA9B1800C14A90 /* Delay.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Delay.cpp; sourceTree = ""; }; B08F613518BA9B1800C14A90 /* DelayA.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DelayA.cpp; sourceTree = ""; }; B08F613618BA9B1800C14A90 /* DelayL.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DelayL.cpp; sourceTree = ""; }; B08F613718BA9B1800C14A90 /* Drummer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Drummer.cpp; path = ../src/Drummer.cpp; sourceTree = ""; }; B08F613818BA9B1800C14A90 /* Echo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Echo.cpp; sourceTree = ""; }; B08F613918BA9B1800C14A90 /* Envelope.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Envelope.cpp; sourceTree = ""; }; B08F613A18BA9B1800C14A90 /* FileLoop.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FileLoop.cpp; sourceTree = ""; }; B08F613B18BA9B1800C14A90 /* FileRead.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FileRead.cpp; sourceTree = ""; }; B08F613C18BA9B1800C14A90 /* FileWrite.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FileWrite.cpp; sourceTree = ""; }; B08F613D18BA9B1800C14A90 /* FileWvIn.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FileWvIn.cpp; sourceTree = ""; }; B08F613E18BA9B1800C14A90 /* FileWvOut.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FileWvOut.cpp; sourceTree = ""; }; B08F613F18BA9B1800C14A90 /* Fir.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Fir.cpp; sourceTree = ""; }; B08F614018BA9B1800C14A90 /* Flute.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Flute.cpp; path = ../src/Flute.cpp; sourceTree = ""; }; B08F614118BA9B1800C14A90 /* FM.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FM.cpp; sourceTree = ""; }; B08F614218BA9B1800C14A90 /* FMVoices.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FMVoices.cpp; path = ../src/FMVoices.cpp; sourceTree = ""; }; B08F614318BA9B1800C14A90 /* FormSwep.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FormSwep.cpp; sourceTree = ""; }; B08F614418BA9B1800C14A90 /* FreeVerb.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FreeVerb.cpp; sourceTree = ""; }; B08F614518BA9B1800C14A90 /* Granulate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Granulate.cpp; sourceTree = ""; }; B08F614618BA9B1800C14A90 /* Guitar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Guitar.cpp; path = ../src/Guitar.cpp; sourceTree = ""; }; B08F614718BA9B1800C14A90 /* HevyMetl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HevyMetl.cpp; path = ../src/HevyMetl.cpp; sourceTree = ""; }; B08F614818BA9B1800C14A90 /* Iir.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Iir.cpp; sourceTree = ""; }; B08F615A18BA9B1800C14A90 /* JCRev.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JCRev.cpp; sourceTree = ""; }; B08F615B18BA9B1800C14A90 /* LentPitShift.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = LentPitShift.cpp; sourceTree = ""; }; B08F615D18BA9B1800C14A90 /* Mandolin.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Mandolin.cpp; path = ../src/Mandolin.cpp; sourceTree = ""; }; B08F615E18BA9B1800C14A90 /* Mesh2D.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Mesh2D.cpp; path = ../src/Mesh2D.cpp; sourceTree = ""; }; B08F615F18BA9B1800C14A90 /* Messager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Messager.cpp; path = ../src/Messager.cpp; sourceTree = ""; }; B08F616018BA9B1800C14A90 /* MidiFileIn.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MidiFileIn.cpp; path = ../src/MidiFileIn.cpp; sourceTree = ""; }; B08F616118BA9B1800C14A90 /* Modal.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Modal.cpp; sourceTree = ""; }; B08F616218BA9B1800C14A90 /* ModalBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ModalBar.cpp; path = ../src/ModalBar.cpp; sourceTree = ""; }; B08F616318BA9B1800C14A90 /* Modulate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Modulate.cpp; sourceTree = ""; }; B08F616418BA9B1800C14A90 /* Moog.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Moog.cpp; path = ../src/Moog.cpp; sourceTree = ""; }; B08F616618BA9B1800C14A90 /* Noise.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Noise.cpp; sourceTree = ""; }; B08F616718BA9B1800C14A90 /* NRev.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = NRev.cpp; sourceTree = ""; }; B08F616818BA9B1800C14A90 /* OnePole.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = OnePole.cpp; sourceTree = ""; }; B08F616918BA9B1800C14A90 /* OneZero.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = OneZero.cpp; sourceTree = ""; }; B08F616A18BA9B1800C14A90 /* PercFlut.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PercFlut.cpp; path = ../src/PercFlut.cpp; sourceTree = ""; }; B08F616B18BA9B1800C14A90 /* Phonemes.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Phonemes.cpp; path = ../src/Phonemes.cpp; sourceTree = ""; }; B08F616C18BA9B1800C14A90 /* PitShift.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PitShift.cpp; sourceTree = ""; }; B08F616D18BA9B1800C14A90 /* Plucked.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Plucked.cpp; path = ../src/Plucked.cpp; sourceTree = ""; }; B08F616E18BA9B1800C14A90 /* PoleZero.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PoleZero.cpp; sourceTree = ""; }; B08F616F18BA9B1800C14A90 /* PRCRev.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PRCRev.cpp; sourceTree = ""; }; B08F617018BA9B1800C14A90 /* Resonate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Resonate.cpp; path = ../src/Resonate.cpp; sourceTree = ""; }; B08F617118BA9B1800C14A90 /* Rhodey.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Rhodey.cpp; path = ../src/Rhodey.cpp; sourceTree = ""; }; B08F617618BA9B1800C14A90 /* Sampler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Sampler.cpp; path = ../src/Sampler.cpp; sourceTree = ""; }; B08F617718BA9B1800C14A90 /* Saxofony.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Saxofony.cpp; path = ../src/Saxofony.cpp; sourceTree = ""; }; B08F617818BA9B1800C14A90 /* Shakers.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Shakers.cpp; path = ../src/Shakers.cpp; sourceTree = ""; }; B08F617918BA9B1800C14A90 /* Simple.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Simple.cpp; path = ../src/Simple.cpp; sourceTree = ""; }; B08F617A18BA9B1800C14A90 /* SineWave.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SineWave.cpp; sourceTree = ""; }; B08F617B18BA9B1800C14A90 /* SingWave.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SingWave.cpp; path = ../src/SingWave.cpp; sourceTree = ""; }; B08F617C18BA9B1800C14A90 /* Sitar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Sitar.cpp; path = ../src/Sitar.cpp; sourceTree = ""; }; B08F617D18BA9B1800C14A90 /* Skini.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Skini.cpp; sourceTree = ""; }; B08F617F18BA9B1800C14A90 /* Sphere.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Sphere.cpp; path = ../src/Sphere.cpp; sourceTree = ""; }; B08F618018BA9B1800C14A90 /* StifKarp.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = StifKarp.cpp; path = ../src/StifKarp.cpp; sourceTree = ""; }; B08F618118BA9B1800C14A90 /* Stk.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Stk.cpp; sourceTree = ""; }; B08F618218BA9B1800C14A90 /* TapDelay.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TapDelay.cpp; sourceTree = ""; }; B08F618618BA9B1800C14A90 /* TubeBell.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TubeBell.cpp; path = ../src/TubeBell.cpp; sourceTree = ""; }; B08F618718BA9B1900C14A90 /* Twang.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Twang.cpp; path = ../src/Twang.cpp; sourceTree = ""; }; B08F618818BA9B1900C14A90 /* TwoPole.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TwoPole.cpp; sourceTree = ""; }; B08F618918BA9B1900C14A90 /* TwoZero.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TwoZero.cpp; sourceTree = ""; }; B08F618B18BA9B1900C14A90 /* Voicer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Voicer.cpp; path = ../src/Voicer.cpp; sourceTree = ""; }; B08F618C18BA9B1900C14A90 /* VoicForm.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = VoicForm.cpp; path = ../src/VoicForm.cpp; sourceTree = ""; }; B08F618D18BA9B1900C14A90 /* Whistle.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Whistle.cpp; path = ../src/Whistle.cpp; sourceTree = ""; }; B08F618E18BA9B1900C14A90 /* Wurley.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Wurley.cpp; path = ../src/Wurley.cpp; sourceTree = ""; }; B0AC5BEE18CB31DE00D860C0 /* libSTK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSTK.a; sourceTree = BUILT_PRODUCTS_DIR; }; B0EC33B718CB73A70005787B /* rawwaves.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = rawwaves.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ B0AC5BEB18CB31DE00D860C0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; B0EC337918CB73480005787B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ B05F5A5A18BC1018008EE790 /* Helpers */ = { isa = PBXGroup; children = ( B08F619718BC06A300C14A90 /* Base */, B08F60C018BA9B1800C14A90 /* Messager.h */, B08F615F18BA9B1800C14A90 /* Messager.cpp */, B08F60C118BA9B1800C14A90 /* MidiFileIn.h */, B08F616018BA9B1800C14A90 /* MidiFileIn.cpp */, B08F60CC18BA9B1800C14A90 /* Phonemes.h */, B08F616B18BA9B1800C14A90 /* Phonemes.cpp */, B08F60DE18BA9B1800C14A90 /* SingWave.h */, B08F617B18BA9B1800C14A90 /* SingWave.cpp */, B08F60E418BA9B1800C14A90 /* Sphere.h */, B08F617F18BA9B1800C14A90 /* Sphere.cpp */, B08F60F118BA9B1800C14A90 /* Voicer.h */, B08F618B18BA9B1900C14A90 /* Voicer.cpp */, E81E86DB18BBDAA800289223 /* File I/O */, E81E86D918BBD9D000289223 /* Maths */, E81E86DD18BBDBC900289223 /* SKINI */, B08F60F718BA9B1800C14A90 /* rawwaves */, ); name = Helpers; sourceTree = ""; }; B08F608718BA9B0600C14A90 = { isa = PBXGroup; children = ( B08F619018BA9E1C00C14A90 /* Generators */, B08F608E18BA9B1800C14A90 /* Instruments */, E81E86DA18BBDA1200289223 /* Effects */, E81E86D818BBD93600289223 /* Filters */, B05F5A5A18BC1018008EE790 /* Helpers */, B0FBB66118F89ED900845111 /* Products */, ); sourceTree = ""; }; B08F608E18BA9B1800C14A90 /* Instruments */ = { isa = PBXGroup; children = ( B08F609118BA9B1800C14A90 /* BandedWG.h */, B08F612818BA9B1800C14A90 /* BandedWG.cpp */, B08F609218BA9B1800C14A90 /* BeeThree.h */, B08F612918BA9B1800C14A90 /* BeeThree.cpp */, B08F609718BA9B1800C14A90 /* BlowBotl.h */, B08F612E18BA9B1800C14A90 /* BlowBotl.cpp */, B08F609818BA9B1800C14A90 /* BlowHole.h */, B08F612F18BA9B1800C14A90 /* BlowHole.cpp */, B08F609918BA9B1800C14A90 /* Bowed.h */, B08F613018BA9B1800C14A90 /* Bowed.cpp */, B08F609B18BA9B1800C14A90 /* Brass.h */, B08F613118BA9B1800C14A90 /* Brass.cpp */, B08F609D18BA9B1800C14A90 /* Clarinet.h */, B08F613318BA9B1800C14A90 /* Clarinet.cpp */, B08F60A218BA9B1800C14A90 /* Drummer.h */, B08F613718BA9B1800C14A90 /* Drummer.cpp */, B08F60AD18BA9B1800C14A90 /* Flute.h */, B08F614018BA9B1800C14A90 /* Flute.cpp */, B08F60AF18BA9B1800C14A90 /* FMVoices.h */, B08F614218BA9B1800C14A90 /* FMVoices.cpp */, B08F60B518BA9B1800C14A90 /* Guitar.h */, B08F614618BA9B1800C14A90 /* Guitar.cpp */, B08F60B618BA9B1800C14A90 /* HevyMetl.h */, B08F614718BA9B1800C14A90 /* HevyMetl.cpp */, B08F60BE18BA9B1800C14A90 /* Mandolin.h */, B08F615D18BA9B1800C14A90 /* Mandolin.cpp */, B08F60C318BA9B1800C14A90 /* ModalBar.h */, B08F616218BA9B1800C14A90 /* ModalBar.cpp */, B08F60C518BA9B1800C14A90 /* Moog.h */, B08F616418BA9B1800C14A90 /* Moog.cpp */, B08F60BF18BA9B1800C14A90 /* Mesh2D.h */, B08F615E18BA9B1800C14A90 /* Mesh2D.cpp */, B08F60CB18BA9B1800C14A90 /* PercFlut.h */, B08F616A18BA9B1800C14A90 /* PercFlut.cpp */, B08F60CE18BA9B1800C14A90 /* Plucked.h */, B08F616D18BA9B1800C14A90 /* Plucked.cpp */, B08F60D218BA9B1800C14A90 /* Resonate.h */, B08F617018BA9B1800C14A90 /* Resonate.cpp */, B08F60D318BA9B1800C14A90 /* Rhodey.h */, B08F617118BA9B1800C14A90 /* Rhodey.cpp */, B08F60D918BA9B1800C14A90 /* Sampler.h */, B08F617618BA9B1800C14A90 /* Sampler.cpp */, B08F60DA18BA9B1800C14A90 /* Saxofony.h */, B08F617718BA9B1800C14A90 /* Saxofony.cpp */, B08F60DB18BA9B1800C14A90 /* Shakers.h */, B08F617818BA9B1800C14A90 /* Shakers.cpp */, B08F60DC18BA9B1800C14A90 /* Simple.h */, B08F617918BA9B1800C14A90 /* Simple.cpp */, B08F60DF18BA9B1800C14A90 /* Sitar.h */, B08F617C18BA9B1800C14A90 /* Sitar.cpp */, B08F60E518BA9B1800C14A90 /* StifKarp.h */, B08F618018BA9B1800C14A90 /* StifKarp.cpp */, B08F60EB18BA9B1800C14A90 /* TubeBell.h */, B08F618618BA9B1800C14A90 /* TubeBell.cpp */, B08F60EC18BA9B1800C14A90 /* Twang.h */, B08F618718BA9B1900C14A90 /* Twang.cpp */, B08F60F218BA9B1800C14A90 /* VoicForm.h */, B08F618C18BA9B1900C14A90 /* VoicForm.cpp */, B08F60F318BA9B1800C14A90 /* Whistle.h */, B08F618D18BA9B1900C14A90 /* Whistle.cpp */, B08F60F418BA9B1800C14A90 /* Wurley.h */, B08F618E18BA9B1900C14A90 /* Wurley.cpp */, ); name = Instruments; path = ../include; sourceTree = ""; }; B08F60F718BA9B1800C14A90 /* rawwaves */ = { isa = PBXGroup; children = ( B08F60F818BA9B1800C14A90 /* ahh.raw */, B08F60F918BA9B1800C14A90 /* bassdrum.raw */, B08F60FA18BA9B1800C14A90 /* britestk.raw */, B08F60FB18BA9B1800C14A90 /* cowbell1.raw */, B08F60FC18BA9B1800C14A90 /* crashcym.raw */, B08F60FD18BA9B1800C14A90 /* dope.raw */, B08F60FE18BA9B1800C14A90 /* eee.raw */, B08F60FF18BA9B1800C14A90 /* fwavblnk.raw */, B08F610018BA9B1800C14A90 /* halfwave.raw */, B08F610118BA9B1800C14A90 /* hihatcym.raw */, B08F610218BA9B1800C14A90 /* impuls10.raw */, B08F610318BA9B1800C14A90 /* impuls20.raw */, B08F610418BA9B1800C14A90 /* impuls40.raw */, B08F610818BA9B1800C14A90 /* mand1.raw */, B08F610918BA9B1800C14A90 /* mand10.raw */, B08F610A18BA9B1800C14A90 /* mand11.raw */, B08F610B18BA9B1800C14A90 /* mand12.raw */, B08F610C18BA9B1800C14A90 /* mand2.raw */, B08F610D18BA9B1800C14A90 /* mand3.raw */, B08F610E18BA9B1800C14A90 /* mand4.raw */, B08F610F18BA9B1800C14A90 /* mand5.raw */, B08F611018BA9B1800C14A90 /* mand6.raw */, B08F611118BA9B1800C14A90 /* mand7.raw */, B08F611218BA9B1800C14A90 /* mand8.raw */, B08F611318BA9B1800C14A90 /* mand9.raw */, B08F611418BA9B1800C14A90 /* mandpluk.raw */, B08F611518BA9B1800C14A90 /* marmstk1.raw */, B08F611618BA9B1800C14A90 /* ooo.raw */, B08F611718BA9B1800C14A90 /* peksblnk.raw */, B08F611818BA9B1800C14A90 /* ppksblnk.raw */, B08F611918BA9B1800C14A90 /* ridecymb.raw */, B08F611A18BA9B1800C14A90 /* silence.raw */, B08F611C18BA9B1800C14A90 /* sineblnk.raw */, B08F611D18BA9B1800C14A90 /* sinewave.raw */, B08F611E18BA9B1800C14A90 /* snardrum.raw */, B08F611F18BA9B1800C14A90 /* snglpeak.raw */, B08F612018BA9B1800C14A90 /* tambourn.raw */, B08F612118BA9B1800C14A90 /* tomhidrm.raw */, B08F612218BA9B1800C14A90 /* tomlowdr.raw */, B08F612318BA9B1800C14A90 /* tommiddr.raw */, B08F612418BA9B1800C14A90 /* twopeaks.raw */, ); name = rawwaves; path = ../rawwaves; sourceTree = ""; }; B08F619018BA9E1C00C14A90 /* Generators */ = { isa = PBXGroup; children = ( B08F608F18BA9B1800C14A90 /* ADSR.h */, B08F612618BA9B1800C14A90 /* ADSR.cpp */, B08F609018BA9B1800C14A90 /* Asymp.h */, B08F612718BA9B1800C14A90 /* Asymp.cpp */, B08F609418BA9B1800C14A90 /* Blit.h */, B08F612B18BA9B1800C14A90 /* Blit.cpp */, B08F609518BA9B1800C14A90 /* BlitSaw.h */, B08F612C18BA9B1800C14A90 /* BlitSaw.cpp */, B08F609618BA9B1800C14A90 /* BlitSquare.h */, B08F612D18BA9B1800C14A90 /* BlitSquare.cpp */, B08F60A518BA9B1800C14A90 /* Envelope.h */, B08F613918BA9B1800C14A90 /* Envelope.cpp */, B08F60B418BA9B1800C14A90 /* Granulate.h */, B08F614518BA9B1800C14A90 /* Granulate.cpp */, B08F60C418BA9B1800C14A90 /* Modulate.h */, B08F616318BA9B1800C14A90 /* Modulate.cpp */, B08F60C718BA9B1800C14A90 /* Noise.h */, B08F616618BA9B1800C14A90 /* Noise.cpp */, B08F60DD18BA9B1800C14A90 /* SineWave.h */, B08F617A18BA9B1800C14A90 /* SineWave.cpp */, ); name = Generators; path = ../src; sourceTree = ""; }; B08F619718BC06A300C14A90 /* Base */ = { isa = PBXGroup; children = ( B08F60E618BA9B1800C14A90 /* Stk.h */, B08F618118BA9B1800C14A90 /* Stk.cpp */, B08F60A418BA9B1800C14A90 /* Effect.h */, B08F60AB18BA9B1800C14A90 /* Filter.h */, B08F60B318BA9B1800C14A90 /* Generator.h */, B08F60BA18BA9B1800C14A90 /* Instrmnt.h */, B08F60AE18BA9B1800C14A90 /* FM.h */, B08F614118BA9B1800C14A90 /* FM.cpp */, B08F60C218BA9B1800C14A90 /* Modal.h */, B08F616118BA9B1800C14A90 /* Modal.cpp */, ); name = Base; path = ../src; sourceTree = ""; }; B0FBB66118F89ED900845111 /* Products */ = { isa = PBXGroup; children = ( B0AC5BEE18CB31DE00D860C0 /* libSTK.a */, B0EC33B718CB73A70005787B /* rawwaves.bundle */, ); name = Products; sourceTree = ""; }; E81E86D818BBD93600289223 /* Filters */ = { isa = PBXGroup; children = ( B08F609318BA9B1800C14A90 /* BiQuad.h */, B08F612A18BA9B1800C14A90 /* BiQuad.cpp */, B08F60AC18BA9B1800C14A90 /* Fir.h */, B08F613F18BA9B1800C14A90 /* Fir.cpp */, B08F60B018BA9B1800C14A90 /* FormSwep.h */, B08F614318BA9B1800C14A90 /* FormSwep.cpp */, B08F614818BA9B1800C14A90 /* Iir.cpp */, B08F60B718BA9B1800C14A90 /* Iir.h */, B08F60C918BA9B1800C14A90 /* OnePole.h */, B08F616818BA9B1800C14A90 /* OnePole.cpp */, B08F60CA18BA9B1800C14A90 /* OneZero.h */, B08F616918BA9B1800C14A90 /* OneZero.cpp */, B08F60CF18BA9B1800C14A90 /* PoleZero.h */, B08F616E18BA9B1800C14A90 /* PoleZero.cpp */, B08F60ED18BA9B1800C14A90 /* TwoPole.h */, B08F618818BA9B1900C14A90 /* TwoPole.cpp */, B08F60EE18BA9B1800C14A90 /* TwoZero.h */, B08F618918BA9B1900C14A90 /* TwoZero.cpp */, ); name = Filters; path = ../src; sourceTree = ""; }; E81E86D918BBD9D000289223 /* Maths */ = { isa = PBXGroup; children = ( B08F60B218BA9B1800C14A90 /* Function.h */, B08F609A18BA9B1800C14A90 /* BowTable.h */, B08F609E18BA9B1800C14A90 /* Cubic.h */, B08F60BC18BA9B1800C14A90 /* JetTable.h */, B08F60D118BA9B1800C14A90 /* ReedTable.h */, B08F60F018BA9B1800C14A90 /* Vector3D.h */, ); name = Maths; path = ../src; sourceTree = ""; }; E81E86DA18BBDA1200289223 /* Effects */ = { isa = PBXGroup; children = ( B08F609C18BA9B1800C14A90 /* Chorus.h */, B08F613218BA9B1800C14A90 /* Chorus.cpp */, B08F60A318BA9B1800C14A90 /* Echo.h */, B08F613818BA9B1800C14A90 /* Echo.cpp */, B08F60BD18BA9B1800C14A90 /* LentPitShift.h */, B08F615B18BA9B1800C14A90 /* LentPitShift.cpp */, B08F60CD18BA9B1800C14A90 /* PitShift.h */, B08F616C18BA9B1800C14A90 /* PitShift.cpp */, B08F60B118BA9B1800C14A90 /* FreeVerb.h */, B08F614418BA9B1800C14A90 /* FreeVerb.cpp */, B08F60BB18BA9B1800C14A90 /* JCRev.h */, B08F615A18BA9B1800C14A90 /* JCRev.cpp */, B08F60C818BA9B1800C14A90 /* NRev.h */, B08F616718BA9B1800C14A90 /* NRev.cpp */, B08F60D018BA9B1800C14A90 /* PRCRev.h */, B08F616F18BA9B1800C14A90 /* PRCRev.cpp */, B08F609F18BA9B1800C14A90 /* Delay.h */, B08F613418BA9B1800C14A90 /* Delay.cpp */, B08F60A018BA9B1800C14A90 /* DelayA.h */, B08F613518BA9B1800C14A90 /* DelayA.cpp */, B08F60A118BA9B1800C14A90 /* DelayL.h */, B08F613618BA9B1800C14A90 /* DelayL.cpp */, B08F60E718BA9B1800C14A90 /* TapDelay.h */, B08F618218BA9B1800C14A90 /* TapDelay.cpp */, ); name = Effects; path = ../src; sourceTree = ""; }; E81E86DB18BBDAA800289223 /* File I/O */ = { isa = PBXGroup; children = ( B08F60F518BA9B1800C14A90 /* WvIn.h */, B08F60F618BA9B1800C14A90 /* WvOut.h */, B08F60A718BA9B1800C14A90 /* FileRead.h */, B08F613B18BA9B1800C14A90 /* FileRead.cpp */, B08F60A818BA9B1800C14A90 /* FileWrite.h */, B08F613C18BA9B1800C14A90 /* FileWrite.cpp */, B08F60A918BA9B1800C14A90 /* FileWvIn.h */, B08F613D18BA9B1800C14A90 /* FileWvIn.cpp */, B08F60A618BA9B1800C14A90 /* FileLoop.h */, B08F613A18BA9B1800C14A90 /* FileLoop.cpp */, B08F613E18BA9B1800C14A90 /* FileWvOut.cpp */, B08F60AA18BA9B1800C14A90 /* FileWvOut.h */, ); name = "File I/O"; path = ../src; sourceTree = ""; }; E81E86DD18BBDBC900289223 /* SKINI */ = { isa = PBXGroup; children = ( B08F60E018BA9B1800C14A90 /* Skini.h */, B08F617D18BA9B1800C14A90 /* Skini.cpp */, B08F60E118BA9B1800C14A90 /* SKINI.msg */, B08F60E218BA9B1800C14A90 /* SKINI.tbl */, ); name = SKINI; path = ../src; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ B0AC5BEC18CB31DE00D860C0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ B0AC5BED18CB31DE00D860C0 /* STK */ = { isa = PBXNativeTarget; buildConfigurationList = B0AC5BF118CB31DE00D860C0 /* Build configuration list for PBXNativeTarget "STK" */; buildPhases = ( B0AC5BEA18CB31DE00D860C0 /* Sources */, B0AC5BEB18CB31DE00D860C0 /* Frameworks */, B0AC5BEC18CB31DE00D860C0 /* Headers */, ); buildRules = ( ); dependencies = ( ); name = STK; productName = "STK_C++"; productReference = B0AC5BEE18CB31DE00D860C0 /* libSTK.a */; productType = "com.apple.product-type.library.static"; }; B0EC337B18CB73480005787B /* rawwaves */ = { isa = PBXNativeTarget; buildConfigurationList = B0EC338B18CB73480005787B /* Build configuration list for PBXNativeTarget "rawwaves" */; buildPhases = ( B0EC337818CB73480005787B /* Sources */, B0EC337918CB73480005787B /* Frameworks */, B0EC337A18CB73480005787B /* Resources */, ); buildRules = ( ); dependencies = ( ); name = rawwaves; productName = raw; productReference = B0EC33B718CB73A70005787B /* rawwaves.bundle */; productType = "com.apple.product-type.bundle"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ B08F608818BA9B0600C14A90 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0510; }; buildConfigurationList = B08F608B18BA9B0600C14A90 /* Build configuration list for PBXProject "STK" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = B08F608718BA9B0600C14A90; productRefGroup = B05F5A5A18BC1018008EE790 /* Helpers */; projectDirPath = ""; projectRoot = ""; targets = ( B0AC5BED18CB31DE00D860C0 /* STK */, B0EC337B18CB73480005787B /* rawwaves */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ B0EC337A18CB73480005787B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( B0EC338E18CB736C0005787B /* ahh.raw in Resources */, B0EC338F18CB736C0005787B /* bassdrum.raw in Resources */, B0EC339018CB736C0005787B /* britestk.raw in Resources */, B0EC339118CB736C0005787B /* cowbell1.raw in Resources */, B0EC339218CB736C0005787B /* crashcym.raw in Resources */, B0EC339318CB736C0005787B /* dope.raw in Resources */, B0EC339418CB736C0005787B /* eee.raw in Resources */, B0EC339518CB736C0005787B /* fwavblnk.raw in Resources */, B0EC339618CB736C0005787B /* halfwave.raw in Resources */, B0EC339718CB736C0005787B /* hihatcym.raw in Resources */, B0EC339818CB736C0005787B /* impuls10.raw in Resources */, B0EC339918CB736C0005787B /* impuls20.raw in Resources */, B0EC339A18CB736C0005787B /* impuls40.raw in Resources */, B0EC339B18CB736C0005787B /* mand1.raw in Resources */, B0EC339C18CB736C0005787B /* mand10.raw in Resources */, B0EC339D18CB736C0005787B /* mand11.raw in Resources */, B0EC339E18CB736C0005787B /* mand12.raw in Resources */, B0EC339F18CB736C0005787B /* mand2.raw in Resources */, B0EC33A018CB736C0005787B /* mand3.raw in Resources */, B0EC33A118CB736C0005787B /* mand4.raw in Resources */, B0EC33A218CB736C0005787B /* mand5.raw in Resources */, B0EC33A318CB736C0005787B /* mand6.raw in Resources */, B0EC33A418CB736C0005787B /* mand7.raw in Resources */, B0EC33A518CB736C0005787B /* mand8.raw in Resources */, B0EC33A618CB736C0005787B /* mand9.raw in Resources */, B0EC33A718CB736C0005787B /* mandpluk.raw in Resources */, B0EC33A818CB736C0005787B /* marmstk1.raw in Resources */, B0EC33A918CB736C0005787B /* ooo.raw in Resources */, B0EC33AA18CB736C0005787B /* peksblnk.raw in Resources */, B0EC33AB18CB736C0005787B /* ppksblnk.raw in Resources */, B0EC33AC18CB736C0005787B /* ridecymb.raw in Resources */, B0EC33AD18CB736C0005787B /* silence.raw in Resources */, B0EC33AE18CB736C0005787B /* sineblnk.raw in Resources */, B0EC33AF18CB736C0005787B /* sinewave.raw in Resources */, B0EC33B018CB736C0005787B /* snardrum.raw in Resources */, B0EC33B118CB736C0005787B /* snglpeak.raw in Resources */, B0EC33B218CB736C0005787B /* tambourn.raw in Resources */, B0EC33B318CB736C0005787B /* tomhidrm.raw in Resources */, B0EC33B418CB736C0005787B /* tomlowdr.raw in Resources */, B0EC33B518CB736C0005787B /* tommiddr.raw in Resources */, B0EC33B618CB736C0005787B /* twopeaks.raw in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ B0AC5BEA18CB31DE00D860C0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( B0AC5BF218CB330100D860C0 /* ADSR.cpp in Sources */, B0AC5BF318CB330100D860C0 /* Asymp.cpp in Sources */, B0AC5BF418CB330100D860C0 /* Blit.cpp in Sources */, B0AC5BF518CB330100D860C0 /* BlitSaw.cpp in Sources */, B0AC5BF618CB330100D860C0 /* BlitSquare.cpp in Sources */, B0AC5BF718CB330100D860C0 /* Envelope.cpp in Sources */, B0AC5BF818CB330100D860C0 /* Granulate.cpp in Sources */, B0AC5BF918CB330100D860C0 /* Modulate.cpp in Sources */, B0AC5BFA18CB330100D860C0 /* Noise.cpp in Sources */, B0AC5BFB18CB330100D860C0 /* SineWave.cpp in Sources */, B0AC5BFC18CB330100D860C0 /* BandedWG.cpp in Sources */, B0AC5BFD18CB330100D860C0 /* BeeThree.cpp in Sources */, B0AC5BFE18CB330100D860C0 /* BlowBotl.cpp in Sources */, B0AC5BFF18CB330100D860C0 /* BlowHole.cpp in Sources */, B0AC5C0018CB330100D860C0 /* Bowed.cpp in Sources */, B0AC5C0118CB330100D860C0 /* Brass.cpp in Sources */, B0AC5C0218CB330100D860C0 /* Clarinet.cpp in Sources */, B0AC5C0318CB330100D860C0 /* Drummer.cpp in Sources */, B0AC5C0418CB330100D860C0 /* Flute.cpp in Sources */, B0AC5C0518CB330100D860C0 /* FMVoices.cpp in Sources */, B0AC5C0618CB330100D860C0 /* Guitar.cpp in Sources */, B0AC5C0718CB330100D860C0 /* HevyMetl.cpp in Sources */, B0AC5C0818CB330100D860C0 /* Mandolin.cpp in Sources */, B0AC5C0918CB330100D860C0 /* ModalBar.cpp in Sources */, B0AC5C0A18CB330100D860C0 /* Moog.cpp in Sources */, B0AC5C0B18CB330100D860C0 /* Mesh2D.cpp in Sources */, B0AC5C0C18CB330100D860C0 /* PercFlut.cpp in Sources */, B0AC5C0D18CB330100D860C0 /* Plucked.cpp in Sources */, B0AC5C0E18CB330100D860C0 /* Resonate.cpp in Sources */, B0AC5C0F18CB330100D860C0 /* Rhodey.cpp in Sources */, B0AC5C1018CB330100D860C0 /* Sampler.cpp in Sources */, B0AC5C1118CB330100D860C0 /* Saxofony.cpp in Sources */, B0AC5C1218CB330100D860C0 /* Shakers.cpp in Sources */, B0AC5C1318CB330100D860C0 /* Simple.cpp in Sources */, B0AC5C1418CB330100D860C0 /* Sitar.cpp in Sources */, B0AC5C1518CB330100D860C0 /* StifKarp.cpp in Sources */, B0AC5C1618CB330100D860C0 /* TubeBell.cpp in Sources */, B0AC5C1718CB330100D860C0 /* Twang.cpp in Sources */, B0AC5C1818CB330100D860C0 /* VoicForm.cpp in Sources */, B0AC5C1918CB330100D860C0 /* Whistle.cpp in Sources */, B0AC5C1A18CB330100D860C0 /* Wurley.cpp in Sources */, B0AC5C1B18CB330100D860C0 /* Chorus.cpp in Sources */, B0AC5C1C18CB330100D860C0 /* Echo.cpp in Sources */, B0AC5C1D18CB330100D860C0 /* LentPitShift.cpp in Sources */, B0AC5C1E18CB330100D860C0 /* PitShift.cpp in Sources */, B0AC5C1F18CB330100D860C0 /* FreeVerb.cpp in Sources */, B0AC5C2018CB330100D860C0 /* JCRev.cpp in Sources */, B0AC5C2118CB330100D860C0 /* NRev.cpp in Sources */, B0AC5C2218CB330100D860C0 /* PRCRev.cpp in Sources */, B0AC5C2318CB330100D860C0 /* Delay.cpp in Sources */, B0AC5C2418CB330100D860C0 /* DelayA.cpp in Sources */, B0AC5C2518CB330100D860C0 /* DelayL.cpp in Sources */, B0AC5C2618CB330100D860C0 /* TapDelay.cpp in Sources */, B0AC5C2718CB330100D860C0 /* BiQuad.cpp in Sources */, B0AC5C2818CB330100D860C0 /* Fir.cpp in Sources */, B0AC5C2918CB330100D860C0 /* FormSwep.cpp in Sources */, B0AC5C2A18CB330100D860C0 /* Iir.cpp in Sources */, B0AC5C2B18CB330100D860C0 /* OnePole.cpp in Sources */, B0AC5C2C18CB330100D860C0 /* OneZero.cpp in Sources */, B0AC5C2D18CB330100D860C0 /* PoleZero.cpp in Sources */, B0AC5C2E18CB330100D860C0 /* TwoPole.cpp in Sources */, B0AC5C2F18CB330100D860C0 /* TwoZero.cpp in Sources */, B0AC5C3018CB330100D860C0 /* Stk.cpp in Sources */, B0AC5C3118CB330100D860C0 /* FM.cpp in Sources */, B0AC5C3218CB330100D860C0 /* Modal.cpp in Sources */, B0AC5C3318CB330100D860C0 /* Messager.cpp in Sources */, B0AC5C3418CB330100D860C0 /* MidiFileIn.cpp in Sources */, B0AC5C3518CB330100D860C0 /* Phonemes.cpp in Sources */, B0AC5C3618CB330100D860C0 /* SingWave.cpp in Sources */, B0AC5C3718CB330100D860C0 /* Sphere.cpp in Sources */, B0AC5C3818CB330100D860C0 /* Voicer.cpp in Sources */, B0AC5C3918CB330100D860C0 /* FileRead.cpp in Sources */, B0AC5C3A18CB330100D860C0 /* FileWrite.cpp in Sources */, B0AC5C3B18CB330100D860C0 /* FileWvIn.cpp in Sources */, B0AC5C3C18CB330100D860C0 /* FileLoop.cpp in Sources */, B0AC5C3D18CB330100D860C0 /* FileWvOut.cpp in Sources */, B0AC5C3E18CB330100D860C0 /* Skini.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; B0EC337818CB73480005787B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ B08F608C18BA9B0600C14A90 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ONLY_ACTIVE_ARCH = YES; }; name = Debug; }; B08F608D18BA9B0600C14A90 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Release; }; B0AC5BEF18CB31DE00D860C0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; EXECUTABLE_PREFIX = lib; GCC_C_LANGUAGE_STANDARD = "compiler-default"; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_CPP_EXCEPTIONS = YES; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_PEDANTIC = NO; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ../include/, "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); IPHONEOS_DEPLOYMENT_TARGET = 5.1; MACOSX_DEPLOYMENT_TARGET = ""; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; VALIDATE_PRODUCT = NO; }; name = Debug; }; B0AC5BF018CB31DE00D860C0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; EXECUTABLE_PREFIX = lib; GCC_C_LANGUAGE_STANDARD = "compiler-default"; GCC_ENABLE_CPP_EXCEPTIONS = YES; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_PEDANTIC = NO; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ../include/, "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); IPHONEOS_DEPLOYMENT_TARGET = 5.1; MACOSX_DEPLOYMENT_TARGET = ""; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; B0EC338C18CB73480005787B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "raw/raw-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; MACOSX_DEPLOYMENT_TARGET = 10.9; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; WRAPPER_EXTENSION = bundle; }; name = Debug; }; B0EC338D18CB73480005787B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "raw/raw-Prefix.pch"; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; MACOSX_DEPLOYMENT_TARGET = 10.9; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; WRAPPER_EXTENSION = bundle; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ B08F608B18BA9B0600C14A90 /* Build configuration list for PBXProject "STK" */ = { isa = XCConfigurationList; buildConfigurations = ( B08F608C18BA9B0600C14A90 /* Debug */, B08F608D18BA9B0600C14A90 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; B0AC5BF118CB31DE00D860C0 /* Build configuration list for PBXNativeTarget "STK" */ = { isa = XCConfigurationList; buildConfigurations = ( B0AC5BEF18CB31DE00D860C0 /* Debug */, B0AC5BF018CB31DE00D860C0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; B0EC338B18CB73480005787B /* Build configuration list for PBXNativeTarget "rawwaves" */ = { isa = XCConfigurationList; buildConfigurations = ( B0EC338C18CB73480005787B /* Debug */, B0EC338D18CB73480005787B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = B08F608818BA9B0600C14A90 /* Project object */; } stk-4.5.0/iOS/STK.xcodeproj/project.xcworkspace/0000755000076600007660000000000012327014024017260 5ustar garystk-4.5.0/iOS/STK.xcodeproj/project.xcworkspace/contents.xcworkspacedata0000644000076600007660000000023412327014024024221 0ustar gary stk-4.5.0/LICENSE0000644000076600007660000000252512327014024011144 0ustar garyThe Synthesis ToolKit in C++ (STK) Copyright (c) 1995--2014 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 "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. stk-4.5.0/Makefile.in0000644000076600007660000000201112327014024012172 0ustar gary### Do not edit -- Generated by 'configure --with-whatever' from Makefile.in RM = /bin/rm REALTIME = @realtime@ all : cd src && $(MAKE) cd projects/demo && $(MAKE) libdemo ifeq ($(REALTIME),yes) cd projects/effects && $(MAKE) libeffects cd projects/ragamatic && $(MAKE) libragamat cd projects/eguitar && $(MAKE) libeguitar endif cd projects/examples && $(MAKE) -f libMakefile clean : $(RM) -f *~ cd src && $(MAKE) clean cd projects/demo && $(MAKE) clean ifeq ($(REALTIME),yes) cd projects/effects && $(MAKE) clean cd projects/ragamatic && $(MAKE) clean cd projects/eguitar && $(MAKE) clean endif 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 ifeq ($(REALTIME),yes) cd projects/effects && $(MAKE) distclean cd projects/ragamatic && $(MAKE) distclean cd projects/eguitar && $(MAKE) distclean endif cd projects/examples && $(MAKE) distclean install: $(MAKE) -C src install stk-4.5.0/projects/0000755000076600007660000000000012327014024011764 5ustar garystk-4.5.0/projects/demo/0000755000076600007660000000000012327014024012710 5ustar garystk-4.5.0/projects/demo/Banded0000755000076600007660000000005512327014024014013 0ustar garywish < tcl/Banded.tcl | demo BandedWG -or -ipstk-4.5.0/projects/demo/Banded.bat0000755000076600007660000000005512327014024014560 0ustar garywish < tcl/Banded.tcl | demo BandedWG -or -ipstk-4.5.0/projects/demo/demo.cpp0000644000076600007660000002230312327014024014340 0ustar gary// demo.cpp // // An example STK program that allows voice playback and control of // most of the STK instruments. #include "SKINI.msg" #include "WvOut.h" #include "Instrmnt.h" #include "JCRev.h" #include "Voicer.h" #include "Skini.h" #include "RtAudio.h" #if defined(__STK_REALTIME__) #include "Mutex.h" #endif // Miscellaneous command-line parsing and instrument allocation // functions are defined in utilites.cpp ... specific to this program. #include "utilities.h" #include #include #include #include using std::min; bool done; static void finish(int ignore){ done = true; } using namespace stk; // The TickData structure holds all the class instances and data that // are shared by the various processing functions. struct TickData { WvOut **wvout; Instrmnt **instrument; Voicer *voicer; JCRev reverb; Messager messager; Skini::Message message; StkFloat volume; StkFloat t60; unsigned int nWvOuts; int nVoices; int currentVoice; int channels; int counter; bool realtime; bool settling; bool haveMessage; int frequency; // Default constructor. TickData() : wvout(0), instrument(0), voicer(0), volume(1.0), t60(0.75), nWvOuts(0), nVoices(1), currentVoice(0), channels(2), counter(0), realtime( false ), settling( false ), haveMessage( false ) {} }; #define DELTA_CONTROL_TICKS 64 // default sample frames between control input checks // The processMessage() function encapsulates the handling of control // messages. It can be easily relocated within a program structure // depending on the desired scheduling scheme. void processMessage( TickData* data ) { register StkFloat value1 = data->message.floatValues[0]; register StkFloat value2 = data->message.floatValues[1]; // If only one instrument, allow messages from all channels to control it. //int group = 1; // if ( data->nVoices > 1 ) group = data->message.channel; switch( data->message.type ) { case __SK_Exit_: if ( data->settling == false ) goto settle; done = true; return; case __SK_NoteOn_: if ( value2 > 0.0 ) { // velocity > 0 data->voicer->noteOn( value1, value2 ); break; } // else a note off, so continue to next case case __SK_NoteOff_: data->voicer->noteOff( value1, value2 ); break; case __SK_ControlChange_: if (value1 == 44.0) data->reverb.setEffectMix(value2 * ONE_OVER_128); else if (value1 == 7.0) data->volume = value2 * ONE_OVER_128; else if (value1 == 49.0) data->voicer->setFrequency( value2 ); else if (value1 == 50.0) data->voicer->controlChange( 128, value2 ); else if (value1 == 51.0) data->frequency = data->message.intValues[1]; else if (value1 == 52.0) { data->frequency += ( data->message.intValues[1] << 7 ); // Convert to a fractional MIDI note value StkFloat note = 12.0 * log( data->frequency / 220.0 ) / log( 2.0 ) + 57.0; data->voicer->setFrequency( note ); } else data->voicer->controlChange( (int) value1, value2 ); break; case __SK_AfterTouch_: data->voicer->controlChange( 128, value1 ); break; case __SK_PitchChange_: data->voicer->setFrequency( value1 ); break; case __SK_PitchBend_: data->voicer->pitchBend( value1 ); break; case __SK_Volume_: data->volume = value1 * ONE_OVER_128; break; case __SK_ProgramChange_: if ( data->currentVoice == (int) value1 ) break; // Two-stage program change process. if ( data->settling == false ) goto settle; // Stage 2: delete and reallocate new voice(s) for ( int i=0; inVoices; i++ ) { data->voicer->removeInstrument( data->instrument[i] ); delete data->instrument[i]; data->currentVoice = voiceByNumber( (int)value1, &data->instrument[i] ); if ( data->currentVoice < 0 ) data->currentVoice = voiceByNumber( 0, &data->instrument[i] ); data->voicer->addInstrument( data->instrument[i] ); data->settling = false; } } // end of switch data->haveMessage = false; return; settle: // Exit and program change messages are preceeded with a short settling period. data->voicer->silence(); data->counter = (int) (0.3 * data->t60 * Stk::sampleRate()); data->settling = true; } // The tick() function handles sample computation and scheduling of // control updates. If doing realtime audio output, it will be called // automatically when the system needs a new buffer of audio samples. int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *dataPointer ) { TickData *data = (TickData *) dataPointer; register StkFloat sample, *samples = (StkFloat *) outputBuffer; int counter, nTicks = (int) nBufferFrames; while ( nTicks > 0 && !done ) { if ( !data->haveMessage ) { data->messager.popMessage( data->message ); if ( data->message.type > 0 ) { data->counter = (long) (data->message.time * Stk::sampleRate()); data->haveMessage = true; } else data->counter = DELTA_CONTROL_TICKS; } counter = min( nTicks, data->counter ); data->counter -= counter; for ( int i=0; ivolume * data->reverb.tick( data->voicer->tick() ); for ( unsigned int j=0; jnWvOuts; j++ ) data->wvout[j]->tick(sample); if ( data->realtime ) for ( int k=0; kchannels; k++ ) *samples++ = sample; nTicks--; } if ( nTicks == 0 ) break; // Process control messages. if ( data->haveMessage ) processMessage( data ); } return 0; } int main( int argc, char *argv[] ) { TickData data; int i; #if defined(__STK_REALTIME__) RtAudio dac; #endif // If you want to change the default sample rate (set in Stk.h), do // it before instantiating any objects! If the sample rate is // specified in the command line, it will override this setting. Stk::setSampleRate( 44100.0 ); // Depending on how you compile STK, you may need to explicitly set // the path to the rawwave directory. Stk::setRawwavePath( "../../rawwaves/" ); // By default, warning messages are not printed. If we want to see // them, we need to specify that here. Stk::showWarnings( true ); // Check the command-line arguments for errors and to determine // the number of WvOut objects to be instantiated (in utilities.cpp). data.nWvOuts = checkArgs( argc, argv ); data.wvout = (WvOut **) calloc( data.nWvOuts, sizeof(WvOut *) ); // Instantiate the instrument(s) type from the command-line argument // (in utilities.cpp). data.nVoices = countVoices( argc, argv ); data.instrument = (Instrmnt **) calloc( data.nVoices, sizeof(Instrmnt *) ); data.currentVoice = voiceByName( argv[1], &data.instrument[0] ); if ( data.currentVoice < 0 ) { free( data.wvout ); free( data.instrument ); usage(argv[0]); } // If there was no error allocating the first voice, we should be fine for more. for ( i=1; iaddInstrument( data.instrument[i] ); // Parse the command-line flags, instantiate WvOut objects, and // instantiate the input message controller (in utilities.cpp). try { data.realtime = parseArgs( argc, argv, data.wvout, data.messager ); } catch (StkError &) { goto cleanup; } // If realtime output, allocate the dac here. #if defined(__STK_REALTIME__) if ( data.realtime ) { RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32; RtAudio::StreamParameters parameters; parameters.deviceId = dac.getDefaultOutputDevice(); parameters.nChannels = data.channels; unsigned int bufferFrames = RT_BUFFER_SIZE; try { dac.openStream( ¶meters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&data ); } catch ( RtAudioError& error ) { error.printMessage(); goto cleanup; } } #endif // Set the reverb parameters. data.reverb.setT60( data.t60 ); data.reverb.setEffectMix(0.2); // Install an interrupt handler function. (void) signal(SIGINT, finish); // If realtime output, set our callback function and start the dac. #if defined(__STK_REALTIME__) if ( data.realtime ) { try { dac.startStream(); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } } #endif // Setup finished. while ( !done ) { #if defined(__STK_REALTIME__) if ( data.realtime ) // Periodically check "done" status. Stk::sleep( 200 ); else #endif // Call the "tick" function to process data. tick( NULL, NULL, 256, 0, 0, (void *)&data ); } // Shut down the output stream. #if defined(__STK_REALTIME__) if ( data.realtime ) { try { dac.closeStream(); } catch ( RtAudioError& error ) { error.printMessage(); } } #endif cleanup: for ( i=0; i<(int)data.nWvOuts; i++ ) delete data.wvout[i]; free( data.wvout ); delete data.voicer; for ( i=0; i # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=demo - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "demo.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "demo.mak" CFG="demo - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "demo - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "demo - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "demo - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /D "NDEBUG" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib winmm.lib Wsock32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "demo - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /D "_DEBUG" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib winmm.lib Wsock32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "demo - Win32 Release" # Name "demo - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\ADSR.cpp # End Source File # Begin Source File SOURCE=..\..\src\Asymp.cpp # End Source File # Begin Source File SOURCE=..\..\src\BandedWG.cpp # End Source File # Begin Source File SOURCE=..\..\src\BeeThree.cpp # End Source File # Begin Source File SOURCE=..\..\src\BiQuad.cpp # End Source File # Begin Source File SOURCE=..\..\src\BlowBotl.cpp # End Source File # Begin Source File SOURCE=..\..\src\BlowHole.cpp # End Source File # Begin Source File SOURCE=..\..\src\Bowed.cpp # End Source File # Begin Source File SOURCE=..\..\src\Brass.cpp # End Source File # Begin Source File SOURCE=..\..\src\Clarinet.cpp # End Source File # Begin Source File SOURCE=..\..\src\Fir.cpp # End Source File # Begin Source File SOURCE=..\..\src\Delay.cpp # End Source File # Begin Source File SOURCE=..\..\src\DelayA.cpp # End Source File # Begin Source File SOURCE=..\..\src\DelayL.cpp # End Source File # Begin Source File SOURCE=.\demo.cpp # End Source File # Begin Source File SOURCE=..\..\src\Drummer.cpp # End Source File # Begin Source File SOURCE=..\..\src\Envelope.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWrite.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvOut.cpp # End Source File # Begin Source File SOURCE=..\..\src\Flute.cpp # End Source File # Begin Source File SOURCE=..\..\src\FM.cpp # End Source File # Begin Source File SOURCE=..\..\src\FMVoices.cpp # End Source File # Begin Source File SOURCE=..\..\src\FormSwep.cpp # End Source File # Begin Source File SOURCE=..\..\src\HevyMetl.cpp # End Source File # Begin Source File SOURCE=..\..\src\JCRev.cpp # End Source File # Begin Source File SOURCE=..\..\src\Mandolin.cpp # End Source File # Begin Source File SOURCE=..\..\src\Mesh2D.cpp # End Source File # Begin Source File SOURCE=..\..\src\Messager.cpp # End Source File # Begin Source File SOURCE=..\..\src\Modal.cpp # End Source File # Begin Source File SOURCE=..\..\src\ModalBar.cpp # End Source File # Begin Source File SOURCE=..\..\src\Modulate.cpp # End Source File # Begin Source File SOURCE=..\..\src\Moog.cpp # End Source File # Begin Source File SOURCE=..\..\src\Mutex.cpp # End Source File # Begin Source File SOURCE=..\..\src\Noise.cpp # End Source File # Begin Source File SOURCE=..\..\src\NRev.cpp # End Source File # Begin Source File SOURCE=..\..\src\OnePole.cpp # End Source File # Begin Source File SOURCE=..\..\src\OneZero.cpp # End Source File # Begin Source File SOURCE=..\..\src\PercFlut.cpp # End Source File # Begin Source File SOURCE=..\..\src\Phonemes.cpp # End Source File # Begin Source File SOURCE=..\..\src\Plucked.cpp # End Source File # Begin Source File SOURCE=..\..\src\Twang.cpp # End Source File # Begin Source File SOURCE=..\..\src\PoleZero.cpp # End Source File # Begin Source File SOURCE=..\..\src\PRCRev.cpp # End Source File # Begin Source File SOURCE=..\..\src\Resonate.cpp # End Source File # Begin Source File SOURCE=..\..\src\Rhodey.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtMidi.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtWvOut.cpp # End Source File # Begin Source File SOURCE=..\..\src\Sampler.cpp # End Source File # Begin Source File SOURCE=..\..\src\Saxofony.cpp # End Source File # Begin Source File SOURCE=..\..\src\Shakers.cpp # End Source File # Begin Source File SOURCE=..\..\src\Simple.cpp # End Source File # Begin Source File SOURCE=..\..\src\SineWave.cpp # End Source File # Begin Source File SOURCE=..\..\src\SingWave.cpp # End Source File # Begin Source File SOURCE=..\..\src\Sitar.cpp # End Source File # Begin Source File SOURCE=..\..\src\SKINI.cpp # End Source File # Begin Source File SOURCE=..\..\src\Socket.cpp # End Source File # Begin Source File SOURCE=..\..\src\Sphere.cpp # End Source File # Begin Source File SOURCE=..\..\src\StifKarp.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # Begin Source File SOURCE=..\..\src\TcpServer.cpp # End Source File # Begin Source File SOURCE=..\..\src\Thread.cpp # End Source File # Begin Source File SOURCE=..\..\src\TubeBell.cpp # End Source File # Begin Source File SOURCE=..\..\src\TwoPole.cpp # End Source File # Begin Source File SOURCE=..\..\src\TwoZero.cpp # End Source File # Begin Source File SOURCE=.\utilities.cpp # End Source File # Begin Source File SOURCE=..\..\src\Voicer.cpp # End Source File # Begin Source File SOURCE=..\..\src\VoicForm.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileLoop.cpp # End Source File # Begin Source File SOURCE=..\..\src\Whistle.cpp # End Source File # Begin Source File SOURCE=..\..\src\Wurley.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\ADSR.h # End Source File # Begin Source File SOURCE=..\..\include\Asymp.h # End Source File # Begin Source File SOURCE=..\..\include\BandedWG.h # End Source File # Begin Source File SOURCE=..\..\include\BeeThree.h # End Source File # Begin Source File SOURCE=..\..\include\BiQuad.h # End Source File # Begin Source File SOURCE=..\..\include\BlowBotl.h # End Source File # Begin Source File SOURCE=..\..\include\BlowHole.h # End Source File # Begin Source File SOURCE=..\..\include\Bowed.h # End Source File # Begin Source File SOURCE=..\..\include\BowTable.h # End Source File # Begin Source File SOURCE=..\..\include\Brass.h # End Source File # Begin Source File SOURCE=..\..\include\Clarinet.h # End Source File # Begin Source File SOURCE=..\..\include\Fir.h # End Source File # Begin Source File SOURCE=..\..\include\Delay.h # End Source File # Begin Source File SOURCE=..\..\include\DelayA.h # End Source File # Begin Source File SOURCE=..\..\include\DelayL.h # End Source File # Begin Source File SOURCE=..\..\include\Drummer.h # End Source File # Begin Source File SOURCE=..\..\include\Effect.h # End Source File # Begin Source File SOURCE=..\..\include\Envelope.h # End Source File # Begin Source File SOURCE=..\..\include\FileRead.h # End Source File # Begin Source File SOURCE=..\..\include\FileWrite.h # End Source File # Begin Source File SOURCE=..\..\include\FileWvIn.h # End Source File # Begin Source File SOURCE=..\..\include\FileWvOut.h # End Source File # Begin Source File SOURCE=..\..\include\Filter.h # End Source File # Begin Source File SOURCE=..\..\include\Flute.h # End Source File # Begin Source File SOURCE=..\..\include\FM.h # End Source File # Begin Source File SOURCE=..\..\include\FMVoices.h # End Source File # Begin Source File SOURCE=..\..\include\FormSwep.h # End Source File # Begin Source File SOURCE=..\..\include\Function.h # End Source File # Begin Source File SOURCE=..\..\include\Generator.h # End Source File # Begin Source File SOURCE=..\..\include\HevyMetl.h # End Source File # Begin Source File SOURCE=..\..\include\Instrmnt.h # End Source File # Begin Source File SOURCE=..\..\include\JCRev.h # End Source File # Begin Source File SOURCE=..\..\include\JetTable.h # End Source File # Begin Source File SOURCE=..\..\include\Mandolin.h # End Source File # Begin Source File SOURCE=..\..\include\Mesh2D.h # End Source File # Begin Source File SOURCE=..\..\include\Messager.h # End Source File # Begin Source File SOURCE=..\..\include\Modal.h # End Source File # Begin Source File SOURCE=..\..\include\ModalBar.h # End Source File # Begin Source File SOURCE=..\..\include\Modulate.h # End Source File # Begin Source File SOURCE=..\..\include\Moog.h # End Source File # Begin Source File SOURCE=..\..\include\Mutex.h # End Source File # Begin Source File SOURCE=..\..\include\Noise.h # End Source File # Begin Source File SOURCE=..\..\include\NRev.h # End Source File # Begin Source File SOURCE=..\..\include\OnePole.h # End Source File # Begin Source File SOURCE=..\..\include\OneZero.h # End Source File # Begin Source File SOURCE=..\..\include\PercFlut.h # End Source File # Begin Source File SOURCE=..\..\include\Phonemes.h # End Source File # Begin Source File SOURCE=..\..\include\Plucked.h # End Source File # Begin Source File SOURCE=..\..\include\Twang.h # End Source File # Begin Source File SOURCE=..\..\include\PoleZero.h # End Source File # Begin Source File SOURCE=..\..\include\PRCRev.h # End Source File # Begin Source File SOURCE=..\..\include\ReedTable.h # End Source File # Begin Source File SOURCE=..\..\include\Resonate.h # End Source File # Begin Source File SOURCE=..\..\include\Rhodey.h # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\include\RtMidi.h # End Source File # Begin Source File SOURCE=..\..\include\RtWvIn.h # End Source File # Begin Source File SOURCE=..\..\include\RtWvOut.h # End Source File # Begin Source File SOURCE=..\..\include\Sampler.h # End Source File # Begin Source File SOURCE=..\..\include\Saxofony.h # End Source File # Begin Source File SOURCE=..\..\include\Shakers.h # End Source File # Begin Source File SOURCE=..\..\include\Simple.h # End Source File # Begin Source File SOURCE=..\..\include\SineWave.h # End Source File # Begin Source File SOURCE=..\..\include\SingWave.h # End Source File # Begin Source File SOURCE=..\..\include\Sitar.h # End Source File # Begin Source File SOURCE=..\..\include\SKINI.h # End Source File # Begin Source File SOURCE=..\..\include\Socket.h # End Source File # Begin Source File SOURCE=..\..\include\Sphere.h # End Source File # Begin Source File SOURCE=..\..\include\StifKarp.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\TcpServer.h # End Source File # Begin Source File SOURCE=..\..\include\Thread.h # End Source File # Begin Source File SOURCE=..\..\include\TubeBell.h # End Source File # Begin Source File SOURCE=..\..\include\TwoPole.h # End Source File # Begin Source File SOURCE=..\..\include\TwoZero.h # End Source File # Begin Source File SOURCE=.\utilities.h # End Source File # Begin Source File SOURCE=..\..\include\Vector3D.h # End Source File # Begin Source File SOURCE=..\..\include\Voicer.h # End Source File # Begin Source File SOURCE=..\..\include\FileLoop.h # End Source File # Begin Source File SOURCE=..\..\include\Whistle.h # End Source File # Begin Source File SOURCE=..\..\include\Wurley.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/demo/demo.dsw0000755000076600007660000000132612327014024014360 0ustar garyMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "Md2Skini"=".\Md2Skini.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "demo"=".\demo.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### stk-4.5.0/projects/demo/Drums0000755000076600007660000000005512327014024013730 0ustar garywish < tcl/Drums.tcl | ./demo Drummer -or -ipstk-4.5.0/projects/demo/Drums.bat0000755000076600007660000000005312327014024014473 0ustar garywish < tcl/Drums.tcl | demo Drummer -or -ipstk-4.5.0/projects/demo/Makefile.in0000644000076600007660000000513612327014024014762 0ustar gary### Do not edit -- Generated by 'configure --with-whatever' from Makefile.in ### STK demo Makefile - for various flavors of unix PROGRAMS = demo RM = /bin/rm SRC_PATH = ../../src OBJECT_PATH = @object_path@ vpath %.o $(OBJECT_PATH) OBJECTS = Stk.o Noise.o Envelope.o ADSR.o \ Modulate.o SingWave.o SineWave.o FileRead.o FileWrite.o \ FileWvIn.o FileLoop.o FileWvOut.o \ OneZero.o OnePole.o PoleZero.o TwoZero.o Fir.o \ BiQuad.o FormSwep.o Delay.o DelayL.o DelayA.o \ ReedTable.o JetTable.o BowTable.o \ JCRev.o \ Voicer.o Vector3D.o Sphere.o Twang.o \ \ Clarinet.o BlowHole.o Saxofony.o Flute.o Brass.o BlowBotl.o \ Bowed.o Plucked.o StifKarp.o Sitar.o PluckTwo.o Mandolin.o Mesh2D.o \ FM.o Rhodey.o Wurley.o TubeBell.o HevyMetl.o PercFlut.o BeeThree.o FMVoices.o \ Sampler.o Moog.o Simple.o Drummer.o Shakers.o \ Modal.o ModalBar.o BandedWG.o Resonate.o VoicForm.o Phonemes.o Whistle.o \ \ Messager.o Skini.o utilities.o INCLUDE = @include@ ifeq ($(strip $(INCLUDE)), ) INCLUDE = ../../include endif vpath %.h $(INCLUDE) CC = @CXX@ DEFS = @CPPFLAGS@ DEFS += @byte_order@ CFLAGS = @CXXFLAGS@ CFLAGS += -I$(INCLUDE) -I$(INCLUDE)/../src/include LIBRARY = @LIBS@ REALTIME = @realtime@ ifeq ($(REALTIME),yes) PROGRAMS += demo OBJECTS += RtMidi.o RtAudio.o Thread.o Mutex.o Socket.o TcpServer.o @objects@ endif RAWWAVES = @rawwaves@ ifeq ($(strip $(RAWWAVES)), ) RAWWAVES = ../../rawwaves/ endif DEFS += -DRAWWAVE_PATH=\"$(RAWWAVES)\" %.o : $(SRC_PATH)/%.cpp $(OBJECT_PATH)/.placeholder $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $(OBJECT_PATH)/$@ %.o : ../../src/include/%.cpp $(OBJECT_PATH)/.placeholder $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $(OBJECT_PATH)/$@ all : $(PROGRAMS) $(OBJECT_PATH)/.placeholder: mkdir -vp $(OBJECT_PATH) touch $(OBJECT_PATH)/.placeholder demo: demo.cpp $(OBJECTS) $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o demo demo.cpp $(OBJECT_PATH)/*.o $(LIBRARY) libdemo: demo.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o demo utilities.cpp demo.cpp -L../../src -lstk $(LIBRARY) Md2Skini: Md2Skini.cpp Stk.o RtMidi.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o Md2Skini Md2Skini.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/RtMidi.o $(LIBRARY) libMd2Skini: Md2Skini.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o Md2Skini Md2Skini.cpp -L../../src -lstk $(LIBRARY) $(OBJECTS) : Stk.h clean : $(RM) -f $(OBJECT_PATH)/*.o $(RM) -f $(PROGRAMS) *.exe $(RM) -fR *~ *.dSYM distclean: clean $(RM) Makefile strip : strip $(PROGRAMS) # Project specific objects: utilities.o: utilities.cpp $(CC) $(CFLAGS) $(DEFS) -c utilities.cpp -o $(OBJECT_PATH)/$@ stk-4.5.0/projects/demo/Md2Skini.cpp0000644000076600007660000001547412327014024015047 0ustar gary/***************************************************/ /* Simple realtime MIDI to SKINI parser. This object takes MIDI from the input stream (via the RtMidi class), parses it, and turns it into SKINI messages. by Perry R. Cook and Gary P. Scavone, 1995 - 2004. */ /***************************************************/ #include "RtMidi.h" #include "SKINI.msg" #include #include #include void usage(void) { std::cout << "\nuseage: Md2Skini \n\n"; std::cout << " With no arguments, Md2Skini converts MIDI input to SKINI\n"; std::cout << " format and sends the output directly to stdout.\n"; std::cout << " With flag = -f , the output stream is simultaneously\n"; std::cout << " written to the file specified by the optional \n"; std::cout << " (default = test.ski).\n"; std::cout << " With flag = -c, MIDI control change messages will not be\n"; std::cout << " converted to SKINI-specific named controls.\n"; std::cout << " A MIDI input port can be specified with flag = -p portNumber.\n" << std::endl; exit(0); } #include static void finish( int ignore ){ std::cout << "Type 'Exit' to quit." << std::endl; } bool parseSkiniControl = true; void midiCallback( double deltatime, std::vector< unsigned char > *bytes, void *userData ) { if ( bytes->size() < 2 ) return; // Parse the MIDI bytes ... only keep MIDI channel messages. if ( bytes->at(0) > 239 ) return; register long type = bytes->at(0) & 0xF0; register int channel = bytes->at(0) & 0x0F; register long databyte1 = bytes->at(1); register long databyte2 = 0; if ( ( type != 0xC0 ) && ( type != 0xD0 ) ) { if ( bytes->size() < 3 ) return; databyte2 = bytes->at(2); } std::string typeName; switch( type ) { case __SK_NoteOn_: if ( databyte2 == 0 ) { typeName = "NoteOff\t\t"; databyte2 = 64; } else typeName = "NoteOn\t\t"; break; case __SK_NoteOff_: typeName = "NoteOff\t\t"; break; case __SK_PolyPressure_: typeName = "PolyPressure\t"; break; case __SK_ProgramChange_: typeName = "ProgramChange\t"; break; case __SK_ChannelPressure_: typeName = "ChannelPressure\t"; break; case __SK_PitchBend_: typeName = "PitchBend\t"; break; case __SK_ControlChange_: if ( parseSkiniControl != true ) { typeName = "ControlChange\t"; goto output; } switch( databyte1 ) { case __SK_PitchChange_: typeName = "PitchChange\t"; goto output; case __SK_Volume_: typeName = "Volume\t"; goto output; case __SK_ModWheel_: typeName = "ModWheel\t"; goto output; case __SK_Breath_: typeName = "Breath\t\t"; goto output; case __SK_FootControl_: typeName = "FootControl\t"; goto output; case __SK_Portamento_: typeName = "Portamento\t"; goto output; case __SK_Balance_: typeName = "Balance\t"; goto output; case __SK_Pan_: typeName = "Pan\t\t"; goto output; case __SK_Sustain_: typeName = "Sustain\t"; goto output; case __SK_Expression_: typeName = "Expression\t"; goto output; default: typeName = "ControlChange\t"; goto output; } default: typeName = "Unknown\t"; } output: FILE *file = (FILE *) userData; if ( type == 0xC0 || type == 0xD0 || type == 0xE0 ) { // program change, channel pressure, or pitchbend fprintf( stdout, "%s %.3f %d %.1f\n", typeName.c_str(), 0.0, channel, (float)databyte1 ); if ( file != NULL ) fprintf( file, "%s %.3f %d %.1f\n", typeName.c_str(), deltatime, channel, (float)databyte1 ); } else if ( type == 0xB0 ) { // control change if ( typeName == "ControlChange\t" ) { fprintf( stdout, "%s %.3f %d %.1f %.1f\n", typeName.c_str(), 0.0, channel, (float)databyte1, (float)databyte2 ); if ( file != NULL ) fprintf( file, "%s %.3f %d %.1f %.1f\n", typeName.c_str(), deltatime, channel, (float)databyte1, (float)databyte2 ); } else { fprintf( stdout, "%s %.3f %d %.1f\n", typeName.c_str(), 0.0, channel, (float)databyte2 ); if ( file != NULL ) fprintf( file, "%s %.3f %d %.1f\n", typeName.c_str(), deltatime, channel, (float)databyte2 ); } } else { // noteon, noteoff, aftertouch, and unknown fprintf( stdout, "%s %.3f %d %.1f %.1f\n", typeName.c_str(), 0.0, channel, (float)databyte1, (float)databyte2 ); if ( file != NULL ) fprintf( file, "%s %.3f %d %.1f %.1f\n", typeName.c_str(), deltatime, channel, (float)databyte1, (float)databyte2 ); } fflush( stdout ); } int main( int argc,char *argv[] ) { FILE *file = NULL; std::string fileName; RtMidiIn *midiin = 0; unsigned int port = 0; std::string input; if ( argc > 5 ) usage(); // Parse the command-line arguments. int i = 1; while ( i < argc ) { if (argv[i][0] == '-') { switch(argv[i][1]) { case 'f': if ( (i+1 < argc) && argv[i+1][0] != '-' ) { i++; fileName = argv[i]; if ( fileName.find( ".ski" ) == std::string::npos ) fileName.append( ".ski" ); } else fileName = "test.ski"; file = fopen( fileName.c_str(), "wb" ); break; case 'p': if ( i++ >= argc) usage(); port = (unsigned int) atoi( argv[i] ); break; case 'c': parseSkiniControl = false; break; default: usage(); break; } } else usage(); i++; } try { midiin = new RtMidiIn(); } catch (RtMidiError &error) { error.printMessage(); if ( file != NULL ) fclose( file ); exit(EXIT_FAILURE); } // Check available ports vs. specified. unsigned int nPorts = midiin->getPortCount(); if ( nPorts == 0 ) { std::cout << "No MIDI ports available!\n"; goto cleanup; } else if ( port >= nPorts ) { std::cout << "Invalid port specifier!\n"; goto cleanup; } // Open the port. try { midiin->openPort( port ); } catch (RtMidiError &error) { error.printMessage(); goto cleanup; } // Set our callback function. This should be done immediately after // opening the port to avoid having incoming messages written to the // queue instead of sent to the callback function. midiin->setCallback( &midiCallback, file ); // We'll ignore sysex, timing, and active sensing messages. midiin->ignoreTypes( true, true, true ); // Install an interrupt handler function. (void) signal(SIGINT, finish); std::cout << "\nReading MIDI input ... type 'Exit' to quit.\n"; while ( input != "Exit" && input != "exit" ) { input.erase(); std::cin >> input; std::cout << input << std::endl; } cleanup: delete midiin; if ( file != NULL ) fclose( file ); std::cout << "Md2Skini finished ... bye!" << std::endl; return 0; } stk-4.5.0/projects/demo/Md2Skini.dsp0000755000076600007660000001112512327014024015043 0ustar gary# Microsoft Developer Studio Project File - Name="Md2Skini" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=Md2Skini - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "Md2Skini.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "Md2Skini.mak" CFG="Md2Skini - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "Md2Skini - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "Md2Skini - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "Md2Skini - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Md2Skini___Win32_Release" # PROP BASE Intermediate_Dir "Md2Skini___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /Od /I "../../include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib Wsock32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "Md2Skini - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__WINDOWS_MM__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib Wsock32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "Md2Skini - Win32 Release" # Name "Md2Skini - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\Md2Skini.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtMidi.cpp # End Source File # Begin Source File SOURCE=..\..\src\SKINI.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\RtMidi.h # End Source File # Begin Source File SOURCE=..\..\include\SKINI.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/demo/Modal0000755000076600007660000000005612327014024013673 0ustar garywish < tcl/Modal.tcl | ./demo ModalBar -or -ipstk-4.5.0/projects/demo/Modal.bat0000755000076600007660000000005412327014024014436 0ustar garywish < tcl/Modal.tcl | demo ModalBar -or -ipstk-4.5.0/projects/demo/Physical0000755000076600007660000000006112327014024014407 0ustar garywish < tcl/Physical.tcl | ./demo Clarinet -or -ipstk-4.5.0/projects/demo/Physical.bat0000755000076600007660000000005712327014024015161 0ustar garywish < tcl/Physical.tcl | demo Clarinet -or -ipstk-4.5.0/projects/demo/scores/0000755000076600007660000000000012327014024014206 5ustar garystk-4.5.0/projects/demo/scores/bachfugue.ski0000644000076600007660000015225212327014024016656 0ustar gary///COM: Bach, Johann Sebastian ///OTA: Das wohltemperirte Clavier ///OPR: Das wohltemperierte Klavier ///OTL: Fuga 2, Vol. 1 ///XEN: The Well-Tempered Clavier, Volume 1, Fugue 2. ///ONB: C minor, 3-part ///SCT: BWV 847b ///YEC: Copyright 1994, David Huron ///YEM: Rights to all derivative electronic formats reserved. // Keysig 3 flats // Tempo 72 MM per quarter note // Measure number 1 =0 NoteOn 0.416667 2 72 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 71 64 NoteOff 0.208333 2 71 64 NoteOn 0 2 72 64 NoteOff 0.416667 2 72 64 NoteOn 0 2 67 64 NoteOff 0.416667 2 67 64 NoteOn 0 2 68 64 NoteOff 0.416667 2 68 64 NoteOn 0 2 72 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 71 64 NoteOff 0.208333 2 71 64 NoteOn 0 2 72 64 NoteOff 0.416667 2 72 64 NoteOn 0 2 74 64 NoteOff 0.416667 2 74 64 // Measure number 2 =3.33333 NoteOn 0 2 67 64 NoteOff 0.416667 2 67 64 NoteOn 0 2 72 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 71 64 NoteOff 0.208333 2 71 64 NoteOn 0 2 72 64 NoteOff 0.416667 2 72 64 NoteOn 0 2 74 64 NoteOff 0.416667 2 74 64 NoteOn 0 2 65 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 67 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 68 64 NoteOff 0.833333 2 68 64 NoteOn 0 2 67 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 65 64 NoteOff 0.208333 2 65 64 // Measure number 3 =6.66667 NoteOn 0 2 63 64 NoteOff 0.208333 2 63 64 NoteOn 0 2 72 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 71 64 NoteOn 0 3 79 64 NoteOff 0.208333 2 71 64 NoteOff 0 3 79 64 NoteOn 0 2 69 64 NoteOn 0 3 78 64 NoteOff 0.208333 2 69 64 NoteOff 0 3 78 64 NoteOn 0 2 67 64 NoteOn 0 3 79 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 65 64 NoteOff 0.208333 3 79 64 NoteOff 0 2 65 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 63 64 NoteOn 0 2 62 64 NoteOff 0.208333 3 72 64 NoteOff 0 2 62 64 NoteOn 0 2 60 64 NoteOn 0 3 75 64 NoteOff 0.416667 2 60 64 NoteOff 0 3 75 64 NoteOn 0 2 75 64 NoteOn 0 3 79 64 NoteOff 0.208333 3 79 64 NoteOn 0 3 78 64 NoteOff 0.208333 2 75 64 NoteOff 0 3 78 64 NoteOn 0 2 74 64 NoteOn 0 3 79 64 NoteOff 0.416667 2 74 64 NoteOff 0 3 79 64 NoteOn 0 2 72 64 NoteOn 0 3 81 64 NoteOff 0.416667 2 72 64 NoteOff 0 3 81 64 // Measure number 4 =10 NoteOn 0 2 70 64 NoteOn 0 3 74 64 NoteOff 0.416667 2 70 64 NoteOff 0 3 74 64 NoteOn 0 2 69 64 NoteOn 0 3 79 64 NoteOff 0.208333 3 79 64 NoteOn 0 3 78 64 NoteOff 0.208333 2 69 64 NoteOff 0 3 78 64 NoteOn 0 2 70 64 NoteOn 0 3 79 64 NoteOff 0.416667 2 70 64 NoteOff 0 3 79 64 NoteOn 0 2 72 64 NoteOn 0 3 81 64 NoteOff 0.416667 2 72 64 NoteOff 0 3 81 64 NoteOn 0 2 66 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 66 64 NoteOff 0 3 74 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.416667 2 67 64 NoteOn 0 2 69 64 NoteOff 0.416667 3 75 64 NoteOff 0 2 69 64 NoteOn 0 2 66 64 NoteOn 0 3 74 64 NoteOff 0.208333 3 74 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 66 64 NoteOff 0 3 72 64 // Measure number 5 =13.3333 NoteOn 0 2 67 64 NoteOn 0 3 70 64 NoteOff 0.416667 3 70 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 74 64 NoteOn 0 3 75 64 NoteOn 0.208333 2 60 64 NoteOff 0.208333 3 75 64 NoteOff 0 2 60 64 NoteOn 0 2 62 64 NoteOn 0 3 67 64 NoteOff 0.208333 2 62 64 NoteOn 0 2 63 64 NoteOff 0.208333 3 67 64 NoteOff 0 2 63 64 NoteOn 0 2 65 64 NoteOn 0 3 68 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 67 64 NoteOff 0.208333 3 68 64 NoteOff 0 2 67 64 NoteOn 0 2 68 64 NoteOn 0 3 77 64 NoteOff 0.208333 3 77 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 77 64 NoteOff 0.208333 2 68 64 NoteOn 0 2 62 64 NoteOff 0.208333 3 77 64 NoteOff 0 2 62 64 NoteOn 0 2 63 64 NoteOn 0 3 69 64 NoteOff 0.208333 2 63 64 NoteOn 0 2 65 64 NoteOff 0.208333 3 69 64 NoteOff 0 2 65 64 // Measure number 6 =16.6667 NoteOn 0 2 67 64 NoteOn 0 3 70 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 69 64 NoteOff 0.208333 3 70 64 NoteOff 0 2 69 64 NoteOn 0 2 70 64 NoteOn 0 3 79 64 NoteOff 0.208333 3 79 64 NoteOn 0 3 77 64 NoteOff 0.208333 3 77 64 NoteOn 0 3 79 64 NoteOff 0.208333 2 70 64 NoteOn 0 2 63 64 NoteOff 0.208333 3 79 64 NoteOff 0 2 63 64 NoteOn 0 2 65 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 67 64 NoteOff 0.208333 3 71 64 NoteOff 0 2 67 64 NoteOn 0 2 68 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 68 64 NoteOn 0 2 67 64 NoteOff 0.208333 3 72 64 NoteOff 0 2 67 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 74 64 NoteOn 0 2 63 64 NoteOn 0 3 75 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 75 64 NoteOn 0 2 62 64 NoteOn 0 3 77 64 NoteOff 0.416667 2 62 64 NoteOn 0 2 72 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 71 64 NoteOff 0.208333 2 71 64 // Measure number 7 =20 NoteOn 0 2 72 64 NoteOff 0.416667 3 77 64 NoteOn 0 1 60 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 60 64 NoteOff 0 3 75 64 NoteOn 0 1 59 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 72 64 NoteOff 0 1 59 64 NoteOff 0 3 74 64 NoteOn 0 1 60 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 60 64 NoteOff 0 3 70 64 NoteOn 0 1 55 64 NoteOn 0 3 68 64 NoteOff 0.208333 3 68 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 55 64 NoteOff 0 3 67 64 NoteOn 0 1 56 64 NoteOn 0 3 65 64 NoteOff 0.416667 1 56 64 NoteOff 0 3 65 64 NoteOn 0 1 60 64 NoteOn 0 2 77 64 NoteOn 0 3 80 64 NoteOff 0.208333 1 60 64 NoteOn 0 1 59 64 NoteOff 0.208333 2 77 64 NoteOff 0 3 80 64 NoteOff 0 1 59 64 NoteOn 0 1 60 64 NoteOn 0 2 75 64 NoteOn 0 3 79 64 NoteOff 0.416667 1 60 64 NoteOff 0 2 75 64 NoteOff 0 3 79 64 NoteOn 0 1 62 64 NoteOn 0 2 74 64 NoteOn 0 3 77 64 NoteOff 0.416667 1 62 64 NoteOff 0 2 74 64 NoteOff 0 3 77 64 // Measure number 8 =23.3333 NoteOn 0 1 55 64 NoteOn 0 3 75 64 NoteOff 0.416667 1 55 64 NoteOff 0 3 75 64 NoteOn 0 1 60 64 NoteOn 0 2 68 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 60 64 NoteOn 0 1 59 64 NoteOff 0.208333 2 68 64 NoteOff 0 3 74 64 NoteOff 0 1 59 64 NoteOn 0 1 60 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.416667 1 60 64 NoteOff 0 2 67 64 NoteOff 0 3 75 64 NoteOn 0 1 62 64 NoteOn 0 2 65 64 NoteOn 0 3 77 64 NoteOff 0.416667 1 62 64 NoteOff 0 2 65 64 NoteOff 0 3 77 64 NoteOn 0 1 53 64 NoteOn 0 2 67 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 53 64 NoteOn 0 1 55 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 71 64 NoteOff 0 1 55 64 NoteOn 0 1 56 64 NoteOn 0 2 65 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 63 64 NoteOff 0.208333 3 72 64 NoteOff 0 2 63 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.416667 1 56 64 NoteOff 0 2 65 64 NoteOff 0 3 74 64 NoteOn 0 1 55 64 NoteOn 0 2 62 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 55 64 NoteOn 0 1 53 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 71 64 NoteOff 0 1 53 64 // Measure number 9 =26.6667 NoteOn 0 1 51 64 NoteOn 0 2 67 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 60 64 NoteOff 0.208333 3 72 64 NoteOff 0 1 60 64 NoteOn 0 1 59 64 NoteOn 0 3 79 64 NoteOff 0.208333 1 59 64 NoteOff 0 3 79 64 NoteOn 0 1 57 64 NoteOn 0 3 78 64 NoteOff 0.208333 2 67 64 NoteOff 0 1 57 64 NoteOff 0 3 78 64 NoteOn 0 1 55 64 NoteOn 0 3 79 64 NoteOff 0.208333 1 55 64 NoteOn 0 1 53 64 NoteOff 0.208333 3 79 64 NoteOff 0 1 53 64 NoteOn 0 1 51 64 NoteOn 0 2 71 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 50 64 NoteOff 0.208333 2 71 64 NoteOff 0 3 74 64 NoteOff 0 1 50 64 NoteOn 0 1 48 64 NoteOn 0 2 72 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 50 64 NoteOff 0.208333 2 72 64 NoteOff 0 1 50 64 NoteOn 0 1 51 64 NoteOn 0 2 72 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 72 64 NoteOn 0 1 50 64 NoteOn 0 2 71 64 NoteOff 0.208333 3 75 64 NoteOff 0 1 50 64 NoteOff 0 2 71 64 NoteOn 0 1 48 64 NoteOn 0 2 72 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 46 64 NoteOff 0.208333 2 72 64 NoteOff 0 1 46 64 NoteOn 0 1 44 64 NoteOn 0 2 67 64 NoteOn 0 3 76 64 NoteOff 0.208333 1 44 64 NoteOn 0 1 43 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 76 64 NoteOff 0 1 43 64 // Measure number 10 =30 NoteOn 0 1 41 64 NoteOn 0 2 68 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 41 64 NoteOn 0 1 58 64 NoteOff 0.208333 3 77 64 NoteOff 0 1 58 64 NoteOn 0 1 56 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 56 64 NoteOff 0 3 77 64 NoteOn 0 1 55 64 NoteOn 0 3 76 64 NoteOff 0.208333 2 68 64 NoteOff 0 1 55 64 NoteOff 0 3 76 64 NoteOn 0 1 53 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 53 64 NoteOn 0 1 51 64 NoteOff 0.208333 3 77 64 NoteOff 0 1 51 64 NoteOn 0 1 50 64 NoteOn 0 2 69 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 50 64 NoteOn 0 1 48 64 NoteOff 0.208333 2 69 64 NoteOff 0 3 72 64 NoteOff 0 1 48 64 NoteOn 0 1 46 64 NoteOn 0 2 70 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 46 64 NoteOn 0 1 48 64 NoteOff 0.208333 2 70 64 NoteOff 0 1 48 64 NoteOn 0 1 50 64 NoteOn 0 2 70 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 70 64 NoteOn 0 1 48 64 NoteOn 0 2 69 64 NoteOff 0.208333 3 74 64 NoteOff 0 1 48 64 NoteOff 0 2 69 64 NoteOn 0 1 46 64 NoteOn 0 2 70 64 NoteOff 0.208333 1 46 64 NoteOn 0 1 44 64 NoteOff 0.208333 2 70 64 NoteOff 0 1 44 64 NoteOn 0 1 43 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 43 64 NoteOn 0 1 41 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 74 64 NoteOff 0 1 41 64 // Measure number 11 =33.3333 NoteOn 0 1 39 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 39 64 NoteOn 0 1 56 64 NoteOff 0.208333 3 75 64 NoteOff 0 1 56 64 NoteOn 0 1 55 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 55 64 NoteOff 0 3 75 64 NoteOn 0 1 53 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 67 64 NoteOff 0 1 53 64 NoteOff 0 3 74 64 NoteOn 0 1 51 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 49 64 NoteOff 0.208333 3 75 64 NoteOff 0 1 49 64 NoteOn 0 1 48 64 NoteOn 0 2 67 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 46 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 70 64 NoteOff 0 1 46 64 NoteOn 0 1 44 64 NoteOn 0 2 68 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 44 64 NoteOff 0 2 68 64 NoteOff 0 3 72 64 NoteOn 0 1 60 64 NoteOn 0 2 68 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 60 64 NoteOff 0 2 68 64 NoteOff 0 3 74 64 NoteOn 0 1 58 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.416667 1 58 64 NoteOff 0 2 67 64 NoteOff 0 3 75 64 NoteOn 0 1 56 64 NoteOn 0 2 65 64 NoteOn 0 3 77 64 NoteOff 0.416667 1 56 64 NoteOff 0 2 65 64 NoteOff 0 3 77 64 // Measure number 12 =36.6667 NoteOn 0 1 55 64 NoteOn 0 3 70 64 NoteOff 0.416667 1 55 64 NoteOff 0 3 70 64 NoteOn 0 1 53 64 NoteOn 0 2 56 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 53 64 NoteOff 0 2 56 64 NoteOff 0 3 74 64 NoteOn 0 1 55 64 NoteOn 0 2 58 64 NoteOn 0 3 75 64 NoteOff 0.416667 1 55 64 NoteOff 0 2 58 64 NoteOff 0 3 75 64 NoteOn 0 1 56 64 NoteOn 0 2 60 64 NoteOn 0 3 77 64 NoteOff 0.416667 1 56 64 NoteOff 0 2 60 64 NoteOff 0 3 77 64 NoteOn 0 1 50 64 NoteOn 0 3 68 64 NoteOff 0.208333 3 68 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 50 64 NoteOff 0 3 70 64 NoteOn 0 1 51 64 NoteOn 0 2 56 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 56 64 NoteOn 0 2 55 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 55 64 NoteOn 0 1 53 64 NoteOn 0 2 56 64 NoteOff 0.416667 3 72 64 NoteOff 0 1 53 64 NoteOff 0 2 56 64 NoteOn 0 1 50 64 NoteOn 0 2 53 64 NoteOn 0 3 70 64 NoteOff 0.208333 3 70 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 53 64 NoteOff 0 3 68 64 // Measure number 13 =40 NoteOn 0 1 51 64 NoteOn 0 2 58 64 NoteOn 0 3 67 64 NoteOff 0.208333 3 67 64 NoteOn 0 3 63 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 58 64 NoteOff 0 3 63 64 NoteOn 0 1 56 64 NoteOn 0 2 60 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 56 64 NoteOff 0 2 60 64 NoteOff 0 3 67 64 NoteOn 0 1 55 64 NoteOn 0 2 58 64 NoteOn 0 3 68 64 NoteOff 0.208333 3 68 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 55 64 NoteOff 0 2 58 64 NoteOff 0 3 70 64 NoteOn 0 1 53 64 NoteOn 0 2 56 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 53 64 NoteOff 0 2 56 64 NoteOff 0 3 74 64 NoteOn 0 1 55 64 NoteOn 0 2 58 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 55 64 NoteOff 0 2 58 64 NoteOff 0 3 74 64 NoteOn 0 1 51 64 NoteOn 0 2 55 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 55 64 NoteOff 0 3 74 64 NoteOn 0 1 50 64 NoteOn 0 2 53 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 53 64 NoteOff 0 3 77 64 NoteOn 0 1 48 64 NoteOn 0 2 51 64 NoteOn 0 3 79 64 NoteOff 0.208333 3 79 64 NoteOn 0 3 81 64 NoteOff 0.208333 1 48 64 NoteOff 0 2 51 64 NoteOff 0 3 81 64 // Measure number 14 =43.3333 NoteOn 0 1 50 64 NoteOn 0 2 53 64 NoteOn 0 3 82 64 NoteOff 0.208333 3 82 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 53 64 NoteOff 0 3 65 64 NoteOn 0 1 58 64 NoteOn 0 2 61 64 NoteOn 0 3 67 64 NoteOff 0.208333 3 67 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 58 64 NoteOff 0 2 61 64 NoteOff 0 3 68 64 NoteOn 0 1 56 64 NoteOn 0 2 60 64 NoteOn 0 3 70 64 NoteOff 0.208333 3 70 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 56 64 NoteOff 0 2 60 64 NoteOff 0 3 72 64 NoteOn 0 1 55 64 NoteOn 0 2 58 64 NoteOn 0 3 74 64 NoteOff 0.208333 3 74 64 NoteOn 0 3 76 64 NoteOff 0.208333 1 55 64 NoteOff 0 2 58 64 NoteOff 0 3 76 64 NoteOn 0 1 56 64 NoteOn 0 2 60 64 NoteOn 0 3 77 64 NoteOff 0.208333 3 77 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 56 64 NoteOff 0 2 60 64 NoteOff 0 3 75 64 NoteOn 0 1 53 64 NoteOn 0 2 56 64 NoteOn 0 3 74 64 NoteOff 0.208333 3 74 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 53 64 NoteOff 0 2 56 64 NoteOff 0 3 75 64 NoteOn 0 1 51 64 NoteOn 0 2 55 64 NoteOn 0 3 77 64 NoteOff 0.208333 3 77 64 NoteOn 0 3 79 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 55 64 NoteOff 0 3 79 64 NoteOn 0 1 50 64 NoteOn 0 2 53 64 NoteOn 0 3 81 64 NoteOff 0.208333 3 81 64 NoteOn 0 3 83 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 53 64 NoteOff 0 3 83 64 // Measure number 15 =46.6667 NoteOn 0 1 51 64 NoteOn 0 2 55 64 NoteOn 0 3 84 64 NoteOff 0.416667 1 51 64 NoteOff 0 2 55 64 NoteOff 0 3 84 64 NoteOn 0 2 67 64 NoteOn 0 3 83 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 83 64 NoteOn 0 2 66 64 NoteOn 0 3 81 64 NoteOff 0.208333 2 66 64 NoteOff 0 3 81 64 NoteOn 0 2 67 64 NoteOn 0 3 79 64 NoteOff 0.208333 3 79 64 NoteOn 0 3 77 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 77 64 NoteOn 0 2 60 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 60 64 NoteOff 0 3 74 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.416667 2 63 64 NoteOff 0 3 72 64 NoteOn 0 1 48 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 66 64 NoteOff 0.208333 1 48 64 NoteOff 0 3 75 64 NoteOff 0 2 66 64 NoteOn 0 1 46 64 NoteOn 0 2 67 64 NoteOn 0 3 74 64 NoteOff 0.416667 1 46 64 NoteOff 0 2 67 64 NoteOff 0 3 74 64 NoteOn 0 1 45 64 NoteOn 0 2 69 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 45 64 NoteOff 0 2 69 64 NoteOff 0 3 72 64 // Measure number 16 =50 NoteOn 0 2 62 64 NoteOn 0 3 70 64 NoteOff 0.416667 2 62 64 NoteOff 0 3 70 64 NoteOn 0 1 51 64 NoteOn 0 2 67 64 NoteOn 0 3 69 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 66 64 NoteOff 0.208333 1 51 64 NoteOff 0 3 69 64 NoteOff 0 2 66 64 NoteOn 0 1 50 64 NoteOn 0 2 67 64 NoteOn 0 3 70 64 NoteOff 0.416667 1 50 64 NoteOff 0 2 67 64 NoteOff 0 3 70 64 NoteOn 0 1 48 64 NoteOn 0 2 69 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 48 64 NoteOff 0 2 69 64 NoteOff 0 3 72 64 NoteOn 0 1 50 64 NoteOn 0 2 60 64 NoteOn 0 3 66 64 NoteOff 0.208333 2 60 64 NoteOn 0 2 62 64 NoteOff 0.208333 1 50 64 NoteOff 0 3 66 64 NoteOff 0 2 62 64 NoteOn 0 1 48 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 46 64 NoteOff 0.208333 3 67 64 NoteOff 0 1 46 64 NoteOn 0 1 48 64 NoteOn 0 3 69 64 NoteOff 0.416667 2 63 64 NoteOff 0 1 48 64 NoteOff 0 3 69 64 NoteOn 0 1 50 64 NoteOn 0 2 62 64 NoteOn 0 3 66 64 NoteOff 0.208333 2 62 64 NoteOn 0 2 60 64 NoteOff 0.208333 1 50 64 NoteOff 0 3 66 64 NoteOff 0 2 60 64 // Measure number 17 =53.3333 NoteOn 0 1 43 64 NoteOn 0 2 58 64 NoteOn 0 3 67 64 NoteOff 0.416667 1 43 64 NoteOff 0 2 58 64 NoteOff 0 3 67 64 NoteOn 0 1 58 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 58 64 NoteOff 0 3 74 64 NoteOn 0 1 57 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 57 64 NoteOff 0 3 72 64 NoteOn 0 1 58 64 NoteOn 0 3 74 64 NoteOn 0.208333 2 62 64 NoteOff 0.208333 1 58 64 NoteOff 0 3 74 64 NoteOff 0 2 62 64 NoteOn 0 1 50 64 NoteOn 0 2 64 64 NoteOff 0.208333 2 64 64 NoteOn 0 2 66 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 66 64 NoteOn 0 1 51 64 NoteOn 0 2 67 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 69 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 69 64 NoteOn 0 1 60 64 NoteOn 0 2 70 64 NoteOn 0 3 76 64 NoteOff 0.208333 1 60 64 NoteOff 0 3 76 64 NoteOn 0 1 58 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 58 64 NoteOff 0 3 74 64 NoteOn 0 1 60 64 NoteOn 0 3 76 64 NoteOff 0.208333 2 70 64 NoteOn 0 2 64 64 NoteOff 0.208333 1 60 64 NoteOff 0 3 76 64 NoteOff 0 2 64 64 NoteOn 0 1 52 64 NoteOn 0 2 65 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 67 64 NoteOff 0.208333 1 52 64 NoteOff 0 2 67 64 // Measure number 18 =56.6667 NoteOn 0 1 53 64 NoteOn 0 2 69 64 NoteOff 0.208333 2 69 64 NoteOn 0 2 70 64 NoteOff 0.208333 1 53 64 NoteOff 0 2 70 64 NoteOn 0 1 62 64 NoteOn 0 2 72 64 NoteOn 0 3 78 64 NoteOff 0.208333 1 62 64 NoteOff 0 3 78 64 NoteOn 0 1 60 64 NoteOn 0 3 76 64 NoteOff 0.208333 1 60 64 NoteOff 0 3 76 64 NoteOn 0 1 62 64 NoteOn 0 3 78 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 66 64 NoteOff 0.208333 1 62 64 NoteOff 0 3 78 64 NoteOff 0 2 66 64 NoteOn 0 1 54 64 NoteOn 0 2 67 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 69 64 NoteOff 0.208333 1 54 64 NoteOff 0 2 69 64 NoteOn 0 1 55 64 NoteOn 0 2 70 64 NoteOff 0.416667 2 70 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 67 64 NoteOn 0 2 62 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 55 64 NoteOff 0 2 62 64 NoteOff 0 3 65 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOn 0.208333 1 43 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 67 64 NoteOff 0 1 43 64 NoteOn 0 1 45 64 NoteOn 0 2 55 64 NoteOff 0.208333 1 45 64 NoteOn 0 1 47 64 NoteOff 0.208333 2 55 64 NoteOff 0 1 47 64 // Measure number 19 =60 NoteOn 0 1 48 64 NoteOn 0 2 56 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 50 64 NoteOff 0.208333 2 56 64 NoteOff 0 1 50 64 NoteOn 0 1 51 64 NoteOn 0 2 65 64 NoteOn 0 3 69 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 69 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 67 64 NoteOn 0 2 65 64 NoteOn 0 3 69 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 45 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 69 64 NoteOff 0 1 45 64 NoteOn 0 1 46 64 NoteOn 0 2 57 64 NoteOff 0.208333 1 46 64 NoteOn 0 1 48 64 NoteOff 0.208333 2 57 64 NoteOff 0 1 48 64 NoteOn 0 1 50 64 NoteOn 0 2 58 64 NoteOff 0.208333 1 50 64 NoteOn 0 1 51 64 NoteOff 0.208333 2 58 64 NoteOff 0 1 51 64 NoteOn 0 1 53 64 NoteOn 0 2 67 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 71 64 NoteOn 0 2 65 64 NoteOn 0 3 69 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 69 64 NoteOn 0 2 67 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 53 64 NoteOn 0 1 47 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 71 64 NoteOff 0 1 47 64 NoteOn 0 1 48 64 NoteOn 0 2 59 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 50 64 NoteOff 0.208333 2 59 64 NoteOff 0 1 50 64 // Measure number 20 =63.3333 NoteOn 0 1 51 64 NoteOn 0 2 60 64 NoteOff 0.208333 2 60 64 NoteOn 0 2 65 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 65 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 72 64 NoteOn 0 2 62 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 71 64 NoteOn 0 2 60 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 60 64 NoteOn 0 2 58 64 NoteOff 0.208333 3 72 64 NoteOff 0 2 58 64 NoteOn 0 1 52 64 NoteOn 0 2 56 64 NoteOn 0 3 67 64 NoteOff 0.208333 2 56 64 NoteOn 0 2 55 64 NoteOff 0.208333 1 52 64 NoteOff 0 3 67 64 NoteOff 0 2 55 64 NoteOn 0 1 53 64 NoteOn 0 2 53 64 NoteOn 0 3 68 64 NoteOff 0.416667 1 53 64 NoteOff 0 2 53 64 NoteOff 0 3 68 64 NoteOn 0 1 41 64 NoteOn 0 2 68 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 41 64 NoteOff 0 2 68 64 NoteOff 0 3 71 64 NoteOn 0 1 39 64 NoteOn 0 2 67 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 39 64 NoteOff 0 2 67 64 NoteOff 0 3 72 64 NoteOn 0 1 38 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.416667 1 38 64 NoteOff 0 2 65 64 NoteOff 0 3 74 64 // Measure number 21 =66.6667 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.416667 2 63 64 NoteOff 0 3 67 64 NoteOn 0 1 44 64 NoteOn 0 2 62 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 44 64 NoteOff 0 2 62 64 NoteOff 0 3 71 64 NoteOn 0 1 43 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 43 64 NoteOff 0 2 63 64 NoteOff 0 3 72 64 NoteOn 0 1 41 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.416667 1 41 64 NoteOff 0 2 65 64 NoteOff 0 3 74 64 NoteOn 0 1 43 64 NoteOn 0 2 59 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 43 64 NoteOff 0 2 59 64 NoteOff 0 3 67 64 NoteOn 0 1 41 64 NoteOn 0 2 60 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 41 64 NoteOn 0 1 39 64 NoteOff 0.208333 2 60 64 NoteOff 0 1 39 64 NoteOn 0 1 41 64 NoteOn 0 2 62 64 NoteOff 0.416667 3 68 64 NoteOff 0 1 41 64 NoteOff 0 2 62 64 NoteOn 0 1 43 64 NoteOn 0 2 59 64 NoteOn 0 3 67 64 NoteOff 0.208333 3 67 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 43 64 NoteOff 0 2 59 64 NoteOff 0 3 65 64 // Measure number 22 =70 NoteOn 0 1 48 64 NoteOn 0 2 60 64 NoteOn 0 3 63 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 50 64 NoteOff 0.208333 3 63 64 NoteOff 0 1 50 64 NoteOn 0 1 51 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 51 64 NoteOff 0 3 72 64 NoteOn 0 1 50 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 60 64 NoteOff 0 1 50 64 NoteOff 0 3 71 64 NoteOn 0 1 48 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 46 64 NoteOff 0.208333 3 72 64 NoteOff 0 1 46 64 NoteOn 0 1 44 64 NoteOn 0 2 64 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 44 64 NoteOn 0 1 43 64 NoteOff 0.208333 2 64 64 NoteOff 0 3 67 64 NoteOff 0 1 43 64 NoteOn 0 1 41 64 NoteOn 0 2 65 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 41 64 NoteOn 0 1 58 64 NoteOff 0.208333 2 65 64 NoteOff 0 1 58 64 NoteOn 0 1 56 64 NoteOn 0 2 65 64 NoteOff 0.208333 1 56 64 NoteOff 0 2 65 64 NoteOn 0 1 55 64 NoteOn 0 2 64 64 NoteOff 0.208333 3 68 64 NoteOff 0 1 55 64 NoteOff 0 2 64 64 NoteOn 0 1 53 64 NoteOn 0 2 65 64 NoteOff 0.208333 1 53 64 NoteOn 0 1 51 64 NoteOff 0.208333 2 65 64 NoteOff 0 1 51 64 NoteOn 0 1 50 64 NoteOn 0 2 60 64 NoteOn 0 3 69 64 NoteOff 0.208333 1 50 64 NoteOn 0 1 48 64 NoteOff 0.208333 2 60 64 NoteOff 0 3 69 64 NoteOff 0 1 48 64 // Measure number 23 =73.3333 NoteOn 0 1 46 64 NoteOn 0 2 62 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 46 64 NoteOn 0 1 48 64 NoteOff 0.208333 3 70 64 NoteOff 0 1 48 64 NoteOn 0 1 50 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 50 64 NoteOff 0 3 70 64 NoteOn 0 1 48 64 NoteOn 0 3 69 64 NoteOff 0.208333 2 62 64 NoteOff 0 1 48 64 NoteOff 0 3 69 64 NoteOn 0 1 46 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 46 64 NoteOn 0 1 44 64 NoteOff 0.208333 3 70 64 NoteOff 0 1 44 64 NoteOn 0 1 43 64 NoteOn 0 2 62 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 43 64 NoteOn 0 1 41 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 65 64 NoteOff 0 1 41 64 NoteOn 0 1 39 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 39 64 NoteOn 0 1 56 64 NoteOff 0.208333 2 63 64 NoteOff 0 1 56 64 NoteOn 0 1 55 64 NoteOn 0 2 63 64 NoteOff 0.208333 1 55 64 NoteOff 0 2 63 64 NoteOn 0 1 53 64 NoteOn 0 2 62 64 NoteOff 0.208333 3 67 64 NoteOff 0 1 53 64 NoteOff 0 2 62 64 NoteOn 0 1 51 64 NoteOn 0 2 63 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 50 64 NoteOff 0.208333 2 63 64 NoteOff 0 1 50 64 NoteOn 0 1 48 64 NoteOn 0 2 58 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 46 64 NoteOff 0.208333 2 58 64 NoteOff 0 1 46 64 // Measure number 24 =76.6667 NoteOn 0 1 44 64 NoteOn 0 2 60 64 NoteOff 0.208333 1 44 64 NoteOn 0 1 46 64 NoteOff 0.208333 3 67 64 NoteOff 0 1 46 64 NoteOn 0 1 48 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 48 64 NoteOff 0 3 68 64 NoteOn 0 1 46 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 46 64 NoteOff 0 3 70 64 NoteOn 0 1 44 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 44 64 NoteOff 0 3 72 64 NoteOn 0 1 43 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 43 64 NoteOff 0 3 71 64 NoteOn 0 1 41 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 41 64 NoteOff 0 3 72 64 NoteOn 0 1 39 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 39 64 NoteOff 0 3 68 64 NoteOn 0 1 38 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 38 64 NoteOn 0 1 55 64 NoteOff 0.208333 2 60 64 NoteOff 0 1 55 64 NoteOn 0 1 53 64 NoteOn 0 2 62 64 NoteOff 0.208333 1 53 64 NoteOff 0 2 62 64 NoteOn 0 1 51 64 NoteOn 0 2 63 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 63 64 NoteOn 0 1 50 64 NoteOn 0 2 65 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 65 64 NoteOn 0 1 48 64 NoteOn 0 2 63 64 NoteOff 0.208333 1 48 64 NoteOff 0 2 63 64 NoteOn 0 1 47 64 NoteOn 0 2 65 64 NoteOff 0.208333 1 47 64 NoteOff 0 2 65 64 NoteOn 0 1 45 64 NoteOn 0 2 62 64 NoteOff 0.208333 1 45 64 NoteOff 0 2 62 64 // Measure number 25 =80 NoteOn 0 1 43 64 NoteOn 0 2 59 64 NoteOff 0.416667 3 65 64 NoteOff 0 2 59 64 NoteOn 0 3 74 64 NoteOff 0.208333 3 74 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 43 64 NoteOff 0 3 72 64 NoteOn 0 3 74 64 NoteOff 0.416667 3 74 64 NoteOn 0 2 59 64 NoteOn 0 3 65 64 NoteOff 0.416667 2 59 64 NoteOff 0 3 65 64 NoteOn 0 2 60 64 NoteOn 0 3 63 64 NoteOn 0.208333 1 43 64 NoteOff 0.208333 2 60 64 NoteOff 0 3 63 64 NoteOff 0 1 43 64 NoteOn 0 1 45 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 45 64 NoteOff 0 3 75 64 NoteOn 0 1 47 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 47 64 NoteOff 0 3 74 64 NoteOn 0 1 48 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 50 64 NoteOff 0.208333 3 75 64 NoteOff 0 1 50 64 NoteOn 0 1 51 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 53 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 67 64 NoteOff 0 1 53 64 // Measure number 26 =83.3333 NoteOn 0 1 55 64 NoteOn 0 2 62 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 55 64 NoteOn 0 1 53 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 65 64 NoteOff 0 1 53 64 NoteOn 0 1 56 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 56 64 NoteOff 0 3 77 64 NoteOn 0 1 55 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 55 64 NoteOff 0 3 75 64 NoteOn 0 1 53 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 53 64 NoteOn 0 1 51 64 NoteOff 0.208333 3 77 64 NoteOff 0 1 51 64 NoteOn 0 1 50 64 NoteOn 0 2 65 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 50 64 NoteOn 0 1 48 64 NoteOff 0.208333 3 68 64 NoteOff 0 1 48 64 NoteOn 0 1 47 64 NoteOn 0 3 67 64 NoteOff 0.208333 3 67 64 NoteOn 0 3 77 64 NoteOff 0.208333 2 65 64 NoteOff 0 1 47 64 NoteOff 0 3 77 64 NoteOn 0 1 48 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 48 64 NoteOff 0 3 75 64 NoteOn 0 1 47 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 47 64 NoteOff 0 3 74 64 NoteOn 0 1 48 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 48 64 NoteOff 0 3 71 64 NoteOn 0 1 43 64 NoteOn 0 2 65 64 NoteOn 0 3 69 64 NoteOff 0.208333 3 69 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 43 64 NoteOff 0 2 65 64 NoteOff 0 3 67 64 // Measure number 27 =86.6667 NoteOn 0 1 44 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 44 64 NoteOff 0 2 63 64 NoteOff 0 3 72 64 NoteOn 0 1 48 64 NoteOn 0 2 68 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 47 64 NoteOff 0.208333 2 68 64 NoteOff 0 3 77 64 NoteOff 0 1 47 64 NoteOn 0 1 48 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.416667 1 48 64 NoteOff 0 2 67 64 NoteOff 0 3 75 64 NoteOn 0 1 50 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.416667 1 50 64 NoteOff 0 2 65 64 NoteOff 0 3 74 64 NoteOn 0 1 43 64 NoteOn 0 2 63 64 NoteOff 0.416667 1 43 64 NoteOff 0 2 63 64 NoteOn 0 1 48 64 NoteOn 0 2 62 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 47 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 68 64 NoteOff 0 1 47 64 NoteOn 0 1 48 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.416667 1 48 64 NoteOff 0 2 63 64 NoteOff 0 3 67 64 NoteOn 0 1 50 64 NoteOn 0 2 65 64 NoteOn 0 3 65 64 NoteOff 0.416667 1 50 64 NoteOff 0 2 65 64 NoteOff 0 3 65 64 // Measure number 28 =90 NoteOn 0 1 41 64 NoteOn 0 2 59 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 41 64 NoteOn 0 1 43 64 NoteOff 0.208333 2 59 64 NoteOff 0 3 67 64 NoteOff 0 1 43 64 NoteOn 0 1 44 64 NoteOn 0 2 60 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 3 63 64 NoteOff 0.208333 2 60 64 NoteOff 0 3 63 64 NoteOn 0 2 62 64 NoteOn 0 3 65 64 NoteOff 0.416667 1 44 64 NoteOff 0 2 62 64 NoteOff 0 3 65 64 NoteOn 0 1 43 64 NoteOn 0 2 59 64 NoteOn 0 3 62 64 NoteOff 0.208333 1 43 64 NoteOn 0 1 41 64 NoteOff 0.208333 2 59 64 NoteOff 0 3 62 64 NoteOff 0 1 41 64 NoteOn 0 1 39 64 NoteOn 0 2 59 64 NoteOn 0 3 68 64 NoteOff 0.416667 2 59 64 NoteOff 0 3 68 64 NoteOn 0 2 60 64 NoteOn 0 3 67 64 NoteOff 0.416667 1 39 64 NoteOff 0 2 60 64 NoteOff 0 3 67 64 NoteOn 0.416667 1 51 64 NoteOn 0 2 60 64 NoteOn 0 3 69 64 NoteOff 0.416667 1 51 64 NoteOff 0 2 60 64 NoteOff 0 3 69 64 // Measure number 29 =93.3333 NoteOn 0 1 50 64 NoteOn 0 2 65 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 62 64 NoteOff 0.208333 1 50 64 NoteOff 0 3 71 64 NoteOff 0 2 62 64 NoteOn 0 1 48 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 63 64 NoteOn 0 2 60 64 NoteOff 0.208333 1 48 64 NoteOff 0 3 72 64 NoteOn 0 1 55 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 3 63 64 NoteOff 0.208333 2 60 64 NoteOff 0 1 55 64 NoteOff 0 3 63 64 NoteOn 0 1 43 64 NoteOn 0 2 59 64 NoteOn 0 3 62 64 NoteOff 0.208333 3 62 64 NoteOn 0 3 60 64 NoteOff 0.208333 1 43 64 NoteOff 0 2 59 64 NoteOff 0 3 60 64 NoteOn 0 1 36 64 NoteOn 0 1 48 64 NoteOn 0 2 60 64 NoteOn 0 3 60 64 NoteOff 0.416667 3 60 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 60 64 NoteOff 0 3 71 64 NoteOn 0 3 72 64 NoteOff 0.416667 3 72 64 NoteOn 0 2 64 64 NoteOn 0 3 67 64 NoteOff 0.416667 1 48 64 NoteOff 0 2 64 64 NoteOff 0 3 67 64 // Measure number 30 =96.6667 NoteOn 0 2 65 64 NoteOn 0 3 68 64 NoteOff 0.416667 3 68 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 71 64 NoteOn 0 3 72 64 NoteOff 0.416667 3 72 64 NoteOn 0 2 65 64 NoteOn 0 2 68 64 NoteOn 0 3 71 64 NoteOn 0 3 74 64 NoteOff 0.416667 2 65 64 NoteOff 0 2 68 64 NoteOff 0 3 71 64 NoteOff 0 3 74 64 NoteOn 0 2 65 64 NoteOn 0 3 67 64 NoteOff 0.416667 2 65 64 NoteOff 0 3 67 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 72 64 NoteOn 0 2 62 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 71 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.416667 2 63 64 NoteOff 0 3 72 64 NoteOn 0 2 65 64 NoteOn 0 2 68 64 NoteOn 0 3 74 64 NoteOff 0.416667 2 65 64 NoteOff 0 2 68 64 NoteOff 0 3 74 64 // Measure number 31 =100 NoteOn 0 2 59 64 NoteOn 0 2 62 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 3 67 64 NoteOff 0.208333 2 59 64 NoteOff 0 2 62 64 NoteOff 0 3 67 64 NoteOn 0 3 68 64 NoteOn 0.416667 2 59 64 NoteOn 0 2 62 64 NoteOff 0.416667 3 68 64 NoteOff 0 2 59 64 NoteOff 0 2 62 64 NoteOn 0 3 67 64 NoteOff 0.208333 3 67 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 2 55 64 NoteOn 0 2 60 64 NoteOn 0 3 64 64 NoteOff 1.66667 1 36 64 NoteOff 0 2 55 64 NoteOff 0 2 60 64 NoteOff 0 3 64 64 // Measure =103.333 ///CDT: 1685/3/-1750/7/28 ///OCY: Deutschland ///PPP: Coethen; Cothen; Co2then ///ODT: <1722// ///PDT: 1722 ///AFR: fuga; fugue ///AST: polyphony ///AMT: simple quadruple ///SCA: Bach-Werke-Verzeichnis ///YOR: Bach Gesellschaft ///SMS: British Library, various ///AIN: cemba; clavi ///EEV: 1.0 ///RDT: 1986 November 14 ///YER: 1994 August 10 ///EFL: 2/48 ///VTS: 1035528445 stk-4.5.0/projects/demo/scores/bookert.ski0000644000076600007660000000705212327014024016367 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 60 114.299997 NoteOff 0.380000 1 60 63.500000 NoteOn 0.020000 1 60 101.600002 NoteOff 0.100000 1 60 63.500000 NoteOn 0.100000 1 48 63.500000 NoteOff 0.200000 1 48 63.500000 NoteOn 0.200000 1 48 88.899998 NoteOff 0.190023 1 48 63.500000 NoteOn 0.010023 1 51 101.600002 NoteOff 0.570023 1 51 63.500000 NoteOn 0.030023 1 53 88.899998 NoteOff 0.570023 1 53 63.500000 NoteOn 0.030023 1 48 38.100002 NoteOff 0.300000 1 48 63.500000 NoteOn 0.300000 1 67 101.600002 NoteOff 0.570023 1 67 63.500000 NoteOn 0.030023 1 66 76.200003 NoteOff 0.190023 1 66 63.500000 NoteOn 0.010023 1 65 63.500000 NoteOff 0.190023 1 65 63.500000 NoteOn 0.010023 1 63 50.800001 NoteOff 0.190023 1 63 63.500000 NoteOn 0.010023 1 60 76.200003 NoteOff 0.380000 1 60 63.500000 NoteOn 0.020000 1 58 50.800001 NoteOff 0.190023 1 58 63.500000 NoteOn 0.010023 1 48 114.299997 NoteOff 0.380000 1 48 63.500000 NoteOn 0.020000 1 48 101.600002 NoteOff 0.100000 1 48 63.500000 NoteOn 0.100000 1 36 63.500000 NoteOff 0.200000 1 36 63.500000 NoteOn 0.200000 1 36 88.899998 NoteOff 0.190023 1 36 63.500000 NoteOn 0.010023 1 39 101.600002 NoteOff 0.570023 1 39 63.500000 NoteOn 0.030023 1 41 88.899998 NoteOff 0.570023 1 41 63.500000 NoteOn 0.030023 1 84 127.000000 NoteOff 0.475011 1 84 63.500000 NoteOn 0.025034 1 83 120.649998 NoteOff 0.066531 1 83 63.500000 NoteOn 0.003537 1 82 114.299997 NoteOff 0.057007 1 82 63.500000 NoteOn 0.003039 1 81 107.950003 NoteOff 0.047528 1 81 63.500000 NoteOn 0.002540 1 80 101.600002 NoteOff 0.047528 1 80 63.500000 NoteOn 0.002540 1 78 95.250000 NoteOff 0.038005 1 78 63.500000 NoteOn 0.002041 1 78 88.899998 NoteOff 0.028526 1 78 63.500000 NoteOn 0.001542 1 77 82.549997 NoteOff 0.019002 1 77 63.500000 NoteOn 0.001043 1 76 76.200003 NoteOff 0.019002 1 76 63.500000 NoteOn 0.001043 1 75 69.850002 NoteOff 0.019002 1 75 63.500000 NoteOn 0.001043 1 74 63.500000 NoteOff 0.019002 1 74 63.500000 NoteOn 0.001043 1 73 63.500000 NoteOff 0.028526 1 73 63.500000 NoteOn 0.001542 1 72 63.500000 NoteOff 0.019002 1 72 63.500000 NoteOn 0.001043 1 71 57.149998 NoteOff 0.028526 1 71 63.500000 NoteOn 0.001542 1 70 50.800001 NoteOff 0.038005 1 70 63.500000 NoteOn 0.002041 1 69 44.449999 NoteOff 0.047528 1 69 63.500000 NoteOn 0.002540 1 68 38.100002 NoteOff 0.057007 1 68 63.500000 NoteOn 0.003039 1 67 31.750000 NoteOff 0.057007 1 67 63.500000 NoteOn 0.003039 1 66 25.400000 NoteOff 0.057007 1 66 63.500000 NoteOn 0.003039 1 65 31.750000 NoteOff 0.066531 1 65 63.500000 NoteOn 0.003537 1 64 25.400000 NoteOff 0.076009 1 64 63.500000 NoteOn 0.004036 1 63 19.050001 NoteOff 0.085533 1 63 63.500000 NoteOn 0.004535 1 62 31.750000 NoteOff 0.095011 1 62 63.500000 NoteOn 0.005034 1 61 44.449999 NoteOff 0.104535 1 61 63.500000 ControlChange 0.005533 1 1 127.000000 NoteOn 0.000000 1 60 63.500000 NoteOff 1.500000 1 60 63.500000 stk-4.5.0/projects/demo/scores/chords.ski0000644000076600007660000000447112327014024016206 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ StringDamping 0.0 2 127 Chord 0.0 2 100 G StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 G StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 C StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 C StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 G StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 G StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 D StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 D StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 G StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 G StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 C StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 C StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 G StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 D StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 G StringDamping 0.2 2 32 StringDamping 0.0 2 127 ChordOff 0.0 2 100 Chord 0.2 2 100 G StringDamping 0.1 2 32 ChordOff 0.1 2 100 StringDamping 0.0 2 120 Strumming 0.0 2 127 NoteOn 0.1 2 55 60 NoteOff 0.7 2 55 60 NoteOn 0.0 2 60 60 NoteOff 0.4 2 60 60 NoteOn 0.0 2 62 60 NoteOff 0.2 2 62 60 NoteOn 0.0 2 60 60 NoteOff 0.2 2 60 60 NoteOn 0.0 2 59 60 NoteOff 0.4 2 59 60 NoteOn 0.0 2 57 60 NoteOff 0.2 2 57 60 NoteOn 0.0 2 55 60 NoteOff 0.2 2 55 60 NoteOn 0.0 2 62 60 NoteOff 0.8 2 62 60 NoteOn 0.1 2 67 100 NoteOff 0.7 2 67 100 NoteOn 0.0 2 72 100 NoteOff 0.4 2 72 100 NoteOn 0.0 2 74 100 NoteOff 0.2 2 74 100 NoteOn 0.0 2 72 100 NoteOff 0.2 2 72 100 NotStrumming 0.0 2 0 NoteOn 0.0 2 71 100 NoteOff 0.1 2 71 100 NoteOn 0.0 2 76 100 NoteOff 0.1 2 76 100 NoteOn 0.0 2 74 100 NoteOff 0.1 2 74 100 NoteOn 0.0 2 70 100 NoteOff 0.1 2 70 100 NoteOn 0.0 2 69 100 NoteOff 0.1 2 69 100 NoteOn 0.0 2 67 100 NoteOff 0.1 2 67 100 NoteOn 0.0 2 64 100 NoteOff 0.1 2 64 100 NoteOn 0.0 2 62 100 NoteOff 0.1 2 62 100 Chord 0.0 2 64 G ChordOff 2.0 2 64 stk-4.5.0/projects/demo/scores/doogie.ski0000644000076600007660000000242412327014024016166 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 72 88.899998 NoteOff 0.400000 1 72 63.500000 NoteOn 0.000000 1 71 101.600002 NoteOff 0.400000 1 71 63.500000 NoteOn 0.000000 1 69 63.500000 NoteOff 0.320000 1 69 63.500000 NoteOn 0.080000 1 71 101.600002 NoteOff 1.200000 1 71 63.500000 NoteOn 0.000000 1 67 76.200003 NoteOff 0.320000 1 67 63.500000 NoteOn 0.080000 1 64 38.100002 NoteOff 0.320000 1 64 63.500000 NoteOn 0.080000 1 67 101.600002 NoteOff 0.800000 1 67 63.500000 NoteOn 0.000000 1 69 127.000000 NoteOff 0.320000 1 69 63.500000 NoteOn 0.080000 1 69 76.200003 NoteOff 2.000000 1 69 63.500000 NoteOn 0.000000 1 60 114.299997 NoteOff 0.400000 1 60 63.500000 NoteOn 0.000000 1 62 63.500000 NoteOff 0.400000 1 62 63.500000 NoteOn 0.000000 1 64 63.500000 NoteOff 0.400000 1 64 63.500000 NoteOn 0.000000 1 62 88.899998 NoteOff 1.200000 1 62 63.500000 NoteOn 0.000000 1 60 38.100002 NoteOff 0.480000 1 60 63.500000 NoteOn 0.120000 1 60 127.000000 ControlChange 0.000000 1 1 127.000000 NoteOff 2.000000 1 60 63.500000 stk-4.5.0/projects/demo/scores/drumfunk.ski0000644000076600007660000001143512327014024016555 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 36 127.000000 NoteOn 0.000000 1 49 127.000000 NoteOn 0.000000 1 42 127.000000 NoteOn 0.400000 1 38 127.000000 NoteOn 0.300000 1 36 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.000000 1 38 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.000000 1 36 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 42 127.000000 NoteOn 0.200000 1 49 127.000000 NoteOn 0.200000 1 38 127.000000 NoteOn 0.300000 1 36 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.000000 1 38 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 36 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 49 127.000000 NoteOn 0.000000 1 42 127.000000 NoteOn 0.400000 1 38 127.000000 NoteOn 0.300000 1 36 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.000000 1 38 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 36 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.100000 1 36 60.000000 NoteOn 0.200000 1 38 80.000000 NoteOn 0.200000 1 38 90.000000 NoteOn 0.100000 1 38 100.000000 NoteOn 0.100000 1 38 105.000000 NoteOn 0.100000 1 38 110.000000 NoteOn 0.100000 1 50 127.000000 NoteOn 0.100000 1 50 127.000000 NoteOn 0.100000 1 50 127.000000 NoteOn 0.100000 1 50 127.000000 NoteOn 0.100000 1 45 127.000000 NoteOn 0.100000 1 45 127.000000 NoteOn 0.100000 1 41 127.000000 NoteOn 0.100000 1 41 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 49 127.000000 NoteOn 0.000000 1 42 127.000000 NoteOn 0.200000 1 56 127.000000 NoteOn 0.200000 1 38 127.000000 NoteOn 0.000000 1 56 127.000000 NoteOn 0.300000 1 36 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.000000 1 38 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.100000 1 54 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 36 127.000000 NoteOn 0.000000 1 54 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 54 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.000000 1 54 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 49 127.000000 NoteOn 0.000000 1 42 127.000000 NoteOn 0.200000 1 56 127.000000 NoteOn 0.200000 1 38 127.000000 NoteOn 0.000000 1 56 127.000000 NoteOn 0.300000 1 36 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.000000 1 38 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.100000 1 54 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 36 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 54 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.000000 1 54 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 49 127.000000 NoteOn 0.000000 1 42 127.000000 NoteOn 0.200000 1 56 127.000000 NoteOn 0.200000 1 38 127.000000 NoteOn 0.000000 1 56 127.000000 NoteOn 0.300000 1 36 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.000000 1 38 127.000000 NoteOn 0.200000 1 36 127.000000 NoteOn 0.100000 1 54 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.000000 1 36 127.000000 NoteOn 0.000000 1 54 127.000000 NoteOn 0.100000 1 36 127.000000 NoteOn 0.100000 1 42 127.000000 NoteOn 0.100000 1 32 127.000000 NoteOn 0.200000 1 32 127.000000 NoteOn 0.200000 1 32 127.000000 NoteOn 0.300000 1 32 127.000000 NoteOn 0.200000 1 32 127.000000 NoteOn 0.200000 1 32 127.000000 NoteOn 0.100000 1 52 127.000000 NoteOn 0.100000 1 32 127.000000 NoteOn 0.100000 1 32 127.000000 NoteOn 0.100000 1 32 127.000000 NoteOn 0.100000 1 32 127.000000 NoteOn 0.000000 1 46 127.000000 NoteOn 0.000000 1 49 127.000000 NoteOff 1.000000 1 49 127.000000 stk-4.5.0/projects/demo/scores/drumtest.ski0000644000076600007660000000355212327014024016572 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.300000 1 36 10.000000 NoteOn 0.300000 1 36 50.000000 NoteOn 0.300000 1 36 90.000000 NoteOn 0.300000 1 36 127.000000 NoteOn 0.300000 1 38 10.000000 NoteOn 0.300000 1 38 50.000000 NoteOn 0.300000 1 38 90.000000 NoteOn 0.300000 1 38 127.000000 NoteOn 0.300000 1 41 10.000000 NoteOn 0.300000 1 41 50.000000 NoteOn 0.300000 1 41 90.000000 NoteOn 0.300000 1 41 127.000000 NoteOn 0.300000 1 42 10.000000 NoteOn 0.300000 1 42 50.000000 NoteOn 0.300000 1 42 90.000000 NoteOn 0.300000 1 42 127.000000 NoteOn 0.300000 1 45 10.000000 NoteOn 0.300000 1 45 50.000000 NoteOn 0.300000 1 45 90.000000 NoteOn 0.300000 1 45 127.000000 NoteOn 0.300000 1 46 10.000000 NoteOn 0.300000 1 46 50.000000 NoteOn 0.300000 1 46 90.000000 NoteOn 0.300000 1 46 127.000000 NoteOn 0.300000 1 48 10.000000 NoteOn 0.300000 1 48 50.000000 NoteOn 0.300000 1 48 90.000000 NoteOn 0.300000 1 48 127.000000 NoteOn 0.300000 1 49 10.000000 NoteOn 0.300000 1 49 50.000000 NoteOn 0.300000 1 49 90.000000 NoteOn 0.300000 1 49 127.000000 NoteOn 0.300000 1 54 10.000000 NoteOn 0.300000 1 54 50.000000 NoteOn 0.300000 1 54 90.000000 NoteOn 0.300000 1 54 127.000000 NoteOn 0.300000 1 56 10.000000 NoteOn 0.300000 1 56 50.000000 NoteOn 0.300000 1 56 90.000000 NoteOn 0.300000 1 56 127.000000 NoteOn 0.300000 1 57 10.000000 NoteOn 0.300000 1 57 50.000000 NoteOn 0.300000 1 57 90.000000 NoteOn 0.300000 1 57 127.000000 Exit stk-4.5.0/projects/demo/scores/duelingb.ski0000644000076600007660000000172512327014024016514 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 57 50.800001 NoteOn 0.100000 1 57 50.800001 NoteOn 0.100000 1 57 127.000000 NoteOn 0.200000 1 59 63.500000 NoteOff 0.100000 1 59 63.500000 NoteOn 0.100000 1 61 127.000000 NoteOff 0.100000 1 61 63.500000 NoteOn 0.100000 1 62 127.000000 NoteOff 0.100000 1 62 63.500000 NoteOn 0.100000 1 64 114.299997 NoteOn 0.200000 1 62 63.500000 NoteOff 0.100000 1 62 63.500000 NoteOn 0.100000 1 61 127.000000 NoteOn 0.400000 1 69 127.000000 NoteOn 0.200000 1 69 12.700000 NoteOff 0.049977 1 69 63.500000 NoteOn 0.049977 1 73 63.500000 NoteOff 0.049977 1 73 63.500000 NoteOn 0.049977 1 71 63.500000 NoteOff 0.100000 1 71 63.500000 NoteOn 0.100000 1 85 127.000000 NoteOn 0.200000 1 45 50.800001 NoteOff 0.400000 1 45 63.500000 stk-4.5.0/projects/demo/scores/fiddle.ski0000644000076600007660000001063312327014024016150 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 60 127.000000 NoteOff 0.118776 1 60 63.500000 NoteOn 0.006259 1 59 127.000000 NoteOff 0.118776 1 59 63.500000 NoteOn 0.006259 1 60 127.000000 NoteOff 0.118776 1 60 63.500000 NoteOn 0.006259 1 62 127.000000 NoteOff 0.118776 1 62 63.500000 NoteOn 0.006259 1 63 127.000000 NoteOff 0.237506 1 63 63.500000 NoteOn 0.012517 1 63 127.000000 NoteOff 0.062494 1 63 63.500000 NoteOn 0.062494 1 65 127.000000 NoteOff 0.062494 1 65 63.500000 NoteOn 0.062494 1 67 127.000000 NoteOff 0.237506 1 67 63.500000 NoteOn 0.012517 1 67 127.000000 NoteOff 0.118776 1 67 63.500000 NoteOn 0.006259 1 68 127.000000 NoteOff 0.118776 1 68 63.500000 NoteOn 0.006259 1 67 127.000000 NoteOff 0.062494 1 67 63.500000 NoteOn 0.062494 1 63 127.000000 NoteOff 0.062494 1 63 63.500000 NoteOn 0.062494 1 60 127.000000 NoteOff 0.237506 1 60 63.500000 NoteOn 0.012517 1 70 127.000000 NoteOff 0.118776 1 70 63.500000 NoteOn 0.006259 1 69 127.000000 NoteOff 0.118776 1 69 63.500000 NoteOn 0.006259 1 70 127.000000 NoteOff 0.118776 1 70 63.500000 NoteOn 0.006259 1 72 127.000000 NoteOff 0.118776 1 72 63.500000 NoteOn 0.006259 1 74 127.000000 NoteOff 0.118776 1 74 63.500000 NoteOn 0.006259 1 72 127.000000 NoteOff 0.062494 1 72 63.500000 NoteOn 0.062494 1 74 127.000000 NoteOff 0.062494 1 74 63.500000 NoteOn 0.062494 1 75 127.000000 NoteOff 0.062494 1 75 63.500000 NoteOn 0.062494 1 77 127.000000 NoteOff 0.118776 1 77 63.500000 NoteOn 0.006259 1 79 127.000000 NoteOff 0.118776 1 79 63.500000 NoteOn 0.006259 1 77 127.000000 NoteOff 0.118776 1 77 63.500000 NoteOn 0.006259 1 74 127.000000 NoteOff 0.062494 1 74 63.500000 NoteOn 0.062494 1 70 127.000000 NoteOff 0.475011 1 70 63.500000 NoteOn 0.025034 1 72 127.000000 NoteOff 0.118776 1 72 63.500000 NoteOn 0.006259 1 75 127.000000 NoteOff 0.118776 1 75 63.500000 NoteOn 0.006259 1 79 127.000000 NoteOff 0.062494 1 79 63.500000 NoteOn 0.062494 1 72 127.000000 NoteOff 0.062494 1 72 63.500000 NoteOn 0.062494 1 70 127.000000 NoteOff 0.118776 1 70 63.500000 NoteOn 0.006259 1 74 127.000000 NoteOff 0.062494 1 74 63.500000 NoteOn 0.062494 1 77 127.000000 NoteOff 0.062494 1 77 63.500000 NoteOn 0.062494 1 70 127.000000 NoteOff 0.062494 1 70 63.500000 NoteOn 0.062494 1 68 127.000000 NoteOff 0.118776 1 68 63.500000 NoteOn 0.006259 1 72 127.000000 NoteOff 0.118776 1 72 63.500000 NoteOn 0.006259 1 75 127.000000 NoteOff 0.062494 1 75 63.500000 NoteOn 0.062494 1 68 127.000000 NoteOff 0.062494 1 68 63.500000 NoteOn 0.062494 1 67 127.000000 NoteOff 0.118776 1 67 63.500000 NoteOn 0.006259 1 70 127.000000 NoteOff 0.062494 1 70 63.500000 NoteOn 0.062494 1 74 127.000000 NoteOff 0.062494 1 74 63.500000 NoteOn 0.062494 1 67 127.000000 NoteOff 0.062494 1 67 63.500000 NoteOn 0.062494 1 65 127.000000 NoteOff 0.118776 1 65 63.500000 NoteOn 0.006259 1 68 127.000000 NoteOff 0.118776 1 68 63.500000 NoteOn 0.006259 1 72 127.000000 NoteOff 0.062494 1 72 63.500000 NoteOn 0.062494 1 65 127.000000 NoteOff 0.062494 1 65 63.500000 NoteOn 0.062494 1 63 127.000000 NoteOff 0.118776 1 63 63.500000 NoteOn 0.006259 1 67 127.000000 NoteOff 0.062494 1 67 63.500000 NoteOn 0.062494 1 70 127.000000 NoteOff 0.062494 1 70 63.500000 NoteOn 0.062494 1 62 127.000000 NoteOff 0.062494 1 62 63.500000 NoteOn 0.062494 1 60 127.000000 NoteOff 0.124989 1 60 63.500000 NoteOn 0.124989 1 79 127.000000 NoteOff 0.187483 1 79 63.500000 NoteOn 0.187483 1 82 127.000000 NoteOff 0.356236 1 82 63.500000 NoteOn 0.018776 1 84 127.000000 ControlChange 0.000000 1 1 20.000000 NoteOff 0.950023 1 84 63.500000 NoteOff 0.050023 1 84 63.500000 stk-4.5.0/projects/demo/scores/flutbach.ski0000644000076600007660000000615512327014024016515 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoiseLevel 0.000 1 30.0 NoteOn 0.000 1 79 80.000000 NoteOff 0.100 1 79 63.500000 NoteOn 0.100 1 84 90.000000 NoteOff 0.100 1 84 63.500000 NoteOn 0.100 1 79 70.000000 NoteOff 0.100 1 79 63.500000 NoteOn 0.100 1 76 120.000000 NoteOn 0.100 1 77 110.000000 NoteOn 0.100 1 79 70.000000 NoteOff 0.100 1 79 70.0 NoteOn 0.100 1 79 90.000000 NoteOff 0.150 1 79 63.500000 NoteOn 0.050 1 79 80.000000 NoteOff 0.100 1 79 63.500000 NoteOn 0.100 1 84 90.000000 NoteOff 0.100 1 84 63.500000 NoteOn 0.100 1 79 70.000000 NoteOff 0.100 1 79 63.500000 NoteOn 0.100 1 76 70.000000 NoteOn 0.100 1 77 70.000000 NoteOn 0.100 1 79 80.000000 NoteOff 0.100 1 79 70.0 NoteOn 0.100 1 79 90.000000 NoteOff 0.150 1 79 63.500000 NoteOn 0.050 1 81 120.000000 NoteOn 0.100 1 79 110.000000 NoteOn 0.100 1 77 70.000000 NoteOn 0.100 1 76 120.000000 NoteOn 0.100 1 74 110.000000 NoteOn 0.100 1 72 70.000000 NoteOn 0.100 1 81 120.000000 NoteOn 0.200 1 82 60.000000 NoteOff 0.100 1 82 64.000000 NoteOn 0.100 1 81 110.000000 NoteOn 0.200 1 79 60.000000 NoteOff 0.100 1 79 64.000000 NoteOn 0.100 1 77 110.000000 NoteOn 0.200 1 76 60.000000 NoteOff 0.100 1 76 64.000000 NoteOn 0.100 1 77 120.000000 NoteOn 0.100 1 76 110.000000 NoteOn 0.100 1 74 70.000000 NoteOn 0.100 1 76 120.000000 NoteOn 0.100 1 77 110.000000 NoteOff 0.100 1 77 64.000000 NoteOn 0.100 1 79 120.000000 NoteOn 0.100 1 81 110.000000 NoteOn 0.100 1 79 70.000000 NoteOn 0.100 1 77 120.000000 NoteOn 0.100 1 76 110.000000 NoteOn 0.100 1 74 110.000000 NoteOn 0.100 1 79 120.000000 NoteOn 0.200 1 81 110.000000 NoteOn 0.200 1 79 70.000000 NoteOn 0.200 1 77 120.000000 NoteOn 0.200 1 76 110.000000 NoteOn 0.200 1 74 110.000000 NoteOff 0.100 1 74 110.000000 NoteOn 0.100 1 76 120.000000 NoteOn 0.100 1 74 110.000000 NoteOn 0.100 1 72 70.000000 NoteOn 0.100 1 74 120.000000 NoteOff 0.070 1 74 120.000000 NoteOn 0.030 1 76 100.000000 NoteOff 0.070 1 76 120.000000 NoteOn 0.030 1 77 100.000000 NoteOff 0.070 1 77 120.000000 NoteOn 0.030 1 79 100.000000 NoteOff 0.070 1 79 120.000000 NoteOn 0.030 1 81 100.000000 NoteOff 0.070 1 81 120.000000 NoteOn 0.030 1 82 100.000000 NoteOff 0.070 1 82 120.000000 NoteOn 0.030 1 81 100.000000 NoteOff 0.070 1 81 120.000000 NoteOn 0.030 1 82 100.000000 NoteOff 0.070 1 82 120.000000 NoteOn 0.030 1 79 100.000000 NoteOff 0.070 1 79 120.000000 NoiseLevel 0.000 1 40.0 Modulation 0.000 1 25.0 NoteOn 0.030 1 77 120.000000 NoteOn 1.000 1 89 100.000000 NoteOff 0.200 1 77 120.000000 stk-4.5.0/projects/demo/scores/funicula.ski0000644000076600007660000001333212327014024016526 0ustar garyNoteOn 0.000315 2 69 69 NoteOff 0.139851 2 69 0 NoteOn 0.292059 2 74 79 NoteOff 0.069197 2 74 0 NoteOn 0.046664 2 74 71 NoteOff 0.062959 2 74 0 NoteOn 0.025777 2 74 47 NoteOff 0.037024 2 74 0 NoteOn 0.065524 2 74 63 NoteOff 0.059605 2 74 0 NoteOn 0.019622 2 74 47 NoteOff 0.039886 2 74 0 NoteOn 0.052080 2 74 67 NoteOff 0.061615 2 74 0 NoteOn 0.021743 2 74 53 NoteOff 0.042091 2 74 0 NoteOn 0.056058 2 74 69 NoteOff 0.122627 2 74 0 NoteOn 0.047608 2 74 87 NoteOff 0.128503 2 74 0 NoteOn 0.187575 2 74 79 NoteOff 0.113216 2 74 0 NoteOn 0.055912 2 73 82 NoteOff 0.145445 2 73 0 NoteOn 0.104378 2 73 73 NoteOff 0.120442 2 73 0 NoteOn 0.047541 2 69 73 NoteOff 0.151890 2 69 0 NoteOn 0.098655 2 69 64 NoteOff 0.137789 2 69 0 NoteOn 0.042621 2 71 76 NoteOff 0.171097 2 71 0 NoteOn 0.081635 2 71 61 NoteOff 0.073859 2 71 0 NoteOn 0.110418 2 66 69 NoteOff 0.304332 2 66 0 NoteOn 0.119942 2 66 69 NoteOff 0.057357 2 66 0 NoteOn 0.034674 2 66 60 NoteOff 0.056795 2 66 0 NoteOn 0.018853 2 66 76 NoteOff 0.061343 2 66 0 NoteOn 0.048614 2 66 67 NoteOff 0.058950 2 66 0 NoteOn 0.008595 2 66 63 NoteOff 0.057296 2 66 0 NoteOn 0.036486 2 66 67 NoteOff 0.125570 2 66 0 NoteOn 0.055182 2 66 82 NoteOff 0.079954 2 66 0 NoteOn 0.021852 2 66 64 NoteOff 0.085418 2 66 0 NoteOn 0.065201 2 64 79 NoteOff 0.070529 2 64 0 NoteOn 0.055850 2 66 76 NoteOff 0.080037 2 66 0 NoteOn 0.047400 2 64 73 NoteOff 0.079393 2 64 0 NoteOn 0.075934 2 62 76 NoteOff 0.073956 2 62 0 NoteOn 0.038639 2 62 69 NoteOff 0.125310 2 62 0 NoteOn 0.067131 2 62 67 NoteOff 0.114670 2 62 0 NoteOn 0.053501 2 62 62 NoteOff 0.058095 2 62 0 NoteOn 0.017163 2 62 47 NoteOff 0.056632 2 62 0 NoteOn 0.023810 2 62 64 NoteOff 0.070499 2 62 0 NoteOn 0.018403 2 62 64 NoteOff 0.044563 2 62 0 NoteOn 0.038905 2 62 64 NoteOff 0.128219 2 62 0 NoteOn 0.020654 2 62 79 NoteOff 0.100199 2 62 0 NoteOn 0.119351 2 66 69 NoteOff 0.140313 2 66 0 NoteOn 0.023378 2 64 67 NoteOff 0.157359 2 64 0 NoteOn 0.103959 2 62 69 NoteOff 0.072433 2 62 0 NoteOn 0.089338 2 62 63 NoteOff 0.067472 2 62 0 NoteOn 0.131003 2 62 63 NoteOff 0.092003 2 62 0 NoteOn 0.084592 2 62 64 NoteOff 0.156367 2 62 0 NoteOn 0.024942 2 62 69 NoteOff 0.154966 2 62 0 NoteOn 0.023168 2 62 67 NoteOff 0.402274 2 62 0 NoteOn 0.151088 2 69 82 NoteOff 0.295762 2 69 0 NoteOn 0.144298 2 74 67 NoteOff 0.064684 2 74 0 NoteOn 0.046916 2 74 61 NoteOff 0.061961 2 74 0 NoteOn 0.013175 2 74 58 NoteOff 0.063742 2 74 0 NoteOn 0.063079 2 74 64 NoteOff 0.115461 2 74 0 NoteOn 0.066345 2 74 64 NoteOff 0.104482 2 74 0 NoteOn 0.058225 2 74 69 NoteOff 0.137897 2 74 0 NoteOn 0.028045 2 74 82 NoteOff 0.227867 2 74 0 NoteOn 0.089793 2 74 73 NoteOff 0.137043 2 74 0 NoteOn 0.027024 2 73 64 NoteOff 0.156746 2 73 0 NoteOn 0.091269 2 73 73 NoteOff 0.144116 2 73 0 NoteOn 0.040937 2 69 76 NoteOff 0.131683 2 69 0 NoteOn 0.111516 2 69 63 NoteOff 0.119809 2 69 0 NoteOn 0.055603 2 71 69 NoteOff 0.151398 2 71 0 NoteOn 0.092930 2 71 61 NoteOff 0.077496 2 71 0 NoteOn 0.108207 2 66 73 NoteOff 0.268736 2 66 0 NoteOn 0.105231 2 66 82 NoteOff 0.068718 2 66 0 NoteOn 0.052997 2 66 69 NoteOff 0.121595 2 66 0 NoteOn 0.089177 2 66 58 NoteOff 0.106939 2 66 0 NoteOn 0.049675 2 66 67 NoteOff 0.145059 2 66 0 NoteOn 0.033535 2 66 24 NoteOff 0.169419 2 66 0 NoteOn 0.058897 2 66 63 NoteOff 0.086285 2 66 0 NoteOn 0.041606 2 64 76 NoteOff 0.084153 2 64 0 NoteOn 0.044987 2 66 69 NoteOff 0.100239 2 66 0 NoteOn 0.022854 2 64 76 NoteOff 0.075048 2 64 0 NoteOn 0.065983 2 62 67 NoteOff 0.081468 2 62 0 NoteOn 0.040989 2 62 71 NoteOff 0.134240 2 62 0 NoteOn 0.062401 2 62 61 NoteOff 0.119152 2 62 0 NoteOn 0.050401 2 62 64 NoteOff 0.128506 2 62 0 NoteOn 0.030134 2 62 64 NoteOff 0.142160 2 62 0 NoteOn 0.037510 2 62 79 NoteOff 0.239364 2 62 0 NoteOn 0.018231 2 66 73 NoteOff 0.131528 2 66 0 NoteOn 0.042607 2 64 76 NoteOff 0.149396 2 64 0 NoteOn 0.089318 2 62 73 NoteOff 0.087485 2 62 0 NoteOn 0.085324 2 62 73 NoteOff 0.072863 2 62 0 NoteOn 0.023103 2 62 73 NoteOff 0.085817 2 62 0 NoteOn 0.021983 2 62 64 NoteOff 0.061305 2 62 0 NoteOn 0.036091 2 62 61 NoteOff 0.070809 2 62 0 NoteOn 0.011382 2 62 58 NoteOff 0.060215 2 62 0 NoteOn 0.027180 2 62 61 NoteOff 0.075393 2 62 0 NoteOn 0.025560 2 62 29 NoteOff 0.038858 2 62 0 NoteOn 0.030691 2 62 64 NoteOff 0.129305 2 62 0 NoteOn 0.021792 2 62 76 NoteOff 0.075593 2 62 0 NoteOn 0.030875 2 62 95 NoteOff 0.459440 2 62 0 stk-4.5.0/projects/demo/scores/funskini.ski0000644000076600007660000000636412327014024016555 0ustar gary/* Howdy!!!! SKINI0.9 Test Score ***********/ // First a pretty good player PlayerSkill 0.000000 2 100 NoteOn 0.000081 2 69 64 NoteOff 0.220735 2 69 0 Strumming 0.000000 2 127 NoteOn 0.244988 2 74 69 NoteOff 1.085355 2 74 0 NotStrumming 0.000000 2 0 NoteOn 0.133034 2 74 58 NoteOff 0.121377 2 74 0 NoteOn 0.025178 2 73 56 NoteOff 0.204028 2 73 0 NoteOn 0.070314 2 73 58 NoteOff 0.150998 2 73 0 NoteOn 0.029853 2 69 63 NoteOff 0.152847 2 69 0 NoteOn 0.097649 2 69 58 NoteOff 0.140495 2 69 0 NoteOn 0.052114 2 71 69 NoteOff 0.177446 2 71 0 NoteOn 0.084674 2 71 53 NoteOff 0.084189 2 71 0 NoteOn 0.107113 2 66 82 NoteOff 0.345345 2 66 0 Strumming 0.000000 2 127 NoteOn 0.114209 2 66 69 NoteOff 0.638118 2 66 0 NotStrumming 0.000000 2 0 NoteOn 0.096405 2 66 61 NoteOff 0.134993 2 66 0 NoteOn 0.028328 2 64 67 NoteOff 0.251752 2 64 0 NoteOn 0.052434 2 62 64 NoteOff 0.077954 2 62 0 Strumming 0.000000 2 127 NoteOn 0.069474 2 62 69 NoteOff 1.132502 2 62 0 NotStrumming 0.000000 2 0 NoteOn 0.043887 2 66 69 NoteOff 0.096938 2 66 0 NoteOn 0.046985 2 64 71 NoteOff 0.085443 2 64 0 NoteOn 0.055538 2 66 63 NoteOff 0.105148 2 66 0 NoteOn 0.021553 2 64 62 NoteOff 0.103749 2 64 0 Strumming 0.000000 2 127 NoteOn 0.054633 2 62 67 NoteOff 1.033837 2 62 0 NotStrumming 0.000000 2 0 // Now a really bad player PlayerSkill 0.000000 2 10 NoteOn 0.235617 2 69 69 NoteOff 0.316772 2 69 0 Strumming 0.000000 2 127 NoteOn 0.145871 2 74 64 NoteOff 1.100060 2 74 0 NotStrumming 0.000000 2 0 NoteOn 0.115729 2 74 58 NoteOff 0.166520 2 74 0 NoteOn 0.007216 2 73 61 NoteOff 0.192106 2 73 0 NoteOn 0.067405 2 73 62 NoteOff 0.160641 2 73 0 NoteOn 0.015116 2 69 58 NoteOff 0.176983 2 69 0 NoteOn 0.083744 2 69 62 NoteOff 0.155400 2 69 0 NoteOn 0.020502 2 71 69 NoteOff 0.187489 2 71 0 NoteOn 0.076011 2 71 56 NoteOff 0.094456 2 71 0 NoteOn 0.094632 2 66 73 NoteOff 0.303251 2 66 0 Strumming 0.000000 2 127 NoteOn 0.136058 2 66 69 NoteOff 0.601147 2 66 0 NotStrumming 0.000000 2 0 NoteOn 0.073985 2 66 56 NoteOff 0.145772 2 66 0 NoteOn 0.028922 2 64 64 NoteOff 0.082327 2 64 0 NoteOn 0.047864 2 66 61 NoteOff 0.099460 2 66 0 NoteOn 0.020486 2 64 40 NoteOff 0.131447 2 64 0 Strumming 0.000000 2 127 NoteOn 0.042691 2 62 71 NoteOff 1.131626 2 62 0 NotStrumming 0.000000 2 0 NoteOn 0.040285 2 66 51 NoteOff 0.141532 2 66 0 NoteOn 0.016442 2 64 64 NoteOff 0.195371 2 64 0 NoteOn 0.073368 2 62 67 NoteOff 0.098382 2 62 0 Strumming 0.000000 2 127 NoteOn 0.082045 2 62 69 NoteOff 0.796526 2 62 0 NotStrumming 0.000000 2 0 NoteOn 0.079242 2 62 64 NoteOff 0.473653 2 62 0 stk-4.5.0/projects/demo/scores/lacrymos.ski0000644000076600007660000000252712327014024016555 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ ControlChange 0.000000 1 1 20.000000 ControlChange 0.000000 1 4 22.000000 NoteOn 0.000000 1 46 64.000000 ControlChange 0.200000 1 4 8.000000 NoteOff 0.800000 1 46 64.500000 NoteOn 0.000000 1 51 74.000000 NoteOff 0.750000 1 51 74.500000 NoteOn 0.000000 1 53 84.000000 ControlChange 0.000000 1 4 0.000000 NoteOff 0.250000 1 53 84.500000 NoteOn 0.000000 1 54 84.000000 ControlChange 0.000000 1 4 10.000000 NoteOff 1.500000 1 54 84.500000 NoteOn 0.000000 1 54 84.000000 ControlChange 0.000000 1 4 8.000000 NoteOff 0.500000 1 54 84.500000 NoteOn 0.000000 1 53 84.000000 ControlChange 0.000000 1 4 0.000000 NoteOff 0.500000 1 53 84.500000 NoteOn 0.000000 1 51 84.000000 NoteOff 0.500000 1 51 84.500000 NoteOn 0.000000 1 53 84.000000 ControlChange 0.000000 1 4 4.000000 NoteOff 0.500000 1 53 84.500000 NoteOn 0.000000 1 54 94.000000 NoteOff 0.500000 1 54 94.500000 NoteOn 0.000000 1 51 74.000000 ControlChange 0.000000 1 4 0.000000 NoteOff 1.000000 1 51 74.500000 NoteOn 0.000000 1 46 32.000000 ControlChange 0.000000 1 4 8.000000 ControlChange 0.000000 1 1 40.000000 NoteOff 1.950023 1 46 64.500000 stk-4.5.0/projects/demo/scores/mandtune.ski0000644000076600007660000000272312327014024016535 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000082 2 55 82 NoteOff 1.000000 2 55 0 NoteOn 0.000082 2 55 82 NoteOff 0.700000 2 55 0 NoteOn 0.000082 2 62 82 NoteOff 0.600000 2 62 0 NoteOn 0.000082 2 62 82 NoteOff 1.000000 2 62 0 NoteOn 0.000082 2 69 82 NoteOff 0.500000 2 69 0 ControlChange 0.100000 1 1 10 ControlChange 0.100000 1 1 20 ControlChange 0.100000 1 1 30 ControlChange 0.100000 1 1 40 ControlChange 0.100000 1 1 50 NoteOn 0.000000 2 69 82 ControlChange 0.100000 1 1 40 ControlChange 0.100000 1 1 30 ControlChange 0.100000 1 1 22 ControlChange 0.100000 1 1 12 NoteOn 0.000000 2 69 82 ControlChange 0.100000 1 1 10 ControlChange 0.100000 1 1 20 ControlChange 0.100000 1 1 30 ControlChange 0.100000 1 1 40 ControlChange 0.100000 1 1 50 ControlChange 0.100000 1 1 60 ControlChange 0.100000 1 1 50 ControlChange 0.100000 1 1 40 ControlChange 0.100000 1 1 30 ControlChange 0.100000 1 1 20 ControlChange 0.100000 1 1 10 ControlChange 0.100000 1 1 6 NoteOn 0.000082 2 69 82 NoteOff 1.000000 2 69 0 NoteOn 0.000082 2 76 82 NoteOff 0.800000 2 76 0 NoteOn 0.000082 2 76 82 NoteOff 0.800000 2 76 0 NoteOn 0.000082 2 55 82 NoteOn 0.200000 2 62 82 NoteOn 0.100000 2 71 82 NoteOn 0.200000 2 79 82 NoteOff 1.000000 2 79 82 stk-4.5.0/projects/demo/scores/marimba2.ski0000644000076600007660000000711012327014024016407 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.001 1 48 88.899998 NoteOff 0.100 1 48 63.500000 NoteOn 0.001 1 72 88.899998 NoteOff 0.100 1 72 63.500000 NoteOn 0.001 1 67 88.899998 NoteOff 0.100 1 67 63.500000 NoteOn 0.001 1 76 88.899998 NoteOff 0.100 1 76 63.500000 NoteOn 0.001 1 72 88.899998 NoteOff 0.100 1 72 63.500000 NoteOn 0.001 1 55 88.899998 NoteOff 0.100 1 55 63.500000 NoteOn 0.001 1 91 88.899998 NoteOff 0.200 1 91 63.500000 StickHardness 0.000 1 30 NoteOn 0.001 1 48 88.899998 NoteOff 0.100 1 48 63.500000 NoteOn 0.001 1 72 88.899998 NoteOff 0.100 1 72 63.500000 NoteOn 0.001 1 67 88.899998 NoteOff 0.100 1 67 63.500000 NoteOn 0.001 1 76 88.899998 NoteOff 0.100 1 76 63.500000 NoteOn 0.001 1 72 88.899998 NoteOff 0.100 1 72 63.500000 NoteOn 0.001 1 55 88.899998 NoteOff 0.100 1 55 63.500000 NoteOn 0.001 1 67 88.899998 NoteOff 0.200 1 67 63.500000 StickHardness 0.000 1 120 NoteOn 0.001 1 48 88.899998 NoteOff 0.200 1 48 63.500000 NoteOn 0.001 1 67 88.899998 NoteOff 0.100 1 67 63.500000 NoteOn 0.001 1 76 88.899998 NoteOff 0.100 1 76 63.500000 NoteOn 0.001 1 72 88.899998 NoteOff 0.100 1 72 63.500000 NoteOn 0.001 1 55 88.899998 NoteOff 0.100 1 55 63.500000 NoteOn 0.001 1 67 88.899998 NoteOff 0.200 1 67 63.500000 StickHardness 0.000 1 64 NoteOn 0.001 1 93 88.899998 NoteOff 0.100 1 93 63.500000 NoteOn 0.001 1 91 88.899998 NoteOff 0.100 1 91 63.500000 NoteOn 0.001 1 89 88.899998 NoteOff 0.100 1 89 63.500000 NoteOn 0.001 1 88 88.899998 NoteOff 0.100 1 88 63.500000 NoteOn 0.001 1 86 88.899998 NoteOff 0.100 1 86 63.500000 NoteOn 0.001 1 84 88.899998 NoteOff 0.100 1 84 63.500000 NoteOn 0.001 1 83 88.899998 NoteOff 0.100 1 83 63.500000 NoteOn 0.001 1 79 88.899998 NoteOff 0.100 1 79 63.500000 NoteOn 0.001 1 48 88.899998 NoteOff 0.100 1 48 63.500000 NoteOn 0.001 1 72 88.899998 NoteOff 0.100 1 72 63.500000 NoteOn 0.001 1 67 88.899998 NoteOff 0.100 1 67 63.500000 NoteOn 0.001 1 76 88.899998 NoteOff 0.100 1 76 63.500000 NoteOn 0.001 1 72 88.899998 NoteOff 0.100 1 72 63.500000 NoteOn 0.001 1 55 88.899998 NoteOff 0.100 1 55 63.500000 NoteOn 0.001 1 91 88.899998 NoteOff 0.200 1 91 63.500000 NoteOn 0.001 1 84 10.0 NoteOff 0.050 1 84 63.500000 NoteOn 0.001 1 96 20.0 NoteOff 0.040 1 96 63.500000 NoteOn 0.001 1 84 30.0 NoteOff 0.040 1 84 63.500000 NoteOn 0.001 1 96 40.0 NoteOff 0.045 1 96 63.500000 NoteOn 0.001 1 84 50.0 NoteOff 0.050 1 84 63.500000 NoteOn 0.001 1 96 60.0 NoteOff 0.055 1 96 63.500000 NoteOn 0.001 1 84 70.0 NoteOff 0.045 1 84 63.500000 NoteOn 0.001 1 96 80.0 NoteOff 0.040 1 96 63.500000 NoteOn 0.001 1 84 90.0 NoteOff 0.045 1 84 63.500000 NoteOn 0.001 1 96 100.0 NoteOff 0.050 1 96 63.500000 NoteOn 0.001 1 84 110.0 NoteOff 0.055 1 84 63.500000 NoteOn 0.001 1 96 120.0 NoteOff 0.300 1 96 63.500000 StickHardness 0.000 1 64 NoteOn 0.001 1 48 88.899998 NoteOff 2.000 1 48 63.500000 stk-4.5.0/projects/demo/scores/marimtst.ski0000644000076600007660000000333312327014024016560 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 StickHardness 0.000000 1 100 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 StickHardness 0.000000 1 80 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 StickHardness 0.000000 1 60 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 StickHardness 0.000000 1 40 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 StickHardness 0.000000 1 20 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 StickHardness 0.000000 1 10 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 NoteOn 0.050000 1 32 88.899998 stk-4.5.0/projects/demo/scores/misacrio.ski0000644000076600007660000000447212327014024016533 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 67 127.000000 NoteOff 0.142494 1 67 63.500000 NoteOn 0.007528 1 67 127.000000 NoteOff 0.149977 1 67 63.500000 NoteOn 0.149977 1 67 127.000000 NoteOff 0.285034 1 67 63.500000 NoteOn 0.015011 1 69 127.000000 NoteOff 0.142494 1 69 63.500000 NoteOn 0.007528 1 67 127.000000 NoteOff 0.285034 1 67 63.500000 NoteOn 0.015011 1 64 127.000000 NoteOff 1.140000 1 64 63.500000 NoteOn 0.060000 1 64 127.000000 NoteOff 0.074966 1 64 63.500000 NoteOn 0.074966 1 64 127.000000 NoteOff 0.149977 1 64 63.500000 NoteOn 0.149977 1 64 127.000000 NoteOff 0.285034 1 64 63.500000 NoteOn 0.015011 1 62 127.000000 NoteOff 0.074966 1 62 63.500000 NoteOn 0.074966 1 60 127.000000 NoteOff 0.149977 1 60 63.500000 NoteOn 0.149977 1 57 127.000000 NoteOff 1.140000 1 57 63.500000 NoteOn 0.060000 1 79 127.000000 NoteOff 0.142494 1 79 63.500000 NoteOn 0.007528 1 79 127.000000 NoteOff 0.149977 1 79 63.500000 NoteOn 0.149977 1 79 127.000000 NoteOff 0.285034 1 79 63.500000 NoteOn 0.015011 1 81 127.000000 NoteOff 0.142494 1 81 63.500000 NoteOn 0.007528 1 79 127.000000 NoteOff 0.285034 1 79 63.500000 NoteOn 0.015011 1 76 127.000000 NoteOff 1.140000 1 76 63.500000 NoteOn 0.060000 1 76 127.000000 NoteOff 0.074966 1 76 63.500000 NoteOn 0.074966 1 76 127.000000 NoteOff 0.149977 1 76 63.500000 NoteOn 0.149977 1 76 127.000000 NoteOff 0.285034 1 76 63.500000 NoteOn 0.015011 1 74 127.000000 NoteOff 0.074966 1 74 63.500000 NoteOn 0.074966 1 72 127.000000 NoteOff 0.149977 1 72 63.500000 NoteOn 0.149977 1 69 127.000000 NoteOff 0.449977 1 69 63.500000 NoteOn 0.449977 1 79 127.000000 NoteOff 0.149977 1 79 63.500000 NoteOn 0.149977 1 81 127.000000 NoteOff 0.855011 1 81 63.500000 NoteOn 0.045034 1 91 127.000000 NoteOff 0.149977 1 91 63.500000 NoteOn 0.149977 1 93 127.000000 NoteOff 0.950023 1 93 63.500000 NoteOff 0.050023 1 93 63.500000 stk-4.5.0/projects/demo/scores/morazbel.ski0000644000076600007660000000652112327014024016535 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 67 63.500000 NoteOn 0.200000 1 64 101.600002 NoteOn 0.200000 1 64 101.600002 NoteOn 0.200000 1 67 101.600002 NoteOn 0.200000 1 67 76.200003 NoteOn 0.200000 1 64 38.100002 NoteOn 0.300000 1 67 101.600002 NoteOn 0.300000 1 67 127.000000 NoteOn 0.200000 1 64 76.200003 NoteOn 0.200000 1 67 114.299997 NoteOn 0.200000 1 69 127.000000 NoteOn 0.100000 1 67 50.800001 NoteOn 0.100000 1 64 88.899998 NoteOn 0.100000 1 62 63.500000 NoteOn 0.100000 1 64 76.200003 NoteOn 0.600000 1 79 127.000000 NoteOn 0.200000 1 76 127.000000 NoteOn 0.200000 1 76 127.000000 NoteOn 0.200000 1 79 127.000000 NoteOn 0.200000 1 79 127.000000 NoteOn 0.100000 1 81 127.000000 NoteOn 0.200000 1 79 127.000000 NoteOn 0.100000 1 76 127.000000 NoteOn 0.100000 1 74 127.000000 NoteOn 0.100000 1 76 127.000000 NoteOn 0.100000 1 45 127.000000 NoteOn 0.100000 1 48 127.000000 NoteOn 0.100000 1 50 127.000000 NoteOn 0.100000 1 52 127.000000 NoteOn 0.200000 1 50 127.000000 NoteOn 0.100000 1 48 127.000000 NoteOn 0.100000 1 50 127.000000 NoteOn 0.100000 1 45 127.000000 NoteOn 0.100000 1 48 127.000000 NoteOn 0.100000 1 50 127.000000 NoteOn 0.100000 1 52 127.000000 NoteOn 0.200000 1 50 127.000000 NoteOn 0.100000 1 48 127.000000 NoteOn 0.100000 1 50 127.000000 NoteOn 0.100000 1 69 127.000000 NoteOn 0.100000 1 72 127.000000 NoteOn 0.200000 1 82 127.000000 NoteOn 0.200000 1 82 127.000000 NoteOn 0.200000 1 90 100.000000 NoteOn 0.200000 1 90 100.000000 NoteOn 0.200000 1 82 110.000000 NoteOn 0.300000 1 82 110.000000 NoteOn 0.200000 1 82 100.000000 NoteOn 0.100000 1 90 100.000000 NoteOn 0.200000 1 82 100.000000 NoteOn 0.200000 1 82 90.000000 NoteOn 0.200000 1 90 80.000000 NoteOn 0.200000 1 90 80.000000 NoteOn 0.200000 1 82 80.000000 NoteOn 0.300000 1 90 80.000000 NoteOn 0.200000 1 90 80.000000 NoteOn 0.100000 1 90 70.000000 NoteOn 0.200000 1 82 70.000000 NoteOn 0.200000 1 82 70.000000 NoteOn 0.200000 1 90 70.000000 NoteOn 0.200000 1 90 70.000000 NoteOn 0.200000 1 82 60.000000 NoteOn 0.300000 1 90 60.000000 NoteOn 0.200000 1 82 60.000000 NoteOn 0.100000 1 90 60.000000 NoteOn 0.200000 1 82 50.000000 NoteOn 0.200000 1 82 50.000000 NoteOn 0.200000 1 90 50.000000 NoteOn 0.200000 1 90 50.000000 NoteOn 0.200000 1 82 50.000000 NoteOn 0.300000 1 82 40.000000 NoteOn 0.200000 1 82 40.000000 NoteOn 0.100000 1 90 40.000000 NoteOn 0.200000 1 82 40.000000 NoteOn 0.200000 1 82 30.000000 NoteOn 0.200000 1 90 30.000000 NoteOn 0.200000 1 90 30.000000 NoteOn 0.200000 1 82 20.000000 NoteOn 0.300000 1 82 20.000000 NoteOn 0.200000 1 82 20.000000 NoteOn 0.100000 1 90 10.000000 NoteOff 0.800000 1 72 63.500000 stk-4.5.0/projects/demo/scores/muneira.ski0000644000076600007660000173171412327014024016374 0ustar gary/* SKINI File contributed by Esteban Maestre */ ControlChange 0.000000 1 44 15.000000 NoteOn 0 1 62 127.000000 ControlChange 0.004167 1 100 0.000000 ControlChange 0.000000 1 2 0.000000 ControlChange 0.004167 1 100 0.010947 ControlChange 0.000000 1 2 0.186835 ControlChange 0.000000 1 4 0.500983 ControlChange 0.004167 1 100 0.126784 ControlChange 0.000000 1 2 2.134070 ControlChange 0.000000 1 4 5.721459 ControlChange 0.000000 1 101 49.835578 ControlChange 0.004167 1 100 0.397214 ControlChange 0.000000 1 2 6.390860 ControlChange 0.000000 1 4 17.125104 ControlChange 0.000000 1 101 147.162140 ControlChange 0.004167 1 100 0.585219 ControlChange 0.000000 1 2 8.353169 ControlChange 0.000000 1 4 22.350052 ControlChange 0.000000 1 101 191.721487 ControlChange 0.004167 1 100 0.725090 ControlChange 0.000000 1 2 8.566949 ControlChange 0.000000 1 4 22.859055 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 0.901529 ControlChange 0.000000 1 2 8.603882 ControlChange 0.000000 1 4 22.870081 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 1.122107 ControlChange 0.000000 1 2 8.650139 ControlChange 0.000000 1 4 22.883928 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 1.384276 ControlChange 0.000000 1 2 8.705226 ControlChange 0.000000 1 4 22.900452 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 1.685651 ControlChange 0.000000 1 2 8.768695 ControlChange 0.000000 1 4 22.919515 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 2.023992 ControlChange 0.000000 1 2 8.840134 ControlChange 0.000000 1 4 22.940984 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 2.397192 ControlChange 0.000000 1 2 8.919163 ControlChange 0.000000 1 4 22.964733 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 2.803263 ControlChange 0.000000 1 2 9.005430 ControlChange 0.000000 1 4 22.990636 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 3.240327 ControlChange 0.000000 1 2 9.098607 ControlChange 0.000000 1 4 23.018571 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 3.706613 ControlChange 0.000000 1 2 9.198391 ControlChange 0.000000 1 4 23.048424 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 4.200453 ControlChange 0.000000 1 2 9.304500 ControlChange 0.000000 1 4 23.080079 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 4.720249 ControlChange 0.000000 1 2 9.416670 ControlChange 0.000000 1 4 23.113428 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 5.264460 ControlChange 0.000000 1 2 9.534650 ControlChange 0.000000 1 4 23.148362 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 5.831633 ControlChange 0.000000 1 2 9.658204 ControlChange 0.000000 1 4 23.184777 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 6.420364 ControlChange 0.000000 1 2 9.787110 ControlChange 0.000000 1 4 23.222569 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 7.029300 ControlChange 0.000000 1 2 9.921159 ControlChange 0.000000 1 4 23.261638 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 7.657147 ControlChange 0.000000 1 2 10.060153 ControlChange 0.000000 1 4 23.301886 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 8.302641 ControlChange 0.000000 1 2 10.203904 ControlChange 0.000000 1 4 23.343215 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 8.964566 ControlChange 0.000000 1 2 10.352231 ControlChange 0.000000 1 4 23.385531 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 9.641732 ControlChange 0.000000 1 2 10.504962 ControlChange 0.000000 1 4 23.428739 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 10.332983 ControlChange 0.000000 1 2 10.661929 ControlChange 0.000000 1 4 23.472746 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 11.037188 ControlChange 0.000000 1 2 10.822975 ControlChange 0.000000 1 4 23.517461 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 11.753235 ControlChange 0.000000 1 2 10.987947 ControlChange 0.000000 1 4 23.562793 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 12.480038 ControlChange 0.000000 1 2 11.156689 ControlChange 0.000000 1 4 23.608652 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 13.216517 ControlChange 0.000000 1 2 11.329052 ControlChange 0.000000 1 4 23.654950 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 13.961610 ControlChange 0.000000 1 2 11.504891 ControlChange 0.000000 1 4 23.701596 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 14.714258 ControlChange 0.000000 1 2 11.684061 ControlChange 0.000000 1 4 23.748502 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 15.473411 ControlChange 0.000000 1 2 11.866417 ControlChange 0.000000 1 4 23.795580 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 16.238019 ControlChange 0.000000 1 2 12.051811 ControlChange 0.000000 1 4 23.842742 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 17.007031 ControlChange 0.000000 1 2 12.240090 ControlChange 0.000000 1 4 23.889898 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 17.779391 ControlChange 0.000000 1 2 12.431100 ControlChange 0.000000 1 4 23.936961 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 18.554036 ControlChange 0.000000 1 2 12.624679 ControlChange 0.000000 1 4 23.983840 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 19.329889 ControlChange 0.000000 1 2 12.820652 ControlChange 0.000000 1 4 24.030446 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 20.105860 ControlChange 0.000000 1 2 13.018835 ControlChange 0.000000 1 4 24.076690 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 20.880837 ControlChange 0.000000 1 2 13.219019 ControlChange 0.000000 1 4 24.122478 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 21.653686 ControlChange 0.000000 1 2 13.420973 ControlChange 0.000000 1 4 24.167720 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 22.423247 ControlChange 0.000000 1 2 13.624431 ControlChange 0.000000 1 4 24.212321 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 23.188325 ControlChange 0.000000 1 2 13.829082 ControlChange 0.000000 1 4 24.256187 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 23.947683 ControlChange 0.000000 1 2 14.034547 ControlChange 0.000000 1 4 24.299222 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 24.700050 ControlChange 0.000000 1 2 14.240352 ControlChange 0.000000 1 4 24.341327 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 25.444103 ControlChange 0.000000 1 2 14.445886 ControlChange 0.000000 1 4 24.382402 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 26.178459 ControlChange 0.000000 1 2 14.650319 ControlChange 0.000000 1 4 24.422346 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 26.901675 ControlChange 0.000000 1 2 14.852468 ControlChange 0.000000 1 4 24.461054 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 27.612233 ControlChange 0.000000 1 2 15.050510 ControlChange 0.000000 1 4 24.498419 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 28.308537 ControlChange 0.000000 1 2 15.241312 ControlChange 0.000000 1 4 24.534330 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 28.988900 ControlChange 0.000000 1 2 15.418185 ControlChange 0.000000 1 4 24.568675 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 29.651524 ControlChange 0.000000 1 2 15.563514 ControlChange 0.000000 1 4 24.601340 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 30.294492 ControlChange 0.000000 1 2 15.647244 ControlChange 0.000000 1 4 24.632203 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 30.915768 ControlChange 0.000000 1 2 15.664903 ControlChange 0.000000 1 4 24.661141 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 31.513145 ControlChange 0.000000 1 2 15.657180 ControlChange 0.000000 1 4 24.688026 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 32.084264 ControlChange 0.000000 1 2 15.646547 ControlChange 0.000000 1 4 24.712726 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 32.626557 ControlChange 0.000000 1 2 15.635621 ControlChange 0.000000 1 4 24.735 2 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 33.137214 ControlChange 0.000000 1 2 15.624535 ControlChange 0.000000 1 4 24.755013 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 33.613172 ControlChange 0.000000 1 2 15.613340 ControlChange 0.000000 1 4 24.772308 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 34.051080 ControlChange 0.000000 1 2 15.602064 ControlChange 0.000000 1 4 24.786833 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 34.447226 ControlChange 0.000000 1 2 15.590725 ControlChange 0.000000 1 4 24.798423 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 34.797462 ControlChange 0.000000 1 2 15.579336 ControlChange 0.000000 1 4 24.806910 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.097180 ControlChange 0.000000 1 2 15.567906 ControlChange 0.000000 1 4 24.812147 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.341178 ControlChange 0.000000 1 2 15.556441 ControlChange 0.000000 1 4 24.814302 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.523560 ControlChange 0.000000 1 2 15.544949 ControlChange 0.000000 1 4 24.814241 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.638572 ControlChange 0.000000 1 2 15.533433 ControlChange 0.000000 1 4 24.812911 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.689741 ControlChange 0.000000 1 2 15.521899 ControlChange 0.000000 1 4 24.810651 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.702317 ControlChange 0.000000 1 2 15.510351 ControlChange 0.000000 1 4 24.807498 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.704845 ControlChange 0.000000 1 2 15.498797 ControlChange 0.000000 1 4 24.803461 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.707517 ControlChange 0.000000 1 2 15.487245 ControlChange 0.000000 1 4 24.798550 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.711209 ControlChange 0.000000 1 2 15.475719 ControlChange 0.000000 1 4 24.792775 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.715888 ControlChange 0.000000 1 2 15.464315 ControlChange 0.000000 1 4 24.786150 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.721524 ControlChange 0.000000 1 2 15.452741 ControlChange 0.000000 1 4 24.778687 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.728084 ControlChange 0.000000 1 2 15.436330 ControlChange 0.000000 1 4 24.770402 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.735534 ControlChange 0.000000 1 2 15.405107 ControlChange 0.000000 1 4 24.761311 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.743843 ControlChange 0.000000 1 2 15.355479 ControlChange 0.000000 1 4 24.751432 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.752975 ControlChange 0.000000 1 2 15.288434 ControlChange 0.000000 1 4 24.740785 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.762895 ControlChange 0.000000 1 2 15.205363 ControlChange 0.000000 1 4 24.729391 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.773567 ControlChange 0.000000 1 2 15.107580 ControlChange 0.000000 1 4 24.717270 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.784953 ControlChange 0.000000 1 2 14.996312 ControlChange 0.000000 1 4 24.704448 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.797013 ControlChange 0.000000 1 2 14.872722 ControlChange 0.000000 1 4 24.690950 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.809708 ControlChange 0.000000 1 2 14.737903 ControlChange 0.000000 1 4 24.676801 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.822995 ControlChange 0.000000 1 2 14.592884 ControlChange 0.000000 1 4 24.662030 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.836830 ControlChange 0.000000 1 2 14.438639 ControlChange 0.000000 1 4 24.646666 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.851165 ControlChange 0.000000 1 2 14.276085 ControlChange 0.000000 1 4 24.630741 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.865951 ControlChange 0.000000 1 2 14.106091 ControlChange 0.000000 1 4 24.614285 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.881136 ControlChange 0.000000 1 2 13.929477 ControlChange 0.000000 1 4 24.597332 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.896664 ControlChange 0.000000 1 2 13.747023 ControlChange 0.000000 1 4 24.579915 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.912476 ControlChange 0.000000 1 2 13.559465 ControlChange 0.000000 1 4 24.562072 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.928506 ControlChange 0.000000 1 2 13.367499 ControlChange 0.000000 1 4 24.543837 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.944686 ControlChange 0.000000 1 2 13.171789 ControlChange 0.000000 1 4 24.525248 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.960941 ControlChange 0.000000 1 2 12.972963 ControlChange 0.000000 1 4 24.506342 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.977187 ControlChange 0.000000 1 2 12.771618 ControlChange 0.000000 1 4 24.487160 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.993336 ControlChange 0.000000 1 2 12.568320 ControlChange 0.000000 1 4 24.467739 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36.009287 ControlChange 0.000000 1 2 12.363607 ControlChange 0.000000 1 4 24.448120 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36.024929 ControlChange 0.000000 1 2 12.157992 ControlChange 0.000000 1 4 24.428342 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36.040138 ControlChange 0.000000 1 2 11.951962 ControlChange 0.000000 1 4 24.408447 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36.054776 ControlChange 0.000000 1 2 11.745981 ControlChange 0.000000 1 4 24.388475 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36.068683 ControlChange 0.000000 1 2 11.540490 ControlChange 0.000000 1 4 24.368466 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36.081678 ControlChange 0.000000 1 2 11.335910 ControlChange 0.000000 1 4 24.348461 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36.093551 ControlChange 0.000000 1 2 11.132640 ControlChange 0.000000 1 4 24.328499 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36. 4055 ControlChange 0.000000 1 2 10.931064 ControlChange 0.000000 1 4 24.308622 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36.112901 ControlChange 0.000000 1 2 10.731545 ControlChange 0.000000 1 4 24.288868 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36.119740 ControlChange 0.000000 1 2 10.534432 ControlChange 0.000000 1 4 24.269276 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 36.105981 ControlChange 0.000000 1 2 10.340057 ControlChange 0.000000 1 4 24.249884 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.879164 ControlChange 0.000000 1 2 10.148735 ControlChange 0.000000 1 4 24.230730 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 35.008349 ControlChange 0.000000 1 2 9.960766 ControlChange 0.000000 1 4 24.211851 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 33.365383 ControlChange 0.000000 1 2 9.776441 ControlChange 0.000000 1 4 24.193282 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 31.302211 ControlChange 0.000000 1 2 9.596038 ControlChange 0.000000 1 4 24.175058 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 29.537875 ControlChange 0.000000 1 2 9.419817 ControlChange 0.000000 1 4 24.157212 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 28.590526 ControlChange 0.000000 1 2 9.248030 ControlChange 0.000000 1 4 24.139777 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 27.855666 ControlChange 0.000000 1 2 9.080919 ControlChange 0.000000 1 4 24.122785 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 26.998612 ControlChange 0.000000 1 2 8.918715 ControlChange 0.000000 1 4 24.106264 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 26.052099 ControlChange 0.000000 1 2 8.761637 ControlChange 0.000000 1 4 24.090244 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 25.049040 ControlChange 0.000000 1 2 8.609892 ControlChange 0.000000 1 4 24.074752 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 24.005376 ControlChange 0.000000 1 2 8.463686 ControlChange 0.000000 1 4 24.059815 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 22.930530 ControlChange 0.000000 1 2 8.323213 ControlChange 0.000000 1 4 24.045456 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 21.830672 ControlChange 0.000000 1 2 8.188656 ControlChange 0.000000 1 4 24.031700 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 20.710 2 ControlChange 0.000000 1 2 8.060188 ControlChange 0.000000 1 4 24.018568 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 19.571956 ControlChange 0.000000 1 2 7.937981 ControlChange 0.000000 1 4 24.006080 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 18.418616 ControlChange 0.000000 1 2 7.822198 ControlChange 0.000000 1 4 23.994257 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 17.251936 ControlChange 0.000000 1 2 7.712994 ControlChange 0.000000 1 4 23.983115 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 16.073389 ControlChange 0.000000 1 2 7.610516 ControlChange 0.000000 1 4 23.972671 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 14.884147 ControlChange 0.000000 1 2 7.514901 ControlChange 0.000000 1 4 23.962942 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 13.685186 ControlChange 0.000000 1 2 7.426290 ControlChange 0.000000 1 4 23.953940 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 12.477303 ControlChange 0.000000 1 2 7.344815 ControlChange 0.000000 1 4 23.945678 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 11.261149 ControlChange 0.000000 1 2 7.270597 ControlChange 0.000000 1 4 23.938168 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 10.037267 ControlChange 0.000000 1 2 7.203757 ControlChange 0.000000 1 4 23.931420 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 8.806101 ControlChange 0.000000 1 2 7.144409 ControlChange 0.000000 1 4 23.925444 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 7.567998 ControlChange 0.000000 1 2 7.092664 ControlChange 0.000000 1 4 23.920247 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 6.323212 ControlChange 0.000000 1 2 7.048624 ControlChange 0.000000 1 4 23.915837 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 5.071899 ControlChange 0.000000 1 2 7.012391 ControlChange 0.000000 1 4 23.912219 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 3.814090 ControlChange 0.000000 1 2 6.984063 ControlChange 0.000000 1 4 23.909400 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 2.549574 ControlChange 0.000000 1 2 6.963727 ControlChange 0.000000 1 4 23.907382 ControlChange 0.000000 1 101 195.997718 ControlChange 0.004167 1 100 1.280236 ControlChange 0.000000 1 2 6.952784 ControlChange 0.000000 1 4 23.906218 ControlChange 0.000000 1 101 208.892199 ControlChange 0.004167 1 100 0.024737 ControlChange 0.000000 1 2 6.964460 ControlChange 0.000000 1 4 23.906454 ControlChange 0.000000 1 101 343.255777 ControlChange 0.004167 1 100 1.231610 ControlChange 0.000000 1 2 7.022240 ControlChange 0.000000 1 4 23.909626 ControlChange 0.000000 1 101 636.732813 ControlChange 0.004167 1 100 2.588907 ControlChange 0.000000 1 2 7.120397 ControlChange 0.000000 1 4 23.917127 ControlChange 0.000000 1 101 771.096391 ControlChange 0.004167 1 100 4.025051 ControlChange 0.000000 1 2 7.238700 ControlChange 0.000000 1 4 23.929218 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 5.491400 ControlChange 0.000000 1 2 7.366060 ControlChange 0.000000 1 4 23.945642 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 6.972552 ControlChange 0.000000 1 2 7.498430 ControlChange 0.000000 1 4 23.966110 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 8.462577 ControlChange 0.000000 1 2 7.633882 ControlChange 0.000000 1 4 23.990349 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 9.958048 ControlChange 0.000000 1 2 7.771233 ControlChange 0.000000 1 4 24.018097 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 11.456661 ControlChange 0.000000 1 2 7.909633 ControlChange 0.000000 1 4 24.049106 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 12.956673 ControlChange 0.000000 1 2 8.048396 ControlChange 0.000000 1 4 24.083137 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 14.456640 ControlChange 0.000000 1 2 8.186900 ControlChange 0.000000 1 4 24.119956 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 15.955250 ControlChange 0.000000 1 2 8.324511 ControlChange 0.000000 1 4 24.159338 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 17.451212 ControlChange 0.000000 1 2 8.460513 ControlChange 0.000000 1 4 24.201065 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 18.943161 ControlChange 0.000000 1 2 8.594001 ControlChange 0.000000 1 4 24.244918 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 20.429536 ControlChange 0.000000 1 2 8.723696 ControlChange 0.000000 1 4 24.290684 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 21.908425 ControlChange 0.000000 1 2 8.847519 ControlChange 0.000000 1 4 24.338148 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 23.377351 ControlChange 0.000000 1 2 8.961197 ControlChange 0.000000 1 4 24.387094 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 24.832823 ControlChange 0.000000 1 2 9.053854 ControlChange 0.000000 1 4 24.437306 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.269451 ControlChange 0.000000 1 2 9.108017 ControlChange 0.000000 1 4 24.488564 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.677765 ControlChange 0.000000 1 2 9.122809 ControlChange 0.000000 1 4 24.540639 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 29.034254 ControlChange 0.000000 1 2 9.122758 ControlChange 0.000000 1 4 24.593296 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 30.246592 ControlChange 0.000000 1 2 9.120690 ControlChange 0.000000 1 4 24.646291 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 31.056076 ControlChange 0.000000 1 2 9.117943 ControlChange 0.000000 1 4 24.699365 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 31.299642 ControlChange 0.000000 1 2 9.114594 ControlChange 0.000000 1 4 24.752245 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 31.304484 ControlChange 0.000000 1 2 9.110703 ControlChange 0.000000 1 4 24.804636 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 31.277050 ControlChange 0.000000 1 2 9.106326 ControlChange 0.000000 1 4 24.856221 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 31.238388 ControlChange 0.000000 1 2 9.101509 ControlChange 0.000000 1 4 24.906653 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 31.188352 ControlChange 0.000000 1 2 9.096294 ControlChange 0.000000 1 4 24.955548 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 31.126810 ControlChange 0.000000 1 2 9.090715 ControlChange 0.000000 1 4 25.002479 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 31.053650 ControlChange 0.000000 1 2 9.084807 ControlChange 0.000000 1 4 25.046964 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 30.968772 ControlChange 0.000000 1 2 9.078597 ControlChange 0.000000 1 4 25.088450 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 30.872088 ControlChange 0.000000 1 2 9.072112 ControlChange 0.000000 1 4 25.126298 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 30.763530 ControlChange 0.000000 1 2 9.065376 ControlChange 0.000000 1 4 25.159757 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 30.643049 ControlChange 0.000000 1 2 9.058410 ControlChange 0.000000 1 4 25.187932 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 30.510637 ControlChange 0.000000 1 2 9.051234 ControlChange 0.000000 1 4 25.209732 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 30.366314 ControlChange 0.000000 1 2 9.043868 ControlChange 0.000000 1 4 25.223921 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 30.210127 ControlChange 0.000000 1 2 9.036327 ControlChange 0.000000 1 4 25.230147 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 30.042159 ControlChange 0.000000 1 2 9.028628 ControlChange 0.000000 1 4 25.230586 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 29.862542 ControlChange 0.000000 1 2 9.020786 ControlChange 0.000000 1 4 25.228225 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 29.671458 ControlChange 0.000000 1 2 9.012815 ControlChange 0.000000 1 4 25.224290 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 29.469132 ControlChange 0.000000 1 2 9.004730 ControlChange 0.000000 1 4 25.219020 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 29.255845 ControlChange 0.000000 1 2 8.996542 ControlChange 0.000000 1 4 25.212542 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 29.031946 ControlChange 0.000000 1 2 8.988264 ControlChange 0.000000 1 4 25.204970 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 28.797846 ControlChange 0.000000 1 2 8.979908 ControlChange 0.000000 1 4 25.196408 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 28.554018 ControlChange 0.000000 1 2 8.971486 ControlChange 0.000000 1 4 25.186949 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 28.301014 ControlChange 0.000000 1 2 8.963009 ControlChange 0.000000 1 4 25.176679 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 28.039464 ControlChange 0.000000 1 2 8.954488 ControlChange 0.000000 1 4 25.165679 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.770066 ControlChange 0.000000 1 2 8.945934 ControlChange 0.000000 1 4 25.154022 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.493607 ControlChange 0.000000 1 2 8.937359 ControlChange 0.000000 1 4 25.141777 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.210953 ControlChange 0.000000 1 2 8.928772 ControlChange 0.000000 1 4 25.129010 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.923041 ControlChange 0.000000 1 2 8.920186 ControlChange 0.000000 1 4 25.115783 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.630892 ControlChange 0.000000 1 2 8.911610 ControlChange 0.000000 1 4 25. 2154 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.335595 ControlChange 0.000000 1 2 8.903057 ControlChange 0.000000 1 4 25.088181 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.038309 ControlChange 0.000000 1 2 8.894537 ControlChange 0.000000 1 4 25.073918 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 25.740251 ControlChange 0.000000 1 2 8.886063 ControlChange 0.000000 1 4 25.059420 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 25.442688 ControlChange 0.000000 1 2 8.877646 ControlChange 0.000000 1 4 25.044738 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 25.146928 ControlChange 0.000000 1 2 8.869300 ControlChange 0.000000 1 4 25.029926 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 24.854308 ControlChange 0.000000 1 2 8.861037 ControlChange 0.000000 1 4 25.015034 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 24.566182 ControlChange 0.000000 1 2 8.852872 ControlChange 0.000000 1 4 25.000115 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 24.283902 ControlChange 0.000000 1 2 8.844819 ControlChange 0.000000 1 4 24.985222 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 24.008814 ControlChange 0.000000 1 2 8.836894 ControlChange 0.000000 1 4 24.970407 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 23.742233 ControlChange 0.000000 1 2 8.829114 ControlChange 0.000000 1 4 24.955726 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 23.485439 ControlChange 0.000000 1 2 8.821497 ControlChange 0.000000 1 4 24.941236 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 23.239655 ControlChange 0.000000 1 2 8.814064 ControlChange 0.000000 1 4 24.926995 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 23.006047 ControlChange 0.000000 1 2 8.806834 ControlChange 0.000000 1 4 24.913066 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 22.785698 ControlChange 0.000000 1 2 8.799833 ControlChange 0.000000 1 4 24.899514 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 22.579617 ControlChange 0.000000 1 2 8.793087 ControlChange 0.000000 1 4 24.886409 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 22.388723 ControlChange 0.000000 1 2 8.786625 ControlChange 0.000000 1 4 24.873825 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 22.213832 ControlChange 0.000000 1 2 8.780480 ControlChange 0.000000 1 4 24.861844 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 22.055667 ControlChange 0.000000 1 2 8.774689 ControlChange 0.000000 1 4 24.850555 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 21.914857 ControlChange 0.000000 1 2 8.769296 ControlChange 0.000000 1 4 24.840055 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 21.791929 ControlChange 0.000000 1 2 8.764351 ControlChange 0.000000 1 4 24.830452 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 21.687313 ControlChange 0.000000 1 2 8.759912 ControlChange 0.000000 1 4 24.821866 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 21.601358 ControlChange 0.000000 1 2 8.756048 ControlChange 0.000000 1 4 24.814436 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 21.534312 ControlChange 0.000000 1 2 8.752841 ControlChange 0.000000 1 4 24.808317 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 21.486340 ControlChange 0.000000 1 2 8.750394 ControlChange 0.000000 1 4 24.803691 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 21.457498 ControlChange 0.000000 1 2 8.749324 ControlChange 0.000000 1 4 24.800524 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 21.447440 ControlChange 0.000000 1 2 8.755401 ControlChange 0.000000 1 4 24.796302 ControlChange 0.000000 1 101 783.025923 ControlChange 0.004167 1 100 21.455164 ControlChange 0.000000 1 2 8.785170 ControlChange 0.000000 1 4 24.783329 ControlChange 0.000000 1 101 772.970926 ControlChange 0.004167 1 100 21.480008 ControlChange 0.000000 1 2 8.855375 ControlChange 0.000000 1 4 24.754092 ControlChange 0.000000 1 101 751.008792 ControlChange 0.004167 1 100 21.522371 ControlChange 0.000000 1 2 8.972254 ControlChange 0.000000 1 4 24.706510 ControlChange 0.000000 1 101 740.953794 ControlChange 0.004167 1 100 21.583 4 ControlChange 0.000000 1 2 9.136873 ControlChange 0.000000 1 4 24.641193 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 21.663140 ControlChange 0.000000 1 2 9.349576 ControlChange 0.000000 1 4 24.559126 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 21.763409 ControlChange 0.000000 1 2 9.610320 ControlChange 0.000000 1 4 24.461436 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 21.884839 ControlChange 0.000000 1 2 9.918720 ControlChange 0.000000 1 4 24.349407 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 22.028319 ControlChange 0.000000 1 2 10.273941 ControlChange 0.000000 1 4 24.224477 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 22.194656 ControlChange 0.000000 1 2 10.674581 ControlChange 0.000000 1 4 24.088230 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 22.384527 ControlChange 0.000000 1 2 11.118598 ControlChange 0.000000 1 4 23.942388 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 22.598403 ControlChange 0.000000 1 2 11.603150 ControlChange 0.000000 1 4 23.788810 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 22.836488 ControlChange 0.000000 1 2 12.124517 ControlChange 0.000000 1 4 23.629484 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 23.098593 ControlChange 0.000000 1 2 12.678005 ControlChange 0.000000 1 4 23.466500 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 23.384013 ControlChange 0.000000 1 2 13.257831 ControlChange 0.000000 1 4 23.302044 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 23.691428 ControlChange 0.000000 1 2 13.857096 ControlChange 0.000000 1 4 23.138368 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.018762 ControlChange 0.000000 1 2 14.467760 ControlChange 0.000000 1 4 22.977772 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.363084 ControlChange 0.000000 1 2 15.080677 ControlChange 0.000000 1 4 22.822576 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.720573 ControlChange 0.000000 1 2 15.685713 ControlChange 0.000000 1 4 22.675088 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.086550 ControlChange 0.000000 1 2 16.271923 ControlChange 0.000000 1 4 22.537586 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.455600 ControlChange 0.000000 1 2 16.827809 ControlChange 0.000000 1 4 22.412295 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.821814 ControlChange 0.000000 1 2 17.341671 ControlChange 0.000000 1 4 22.301346 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 26.179099 ControlChange 0.000000 1 2 17.801965 ControlChange 0.000000 1 4 22.206763 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 26.521546 ControlChange 0.000000 1 2 18.197668 ControlChange 0.000000 1 4 22.130450 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 26.843761 ControlChange 0.000000 1 2 18.518650 ControlChange 0.000000 1 4 22.074164 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 27.141152 ControlChange 0.000000 1 2 18.755954 ControlChange 0.000000 1 4 22.039063 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 27.410105 ControlChange 0.000000 1 2 18.902692 ControlChange 0.000000 1 4 22.021562 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 27.648032 ControlChange 0.000000 1 2 18.960202 ControlChange 0.000000 1 4 22.008365 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 27.853333 ControlChange 0.000000 1 2 18.946672 ControlChange 0.000000 1 4 21.985994 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 28.025275 ControlChange 0.000000 1 2 18.886103 ControlChange 0.000000 1 4 21.950467 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 28.163870 ControlChange 0.000000 1 2 18.791891 ControlChange 0.000000 1 4 21.902478 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 28.269713 ControlChange 0.000000 1 2 18.670314 ControlChange 0.000000 1 4 21.843312 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 28.343794 ControlChange 0.000000 1 2 18.525710 ControlChange 0.000000 1 4 21.774401 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 28.376422 ControlChange 0.000000 1 2 18.361496 ControlChange 0.000000 1 4 21.697328 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 28.249651 ControlChange 0.000000 1 2 18.180408 ControlChange 0.000000 1 4 21.613823 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 27.667075 ControlChange 0.000000 1 2 17.984737 ControlChange 0.000000 1 4 21.525756 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 26.455909 ControlChange 0.000000 1 2 17.776462 ControlChange 0.000000 1 4 21.435134 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.702805 ControlChange 0.000000 1 2 17.557370 ControlChange 0.000000 1 4 21.344087 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 22.542983 ControlChange 0.000000 1 2 17.329155 ControlChange 0.000000 1 4 21.254855 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 20.067083 ControlChange 0.000000 1 2 17.093550 ControlChange 0.000000 1 4 21.169765 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 17.334171 ControlChange 0.000000 1 2 16.852511 ControlChange 0.000000 1 4 21.091212 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 14.384932 ControlChange 0.000000 1 2 16.608519 ControlChange 0.000000 1 4 21.021639 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 11.249162 ControlChange 0.000000 1 2 16.365350 ControlChange 0.000000 1 4 20.963500 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 7.952929 ControlChange 0.000000 1 2 16.130851 ControlChange 0.000000 1 4 20.919239 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 4.569433 ControlChange 0.000000 1 2 15.927734 ControlChange 0.000000 1 4 20.891180 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 1.433323 ControlChange 0.000000 1 2 15.800362 ControlChange 0.000000 1 4 20.880737 ControlChange 0.000000 1 101 736.641081 ControlChange 0.004167 1 100 0.976996 ControlChange 0.000000 1 2 15.762379 ControlChange 0.000000 1 4 20.887157 ControlChange 0.000000 1 101 701.756574 ControlChange 0.004167 1 100 2.850626 ControlChange 0.000000 1 2 15.758365 ControlChange 0.000000 1 4 20.908613 ControlChange 0.000000 1 101 625.561807 ControlChange 0.004167 1 100 4.645521 ControlChange 0.000000 1 2 15.756966 ControlChange 0.000000 1 4 20.944146 ControlChange 0.000000 1 101 590.677300 ControlChange 0.004167 1 100 6.500240 ControlChange 0.000000 1 2 15.755065 ControlChange 0.000000 1 4 20.993287 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 8.397928 ControlChange 0.000000 1 2 15.752692 ControlChange 0.000000 1 4 21.055534 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 10.321083 ControlChange 0.000000 1 2 15.749877 ControlChange 0.000000 1 4 21.130298 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 12.259384 ControlChange 0.000000 1 2 15.746645 ControlChange 0.000000 1 4 21.216888 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 14.205754 ControlChange 0.000000 1 2 15.743020 ControlChange 0.000000 1 4 21.314514 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 16.154787 ControlChange 0.000000 1 2 15.739023 ControlChange 0.000000 1 4 21.422286 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 18.101945 ControlChange 0.000000 1 2 15.734675 ControlChange 0.000000 1 4 21.539208 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 20.043065 ControlChange 0.000000 1 2 15.729995 ControlChange 0.000000 1 4 21.664197 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 21.974013 ControlChange 0.000000 1 2 15.725000 ControlChange 0.000000 1 4 21.796078 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.890394 ControlChange 0.000000 1 2 15.719707 ControlChange 0.000000 1 4 21.933604 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.787204 ControlChange 0.000000 1 2 15.714131 ControlChange 0.000000 1 4 22.075456 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.658364 ControlChange 0.000000 1 2 15.708288 ControlChange 0.000000 1 4 22.220264 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.496013 ControlChange 0.000000 1 2 15.702192 ControlChange 0.000000 1 4 22.366620 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 31.289283 ControlChange 0.000000 1 2 15.695858 ControlChange 0.000000 1 4 22.513094 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.021968 ControlChange 0.000000 1 2 15.689299 ControlChange 0.000000 1 4 22.658254 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.666857 ControlChange 0.000000 1 2 15.682530 ControlChange 0.000000 1 4 22.800678 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.167510 ControlChange 0.000000 1 2 15.675564 ControlChange 0.000000 1 4 22.938977 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.382678 ControlChange 0.000000 1 2 15.668417 ControlChange 0.000000 1 4 23.071801 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.103140 ControlChange 0.000000 1 2 15.661103 ControlChange 0.000000 1 4 23.197871 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.367583 ControlChange 0.000000 1 2 15.653641 ControlChange 0.000000 1 4 23.315975 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.534938 ControlChange 0.000000 1 2 15.646048 ControlChange 0.000000 1 4 23.424983 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.778169 ControlChange 0.000000 1 2 15.638346 ControlChange 0.000000 1 4 23.523863 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.105387 ControlChange 0.000000 1 2 15.630562 ControlChange 0.000000 1 4 23.611678 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.504172 ControlChange 0.000000 1 2 15.622727 ControlChange 0.000000 1 4 23.687587 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.959538 ControlChange 0.000000 1 2 15.614883 ControlChange 0.000000 1 4 23.750852 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.454762 ControlChange 0.000000 1 2 15.607089 ControlChange 0.000000 1 4 23.800840 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.972434 ControlChange 0.000000 1 2 15.599432 ControlChange 0.000000 1 4 23.837012 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.495597 ControlChange 0.000000 1 2 15.592059 ControlChange 0.000000 1 4 23.859087 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.008693 ControlChange 0.000000 1 2 15.585266 ControlChange 0.000000 1 4 23.868435 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.498229 ControlChange 0.000000 1 2 15.584456 ControlChange 0.000000 1 4 23.869775 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.953145 ControlChange 0.000000 1 2 15.634542 ControlChange 0.000000 1 4 23.867969 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 43.364899 ControlChange 0.000000 1 2 15.788735 ControlChange 0.000000 1 4 23.864697 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 43.727262 ControlChange 0.000000 1 2 15.965983 ControlChange 0.000000 1 4 23.860094 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.036089 ControlChange 0.000000 1 2 16.071413 ControlChange 0.000000 1 4 23.854151 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.288962 ControlChange 0.000000 1 2 16.059843 ControlChange 0.000000 1 4 23.846863 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.484829 ControlChange 0.000000 1 2 15.952892 ControlChange 0.000000 1 4 23.838227 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.623672 ControlChange 0.000000 1 2 15.768096 ControlChange 0.000000 1 4 23.828250 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.705124 ControlChange 0.000000 1 2 15.509626 ControlChange 0.000000 1 4 23.816942 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.718089 ControlChange 0.000000 1 2 15.185795 ControlChange 0.000000 1 4 23.804317 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.629433 ControlChange 0.000000 1 2 14.810611 ControlChange 0.000000 1 4 23.790400 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.409639 ControlChange 0.000000 1 2 14.401326 ControlChange 0.000000 1 4 23.775221 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.054851 ControlChange 0.000000 1 2 13.975207 ControlChange 0.000000 1 4 23.758819 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 43.572625 ControlChange 0.000000 1 2 13.546939 ControlChange 0.000000 1 4 23.741243 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.971341 ControlChange 0.000000 1 2 13.127432 ControlChange 0.000000 1 4 23.722547 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.259041 ControlChange 0.000000 1 2 12.723872 ControlChange 0.000000 1 4 23.702798 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.443805 ControlChange 0.000000 1 2 12.340428 ControlChange 0.000000 1 4 23.682071 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.533923 ControlChange 0.000000 1 2 11.979093 ControlChange 0.000000 1 4 23.660449 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.538604 ControlChange 0.000000 1 2 11.640451 ControlChange 0.000000 1 4 23.638025 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.468914 ControlChange 0.000000 1 2 11.324201 ControlChange 0.000000 1 4 23.614901 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.339809 ControlChange 0.000000 1 2 11.029547 ControlChange 0.000000 1 4 23.591184 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.174984 ControlChange 0.000000 1 2 10.755449 ControlChange 0.000000 1 4 23.566990 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.023640 ControlChange 0.000000 1 2 10.500737 ControlChange 0.000000 1 4 23.542439 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.012783 ControlChange 0.000000 1 2 10.264230 ControlChange 0.000000 1 4 23.517655 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.315187 ControlChange 0.000000 1 2 10.044778 ControlChange 0.000000 1 4 23.492767 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 32.839582 ControlChange 0.000000 1 2 9.841285 ControlChange 0.000000 1 4 23.467903 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 32.241094 ControlChange 0.000000 1 2 9.652731 ControlChange 0.000000 1 4 23.443189 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 31.428114 ControlChange 0.000000 1 2 9.478161 ControlChange 0.000000 1 4 23.418753 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 30.457923 ControlChange 0.000000 1 2 9.316695 ControlChange 0.000000 1 4 23.394715 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.373640 ControlChange 0.000000 1 2 9.167526 ControlChange 0.000000 1 4 23.371194 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.201444 ControlChange 0.000000 1 2 9.029918 ControlChange 0.000000 1 4 23.348299 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.958770 ControlChange 0.000000 1 2 8.903201 ControlChange 0.000000 1 4 23.326135 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.658002 ControlChange 0.000000 1 2 8.786745 ControlChange 0.000000 1 4 23.304798 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.308318 ControlChange 0.000000 1 2 8.679968 ControlChange 0.000000 1 4 23.284374 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 22.916797 ControlChange 0.000000 1 2 8.582359 ControlChange 0.000000 1 4 23.264942 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 21.489085 ControlChange 0.000000 1 2 8.493425 ControlChange 0.000000 1 4 23.246571 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 20.029789 ControlChange 0.000000 1 2 8.412716 ControlChange 0.000000 1 4 23.229321 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 18.542756 ControlChange 0.000000 1 2 8.339820 ControlChange 0.000000 1 4 23.213243 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 17.031286 ControlChange 0.000000 1 2 8.274364 ControlChange 0.000000 1 4 23.198379 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 15.498300 ControlChange 0.000000 1 2 8.215998 ControlChange 0.000000 1 4 23.184765 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 13.946485 ControlChange 0.000000 1 2 8.164382 ControlChange 0.000000 1 4 23.172426 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 12.378419 ControlChange 0.000000 1 2 8.119213 ControlChange 0.000000 1 4 23.161382 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 10.796712 ControlChange 0.000000 1 2 8.080220 ControlChange 0.000000 1 4 23.151646 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 9.204209 ControlChange 0.000000 1 2 8.047133 ControlChange 0.000000 1 4 23.143225 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 7.604342 ControlChange 0.000000 1 2 8.019707 ControlChange 0.000000 1 4 23.136121 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 6.001811 ControlChange 0.000000 1 2 7.997717 ControlChange 0.000000 1 4 23.130331 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 4.404320 ControlChange 0.000000 1 2 7.980934 ControlChange 0.000000 1 4 23.125849 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 2.831225 ControlChange 0.000000 1 2 7.969153 ControlChange 0.000000 1 4 23.122664 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 1.304489 ControlChange 0.000000 1 2 7.968265 ControlChange 0.000000 1 4 23.120964 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 0.520677 ControlChange 0.000000 1 2 8.046549 ControlChange 0.000000 1 4 23.123017 ControlChange 0.000000 1 101 585.280293 ControlChange 0.004167 1 100 3.358511 ControlChange 0.000000 1 2 8.395446 ControlChange 0.000000 1 4 23.135449 ControlChange 0.000000 1 101 563.926693 ControlChange 0.004167 1 100 6.923678 ControlChange 0.000000 1 2 9.185642 ControlChange 0.000000 1 4 23.164834 ControlChange 0.000000 1 101 517.286144 ControlChange 0.004167 1 100 10.686814 ControlChange 0.000000 1 2 10.443250 ControlChange 0.000000 1 4 23.213250 ControlChange 0.000000 1 101 495.932544 ControlChange 0.004167 1 100 14.453776 ControlChange 0.000000 1 2 12.116992 ControlChange 0.000000 1 4 23.280394 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 18.169896 ControlChange 0.000000 1 2 14.027818 ControlChange 0.000000 1 4 23.365349 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 21.802024 ControlChange 0.000000 1 2 15.574625 ControlChange 0.000000 1 4 23.466734 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.316054 ControlChange 0.000000 1 2 16.202166 ControlChange 0.000000 1 4 23.582642 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.667691 ControlChange 0.000000 1 2 16.474155 ControlChange 0.000000 1 4 23.710589 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.789098 ControlChange 0.000000 1 2 16.770895 ControlChange 0.000000 1 4 23.847521 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.553615 ControlChange 0.000000 1 2 17.100360 ControlChange 0.000000 1 4 23.989842 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.712349 ControlChange 0.000000 1 2 17.434623 ControlChange 0.000000 1 4 24.133515 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.139255 ControlChange 0.000000 1 2 17.725240 ControlChange 0.000000 1 4 24.274208 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 39.273899 ControlChange 0.000000 1 2 17.849863 ControlChange 0.000000 1 4 24.407484 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 40.441916 ControlChange 0.000000 1 2 17.656278 ControlChange 0.000000 1 4 24.529001 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 41.471757 ControlChange 0.000000 1 2 17.168598 ControlChange 0.000000 1 4 24.634719 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.209332 ControlChange 0.000000 1 2 16.559619 ControlChange 0.000000 1 4 24.721090 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.636698 ControlChange 0.000000 1 2 15.972165 ControlChange 0.000000 1 4 24.785157 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.751099 ControlChange 0.000000 1 2 15.457883 ControlChange 0.000000 1 4 24.824777 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.521542 ControlChange 0.000000 1 2 15.018573 ControlChange 0.000000 1 4 24.840031 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 41.947702 ControlChange 0.000000 1 2 14.643517 ControlChange 0.000000 1 4 24.834743 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 41.082375 ControlChange 0.000000 1 2 14.321749 ControlChange 0.000000 1 4 24.813037 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 39.988898 ControlChange 0.000000 1 2 14.044358 ControlChange 0.000000 1 4 24.775868 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.750180 ControlChange 0.000000 1 2 13.804356 ControlChange 0.000000 1 4 24.722757 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 37.470141 ControlChange 0.000000 1 2 13.596277 ControlChange 0.000000 1 4 24.653276 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.013979 ControlChange 0.000000 1 2 13.415829 ControlChange 0.000000 1 4 24.567292 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.008992 ControlChange 0.000000 1 2 13.259567 ControlChange 0.000000 1 4 24.465132 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.536587 ControlChange 0.000000 1 2 13.124713 ControlChange 0.000000 1 4 24.347825 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.802175 ControlChange 0.000000 1 2 13.008931 ControlChange 0.000000 1 4 24.217306 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.901286 ControlChange 0.000000 1 2 12.9 297 ControlChange 0.000000 1 4 24.076663 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 22.880395 ControlChange 0.000000 1 2 12.827211 ControlChange 0.000000 1 4 23.930287 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 19.766963 ControlChange 0.000000 1 2 12.758269 ControlChange 0.000000 1 4 23.783846 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 16.579109 ControlChange 0.000000 1 2 12.702265 ControlChange 0.000000 1 4 23.643997 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 13.329737 ControlChange 0.000000 1 2 12.658185 ControlChange 0.000000 1 4 23.517833 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 10.028891 ControlChange 0.000000 1 2 12.625137 ControlChange 0.000000 1 4 23.412129 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 6.687845 ControlChange 0.000000 1 2 12.602294 ControlChange 0.000000 1 4 23.332578 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 3.380039 ControlChange 0.000000 1 2 12.588856 ControlChange 0.000000 1 4 23.282924 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 0.564447 ControlChange 0.000000 1 2 12.583107 ControlChange 0.000000 1 4 23.261376 ControlChange 0.000000 1 101 494.527327 ControlChange 0.004167 1 100 1.302264 ControlChange 0.000000 1 2 12.581306 ControlChange 0.000000 1 4 23.256821 ControlChange 0.000000 1 101 501.238233 ControlChange 0.004167 1 100 2.962950 ControlChange 0.000000 1 2 12.579926 ControlChange 0.000000 1 4 23.257382 ControlChange 0.000000 1 101 515.896199 ControlChange 0.004167 1 100 4.767153 ControlChange 0.000000 1 2 12.577736 ControlChange 0.000000 1 4 23.258895 ControlChange 0.000000 1 101 522.607105 ControlChange 0.004167 1 100 6.648405 ControlChange 0.000000 1 2 12.574570 ControlChange 0.000000 1 4 23.260970 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 8.566848 ControlChange 0.000000 1 2 12.570361 ControlChange 0.000000 1 4 23.263580 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 10.505533 ControlChange 0.000000 1 2 12.565044 ControlChange 0.000000 1 4 23.266700 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 12.454407 ControlChange 0.000000 1 2 12.558563 ControlChange 0.000000 1 4 23.270307 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 14.406517 ControlChange 0.000000 1 2 12.550869 ControlChange 0.000000 1 4 23.274376 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 16.356484 ControlChange 0.000000 1 2 12.541938 ControlChange 0.000000 1 4 23.278886 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 18.299736 ControlChange 0.000000 1 2 12.531781 ControlChange 0.000000 1 4 23.283815 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 20.232038 ControlChange 0.000000 1 2 12.520464 ControlChange 0.000000 1 4 23.289142 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 22.149166 ControlChange 0.000000 1 2 12.508132 ControlChange 0.000000 1 4 23.294846 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 24.046654 ControlChange 0.000000 1 2 12.495028 ControlChange 0.000000 1 4 23.300907 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 25.919489 ControlChange 0.000000 1 2 12.481508 ControlChange 0.000000 1 4 23.307304 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 27.761738 ControlChange 0.000000 1 2 12.468036 ControlChange 0.000000 1 4 23.314019 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 29.566029 ControlChange 0.000000 1 2 12.455150 ControlChange 0.000000 1 4 23.321032 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 31.322745 ControlChange 0.000000 1 2 12.443404 ControlChange 0.000000 1 4 23.328323 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 33.018616 ControlChange 0.000000 1 2 12.433294 ControlChange 0.000000 1 4 23.335875 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 34.634061 ControlChange 0.000000 1 2 12.425203 ControlChange 0.000000 1 4 23.343667 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 36.137406 ControlChange 0.000000 1 2 12.419366 ControlChange 0.000000 1 4 23.351681 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.468142 ControlChange 0.000000 1 2 12.415370 ControlChange 0.000000 1 4 23.359898 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 38.509043 ControlChange 0.000000 1 2 12.407744 ControlChange 0.000000 1 4 23.368299 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.224575 ControlChange 0.000000 1 2 12.383045 ControlChange 0.000000 1 4 23.376863 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.889824 ControlChange 0.000000 1 2 12.333948 ControlChange 0.000000 1 4 23.385572 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 40.711726 ControlChange 0.000000 1 2 12.264803 ControlChange 0.000000 1 4 23.394404 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 41.624797 ControlChange 0.000000 1 2 12.181769 ControlChange 0.000000 1 4 23.403339 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 42.538060 ControlChange 0.000000 1 2 12.088806 ControlChange 0.000000 1 4 23.412356 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 43.410921 ControlChange 0.000000 1 2 11.988486 ControlChange 0.000000 1 4 23.421432 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 44.219068 ControlChange 0.000000 1 2 11.882655 ControlChange 0.000000 1 4 23.430545 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 44.941590 ControlChange 0.000000 1 2 11.772744 ControlChange 0.000000 1 4 23.439670 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 45.556654 ControlChange 0.000000 1 2 11.659959 ControlChange 0.000000 1 4 23.448782 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 46.038376 ControlChange 0.000000 1 2 11.545416 ControlChange 0.000000 1 4 23.457854 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 46.355558 ControlChange 0.000000 1 2 11.430241 ControlChange 0.000000 1 4 23.466858 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 46.489490 ControlChange 0.000000 1 2 11.315711 ControlChange 0.000000 1 4 23.475763 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 46.468596 ControlChange 0.000000 1 2 11.203467 ControlChange 0.000000 1 4 23.484538 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 46.345548 ControlChange 0.000000 1 2 11.095961 ControlChange 0.000000 1 4 23.493147 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 46.147205 ControlChange 0.000000 1 2 10.997779 ControlChange 0.000000 1 4 23.501553 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 45.883247 ControlChange 0.000000 1 2 10.918353 ControlChange 0.000000 1 4 23.509714 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 45.560515 ControlChange 0.000000 1 2 10.862207 ControlChange 0.000000 1 4 23.517583 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 45.184832 ControlChange 0.000000 1 2 10.800443 ControlChange 0.000000 1 4 23.525112 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 44.761328 ControlChange 0.000000 1 2 10.689124 ControlChange 0.000000 1 4 23.532243 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 44.294625 ControlChange 0.000000 1 2 10.518790 ControlChange 0.000000 1 4 23.538914 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 43.788898 ControlChange 0.000000 1 2 10.301361 ControlChange 0.000000 1 4 23.545053 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 43.248062 ControlChange 0.000000 1 2 10.051155 ControlChange 0.000000 1 4 23.550577 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 42.675877 ControlChange 0.000000 1 2 9.781161 ControlChange 0.000000 1 4 23.555393 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 42.076163 ControlChange 0.000000 1 2 9.502032 ControlChange 0.000000 1 4 23.559389 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 41.452954 ControlChange 0.000000 1 2 9.221842 ControlChange 0.000000 1 4 23.562435 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 40.810831 ControlChange 0.000000 1 2 8.946342 ControlChange 0.000000 1 4 23.564462 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 40.155430 ControlChange 0.000000 1 2 8.679401 ControlChange 0.000000 1 4 23.566274 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.494510 ControlChange 0.000000 1 2 8.423482 ControlChange 0.000000 1 4 23.570585 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 38.840405 ControlChange 0.000000 1 2 8.180034 ControlChange 0.000000 1 4 23.580219 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 38.218396 ControlChange 0.000000 1 2 7.949805 ControlChange 0.000000 1 4 23.596198 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.683183 ControlChange 0.000000 1 2 7.733061 ControlChange 0.000000 1 4 23.618640 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.229722 ControlChange 0.000000 1 2 7.529758 ControlChange 0.000000 1 4 23.647556 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 36.63 45 ControlChange 0.000000 1 2 7.339654 ControlChange 0.000000 1 4 23.682899 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 35.701809 ControlChange 0.000000 1 2 7.162376 ControlChange 0.000000 1 4 23.724575 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 34.512998 ControlChange 0.000000 1 2 6.997493 ControlChange 0.000000 1 4 23.772431 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 33.171877 ControlChange 0.000000 1 2 6.844525 ControlChange 0.000000 1 4 23.826239 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 31.730678 ControlChange 0.000000 1 2 6.702968 ControlChange 0.000000 1 4 23.885688 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 30.216301 ControlChange 0.000000 1 2 6.572339 ControlChange 0.000000 1 4 23.950371 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 28.645165 ControlChange 0.000000 1 2 6.452156 ControlChange 0.000000 1 4 24.019780 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 27.028152 ControlChange 0.000000 1 2 6.341945 ControlChange 0.000000 1 4 24.093295 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 25.372920 ControlChange 0.000000 1 2 6.241264 ControlChange 0.000000 1 4 24.170172 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 23.685110 ControlChange 0.000000 1 2 6.149685 ControlChange 0.000000 1 4 24.249549 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 21.969067 ControlChange 0.000000 1 2 6.066803 ControlChange 0.000000 1 4 24.330444 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 20.228168 ControlChange 0.000000 1 2 5.992244 ControlChange 0.000000 1 4 24.411765 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 18.465118 ControlChange 0.000000 1 2 5.925646 ControlChange 0.000000 1 4 24.492319 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 16.682 4 ControlChange 0.000000 1 2 5.866677 ControlChange 0.000000 1 4 24.570838 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 14.880924 ControlChange 0.000000 1 2 5.815010 ControlChange 0.000000 1 4 24.646007 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 13.063097 ControlChange 0.000000 1 2 5.770343 ControlChange 0.000000 1 4 24.716491 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 11.229893 ControlChange 0.000000 1 2 5.732399 ControlChange 0.000000 1 4 24.780973 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 9.382396 ControlChange 0.000000 1 2 5.700919 ControlChange 0.000000 1 4 24.838193 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 7.521605 ControlChange 0.000000 1 2 5.675648 ControlChange 0.000000 1 4 24.886977 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 5.648527 ControlChange 0.000000 1 2 5.656348 ControlChange 0.000000 1 4 24.926264 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 3.765125 ControlChange 0.000000 1 2 5.642792 ControlChange 0.000000 1 4 24.955142 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 1.857760 ControlChange 0.000000 1 2 5.652229 ControlChange 0.000000 1 4 24.972699 ControlChange 0.000000 1 101 526.233650 ControlChange 0.004167 1 100 0.286483 ControlChange 0.000000 1 2 5.889653 ControlChange 0.000000 1 4 24.976625 ControlChange 0.000000 1 101 557.312212 ControlChange 0.004167 1 100 3.158793 ControlChange 0.000000 1 2 6.958538 ControlChange 0.000000 1 4 24.961728 ControlChange 0.000000 1 101 625.194033 ControlChange 0.004167 1 100 6.838147 ControlChange 0.000000 1 2 9.124413 ControlChange 0.000000 1 4 24.923607 ControlChange 0.000000 1 101 656.272595 ControlChange 0.004167 1 100 10.907556 ControlChange 0.000000 1 2 11.187308 ControlChange 0.000000 1 4 24.861815 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 15.078345 ControlChange 0.000000 1 2 11.935190 ControlChange 0.000000 1 4 24.777819 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 19.244797 ControlChange 0.000000 1 2 12.074848 ControlChange 0.000000 1 4 24.673526 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 23.344353 ControlChange 0.000000 1 2 12.191234 ControlChange 0.000000 1 4 24.551103 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 27.315613 ControlChange 0.000000 1 2 12.339288 ControlChange 0.000000 1 4 24.413007 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 31.075964 ControlChange 0.000000 1 2 12.511902 ControlChange 0.000000 1 4 24.262009 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 34.475190 ControlChange 0.000000 1 2 12.702843 ControlChange 0.000000 1 4 24.101201 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 37.194373 ControlChange 0.000000 1 2 12.906330 ControlChange 0.000000 1 4 23.933998 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 38.947954 ControlChange 0.000000 1 2 13.116648 ControlChange 0.000000 1 4 23.764156 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 40.051268 ControlChange 0.000000 1 2 13.327714 ControlChange 0.000000 1 4 23.595765 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 40.954683 ControlChange 0.000000 1 2 13.532506 ControlChange 0.000000 1 4 23.433246 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 41.724132 ControlChange 0.000000 1 2 13.722166 ControlChange 0.000000 1 4 23.281333 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 42.319767 ControlChange 0.000000 1 2 13.884360 ControlChange 0.000000 1 4 23.145054 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 42.738180 ControlChange 0.000000 1 2 14.00 41 ControlChange 0.000000 1 4 23.029691 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 42.984952 ControlChange 0.000000 1 2 14.055212 ControlChange 0.000000 1 4 22.940737 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 43.063294 ControlChange 0.000000 1 2 14.050060 ControlChange 0.000000 1 4 22.883359 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 42.969797 ControlChange 0.000000 1 2 14.001506 ControlChange 0.000000 1 4 22.857478 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 42.702582 ControlChange 0.000000 1 2 13.915407 ControlChange 0.000000 1 4 22.851199 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 42.267554 ControlChange 0.000000 1 2 13.796930 ControlChange 0.000000 1 4 22.850234 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 41.675224 ControlChange 0.000000 1 2 13.659528 ControlChange 0.000000 1 4 22.849395 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 40.939282 ControlChange 0.000000 1 2 13.519568 ControlChange 0.000000 1 4 22.848224 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 40.078693 ControlChange 0.000000 1 2 13.388751 ControlChange 0.000000 1 4 22.846726 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 39.123767 ControlChange 0.000000 1 2 13.272128 ControlChange 0.000000 1 4 22.844907 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 38.135121 ControlChange 0.000000 1 2 13.170368 ControlChange 0.000000 1 4 22.842781 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 37.245053 ControlChange 0.000000 1 2 13.082267 ControlChange 0.000000 1 4 22.840365 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 36.535746 ControlChange 0.000000 1 2 13.006139 ControlChange 0.000000 1 4 22.837681 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 35.711657 ControlChange 0.000000 1 2 12.940358 ControlChange 0.000000 1 4 22.834755 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 34.398480 ControlChange 0.000000 1 2 12.883514 ControlChange 0.000000 1 4 22.831623 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 32.622888 ControlChange 0.000000 1 2 12.834418 ControlChange 0.000000 1 4 22.828325 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 30.536430 ControlChange 0.000000 1 2 12.792096 ControlChange 0.000000 1 4 22.824908 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 28.230504 ControlChange 0.000000 1 2 12.755733 ControlChange 0.000000 1 4 22.821428 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 25.757984 ControlChange 0.000000 1 2 12.724659 ControlChange 0.000000 1 4 22.817945 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 23.153355 ControlChange 0.000000 1 2 12.698304 ControlChange 0.000000 1 4 22.814526 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 20.440857 ControlChange 0.000000 1 2 12.676191 ControlChange 0.000000 1 4 22.811243 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 17.638589 ControlChange 0.000000 1 2 12.657914 ControlChange 0.000000 1 4 22.808172 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 14.76 47 ControlChange 0.000000 1 2 12.643127 ControlChange 0.000000 1 4 22.805388 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 11.820945 ControlChange 0.000000 1 2 12.631531 ControlChange 0.000000 1 4 22.802966 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 8.831570 ControlChange 0.000000 1 2 12.622867 ControlChange 0.000000 1 4 22.800978 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 5.816354 ControlChange 0.000000 1 2 12.616899 ControlChange 0.000000 1 4 22.799493 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 2.823349 ControlChange 0.000000 1 2 12.612576 ControlChange 0.000000 1 4 22.798654 ControlChange 0.000000 1 101 657.677811 ControlChange 0.004167 1 100 0.317701 ControlChange 0.000000 1 2 12.600235 ControlChange 0.000000 1 4 22.799484 ControlChange 0.000000 1 101 641.241943 ControlChange 0.004167 1 100 4.123185 ControlChange 0.000000 1 2 12.554051 ControlChange 0.000000 1 4 22.804839 ControlChange 0.000000 1 101 605.342706 ControlChange 0.004167 1 100 8.540079 ControlChange 0.000000 1 2 12.454707 ControlChange 0.000000 1 4 22.817548 ControlChange 0.000000 1 101 588.906838 ControlChange 0.004167 1 100 13.172226 ControlChange 0.000000 1 2 12.308548 ControlChange 0.000000 1 4 22.838551 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 17.808472 ControlChange 0.000000 1 2 12.135902 ControlChange 0.000000 1 4 22.867843 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 22.359868 ControlChange 0.000000 1 2 11.961081 ControlChange 0.000000 1 4 22.905238 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.709361 ControlChange 0.000000 1 2 11.809479 ControlChange 0.000000 1 4 22.950433 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 30.529189 ControlChange 0.000000 1 2 11.703188 ControlChange 0.000000 1 4 23.002989 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.272873 ControlChange 0.000000 1 2 11.640952 ControlChange 0.000000 1 4 23.062318 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.203793 ControlChange 0.000000 1 2 11.589078 ControlChange 0.000000 1 4 23.127652 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.559436 ControlChange 0.000000 1 2 11.533297 ControlChange 0.000000 1 4 23.198017 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.269853 ControlChange 0.000000 1 2 11.478270 ControlChange 0.000000 1 4 23.272224 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.626153 ControlChange 0.000000 1 2 11.430866 ControlChange 0.000000 1 4 23.348855 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.288188 ControlChange 0.000000 1 2 11.394079 ControlChange 0.000000 1 4 23.426263 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.233210 ControlChange 0.000000 1 2 11.348648 ControlChange 0.000000 1 4 23.502583 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.564073 ControlChange 0.000000 1 2 11.257175 ControlChange 0.000000 1 4 23.575762 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.425896 ControlChange 0.000000 1 2 11.099730 ControlChange 0.000000 1 4 23.643605 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.945259 ControlChange 0.000000 1 2 10.872782 ControlChange 0.000000 1 4 23.703831 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.195657 ControlChange 0.000000 1 2 10.582669 ControlChange 0.000000 1 4 23.754159 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 43.219459 ControlChange 0.000000 1 2 10.246081 ControlChange 0.000000 1 4 23.792383 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.047012 ControlChange 0.000000 1 2 9.887093 ControlChange 0.000000 1 4 23.816349 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.701415 ControlChange 0.000000 1 2 9.530326 ControlChange 0.000000 1 4 23.823007 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.200692 ControlChange 0.000000 1 2 9.194682 ControlChange 0.000000 1 4 23.807150 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.563148 ControlChange 0.000000 1 2 8.891113 ControlChange 0.000000 1 4 23.763699 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.844276 ControlChange 0.000000 1 2 8.623865 ControlChange 0.000000 1 4 23.690585 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.223471 ControlChange 0.000000 1 2 8.392939 ControlChange 0.000000 1 4 23.588546 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 32.646007 ControlChange 0.000000 1 2 8.196208 ControlChange 0.000000 1 4 23.461120 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 30.461502 ControlChange 0.000000 1 2 8.030732 ControlChange 0.000000 1 4 23.315076 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.597337 ControlChange 0.000000 1 2 7.893369 ControlChange 0.000000 1 4 23.160052 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.285327 ControlChange 0.000000 1 2 7.781169 ControlChange 0.000000 1 4 23.007117 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 20.663899 ControlChange 0.000000 1 2 7.691488 ControlChange 0.000000 1 4 22.866706 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 16.808993 ControlChange 0.000000 1 2 7.621981 ControlChange 0.000000 1 4 22.746864 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 12.768444 ControlChange 0.000000 1 2 7.570605 ControlChange 0.000000 1 4 22.652522 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 8.579625 ControlChange 0.000000 1 2 7.535605 ControlChange 0.000000 1 4 22.585724 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 4.314433 ControlChange 0.000000 1 2 7.516477 ControlChange 0.000000 1 4 22.548243 ControlChange 0.000000 1 101 585.280293 ControlChange 0.004167 1 100 0.174528 ControlChange 0.000000 1 2 7.523329 ControlChange 0.000000 1 4 22.558621 ControlChange 0.000000 1 101 563.926693 ControlChange 0.004167 1 100 3.842614 ControlChange 0.000000 1 2 7.585536 ControlChange 0.000000 1 4 22.664108 ControlChange 0.000000 1 101 517.286144 ControlChange 0.004167 1 100 8.248643 ControlChange 0.000000 1 2 7.724890 ControlChange 0.000000 1 4 22.888328 ControlChange 0.000000 1 101 495.932544 ControlChange 0.004167 1 100 12.946056 ControlChange 0.000000 1 2 7.937985 ControlChange 0.000000 1 4 23.206066 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 17.658771 ControlChange 0.000000 1 2 8.213446 ControlChange 0.000000 1 4 23.580654 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 22.238856 ControlChange 0.000000 1 2 8.542206 ControlChange 0.000000 1 4 23.982705 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.509366 ControlChange 0.000000 1 2 8.917557 ControlChange 0.000000 1 4 24.388666 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.099865 ControlChange 0.000000 1 2 9.334362 ControlChange 0.000000 1 4 24.778515 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 32.745838 ControlChange 0.000000 1 2 9.787834 ControlChange 0.000000 1 4 25.134317 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 35.044730 ControlChange 0.000000 1 2 10.256984 ControlChange 0.000000 1 4 25.439241 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 37.488960 ControlChange 0.000000 1 2 10.618714 ControlChange 0.000000 1 4 25.676759 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 39.696260 ControlChange 0.000000 1 2 10.721605 ControlChange 0.000000 1 4 25.831173 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 41.365327 ControlChange 0.000000 1 2 10.698837 ControlChange 0.000000 1 4 25.898547 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.487944 ControlChange 0.000000 1 2 10.661939 ControlChange 0.000000 1 4 25.902849 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 43.125105 ControlChange 0.000000 1 2 10.627477 ControlChange 0.000000 1 4 25.875342 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 43.351360 ControlChange 0.000000 1 2 10.579261 ControlChange 0.000000 1 4 25.827436 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 43.249494 ControlChange 0.000000 1 2 10.481966 ControlChange 0.000000 1 4 25.760028 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.867946 ControlChange 0.000000 1 2 10.319307 ControlChange 0.000000 1 4 25.673209 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.201332 ControlChange 0.000000 1 2 10.093883 ControlChange 0.000000 1 4 25.567393 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 41.237569 ControlChange 0.000000 1 2 9.818349 ControlChange 0.000000 1 4 25.443389 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 40.057347 ControlChange 0.000000 1 2 9.512671 ControlChange 0.000000 1 4 25.302485 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.852542 ControlChange 0.000000 1 2 9.199116 ControlChange 0.000000 1 4 25.146524 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 37.509776 ControlChange 0.000000 1 2 8.896707 ControlChange 0.000000 1 4 24.977951 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 35.591857 ControlChange 0.000000 1 2 8.618208 ControlChange 0.000000 1 4 24.799858 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 33.139537 ControlChange 0.000000 1 2 8.370187 ControlChange 0.000000 1 4 24.615947 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.362725 ControlChange 0.000000 1 2 8.154710 ControlChange 0.000000 1 4 24.430449 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.371365 ControlChange 0.000000 1 2 7.971166 ControlChange 0.000000 1 4 24.247978 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.222640 ControlChange 0.000000 1 2 7.817597 ControlChange 0.000000 1 4 24.073334 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 20.951751 ControlChange 0.000000 1 2 7.691549 ControlChange 0.000000 1 4 23.911257 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 17.582599 ControlChange 0.000000 1 2 7.590497 ControlChange 0.000000 1 4 23.766200 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 14.132826 ControlChange 0.000000 1 2 7.512056 ControlChange 0.000000 1 4 23.642099 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 10.617233 ControlChange 0.000000 1 2 7.454036 ControlChange 0.000000 1 4 23.542243 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 7.054927 ControlChange 0.000000 1 2 7.414504 ControlChange 0.000000 1 4 23.469172 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 3.529190 ControlChange 0.000000 1 2 7.395359 ControlChange 0.000000 1 4 23.424085 ControlChange 0.000000 1 101 491.648937 ControlChange 0.004167 1 100 0.384083 ControlChange 0.000000 1 2 7.434780 ControlChange 0.000000 1 4 23.401654 ControlChange 0.000000 1 101 468.366322 ControlChange 0.004167 1 100 2.198773 ControlChange 0.000000 1 2 7.630061 ControlChange 0.000000 1 4 23.384334 ControlChange 0.000000 1 101 417.512416 ControlChange 0.004167 1 100 4.927365 ControlChange 0.000000 1 2 8.034652 ControlChange 0.000000 1 4 23.355528 ControlChange 0.000000 1 101 394.229801 ControlChange 0.004167 1 100 7.951551 ControlChange 0.000000 1 2 8.6 417 ControlChange 0.000000 1 4 23.311558 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 11.099091 ControlChange 0.000000 1 2 9.300100 ControlChange 0.000000 1 4 23.254568 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.292988 ControlChange 0.000000 1 2 10.06 29 ControlChange 0.000000 1 4 23.187004 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 17.496167 ControlChange 0.000000 1 2 10.860957 ControlChange 0.000000 1 4 23.111090 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 20.682110 ControlChange 0.000000 1 2 11.673214 ControlChange 0.000000 1 4 23.028888 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.826662 ControlChange 0.000000 1 2 12.473812 ControlChange 0.000000 1 4 22.942338 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.903070 ControlChange 0.000000 1 2 13.239400 ControlChange 0.000000 1 4 22.853292 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.876357 ControlChange 0.000000 1 2 13.945431 ControlChange 0.000000 1 4 22.763548 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.692222 ControlChange 0.000000 1 2 14.564166 ControlChange 0.000000 1 4 22.674881 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.244714 ControlChange 0.000000 1 2 15.061902 ControlChange 0.000000 1 4 22.589067 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.289205 ControlChange 0.000000 1 2 15.396361 ControlChange 0.000000 1 4 22.507918 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 38.521165 ControlChange 0.000000 1 2 15.531450 ControlChange 0.000000 1 4 22.433309 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.139432 ControlChange 0.000000 1 2 15.502291 ControlChange 0.000000 1 4 22.367207 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.816159 ControlChange 0.000000 1 2 15.426717 ControlChange 0.000000 1 4 22.311710 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.733653 ControlChange 0.000000 1 2 15.356156 ControlChange 0.000000 1 4 22.269099 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.676493 ControlChange 0.000000 1 2 15.255169 ControlChange 0.000000 1 4 22.241594 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.424159 ControlChange 0.000000 1 2 15.065873 ControlChange 0.000000 1 4 22.228816 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.875650 ControlChange 0.000000 1 2 14.781163 ControlChange 0.000000 1 4 22.224185 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 43.031862 ControlChange 0.000000 1 2 14.423026 ControlChange 0.000000 1 4 22.219839 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.934419 ControlChange 0.000000 1 2 14.014371 ControlChange 0.000000 1 4 22.212757 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.615586 ControlChange 0.000000 1 2 13.574867 ControlChange 0.000000 1 4 22.202434 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.086603 ControlChange 0.000000 1 2 13.120564 ControlChange 0.000000 1 4 22.188602 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.350648 ControlChange 0.000000 1 2 12.664022 ControlChange 0.000000 1 4 22.171002 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.409795 ControlChange 0.000000 1 2 12.214728 ControlChange 0.000000 1 4 22.149407 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.266684 ControlChange 0.000000 1 2 11.779628 ControlChange 0.000000 1 4 22.123654 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.932562 ControlChange 0.000000 1 2 11.363647 ControlChange 0.000000 1 4 22.093701 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.481192 ControlChange 0.000000 1 2 10.970149 ControlChange 0.000000 1 4 22.059692 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.109504 ControlChange 0.000000 1 2 10.601336 ControlChange 0.000000 1 4 22.022026 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.815938 ControlChange 0.000000 1 2 10.258523 ControlChange 0.000000 1 4 21.981408 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.189712 ControlChange 0.000000 1 2 9.942365 ControlChange 0.000000 1 4 21.938859 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.214074 ControlChange 0.000000 1 2 9.653087 ControlChange 0.000000 1 4 21.895643 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.041917 ControlChange 0.000000 1 2 9.390559 ControlChange 0.000000 1 4 21.853136 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.746399 ControlChange 0.000000 1 2 9.154401 ControlChange 0.000000 1 4 21.812646 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.362484 ControlChange 0.000000 1 2 8.944099 ControlChange 0.000000 1 4 21.775259 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 20.910711 ControlChange 0.000000 1 2 8.759020 ControlChange 0.000000 1 4 21.741750 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 18.404455 ControlChange 0.000000 1 2 8.598459 ControlChange 0.000000 1 4 21.712570 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 15.853175 ControlChange 0.000000 1 2 8.461686 ControlChange 0.000000 1 4 21.687887 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 13.263870 ControlChange 0.000000 1 2 8.347972 ControlChange 0.000000 1 4 21.667665 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.642033 ControlChange 0.000000 1 2 8.256554 ControlChange 0.000000 1 4 21.651726 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 7.992514 ControlChange 0.000000 1 2 8.186654 ControlChange 0.000000 1 4 21.639817 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 5.322046 ControlChange 0.000000 1 2 8.137524 ControlChange 0.000000 1 4 21.631649 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 2.685266 ControlChange 0.000000 1 2 8.108478 ControlChange 0.000000 1 4 21.627166 ControlChange 0.000000 1 101 394.229801 ControlChange 0.004167 1 100 0.429604 ControlChange 0.000000 1 2 8.099111 ControlChange 0.000000 1 4 21.628790 ControlChange 0.000000 1 101 417.512416 ControlChange 0.004167 1 100 1.088991 ControlChange 0.000000 1 2 8.109254 ControlChange 0.000000 1 4 21.643747 ControlChange 0.000000 1 101 468.366322 ControlChange 0.004167 1 100 2.411011 ControlChange 0.000000 1 2 8.137968 ControlChange 0.000000 1 4 21.678169 ControlChange 0.000000 1 101 491.648937 ControlChange 0.004167 1 100 3.804841 ControlChange 0.000000 1 2 8.183404 ControlChange 0.000000 1 4 21.732250 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 5.232483 ControlChange 0.000000 1 2 8.243636 ControlChange 0.000000 1 4 21.803659 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 6.670165 ControlChange 0.000000 1 2 8.317015 ControlChange 0.000000 1 4 21.890011 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 8.108212 ControlChange 0.000000 1 2 8.402132 ControlChange 0.000000 1 4 21.989 4 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 9.540879 ControlChange 0.000000 1 2 8.497782 ControlChange 0.000000 1 4 22.098899 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 10.964125 ControlChange 0.000000 1 2 8.602921 ControlChange 0.000000 1 4 22.217497 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 12.374767 ControlChange 0.000000 1 2 8.716629 ControlChange 0.000000 1 4 22.343110 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 13.770061 ControlChange 0.000000 1 2 8.838085 ControlChange 0.000000 1 4 22.474053 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 15.147438 ControlChange 0.000000 1 2 8.966552 ControlChange 0.000000 1 4 22.608723 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 16.504380 ControlChange 0.000000 1 2 9.101357 ControlChange 0.000000 1 4 22.745593 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 17.838283 ControlChange 0.000000 1 2 9.241885 ControlChange 0.000000 1 4 22.883195 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 19.146352 ControlChange 0.000000 1 2 9.387564 ControlChange 0.000000 1 4 23.020114 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 20.425514 ControlChange 0.000000 1 2 9.537859 ControlChange 0.000000 1 4 23.154976 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 21.672296 ControlChange 0.000000 1 2 9.692261 ControlChange 0.000000 1 4 23.286442 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 22.882690 ControlChange 0.000000 1 2 9.850281 ControlChange 0.000000 1 4 23.413201 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.051979 ControlChange 0.000000 1 2 10.011440 ControlChange 0.000000 1 4 23.533960 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.174493 ControlChange 0.000000 1 2 10.175264 ControlChange 0.000000 1 4 23.647440 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.243235 ControlChange 0.000000 1 2 10.341276 ControlChange 0.000000 1 4 23.752369 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.249415 ControlChange 0.000000 1 2 10.508992 ControlChange 0.000000 1 4 23.847480 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.181745 ControlChange 0.000000 1 2 10.677905 ControlChange 0.000000 1 4 23.931497 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.025109 ControlChange 0.000000 1 2 10.847478 ControlChange 0.000000 1 4 24.003137 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.758381 ControlChange 0.000000 1 2 11.017135 ControlChange 0.000000 1 4 24.061101 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.350278 ControlChange 0.000000 1 2 11.186236 ControlChange 0.000000 1 4 24. 4066 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.755936 ControlChange 0.000000 1 2 11.354063 ControlChange 0.000000 1 4 24.130920 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.949647 ControlChange 0.000000 1 2 11.519786 ControlChange 0.000000 1 4 24.142996 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.993360 ControlChange 0.000000 1 2 11.682422 ControlChange 0.000000 1 4 24.146943 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.987249 ControlChange 0.000000 1 2 11.840780 ControlChange 0.000000 1 4 24.149928 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.970625 ControlChange 0.000000 1 2 11.993362 ControlChange 0.000000 1 4 24.154391 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.946690 ControlChange 0.000000 1 2 12.138222 ControlChange 0.000000 1 4 24.160440 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.914999 ControlChange 0.000000 1 2 12.272718 ControlChange 0.000000 1 4 24.167963 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.875056 ControlChange 0.000000 1 2 12.393053 ControlChange 0.000000 1 4 24.176857 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.826329 ControlChange 0.000000 1 2 12.493344 ControlChange 0.000000 1 4 24.187030 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.768240 ControlChange 0.000000 1 2 12.564266 ControlChange 0.000000 1 4 24.198394 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.700153 ControlChange 0.000000 1 2 12.596858 ControlChange 0.000000 1 4 24.210867 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.621390 ControlChange 0.000000 1 2 12.594847 ControlChange 0.000000 1 4 24.224373 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.531203 ControlChange 0.000000 1 2 12.572463 ControlChange 0.000000 1 4 24.238840 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.428805 ControlChange 0.000000 1 2 12.538174 ControlChange 0.000000 1 4 24.254199 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.313367 ControlChange 0.000000 1 2 12.495069 ControlChange 0.000000 1 4 24.270388 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.183988 ControlChange 0.000000 1 2 12.444984 ControlChange 0.000000 1 4 24.287343 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.039746 ControlChange 0.000000 1 2 12.389245 ControlChange 0.000000 1 4 24.305006 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.879723 ControlChange 0.000000 1 2 12.328861 ControlChange 0.000000 1 4 24.323321 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.703009 ControlChange 0.000000 1 2 12.264620 ControlChange 0.000000 1 4 24.342231 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.508771 ControlChange 0.000000 1 2 12.197156 ControlChange 0.000000 1 4 24.361683 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.296327 ControlChange 0.000000 1 2 12.126993 ControlChange 0.000000 1 4 24.381626 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.065253 ControlChange 0.000000 1 2 12.054568 ControlChange 0.000000 1 4 24.402006 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.815510 ControlChange 0.000000 1 2 11.980262 ControlChange 0.000000 1 4 24.422774 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.547613 ControlChange 0.000000 1 2 11.904404 ControlChange 0.000000 1 4 24.443878 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.262801 ControlChange 0.000000 1 2 11.827290 ControlChange 0.000000 1 4 24.465269 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.963196 ControlChange 0.000000 1 2 11.749188 ControlChange 0.000000 1 4 24.486893 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.651900 ControlChange 0.000000 1 2 11.670342 ControlChange 0.000000 1 4 24.508701 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.332970 ControlChange 0.000000 1 2 11.590983 ControlChange 0.000000 1 4 24.530638 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.011238 ControlChange 0.000000 1 2 11.511331 ControlChange 0.000000 1 4 24.552651 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.691973 ControlChange 0.000000 1 2 11.431596 ControlChange 0.000000 1 4 24.574684 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.380435 ControlChange 0.000000 1 2 11.351989 ControlChange 0.000000 1 4 24.596678 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.081421 ControlChange 0.000000 1 2 11.272717 ControlChange 0.000000 1 4 24.618573 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.798896 ControlChange 0.000000 1 2 11.193994 ControlChange 0.000000 1 4 24.640304 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.535798 ControlChange 0.000000 1 2 11.116038 ControlChange 0.000000 1 4 24.661802 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.294005 ControlChange 0.000000 1 2 11.039079 ControlChange 0.000000 1 4 24.682994 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.074440 ControlChange 0.000000 1 2 10.963364 ControlChange 0.000000 1 4 24.703801 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.877238 ControlChange 0.000000 1 2 10.889159 ControlChange 0.000000 1 4 24.724137 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.701961 ControlChange 0.000000 1 2 10.816756 ControlChange 0.000000 1 4 24.743908 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.547794 ControlChange 0.000000 1 2 10.746484 ControlChange 0.000000 1 4 24.763008 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.413668 ControlChange 0.000000 1 2 10.678713 ControlChange 0.000000 1 4 24.781320 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.298376 ControlChange 0.000000 1 2 10.613873 ControlChange 0.000000 1 4 24.798715 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.200684 ControlChange 0.000000 1 2 10.552473 ControlChange 0.000000 1 4 24.815040 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.119372 ControlChange 0.000000 1 2 10.495116 ControlChange 0.000000 1 4 24.830124 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.053261 ControlChange 0.000000 1 2 10.442545 ControlChange 0.000000 1 4 24.843765 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.001240 ControlChange 0.000000 1 2 10.395687 ControlChange 0.000000 1 4 24.855724 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.962286 ControlChange 0.000000 1 2 10.355742 ControlChange 0.000000 1 4 24.865716 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.935442 ControlChange 0.000000 1 2 10.324318 ControlChange 0.000000 1 4 24.873393 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.919914 ControlChange 0.000000 1 2 10.304078 ControlChange 0.000000 1 4 24.878157 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.915860 ControlChange 0.000000 1 2 10.303056 ControlChange 0.000000 1 4 24.877683 ControlChange 0.000000 1 101 495.932544 ControlChange 0.004167 1 100 23.925539 ControlChange 0.000000 1 2 10.338735 ControlChange 0.000000 1 4 24.866721 ControlChange 0.000000 1 101 517.286144 ControlChange 0.004167 1 100 23.951732 ControlChange 0.000000 1 2 10.426498 ControlChange 0.000000 1 4 24.841632 ControlChange 0.000000 1 101 563.926693 ControlChange 0.004167 1 100 23.995780 ControlChange 0.000000 1 2 10.570278 ControlChange 0.000000 1 4 24.803189 ControlChange 0.000000 1 101 585.280293 ControlChange 0.004167 1 100 24.058223 ControlChange 0.000000 1 2 10.768689 ControlChange 0.000000 1 4 24.753650 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.139481 ControlChange 0.000000 1 2 11.019584 ControlChange 0.000000 1 4 24.694990 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.239876 ControlChange 0.000000 1 2 11.320477 ControlChange 0.000000 1 4 24.628847 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.359604 ControlChange 0.000000 1 2 11.668512 ControlChange 0.000000 1 4 24.556636 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.498701 ControlChange 0.000000 1 2 12.060529 ControlChange 0.000000 1 4 24.479606 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.657026 ControlChange 0.000000 1 2 12.492920 ControlChange 0.000000 1 4 24.398903 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.834203 ControlChange 0.000000 1 2 12.961686 ControlChange 0.000000 1 4 24.315618 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.029591 ControlChange 0.000000 1 2 13.462413 ControlChange 0.000000 1 4 24.230827 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.242242 ControlChange 0.000000 1 2 13.990231 ControlChange 0.000000 1 4 24.145633 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.470848 ControlChange 0.000000 1 2 14.539808 ControlChange 0.000000 1 4 24.061222 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.713737 ControlChange 0.000000 1 2 15.105345 ControlChange 0.000000 1 4 23.978919 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.968856 ControlChange 0.000000 1 2 15.680550 ControlChange 0.000000 1 4 23.900280 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.233777 ControlChange 0.000000 1 2 16.258658 ControlChange 0.000000 1 4 23.827221 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.505727 ControlChange 0.000000 1 2 16.832428 ControlChange 0.000000 1 4 23.762243 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.781643 ControlChange 0.000000 1 2 17.394157 ControlChange 0.000000 1 4 23.708821 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.058250 ControlChange 0.000000 1 2 17.935695 ControlChange 0.000000 1 4 23.671655 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.332168 ControlChange 0.000000 1 2 18.448485 ControlChange 0.000000 1 4 23.652889 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.600010 ControlChange 0.000000 1 2 18.923604 ControlChange 0.000000 1 4 23.644877 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.858508 ControlChange 0.000000 1 2 19.351817 ControlChange 0.000000 1 4 23.636387 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28. 4607 ControlChange 0.000000 1 2 19.723599 ControlChange 0.000000 1 4 23.623366 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.335554 ControlChange 0.000000 1 2 20.029208 ControlChange 0.000000 1 4 23.605845 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.548965 ControlChange 0.000000 1 2 20.258839 ControlChange 0.000000 1 4 23.584251 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.742869 ControlChange 0.000000 1 2 20.402306 ControlChange 0.000000 1 4 23.559009 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.915704 ControlChange 0.000000 1 2 20.447182 ControlChange 0.000000 1 4 23.530541 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.066316 ControlChange 0.000000 1 2 20.382714 ControlChange 0.000000 1 4 23.499265 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.193937 ControlChange 0.000000 1 2 20.216339 ControlChange 0.000000 1 4 23.465603 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.298128 ControlChange 0.000000 1 2 19.968928 ControlChange 0.000000 1 4 23.429979 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.378751 ControlChange 0.000000 1 2 19.658855 ControlChange 0.000000 1 4 23.392822 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.435917 ControlChange 0.000000 1 2 19.298637 ControlChange 0.000000 1 4 23.354568 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.459726 ControlChange 0.000000 1 2 18.896909 ControlChange 0.000000 1 4 23.315663 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.338602 ControlChange 0.000000 1 2 18.459908 ControlChange 0.000000 1 4 23.276565 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.787853 ControlChange 0.000000 1 2 17.992316 ControlChange 0.000000 1 4 23.237750 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.626472 ControlChange 0.000000 1 2 17.497729 ControlChange 0.000000 1 4 23.199711 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.920040 ControlChange 0.000000 1 2 16.978949 ControlChange 0.000000 1 4 23.162963 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.792145 ControlChange 0.000000 1 2 16.438194 ControlChange 0.000000 1 4 23.128049 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 21.329814 ControlChange 0.000000 1 2 15.877202 ControlChange 0.000000 1 4 23.095542 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 18.592658 ControlChange 0.000000 1 2 15.297284 ControlChange 0.000000 1 4 23.066052 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 15.624707 ControlChange 0.000000 1 2 14.699390 ControlChange 0.000000 1 4 23.040233 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 12.460989 ControlChange 0.000000 1 2 14.084052 ControlChange 0.000000 1 4 23.018790 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 9.140563 ControlChange 0.000000 1 2 13.451163 ControlChange 0.000000 1 4 23.002487 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 5.706381 ControlChange 0.000000 1 2 12.814255 ControlChange 0.000000 1 4 22.992619 ControlChange 0.000000 1 101 585.924319 ControlChange 0.004167 1 100 1.855777 ControlChange 0.000000 1 2 12.311583 ControlChange 0.000000 1 4 22.995311 ControlChange 0.000000 1 101 571.281625 ControlChange 0.004167 1 100 2.743279 ControlChange 0.000000 1 2 12.125460 ControlChange 0.000000 1 4 23.026106 ControlChange 0.000000 1 101 539.299041 ControlChange 0.004167 1 100 7.217710 ControlChange 0.000000 1 2 12.069455 ControlChange 0.000000 1 4 23.098704 ControlChange 0.000000 1 101 524.656347 ControlChange 0.004167 1 100 11.556292 ControlChange 0.000000 1 2 12.003117 ControlChange 0.000000 1 4 23.215110 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 15.944264 ControlChange 0.000000 1 2 11.913622 ControlChange 0.000000 1 4 23.371600 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 20.331791 ControlChange 0.000000 1 2 11.804020 ControlChange 0.000000 1 4 23.563330 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 24.658877 ControlChange 0.000000 1 2 11.679064 ControlChange 0.000000 1 4 23.784756 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 28.866546 ControlChange 0.000000 1 2 11.547909 ControlChange 0.000000 1 4 24.029580 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 32.874638 ControlChange 0.000000 1 2 11.429176 ControlChange 0.000000 1 4 24.290732 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 36.533221 ControlChange 0.000000 1 2 11.332900 ControlChange 0.000000 1 4 24.560321 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.547021 ControlChange 0.000000 1 2 11.236659 ControlChange 0.000000 1 4 24.829594 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 41.984451 ControlChange 0.000000 1 2 11.109954 ControlChange 0.000000 1 4 25.088924 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 44.765322 ControlChange 0.000000 1 2 10.886349 ControlChange 0.000000 1 4 25.327807 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 47.502089 ControlChange 0.000000 1 2 10.563929 ControlChange 0.000000 1 4 25.534866 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 48.708327 ControlChange 0.000000 1 2 10.213143 ControlChange 0.000000 1 4 25.697895 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 48.708344 ControlChange 0.000000 1 2 9.878381 ControlChange 0.000000 1 4 25.804963 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 48.167515 ControlChange 0.000000 1 2 9.570503 ControlChange 0.000000 1 4 25.854121 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 47.217050 ControlChange 0.000000 1 2 9.290430 ControlChange 0.000000 1 4 25.867063 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 45.830320 ControlChange 0.000000 1 2 9.036685 ControlChange 0.000000 1 4 25.871161 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 43.968558 ControlChange 0.000000 1 2 8.807274 ControlChange 0.000000 1 4 25.876445 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 41.699351 ControlChange 0.000000 1 2 8.600186 ControlChange 0.000000 1 4 25.883736 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.541109 ControlChange 0.000000 1 2 8.413566 ControlChange 0.000000 1 4 25.892909 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.965093 ControlChange 0.000000 1 2 8.245756 ControlChange 0.000000 1 4 25.903786 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 36.254514 ControlChange 0.000000 1 2 8.095305 ControlChange 0.000000 1 4 25.916136 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 34.137994 ControlChange 0.000000 1 2 7.960912 ControlChange 0.000000 1 4 25.929670 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 31.761280 ControlChange 0.000000 1 2 7.841428 ControlChange 0.000000 1 4 25.944054 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 29.215251 ControlChange 0.000000 1 2 7.735843 ControlChange 0.000000 1 4 25.958913 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 26.546223 ControlChange 0.000000 1 2 7.643270 ControlChange 0.000000 1 4 25.973847 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 23.782234 ControlChange 0.000000 1 2 7.562883 ControlChange 0.000000 1 4 25.988448 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 20.942067 ControlChange 0.000000 1 2 7.493954 ControlChange 0.000000 1 4 26.002319 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 18.039236 ControlChange 0.000000 1 2 7.435833 ControlChange 0.000000 1 4 26.015089 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 15.084091 ControlChange 0.000000 1 2 7.387934 ControlChange 0.000000 1 4 26.026431 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 12.085283 ControlChange 0.000000 1 2 7.349724 ControlChange 0.000000 1 4 26.036067 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 9.051312 ControlChange 0.000000 1 2 7.320718 ControlChange 0.000000 1 4 26.043774 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 5.996267 ControlChange 0.000000 1 2 7.300455 ControlChange 0.000000 1 4 26.049390 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 2.962045 ControlChange 0.000000 1 2 7.292010 ControlChange 0.000000 1 4 26.052522 ControlChange 0.000000 1 101 521.425463 ControlChange 0.004167 1 100 0.031504 ControlChange 0.000000 1 2 7.334868 ControlChange 0.000000 1 4 26.049948 ControlChange 0.000000 1 101 502.401568 ControlChange 0.004167 1 100 3.150172 ControlChange 0.000000 1 2 7.544213 ControlChange 0.000000 1 4 26.032876 ControlChange 0.000000 1 101 460.849562 ControlChange 0.004167 1 100 6.544515 ControlChange 0.000000 1 2 8.034371 ControlChange 0.000000 1 4 25.993791 ControlChange 0.000000 1 101 441.825668 ControlChange 0.004167 1 100 10.069951 ControlChange 0.000000 1 2 8.842059 ControlChange 0.000000 1 4 25.932211 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 13.590671 ControlChange 0.000000 1 2 9.962281 ControlChange 0.000000 1 4 25.850794 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 17.058794 ControlChange 0.000000 1 2 11.372204 ControlChange 0.000000 1 4 25.752480 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 20.444550 ControlChange 0.000000 1 2 13.002111 ControlChange 0.000000 1 4 25.640216 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 23.716628 ControlChange 0.000000 1 2 14.612275 ControlChange 0.000000 1 4 25.516995 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 26.834036 ControlChange 0.000000 1 2 15.711108 ControlChange 0.000000 1 4 25.385894 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 29.733727 ControlChange 0.000000 1 2 16.081178 ControlChange 0.000000 1 4 25.250118 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 32.297658 ControlChange 0.000000 1 2 16.178045 ControlChange 0.000000 1 4 25.113058 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.327672 ControlChange 0.000000 1 2 16.265319 ControlChange 0.000000 1 4 24.978347 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 36.012485 ControlChange 0.000000 1 2 16.360319 ControlChange 0.000000 1 4 24.849942 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 38.158583 ControlChange 0.000000 1 2 16.456721 ControlChange 0.000000 1 4 24.732216 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.597606 ControlChange 0.000000 1 2 16.549417 ControlChange 0.000000 1 4 24.630088 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.649236 ControlChange 0.000000 1 2 16.632226 ControlChange 0.000000 1 4 24.549188 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.966248 ControlChange 0.000000 1 2 16.686119 ControlChange 0.000000 1 4 24.495441 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 44.465847 ControlChange 0.000000 1 2 16.603928 ControlChange 0.000000 1 4 24.469381 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 44.228606 ControlChange 0.000000 1 2 16.180869 ControlChange 0.000000 1 4 24.457679 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.418303 ControlChange 0.000000 1 2 15.436997 ControlChange 0.000000 1 4 24.443704 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.168479 ControlChange 0.000000 1 2 14.645334 ControlChange 0.000000 1 4 24.421382 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.597210 ControlChange 0.000000 1 2 13.962964 ControlChange 0.000000 1 4 24.390300 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 38.868108 ControlChange 0.000000 1 2 13.400118 ControlChange 0.000000 1 4 24.350702 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.277820 ControlChange 0.000000 1 2 12.933041 ControlChange 0.000000 1 4 24.302952 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 36.093713 ControlChange 0.000000 1 2 12.540748 ControlChange 0.000000 1 4 24.247549 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 35.015516 ControlChange 0.000000 1 2 12.208121 ControlChange 0.000000 1 4 24.185153 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 33.531334 ControlChange 0.000000 1 2 11.924294 ControlChange 0.000000 1 4 24.116605 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 31.636093 ControlChange 0.000000 1 2 11.681271 ControlChange 0.000000 1 4 24.042933 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 29.489437 ControlChange 0.000000 1 2 11.473023 ControlChange 0.000000 1 4 23.965360 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 27.175904 ControlChange 0.000000 1 2 11.294815 ControlChange 0.000000 1 4 23.885304 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 24.739647 ControlChange 0.000000 1 2 11.142938 ControlChange 0.000000 1 4 23.804362 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 22.207528 ControlChange 0.000000 1 2 11.014380 ControlChange 0.000000 1 4 23.724287 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 19.597364 ControlChange 0.000000 1 2 10.906612 ControlChange 0.000000 1 4 23.646952 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 16.921880 ControlChange 0.000000 1 2 10.817608 ControlChange 0.000000 1 4 23.574298 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 14.190482 ControlChange 0.000000 1 2 10.745647 ControlChange 0.000000 1 4 23.508275 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 11.4 432 ControlChange 0.000000 1 2 10.689199 ControlChange 0.000000 1 4 23.450785 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 8.587866 ControlChange 0.000000 1 2 10.646965 ControlChange 0.000000 1 4 23.403619 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 5.730392 ControlChange 0.000000 1 2 10.617851 ControlChange 0.000000 1 4 23.368394 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 2.871270 ControlChange 0.000000 1 2 10.604 4 ControlChange 0.000000 1 4 23.346212 ControlChange 0.000000 1 101 438.464803 ControlChange 0.004167 1 100 0.139891 ControlChange 0.000000 1 2 10.639911 ControlChange 0.000000 1 4 23.334694 ControlChange 0.000000 1 101 422.467678 ControlChange 0.004167 1 100 2.472343 ControlChange 0.000000 1 2 10.815015 ControlChange 0.000000 1 4 23.324380 ControlChange 0.000000 1 101 387.526745 ControlChange 0.004167 1 100 5.367760 ControlChange 0.000000 1 2 11.188179 ControlChange 0.000000 1 4 23.305436 ControlChange 0.000000 1 101 371.529620 ControlChange 0.004167 1 100 8.526963 ControlChange 0.000000 1 2 11.735214 ControlChange 0.000000 1 4 23.274651 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 11.790907 ControlChange 0.000000 1 2 12.397068 ControlChange 0.000000 1 4 23.232249 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 15.098462 ControlChange 0.000000 1 2 13.061152 ControlChange 0.000000 1 4 23.179128 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 18.418281 ControlChange 0.000000 1 2 13.459115 ControlChange 0.000000 1 4 23.116631 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 21.721197 ControlChange 0.000000 1 2 13.405624 ControlChange 0.000000 1 4 23.046618 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 24.955268 ControlChange 0.000000 1 2 13.223679 ControlChange 0.000000 1 4 22.971510 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 27.980596 ControlChange 0.000000 1 2 13.111328 ControlChange 0.000000 1 4 22.894297 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 30.758263 ControlChange 0.000000 1 2 12.984337 ControlChange 0.000000 1 4 22.818486 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.697867 ControlChange 0.000000 1 2 12.789709 ControlChange 0.000000 1 4 22.747971 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.813317 ControlChange 0.000000 1 2 12.532213 ControlChange 0.000000 1 4 22.686832 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.388949 ControlChange 0.000000 1 2 12.225782 ControlChange 0.000000 1 4 22.639100 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.990783 ControlChange 0.000000 1 2 11.885753 ControlChange 0.000000 1 4 22.608296 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 41.641677 ControlChange 0.000000 1 2 11.527007 ControlChange 0.000000 1 4 22.595491 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 41.633753 ControlChange 0.000000 1 2 11.162520 ControlChange 0.000000 1 4 22.596834 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 41.240271 ControlChange 0.000000 1 2 10.802648 ControlChange 0.000000 1 4 22.606968 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.508101 ControlChange 0.000000 1 2 10.455036 ControlChange 0.000000 1 4 22.623468 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.352819 ControlChange 0.000000 1 2 10.124924 ControlChange 0.000000 1 4 22.645544 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.677249 ControlChange 0.000000 1 2 9.815595 ControlChange 0.000000 1 4 22.672570 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 35.833715 ControlChange 0.000000 1 2 9.528882 ControlChange 0.000000 1 4 22.703926 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.452711 ControlChange 0.000000 1 2 9.265589 ControlChange 0.000000 1 4 22.738989 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 32.967774 ControlChange 0.000000 1 2 9.025806 ControlChange 0.000000 1 4 22.777130 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 31.109288 ControlChange 0.000000 1 2 8.809136 ControlChange 0.000000 1 4 22.817706 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 29.002269 ControlChange 0.000000 1 2 8.614906 ControlChange 0.000000 1 4 22.860063 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 26.730018 ControlChange 0.000000 1 2 8.442285 ControlChange 0.000000 1 4 22.903518 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 24.336118 ControlChange 0.000000 1 2 8.290328 ControlChange 0.000000 1 4 22.947361 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 21.847134 ControlChange 0.000000 1 2 8.158065 ControlChange 0.000000 1 4 22.990843 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 19.280756 ControlChange 0.000000 1 2 8.044528 ControlChange 0.000000 1 4 23.033168 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 16.649575 ControlChange 0.000000 1 2 7.948789 ControlChange 0.000000 1 4 23.073479 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 13.962898 ControlChange 0.000000 1 2 7.869935 ControlChange 0.000000 1 4 23.110848 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 11.227928 ControlChange 0.000000 1 2 7.807083 ControlChange 0.000000 1 4 23.144253 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 8.450746 ControlChange 0.000000 1 2 7.759433 ControlChange 0.000000 1 4 23.172562 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 5.638911 ControlChange 0.000000 1 2 7.726206 ControlChange 0.000000 1 4 23.194511 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 2.795179 ControlChange 0.000000 1 2 7.716138 ControlChange 0.000000 1 4 23.208686 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 0.238552 ControlChange 0.000000 1 2 7.835447 ControlChange 0.000000 1 4 23.213754 ControlChange 0.000000 1 101 368.320540 ControlChange 0.004167 1 100 3.854881 ControlChange 0.000000 1 2 8.382341 ControlChange 0.000000 1 4 23.209152 ControlChange 0.000000 1 101 350.878287 ControlChange 0.004167 1 100 8.077353 ControlChange 0.000000 1 2 9.613883 ControlChange 0.000000 1 4 23.195355 ControlChange 0.000000 1 101 312.780903 ControlChange 0.004167 1 100 12.542874 ControlChange 0.000000 1 2 11.505507 ControlChange 0.000000 1 4 23.173224 ControlChange 0.000000 1 101 295.338650 ControlChange 0.004167 1 100 17.019233 ControlChange 0.000000 1 2 13.685058 ControlChange 0.000000 1 4 23.143696 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 21.420530 ControlChange 0.000000 1 2 15.316652 ControlChange 0.000000 1 4 23.107798 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 25.683120 ControlChange 0.000000 1 2 15.871890 ControlChange 0.000000 1 4 23.066659 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 29.724233 ControlChange 0.000000 1 2 15.977587 ControlChange 0.000000 1 4 23.021491 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 33.391650 ControlChange 0.000000 1 2 16.049103 ControlChange 0.000000 1 4 22.973588 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 36.370888 ControlChange 0.000000 1 2 16.124006 ControlChange 0.000000 1 4 22.924323 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 38.578485 ControlChange 0.000000 1 2 16.194453 ControlChange 0.000000 1 4 22.875137 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 40.901526 ControlChange 0.000000 1 2 16.222661 ControlChange 0.000000 1 4 22.827526 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 43.829931 ControlChange 0.000000 1 2 16.140976 ControlChange 0.000000 1 4 22.783027 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 46.416119 ControlChange 0.000000 1 2 15.939308 ControlChange 0.000000 1 4 22.743205 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 47.976557 ControlChange 0.000000 1 2 15.653017 ControlChange 0.000000 1 4 22.709636 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 48.555554 ControlChange 0.000000 1 2 15.318146 ControlChange 0.000000 1 4 22.683892 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 48.455059 ControlChange 0.000000 1 2 14.960791 ControlChange 0.000000 1 4 22.667398 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 47.892228 ControlChange 0.000000 1 2 14.598688 ControlChange 0.000000 1 4 22.660237 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 46.901301 ControlChange 0.000000 1 2 14.243576 ControlChange 0.000000 1 4 22.659527 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 45.444459 ControlChange 0.000000 1 2 13.903041 ControlChange 0.000000 1 4 22.661740 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 43.508644 ControlChange 0.000000 1 2 13.581846 ControlChange 0.000000 1 4 22.665537 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 41.285229 ControlChange 0.000000 1 2 13.282859 ControlChange 0.000000 1 4 22.670706 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 39.278664 ControlChange 0.000000 1 2 13.007668 ControlChange 0.000000 1 4 22.677119 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 37.542847 ControlChange 0.000000 1 2 12.757029 ControlChange 0.000000 1 4 22.684614 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 35.350596 ControlChange 0.000000 1 2 12.531116 ControlChange 0.000000 1 4 22.692996 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 32.594669 ControlChange 0.000000 1 2 12.329753 ControlChange 0.000000 1 4 22.702036 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 29.492967 ControlChange 0.000000 1 2 12.152487 ControlChange 0.000000 1 4 22.711473 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 26.165248 ControlChange 0.000000 1 2 11.998737 ControlChange 0.000000 1 4 22.721016 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 22.672873 ControlChange 0.000000 1 2 11.867847 ControlChange 0.000000 1 4 22.730346 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 19.053305 ControlChange 0.000000 1 2 11.759080 ControlChange 0.000000 1 4 22.739130 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 15.332235 ControlChange 0.000000 1 2 11.671692 ControlChange 0.000000 1 4 22.747025 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 11.529620 ControlChange 0.000000 1 2 11.604931 ControlChange 0.000000 1 4 22.753689 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 7.668417 ControlChange 0.000000 1 2 11.558058 ControlChange 0.000000 1 4 22.758792 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 3.830457 ControlChange 0.000000 1 2 11.529141 ControlChange 0.000000 1 4 22.761415 ControlChange 0.000000 1 101 294.453419 ControlChange 0.004167 1 100 0.309148 ControlChange 0.000000 1 2 11.503520 ControlChange 0.000000 1 4 22.754464 ControlChange 0.000000 1 101 302.671353 ControlChange 0.004167 1 100 2.768507 ControlChange 0.000000 1 2 11.437909 ControlChange 0.000000 1 4 22.719351 ControlChange 0.000000 1 101 320.620972 ControlChange 0.004167 1 100 5.992884 ControlChange 0.000000 1 2 11.284010 ControlChange 0.000000 1 4 22.641763 ControlChange 0.000000 1 101 328.838906 ControlChange 0.004167 1 100 9.445152 ControlChange 0.000000 1 2 11.028712 ControlChange 0.000000 1 4 22.523150 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 12.954862 ControlChange 0.000000 1 2 10.737489 ControlChange 0.000000 1 4 22.370927 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 16.444392 ControlChange 0.000000 1 2 10.609848 ControlChange 0.000000 1 4 22.192109 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 19.862173 ControlChange 0.000000 1 2 10.796348 ControlChange 0.000000 1 4 21.992905 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 23.146329 ControlChange 0.000000 1 2 11.132971 ControlChange 0.000000 1 4 21.778973 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 26.182909 ControlChange 0.000000 1 2 11.402 2 ControlChange 0.000000 1 4 21.555639 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 28.726654 ControlChange 0.000000 1 2 11.444617 ControlChange 0.000000 1 4 21.328071 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 30.729921 ControlChange 0.000000 1 2 11.338060 ControlChange 0.000000 1 4 21.101446 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 32.892158 ControlChange 0.000000 1 2 11.166045 ControlChange 0.000000 1 4 20.881116 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 35.453529 ControlChange 0.000000 1 2 10.953549 ControlChange 0.000000 1 4 20.672792 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 37.536589 ControlChange 0.000000 1 2 10.716537 ControlChange 0.000000 1 4 20.482782 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 38.515426 ControlChange 0.000000 1 2 10.467983 ControlChange 0.000000 1 4 20.318297 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 38.596680 ControlChange 0.000000 1 2 10.217607 ControlChange 0.000000 1 4 20.187873 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 38.238954 ControlChange 0.000000 1 2 9.972231 ControlChange 0.000000 1 4 20.101173 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 37.622609 ControlChange 0.000000 1 2 9.736382 ControlChange 0.000000 1 4 20.062123 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 36.765845 ControlChange 0.000000 1 2 9.512896 ControlChange 0.000000 1 4 20.057464 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 35.666916 ControlChange 0.000000 1 2 9.303406 ControlChange 0.000000 1 4 20.067564 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 34.315362 ControlChange 0.000000 1 2 9.108736 ControlChange 0.000000 1 4 20.084041 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 32.711153 ControlChange 0.000000 1 2 8.929171 ControlChange 0.000000 1 4 20.105121 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 31.090460 ControlChange 0.000000 1 2 8.764635 ControlChange 0.000000 1 4 20.129878 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 29.734331 ControlChange 0.000000 1 2 8.614835 ControlChange 0.000000 1 4 20.157540 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 28.170267 ControlChange 0.000000 1 2 8.479337 ControlChange 0.000000 1 4 20.187437 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 26.269989 ControlChange 0.000000 1 2 8.357638 ControlChange 0.000000 1 4 20.218966 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 24.171080 ControlChange 0.000000 1 2 8.249191 ControlChange 0.000000 1 4 20.251570 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 21.947661 ControlChange 0.000000 1 2 8.153438 ControlChange 0.000000 1 4 20.284711 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 19.636018 ControlChange 0.000000 1 2 8.069814 ControlChange 0.000000 1 4 20.317857 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 17.258015 ControlChange 0.000000 1 2 7.997770 ControlChange 0.000000 1 4 20.350452 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 14.828531 ControlChange 0.000000 1 2 7.936789 ControlChange 0.000000 1 4 20.381902 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 12.358799 ControlChange 0.000000 1 2 7.886379 ControlChange 0.000000 1 4 20.411541 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 9.858493 ControlChange 0.000000 1 2 7.846054 ControlChange 0.000000 1 4 20.438597 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 7.337907 ControlChange 0.000000 1 2 7.815369 ControlChange 0.000000 1 4 20.462132 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 4.815959 ControlChange 0.000000 1 2 7.793906 ControlChange 0.000000 1 4 20.480961 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 2.342639 ControlChange 0.000000 1 2 7.783118 ControlChange 0.000000 1 4 20.494003 ControlChange 0.000000 1 101 330.512788 ControlChange 0.004167 1 100 0.127902 ControlChange 0.000000 1 2 7.803949 ControlChange 0.000000 1 4 20.504820 ControlChange 0.000000 1 101 339.737107 ControlChange 0.004167 1 100 2.960178 ControlChange 0.000000 1 2 7.918415 ControlChange 0.000000 1 4 20.527338 ControlChange 0.000000 1 101 359.884873 ControlChange 0.004167 1 100 6.362732 ControlChange 0.000000 1 2 8.190194 ControlChange 0.000000 1 4 20.575446 ControlChange 0.000000 1 101 369.109192 ControlChange 0.004167 1 100 10.063646 ControlChange 0.000000 1 2 8.644504 ControlChange 0.000000 1 4 20.652181 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 13.829994 ControlChange 0.000000 1 2 9.287503 ControlChange 0.000000 1 4 20.755066 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 17.577342 ControlChange 0.000000 1 2 10.122470 ControlChange 0.000000 1 4 20.880690 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 21.258160 ControlChange 0.000000 1 2 11.150188 ControlChange 0.000000 1 4 21.025183 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 24.828848 ControlChange 0.000000 1 2 12.363450 ControlChange 0.000000 1 4 21.184241 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 28.237463 ControlChange 0.000000 1 2 13.725139 ControlChange 0.000000 1 4 21.353179 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 31.408484 ControlChange 0.000000 1 2 15.070881 ControlChange 0.000000 1 4 21.526969 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.206421 ControlChange 0.000000 1 2 16.014733 ControlChange 0.000000 1 4 21.700315 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.399886 ControlChange 0.000000 1 2 16.359589 ControlChange 0.000000 1 4 21.867739 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.101945 ControlChange 0.000000 1 2 16.486695 ControlChange 0.000000 1 4 22.023665 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.084943 ControlChange 0.000000 1 2 16.617213 ControlChange 0.000000 1 4 22.162525 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 42.347791 ControlChange 0.000000 1 2 16.761964 ControlChange 0.000000 1 4 22.278876 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 44.360539 ControlChange 0.000000 1 2 16.913927 ControlChange 0.000000 1 4 22.367495 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 45.892824 ControlChange 0.000000 1 2 17.067060 ControlChange 0.000000 1 4 22.423865 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 46.941817 ControlChange 0.000000 1 2 17.206292 ControlChange 0.000000 1 4 22.448016 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 47.546040 ControlChange 0.000000 1 2 17.283100 ControlChange 0.000000 1 4 22.449629 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 47.739450 ControlChange 0.000000 1 2 17.235540 ControlChange 0.000000 1 4 22.440453 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 47.533434 ControlChange 0.000000 1 2 17.070094 ControlChange 0.000000 1 4 22.425103 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 46.917411 ControlChange 0.000000 1 2 16.818340 ControlChange 0.000000 1 4 22.404468 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 45.872009 ControlChange 0.000000 1 2 16.507628 ControlChange 0.000000 1 4 22.379065 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 44.374579 ControlChange 0.000000 1 2 16.162536 ControlChange 0.000000 1 4 22.349398 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 42.409705 ControlChange 0.000000 1 2 15.803519 ControlChange 0.000000 1 4 22.315966 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.078632 ControlChange 0.000000 1 2 15.446125 ControlChange 0.000000 1 4 22.279272 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.886983 ControlChange 0.000000 1 2 15.101302 ControlChange 0.000000 1 4 22.239819 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.217663 ControlChange 0.000000 1 2 14.776244 ControlChange 0.000000 1 4 22.198120 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.366002 ControlChange 0.000000 1 2 14.475340 ControlChange 0.000000 1 4 22.154700 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 32.105597 ControlChange 0.000000 1 2 14.200960 ControlChange 0.000000 1 4 22.110108 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 29.595043 ControlChange 0.000000 1 2 13.954134 ControlChange 0.000000 1 4 22.064916 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 26.924938 ControlChange 0.000000 1 2 13.735006 ControlChange 0.000000 1 4 22.019734 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 24.140070 ControlChange 0.000000 1 2 13.543143 ControlChange 0.000000 1 4 21.975211 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 21.267347 ControlChange 0.000000 1 2 13.377770 ControlChange 0.000000 1 4 21.932057 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 18.324769 ControlChange 0.000000 1 2 13.237913 ControlChange 0.000000 1 4 21.89 49 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 15.325372 ControlChange 0.000000 1 2 13.122514 ControlChange 0.000000 1 4 21.853050 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 12.279526 ControlChange 0.000000 1 2 13.030437 ControlChange 0.000000 1 4 21.819035 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 9.196897 ControlChange 0.000000 1 2 12.960570 ControlChange 0.000000 1 4 21.790120 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 6.092531 ControlChange 0.000000 1 2 12.911842 ControlChange 0.000000 1 4 21.767604 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 3.055065 ControlChange 0.000000 1 2 12.883418 ControlChange 0.000000 1 4 21.753107 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 0.541146 ControlChange 0.000000 1 2 12.876731 ControlChange 0.000000 1 4 21.749454 ControlChange 0.000000 1 101 370.476897 ControlChange 0.004167 1 100 0.990227 ControlChange 0.000000 1 2 12.896613 ControlChange 0.000000 1 4 21.761134 ControlChange 0.000000 1 101 375.504396 ControlChange 0.004167 1 100 2.169062 ControlChange 0.000000 1 2 12.944696 ControlChange 0.000000 1 4 21.791157 ControlChange 0.000000 1 101 386.485463 ControlChange 0.004167 1 100 3.370003 ControlChange 0.000000 1 2 13.016889 ControlChange 0.000000 1 4 21.839343 ControlChange 0.000000 1 101 391.512962 ControlChange 0.004167 1 100 4.592260 ControlChange 0.000000 1 2 13.108298 ControlChange 0.000000 1 4 21.904209 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 5.822387 ControlChange 0.000000 1 2 13.215360 ControlChange 0.000000 1 4 21.984195 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 7.055111 ControlChange 0.000000 1 2 13.335506 ControlChange 0.000000 1 4 22.077755 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 8.287274 ControlChange 0.000000 1 2 13.466817 ControlChange 0.000000 1 4 22.183354 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 9.516629 ControlChange 0.000000 1 2 13.607808 ControlChange 0.000000 1 4 22.299460 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.741366 ControlChange 0.000000 1 2 13.757293 ControlChange 0.000000 1 4 22.424511 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 11.959865 ControlChange 0.000000 1 2 13.914309 ControlChange 0.000000 1 4 22.556910 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 13.170555 ControlChange 0.000000 1 2 14.078057 ControlChange 0.000000 1 4 22.695017 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.371821 ControlChange 0.000000 1 2 14.247858 ControlChange 0.000000 1 4 22.837118 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 15.561891 ControlChange 0.000000 1 2 14.423118 ControlChange 0.000000 1 4 22.981411 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 16.738727 ControlChange 0.000000 1 2 14.603310 ControlChange 0.000000 1 4 23.125969 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 17.899929 ControlChange 0.000000 1 2 14.787931 ControlChange 0.000000 1 4 23.268719 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 19.042513 ControlChange 0.000000 1 2 14.976474 ControlChange 0.000000 1 4 23.407398 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 20.162634 ControlChange 0.000000 1 2 15.168353 ControlChange 0.000000 1 4 23.539500 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.255181 ControlChange 0.000000 1 2 15.362744 ControlChange 0.000000 1 4 23.662226 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.312971 ControlChange 0.000000 1 2 15.557698 ControlChange 0.000000 1 4 23.772388 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.325144 ControlChange 0.000000 1 2 15.741647 ControlChange 0.000000 1 4 23.866306 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.273739 ControlChange 0.000000 1 2 15.861160 ControlChange 0.000000 1 4 23.939679 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.123048 ControlChange 0.000000 1 2 15.862354 ControlChange 0.000000 1 4 23.987819 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.791566 ControlChange 0.000000 1 2 15.811773 ControlChange 0.000000 1 4 24.009817 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.172667 ControlChange 0.000000 1 2 15.756655 ControlChange 0.000000 1 4 24.014819 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.304230 ControlChange 0.000000 1 2 15.701926 ControlChange 0.000000 1 4 24.014657 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.379778 ControlChange 0.000000 1 2 15.647581 ControlChange 0.000000 1 4 24.013717 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.491829 ControlChange 0.000000 1 2 15.593629 ControlChange 0.000000 1 4 24.012381 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.650026 ControlChange 0.000000 1 2 15.540087 ControlChange 0.000000 1 4 24.010636 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.854925 ControlChange 0.000000 1 2 15.486981 ControlChange 0.000000 1 4 24.008469 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.106868 ControlChange 0.000000 1 2 15.434343 ControlChange 0.000000 1 4 24.005863 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.405960 ControlChange 0.000000 1 2 15.382215 ControlChange 0.000000 1 4 24.002805 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.751960 ControlChange 0.000000 1 2 15.330649 ControlChange 0.000000 1 4 23.999278 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.144224 ControlChange 0.000000 1 2 15.279710 ControlChange 0.000000 1 4 23.995266 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.581661 ControlChange 0.000000 1 2 15.229482 ControlChange 0.000000 1 4 23.990751 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.062672 ControlChange 0.000000 1 2 15.180072 ControlChange 0.000000 1 4 23.985713 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.585100 ControlChange 0.000000 1 2 15.131624 ControlChange 0.000000 1 4 23.980134 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.146181 ControlChange 0.000000 1 2 15.084332 ControlChange 0.000000 1 4 23.973994 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.742442 ControlChange 0.000000 1 2 15.038477 ControlChange 0.000000 1 4 23.967271 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 31.369760 ControlChange 0.000000 1 2 14.994487 ControlChange 0.000000 1 4 23.959941 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.023349 ControlChange 0.000000 1 2 14.953081 ControlChange 0.000000 1 4 23.951982 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.697772 ControlChange 0.000000 1 2 14.915733 ControlChange 0.000000 1 4 23.943369 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.387013 ControlChange 0.000000 1 2 14.885903 ControlChange 0.000000 1 4 23.934075 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.084586 ControlChange 0.000000 1 2 14.867723 ControlChange 0.000000 1 4 23.924072 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.783655 ControlChange 0.000000 1 2 14.857680 ControlChange 0.000000 1 4 23.913333 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.477183 ControlChange 0.000000 1 2 14.845108 ControlChange 0.000000 1 4 23.901826 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.158098 ControlChange 0.000000 1 2 14.825452 ControlChange 0.000000 1 4 23.889521 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.819465 ControlChange 0.000000 1 2 14.798702 ControlChange 0.000000 1 4 23.876384 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.454667 ControlChange 0.000000 1 2 14.765301 ControlChange 0.000000 1 4 23.862381 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 38.057515 ControlChange 0.000000 1 2 14.725672 ControlChange 0.000000 1 4 23.847476 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 38.622402 ControlChange 0.000000 1 2 14.680220 ControlChange 0.000000 1 4 23.831633 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.144402 ControlChange 0.000000 1 2 14.629330 ControlChange 0.000000 1 4 23.814812 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.619291 ControlChange 0.000000 1 2 14.573366 ControlChange 0.000000 1 4 23.796976 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.043574 ControlChange 0.000000 1 2 14.512678 ControlChange 0.000000 1 4 23.778084 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.414525 ControlChange 0.000000 1 2 14.447599 ControlChange 0.000000 1 4 23.758096 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.730 4 ControlChange 0.000000 1 2 14.378447 ControlChange 0.000000 1 4 23.736972 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.988929 ControlChange 0.000000 1 2 14.305525 ControlChange 0.000000 1 4 23.714673 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.190202 ControlChange 0.000000 1 2 14.229124 ControlChange 0.000000 1 4 23.691159 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.333643 ControlChange 0.000000 1 2 14.149520 ControlChange 0.000000 1 4 23.666396 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.419812 ControlChange 0.000000 1 2 14.066978 ControlChange 0.000000 1 4 23.640351 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.453763 ControlChange 0.000000 1 2 13.981750 ControlChange 0.000000 1 4 23.612994 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.449283 ControlChange 0.000000 1 2 13.894082 ControlChange 0.000000 1 4 23.584306 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.420057 ControlChange 0.000000 1 2 13.804203 ControlChange 0.000000 1 4 23.554271 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.370988 ControlChange 0.000000 1 2 13.712337 ControlChange 0.000000 1 4 23.522886 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.302788 ControlChange 0.000000 1 2 13.618697 ControlChange 0.000000 1 4 23.490161 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.215751 ControlChange 0.000000 1 2 13.523487 ControlChange 0.000000 1 4 23.456117 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.110189 ControlChange 0.000000 1 2 13.426903 ControlChange 0.000000 1 4 23.420794 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.986446 ControlChange 0.000000 1 2 13.329133 ControlChange 0.000000 1 4 23.384254 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.844877 ControlChange 0.000000 1 2 13.230356 ControlChange 0.000000 1 4 23.346576 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.685843 ControlChange 0.000000 1 2 13.130746 ControlChange 0.000000 1 4 23.307864 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.509736 ControlChange 0.000000 1 2 13.030470 ControlChange 0.000000 1 4 23.268242 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.316996 ControlChange 0.000000 1 2 12.929687 ControlChange 0.000000 1 4 23.227859 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.108109 ControlChange 0.000000 1 2 12.828549 ControlChange 0.000000 1 4 23.186883 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.883601 ControlChange 0.000000 1 2 12.727204 ControlChange 0.000000 1 4 23.145497 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.644068 ControlChange 0.000000 1 2 12.625795 ControlChange 0.000000 1 4 23.103899 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.390186 ControlChange 0.000000 1 2 12.524456 ControlChange 0.000000 1 4 23.062290 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.122751 ControlChange 0.000000 1 2 12.423318 ControlChange 0.000000 1 4 23.020875 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 38.842707 ControlChange 0.000000 1 2 12.322508 ControlChange 0.000000 1 4 22.979852 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 38.551177 ControlChange 0.000000 1 2 12.222147 ControlChange 0.000000 1 4 22.939407 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 38.249549 ControlChange 0.000000 1 2 12.122351 ControlChange 0.000000 1 4 22.899713 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.939581 ControlChange 0.000000 1 2 12.023233 ControlChange 0.000000 1 4 22.860921 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.623533 ControlChange 0.000000 1 2 11.924900 ControlChange 0.000000 1 4 22.823162 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.304431 ControlChange 0.000000 1 2 11.827456 ControlChange 0.000000 1 4 22.786542 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.986472 ControlChange 0.000000 1 2 11.731002 ControlChange 0.000000 1 4 22.751147 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.675778 ControlChange 0.000000 1 2 11.635635 ControlChange 0.000000 1 4 22.717039 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.381915 ControlChange 0.000000 1 2 11.541446 ControlChange 0.000000 1 4 22.684262 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.121439 ControlChange 0.000000 1 2 11.448526 ControlChange 0.000000 1 4 22.652841 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.921343 ControlChange 0.000000 1 2 11.356961 ControlChange 0.000000 1 4 22.622788 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.780498 ControlChange 0.000000 1 2 11.266834 ControlChange 0.000000 1 4 22.594100 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.603127 ControlChange 0.000000 1 2 11.178226 ControlChange 0.000000 1 4 22.566763 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.288130 ControlChange 0.000000 1 2 11.091214 ControlChange 0.000000 1 4 22.540756 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.832050 ControlChange 0.000000 1 2 11.005872 ControlChange 0.000000 1 4 22.516052 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.267259 ControlChange 0.000000 1 2 10.922273 ControlChange 0.000000 1 4 22.492618 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.617660 ControlChange 0.000000 1 2 10.840486 ControlChange 0.000000 1 4 22.470417 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.899345 ControlChange 0.000000 1 2 10.760577 ControlChange 0.000000 1 4 22.449409 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.123856 ControlChange 0.000000 1 2 10.682613 ControlChange 0.000000 1 4 22.429556 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 31.299767 ControlChange 0.000000 1 2 10.606653 ControlChange 0.000000 1 4 22.410816 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.433704 ControlChange 0.000000 1 2 10.532759 ControlChange 0.000000 1 4 22.393148 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.530841 ControlChange 0.000000 1 2 10.460989 ControlChange 0.000000 1 4 22.376511 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.595385 ControlChange 0.000000 1 2 10.391399 ControlChange 0.000000 1 4 22.360866 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.630791 ControlChange 0.000000 1 2 10.324044 ControlChange 0.000000 1 4 22.346174 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.639910 ControlChange 0.000000 1 2 10.258975 ControlChange 0.000000 1 4 22.332396 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.625153 ControlChange 0.000000 1 2 10.196243 ControlChange 0.000000 1 4 22.319496 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.588606 ControlChange 0.000000 1 2 10.135897 ControlChange 0.000000 1 4 22.307439 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.532054 ControlChange 0.000000 1 2 10.077983 ControlChange 0.000000 1 4 22.296191 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.457023 ControlChange 0.000000 1 2 10.022546 ControlChange 0.000000 1 4 22.285721 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.364881 ControlChange 0.000000 1 2 9.969629 ControlChange 0.000000 1 4 22.275996 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 20.256843 ControlChange 0.000000 1 2 9.919276 ControlChange 0.000000 1 4 22.266988 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 19.133973 ControlChange 0.000000 1 2 9.871528 ControlChange 0.000000 1 4 22.258669 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 17.997230 ControlChange 0.000000 1 2 9.826424 ControlChange 0.000000 1 4 22.251012 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 16.847501 ControlChange 0.000000 1 2 9.784001 ControlChange 0.000000 1 4 22.243991 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 15.685600 ControlChange 0.000000 1 2 9.744297 ControlChange 0.000000 1 4 22.237582 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.512273 ControlChange 0.000000 1 2 9.707346 ControlChange 0.000000 1 4 22.231762 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 13.328224 ControlChange 0.000000 1 2 9.673184 ControlChange 0.000000 1 4 22.226510 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 12.134137 ControlChange 0.000000 1 2 9.641842 ControlChange 0.000000 1 4 22.221803 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.930696 ControlChange 0.000000 1 2 9.613354 ControlChange 0.000000 1 4 22.217623 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 9.718603 ControlChange 0.000000 1 2 9.587750 ControlChange 0.000000 1 4 22.213950 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 8.498618 ControlChange 0.000000 1 2 9.565058 ControlChange 0.000000 1 4 22.210767 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 7.271625 ControlChange 0.000000 1 2 9.545308 ControlChange 0.000000 1 4 22.208056 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 6.038757 ControlChange 0.000000 1 2 9.528531 ControlChange 0.000000 1 4 22.205802 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 4.801659 ControlChange 0.000000 1 2 9.514749 ControlChange 0.000000 1 4 22.203988 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 3.563161 ControlChange 0.000000 1 2 9.503988 ControlChange 0.000000 1 4 22.202600 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 2.331167 ControlChange 0.000000 1 2 9.496274 ControlChange 0.000000 1 4 22.201623 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 1.142072 ControlChange 0.000000 1 2 9.492081 ControlChange 0.000000 1 4 22.201077 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 0.086893 ControlChange 0.000000 1 2 9.496267 ControlChange 0.000000 1 4 22.201298 ControlChange 0.000000 1 101 400.591757 ControlChange 0.004167 1 100 0.848151 ControlChange 0.000000 1 2 9.520278 ControlChange 0.000000 1 4 22.203100 ControlChange 0.000000 1 101 490.167475 ControlChange 0.004167 1 100 1.883686 ControlChange 0.000000 1 2 9.569167 ControlChange 0.000000 1 4 22.206847 ControlChange 0.000000 1 101 685.818833 ControlChange 0.004167 1 100 3.033364 ControlChange 0.000000 1 2 9.637694 ControlChange 0.000000 1 4 22.212143 ControlChange 0.000000 1 101 775.394551 ControlChange 0.004167 1 100 4.229894 ControlChange 0.000000 1 2 9.719732 ControlChange 0.000000 1 4 22.218515 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 5.446720 ControlChange 0.000000 1 2 9.811567 ControlChange 0.000000 1 4 22.225662 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 6.672528 ControlChange 0.000000 1 2 9.910900 ControlChange 0.000000 1 4 22.233395 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 7.900658 ControlChange 0.000000 1 2 10.016183 ControlChange 0.000000 1 4 22.241581 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 9.126541 ControlChange 0.000000 1 2 10.126309 ControlChange 0.000000 1 4 22.250124 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 10.346701 ControlChange 0.000000 1 2 10.240457 ControlChange 0.000000 1 4 22.258951 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 11.558246 ControlChange 0.000000 1 2 10.357991 ControlChange 0.000000 1 4 22.268004 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 12.758584 ControlChange 0.000000 1 2 10.478404 ControlChange 0.000000 1 4 22.277237 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 13.945274 ControlChange 0.000000 1 2 10.601283 ControlChange 0.000000 1 4 22.286609 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 15.115875 ControlChange 0.000000 1 2 10.726289 ControlChange 0.000000 1 4 22.296087 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 16.267835 ControlChange 0.000000 1 2 10.853135 ControlChange 0.000000 1 4 22.305642 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 17.398399 ControlChange 0.000000 1 2 10.981576 ControlChange 0.000000 1 4 22.315248 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 18.504503 ControlChange 0.000000 1 2 11.111397 ControlChange 0.000000 1 4 22.324880 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 19.582641 ControlChange 0.000000 1 2 11.242410 ControlChange 0.000000 1 4 22.334517 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 20.628695 ControlChange 0.000000 1 2 11.374447 ControlChange 0.000000 1 4 22.344137 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 21.637698 ControlChange 0.000000 1 2 11.507357 ControlChange 0.000000 1 4 22.353721 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 22.603549 ControlChange 0.000000 1 2 11.641001 ControlChange 0.000000 1 4 22.363248 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 23.518551 ControlChange 0.000000 1 2 11.775249 ControlChange 0.000000 1 4 22.372699 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 24.372562 ControlChange 0.000000 1 2 11.909982 ControlChange 0.000000 1 4 22.382053 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 25.151810 ControlChange 0.000000 1 2 12.045085 ControlChange 0.000000 1 4 22.391289 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 25.836669 ControlChange 0.000000 1 2 12.180450 ControlChange 0.000000 1 4 22.400387 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.397017 ControlChange 0.000000 1 2 12.315969 ControlChange 0.000000 1 4 22.409321 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.787257 ControlChange 0.000000 1 2 12.451540 ControlChange 0.000000 1 4 22.418069 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.977395 ControlChange 0.000000 1 2 12.587058 ControlChange 0.000000 1 4 22.426601 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.024247 ControlChange 0.000000 1 2 12.722419 ControlChange 0.000000 1 4 22.434887 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.026883 ControlChange 0.000000 1 2 12.857516 ControlChange 0.000000 1 4 22.442893 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.025153 ControlChange 0.000000 1 2 12.992241 ControlChange 0.000000 1 4 22.450580 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.022706 ControlChange 0.000000 1 2 13.126479 ControlChange 0.000000 1 4 22.457901 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.019528 ControlChange 0.000000 1 2 13.260111 ControlChange 0.000000 1 4 22.464803 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.015605 ControlChange 0.000000 1 2 13.393007 ControlChange 0.000000 1 4 22.471221 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.010922 ControlChange 0.000000 1 2 13.525029 ControlChange 0.000000 1 4 22.477076 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 27.005468 ControlChange 0.000000 1 2 13.656024 ControlChange 0.000000 1 4 22.482269 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.999230 ControlChange 0.000000 1 2 13.785824 ControlChange 0.000000 1 4 22.486673 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.992198 ControlChange 0.000000 1 2 13.914242 ControlChange 0.000000 1 4 22.490119 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.984363 ControlChange 0.000000 1 2 14.041063 ControlChange 0.000000 1 4 22.492371 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.975717 ControlChange 0.000000 1 2 14.166041 ControlChange 0.000000 1 4 22.493079 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.966256 ControlChange 0.000000 1 2 14.288890 ControlChange 0.000000 1 4 22.491848 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.955977 ControlChange 0.000000 1 2 14.409269 ControlChange 0.000000 1 4 22.488551 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.944880 ControlChange 0.000000 1 2 14.526767 ControlChange 0.000000 1 4 22.483339 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.932967 ControlChange 0.000000 1 2 14.640876 ControlChange 0.000000 1 4 22.476431 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.920245 ControlChange 0.000000 1 2 14.750960 ControlChange 0.000000 1 4 22.468017 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.906725 ControlChange 0.000000 1 2 14.856196 ControlChange 0.000000 1 4 22.458256 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.892420 ControlChange 0.000000 1 2 14.955480 ControlChange 0.000000 1 4 22.447285 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.877349 ControlChange 0.000000 1 2 15.047262 ControlChange 0.000000 1 4 22.435225 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.861535 ControlChange 0.000000 1 2 15.129245 ControlChange 0.000000 1 4 22.422179 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.845009 ControlChange 0.000000 1 2 15.197717 ControlChange 0.000000 1 4 22.408239 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.827803 ControlChange 0.000000 1 2 15.246532 ControlChange 0.000000 1 4 22.393486 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.809956 ControlChange 0.000000 1 2 15.270157 ControlChange 0.000000 1 4 22.377994 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.791513 ControlChange 0.000000 1 2 15.272824 ControlChange 0.000000 1 4 22.361830 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.772524 ControlChange 0.000000 1 2 15.265319 ControlChange 0.000000 1 4 22.345052 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.753044 ControlChange 0.000000 1 2 15.252547 ControlChange 0.000000 1 4 22.327716 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.733134 ControlChange 0.000000 1 2 15.235320 ControlChange 0.000000 1 4 22.309873 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.712857 ControlChange 0.000000 1 2 15.213992 ControlChange 0.000000 1 4 22.291569 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.692282 ControlChange 0.000000 1 2 15.188886 ControlChange 0.000000 1 4 22.272848 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.671480 ControlChange 0.000000 1 2 15.160297 ControlChange 0.000000 1 4 22.253750 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.650525 ControlChange 0.000000 1 2 15.128498 ControlChange 0.000000 1 4 22.234314 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.629493 ControlChange 0.000000 1 2 15.093743 ControlChange 0.000000 1 4 22.214578 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.608460 ControlChange 0.000000 1 2 15.056266 ControlChange 0.000000 1 4 22.194575 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.587502 ControlChange 0.000000 1 2 15.016288 ControlChange 0.000000 1 4 22.174339 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.566693 ControlChange 0.000000 1 2 14.974017 ControlChange 0.000000 1 4 22.153903 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.546107 ControlChange 0.000000 1 2 14.929649 ControlChange 0.000000 1 4 22.133299 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.525815 ControlChange 0.000000 1 2 14.883373 ControlChange 0.000000 1 4 22.112556 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.505882 ControlChange 0.000000 1 2 14.835369 ControlChange 0.000000 1 4 22.091706 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.486371 ControlChange 0.000000 1 2 14.785811 ControlChange 0.000000 1 4 22.070779 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.467340 ControlChange 0.000000 1 2 14.734866 ControlChange 0.000000 1 4 22.049805 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.448843 ControlChange 0.000000 1 2 14.682701 ControlChange 0.000000 1 4 22.028814 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.430928 ControlChange 0.000000 1 2 14.629477 ControlChange 0.000000 1 4 22.007837 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.413636 ControlChange 0.000000 1 2 14.575354 ControlChange 0.000000 1 4 21.986906 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.397005 ControlChange 0.000000 1 2 14.520494 ControlChange 0.000000 1 4 21.966051 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.381068 ControlChange 0.000000 1 2 14.465056 ControlChange 0.000000 1 4 21.945306 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.365850 ControlChange 0.000000 1 2 14.409204 ControlChange 0.000000 1 4 21.924707 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.351375 ControlChange 0.000000 1 2 14.353103 ControlChange 0.000000 1 4 21.904288 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.337660 ControlChange 0.000000 1 2 14.296923 ControlChange 0.000000 1 4 21.884088 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.324718 ControlChange 0.000000 1 2 14.240842 ControlChange 0.000000 1 4 21.864147 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.312559 ControlChange 0.000000 1 2 14.185042 ControlChange 0.000000 1 4 21.844509 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.301187 ControlChange 0.000000 1 2 14.129719 ControlChange 0.000000 1 4 21.825221 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.290607 ControlChange 0.000000 1 2 14.075076 ControlChange 0.000000 1 4 21.806332 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.280817 ControlChange 0.000000 1 2 14.021334 ControlChange 0.000000 1 4 21.787900 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.271815 ControlChange 0.000000 1 2 13.968730 ControlChange 0.000000 1 4 21.769984 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.263595 ControlChange 0.000000 1 2 13.917524 ControlChange 0.000000 1 4 21.752654 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.256152 ControlChange 0.000000 1 2 13.867998 ControlChange 0.000000 1 4 21.735986 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.249475 ControlChange 0.000000 1 2 13.820467 ControlChange 0.000000 1 4 21.720067 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.243556 ControlChange 0.000000 1 2 13.775286 ControlChange 0.000000 1 4 21.704997 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.238382 ControlChange 0.000000 1 2 13.732854 ControlChange 0.000000 1 4 21.690890 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.233942 ControlChange 0.000000 1 2 13.693631 ControlChange 0.000000 1 4 21.677881 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.230223 ControlChange 0.000000 1 2 13.658150 ControlChange 0.000000 1 4 21.666131 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.227211 ControlChange 0.000000 1 2 13.627038 ControlChange 0.000000 1 4 21.655833 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.224893 ControlChange 0.000000 1 2 13.60 45 ControlChange 0.000000 1 4 21.647222 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.223254 ControlChange 0.000000 1 2 13.581083 ControlChange 0.000000 1 4 21.640596 ControlChange 0.000000 1 101 783.990872 ControlChange 0.004167 1 100 26.222190 ControlChange 0.000000 1 2 13.568726 ControlChange 0.000000 1 4 21.636342 ControlChange 0.000000 1 101 783.025923 ControlChange 0.004167 1 100 26.220661 ControlChange 0.000000 1 2 13.570446 ControlChange 0.000000 1 4 21.635041 ControlChange 0.000000 1 101 772.970926 ControlChange 0.004167 1 100 26.215680 ControlChange 0.000000 1 2 13.601935 ControlChange 0.000000 1 4 21.637415 ControlChange 0.000000 1 101 751.008792 ControlChange 0.004167 1 100 26.204263 ControlChange 0.000000 1 2 13.676815 ControlChange 0.000000 1 4 21.643798 ControlChange 0.000000 1 101 740.953794 ControlChange 0.004167 1 100 26.185396 ControlChange 0.000000 1 2 13.797113 ControlChange 0.000000 1 4 21.653997 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 26.159022 ControlChange 0.000000 1 2 13.959307 ControlChange 0.000000 1 4 21.667617 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 26.125217 ControlChange 0.000000 1 2 14.158902 ControlChange 0.000000 1 4 21.684241 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 26.084100 ControlChange 0.000000 1 2 14.390921 ControlChange 0.000000 1 4 21.703448 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 26.035846 ControlChange 0.000000 1 2 14.649918 ControlChange 0.000000 1 4 21.724811 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.980697 ControlChange 0.000000 1 2 14.930001 ControlChange 0.000000 1 4 21.747901 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.918962 ControlChange 0.000000 1 2 15.224826 ControlChange 0.000000 1 4 21.772285 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.85 23 ControlChange 0.000000 1 2 15.527642 ControlChange 0.000000 1 4 21.797530 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.777355 ControlChange 0.000000 1 2 15.831327 ControlChange 0.000000 1 4 21.823201 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.698528 ControlChange 0.000000 1 2 16.128439 ControlChange 0.000000 1 4 21.848863 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.615211 ControlChange 0.000000 1 2 16.411286 ControlChange 0.000000 1 4 21.874081 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.528185 ControlChange 0.000000 1 2 16.671991 ControlChange 0.000000 1 4 21.898421 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.438346 ControlChange 0.000000 1 2 16.902566 ControlChange 0.000000 1 4 21.921452 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.346701 ControlChange 0.000000 1 2 17.094997 ControlChange 0.000000 1 4 21.942746 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.254373 ControlChange 0.000000 1 2 17.241331 ControlChange 0.000000 1 4 21.961877 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.162593 ControlChange 0.000000 1 2 17.334186 ControlChange 0.000000 1 4 21.978424 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 25.072689 ControlChange 0.000000 1 2 17.370944 ControlChange 0.000000 1 4 21.991972 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.986075 ControlChange 0.000000 1 2 17.359934 ControlChange 0.000000 1 4 22.002110 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.904228 ControlChange 0.000000 1 2 17.313488 ControlChange 0.000000 1 4 22.008334 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.828665 ControlChange 0.000000 1 2 17.237598 ControlChange 0.000000 1 4 22.009125 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.760918 ControlChange 0.000000 1 2 17.134458 ControlChange 0.000000 1 4 22.000928 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.702499 ControlChange 0.000000 1 2 17.005675 ControlChange 0.000000 1 4 21.980571 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.654872 ControlChange 0.000000 1 2 16.852635 ControlChange 0.000000 1 4 21.947443 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.619430 ControlChange 0.000000 1 2 16.676545 ControlChange 0.000000 1 4 21.902336 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.587085 ControlChange 0.000000 1 2 16.478503 ControlChange 0.000000 1 4 21.846509 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 24.445726 ControlChange 0.000000 1 2 16.259427 ControlChange 0.000000 1 4 21.781581 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 23.9 406 ControlChange 0.000000 1 2 16.020125 ControlChange 0.000000 1 4 21.709534 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 22.805705 ControlChange 0.000000 1 2 15.761271 ControlChange 0.000000 1 4 21.632679 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 21.202622 ControlChange 0.000000 1 2 15.483411 ControlChange 0.000000 1 4 21.553594 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 19.224187 ControlChange 0.000000 1 2 15.186960 ControlChange 0.000000 1 4 21.475030 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 16.954654 ControlChange 0.000000 1 2 14.872199 ControlChange 0.000000 1 4 21.399784 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 14.450467 ControlChange 0.000000 1 2 14.539235 ControlChange 0.000000 1 4 21.330578 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 11.752908 ControlChange 0.000000 1 2 14.187934 ControlChange 0.000000 1 4 21.269940 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 8.895574 ControlChange 0.000000 1 2 13.817810 ControlChange 0.000000 1 4 21.220109 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 5.918412 ControlChange 0.000000 1 2 13.427662 ControlChange 0.000000 1 4 21.182967 ControlChange 0.000000 1 101 739.988845 ControlChange 0.004167 1 100 2.949801 ControlChange 0.000000 1 2 13.024817 ControlChange 0.000000 1 4 21.159872 ControlChange 0.000000 1 101 736.641081 ControlChange 0.004167 1 100 0.405684 ControlChange 0.000000 1 2 12.702120 ControlChange 0.000000 1 4 21.150614 ControlChange 0.000000 1 101 701.756574 ControlChange 0.004167 1 100 1.433489 ControlChange 0.000000 1 2 12.589668 ControlChange 0.000000 1 4 21.152028 ControlChange 0.000000 1 101 625.561807 ControlChange 0.004167 1 100 3.149425 ControlChange 0.000000 1 2 12.573257 ControlChange 0.000000 1 4 21.160338 ControlChange 0.000000 1 101 590.677300 ControlChange 0.004167 1 100 4.980986 ControlChange 0.000000 1 2 12.562168 ControlChange 0.000000 1 4 21.173875 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 6.868587 ControlChange 0.000000 1 2 12.546809 ControlChange 0.000000 1 4 21.192095 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 8.781838 ControlChange 0.000000 1 2 12.527293 ControlChange 0.000000 1 4 21.214593 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 10.708255 ControlChange 0.000000 1 2 12.503744 ControlChange 0.000000 1 4 21.240996 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 12.640364 ControlChange 0.000000 1 2 12.476294 ControlChange 0.000000 1 4 21.270960 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 14.572875 ControlChange 0.000000 1 2 12.445084 ControlChange 0.000000 1 4 21.304166 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 16.501544 ControlChange 0.000000 1 2 12.4 272 ControlChange 0.000000 1 4 21.340316 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 18.422573 ControlChange 0.000000 1 2 12.372022 ControlChange 0.000000 1 4 21.379129 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 20.332219 ControlChange 0.000000 1 2 12.330510 ControlChange 0.000000 1 4 21.420338 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 22.226508 ControlChange 0.000000 1 2 12.285925 ControlChange 0.000000 1 4 21.463691 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.100895 ControlChange 0.000000 1 2 12.238470 ControlChange 0.000000 1 4 21.508946 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.949801 ControlChange 0.000000 1 2 12.188356 ControlChange 0.000000 1 4 21.555872 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.765975 ControlChange 0.000000 1 2 12.135812 ControlChange 0.000000 1 4 21.604246 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.539369 ControlChange 0.000000 1 2 12.081080 ControlChange 0.000000 1 4 21.653847 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 31.254825 ControlChange 0.000000 1 2 12.024415 ControlChange 0.000000 1 4 21.704463 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 32.886751 ControlChange 0.000000 1 2 11.966088 ControlChange 0.000000 1 4 21.755883 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.381256 ControlChange 0.000000 1 2 11.906383 ControlChange 0.000000 1 4 21.807901 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.605273 ControlChange 0.000000 1 2 11.845599 ControlChange 0.000000 1 4 21.860309 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.401803 ControlChange 0.000000 1 2 11.784054 ControlChange 0.000000 1 4 21.912901 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.902217 ControlChange 0.000000 1 2 11.722077 ControlChange 0.000000 1 4 21.965467 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.441768 ControlChange 0.000000 1 2 11.660017 ControlChange 0.000000 1 4 22.017796 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.089634 ControlChange 0.000000 1 2 11.598236 ControlChange 0.000000 1 4 22.069671 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.789663 ControlChange 0.000000 1 2 11.537115 ControlChange 0.000000 1 4 22.120872 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.508890 ControlChange 0.000000 1 2 11.477046 ControlChange 0.000000 1 4 22.171170 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.229628 ControlChange 0.000000 1 2 11.418442 ControlChange 0.000000 1 4 22.220326 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.940187 ControlChange 0.000000 1 2 11.361730 ControlChange 0.000000 1 4 22.268092 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.631718 ControlChange 0.000000 1 2 11.307351 ControlChange 0.000000 1 4 22.314206 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.296809 ControlChange 0.000000 1 2 11.255764 ControlChange 0.000000 1 4 22.358390 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.928693 ControlChange 0.000000 1 2 11.207440 ControlChange 0.000000 1 4 22.400346 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 43.520721 ControlChange 0.000000 1 2 11.162865 ControlChange 0.000000 1 4 22.439758 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.065989 ControlChange 0.000000 1 2 11.122537 ControlChange 0.000000 1 4 22.476284 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.557065 ControlChange 0.000000 1 2 11.086966 ControlChange 0.000000 1 4 22.509547 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.985602 ControlChange 0.000000 1 2 11.056678 ControlChange 0.000000 1 4 22.539139 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.341823 ControlChange 0.000000 1 2 11.032205 ControlChange 0.000000 1 4 22.564607 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.614030 ControlChange 0.000000 1 2 11.014089 ControlChange 0.000000 1 4 22.585450 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.788330 ControlChange 0.000000 1 2 11.006086 ControlChange 0.000000 1 4 22.601 2 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.851928 ControlChange 0.000000 1 2 11.038969 ControlChange 0.000000 1 4 22.610997 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.802422 ControlChange 0.000000 1 2 11.153054 ControlChange 0.000000 1 4 22.615236 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.648724 ControlChange 0.000000 1 2 11.307934 ControlChange 0.000000 1 4 22.615522 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.400240 ControlChange 0.000000 1 2 11.468761 ControlChange 0.000000 1 4 22.613866 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 45.064337 ControlChange 0.000000 1 2 11.629246 ControlChange 0.000000 1 4 22.610994 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.647594 ControlChange 0.000000 1 2 11.788167 ControlChange 0.000000 1 4 22.606969 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.156150 ControlChange 0.000000 1 2 11.944306 ControlChange 0.000000 1 4 22.601793 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 43.595972 ControlChange 0.000000 1 2 12.095044 ControlChange 0.000000 1 4 22.595467 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.972876 ControlChange 0.000000 1 2 12.227121 ControlChange 0.000000 1 4 22.587998 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 42.292789 ControlChange 0.000000 1 2 12.277638 ControlChange 0.000000 1 4 22.579396 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.562060 ControlChange 0.000000 1 2 12.147355 ControlChange 0.000000 1 4 22.569674 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.787929 ControlChange 0.000000 1 2 11.843847 ControlChange 0.000000 1 4 22.558849 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.979351 ControlChange 0.000000 1 2 11.449446 ControlChange 0.000000 1 4 22.546943 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.148596 ControlChange 0.000000 1 2 11.030252 ControlChange 0.000000 1 4 22.533981 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.314987 ControlChange 0.000000 1 2 10.619505 ControlChange 0.000000 1 4 22.519997 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.516834 ControlChange 0.000000 1 2 10.230815 ControlChange 0.000000 1 4 22.505027 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.837925 ControlChange 0.000000 1 2 9.868666 ControlChange 0.000000 1 4 22.489116 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.326432 ControlChange 0.000000 1 2 9.533615 ControlChange 0.000000 1 4 22.472312 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.791131 ControlChange 0.000000 1 2 9.224610 ControlChange 0.000000 1 4 22.454673 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.011618 ControlChange 0.000000 1 2 8.940021 ControlChange 0.000000 1 4 22.436262 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.014962 ControlChange 0.000000 1 2 8.678082 ControlChange 0.000000 1 4 22.417150 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 32.888739 ControlChange 0.000000 1 2 8.437054 ControlChange 0.000000 1 4 22.397418 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 31.677775 ControlChange 0.000000 1 2 8.215327 ControlChange 0.000000 1 4 22.377149 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 30.405439 ControlChange 0.000000 1 2 8.011437 ControlChange 0.000000 1 4 22.356440 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.086029 ControlChange 0.000000 1 2 7.824062 ControlChange 0.000000 1 4 22.335392 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.729113 ControlChange 0.000000 1 2 7.652021 ControlChange 0.000000 1 4 22.314113 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.341552 ControlChange 0.000000 1 2 7.494251 ControlChange 0.000000 1 4 22.292720 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.928486 ControlChange 0.000000 1 2 7.349795 ControlChange 0.000000 1 4 22.271336 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.493894 ControlChange 0.000000 1 2 7.217794 ControlChange 0.000000 1 4 22.250088 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 22.041002 ControlChange 0.000000 1 2 7.097474 ControlChange 0.000000 1 4 22.229111 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 20.572488 ControlChange 0.000000 1 2 6.988136 ControlChange 0.000000 1 4 22.208542 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 19.090619 ControlChange 0.000000 1 2 6.889149 ControlChange 0.000000 1 4 22.188522 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 17.597420 ControlChange 0.000000 1 2 6.799948 ControlChange 0.000000 1 4 22.169192 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 16.094745 ControlChange 0.000000 1 2 6.720005 ControlChange 0.000000 1 4 22.150696 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 14.584347 ControlChange 0.000000 1 2 6.648841 ControlChange 0.000000 1 4 22.133175 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 13.067989 ControlChange 0.000000 1 2 6.586006 ControlChange 0.000000 1 4 22.116771 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 11.547536 ControlChange 0.000000 1 2 6.531101 ControlChange 0.000000 1 4 22.101617 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 10.025088 ControlChange 0.000000 1 2 6.483750 ControlChange 0.000000 1 4 22.087847 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 8.503194 ControlChange 0.000000 1 2 6.443611 ControlChange 0.000000 1 4 22.075585 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 6.985233 ControlChange 0.000000 1 2 6.410375 ControlChange 0.000000 1 4 22.064950 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 5.476196 ControlChange 0.000000 1 2 6.383744 ControlChange 0.000000 1 4 22.056051 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 3.984683 ControlChange 0.000000 1 2 6.363431 ControlChange 0.000000 1 4 22.048988 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 2.532321 ControlChange 0.000000 1 2 6.349185 ControlChange 0.000000 1 4 22.043854 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 1.128921 ControlChange 0.000000 1 2 6.342366 ControlChange 0.000000 1 4 22.040648 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 0.726424 ControlChange 0.000000 1 2 6.360778 ControlChange 0.000000 1 4 22.038527 ControlChange 0.000000 1 101 585.280293 ControlChange 0.004167 1 100 3.950250 ControlChange 0.000000 1 2 6.455878 ControlChange 0.000000 1 4 22.034983 ControlChange 0.000000 1 101 563.926693 ControlChange 0.004167 1 100 8.024232 ControlChange 0.000000 1 2 6.676755 ControlChange 0.000000 1 4 22.027776 ControlChange 0.000000 1 101 517.286144 ControlChange 0.004167 1 100 12.254138 ControlChange 0.000000 1 2 7.036355 ControlChange 0.000000 1 4 22.016617 ControlChange 0.000000 1 101 495.932544 ControlChange 0.004167 1 100 16.431172 ControlChange 0.000000 1 2 7.530850 ControlChange 0.000000 1 4 22.002095 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 20.496150 ControlChange 0.000000 1 2 8.154266 ControlChange 0.000000 1 4 21.984868 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.404576 ControlChange 0.000000 1 2 8.899284 ControlChange 0.000000 1 4 21.965593 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.101861 ControlChange 0.000000 1 2 9.754734 ControlChange 0.000000 1 4 21.944943 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.506618 ControlChange 0.000000 1 2 10.693660 ControlChange 0.000000 1 4 21.923633 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.474211 ControlChange 0.000000 1 2 11.615994 ControlChange 0.000000 1 4 21.902438 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.732235 ControlChange 0.000000 1 2 12.274393 ControlChange 0.000000 1 4 21.882234 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.108689 ControlChange 0.000000 1 2 12.527174 ControlChange 0.000000 1 4 21.864041 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 39.055485 ControlChange 0.000000 1 2 12.634042 ControlChange 0.000000 1 4 21.849094 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 40.117943 ControlChange 0.000000 1 2 12.746392 ControlChange 0.000000 1 4 21.838817 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 41.260000 ControlChange 0.000000 1 2 12.869932 ControlChange 0.000000 1 4 21.833667 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.308204 ControlChange 0.000000 1 2 12.999404 ControlChange 0.000000 1 4 21.831260 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 43.196003 ControlChange 0.000000 1 2 13.131749 ControlChange 0.000000 1 4 21.828329 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 43.907996 ControlChange 0.000000 1 2 13.264485 ControlChange 0.000000 1 4 21.823663 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 44.446200 ControlChange 0.000000 1 2 13.394821 ControlChange 0.000000 1 4 21.817188 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 44.818866 ControlChange 0.000000 1 2 13.517983 ControlChange 0.000000 1 4 21.808952 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 45.034198 ControlChange 0.000000 1 2 13.618492 ControlChange 0.000000 1 4 21.799017 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 45.079951 ControlChange 0.000000 1 2 13.638342 ControlChange 0.000000 1 4 21.787456 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 44.903551 ControlChange 0.000000 1 2 13.483208 ControlChange 0.000000 1 4 21.774353 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 44.461657 ControlChange 0.000000 1 2 13.137381 ControlChange 0.000000 1 4 21.759808 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 43.758680 ControlChange 0.000000 1 2 12.666923 ControlChange 0.000000 1 4 21.743936 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.818375 ControlChange 0.000000 1 2 12.141707 ControlChange 0.000000 1 4 21.726868 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 41.665711 ControlChange 0.000000 1 2 11.607288 ControlChange 0.000000 1 4 21.708753 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 40.336762 ControlChange 0.000000 1 2 11.089862 ControlChange 0.000000 1 4 21.689758 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.935183 ControlChange 0.000000 1 2 10.603483 ControlChange 0.000000 1 4 21.670067 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 37.642873 ControlChange 0.000000 1 2 10.155047 ControlChange 0.000000 1 4 21.649884 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.339139 ControlChange 0.000000 1 2 9.747358 ControlChange 0.000000 1 4 21.629430 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.526840 ControlChange 0.000000 1 2 9.380935 ControlChange 0.000000 1 4 21.608946 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 32.198004 ControlChange 0.000000 1 2 9.055071 ControlChange 0.000000 1 4 21.588689 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.547204 ControlChange 0.000000 1 2 8.768364 ControlChange 0.000000 1 4 21.568931 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.680592 ControlChange 0.000000 1 2 8.519067 ControlChange 0.000000 1 4 21.549960 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.654164 ControlChange 0.000000 1 2 8.305345 ControlChange 0.000000 1 4 21.532075 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 20.502174 ControlChange 0.000000 1 2 8.125347 ControlChange 0.000000 1 4 21.515583 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 17.247488 ControlChange 0.000000 1 2 7.977288 ControlChange 0.000000 1 4 21.500797 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 13.906434 ControlChange 0.000000 1 2 7.859440 ControlChange 0.000000 1 4 21.488033 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 10.491486 ControlChange 0.000000 1 2 7.770191 ControlChange 0.000000 1 4 21.477603 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 7.015225 ControlChange 0.000000 1 2 7.708017 ControlChange 0.000000 1 4 21.469815 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 3.547839 ControlChange 0.000000 1 2 7.671610 ControlChange 0.000000 1 4 21.465287 ControlChange 0.000000 1 101 494.527327 ControlChange 0.004167 1 100 0.520345 ControlChange 0.000000 1 2 7.66 46 ControlChange 0.000000 1 4 21.467882 ControlChange 0.000000 1 101 501.238233 ControlChange 0.004167 1 100 1.611201 ControlChange 0.000000 1 2 7.679434 ControlChange 0.000000 1 4 21.487894 ControlChange 0.000000 1 101 515.896199 ControlChange 0.004167 1 100 3.479007 ControlChange 0.000000 1 2 7.730753 ControlChange 0.000000 1 4 21.534418 ControlChange 0.000000 1 101 522.607105 ControlChange 0.004167 1 100 5.416339 ControlChange 0.000000 1 2 7.817130 ControlChange 0.000000 1 4 21.608761 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 7.390057 ControlChange 0.000000 1 2 7.939588 ControlChange 0.000000 1 4 21.708733 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 9.376750 ControlChange 0.000000 1 2 8.098802 ControlChange 0.000000 1 4 21.831877 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 11.366843 ControlChange 0.000000 1 2 8.295234 ControlChange 0.000000 1 4 21.975808 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 13.354281 ControlChange 0.000000 1 2 8.528999 ControlChange 0.000000 1 4 22.138195 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 15.334401 ControlChange 0.000000 1 2 8.799760 ControlChange 0.000000 1 4 22.316772 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 17.303040 ControlChange 0.000000 1 2 9.106673 ControlChange 0.000000 1 4 22.509349 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 19.256019 ControlChange 0.000000 1 2 9.448220 ControlChange 0.000000 1 4 22.713799 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 21.188682 ControlChange 0.000000 1 2 9.822084 ControlChange 0.000000 1 4 22.928047 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 23.095434 ControlChange 0.000000 1 2 10.225056 ControlChange 0.000000 1 4 23.150081 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 24.969092 ControlChange 0.000000 1 2 10.652984 ControlChange 0.000000 1 4 23.377947 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 26.799665 ControlChange 0.000000 1 2 11.100703 ControlChange 0.000000 1 4 23.609750 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 28.572082 ControlChange 0.000000 1 2 11.562054 ControlChange 0.000000 1 4 23.843646 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 30.260851 ControlChange 0.000000 1 2 12.029997 ControlChange 0.000000 1 4 24.077846 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 31.811690 ControlChange 0.000000 1 2 12.496796 ControlChange 0.000000 1 4 24.310616 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 33.084723 ControlChange 0.000000 1 2 12.954283 ControlChange 0.000000 1 4 24.540272 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 33.881367 ControlChange 0.000000 1 2 13.394184 ControlChange 0.000000 1 4 24.765177 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 34.291303 ControlChange 0.000000 1 2 13.808457 ControlChange 0.000000 1 4 24.983744 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 34.733847 ControlChange 0.000000 1 2 14.189644 ControlChange 0.000000 1 4 25.194432 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 35.373478 ControlChange 0.000000 1 2 14.531163 ControlChange 0.000000 1 4 25.395747 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 36.179575 ControlChange 0.000000 1 2 14.827475 ControlChange 0.000000 1 4 25.586238 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.108283 ControlChange 0.000000 1 2 15.074247 ControlChange 0.000000 1 4 25.764498 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 38.122602 ControlChange 0.000000 1 2 15.268343 ControlChange 0.000000 1 4 25.929165 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.191151 ControlChange 0.000000 1 2 15.407755 ControlChange 0.000000 1 4 26.078919 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 40.287223 ControlChange 0.000000 1 2 15.497701 ControlChange 0.000000 1 4 26.212484 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 41.387971 ControlChange 0.000000 1 2 15.598881 ControlChange 0.000000 1 4 26.328612 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 42.473764 ControlChange 0.000000 1 2 15.814675 ControlChange 0.000000 1 4 26.426087 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 43.527678 ControlChange 0.000000 1 2 16.111698 ControlChange 0.000000 1 4 26.503753 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 44.535111 ControlChange 0.000000 1 2 16.407488 ControlChange 0.000000 1 4 26.560480 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 45.483401 ControlChange 0.000000 1 2 16.642642 ControlChange 0.000000 1 4 26.595408 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 46.361554 ControlChange 0.000000 1 2 16.763463 ControlChange 0.000000 1 4 26.610338 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 47.160078 ControlChange 0.000000 1 2 16.757688 ControlChange 0.000000 1 4 26.612623 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 47.870623 ControlChange 0.000000 1 2 16.668931 ControlChange 0.000000 1 4 26.610046 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 48.485980 ControlChange 0.000000 1 2 16.526968 ControlChange 0.000000 1 4 26.605318 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 48.999864 ControlChange 0.000000 1 2 16.343649 ControlChange 0.000000 1 4 26.598653 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 49.406742 ControlChange 0.000000 1 2 16.128588 ControlChange 0.000000 1 4 26.590025 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 49.701912 ControlChange 0.000000 1 2 15.890570 ControlChange 0.000000 1 4 26.579412 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 49.881072 ControlChange 0.000000 1 2 15.637176 ControlChange 0.000000 1 4 26.566799 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 49.938598 ControlChange 0.000000 1 2 15.374660 ControlChange 0.000000 1 4 26.552176 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 49.869148 ControlChange 0.000000 1 2 15.107999 ControlChange 0.000000 1 4 26.535540 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 49.678292 ControlChange 0.000000 1 2 14.841050 ControlChange 0.000000 1 4 26.516894 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 49.381410 ControlChange 0.000000 1 2 14.576726 ControlChange 0.000000 1 4 26.496252 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 48.994094 ControlChange 0.000000 1 2 14.317179 ControlChange 0.000000 1 4 26.473635 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 48.528707 ControlChange 0.000000 1 2 14.063965 ControlChange 0.000000 1 4 26.449075 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 47.995016 ControlChange 0.000000 1 2 13.818177 ControlChange 0.000000 1 4 26.422618 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 47.400953 ControlChange 0.000000 1 2 13.580554 ControlChange 0.000000 1 4 26.394320 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 46.753101 ControlChange 0.000000 1 2 13.351571 ControlChange 0.000000 1 4 26.364251 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 46.057124 ControlChange 0.000000 1 2 13.131502 ControlChange 0.000000 1 4 26.332494 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 45.318025 ControlChange 0.000000 1 2 12.920477 ControlChange 0.000000 1 4 26.299148 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 44.540368 ControlChange 0.000000 1 2 12.718512 ControlChange 0.000000 1 4 26.264328 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 43.728697 ControlChange 0.000000 1 2 12.525543 ControlChange 0.000000 1 4 26.228160 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 42.888111 ControlChange 0.000000 1 2 12.341447 ControlChange 0.000000 1 4 26.190789 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 42.025546 ControlChange 0.000000 1 2 12.166065 ControlChange 0.000000 1 4 26.152371 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 41.156050 ControlChange 0.000000 1 2 11.999213 ControlChange 0.000000 1 4 26.113074 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 40.335998 ControlChange 0.000000 1 2 11.840683 ControlChange 0.000000 1 4 26.073079 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.698914 ControlChange 0.000000 1 2 11.690258 ControlChange 0.000000 1 4 26.032577 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.244411 ControlChange 0.000000 1 2 11.547712 ControlChange 0.000000 1 4 25.991764 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 38.665123 ControlChange 0.000000 1 2 11.412819 ControlChange 0.000000 1 4 25.950842 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.855313 ControlChange 0.000000 1 2 11.285351 ControlChange 0.000000 1 4 25.910018 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 36.865401 ControlChange 0.000000 1 2 11.165086 ControlChange 0.000000 1 4 25.869494 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 35.738761 ControlChange 0.000000 1 2 11.051810 ControlChange 0.000000 1 4 25.829473 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 34.503718 ControlChange 0.000000 1 2 10.945311 ControlChange 0.000000 1 4 25.790151 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 33.180036 ControlChange 0.000000 1 2 10.845382 ControlChange 0.000000 1 4 25.751715 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 31.782174 ControlChange 0.000000 1 2 10.751820 ControlChange 0.000000 1 4 25.714346 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 30.321256 ControlChange 0.000000 1 2 10.664434 ControlChange 0.000000 1 4 25.678208 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 28.806018 ControlChange 0.000000 1 2 10.583035 ControlChange 0.000000 1 4 25.643455 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 27.243490 ControlChange 0.000000 1 2 10.507451 ControlChange 0.000000 1 4 25.6 226 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 25.639499 ControlChange 0.000000 1 2 10.437510 ControlChange 0.000000 1 4 25.578646 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 23.998988 ControlChange 0.000000 1 2 10.373040 ControlChange 0.000000 1 4 25.548824 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 22.326241 ControlChange 0.000000 1 2 10.313884 ControlChange 0.000000 1 4 25.520853 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 20.625064 ControlChange 0.000000 1 2 10.259897 ControlChange 0.000000 1 4 25.494813 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 18.898936 ControlChange 0.000000 1 2 10.210929 ControlChange 0.000000 1 4 25.470767 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 17.151138 ControlChange 0.000000 1 2 10.166839 ControlChange 0.000000 1 4 25.448767 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 15.384891 ControlChange 0.000000 1 2 10.127498 ControlChange 0.000000 1 4 25.428852 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 13.603538 ControlChange 0.000000 1 2 10.092771 ControlChange 0.000000 1 4 25.41 49 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 11.810727 ControlChange 0.000000 1 2 10.062531 ControlChange 0.000000 1 4 25.395373 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 10.010777 ControlChange 0.000000 1 2 10.036665 ControlChange 0.000000 1 4 25.381829 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 8.209265 ControlChange 0.000000 1 2 10.015056 ControlChange 0.000000 1 4 25.370419 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 6.414248 ControlChange 0.000000 1 2 9.997601 ControlChange 0.000000 1 4 25.361130 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 4.639364 ControlChange 0.000000 1 2 9.984187 ControlChange 0.000000 1 4 25.353947 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 2.917609 ControlChange 0.000000 1 2 9.974710 ControlChange 0.000000 1 4 25.348848 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 1.296915 ControlChange 0.000000 1 2 9.969841 ControlChange 0.000000 1 4 25.345417 ControlChange 0.000000 1 101 526.233650 ControlChange 0.004167 1 100 0.625386 ControlChange 0.000000 1 2 9.978266 ControlChange 0.000000 1 4 25.339207 ControlChange 0.000000 1 101 557.312212 ControlChange 0.004167 1 100 3.704208 ControlChange 0.000000 1 2 10.026005 ControlChange 0.000000 1 4 25.317572 ControlChange 0.000000 1 101 625.194033 ControlChange 0.004167 1 100 7.545693 ControlChange 0.000000 1 2 10.141122 ControlChange 0.000000 1 4 25.268554 ControlChange 0.000000 1 101 656.272595 ControlChange 0.004167 1 100 11.553881 ControlChange 0.000000 1 2 10.337033 ControlChange 0.000000 1 4 25.189352 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 15.542650 ControlChange 0.000000 1 2 10.620157 ControlChange 0.000000 1 4 25.081811 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 19.457247 ControlChange 0.000000 1 2 10.996338 ControlChange 0.000000 1 4 24.948698 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 23.253063 ControlChange 0.000000 1 2 11.470705 ControlChange 0.000000 1 4 24.793318 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 26.867419 ControlChange 0.000000 1 2 12.044780 ControlChange 0.000000 1 4 24.619535 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 30.177053 ControlChange 0.000000 1 2 12.702938 ControlChange 0.000000 1 4 24.431780 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 32.894976 ControlChange 0.000000 1 2 13.366723 ControlChange 0.000000 1 4 24.234983 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 34.781367 ControlChange 0.000000 1 2 13.918000 ControlChange 0.000000 1 4 24.034526 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 36.374338 ControlChange 0.000000 1 2 14.382942 ControlChange 0.000000 1 4 23.836148 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 38.477537 ControlChange 0.000000 1 2 14.854357 ControlChange 0.000000 1 4 23.645825 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 41.018116 ControlChange 0.000000 1 2 15.282565 ControlChange 0.000000 1 4 23.469640 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 43.616340 ControlChange 0.000000 1 2 15.479077 ControlChange 0.000000 1 4 23.313634 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 46.003639 ControlChange 0.000000 1 2 15.278355 ControlChange 0.000000 1 4 23.183653 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 47.966473 ControlChange 0.000000 1 2 14.829155 ControlChange 0.000000 1 4 23.085209 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 49.301121 ControlChange 0.000000 1 2 14.325024 ControlChange 0.000000 1 4 23.022728 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 49.884050 ControlChange 0.000000 1 2 13.841127 ControlChange 0.000000 1 4 22.993606 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 49.825661 ControlChange 0.000000 1 2 13.394708 ControlChange 0.000000 1 4 22.980717 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 49.336380 ControlChange 0.000000 1 2 12.987884 ControlChange 0.000000 1 4 22.965203 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 48.485475 ControlChange 0.000000 1 2 12.618942 ControlChange 0.000000 1 4 22.940544 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 47.254849 ControlChange 0.000000 1 2 12.285160 ControlChange 0.000000 1 4 22.906472 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 45.617825 ControlChange 0.000000 1 2 11.983730 ControlChange 0.000000 1 4 22.863478 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 43.630243 ControlChange 0.000000 1 2 11.712028 ControlChange 0.000000 1 4 22.812236 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 41.705001 ControlChange 0.000000 1 2 11.467687 ControlChange 0.000000 1 4 22.753616 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 40.169441 ControlChange 0.000000 1 2 11.248584 ControlChange 0.000000 1 4 22.688699 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 38.333858 ControlChange 0.000000 1 2 11.052841 ControlChange 0.000000 1 4 22.618768 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 35.985222 ControlChange 0.000000 1 2 10.878830 ControlChange 0.000000 1 4 22.545299 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 33.299087 ControlChange 0.000000 1 2 10.725085 ControlChange 0.000000 1 4 22.469924 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 30.386214 ControlChange 0.000000 1 2 10.590269 ControlChange 0.000000 1 4 22.394394 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 27.306420 ControlChange 0.000000 1 2 10.473206 ControlChange 0.000000 1 4 22.320524 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 24.097160 ControlChange 0.000000 1 2 10.372835 ControlChange 0.000000 1 4 22.250132 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 20.784175 ControlChange 0.000000 1 2 10.288207 ControlChange 0.000000 1 4 22.184976 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 17.386779 ControlChange 0.000000 1 2 10.218471 ControlChange 0.000000 1 4 22.126697 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 13.920983 ControlChange 0.000000 1 2 10.162839 ControlChange 0.000000 1 4 22.076766 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 10.402486 ControlChange 0.000000 1 2 10.120612 ControlChange 0.000000 1 4 22.036453 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 6.857317 ControlChange 0.000000 1 2 10.091119 ControlChange 0.000000 1 4 22.006806 ControlChange 0.000000 1 101 659.255114 ControlChange 0.004167 1 100 3.359745 ControlChange 0.000000 1 2 10.148624 ControlChange 0.000000 1 4 21.987217 ControlChange 0.000000 1 101 657.677811 ControlChange 0.004167 1 100 0.073724 ControlChange 0.000000 1 2 10.928599 ControlChange 0.000000 1 4 21.962636 ControlChange 0.000000 1 101 641.241943 ControlChange 0.004167 1 100 3.840913 ControlChange 0.000000 1 2 12.699671 ControlChange 0.000000 1 4 21.892972 ControlChange 0.000000 1 101 605.342706 ControlChange 0.004167 1 100 8.360395 ControlChange 0.000000 1 2 13.661916 ControlChange 0.000000 1 4 21.751530 ControlChange 0.000000 1 101 588.906838 ControlChange 0.004167 1 100 13.349561 ControlChange 0.000000 1 2 13.887582 ControlChange 0.000000 1 4 21.547750 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 18.485789 ControlChange 0.000000 1 2 13.870377 ControlChange 0.000000 1 4 21.301712 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.628716 ControlChange 0.000000 1 2 13.715013 ControlChange 0.000000 1 4 21.030153 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.640 2 ControlChange 0.000000 1 2 13.467865 ControlChange 0.000000 1 4 20.747023 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.293968 ControlChange 0.000000 1 2 13.152069 ControlChange 0.000000 1 4 20.465011 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.063725 ControlChange 0.000000 1 2 12.788286 ControlChange 0.000000 1 4 20.196700 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 43.512807 ControlChange 0.000000 1 2 12.395651 ControlChange 0.000000 1 4 19.955657 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 47.214573 ControlChange 0.000000 1 2 11.990310 ControlChange 0.000000 1 4 19.757798 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 48.606565 ControlChange 0.000000 1 2 11.584888 ControlChange 0.000000 1 4 19.621932 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 48.735991 ControlChange 0.000000 1 2 11.188638 ControlChange 0.000000 1 4 19.558530 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 48.343005 ControlChange 0.000000 1 2 10.807975 ControlChange 0.000000 1 4 19.548569 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 47.613410 ControlChange 0.000000 1 2 10.447082 ControlChange 0.000000 1 4 19.560307 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 46.515140 ControlChange 0.000000 1 2 10.108486 ControlChange 0.000000 1 4 19.580461 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 44.990180 ControlChange 0.000000 1 2 9.793527 ControlChange 0.000000 1 4 19.606859 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 43.014811 ControlChange 0.000000 1 2 9.502727 ControlChange 0.000000 1 4 19.638563 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.809775 ControlChange 0.000000 1 2 9.236042 ControlChange 0.000000 1 4 19.674736 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.935030 ControlChange 0.000000 1 2 8.993078 ControlChange 0.000000 1 4 19.714614 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.432250 ControlChange 0.000000 1 2 8.773194 ControlChange 0.000000 1 4 19.757489 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.557336 ControlChange 0.000000 1 2 8.575617 ControlChange 0.000000 1 4 19.802680 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.160761 ControlChange 0.000000 1 2 8.399492 ControlChange 0.000000 1 4 19.849518 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 30.428910 ControlChange 0.000000 1 2 8.243944 ControlChange 0.000000 1 4 19.897324 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.471955 ControlChange 0.000000 1 2 8.108079 ControlChange 0.000000 1 4 19.945395 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.348426 ControlChange 0.000000 1 2 7.99 45 ControlChange 0.000000 1 4 19.992969 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 21.094340 ControlChange 0.000000 1 2 7.891998 ControlChange 0.000000 1 4 20.039204 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 17.733951 ControlChange 0.000000 1 2 7.810112 ControlChange 0.000000 1 4 20.083126 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 14.284871 ControlChange 0.000000 1 2 7.744626 ControlChange 0.000000 1 4 20.123572 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 10.761088 ControlChange 0.000000 1 2 7.694802 ControlChange 0.000000 1 4 20.159094 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 7.178416 ControlChange 0.000000 1 2 7.659947 ControlChange 0.000000 1 4 20.187810 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 3.585333 ControlChange 0.000000 1 2 7.643841 ControlChange 0.000000 1 4 20.207716 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 0.110053 ControlChange 0.000000 1 2 7.693549 ControlChange 0.000000 1 4 20.221848 ControlChange 0.000000 1 101 585.280293 ControlChange 0.004167 1 100 3.266882 ControlChange 0.000000 1 2 7.921783 ControlChange 0.000000 1 4 20.245466 ControlChange 0.000000 1 101 563.926693 ControlChange 0.004167 1 100 6.860230 ControlChange 0.000000 1 2 8.379575 ControlChange 0.000000 1 4 20.295223 ControlChange 0.000000 1 101 517.286144 ControlChange 0.004167 1 100 10.601272 ControlChange 0.000000 1 2 9.016084 ControlChange 0.000000 1 4 20.376453 ControlChange 0.000000 1 101 495.932544 ControlChange 0.004167 1 100 14.326547 ControlChange 0.000000 1 2 9.768626 ControlChange 0.000000 1 4 20.488410 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 17.964873 ControlChange 0.000000 1 2 10.593225 ControlChange 0.000000 1 4 20.629055 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 21.460753 ControlChange 0.000000 1 2 11.446072 ControlChange 0.000000 1 4 20.795528 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.740448 ControlChange 0.000000 1 2 12.237650 ControlChange 0.000000 1 4 20.984029 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.671431 ControlChange 0.000000 1 2 12.805940 ControlChange 0.000000 1 4 21.189736 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.977773 ControlChange 0.000000 1 2 13. 2798 ControlChange 0.000000 1 4 21.406766 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.417412 ControlChange 0.000000 1 2 13.314270 ControlChange 0.000000 1 4 21.628240 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 32.392911 ControlChange 0.000000 1 2 13.531562 ControlChange 0.000000 1 4 21.846420 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 33.584770 ControlChange 0.000000 1 2 13.754969 ControlChange 0.000000 1 4 22.052937 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.996997 ControlChange 0.000000 1 2 13.981264 ControlChange 0.000000 1 4 22.239124 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.356066 ControlChange 0.000000 1 2 14.208871 ControlChange 0.000000 1 4 22.396402 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 37.490496 ControlChange 0.000000 1 2 14.435944 ControlChange 0.000000 1 4 22.516657 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.321583 ControlChange 0.000000 1 2 14.650875 ControlChange 0.000000 1 4 22.593353 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.820835 ControlChange 0.000000 1 2 14.782706 ControlChange 0.000000 1 4 22.628345 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.977044 ControlChange 0.000000 1 2 14.726982 ControlChange 0.000000 1 4 22.640322 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.785346 ControlChange 0.000000 1 2 14.524513 ControlChange 0.000000 1 4 22.650253 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.279382 ControlChange 0.000000 1 2 14.248846 ControlChange 0.000000 1 4 22.665384 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 37.523729 ControlChange 0.000000 1 2 13.936364 ControlChange 0.000000 1 4 22.686036 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.576758 ControlChange 0.000000 1 2 13.605604 ControlChange 0.000000 1 4 22.711813 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 35.483775 ControlChange 0.000000 1 2 13.267746 ControlChange 0.000000 1 4 22.742257 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.293107 ControlChange 0.000000 1 2 12.930242 ControlChange 0.000000 1 4 22.776853 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 33. 4354 ControlChange 0.000000 1 2 12.598418 ControlChange 0.000000 1 4 22.815033 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 32.046152 ControlChange 0.000000 1 2 12.276284 ControlChange 0.000000 1 4 22.856163 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.955253 ControlChange 0.000000 1 2 11.967000 ControlChange 0.000000 1 4 22.899557 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.416504 ControlChange 0.000000 1 2 11.673148 ControlChange 0.000000 1 4 22.944475 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.440448 ControlChange 0.000000 1 2 11.396910 ControlChange 0.000000 1 4 22.990126 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.193662 ControlChange 0.000000 1 2 11.140188 ControlChange 0.000000 1 4 23.035676 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 22.765213 ControlChange 0.000000 1 2 10.904664 ControlChange 0.000000 1 4 23.080252 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 20.201748 ControlChange 0.000000 1 2 10.691880 ControlChange 0.000000 1 4 23.122953 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 17.531513 ControlChange 0.000000 1 2 10.503295 ControlChange 0.000000 1 4 23.162858 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 14.773013 ControlChange 0.000000 1 2 10.340256 ControlChange 0.000000 1 4 23.199039 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 11.938947 ControlChange 0.000000 1 2 10.204071 ControlChange 0.000000 1 4 23.230567 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 9.038081 ControlChange 0.000000 1 2 10.096027 ControlChange 0.000000 1 4 23.256530 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 6.076067 ControlChange 0.000000 1 2 10.017393 ControlChange 0.000000 1 4 23.276038 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 3.076795 ControlChange 0.000000 1 2 9.969304 ControlChange 0.000000 1 4 23.288154 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 0.216587 ControlChange 0.000000 1 2 9.951550 ControlChange 0.000000 1 4 23.291177 ControlChange 0.000000 1 101 491.648937 ControlChange 0.004167 1 100 2.405827 ControlChange 0.000000 1 2 9.959910 ControlChange 0.000000 1 4 23.282514 ControlChange 0.000000 1 101 468.366322 ControlChange 0.004167 1 100 5.253790 ControlChange 0.000000 1 2 9.986796 ControlChange 0.000000 1 4 23.261688 ControlChange 0.000000 1 101 417.512416 ControlChange 0.004167 1 100 8.354284 ControlChange 0.000000 1 2 10.025738 ControlChange 0.000000 1 4 23.230964 ControlChange 0.000000 1 101 394.229801 ControlChange 0.004167 1 100 11.544030 ControlChange 0.000000 1 2 10.072357 ControlChange 0.000000 1 4 23.192950 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.758007 ControlChange 0.000000 1 2 10.123475 ControlChange 0.000000 1 4 23.149655 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 17.965020 ControlChange 0.000000 1 2 10.176616 ControlChange 0.000000 1 4 23. 2660 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.141893 ControlChange 0.000000 1 2 10.229730 ControlChange 0.000000 1 4 23.053297 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.266555 ControlChange 0.000000 1 2 10.28 28 ControlChange 0.000000 1 4 23.002776 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.313561 ControlChange 0.000000 1 2 10.328869 ControlChange 0.000000 1 4 22.952280 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.248663 ControlChange 0.000000 1 2 10.371678 ControlChange 0.000000 1 4 22.903061 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.018218 ControlChange 0.000000 1 2 10.407879 ControlChange 0.000000 1 4 22.856555 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.517338 ControlChange 0.000000 1 2 10.435832 ControlChange 0.000000 1 4 22.814551 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.543621 ControlChange 0.000000 1 2 10.445915 ControlChange 0.000000 1 4 22.779505 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.127566 ControlChange 0.000000 1 2 10.369773 ControlChange 0.000000 1 4 22.754836 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.657919 ControlChange 0.000000 1 2 10.179144 ControlChange 0.000000 1 4 22.743002 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.762322 ControlChange 0.000000 1 2 10.053805 ControlChange 0.000000 1 4 22.741111 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.173368 ControlChange 0.000000 1 2 9.955347 ControlChange 0.000000 1 4 22.743515 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.071911 ControlChange 0.000000 1 2 9.819657 ControlChange 0.000000 1 4 22.747948 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.648353 ControlChange 0.000000 1 2 9.649042 ControlChange 0.000000 1 4 22.754251 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.984755 ControlChange 0.000000 1 2 9.452616 ControlChange 0.000000 1 4 22.762465 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.121125 ControlChange 0.000000 1 2 9.237823 ControlChange 0.000000 1 4 22.772608 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.088490 ControlChange 0.000000 1 2 9.010775 ControlChange 0.000000 1 4 22.784667 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.914659 ControlChange 0.000000 1 2 8.776494 ControlChange 0.000000 1 4 22.798592 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.629175 ControlChange 0.000000 1 2 8.539130 ControlChange 0.000000 1 4 22.814287 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.279221 ControlChange 0.000000 1 2 8.302124 ControlChange 0.000000 1 4 22.831602 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.989808 ControlChange 0.000000 1 2 8.068333 ControlChange 0.000000 1 4 22.850326 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.953510 ControlChange 0.000000 1 2 7.840132 ControlChange 0.000000 1 4 22.870193 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.061151 ControlChange 0.000000 1 2 7.619498 ControlChange 0.000000 1 4 22.890879 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.870192 ControlChange 0.000000 1 2 7.408073 ControlChange 0.000000 1 4 22.912020 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.320963 ControlChange 0.000000 1 2 7.207231 ControlChange 0.000000 1 4 22.933226 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.538655 ControlChange 0.000000 1 2 7.018117 ControlChange 0.000000 1 4 22.954100 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.597945 ControlChange 0.000000 1 2 6.841667 ControlChange 0.000000 1 4 22.974263 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.539577 ControlChange 0.000000 1 2 6.678661 ControlChange 0.000000 1 4 22.993368 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.389070 ControlChange 0.000000 1 2 6.529737 ControlChange 0.000000 1 4 23.011118 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 19.163801 ControlChange 0.000000 1 2 6.395419 ControlChange 0.000000 1 4 23.027277 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 16.876381 ControlChange 0.000000 1 2 6.276139 ControlChange 0.000000 1 4 23.041666 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.536522 ControlChange 0.000000 1 2 6.172222 ControlChange 0.000000 1 4 23.054163 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 12.152123 ControlChange 0.000000 1 2 6.083930 ControlChange 0.000000 1 4 23.064699 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 9.730233 ControlChange 0.000000 1 2 6.011473 ControlChange 0.000000 1 4 23.073248 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 7.278299 ControlChange 0.000000 1 2 5.954991 ControlChange 0.000000 1 4 23.079817 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 4.809914 ControlChange 0.000000 1 2 5.914583 ControlChange 0.000000 1 4 23.084443 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 2.389806 ControlChange 0.000000 1 2 5.890449 ControlChange 0.000000 1 4 23.087351 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 0.259240 ControlChange 0.000000 1 2 5.884069 ControlChange 0.000000 1 4 23.090581 ControlChange 0.000000 1 101 394.229801 ControlChange 0.004167 1 100 1.400325 ControlChange 0.000000 1 2 5.899433 ControlChange 0.000000 1 4 23.099902 ControlChange 0.000000 1 101 417.512416 ControlChange 0.004167 1 100 2.928856 ControlChange 0.000000 1 2 5.939656 ControlChange 0.000000 1 4 23.121032 ControlChange 0.000000 1 101 468.366322 ControlChange 0.004167 1 100 4.483632 ControlChange 0.000000 1 2 6.004439 ControlChange 0.000000 1 4 23.155901 ControlChange 0.000000 1 101 491.648937 ControlChange 0.004167 1 100 6.042815 ControlChange 0.000000 1 2 6.092084 ControlChange 0.000000 1 4 23.204562 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 7.594358 ControlChange 0.000000 1 2 6.200871 ControlChange 0.000000 1 4 23.266826 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 9.133594 ControlChange 0.000000 1 2 6.329205 ControlChange 0.000000 1 4 23.342436 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 10.657524 ControlChange 0.000000 1 2 6.475590 ControlChange 0.000000 1 4 23.431056 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 12.163811 ControlChange 0.000000 1 2 6.638606 ControlChange 0.000000 1 4 23.532239 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 13.650358 ControlChange 0.000000 1 2 6.816905 ControlChange 0.000000 1 4 23.645449 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 15.115147 ControlChange 0.000000 1 2 7.009218 ControlChange 0.000000 1 4 23.770032 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 16.556063 ControlChange 0.000000 1 2 7.214335 ControlChange 0.000000 1 4 23.905219 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 17.970814 ControlChange 0.000000 1 2 7.431079 ControlChange 0.000000 1 4 24.050118 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 19.356869 ControlChange 0.000000 1 2 7.658316 ControlChange 0.000000 1 4 24.203706 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 20.711362 ControlChange 0.000000 1 2 7.894958 ControlChange 0.000000 1 4 24.364826 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 22.030977 ControlChange 0.000000 1 2 8.139926 ControlChange 0.000000 1 4 24.532194 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.311801 ControlChange 0.000000 1 2 8.392169 ControlChange 0.000000 1 4 24.704387 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.549142 ControlChange 0.000000 1 2 8.650652 ControlChange 0.000000 1 4 24.879863 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.737286 ControlChange 0.000000 1 2 8.914341 ControlChange 0.000000 1 4 25.056967 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.869163 ControlChange 0.000000 1 2 9.182209 ControlChange 0.000000 1 4 25.233941 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.935827 ControlChange 0.000000 1 2 9.453221 ControlChange 0.000000 1 4 25.408944 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.925579 ControlChange 0.000000 1 2 9.726333 ControlChange 0.000000 1 4 25.580075 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.822574 ControlChange 0.000000 1 2 10.000481 ControlChange 0.000000 1 4 25.745393 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.604495 ControlChange 0.000000 1 2 10.274578 ControlChange 0.000000 1 4 25.902943 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.238050 ControlChange 0.000000 1 2 10.547503 ControlChange 0.000000 1 4 26.050791 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.674321 ControlChange 0.000000 1 2 10.818095 ControlChange 0.000000 1 4 26.187047 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.883750 ControlChange 0.000000 1 2 11.085144 ControlChange 0.000000 1 4 26.309892 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.931655 ControlChange 0.000000 1 2 11.347373 ControlChange 0.000000 1 4 26.417600 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.926318 ControlChange 0.000000 1 2 11.603435 ControlChange 0.000000 1 4 26.508565 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.910605 ControlChange 0.000000 1 2 11.851897 ControlChange 0.000000 1 4 26.581318 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.888210 ControlChange 0.000000 1 2 12.091223 ControlChange 0.000000 1 4 26.634546 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.858881 ControlChange 0.000000 1 2 12.319747 ControlChange 0.000000 1 4 26.667356 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.822344 ControlChange 0.000000 1 2 12.535662 ControlChange 0.000000 1 4 26.681669 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.778303 ControlChange 0.000000 1 2 12.736975 ControlChange 0.000000 1 4 26.685183 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.726458 ControlChange 0.000000 1 2 12.921495 ControlChange 0.000000 1 4 26.685981 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.666497 ControlChange 0.000000 1 2 13.086775 ControlChange 0.000000 1 4 26.686874 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.598074 ControlChange 0.000000 1 2 13.230052 ControlChange 0.000000 1 4 26.688089 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.520835 ControlChange 0.000000 1 2 13.348201 ControlChange 0.000000 1 4 26.689608 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.434417 ControlChange 0.000000 1 2 13.437629 ControlChange 0.000000 1 4 26.691411 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.338429 ControlChange 0.000000 1 2 13.494450 ControlChange 0.000000 1 4 26.693480 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.232460 ControlChange 0.000000 1 2 13.517157 ControlChange 0.000000 1 4 26.695800 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.116 4 ControlChange 0.000000 1 2 13.512009 ControlChange 0.000000 1 4 26.698352 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.988920 ControlChange 0.000000 1 2 13.490456 ControlChange 0.000000 1 4 26.701122 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.850456 ControlChange 0.000000 1 2 13.460019 ControlChange 0.000000 1 4 26.704095 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.700260 ControlChange 0.000000 1 2 13.424037 ControlChange 0.000000 1 4 26.707255 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.537886 ControlChange 0.000000 1 2 13.384235 ControlChange 0.000000 1 4 26.710589 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.362876 ControlChange 0.000000 1 2 13.341674 ControlChange 0.000000 1 4 26.714083 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.174795 ControlChange 0.000000 1 2 13.297069 ControlChange 0.000000 1 4 26.717722 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.973233 ControlChange 0.000000 1 2 13.250932 ControlChange 0.000000 1 4 26.721495 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.757826 ControlChange 0.000000 1 2 13.203650 ControlChange 0.000000 1 4 26.725386 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.528270 ControlChange 0.000000 1 2 13.155527 ControlChange 0.000000 1 4 26.729385 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.284359 ControlChange 0.000000 1 2 13.106812 ControlChange 0.000000 1 4 26.733476 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.026029 ControlChange 0.000000 1 2 13.057709 ControlChange 0.000000 1 4 26.737648 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.753370 ControlChange 0.000000 1 2 13.008398 ControlChange 0.000000 1 4 26.741888 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.466698 ControlChange 0.000000 1 2 12.959034 ControlChange 0.000000 1 4 26.746182 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.166616 ControlChange 0.000000 1 2 12.909760 ControlChange 0.000000 1 4 26.750517 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.854058 ControlChange 0.000000 1 2 12.860707 ControlChange 0.000000 1 4 26.754879 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.530359 ControlChange 0.000000 1 2 12.811997 ControlChange 0.000000 1 4 26.759256 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.197308 ControlChange 0.000000 1 2 12.763750 ControlChange 0.000000 1 4 26.763632 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.857191 ControlChange 0.000000 1 2 12.716081 ControlChange 0.000000 1 4 26.767994 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.512799 ControlChange 0.000000 1 2 12.669106 ControlChange 0.000000 1 4 26.772326 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.167397 ControlChange 0.000000 1 2 12.622944 ControlChange 0.000000 1 4 26.776613 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.824647 ControlChange 0.000000 1 2 12.577716 ControlChange 0.000000 1 4 26.780839 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.488486 ControlChange 0.000000 1 2 12.533550 ControlChange 0.000000 1 4 26.784985 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.162947 ControlChange 0.000000 1 2 12.490580 ControlChange 0.000000 1 4 26.789035 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.851960 ControlChange 0.000000 1 2 12.448951 ControlChange 0.000000 1 4 26.792969 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.559160 ControlChange 0.000000 1 2 12.408822 ControlChange 0.000000 1 4 26.796766 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.287714 ControlChange 0.000000 1 2 12.370368 ControlChange 0.000000 1 4 26.800405 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.040188 ControlChange 0.000000 1 2 12.333785 ControlChange 0.000000 1 4 26.803862 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.818487 ControlChange 0.000000 1 2 12.299293 ControlChange 0.000000 1 4 26.807112 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.623857 ControlChange 0.000000 1 2 12.267145 ControlChange 0.000000 1 4 26.810125 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.456904 ControlChange 0.000000 1 2 12.237633 ControlChange 0.000000 1 4 26.812873 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.317698 ControlChange 0.000000 1 2 12.211101 ControlChange 0.000000 1 4 26.815319 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.205868 ControlChange 0.000000 1 2 12.187963 ControlChange 0.000000 1 4 26.817428 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.120700 ControlChange 0.000000 1 2 12.168720 ControlChange 0.000000 1 4 26.819156 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.061215 ControlChange 0.000000 1 2 12.153991 ControlChange 0.000000 1 4 26.820456 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.026420 ControlChange 0.000000 1 2 12.144692 ControlChange 0.000000 1 4 26.820616 ControlChange 0.000000 1 101 495.932544 ControlChange 0.004167 1 100 23.016843 ControlChange 0.000000 1 2 12.143308 ControlChange 0.000000 1 4 26.812315 ControlChange 0.000000 1 101 517.286144 ControlChange 0.004167 1 100 23.036383 ControlChange 0.000000 1 2 12.155403 ControlChange 0.000000 1 4 26.776461 ControlChange 0.000000 1 101 563.926693 ControlChange 0.004167 1 100 23.089 2 ControlChange 0.000000 1 2 12.186906 ControlChange 0.000000 1 4 26.699639 ControlChange 0.000000 1 101 585.280293 ControlChange 0.004167 1 100 23.175838 ControlChange 0.000000 1 2 12.241384 ControlChange 0.000000 1 4 26.585025 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.295662 ControlChange 0.000000 1 2 12.321344 ControlChange 0.000000 1 4 26.440953 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.447288 ControlChange 0.000000 1 2 12.429413 ControlChange 0.000000 1 4 26.274229 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.629207 ControlChange 0.000000 1 2 12.568507 ControlChange 0.000000 1 4 26.090178 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.839656 ControlChange 0.000000 1 2 12.741761 ControlChange 0.000000 1 4 25.893129 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.076624 ControlChange 0.000000 1 2 12.952348 ControlChange 0.000000 1 4 25.686739 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.337867 ControlChange 0.000000 1 2 13.203226 ControlChange 0.000000 1 4 25.474226 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.620909 ControlChange 0.000000 1 2 13.496620 ControlChange 0.000000 1 4 25.258512 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.923019 ControlChange 0.000000 1 2 13.833245 ControlChange 0.000000 1 4 25.042352 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.241270 ControlChange 0.000000 1 2 14.211177 ControlChange 0.000000 1 4 24.828434 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.572536 ControlChange 0.000000 1 2 14.624653 ControlChange 0.000000 1 4 24.619474 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.913532 ControlChange 0.000000 1 2 15.063178 ControlChange 0.000000 1 4 24.418317 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.260837 ControlChange 0.000000 1 2 15.511754 ControlChange 0.000000 1 4 24.228042 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.610931 ControlChange 0.000000 1 2 15.952699 ControlChange 0.000000 1 4 24.052080 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.960239 ControlChange 0.000000 1 2 16.368640 ControlChange 0.000000 1 4 23.894410 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.305166 ControlChange 0.000000 1 2 16.745487 ControlChange 0.000000 1 4 23.759792 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.642148 ControlChange 0.000000 1 2 17.074168 ControlChange 0.000000 1 4 23.654099 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.967686 ControlChange 0.000000 1 2 17.350685 ControlChange 0.000000 1 4 23.584007 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.278383 ControlChange 0.000000 1 2 17.574995 ControlChange 0.000000 1 4 23.549132 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.570988 ControlChange 0.000000 1 2 17.749600 ControlChange 0.000000 1 4 23.530168 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.842431 ControlChange 0.000000 1 2 17.878315 ControlChange 0.000000 1 4 23.503596 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.089825 ControlChange 0.000000 1 2 17.965462 ControlChange 0.000000 1 4 23.461205 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.310534 ControlChange 0.000000 1 2 18.014211 ControlChange 0.000000 1 4 23.403028 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.502141 ControlChange 0.000000 1 2 18.016152 ControlChange 0.000000 1 4 23.330169 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.662478 ControlChange 0.000000 1 2 17.941579 ControlChange 0.000000 1 4 23.244032 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.789651 ControlChange 0.000000 1 2 17.767627 ControlChange 0.000000 1 4 23.146336 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.882013 ControlChange 0.000000 1 2 17.498580 ControlChange 0.000000 1 4 23.039095 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.927735 ControlChange 0.000000 1 2 17.148539 ControlChange 0.000000 1 4 22.924601 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.810866 ControlChange 0.000000 1 2 16.730210 ControlChange 0.000000 1 4 22.805382 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.233900 ControlChange 0.000000 1 2 16.254464 ControlChange 0.000000 1 4 22.684137 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.997595 ControlChange 0.000000 1 2 15.730974 ControlChange 0.000000 1 4 22.563658 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.158951 ControlChange 0.000000 1 2 15.168768 ControlChange 0.000000 1 4 22.446752 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.841137 ControlChange 0.000000 1 2 14.576798 ControlChange 0.000000 1 4 22.336150 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 21.135590 ControlChange 0.000000 1 2 13.964529 ControlChange 0.000000 1 4 22.234428 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 18.107097 ControlChange 0.000000 1 2 13.342814 ControlChange 0.000000 1 4 22.143946 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 14.803936 ControlChange 0.000000 1 2 12.725404 ControlChange 0.000000 1 4 22.066792 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 11.266178 ControlChange 0.000000 1 2 12.131953 ControlChange 0.000000 1 4 22.004730 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 7.540446 ControlChange 0.000000 1 2 11.595636 ControlChange 0.000000 1 4 21.959221 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 3.737086 ControlChange 0.000000 1 2 11.179713 ControlChange 0.000000 1 4 21.931154 ControlChange 0.000000 1 101 585.924319 ControlChange 0.004167 1 100 0.023645 ControlChange 0.000000 1 2 10.961410 ControlChange 0.000000 1 4 21.918671 ControlChange 0.000000 1 101 571.281625 ControlChange 0.004167 1 100 3.881675 ControlChange 0.000000 1 2 10.936252 ControlChange 0.000000 1 4 21.914550 ControlChange 0.000000 1 101 539.299041 ControlChange 0.004167 1 100 7.995793 ControlChange 0.000000 1 2 11.020031 ControlChange 0.000000 1 4 21.911359 ControlChange 0.000000 1 101 524.656347 ControlChange 0.004167 1 100 12.227344 ControlChange 0.000000 1 2 11.181516 ControlChange 0.000000 1 4 21.906680 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 16.435612 ControlChange 0.000000 1 2 11.432848 ControlChange 0.000000 1 4 21.900517 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 20.549224 ControlChange 0.000000 1 2 11.787272 ControlChange 0.000000 1 4 21.893 4 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 24.464370 ControlChange 0.000000 1 2 12.237160 ControlChange 0.000000 1 4 21.884668 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 27.966299 ControlChange 0.000000 1 2 12.726916 ControlChange 0.000000 1 4 21.875438 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 31.266800 ControlChange 0.000000 1 2 13.154192 ControlChange 0.000000 1 4 21.865647 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 34.937081 ControlChange 0.000000 1 2 13.431227 ControlChange 0.000000 1 4 21.855534 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.762459 ControlChange 0.000000 1 2 13.557489 ControlChange 0.000000 1 4 21.845348 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 38.986962 ControlChange 0.000000 1 2 13.614412 ControlChange 0.000000 1 4 21.835357 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.098814 ControlChange 0.000000 1 2 13.662633 ControlChange 0.000000 1 4 21.825849 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 38.724602 ControlChange 0.000000 1 2 13.710920 ControlChange 0.000000 1 4 21.817143 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 38.084685 ControlChange 0.000000 1 2 13.722540 ControlChange 0.000000 1 4 21.809598 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.210154 ControlChange 0.000000 1 2 13.615612 ControlChange 0.000000 1 4 21.803623 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 36.116579 ControlChange 0.000000 1 2 13.353904 ControlChange 0.000000 1 4 21.799716 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 34.834826 ControlChange 0.000000 1 2 12.966556 ControlChange 0.000000 1 4 21.798592 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 33.479701 ControlChange 0.000000 1 2 12.507312 ControlChange 0.000000 1 4 21.801064 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 32.302603 ControlChange 0.000000 1 2 12.026557 ControlChange 0.000000 1 4 21.807205 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 31.284587 ControlChange 0.000000 1 2 11.560386 ControlChange 0.000000 1 4 21.816314 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 29.896848 ControlChange 0.000000 1 2 11.129775 ControlChange 0.000000 1 4 21.827592 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 28.026516 ControlChange 0.000000 1 2 10.744495 ControlChange 0.000000 1 4 21.840390 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 25.816890 ControlChange 0.000000 1 2 10.407470 ControlChange 0.000000 1 4 21.854175 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 23.365732 ControlChange 0.000000 1 2 10.117981 ControlChange 0.000000 1 4 21.868482 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 20.731205 ControlChange 0.000000 1 2 9.873603 ControlChange 0.000000 1 4 21.882890 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 17.951965 ControlChange 0.000000 1 2 9.671169 ControlChange 0.000000 1 4 21.896992 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 15.056214 ControlChange 0.000000 1 2 9.507412 ControlChange 0.000000 1 4 21.910380 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 12.066960 ControlChange 0.000000 1 2 9.379199 ControlChange 0.000000 1 4 21.922620 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 9.006262 ControlChange 0.000000 1 2 9.283607 ControlChange 0.000000 1 4 21.933231 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 5.909017 ControlChange 0.000000 1 2 9.217982 ControlChange 0.000000 1 4 21.941654 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 2.867427 ControlChange 0.000000 1 2 9.182478 ControlChange 0.000000 1 4 21.948187 ControlChange 0.000000 1 101 521.425463 ControlChange 0.004167 1 100 0.086413 ControlChange 0.000000 1 2 9.203533 ControlChange 0.000000 1 4 21.963050 ControlChange 0.000000 1 101 502.401568 ControlChange 0.004167 1 100 3.177480 ControlChange 0.000000 1 2 9.355229 ControlChange 0.000000 1 4 22.016420 ControlChange 0.000000 1 101 460.849562 ControlChange 0.004167 1 100 6.444387 ControlChange 0.000000 1 2 9.692154 ControlChange 0.000000 1 4 22.134689 ControlChange 0.000000 1 101 441.825668 ControlChange 0.004167 1 100 9.747497 ControlChange 0.000000 1 2 10.204437 ControlChange 0.000000 1 4 22.317728 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 13.003958 ControlChange 0.000000 1 2 10.860161 ControlChange 0.000000 1 4 22.550348 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 16.179765 ControlChange 0.000000 1 2 11.630041 ControlChange 0.000000 1 4 22.813018 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 19.241906 ControlChange 0.000000 1 2 12.484929 ControlChange 0.000000 1 4 23.084860 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 22.140086 ControlChange 0.000000 1 2 13.382830 ControlChange 0.000000 1 4 23.345954 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 24.773370 ControlChange 0.000000 1 2 14.219164 ControlChange 0.000000 1 4 23.579219 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 26.921357 ControlChange 0.000000 1 2 14.784898 ControlChange 0.000000 1 4 23.771486 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 28.50 25 ControlChange 0.000000 1 2 14.988674 ControlChange 0.000000 1 4 23.913755 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 30.140109 ControlChange 0.000000 1 2 15.048249 ControlChange 0.000000 1 4 24.001271 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 32.397687 ControlChange 0.000000 1 2 15.069470 ControlChange 0.000000 1 4 24.037847 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.890172 ControlChange 0.000000 1 2 15.008733 ControlChange 0.000000 1 4 24.041030 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.092494 ControlChange 0.000000 1 2 14.832580 ControlChange 0.000000 1 4 24.028925 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 38.748713 ControlChange 0.000000 1 2 14.536197 ControlChange 0.000000 1 4 24.007707 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 39.764498 ControlChange 0.000000 1 2 14.137787 ControlChange 0.000000 1 4 23.977844 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.157142 ControlChange 0.000000 1 2 13.676292 ControlChange 0.000000 1 4 23.939338 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.056316 ControlChange 0.000000 1 2 13.196911 ControlChange 0.000000 1 4 23.892279 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 39.590751 ControlChange 0.000000 1 2 12.735082 ControlChange 0.000000 1 4 23.836878 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 38.799798 ControlChange 0.000000 1 2 12.310586 ControlChange 0.000000 1 4 23.773479 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.703153 ControlChange 0.000000 1 2 11.930676 ControlChange 0.000000 1 4 23.702593 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 36.431567 ControlChange 0.000000 1 2 11.595499 ControlChange 0.000000 1 4 23.624912 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 35.260450 ControlChange 0.000000 1 2 11.302040 ControlChange 0.000000 1 4 23.541335 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.150809 ControlChange 0.000000 1 2 11.046292 ControlChange 0.000000 1 4 23.452973 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 32.629951 ControlChange 0.000000 1 2 10.824224 ControlChange 0.000000 1 4 23.361153 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 30.653136 ControlChange 0.000000 1 2 10.632106 ControlChange 0.000000 1 4 23.267401 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 28.383066 ControlChange 0.000000 1 2 10.466663 ControlChange 0.000000 1 4 23.173413 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 25.914688 ControlChange 0.000000 1 2 10.325053 ControlChange 0.000000 1 4 23.081011 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 23.299609 ControlChange 0.000000 1 2 10.204835 ControlChange 0.000000 1 4 22.992079 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 20.570300 ControlChange 0.000000 1 2 10.103937 ControlChange 0.000000 1 4 22.908496 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 17.749273 ControlChange 0.000000 1 2 10.020524 ControlChange 0.000000 1 4 22.832064 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 14.853370 ControlChange 0.000000 1 2 9.953030 ControlChange 0.000000 1 4 22.764435 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 11.896543 ControlChange 0.000000 1 2 9.900111 ControlChange 0.000000 1 4 22.707060 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 8.892456 ControlChange 0.000000 1 2 9.860558 ControlChange 0.000000 1 4 22.661156 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 5.863479 ControlChange 0.000000 1 2 9.833319 ControlChange 0.000000 1 4 22.627678 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 2.884803 ControlChange 0.000000 1 2 9.817960 ControlChange 0.000000 1 4 22.607182 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 0.087327 ControlChange 0.000000 1 2 9.819350 ControlChange 0.000000 1 4 22.598677 ControlChange 0.000000 1 101 438.464803 ControlChange 0.004167 1 100 2.644867 ControlChange 0.000000 1 2 9.853640 ControlChange 0.000000 1 4 22.598259 ControlChange 0.000000 1 101 422.467678 ControlChange 0.004167 1 100 5.682806 ControlChange 0.000000 1 2 9.937350 ControlChange 0.000000 1 4 22.601864 ControlChange 0.000000 1 101 387.526745 ControlChange 0.004167 1 100 8.961478 ControlChange 0.000000 1 2 10.073748 ControlChange 0.000000 1 4 22.608040 ControlChange 0.000000 1 101 371.529620 ControlChange 0.004167 1 100 12.317829 ControlChange 0.000000 1 2 10.254612 ControlChange 0.000000 1 4 22.616558 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 15.691517 ControlChange 0.000000 1 2 10.463503 ControlChange 0.000000 1 4 22.627217 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 19.051777 ControlChange 0.000000 1 2 10.678417 ControlChange 0.000000 1 4 22.639712 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 22.372472 ControlChange 0.000000 1 2 10.876888 ControlChange 0.000000 1 4 22.653627 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 25.623442 ControlChange 0.000000 1 2 11.041202 ControlChange 0.000000 1 4 22.668452 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 28.759717 ControlChange 0.000000 1 2 11.160945 ControlChange 0.000000 1 4 22.683607 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 31.688128 ControlChange 0.000000 1 2 11.229974 ControlChange 0.000000 1 4 22.698485 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.196930 ControlChange 0.000000 1 2 11.225976 ControlChange 0.000000 1 4 22.712497 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.266743 ControlChange 0.000000 1 2 11.125018 ControlChange 0.000000 1 4 22.725120 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.286452 ControlChange 0.000000 1 2 10.994565 ControlChange 0.000000 1 4 22.735918 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.864645 ControlChange 0.000000 1 2 10.895194 ControlChange 0.000000 1 4 22.744568 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.512099 ControlChange 0.000000 1 2 10.756194 ControlChange 0.000000 1 4 22.750852 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.387766 ControlChange 0.000000 1 2 10.529331 ControlChange 0.000000 1 4 22.754767 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.785095 ControlChange 0.000000 1 2 10.218987 ControlChange 0.000000 1 4 22.757585 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.831571 ControlChange 0.000000 1 2 9.848538 ControlChange 0.000000 1 4 22.762953 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.574423 ControlChange 0.000000 1 2 9.449885 ControlChange 0.000000 1 4 22.774033 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.037847 ControlChange 0.000000 1 2 9.053361 ControlChange 0.000000 1 4 22.791158 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.254283 ControlChange 0.000000 1 2 8.680475 ControlChange 0.000000 1 4 22.813473 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 32.480759 ControlChange 0.000000 1 2 8.342691 ControlChange 0.000000 1 4 22.840116 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 30.971892 ControlChange 0.000000 1 2 8.043950 ControlChange 0.000000 1 4 22.870312 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 29.205173 ControlChange 0.000000 1 2 7.783855 ControlChange 0.000000 1 4 22.903337 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 27.056861 ControlChange 0.000000 1 2 7.559989 ControlChange 0.000000 1 4 22.938507 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 24.684057 ControlChange 0.000000 1 2 7.369219 ControlChange 0.000000 1 4 22.975149 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 22.169810 ControlChange 0.000000 1 2 7.208268 ControlChange 0.000000 1 4 23.012582 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 19.554577 ControlChange 0.000000 1 2 7.074097 ControlChange 0.000000 1 4 23.050094 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 16.862517 ControlChange 0.000000 1 2 6.964008 ControlChange 0.000000 1 4 23.086910 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 14.109919 ControlChange 0.000000 1 2 6.875593 ControlChange 0.000000 1 4 23.122158 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 11.309024 ControlChange 0.000000 1 2 6.806730 ControlChange 0.000000 1 4 23.154814 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 8.470620 ControlChange 0.000000 1 2 6.755615 ControlChange 0.000000 1 4 23.183625 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 5.610154 ControlChange 0.000000 1 2 6.720644 ControlChange 0.000000 1 4 23.206990 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 2.757863 ControlChange 0.000000 1 2 6.704500 ControlChange 0.000000 1 4 23.222499 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 0.170737 ControlChange 0.000000 1 2 6.752033 ControlChange 0.000000 1 4 23.224534 ControlChange 0.000000 1 101 368.320540 ControlChange 0.004167 1 100 3.414031 ControlChange 0.000000 1 2 6.988622 ControlChange 0.000000 1 4 23.203395 ControlChange 0.000000 1 101 350.878287 ControlChange 0.004167 1 100 6.872184 ControlChange 0.000000 1 2 7.518512 ControlChange 0.000000 1 4 23.154098 ControlChange 0.000000 1 101 312.780903 ControlChange 0.004167 1 100 10.367063 ControlChange 0.000000 1 2 8.344948 ControlChange 0.000000 1 4 23.079878 ControlChange 0.000000 1 101 295.338650 ControlChange 0.004167 1 100 13.834194 ControlChange 0.000000 1 2 9.430522 ControlChange 0.000000 1 4 22.986148 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 17.248312 ControlChange 0.000000 1 2 10.736155 ControlChange 0.000000 1 4 22.877462 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 20.579287 ControlChange 0.000000 1 2 12.208660 ControlChange 0.000000 1 4 22.757572 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 23.760000 ControlChange 0.000000 1 2 13.692039 ControlChange 0.000000 1 4 22.629708 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 26.605068 ControlChange 0.000000 1 2 14.753355 ControlChange 0.000000 1 4 22.496781 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 29.028712 ControlChange 0.000000 1 2 15.058565 ControlChange 0.000000 1 4 22.361539 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 31.539483 ControlChange 0.000000 1 2 15.031010 ControlChange 0.000000 1 4 22.226704 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 34.246295 ControlChange 0.000000 1 2 14.967040 ControlChange 0.000000 1 4 22.095100 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 36.256986 ControlChange 0.000000 1 2 14.902217 ControlChange 0.000000 1 4 21.969806 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 37.301779 ControlChange 0.000000 1 2 14.839404 ControlChange 0.000000 1 4 21.854353 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 37.634837 ControlChange 0.000000 1 2 14.762562 ControlChange 0.000000 1 4 21.752996 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 37.471684 ControlChange 0.000000 1 2 14.630824 ControlChange 0.000000 1 4 21.671169 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 36.906569 ControlChange 0.000000 1 2 14.449653 ControlChange 0.000000 1 4 21.615497 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 35.964662 ControlChange 0.000000 1 2 14.259164 ControlChange 0.000000 1 4 21.588 2 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 34.675978 ControlChange 0.000000 1 2 14.080789 ControlChange 0.000000 1 4 21.577001 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 33.143317 ControlChange 0.000000 1 2 13.918724 ControlChange 0.000000 1 4 21.565998 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 31.651890 ControlChange 0.000000 1 2 13.772842 ControlChange 0.000000 1 4 21.549577 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 30.523061 ControlChange 0.000000 1 2 13.642134 ControlChange 0.000000 1 4 21.528011 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 29.527640 ControlChange 0.000000 1 2 13.525444 ControlChange 0.000000 1 4 21.502085 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 28.169368 ControlChange 0.000000 1 2 13.421661 ControlChange 0.000000 1 4 21.472527 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 26.422475 ControlChange 0.000000 1 2 13.329780 ControlChange 0.000000 1 4 21.440034 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 24.433197 ControlChange 0.000000 1 2 13.248908 ControlChange 0.000000 1 4 21.405285 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 22.282460 ControlChange 0.000000 1 2 13.178238 ControlChange 0.000000 1 4 21.368964 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 20.013406 ControlChange 0.000000 1 2 13.117069 ControlChange 0.000000 1 4 21.331772 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 17.652883 ControlChange 0.000000 1 2 13.064776 ControlChange 0.000000 1 4 21.294451 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 15.219326 ControlChange 0.000000 1 2 13.020808 ControlChange 0.000000 1 4 21.257809 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 12.726535 ControlChange 0.000000 1 2 12.984657 ControlChange 0.000000 1 4 21.222755 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 10.185951 ControlChange 0.000000 1 2 12.955876 ControlChange 0.000000 1 4 21.190345 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 7.608895 ControlChange 0.000000 1 2 12.934074 ControlChange 0.000000 1 4 21.161851 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 5.014268 ControlChange 0.000000 1 2 12.918864 ControlChange 0.000000 1 4 21.138862 ControlChange 0.000000 1 101 293.664768 ControlChange 0.004167 1 100 2.444510 ControlChange 0.000000 1 2 12.910010 ControlChange 0.000000 1 4 21.123321 ControlChange 0.000000 1 101 294.453419 ControlChange 0.004167 1 100 0.193031 ControlChange 0.000000 1 2 12.908312 ControlChange 0.000000 1 4 21.116410 ControlChange 0.000000 1 101 302.671353 ControlChange 0.004167 1 100 3.277535 ControlChange 0.000000 1 2 12.917195 ControlChange 0.000000 1 4 21.116481 ControlChange 0.000000 1 101 320.620972 ControlChange 0.004167 1 100 6.873315 ControlChange 0.000000 1 2 12.941907 ControlChange 0.000000 1 4 21.120626 ControlChange 0.000000 1 101 328.838906 ControlChange 0.004167 1 100 10.681730 ControlChange 0.000000 1 2 12.987798 ControlChange 0.000000 1 4 21.127643 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 14.508323 ControlChange 0.000000 1 2 13.060688 ControlChange 0.000000 1 4 21.137326 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 18.285407 ControlChange 0.000000 1 2 13.164998 ControlChange 0.000000 1 4 21.149524 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 21.969381 ControlChange 0.000000 1 2 13.295033 ControlChange 0.000000 1 4 21.164032 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 25.512109 ControlChange 0.000000 1 2 13.424362 ControlChange 0.000000 1 4 21.180587 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 28.843749 ControlChange 0.000000 1 2 13.511868 ControlChange 0.000000 1 4 21.198856 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 31.833794 ControlChange 0.000000 1 2 13.504064 ControlChange 0.000000 1 4 21.218442 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 34.239202 ControlChange 0.000000 1 2 13.357835 ControlChange 0.000000 1 4 21.238879 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 36.141524 ControlChange 0.000000 1 2 13.129646 ControlChange 0.000000 1 4 21.259639 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 38.273695 ControlChange 0.000000 1 2 12.889441 ControlChange 0.000000 1 4 21.280146 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 40.422884 ControlChange 0.000000 1 2 12.684212 ControlChange 0.000000 1 4 21.299786 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 41.758172 ControlChange 0.000000 1 2 12.492039 ControlChange 0.000000 1 4 21.317928 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 42.200526 ControlChange 0.000000 1 2 12.188084 ControlChange 0.000000 1 4 21.333947 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 42.036489 ControlChange 0.000000 1 2 11.748369 ControlChange 0.000000 1 4 21.347246 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 41.449321 ControlChange 0.000000 1 2 11.232137 ControlChange 0.000000 1 4 21.357273 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 40.521166 ControlChange 0.000000 1 2 10.698563 ControlChange 0.000000 1 4 21.363594 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 39.302523 ControlChange 0.000000 1 2 10.186284 ControlChange 0.000000 1 4 21.366372 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 37.843840 ControlChange 0.000000 1 2 9.714674 ControlChange 0.000000 1 4 21.366971 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 36.221110 ControlChange 0.000000 1 2 9.290684 ControlChange 0.000000 1 4 21.366916 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 34.615088 ControlChange 0.000000 1 2 8.914797 ControlChange 0.000000 1 4 21.366755 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 33.247238 ControlChange 0.000000 1 2 8.584593 ControlChange 0.000000 1 4 21.366546 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 31.897561 ControlChange 0.000000 1 2 8.296568 ControlChange 0.000000 1 4 21.366297 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 30.054195 ControlChange 0.000000 1 2 8.047034 ControlChange 0.000000 1 4 21.366015 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 27.733149 ControlChange 0.000000 1 2 7.832478 ControlChange 0.000000 1 4 21.365709 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 25.127472 ControlChange 0.000000 1 2 7.649687 ControlChange 0.000000 1 4 21.365386 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 22.334886 ControlChange 0.000000 1 2 7.495786 ControlChange 0.000000 1 4 21.365054 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 19.404409 ControlChange 0.000000 1 2 7.368235 ControlChange 0.000000 1 4 21.364722 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 16.364996 ControlChange 0.000000 1 2 7.264832 ControlChange 0.000000 1 4 21.364399 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 13.235188 ControlChange 0.000000 1 2 7.183610 ControlChange 0.000000 1 4 21.364096 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 10.027148 ControlChange 0.000000 1 2 7.122821 ControlChange 0.000000 1 4 21.363826 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 6.747949 ControlChange 0.000000 1 2 7.080885 ControlChange 0.000000 1 4 21.363606 ControlChange 0.000000 1 101 329.627557 ControlChange 0.004167 1 100 3.412384 ControlChange 0.000000 1 2 7.061951 ControlChange 0.000000 1 4 21.363602 ControlChange 0.000000 1 101 330.512788 ControlChange 0.004167 1 100 0.134840 ControlChange 0.000000 1 2 7.126048 ControlChange 0.000000 1 4 21.365466 ControlChange 0.000000 1 101 339.737107 ControlChange 0.004167 1 100 3.0 283 ControlChange 0.000000 1 2 7.437368 ControlChange 0.000000 1 4 21.373644 ControlChange 0.000000 1 101 359.884873 ControlChange 0.004167 1 100 6.300327 ControlChange 0.000000 1 2 8.123771 ControlChange 0.000000 1 4 21.391693 ControlChange 0.000000 1 101 369.109192 ControlChange 0.004167 1 100 9.705408 ControlChange 0.000000 1 2 9.171659 ControlChange 0.000000 1 4 21.419487 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 13.093578 ControlChange 0.000000 1 2 10.504263 ControlChange 0.000000 1 4 21.455416 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 16.412202 ControlChange 0.000000 1 2 12.012183 ControlChange 0.000000 1 4 21.497914 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 19.627903 ControlChange 0.000000 1 2 13.461873 ControlChange 0.000000 1 4 21.545557 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 22.705879 ControlChange 0.000000 1 2 14.448438 ControlChange 0.000000 1 4 21.597021 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 25.601213 ControlChange 0.000000 1 2 14.835250 ControlChange 0.000000 1 4 21.651034 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 28.246873 ControlChange 0.000000 1 2 15.024546 ControlChange 0.000000 1 4 21.706344 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 30.526856 ControlChange 0.000000 1 2 15.225680 ControlChange 0.000000 1 4 21.761682 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 32.258312 ControlChange 0.000000 1 2 15.442936 ControlChange 0.000000 1 4 21.815719 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.558607 ControlChange 0.000000 1 2 15.667596 ControlChange 0.000000 1 4 21.867024 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 35. 2960 ControlChange 0.000000 1 2 15.893915 ControlChange 0.000000 1 4 21.914003 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.936603 ControlChange 0.000000 1 2 16.114493 ControlChange 0.000000 1 4 21.954825 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.569395 ControlChange 0.000000 1 2 16.306339 ControlChange 0.000000 1 4 21.987316 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.744495 ControlChange 0.000000 1 2 16.390781 ControlChange 0.000000 1 4 22.009011 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.434817 ControlChange 0.000000 1 2 16.271794 ControlChange 0.000000 1 4 22.019075 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.683357 ControlChange 0.000000 1 2 15.990022 ControlChange 0.000000 1 4 22.021418 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.567564 ControlChange 0.000000 1 2 15.636440 ControlChange 0.000000 1 4 22.021434 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.150542 ControlChange 0.000000 1 2 15.264399 ControlChange 0.000000 1 4 22.021166 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.451578 ControlChange 0.000000 1 2 14.897465 ControlChange 0.000000 1 4 22.020807 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.472399 ControlChange 0.000000 1 2 14.546274 ControlChange 0.000000 1 4 22.020367 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.226395 ControlChange 0.000000 1 2 14.215735 ControlChange 0.000000 1 4 22.019853 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 35.812013 ControlChange 0.000000 1 2 13.907975 ControlChange 0.000000 1 4 22.019277 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.481958 ControlChange 0.000000 1 2 13.623693 ControlChange 0.000000 1 4 22.018646 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.262783 ControlChange 0.000000 1 2 13.362834 ControlChange 0.000000 1 4 22.017971 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 31.716389 ControlChange 0.000000 1 2 13.124946 ControlChange 0.000000 1 4 22.017259 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 29.802847 ControlChange 0.000000 1 2 12.909350 ControlChange 0.000000 1 4 22.016521 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 27.673918 ControlChange 0.000000 1 2 12.715258 ControlChange 0.000000 1 4 22.015767 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 25.407752 ControlChange 0.000000 1 2 12.541849 ControlChange 0.000000 1 4 22.015005 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 23.043188 ControlChange 0.000000 1 2 12.388292 ControlChange 0.000000 1 4 22.014246 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 20.603661 ControlChange 0.000000 1 2 12.253801 ControlChange 0.000000 1 4 22.013503 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 18. 4973 ControlChange 0.000000 1 2 12.137606 ControlChange 0.000000 1 4 22.012786 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 15.558628 ControlChange 0.000000 1 2 12.038952 ControlChange 0.000000 1 4 22.012108 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 12.973753 ControlChange 0.000000 1 2 11.957114 ControlChange 0.000000 1 4 22.011483 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 10.358518 ControlChange 0.000000 1 2 11.891444 ControlChange 0.000000 1 4 22.010928 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 7.721863 ControlChange 0.000000 1 2 11.841325 ControlChange 0.000000 1 4 22.0 459 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 5.080760 ControlChange 0.000000 1 2 11.806165 ControlChange 0.000000 1 4 22.010097 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 2.517118 ControlChange 0.000000 1 2 11.785500 ControlChange 0.000000 1 4 22.009891 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 0.340981 ControlChange 0.000000 1 2 11.780029 ControlChange 0.000000 1 4 22.010187 ControlChange 0.000000 1 101 370.476897 ControlChange 0.004167 1 100 1.214460 ControlChange 0.000000 1 2 11.792733 ControlChange 0.000000 1 4 22.011927 ControlChange 0.000000 1 101 375.504396 ControlChange 0.004167 1 100 2.600427 ControlChange 0.000000 1 2 11.826073 ControlChange 0.000000 1 4 22.016034 ControlChange 0.000000 1 101 386.485463 ControlChange 0.004167 1 100 4.030367 ControlChange 0.000000 1 2 11.879790 ControlChange 0.000000 1 4 22.022811 ControlChange 0.000000 1 101 391.512962 ControlChange 0.004167 1 100 5.477924 ControlChange 0.000000 1 2 11.952493 ControlChange 0.000000 1 4 22.032272 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 6.926852 ControlChange 0.000000 1 2 12.042804 ControlChange 0.000000 1 4 22.044397 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 8.370658 ControlChange 0.000000 1 2 12.149460 ControlChange 0.000000 1 4 22.059169 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 9.805279 ControlChange 0.000000 1 2 12.271301 ControlChange 0.000000 1 4 22.076567 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 11.227657 ControlChange 0.000000 1 2 12.407251 ControlChange 0.000000 1 4 22.096572 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 12.635175 ControlChange 0.000000 1 2 12.556302 ControlChange 0.000000 1 4 22.119162 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.025335 ControlChange 0.000000 1 2 12.717487 ControlChange 0.000000 1 4 22.144316 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 15.395585 ControlChange 0.000000 1 2 12.889890 ControlChange 0.000000 1 4 22.172015 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 16.743193 ControlChange 0.000000 1 2 13.072640 ControlChange 0.000000 1 4 22.202234 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 18.065108 ControlChange 0.000000 1 2 13.264890 ControlChange 0.000000 1 4 22.234950 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 19.357794 ControlChange 0.000000 1 2 13.465813 ControlChange 0.000000 1 4 22.270138 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 20.617033 ControlChange 0.000000 1 2 13.674587 ControlChange 0.000000 1 4 22.307773 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.837665 ControlChange 0.000000 1 2 13.890389 ControlChange 0.000000 1 4 22.347831 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.013218 ControlChange 0.000000 1 2 14.112381 ControlChange 0.000000 1 4 22.390285 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.135314 ControlChange 0.000000 1 2 14.339705 ControlChange 0.000000 1 4 22.435106 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.192675 ControlChange 0.000000 1 2 14.571464 ControlChange 0.000000 1 4 22.482266 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.169498 ControlChange 0.000000 1 2 14.806712 ControlChange 0.000000 1 4 22.531732 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.042108 ControlChange 0.000000 1 2 15.044421 ControlChange 0.000000 1 4 22.583474 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.771685 ControlChange 0.000000 1 2 15.283464 ControlChange 0.000000 1 4 22.637460 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.293896 ControlChange 0.000000 1 2 15.522576 ControlChange 0.000000 1 4 22.693656 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.557821 ControlChange 0.000000 1 2 15.760309 ControlChange 0.000000 1 4 22.752024 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.632742 ControlChange 0.000000 1 2 15.994965 ControlChange 0.000000 1 4 22.812529 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.657780 ControlChange 0.000000 1 2 16.224505 ControlChange 0.000000 1 4 22.875129 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.691067 ControlChange 0.000000 1 2 16.446402 ControlChange 0.000000 1 4 22.939784 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.738439 ControlChange 0.000000 1 2 16.657430 ControlChange 0.000000 1 4 23.006452 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.800415 ControlChange 0.000000 1 2 16.853300 ControlChange 0.000000 1 4 23.075084 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.877525 ControlChange 0.000000 1 2 17.028023 ControlChange 0.000000 1 4 23.145634 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.970335 ControlChange 0.000000 1 2 17.172701 ControlChange 0.000000 1 4 23.218051 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.079418 ControlChange 0.000000 1 2 17.273632 ControlChange 0.000000 1 4 23.292282 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.205334 ControlChange 0.000000 1 2 17.315525 ControlChange 0.000000 1 4 23.368270 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.348652 ControlChange 0.000000 1 2 17.299717 ControlChange 0.000000 1 4 23.445955 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.509966 ControlChange 0.000000 1 2 17.25 27 ControlChange 0.000000 1 4 23.525273 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.689835 ControlChange 0.000000 1 2 17.188540 ControlChange 0.000000 1 4 23.606156 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.888800 ControlChange 0.000000 1 2 17.119256 ControlChange 0.000000 1 4 23.688534 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.107372 ControlChange 0.000000 1 2 17.045723 ControlChange 0.000000 1 4 23.772329 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.345990 ControlChange 0.000000 1 2 16.969204 ControlChange 0.000000 1 4 23.857460 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.605023 ControlChange 0.000000 1 2 16.890456 ControlChange 0.000000 1 4 23.943839 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.884694 ControlChange 0.000000 1 2 16.809981 ControlChange 0.000000 1 4 24.031374 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 31.185042 ControlChange 0.000000 1 2 16.728135 ControlChange 0.000000 1 4 24.119962 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 31.505912 ControlChange 0.000000 1 2 16.645185 ControlChange 0.000000 1 4 24.209497 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 31.846835 ControlChange 0.000000 1 2 16.561340 ControlChange 0.000000 1 4 24.299862 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.206948 ControlChange 0.000000 1 2 16.476766 ControlChange 0.000000 1 4 24.390931 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.584922 ControlChange 0.000000 1 2 16.391605 ControlChange 0.000000 1 4 24.482567 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.978830 ControlChange 0.000000 1 2 16.305977 ControlChange 0.000000 1 4 24.574625 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.386033 ControlChange 0.000000 1 2 16.219992 ControlChange 0.000000 1 4 24.666941 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.803062 ControlChange 0.000000 1 2 16.133746 ControlChange 0.000000 1 4 24.759342 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.225521 ControlChange 0.000000 1 2 16.047334 ControlChange 0.000000 1 4 24.851635 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.648022 ControlChange 0.000000 1 2 15.960846 ControlChange 0.000000 1 4 24.943610 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.064193 ControlChange 0.000000 1 2 15.874376 ControlChange 0.000000 1 4 25.035034 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.466778 ControlChange 0.000000 1 2 15.788021 ControlChange 0.000000 1 4 25.125651 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.847842 ControlChange 0.000000 1 2 15.701885 ControlChange 0.000000 1 4 25.215176 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.199 2 ControlChange 0.000000 1 2 15.616086 ControlChange 0.000000 1 4 25.303294 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.512339 ControlChange 0.000000 1 2 15.530765 ControlChange 0.000000 1 4 25.389648 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.779885 ControlChange 0.000000 1 2 15.446088 ControlChange 0.000000 1 4 25.473841 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.995057 ControlChange 0.000000 1 2 15.362269 ControlChange 0.000000 1 4 25.555422 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.152502 ControlChange 0.000000 1 2 15.279592 ControlChange 0.000000 1 4 25.633880 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.248235 ControlChange 0.000000 1 2 15.198460 ControlChange 0.000000 1 4 25.708628 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.278209 ControlChange 0.000000 1 2 15.119486 ControlChange 0.000000 1 4 25.778991 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.239366 ControlChange 0.000000 1 2 15.043721 ControlChange 0.000000 1 4 25.844187 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.137871 ControlChange 0.000000 1 2 14.973462 ControlChange 0.000000 1 4 25.903298 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.986766 ControlChange 0.000000 1 2 14.914571 ControlChange 0.000000 1 4 25.955241 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.797491 ControlChange 0.000000 1 2 14.872358 ControlChange 0.000000 1 4 25.998717 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.577970 ControlChange 0.000000 1 2 14.831114 ControlChange 0.000000 1 4 26.032156 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.333792 ControlChange 0.000000 1 2 14.758194 ControlChange 0.000000 1 4 26.053838 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.069092 ControlChange 0.000000 1 2 14.640906 ControlChange 0.000000 1 4 26.063875 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.787047 ControlChange 0.000000 1 2 14.481240 ControlChange 0.000000 1 4 26.067099 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.490178 ControlChange 0.000000 1 2 14.284026 ControlChange 0.000000 1 4 26.069402 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.180544 ControlChange 0.000000 1 2 14.055197 ControlChange 0.000000 1 4 26.072972 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.859851 ControlChange 0.000000 1 2 13.801256 ControlChange 0.000000 1 4 26.078052 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.529540 ControlChange 0.000000 1 2 13.528764 ControlChange 0.000000 1 4 26.084691 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.190871 ControlChange 0.000000 1 2 13.243888 ControlChange 0.000000 1 4 26.092942 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.844948 ControlChange 0.000000 1 2 12.952091 ControlChange 0.000000 1 4 26. 2852 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.492778 ControlChange 0.000000 1 2 12.657981 ControlChange 0.000000 1 4 26.114466 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.135285 ControlChange 0.000000 1 2 12.365286 ControlChange 0.000000 1 4 26.127828 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.773334 ControlChange 0.000000 1 2 12.076906 ControlChange 0.000000 1 4 26.142976 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.407773 ControlChange 0.000000 1 2 11.795019 ControlChange 0.000000 1 4 26.159942 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.039439 ControlChange 0.000000 1 2 11.521201 ControlChange 0.000000 1 4 26.178748 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 31.669188 ControlChange 0.000000 1 2 11.256544 ControlChange 0.000000 1 4 26.199407 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 31.297923 ControlChange 0.000000 1 2 11.001760 ControlChange 0.000000 1 4 26.221920 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.926632 ControlChange 0.000000 1 2 10.757268 ControlChange 0.000000 1 4 26.246273 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.556435 ControlChange 0.000000 1 2 10.523271 ControlChange 0.000000 1 4 26.272433 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.188649 ControlChange 0.000000 1 2 10.299805 ControlChange 0.000000 1 4 26.300347 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.824894 ControlChange 0.000000 1 2 10.086790 ControlChange 0.000000 1 4 26.329940 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.467263 ControlChange 0.000000 1 2 9.884064 ControlChange 0.000000 1 4 26.361113 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.118610 ControlChange 0.000000 1 2 9.691409 ControlChange 0.000000 1 4 26.393739 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.783129 ControlChange 0.000000 1 2 9.508562 ControlChange 0.000000 1 4 26.427667 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.467619 ControlChange 0.000000 1 2 9.335237 ControlChange 0.000000 1 4 26.462718 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.185139 ControlChange 0.000000 1 2 9.171133 ControlChange 0.000000 1 4 26.498688 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.960905 ControlChange 0.000000 1 2 9.015946 ControlChange 0.000000 1 4 26.535353 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.795384 ControlChange 0.000000 1 2 8.869378 ControlChange 0.000000 1 4 26.572472 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.587037 ControlChange 0.000000 1 2 8.731120 ControlChange 0.000000 1 4 26.609788 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.219982 ControlChange 0.000000 1 2 8.600873 ControlChange 0.000000 1 4 26.647045 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.688712 ControlChange 0.000000 1 2 8.478352 ControlChange 0.000000 1 4 26.683981 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.030601 ControlChange 0.000000 1 2 8.363285 ControlChange 0.000000 1 4 26.720347 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.273373 ControlChange 0.000000 1 2 8.255395 ControlChange 0.000000 1 4 26.755904 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.435727 ControlChange 0.000000 1 2 8.154430 ControlChange 0.000000 1 4 26.790432 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.530975 ControlChange 0.000000 1 2 8.060148 ControlChange 0.000000 1 4 26.823734 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.568994 ControlChange 0.000000 1 2 7.972316 ControlChange 0.000000 1 4 26.855641 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.557357 ControlChange 0.000000 1 2 7.890699 ControlChange 0.000000 1 4 26.886006 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 20.502026 ControlChange 0.000000 1 2 7.815081 ControlChange 0.000000 1 4 26.914712 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 19.407769 ControlChange 0.000000 1 2 7.745272 ControlChange 0.000000 1 4 26.941667 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 18.278459 ControlChange 0.000000 1 2 7.681065 ControlChange 0.000000 1 4 26.966804 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 17.117353 ControlChange 0.000000 1 2 7.622275 ControlChange 0.000000 1 4 26.990077 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 15.927171 ControlChange 0.000000 1 2 7.568728 ControlChange 0.000000 1 4 27.011460 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.710179 ControlChange 0.000000 1 2 7.520256 ControlChange 0.000000 1 4 27.030946 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 13.468304 ControlChange 0.000000 1 2 7.476694 ControlChange 0.000000 1 4 27.048541 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 12.203205 ControlChange 0.000000 1 2 7.437889 ControlChange 0.000000 1 4 27.064262 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.916304 ControlChange 0.000000 1 2 7.403702 ControlChange 0.000000 1 4 27.078138 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 9.608810 ControlChange 0.000000 1 2 7.373987 ControlChange 0.000000 1 4 27.090204 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 8.281785 ControlChange 0.000000 1 2 7.348613 ControlChange 0.000000 1 4 27.100502 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 6.936145 ControlChange 0.000000 1 2 7.327447 ControlChange 0.000000 1 4 27.109079 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 5.572720 ControlChange 0.000000 1 2 7.310369 ControlChange 0.000000 1 4 27.115982 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 4.192383 ControlChange 0.000000 1 2 7.297271 ControlChange 0.000000 1 4 27.121264 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 2.797090 ControlChange 0.000000 1 2 7.288038 ControlChange 0.000000 1 4 27.124976 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 1.352454 ControlChange 0.000000 1 2 7.283906 ControlChange 0.000000 1 4 27.126411 ControlChange 0.000000 1 101 394.229801 ControlChange 0.004167 1 100 0.533297 ControlChange 0.000000 1 2 7.300394 ControlChange 0.000000 1 4 27.117016 ControlChange 0.000000 1 101 417.512416 ControlChange 0.004167 1 100 3.383028 ControlChange 0.000000 1 2 7.384755 ControlChange 0.000000 1 4 27.072556 ControlChange 0.000000 1 101 468.366322 ControlChange 0.004167 1 100 6.646695 ControlChange 0.000000 1 2 7.591461 ControlChange 0.000000 1 4 26.971015 ControlChange 0.000000 1 101 491.648937 ControlChange 0.004167 1 100 9.909737 ControlChange 0.000000 1 2 7.954257 ControlChange 0.000000 1 4 26.808644 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 13.125845 ControlChange 0.000000 1 2 8.499388 ControlChange 0.000000 1 4 26.590226 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 16.288447 ControlChange 0.000000 1 2 9.258347 ControlChange 0.000000 1 4 26.321647 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 19.386285 ControlChange 0.000000 1 2 10.259110 ControlChange 0.000000 1 4 26.009075 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 22.400925 ControlChange 0.000000 1 2 11.428623 ControlChange 0.000000 1 4 25.659116 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.299364 ControlChange 0.000000 1 2 12.381298 ControlChange 0.000000 1 4 25.278842 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.005809 ControlChange 0.000000 1 2 12.751235 ControlChange 0.000000 1 4 24.875903 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.301688 ControlChange 0.000000 1 2 12.859000 ControlChange 0.000000 1 4 24.458673 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.840608 ControlChange 0.000000 1 2 12.944375 ControlChange 0.000000 1 4 24.036418 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 32.665040 ControlChange 0.000000 1 2 13.030969 ControlChange 0.000000 1 4 23.619514 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 33.287114 ControlChange 0.000000 1 2 13.118240 ControlChange 0.000000 1 4 23.219711 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 33.897647 ControlChange 0.000000 1 2 13.206002 ControlChange 0.000000 1 4 22.850490 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.474050 ControlChange 0.000000 1 2 13.291550 ControlChange 0.000000 1 4 22.527543 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.999861 ControlChange 0.000000 1 2 13.349197 ControlChange 0.000000 1 4 22.269475 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 35.466274 ControlChange 0.000000 1 2 13.337108 ControlChange 0.000000 1 4 22.096944 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 35.865919 ControlChange 0.000000 1 2 13.270790 ControlChange 0.000000 1 4 22.017197 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.191537 ControlChange 0.000000 1 2 13.177678 ControlChange 0.000000 1 4 21.999860 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.435178 ControlChange 0.000000 1 2 13.071593 ControlChange 0.000000 1 4 22.002822 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.583550 ControlChange 0.000000 1 2 12.960412 ControlChange 0.000000 1 4 22.0 225 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.579199 ControlChange 0.000000 1 2 12.848999 ControlChange 0.000000 1 4 22.020709 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.284148 ControlChange 0.000000 1 2 12.740372 ControlChange 0.000000 1 4 22.034328 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 35.588817 ControlChange 0.000000 1 2 12.636404 ControlChange 0.000000 1 4 22.051119 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.491572 ControlChange 0.000000 1 2 12.538235 ControlChange 0.000000 1 4 22.071090 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 33.042590 ControlChange 0.000000 1 2 12.446543 ControlChange 0.000000 1 4 22.094218 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.368463 ControlChange 0.000000 1 2 12.361697 ControlChange 0.000000 1 4 22.120426 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.791917 ControlChange 0.000000 1 2 12.283863 ControlChange 0.000000 1 4 22.149574 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.428157 ControlChange 0.000000 1 2 12.213076 ControlChange 0.000000 1 4 22.181440 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.738235 ControlChange 0.000000 1 2 12.149284 ControlChange 0.000000 1 4 22.215699 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.625513 ControlChange 0.000000 1 2 12.092386 ControlChange 0.000000 1 4 22.251894 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 22.254885 ControlChange 0.000000 1 2 12.042239 ControlChange 0.000000 1 4 22.289412 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 19.717143 ControlChange 0.000000 1 2 11.998671 ControlChange 0.000000 1 4 22.327464 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 17.058726 ControlChange 0.000000 1 2 11.961503 ControlChange 0.000000 1 4 22.365057 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 14.308315 ControlChange 0.000000 1 2 11.930546 ControlChange 0.000000 1 4 22.400993 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 11.486021 ControlChange 0.000000 1 2 11.905614 ControlChange 0.000000 1 4 22.433878 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 8.608356 ControlChange 0.000000 1 2 11.886528 ControlChange 0.000000 1 4 22.462162 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 5.696800 ControlChange 0.000000 1 2 11.873094 ControlChange 0.000000 1 4 22.484206 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 2.808488 ControlChange 0.000000 1 2 11.865406 ControlChange 0.000000 1 4 22.498317 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 0.009296 ControlChange 0.000000 1 2 11.866370 ControlChange 0.000000 1 4 22.502293 ControlChange 0.000000 1 101 492.701660 ControlChange 0.004167 1 100 2.980988 ControlChange 0.000000 1 2 11.884543 ControlChange 0.000000 1 4 22.492964 ControlChange 0.000000 1 101 480.388671 ControlChange 0.004167 1 100 6.424656 ControlChange 0.000000 1 2 11.927842 ControlChange 0.000000 1 4 22.467785 ControlChange 0.000000 1 101 453.494631 ControlChange 0.004167 1 100 10.165899 ControlChange 0.000000 1 2 11.997653 ControlChange 0.000000 1 4 22.426036 ControlChange 0.000000 1 101 441.181642 ControlChange 0.004167 1 100 13.987329 ControlChange 0.000000 1 2 12.091997 ControlChange 0.000000 1 4 22.367865 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 17.806428 ControlChange 0.000000 1 2 12.208025 ControlChange 0.000000 1 4 22.293646 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 21.575215 ControlChange 0.000000 1 2 12.342122 ControlChange 0.000000 1 4 22.203965 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 25.246045 ControlChange 0.000000 1 2 12.489738 ControlChange 0.000000 1 4 22.099662 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 28.753386 ControlChange 0.000000 1 2 12.645110 ControlChange 0.000000 1 4 21.981868 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 31.972330 ControlChange 0.000000 1 2 12.800869 ControlChange 0.000000 1 4 21.852083 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.641545 ControlChange 0.000000 1 2 12.947533 ControlChange 0.000000 1 4 21.712210 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 36.734967 ControlChange 0.000000 1 2 13.072776 ControlChange 0.000000 1 4 21.564620 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 38.856343 ControlChange 0.000000 1 2 13.158585 ControlChange 0.000000 1 4 21.412223 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.785166 ControlChange 0.000000 1 2 13.168454 ControlChange 0.000000 1 4 21.258502 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 41.630485 ControlChange 0.000000 1 2 13.073132 ControlChange 0.000000 1 4 21.107542 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 41.363498 ControlChange 0.000000 1 2 12.902715 ControlChange 0.000000 1 4 20.964045 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.315145 ControlChange 0.000000 1 2 12.547470 ControlChange 0.000000 1 4 20.833304 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 38.657911 ControlChange 0.000000 1 2 11.815608 ControlChange 0.000000 1 4 20.721112 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 36.507251 ControlChange 0.000000 1 2 10.923483 ControlChange 0.000000 1 4 20.633637 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.116746 ControlChange 0.000000 1 2 10.094794 ControlChange 0.000000 1 4 20.576756 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 32.075698 ControlChange 0.000000 1 2 9.373735 ControlChange 0.000000 1 4 20.551080 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 30.650789 ControlChange 0.000000 1 2 8.749968 ControlChange 0.000000 1 4 20.545302 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 29.067612 ControlChange 0.000000 1 2 8.2 498 ControlChange 0.000000 1 4 20.545490 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 27.063073 ControlChange 0.000000 1 2 7.744869 ControlChange 0.000000 1 4 20.546547 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 24.779383 ControlChange 0.000000 1 2 7.344676 ControlChange 0.000000 1 4 20.547985 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 22.3 423 ControlChange 0.000000 1 2 7.003128 ControlChange 0.000000 1 4 20.549746 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 19.706471 ControlChange 0.000000 1 2 6.714728 ControlChange 0.000000 1 4 20.551738 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 16.999252 ControlChange 0.000000 1 2 6.474812 ControlChange 0.000000 1 4 20.553843 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 14.211286 ControlChange 0.000000 1 2 6.279380 ControlChange 0.000000 1 4 20.555926 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 11.360618 ControlChange 0.000000 1 2 6.125053 ControlChange 0.000000 1 4 20.557844 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 8.464675 ControlChange 0.000000 1 2 6.008928 ControlChange 0.000000 1 4 20.559470 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 5.551728 ControlChange 0.000000 1 2 5.928454 ControlChange 0.000000 1 4 20.560701 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 2.692417 ControlChange 0.000000 1 2 5.903228 ControlChange 0.000000 1 4 20.562239 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 0.140921 ControlChange 0.000000 1 2 6.164957 ControlChange 0.000000 1 4 20.572876 ControlChange 0.000000 1 101 438.947277 ControlChange 0.004167 1 100 3.189658 ControlChange 0.000000 1 2 7.260423 ControlChange 0.000000 1 4 20.618132 ControlChange 0.000000 1 101 427.977651 ControlChange 0.004167 1 100 6.386116 ControlChange 0.000000 1 2 9.389725 ControlChange 0.000000 1 4 20.722944 ControlChange 0.000000 1 101 404.017785 ControlChange 0.004167 1 100 9.595142 ControlChange 0.000000 1 2 12.035366 ControlChange 0.000000 1 4 20.894257 ControlChange 0.000000 1 101 393.048159 ControlChange 0.004167 1 100 12.777734 ControlChange 0.000000 1 2 14.112230 ControlChange 0.000000 1 4 21.129517 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 15.921715 ControlChange 0.000000 1 2 14.896458 ControlChange 0.000000 1 4 21.423562 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 19.015075 ControlChange 0.000000 1 2 15.146165 ControlChange 0.000000 1 4 21.769195 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.040450 ControlChange 0.000000 1 2 15.370894 ControlChange 0.000000 1 4 22.157013 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.968075 ControlChange 0.000000 1 2 15.608159 ControlChange 0.000000 1 4 22.575476 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 27.728792 ControlChange 0.000000 1 2 15.851069 ControlChange 0.000000 1 4 23.011073 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.120937 ControlChange 0.000000 1 2 16.096103 ControlChange 0.000000 1 4 23.448717 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 31.878223 ControlChange 0.000000 1 2 16.340595 ControlChange 0.000000 1 4 23.872391 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.226512 ControlChange 0.000000 1 2 16.581826 ControlChange 0.000000 1 4 24.265911 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.734798 ControlChange 0.000000 1 2 16.816111 ControlChange 0.000000 1 4 24.613721 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.372515 ControlChange 0.000000 1 2 17.036203 ControlChange 0.000000 1 4 24.901651 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.906456 ControlChange 0.000000 1 2 17.216971 ControlChange 0.000000 1 4 25.117543 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.209838 ControlChange 0.000000 1 2 17.267364 ControlChange 0.000000 1 4 25.252598 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.206138 ControlChange 0.000000 1 2 17.058086 ControlChange 0.000000 1 4 25.310168 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.839605 ControlChange 0.000000 1 2 16.619779 ControlChange 0.000000 1 4 25.316224 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.096561 ControlChange 0.000000 1 2 16.105938 ControlChange 0.000000 1 4 25.299358 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.044031 ControlChange 0.000000 1 2 15.619126 ControlChange 0.000000 1 4 25.269555 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.765575 ControlChange 0.000000 1 2 15.187970 ControlChange 0.000000 1 4 25.227594 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.282534 ControlChange 0.000000 1 2 14.811747 ControlChange 0.000000 1 4 25.173423 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.584453 ControlChange 0.000000 1 2 14.483450 ControlChange 0.000000 1 4 25.107113 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 38.663034 ControlChange 0.000000 1 2 14.195977 ControlChange 0.000000 1 4 25.028889 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.538002 ControlChange 0.000000 1 2 13.943358 ControlChange 0.000000 1 4 24.939153 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.342661 ControlChange 0.000000 1 2 13.720801 ControlChange 0.000000 1 4 24.838505 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.279744 ControlChange 0.000000 1 2 13.524416 ControlChange 0.000000 1 4 24.727794 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.189990 ControlChange 0.000000 1 2 13.351060 ControlChange 0.000000 1 4 24.608150 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.677684 ControlChange 0.000000 1 2 13.198133 ControlChange 0.000000 1 4 24.481002 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.768306 ControlChange 0.000000 1 2 13.063495 ControlChange 0.000000 1 4 24.348099 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.623480 ControlChange 0.000000 1 2 12.945361 ControlChange 0.000000 1 4 24.211502 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.325442 ControlChange 0.000000 1 2 12.842201 ControlChange 0.000000 1 4 24.073568 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.916207 ControlChange 0.000000 1 2 12.752708 ControlChange 0.000000 1 4 23.936902 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.421245 ControlChange 0.000000 1 2 12.675760 ControlChange 0.000000 1 4 23.804287 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 18.857632 ControlChange 0.000000 1 2 12.610383 ControlChange 0.000000 1 4 23.678596 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 16.237732 ControlChange 0.000000 1 2 12.555732 ControlChange 0.000000 1 4 23.562674 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 13.571094 ControlChange 0.000000 1 2 12.511050 ControlChange 0.000000 1 4 23.459245 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.865808 ControlChange 0.000000 1 2 12.475672 ControlChange 0.000000 1 4 23.370796 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 8.130037 ControlChange 0.000000 1 2 12.448982 ControlChange 0.000000 1 4 23.299491 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 5.377766 ControlChange 0.000000 1 2 12.430448 ControlChange 0.000000 1 4 23.247124 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 2.688581 ControlChange 0.000000 1 2 12.419883 ControlChange 0.000000 1 4 23.214653 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 0.433837 ControlChange 0.000000 1 2 12.420337 ControlChange 0.000000 1 4 23.198159 ControlChange 0.000000 1 101 391.512962 ControlChange 0.004167 1 100 1.112117 ControlChange 0.000000 1 2 12.441701 ControlChange 0.000000 1 4 23.184119 ControlChange 0.000000 1 101 386.485463 ControlChange 0.004167 1 100 2.620767 ControlChange 0.000000 1 2 12.494505 ControlChange 0.000000 1 4 23.158954 ControlChange 0.000000 1 101 375.504396 ControlChange 0.004167 1 100 4.341279 ControlChange 0.000000 1 2 12.583251 ControlChange 0.000000 1 4 23.118481 ControlChange 0.000000 1 101 370.476897 ControlChange 0.004167 1 100 6.173943 ControlChange 0.000000 1 2 12.709330 ControlChange 0.000000 1 4 23.063033 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 8.063899 ControlChange 0.000000 1 2 12.873606 ControlChange 0.000000 1 4 22.993402 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 9.985648 ControlChange 0.000000 1 2 13.076448 ControlChange 0.000000 1 4 22.9 402 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 11.923634 ControlChange 0.000000 1 2 13.317508 ControlChange 0.000000 1 4 22.814893 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 13.866841 ControlChange 0.000000 1 2 13.595285 ControlChange 0.000000 1 4 22.707773 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 15.806527 ControlChange 0.000000 1 2 13.906350 ControlChange 0.000000 1 4 22.589977 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 17.735045 ControlChange 0.000000 1 2 14.244264 ControlChange 0.000000 1 4 22.462490 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 19.645088 ControlChange 0.000000 1 2 14.597741 ControlChange 0.000000 1 4 22.326347 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 21.529091 ControlChange 0.000000 1 2 14.947810 ControlChange 0.000000 1 4 22.182630 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 23.378669 ControlChange 0.000000 1 2 15.263426 ControlChange 0.000000 1 4 22.032484 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 25.183987 ControlChange 0.000000 1 2 15.499850 ControlChange 0.000000 1 4 21.877121 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 26.932734 ControlChange 0.000000 1 2 15.634624 ControlChange 0.000000 1 4 21.717823 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 28.608458 ControlChange 0.000000 1 2 15.717620 ControlChange 0.000000 1 4 21.555952 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 30.187887 ControlChange 0.000000 1 2 15.802265 ControlChange 0.000000 1 4 21.392956 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 31.634897 ControlChange 0.000000 1 2 15.896753 ControlChange 0.000000 1 4 21.230379 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 32.885679 ControlChange 0.000000 1 2 15.996100 ControlChange 0.000000 1 4 21.069870 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.822640 ControlChange 0.000000 1 2 16.098126 ControlChange 0.000000 1 4 20.913200 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.355980 ControlChange 0.000000 1 2 16.201850 ControlChange 0.000000 1 4 20.762269 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.659555 ControlChange 0.000000 1 2 16.306598 ControlChange 0.000000 1 4 20.619126 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 35.033356 ControlChange 0.000000 1 2 16.411532 ControlChange 0.000000 1 4 20.485988 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 35.545922 ControlChange 0.000000 1 2 16.505655 ControlChange 0.000000 1 4 20.365256 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.135908 ControlChange 0.000000 1 2 16.504450 ControlChange 0.000000 1 4 20.259548 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.743573 ControlChange 0.000000 1 2 16.307521 ControlChange 0.000000 1 4 20.171719 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.325986 ControlChange 0.000000 1 2 16.036411 ControlChange 0.000000 1 4 20. 4905 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.854719 ControlChange 0.000000 1 2 15.774772 ControlChange 0.000000 1 4 20.062204 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.312401 ControlChange 0.000000 1 2 15.527595 ControlChange 0.000000 1 4 20.043499 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.689539 ControlChange 0.000000 1 2 15.292561 ControlChange 0.000000 1 4 20.040926 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.981923 ControlChange 0.000000 1 2 15.068227 ControlChange 0.000000 1 4 20.044851 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.188774 ControlChange 0.000000 1 2 14.853566 ControlChange 0.000000 1 4 20.051532 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.311505 ControlChange 0.000000 1 2 14.647793 ControlChange 0.000000 1 4 20.060363 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.354235 ControlChange 0.000000 1 2 14.450280 ControlChange 0.000000 1 4 20.071089 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.325215 ControlChange 0.000000 1 2 14.260513 ControlChange 0.000000 1 4 20.083493 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.234951 ControlChange 0.000000 1 2 14.078057 ControlChange 0.000000 1 4 20.097391 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.091871 ControlChange 0.000000 1 2 13.902540 ControlChange 0.000000 1 4 20.112624 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.902221 ControlChange 0.000000 1 2 13.733639 ControlChange 0.000000 1 4 20.129052 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.671111 ControlChange 0.000000 1 2 13.571072 ControlChange 0.000000 1 4 20.146551 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.402852 ControlChange 0.000000 1 2 13.414582 ControlChange 0.000000 1 4 20.165012 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.101122 ControlChange 0.000000 1 2 13.263942 ControlChange 0.000000 1 4 20.184335 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.769111 ControlChange 0.000000 1 2 13.118948 ControlChange 0.000000 1 4 20.204431 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.409638 ControlChange 0.000000 1 2 12.979416 ControlChange 0.000000 1 4 20.225219 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.025254 ControlChange 0.000000 1 2 12.845176 ControlChange 0.000000 1 4 20.246623 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.618405 ControlChange 0.000000 1 2 12.716068 ControlChange 0.000000 1 4 20.268576 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.191479 ControlChange 0.000000 1 2 12.591947 ControlChange 0.000000 1 4 20.291012 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 35.746972 ControlChange 0.000000 1 2 12.472679 ControlChange 0.000000 1 4 20.313871 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 35.287749 ControlChange 0.000000 1 2 12.358139 ControlChange 0.000000 1 4 20.337095 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.817535 ControlChange 0.000000 1 2 12.248211 ControlChange 0.000000 1 4 20.360631 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.342123 ControlChange 0.000000 1 2 12.142787 ControlChange 0.000000 1 4 20.384426 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.874332 ControlChange 0.000000 1 2 12.041765 ControlChange 0.000000 1 4 20.408431 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.450909 ControlChange 0.000000 1 2 11.945050 ControlChange 0.000000 1 4 20.432597 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.109953 ControlChange 0.000000 1 2 11.852548 ControlChange 0.000000 1 4 20.456877 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 32.759271 ControlChange 0.000000 1 2 11.764173 ControlChange 0.000000 1 4 20.481225 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 32.220342 ControlChange 0.000000 1 2 11.679843 ControlChange 0.000000 1 4 20.505593 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 31.479892 ControlChange 0.000000 1 2 11.599483 ControlChange 0.000000 1 4 20.529938 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 30.597229 ControlChange 0.000000 1 2 11.523022 ControlChange 0.000000 1 4 20.554211 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 29.611561 ControlChange 0.000000 1 2 11.450387 ControlChange 0.000000 1 4 20.578367 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 28.546555 ControlChange 0.000000 1 2 11.381509 ControlChange 0.000000 1 4 20.602359 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 27.418025 ControlChange 0.000000 1 2 11.316327 ControlChange 0.000000 1 4 20.626138 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 26.237186 ControlChange 0.000000 1 2 11.254784 ControlChange 0.000000 1 4 20.649655 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 25.012321 ControlChange 0.000000 1 2 11.196818 ControlChange 0.000000 1 4 20.672856 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 23.749789 ControlChange 0.000000 1 2 11.142372 ControlChange 0.000000 1 4 20.695689 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 22.454644 ControlChange 0.000000 1 2 11.091392 ControlChange 0.000000 1 4 20.718096 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 21.130996 ControlChange 0.000000 1 2 11.043826 ControlChange 0.000000 1 4 20.740017 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 19.782259 ControlChange 0.000000 1 2 10.999624 ControlChange 0.000000 1 4 20.761388 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 18.411321 ControlChange 0.000000 1 2 10.958744 ControlChange 0.000000 1 4 20.782139 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 17.020700 ControlChange 0.000000 1 2 10.921139 ControlChange 0.000000 1 4 20.802195 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 15.612672 ControlChange 0.000000 1 2 10.886759 ControlChange 0.000000 1 4 20.821477 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 14.189327 ControlChange 0.000000 1 2 10.855565 ControlChange 0.000000 1 4 20.839894 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 12.752650 ControlChange 0.000000 1 2 10.827515 ControlChange 0.000000 1 4 20.857349 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 11.304629 ControlChange 0.000000 1 2 10.802567 ControlChange 0.000000 1 4 20.873731 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 9.847397 ControlChange 0.000000 1 2 10.780683 ControlChange 0.000000 1 4 20.888917 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 8.383384 ControlChange 0.000000 1 2 10.761833 ControlChange 0.000000 1 4 20.902770 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 6.915652 ControlChange 0.000000 1 2 10.745974 ControlChange 0.000000 1 4 20.915130 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 5.448552 ControlChange 0.000000 1 2 10.733066 ControlChange 0.000000 1 4 20.925813 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 3.989404 ControlChange 0.000000 1 2 10.723078 ControlChange 0.000000 1 4 20.934607 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 2.556756 ControlChange 0.000000 1 2 10.715980 ControlChange 0.000000 1 4 20.941258 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 1.191408 ControlChange 0.000000 1 2 10.712778 ControlChange 0.000000 1 4 20.945704 ControlChange 0.000000 1 101 371.529620 ControlChange 0.004167 1 100 0.249285 ControlChange 0.000000 1 2 10.725363 ControlChange 0.000000 1 4 20.950317 ControlChange 0.000000 1 101 387.526745 ControlChange 0.004167 1 100 2.212343 ControlChange 0.000000 1 2 10.789097 ControlChange 0.000000 1 4 20.962493 ControlChange 0.000000 1 101 422.467678 ControlChange 0.004167 1 100 4.697494 ControlChange 0.000000 1 2 10.941964 ControlChange 0.000000 1 4 20.989213 ControlChange 0.000000 1 101 438.464803 ControlChange 0.004167 1 100 7.398894 ControlChange 0.000000 1 2 11.201818 ControlChange 0.000000 1 4 21.031897 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 10.149059 ControlChange 0.000000 1 2 11.575605 ControlChange 0.000000 1 4 21.089310 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 12.895031 ControlChange 0.000000 1 2 12.065487 ControlChange 0.000000 1 4 21.159903 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 15.609266 ControlChange 0.000000 1 2 12.656004 ControlChange 0.000000 1 4 21.242067 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 18.268510 ControlChange 0.000000 1 2 13.261245 ControlChange 0.000000 1 4 21.334135 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 20.847462 ControlChange 0.000000 1 2 13.693264 ControlChange 0.000000 1 4 21.434385 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 23.313185 ControlChange 0.000000 1 2 13.871294 ControlChange 0.000000 1 4 21.541033 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 25.615272 ControlChange 0.000000 1 2 13.960485 ControlChange 0.000000 1 4 21.652242 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 27.659710 ControlChange 0.000000 1 2 14.049473 ControlChange 0.000000 1 4 21.766133 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 29.286632 ControlChange 0.000000 1 2 14.139514 ControlChange 0.000000 1 4 21.880776 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 30.639136 ControlChange 0.000000 1 2 14.226366 ControlChange 0.000000 1 4 21.994205 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 32.338614 ControlChange 0.000000 1 2 14.306624 ControlChange 0.000000 1 4 22. 4416 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.246989 ControlChange 0.000000 1 2 14.375858 ControlChange 0.000000 1 4 22.209374 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 35.889547 ControlChange 0.000000 1 2 14.423867 ControlChange 0.000000 1 4 22.307026 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.001176 ControlChange 0.000000 1 2 14.4 467 ControlChange 0.000000 1 4 22.395290 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.498147 ControlChange 0.000000 1 2 14.258358 ControlChange 0.000000 1 4 22.472082 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.518576 ControlChange 0.000000 1 2 13.944585 ControlChange 0.000000 1 4 22.535305 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.278895 ControlChange 0.000000 1 2 13.531977 ControlChange 0.000000 1 4 22.582854 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 36.856554 ControlChange 0.000000 1 2 13.090851 ControlChange 0.000000 1 4 22.612833 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 36.248251 ControlChange 0.000000 1 2 12.661083 ControlChange 0.000000 1 4 22.625305 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 35.440943 ControlChange 0.000000 1 2 12.259799 ControlChange 0.000000 1 4 22.624671 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.425270 ControlChange 0.000000 1 2 11.892561 ControlChange 0.000000 1 4 22.616199 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 33.249173 ControlChange 0.000000 1 2 11.559805 ControlChange 0.000000 1 4 22.601824 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 32.136693 ControlChange 0.000000 1 2 11.259877 ControlChange 0.000000 1 4 22.581783 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 31.204249 ControlChange 0.000000 1 2 10.990443 ControlChange 0.000000 1 4 22.556207 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 30.060208 ControlChange 0.000000 1 2 10.749055 ControlChange 0.000000 1 4 22.525308 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 28.614620 ControlChange 0.000000 1 2 10.533350 ControlChange 0.000000 1 4 22.489390 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 26.978689 ControlChange 0.000000 1 2 10.341159 ControlChange 0.000000 1 4 22.448861 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 25.216811 ControlChange 0.000000 1 2 10.170547 ControlChange 0.000000 1 4 22.404254 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 23.362301 ControlChange 0.000000 1 2 10.019795 ControlChange 0.000000 1 4 22.356236 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 21.435488 ControlChange 0.000000 1 2 9.887364 ControlChange 0.000000 1 4 22.305624 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 19.449958 ControlChange 0.000000 1 2 9.771898 ControlChange 0.000000 1 4 22.253389 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 17.415254 ControlChange 0.000000 1 2 9.672176 ControlChange 0.000000 1 4 22.200656 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 15.338342 ControlChange 0.000000 1 2 9.587127 ControlChange 0.000000 1 4 22.148697 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 13.224556 ControlChange 0.000000 1 2 9.515777 ControlChange 0.000000 1 4 22.098907 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 11.078050 ControlChange 0.000000 1 2 9.457245 ControlChange 0.000000 1 4 22.052776 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 8.902127 ControlChange 0.000000 1 2 9.410776 ControlChange 0.000000 1 4 22.011847 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 6.699619 ControlChange 0.000000 1 2 9.375642 ControlChange 0.000000 1 4 21.977664 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 4.474067 ControlChange 0.000000 1 2 9.351190 ControlChange 0.000000 1 4 21.951715 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 2.249064 ControlChange 0.000000 1 2 9.336942 ControlChange 0.000000 1 4 21.936005 ControlChange 0.000000 1 101 443.230884 ControlChange 0.004167 1 100 0.165056 ControlChange 0.000000 1 2 9.333616 ControlChange 0.000000 1 4 21.938610 ControlChange 0.000000 1 101 476.897473 ControlChange 0.004167 1 100 1.609675 ControlChange 0.000000 1 2 9.344518 ControlChange 0.000000 1 4 21.977934 ControlChange 0.000000 1 101 550.432063 ControlChange 0.004167 1 100 3.231851 ControlChange 0.000000 1 2 9.373402 ControlChange 0.000000 1 4 22.065316 ControlChange 0.000000 1 101 584.098651 ControlChange 0.004167 1 100 4.824174 ControlChange 0.000000 1 2 9.422051 ControlChange 0.000000 1 4 22.195761 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 6.401068 ControlChange 0.000000 1 2 9.491239 ControlChange 0.000000 1 4 22.360011 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 7.962998 ControlChange 0.000000 1 2 9.581705 ControlChange 0.000000 1 4 22.550913 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 9.509890 ControlChange 0.000000 1 2 9.694174 ControlChange 0.000000 1 4 22.763118 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 11.041367 ControlChange 0.000000 1 2 9.829393 ControlChange 0.000000 1 4 22.992478 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 12.556810 ControlChange 0.000000 1 2 9.988120 ControlChange 0.000000 1 4 23.235673 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 14.055404 ControlChange 0.000000 1 2 10.17 48 ControlChange 0.000000 1 4 23.489965 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 15.536109 ControlChange 0.000000 1 2 10.378806 ControlChange 0.000000 1 4 23.753039 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 16.997630 ControlChange 0.000000 1 2 10.611876 ControlChange 0.000000 1 4 24.022896 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 18.438428 ControlChange 0.000000 1 2 10.870481 ControlChange 0.000000 1 4 24.297755 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 19.856618 ControlChange 0.000000 1 2 11.154369 ControlChange 0.000000 1 4 24.576005 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 21.249872 ControlChange 0.000000 1 2 11.462485 ControlChange 0.000000 1 4 24.856158 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 22.615395 ControlChange 0.000000 1 2 11.792307 ControlChange 0.000000 1 4 25.136805 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.949651 ControlChange 0.000000 1 2 12.138591 ControlChange 0.000000 1 4 25.416589 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.248175 ControlChange 0.000000 1 2 12.490654 ControlChange 0.000000 1 4 25.694169 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.505227 ControlChange 0.000000 1 2 12.825737 ControlChange 0.000000 1 4 25.968199 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.713125 ControlChange 0.000000 1 2 13.090601 ControlChange 0.000000 1 4 26.237296 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.861230 ControlChange 0.000000 1 2 13.176345 ControlChange 0.000000 1 4 26.500021 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.934196 ControlChange 0.000000 1 2 13.032416 ControlChange 0.000000 1 4 26.754834 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 30.907970 ControlChange 0.000000 1 2 12.832094 ControlChange 0.000000 1 4 27.000062 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 31.740357 ControlChange 0.000000 1 2 12.703413 ControlChange 0.000000 1 4 27.233865 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 32.355051 ControlChange 0.000000 1 2 12.637431 ControlChange 0.000000 1 4 27.454161 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 32.690885 ControlChange 0.000000 1 2 12.563679 ControlChange 0.000000 1 4 27.658563 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 32.850758 ControlChange 0.000000 1 2 12.455259 ControlChange 0.000000 1 4 27.844288 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.034919 ControlChange 0.000000 1 2 12.317350 ControlChange 0.000000 1 4 28.008009 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.322086 ControlChange 0.000000 1 2 12.157779 ControlChange 0.000000 1 4 28.145668 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.710619 ControlChange 0.000000 1 2 11.983254 ControlChange 0.000000 1 4 28.252197 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.187706 ControlChange 0.000000 1 2 11.799251 ControlChange 0.000000 1 4 28.321713 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.737748 ControlChange 0.000000 1 2 11.610081 ControlChange 0.000000 1 4 28.353077 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.343151 ControlChange 0.000000 1 2 11.419044 ControlChange 0.000000 1 4 28.358714 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.985362 ControlChange 0.000000 1 2 11.228611 ControlChange 0.000000 1 4 28.354790 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.645968 ControlChange 0.000000 1 2 11.040599 ControlChange 0.000000 1 4 28.347290 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.307704 ControlChange 0.000000 1 2 10.856317 ControlChange 0.000000 1 4 28.336706 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.955201 ControlChange 0.000000 1 2 10.676690 ControlChange 0.000000 1 4 28.322995 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.575441 ControlChange 0.000000 1 2 10.502350 ControlChange 0.000000 1 4 28.306128 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.157904 ControlChange 0.000000 1 2 10.333715 ControlChange 0.000000 1 4 28.286086 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.694503 ControlChange 0.000000 1 2 10.17 43 ControlChange 0.000000 1 4 28.262863 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.179413 ControlChange 0.000000 1 2 10.014471 ControlChange 0.000000 1 4 28.236471 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.608709 ControlChange 0.000000 1 2 9.864047 ControlChange 0.000000 1 4 28.206938 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.980027 ControlChange 0.000000 1 2 9.719757 ControlChange 0.000000 1 4 28.174318 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.292261 ControlChange 0.000000 1 2 9.581546 ControlChange 0.000000 1 4 28.138689 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.545297 ControlChange 0.000000 1 2 9.449317 ControlChange 0.000000 1 4 28.100151 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.739808 ControlChange 0.000000 1 2 9.322955 ControlChange 0.000000 1 4 28.058833 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.876906 ControlChange 0.000000 1 2 9.202334 ControlChange 0.000000 1 4 28.014895 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.957410 ControlChange 0.000000 1 2 9.087310 ControlChange 0.000000 1 4 27.968522 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.975082 ControlChange 0.000000 1 2 8.977734 ControlChange 0.000000 1 4 27.919935 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.908459 ControlChange 0.000000 1 2 8.873461 ControlChange 0.000000 1 4 27.869381 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.735840 ControlChange 0.000000 1 2 8.774339 ControlChange 0.000000 1 4 27.817134 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.449903 ControlChange 0.000000 1 2 8.680222 ControlChange 0.000000 1 4 27.763494 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.050595 ControlChange 0.000000 1 2 8.590962 ControlChange 0.000000 1 4 27.708780 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.538348 ControlChange 0.000000 1 2 8.506417 ControlChange 0.000000 1 4 27.653328 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.913405 ControlChange 0.000000 1 2 8.426448 ControlChange 0.000000 1 4 27.597487 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.175903 ControlChange 0.000000 1 2 8.350916 ControlChange 0.000000 1 4 27.541607 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.325929 ControlChange 0.000000 1 2 8.279691 ControlChange 0.000000 1 4 27.486040 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.363814 ControlChange 0.000000 1 2 8.212653 ControlChange 0.000000 1 4 27.431130 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.290523 ControlChange 0.000000 1 2 8.149678 ControlChange 0.000000 1 4 27.377209 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.109394 ControlChange 0.000000 1 2 8.090650 ControlChange 0.000000 1 4 27.324593 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.836254 ControlChange 0.000000 1 2 8.035451 ControlChange 0.000000 1 4 27.273572 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 32.555330 ControlChange 0.000000 1 2 7.983973 ControlChange 0.000000 1 4 27.224414 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 31.471679 ControlChange 0.000000 1 2 7.936117 ControlChange 0.000000 1 4 27.177359 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 30.580212 ControlChange 0.000000 1 2 7.891781 ControlChange 0.000000 1 4 27.132618 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.447088 ControlChange 0.000000 1 2 7.850867 ControlChange 0.000000 1 4 27.090373 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.984795 ControlChange 0.000000 1 2 7.813284 ControlChange 0.000000 1 4 27.050777 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.307325 ControlChange 0.000000 1 2 7.778944 ControlChange 0.000000 1 4 27.013954 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.483663 ControlChange 0.000000 1 2 7.747760 ControlChange 0.000000 1 4 26.980001 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 22.550820 ControlChange 0.000000 1 2 7.719651 ControlChange 0.000000 1 4 26.948993 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 20.531694 ControlChange 0.000000 1 2 7.694542 ControlChange 0.000000 1 4 26.920980 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 18.441665 ControlChange 0.000000 1 2 7.672355 ControlChange 0.000000 1 4 26.895991 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 16.291521 ControlChange 0.000000 1 2 7.653016 ControlChange 0.000000 1 4 26.874040 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 14.089061 ControlChange 0.000000 1 2 7.636459 ControlChange 0.000000 1 4 26.855122 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 11.840049 ControlChange 0.000000 1 2 7.622614 ControlChange 0.000000 1 4 26.839222 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 9.548689 ControlChange 0.000000 1 2 7.611414 ControlChange 0.000000 1 4 26.826314 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 7.217743 ControlChange 0.000000 1 2 7.602799 ControlChange 0.000000 1 4 26.816358 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 4.848385 ControlChange 0.000000 1 2 7.596711 ControlChange 0.000000 1 4 26.809308 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 2.421242 ControlChange 0.000000 1 2 7.596996 ControlChange 0.000000 1 4 26.804785 ControlChange 0.000000 1 101 585.924319 ControlChange 0.004167 1 100 0.238835 ControlChange 0.000000 1 2 7.648056 ControlChange 0.000000 1 4 26.799005 ControlChange 0.000000 1 101 571.281625 ControlChange 0.004167 1 100 3.392912 ControlChange 0.000000 1 2 7.877686 ControlChange 0.000000 1 4 26.781031 ControlChange 0.000000 1 101 539.299041 ControlChange 0.004167 1 100 6.865140 ControlChange 0.000000 1 2 8.407308 ControlChange 0.000000 1 4 26.739782 ControlChange 0.000000 1 101 524.656347 ControlChange 0.004167 1 100 10.399128 ControlChange 0.000000 1 2 9.259269 ControlChange 0.000000 1 4 26.671311 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 13.899402 ControlChange 0.000000 1 2 10.387209 ControlChange 0.000000 1 4 26.575508 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 17.333041 ControlChange 0.000000 1 2 11.674823 ControlChange 0.000000 1 4 26.453302 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 20.669430 ControlChange 0.000000 1 2 12.860392 ControlChange 0.000000 1 4 26.306545 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 23.862047 ControlChange 0.000000 1 2 13.605124 ControlChange 0.000000 1 4 26.138186 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 26.813448 ControlChange 0.000000 1 2 13.910993 ControlChange 0.000000 1 4 25.952383 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 29.277957 ControlChange 0.000000 1 2 14.107200 ControlChange 0.000000 1 4 25.754532 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 30.998533 ControlChange 0.000000 1 2 14.318749 ControlChange 0.000000 1 4 25.551127 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 32.302608 ControlChange 0.000000 1 2 14.523643 ControlChange 0.000000 1 4 25.349437 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 33.757586 ControlChange 0.000000 1 2 14.696497 ControlChange 0.000000 1 4 25.157050 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 35.301309 ControlChange 0.000000 1 2 14.813051 ControlChange 0.000000 1 4 24.981329 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 36.716961 ControlChange 0.000000 1 2 14.830266 ControlChange 0.000000 1 4 24.828872 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.923048 ControlChange 0.000000 1 2 14.698822 ControlChange 0.000000 1 4 24.705130 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 38.898463 ControlChange 0.000000 1 2 14.444065 ControlChange 0.000000 1 4 24.614176 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.642423 ControlChange 0.000000 1 2 14.133900 ControlChange 0.000000 1 4 24.558178 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 40.161905 ControlChange 0.000000 1 2 13.812032 ControlChange 0.000000 1 4 24.532980 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 40.466520 ControlChange 0.000000 1 2 13.496666 ControlChange 0.000000 1 4 24.523026 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 40.559191 ControlChange 0.000000 1 2 13.195477 ControlChange 0.000000 1 4 24.512768 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 40.425780 ControlChange 0.000000 1 2 12.911846 ControlChange 0.000000 1 4 24.497466 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 40.046385 ControlChange 0.000000 1 2 12.647151 ControlChange 0.000000 1 4 24.477447 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.409206 ControlChange 0.000000 1 2 12.401773 ControlChange 0.000000 1 4 24.453419 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 38.506218 ControlChange 0.000000 1 2 12.175577 ControlChange 0.000000 1 4 24.426004 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.329234 ControlChange 0.000000 1 2 11.968135 ControlChange 0.000000 1 4 24.395762 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 35.877859 ControlChange 0.000000 1 2 11.778888 ControlChange 0.000000 1 4 24.363209 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 34.227361 ControlChange 0.000000 1 2 11.607224 ControlChange 0.000000 1 4 24.328827 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 32.648903 ControlChange 0.000000 1 2 11.452493 ControlChange 0.000000 1 4 24.293085 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 31.191875 ControlChange 0.000000 1 2 11.314055 ControlChange 0.000000 1 4 24.256447 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 29.255591 ControlChange 0.000000 1 2 11.191277 ControlChange 0.000000 1 4 24.219386 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 26.751184 ControlChange 0.000000 1 2 11.083565 ControlChange 0.000000 1 4 24.182399 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 23.881666 ControlChange 0.000000 1 2 10.990335 ControlChange 0.000000 1 4 24.146027 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 20.767217 ControlChange 0.000000 1 2 10.911033 ControlChange 0.000000 1 4 24.110872 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 17.474314 ControlChange 0.000000 1 2 10.845164 ControlChange 0.000000 1 4 24.077634 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 14.046687 ControlChange 0.000000 1 2 10.792223 ControlChange 0.000000 1 4 24.047155 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 10.518530 ControlChange 0.000000 1 2 10.751738 ControlChange 0.000000 1 4 24.020486 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 6.932000 ControlChange 0.000000 1 2 10.723283 ControlChange 0.000000 1 4 23.998997 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 3.407862 ControlChange 0.000000 1 2 10.709733 ControlChange 0.000000 1 4 23.984139 ControlChange 0.000000 1 101 522.607105 ControlChange 0.004167 1 100 0.186151 ControlChange 0.000000 1 2 10.748340 ControlChange 0.000000 1 4 23.973573 ControlChange 0.000000 1 101 515.896199 ControlChange 0.004167 1 100 2.865424 ControlChange 0.000000 1 2 10.950140 ControlChange 0.000000 1 4 23.955786 ControlChange 0.000000 1 101 501.238233 ControlChange 0.004167 1 100 6.407521 ControlChange 0.000000 1 2 11.431072 ControlChange 0.000000 1 4 23.918238 ControlChange 0.000000 1 101 494.527327 ControlChange 0.004167 1 100 10.389717 ControlChange 0.000000 1 2 12.230620 ControlChange 0.000000 1 4 23.857043 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 14.541366 ControlChange 0.000000 1 2 13.307657 ControlChange 0.000000 1 4 23.773144 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 18.743966 ControlChange 0.000000 1 2 14.456244 ControlChange 0.000000 1 4 23.668754 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 22.926890 ControlChange 0.000000 1 2 15.296621 ControlChange 0.000000 1 4 23.547061 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.016736 ControlChange 0.000000 1 2 15.685488 ControlChange 0.000000 1 4 23.412253 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.885349 ControlChange 0.000000 1 2 15.765264 ControlChange 0.000000 1 4 23.269435 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.217559 ControlChange 0.000000 1 2 15.471781 ControlChange 0.000000 1 4 23.124406 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.687044 ControlChange 0.000000 1 2 14.815194 ControlChange 0.000000 1 4 22.983312 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.670215 ControlChange 0.000000 1 2 13.992010 ControlChange 0.000000 1 4 22.852251 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 40.633317 ControlChange 0.000000 1 2 13.169962 ControlChange 0.000000 1 4 22.736866 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.130348 ControlChange 0.000000 1 2 12.417961 ControlChange 0.000000 1 4 22.641998 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.768328 ControlChange 0.000000 1 2 11.749212 ControlChange 0.000000 1 4 22.571481 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.649285 ControlChange 0.000000 1 2 11.158376 ControlChange 0.000000 1 4 22.527741 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 41.997181 ControlChange 0.000000 1 2 10.636184 ControlChange 0.000000 1 4 22.509020 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 40.902016 ControlChange 0.000000 1 2 10.173673 ControlChange 0.000000 1 4 22.506038 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 39.405075 ControlChange 0.000000 1 2 9.763074 ControlChange 0.000000 1 4 22.508953 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 37.600421 ControlChange 0.000000 1 2 9.397951 ControlChange 0.000000 1 4 22.514355 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 35.699110 ControlChange 0.000000 1 2 9.072948 ControlChange 0.000000 1 4 22.521953 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.073724 ControlChange 0.000000 1 2 8.783634 ControlChange 0.000000 1 4 22.531716 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 32.887051 ControlChange 0.000000 1 2 8.526285 ControlChange 0.000000 1 4 22.543564 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.604335 ControlChange 0.000000 1 2 8.297764 ControlChange 0.000000 1 4 22.557352 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.853451 ControlChange 0.000000 1 2 8.095403 ControlChange 0.000000 1 4 22.572860 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.772736 ControlChange 0.000000 1 2 7.916944 ControlChange 0.000000 1 4 22.589781 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.527061 ControlChange 0.000000 1 2 7.760440 ControlChange 0.000000 1 4 22.607721 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.180769 ControlChange 0.000000 1 2 7.624139 ControlChange 0.000000 1 4 22.626208 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 20.762794 ControlChange 0.000000 1 2 7.506503 ControlChange 0.000000 1 4 22.644705 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 18.289669 ControlChange 0.000000 1 2 7.406237 ControlChange 0.000000 1 4 22.662639 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 15.771844 ControlChange 0.000000 1 2 7.322175 ControlChange 0.000000 1 4 22.679437 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 13.216453 ControlChange 0.000000 1 2 7.253266 ControlChange 0.000000 1 4 22.694560 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 10.628398 ControlChange 0.000000 1 2 7.198568 ControlChange 0.000000 1 4 22.707536 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 8.010964 ControlChange 0.000000 1 2 7.157209 ControlChange 0.000000 1 4 22.717983 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 5.365942 ControlChange 0.000000 1 2 7.128441 ControlChange 0.000000 1 4 22.725620 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 2.697948 ControlChange 0.000000 1 2 7.112549 ControlChange 0.000000 1 4 22.730851 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 0.031916 ControlChange 0.000000 1 2 7.120276 ControlChange 0.000000 1 4 22.740225 ControlChange 0.000000 1 101 492.701660 ControlChange 0.004167 1 100 2.757986 ControlChange 0.000000 1 2 7.183335 ControlChange 0.000000 1 4 22.772516 ControlChange 0.000000 1 101 480.388671 ControlChange 0.004167 1 100 6.005870 ControlChange 0.000000 1 2 7.331372 ControlChange 0.000000 1 4 22.844906 ControlChange 0.000000 1 101 453.494631 ControlChange 0.004167 1 100 9.572670 ControlChange 0.000000 1 2 7.57 42 ControlChange 0.000000 1 4 22.960258 ControlChange 0.000000 1 101 441.181642 ControlChange 0.004167 1 100 13.242209 ControlChange 0.000000 1 2 7.898188 ControlChange 0.000000 1 4 23.114444 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 16.930521 ControlChange 0.000000 1 2 8.307340 ControlChange 0.000000 1 4 23.302156 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 20.590615 ControlChange 0.000000 1 2 8.792604 ControlChange 0.000000 1 4 23.517484 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 24.178083 ControlChange 0.000000 1 2 9.347240 ControlChange 0.000000 1 4 23.754063 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 27.633608 ControlChange 0.000000 1 2 9.962853 ControlChange 0.000000 1 4 24.005136 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 30.842906 ControlChange 0.000000 1 2 10.627843 ControlChange 0.000000 1 4 24.263659 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 33.542717 ControlChange 0.000000 1 2 11.323741 ControlChange 0.000000 1 4 24.522437 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 35.572435 ControlChange 0.000000 1 2 12.013625 ControlChange 0.000000 1 4 24.774247 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.375550 ControlChange 0.000000 1 2 12.597700 ControlChange 0.000000 1 4 25.011982 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 39.221786 ControlChange 0.000000 1 2 12.841510 ControlChange 0.000000 1 4 25.228772 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.918602 ControlChange 0.000000 1 2 12.607265 ControlChange 0.000000 1 4 25.418089 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.301724 ControlChange 0.000000 1 2 12.196765 ControlChange 0.000000 1 4 25.573871 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.318405 ControlChange 0.000000 1 2 11.820412 ControlChange 0.000000 1 4 25.690588 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.944790 ControlChange 0.000000 1 2 11.526205 ControlChange 0.000000 1 4 25.763894 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 44.189962 ControlChange 0.000000 1 2 11.248716 ControlChange 0.000000 1 4 25.796137 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 44.12 24 ControlChange 0.000000 1 2 10.880897 ControlChange 0.000000 1 4 25.803399 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.798693 ControlChange 0.000000 1 2 10.472926 ControlChange 0.000000 1 4 25.803477 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.211259 ControlChange 0.000000 1 2 10.096980 ControlChange 0.000000 1 4 25.802677 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.303605 ControlChange 0.000000 1 2 9.771355 ControlChange 0.000000 1 4 25.801559 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 41.018171 ControlChange 0.000000 1 2 9.492826 ControlChange 0.000000 1 4 25.800129 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 39.439026 ControlChange 0.000000 1 2 9.254559 ControlChange 0.000000 1 4 25.798395 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.942827 ControlChange 0.000000 1 2 9.050261 ControlChange 0.000000 1 4 25.796374 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 36.611581 ControlChange 0.000000 1 2 8.874837 ControlChange 0.000000 1 4 25.794086 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.845746 ControlChange 0.000000 1 2 8.724237 ControlChange 0.000000 1 4 25.791562 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 32.535053 ControlChange 0.000000 1 2 8.595231 ControlChange 0.000000 1 4 25.788839 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 29.863794 ControlChange 0.000000 1 2 8.485205 ControlChange 0.000000 1 4 25.785965 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 26.946361 ControlChange 0.000000 1 2 8.392002 ControlChange 0.000000 1 4 25.783001 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 23.846432 ControlChange 0.000000 1 2 8.313873 ControlChange 0.000000 1 4 25.780018 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 20.605052 ControlChange 0.000000 1 2 8.249331 ControlChange 0.000000 1 4 25.777099 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 17.251655 ControlChange 0.000000 1 2 8.197109 ControlChange 0.000000 1 4 25.774339 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 13.809710 ControlChange 0.000000 1 2 8.156141 ControlChange 0.000000 1 4 25.771840 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 10.301571 ControlChange 0.000000 1 2 8.125508 ControlChange 0.000000 1 4 25.769713 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 6.762861 ControlChange 0.000000 1 2 8. 4399 ControlChange 0.000000 1 4 25.768070 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 3.284357 ControlChange 0.000000 1 2 8.092871 ControlChange 0.000000 1 4 25.766340 ControlChange 0.000000 1 101 438.947277 ControlChange 0.004167 1 100 0.154690 ControlChange 0.000000 1 2 8.098970 ControlChange 0.000000 1 4 25.756794 ControlChange 0.000000 1 101 427.977651 ControlChange 0.004167 1 100 3.963121 ControlChange 0.000000 1 2 8.147067 ControlChange 0.000000 1 4 25.716324 ControlChange 0.000000 1 101 404.017785 ControlChange 0.004167 1 100 8.310813 ControlChange 0.000000 1 2 8.260740 ControlChange 0.000000 1 4 25.620387 ControlChange 0.000000 1 101 393.048159 ControlChange 0.004167 1 100 12.906698 ControlChange 0.000000 1 2 8.446447 ControlChange 0.000000 1 4 25.458446 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 17.527909 ControlChange 0.000000 1 2 8.702207 ControlChange 0.000000 1 4 25.227986 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.085999 ControlChange 0.000000 1 2 9.024670 ControlChange 0.000000 1 4 24.929243 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 26.505290 ControlChange 0.000000 1 2 9.409725 ControlChange 0.000000 1 4 24.565889 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 30.651790 ControlChange 0.000000 1 2 9.852059 ControlChange 0.000000 1 4 24.146377 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.167164 ControlChange 0.000000 1 2 10.344548 ControlChange 0.000000 1 4 23.685268 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.479125 ControlChange 0.000000 1 2 10.877352 ControlChange 0.000000 1 4 23.203839 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.746751 ControlChange 0.000000 1 2 11.436014 ControlChange 0.000000 1 4 22.729153 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.085995 ControlChange 0.000000 1 2 11.997754 ControlChange 0.000000 1 4 22.291383 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.772037 ControlChange 0.000000 1 2 12.522679 ControlChange 0.000000 1 4 21.919791 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.423651 ControlChange 0.000000 1 2 12.936156 ControlChange 0.000000 1 4 21.638608 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 43.634175 ControlChange 0.000000 1 2 13.144551 ControlChange 0.000000 1 4 21.462881 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 44.174202 ControlChange 0.000000 1 2 13.152038 ControlChange 0.000000 1 4 21.384546 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 44.122426 ControlChange 0.000000 1 2 13.084793 ControlChange 0.000000 1 4 21.358264 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 43.676158 ControlChange 0.000000 1 2 12.998948 ControlChange 0.000000 1 4 21.336662 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.907727 ControlChange 0.000000 1 2 12.845614 ControlChange 0.000000 1 4 21.303943 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.822405 ControlChange 0.000000 1 2 12.528181 ControlChange 0.000000 1 4 21.259787 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.461001 ControlChange 0.000000 1 2 12.041888 ControlChange 0.000000 1 4 21.205693 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.012521 ControlChange 0.000000 1 2 11.474071 ControlChange 0.000000 1 4 21.143492 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 37.719088 ControlChange 0.000000 1 2 10.920912 ControlChange 0.000000 1 4 21.075290 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.291323 ControlChange 0.000000 1 2 10.436175 ControlChange 0.000000 1 4 21.003389 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.149538 ControlChange 0.000000 1 2 10.033025 ControlChange 0.000000 1 4 20.930188 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 31.325705 ControlChange 0.000000 1 2 9.705600 ControlChange 0.000000 1 4 20.858060 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 28.062117 ControlChange 0.000000 1 2 9.443208 ControlChange 0.000000 1 4 20.789248 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.496215 ControlChange 0.000000 1 2 9.235535 ControlChange 0.000000 1 4 20.725779 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 20.704492 ControlChange 0.000000 1 2 9.074015 ControlChange 0.000000 1 4 20.669398 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 16.736009 ControlChange 0.000000 1 2 8.951735 ControlChange 0.000000 1 4 20.621527 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 12.626379 ControlChange 0.000000 1 2 8.863096 ControlChange 0.000000 1 4 20.583272 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 8.412301 ControlChange 0.000000 1 2 8.803646 ControlChange 0.000000 1 4 20.555435 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 4.212606 ControlChange 0.000000 1 2 8.772601 ControlChange 0.000000 1 4 20.538965 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 0.476806 ControlChange 0.000000 1 2 8.798129 ControlChange 0.000000 1 4 20.538965 ControlChange 0.000000 1 101 394.229801 ControlChange 0.004167 1 100 2.491944 ControlChange 0.000000 1 2 8.963477 ControlChange 0.000000 1 4 20.568494 ControlChange 0.000000 1 101 417.512416 ControlChange 0.004167 1 100 5.437845 ControlChange 0.000000 1 2 9.338194 ControlChange 0.000000 1 4 20.637451 ControlChange 0.000000 1 101 468.366322 ControlChange 0.004167 1 100 8.583682 ControlChange 0.000000 1 2 9.923432 ControlChange 0.000000 1 4 20.744230 ControlChange 0.000000 1 101 491.648937 ControlChange 0.004167 1 100 11.791576 ControlChange 0.000000 1 2 10.691707 ControlChange 0.000000 1 4 20.882426 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 14.997687 ControlChange 0.000000 1 2 11.611498 ControlChange 0.000000 1 4 21.045422 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 18.168930 ControlChange 0.000000 1 2 12.635707 ControlChange 0.000000 1 4 21.226863 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 21.277657 ControlChange 0.000000 1 2 13.640269 ControlChange 0.000000 1 4 21.420549 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.293956 ControlChange 0.000000 1 2 14.365528 ControlChange 0.000000 1 4 21.620399 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.179061 ControlChange 0.000000 1 2 14.700641 ControlChange 0.000000 1 4 21.820377 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.873937 ControlChange 0.000000 1 2 14.936959 ControlChange 0.000000 1 4 22.014433 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 32.268410 ControlChange 0.000000 1 2 15.218247 ControlChange 0.000000 1 4 22.196452 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.170312 ControlChange 0.000000 1 2 15.534269 ControlChange 0.000000 1 4 22.360182 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 35.712868 ControlChange 0.000000 1 2 15.870694 ControlChange 0.000000 1 4 22.499177 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 37.657604 ControlChange 0.000000 1 2 16.218274 ControlChange 0.000000 1 4 22.606713 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 39.987747 ControlChange 0.000000 1 2 16.566467 ControlChange 0.000000 1 4 22.676268 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 41.983873 ControlChange 0.000000 1 2 16.884427 ControlChange 0.000000 1 4 22.706434 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 43.239646 ControlChange 0.000000 1 2 17.070568 ControlChange 0.000000 1 4 22.708031 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 43.735966 ControlChange 0.000000 1 2 16.990436 ControlChange 0.000000 1 4 22.695041 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 43.661101 ControlChange 0.000000 1 2 16.635559 ControlChange 0.000000 1 4 22.672684 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 43.207044 ControlChange 0.000000 1 2 16.058672 ControlChange 0.000000 1 4 22.641530 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 42.437600 ControlChange 0.000000 1 2 15.366708 ControlChange 0.000000 1 4 22.601776 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 41.360299 ControlChange 0.000000 1 2 14.682787 ControlChange 0.000000 1 4 22.553719 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 40.003503 ControlChange 0.000000 1 2 14.076709 ControlChange 0.000000 1 4 22.497775 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.513555 ControlChange 0.000000 1 2 13.563831 ControlChange 0.000000 1 4 22.434494 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 37.144209 ControlChange 0.000000 1 2 13.135549 ControlChange 0.000000 1 4 22.364579 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 35.771765 ControlChange 0.000000 1 2 12.778344 ControlChange 0.000000 1 4 22.288905 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 33.905232 ControlChange 0.000000 1 2 12.480011 ControlChange 0.000000 1 4 22.208541 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.554842 ControlChange 0.000000 1 2 12.230667 ControlChange 0.000000 1 4 22.124759 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.915463 ControlChange 0.000000 1 2 12.022588 ControlChange 0.000000 1 4 22.039049 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.086246 ControlChange 0.000000 1 2 11.849727 ControlChange 0.000000 1 4 21.953118 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 23.117289 ControlChange 0.000000 1 2 11.707286 ControlChange 0.000000 1 4 21.868880 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 20.038583 ControlChange 0.000000 1 2 11.591393 ControlChange 0.000000 1 4 21.788437 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 16.869524 ControlChange 0.000000 1 2 11.498919 ControlChange 0.000000 1 4 21.714044 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 13.623129 ControlChange 0.000000 1 2 11.427263 ControlChange 0.000000 1 4 21.648058 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 10.308081 ControlChange 0.000000 1 2 11.374273 ControlChange 0.000000 1 4 21.592886 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 6.929406 ControlChange 0.000000 1 2 11.338115 ControlChange 0.000000 1 4 21.550910 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 3.501179 ControlChange 0.000000 1 2 11.319259 ControlChange 0.000000 1 4 21.524035 ControlChange 0.000000 1 101 492.701660 ControlChange 0.004167 1 100 0.141924 ControlChange 0.000000 1 2 11.339766 ControlChange 0.000000 1 4 21.510050 ControlChange 0.000000 1 101 480.388671 ControlChange 0.004167 1 100 3.055633 ControlChange 0.000000 1 2 11.467164 ControlChange 0.000000 1 4 21.498365 ControlChange 0.000000 1 101 453.494631 ControlChange 0.004167 1 100 6.354950 ControlChange 0.000000 1 2 11.766748 ControlChange 0.000000 1 4 21.478409 ControlChange 0.000000 1 101 441.181642 ControlChange 0.004167 1 100 9.756592 ControlChange 0.000000 1 2 12.236559 ControlChange 0.000000 1 4 21.447769 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 13.154749 ControlChange 0.000000 1 2 12.794944 ControlChange 0.000000 1 4 21.407748 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 16.505713 ControlChange 0.000000 1 2 13.278663 ControlChange 0.000000 1 4 21.359817 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 19.779630 ControlChange 0.000000 1 2 13.517393 ControlChange 0.000000 1 4 21.305283 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 22.941403 ControlChange 0.000000 1 2 13.506282 ControlChange 0.000000 1 4 21.245350 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 25.937622 ControlChange 0.000000 1 2 13.393700 ControlChange 0.000000 1 4 21.181175 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 28.661968 ControlChange 0.000000 1 2 13.268470 ControlChange 0.000000 1 4 21.113906 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 30.925124 ControlChange 0.000000 1 2 13.155604 ControlChange 0.000000 1 4 21.044743 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 33.013947 ControlChange 0.000000 1 2 13.039490 ControlChange 0.000000 1 4 20.975007 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 35.926135 ControlChange 0.000000 1 2 12.823143 ControlChange 0.000000 1 4 20.906229 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 39.235852 ControlChange 0.000000 1 2 12.430197 ControlChange 0.000000 1 4 20.840309 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 41.654897 ControlChange 0.000000 1 2 11.919902 ControlChange 0.000000 1 4 20.779772 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.695663 ControlChange 0.000000 1 2 11.384322 ControlChange 0.000000 1 4 20.728285 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.717600 ControlChange 0.000000 1 2 10.874878 ControlChange 0.000000 1 4 20.691180 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.212091 ControlChange 0.000000 1 2 10.4 492 ControlChange 0.000000 1 4 20.671594 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 41.368567 ControlChange 0.000000 1 2 9.994773 ControlChange 0.000000 1 4 20.662275 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.220662 ControlChange 0.000000 1 2 9.625533 ControlChange 0.000000 1 4 20.651831 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 38.783962 ControlChange 0.000000 1 2 9.298802 ControlChange 0.000000 1 4 20.636650 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.077075 ControlChange 0.000000 1 2 9.010353 ControlChange 0.000000 1 4 20.617453 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 35.182066 ControlChange 0.000000 1 2 8.756254 ControlChange 0.000000 1 4 20.595209 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 33.408811 ControlChange 0.000000 1 2 8.533049 ControlChange 0.000000 1 4 20.570734 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 31.903321 ControlChange 0.000000 1 2 8.337701 ControlChange 0.000000 1 4 20.544739 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 30.050685 ControlChange 0.000000 1 2 8.167567 ControlChange 0.000000 1 4 20.517860 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 27.721999 ControlChange 0.000000 1 2 8.020378 ControlChange 0.000000 1 4 20.490686 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 25.096882 ControlChange 0.000000 1 2 7.894185 ControlChange 0.000000 1 4 20.463774 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 22.277044 ControlChange 0.000000 1 2 7.787249 ControlChange 0.000000 1 4 20.437670 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 19.314856 ControlChange 0.000000 1 2 7.698067 ControlChange 0.000000 1 4 20.412923 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 16.242257 ControlChange 0.000000 1 2 7.625336 ControlChange 0.000000 1 4 20.390098 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 13.080981 ControlChange 0.000000 1 2 7.567852 ControlChange 0.000000 1 4 20.369796 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 9.847622 ControlChange 0.000000 1 2 7.524579 ControlChange 0.000000 1 4 20.352666 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 6.560296 ControlChange 0.000000 1 2 7.494602 ControlChange 0.000000 1 4 20.339433 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 3.233911 ControlChange 0.000000 1 2 7.479404 ControlChange 0.000000 1 4 20.331123 ControlChange 0.000000 1 101 438.947277 ControlChange 0.004167 1 100 0.340931 ControlChange 0.000000 1 2 7.504768 ControlChange 0.000000 1 4 20.330925 ControlChange 0.000000 1 101 427.977651 ControlChange 0.004167 1 100 4.537210 ControlChange 0.000000 1 2 7.645859 ControlChange 0.000000 1 4 20.345843 ControlChange 0.000000 1 101 404.017785 ControlChange 0.004167 1 100 9.039204 ControlChange 0.000000 1 2 7.973950 ControlChange 0.000000 1 4 20.381288 ControlChange 0.000000 1 101 393.048159 ControlChange 0.004167 1 100 13.513514 ControlChange 0.000000 1 2 8.506214 ControlChange 0.000000 1 4 20.437210 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 17.860885 ControlChange 0.000000 1 2 9.232159 ControlChange 0.000000 1 4 20.511323 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.017257 ControlChange 0.000000 1 2 10.133061 ControlChange 0.000000 1 4 20.601317 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.857818 ControlChange 0.000000 1 2 11.177754 ControlChange 0.000000 1 4 20.705018 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.054659 ControlChange 0.000000 1 2 12.300089 ControlChange 0.000000 1 4 20.820356 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 31.161610 ControlChange 0.000000 1 2 13.331288 ControlChange 0.000000 1 4 20.945297 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.411703 ControlChange 0.000000 1 2 14.006734 ControlChange 0.000000 1 4 21.077808 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 33.656861 ControlChange 0.000000 1 2 14.292945 ControlChange 0.000000 1 4 21.215805 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 35.107121 ControlChange 0.000000 1 2 14.472913 ControlChange 0.000000 1 4 21.357075 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.633264 ControlChange 0.000000 1 2 14.667305 ControlChange 0.000000 1 4 21.499208 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 38.151897 ControlChange 0.000000 1 2 14.863666 ControlChange 0.000000 1 4 21.639489 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 39.609808 ControlChange 0.000000 1 2 15.045637 ControlChange 0.000000 1 4 21.774749 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.960715 ControlChange 0.000000 1 2 15.199027 ControlChange 0.000000 1 4 21.901146 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.154767 ControlChange 0.000000 1 2 15.302717 ControlChange 0.000000 1 4 22.013809 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 43.129103 ControlChange 0.000000 1 2 15.297754 ControlChange 0.000000 1 4 22.106246 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 43.799178 ControlChange 0.000000 1 2 15.105121 ControlChange 0.000000 1 4 22.170236 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 44.096161 ControlChange 0.000000 1 2 14.759368 ControlChange 0.000000 1 4 22.203185 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 44.057272 ControlChange 0.000000 1 2 14.355690 ControlChange 0.000000 1 4 22.220781 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 43.775954 ControlChange 0.000000 1 2 13.950390 ControlChange 0.000000 1 4 22.244042 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 43.273760 ControlChange 0.000000 1 2 13.563925 ControlChange 0.000000 1 4 22.279812 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 42.522610 ControlChange 0.000000 1 2 13.203773 ControlChange 0.000000 1 4 22.327260 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 41.480054 ControlChange 0.000000 1 2 12.872679 ControlChange 0.000000 1 4 22.384877 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 40.100222 ControlChange 0.000000 1 2 12.571307 ControlChange 0.000000 1 4 22.451204 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 38.418344 ControlChange 0.000000 1 2 12.299376 ControlChange 0.000000 1 4 22.524814 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 36.670255 ControlChange 0.000000 1 2 12.056142 ControlChange 0.000000 1 4 22.604273 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 34.832497 ControlChange 0.000000 1 2 11.840677 ControlChange 0.000000 1 4 22.688107 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 32.294297 ControlChange 0.000000 1 2 11.651949 ControlChange 0.000000 1 4 22.774759 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 29.057477 ControlChange 0.000000 1 2 11.488877 ControlChange 0.000000 1 4 22.862548 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.394057 ControlChange 0.000000 1 2 11.350457 ControlChange 0.000000 1 4 22.949594 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.450811 ControlChange 0.000000 1 2 11.235705 ControlChange 0.000000 1 4 23.033736 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 17.306453 ControlChange 0.000000 1 2 11.143653 ControlChange 0.000000 1 4 23.112393 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 13.013683 ControlChange 0.000000 1 2 11.073409 ControlChange 0.000000 1 4 23.182377 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 8.624512 ControlChange 0.000000 1 2 11.024122 ControlChange 0.000000 1 4 23.239562 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 4.309025 ControlChange 0.000000 1 2 10.994624 ControlChange 0.000000 1 4 23.278830 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 0.747642 ControlChange 0.000000 1 2 10.980061 ControlChange 0.000000 1 4 23.297893 ControlChange 0.000000 1 101 391.512962 ControlChange 0.004167 1 100 1.442847 ControlChange 0.000000 1 2 10.968167 ControlChange 0.000000 1 4 23.304077 ControlChange 0.000000 1 101 386.485463 ControlChange 0.004167 1 100 3.150523 ControlChange 0.000000 1 2 10.947696 ControlChange 0.000000 1 4 23.308212 ControlChange 0.000000 1 101 375.504396 ControlChange 0.004167 1 100 4.888568 ControlChange 0.000000 1 2 10.915969 ControlChange 0.000000 1 4 23.314462 ControlChange 0.000000 1 101 370.476897 ControlChange 0.004167 1 100 6.651514 ControlChange 0.000000 1 2 10.874111 ControlChange 0.000000 1 4 23.323192 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 8.419360 ControlChange 0.000000 1 2 10.823438 ControlChange 0.000000 1 4 23.334379 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 10.184007 ControlChange 0.000000 1 2 10.765118 ControlChange 0.000000 1 4 23.347991 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 11.940345 ControlChange 0.000000 1 2 10.700204 ControlChange 0.000000 1 4 23.363989 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 13.684459 ControlChange 0.000000 1 2 10.629654 ControlChange 0.000000 1 4 23.382323 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 15.412924 ControlChange 0.000000 1 2 10.554365 ControlChange 0.000000 1 4 23.402930 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 17.122408 ControlChange 0.000000 1 2 10.475189 ControlChange 0.000000 1 4 23.425738 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 18.809397 ControlChange 0.000000 1 2 10.392947 ControlChange 0.000000 1 4 23.450665 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 20.470010 ControlChange 0.000000 1 2 10.308453 ControlChange 0.000000 1 4 23.477614 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 22.099715 ControlChange 0.000000 1 2 10.222527 ControlChange 0.000000 1 4 23.506475 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 23.692971 ControlChange 0.000000 1 2 10.136015 ControlChange 0.000000 1 4 23.537124 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 25.242777 ControlChange 0.000000 1 2 10.049813 ControlChange 0.000000 1 4 23.569428 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 26.739969 ControlChange 0.000000 1 2 9.964888 ControlChange 0.000000 1 4 23.603235 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 28.171931 ControlChange 0.000000 1 2 9.882316 ControlChange 0.000000 1 4 23.638381 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 29.520144 ControlChange 0.000000 1 2 9.803326 ControlChange 0.000000 1 4 23.674693 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 30.755440 ControlChange 0.000000 1 2 9.729352 ControlChange 0.000000 1 4 23.711981 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 31.825283 ControlChange 0.000000 1 2 9.662132 ControlChange 0.000000 1 4 23.750046 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 32.630329 ControlChange 0.000000 1 2 9.603837 ControlChange 0.000000 1 4 23.788677 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.097330 ControlChange 0.000000 1 2 9.557291 ControlChange 0.000000 1 4 23.827655 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.398531 ControlChange 0.000000 1 2 9.524882 ControlChange 0.000000 1 4 23.866753 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.845574 ControlChange 0.000000 1 2 9.497036 ControlChange 0.000000 1 4 23.905739 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.549165 ControlChange 0.000000 1 2 9.448494 ControlChange 0.000000 1 4 23.944374 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 35.475643 ControlChange 0.000000 1 2 9.374987 ControlChange 0.000000 1 4 23.982420 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.551242 ControlChange 0.000000 1 2 9.288302 ControlChange 0.000000 1 4 24.019638 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.682844 ControlChange 0.000000 1 2 9.195979 ControlChange 0.000000 1 4 24.055792 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.773990 ControlChange 0.000000 1 2 9.100791 ControlChange 0.000000 1 4 24.090648 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.741624 ControlChange 0.000000 1 2 9.004126 ControlChange 0.000000 1 4 24.123980 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.526584 ControlChange 0.000000 1 2 8.906978 ControlChange 0.000000 1 4 24.155571 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 41.095223 ControlChange 0.000000 1 2 8.8 292 ControlChange 0.000000 1 4 24.185212 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 41.437039 ControlChange 0.000000 1 2 8.715295 ControlChange 0.000000 1 4 24.212704 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 41.573066 ControlChange 0.000000 1 2 8.624415 ControlChange 0.000000 1 4 24.237865 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 41.566285 ControlChange 0.000000 1 2 8.545128 ControlChange 0.000000 1 4 24.260526 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 41.479700 ControlChange 0.000000 1 2 8.493191 ControlChange 0.000000 1 4 24.280528 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 41.338454 ControlChange 0.000000 1 2 8.472652 ControlChange 0.000000 1 4 24.297733 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 41.149135 ControlChange 0.000000 1 2 8.458823 ControlChange 0.000000 1 4 24.312013 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.915915 ControlChange 0.000000 1 2 8.437692 ControlChange 0.000000 1 4 24.323261 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.642263 ControlChange 0.000000 1 2 8.407569 ControlChange 0.000000 1 4 24.331382 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 40.331207 ControlChange 0.000000 1 2 8.368193 ControlChange 0.000000 1 4 24.336344 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.985321 ControlChange 0.000000 1 2 8.319401 ControlChange 0.000000 1 4 24.338628 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.606782 ControlChange 0.000000 1 2 8.261156 ControlChange 0.000000 1 4 24.339782 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 39.197489 ControlChange 0.000000 1 2 8.193561 ControlChange 0.000000 1 4 24.341391 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.759116 ControlChange 0.000000 1 2 8.116908 ControlChange 0.000000 1 4 24.344022 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 38.293112 ControlChange 0.000000 1 2 8.031696 ControlChange 0.000000 1 4 24.347750 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.800706 ControlChange 0.000000 1 2 7.938636 ControlChange 0.000000 1 4 24.352599 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 37.282990 ControlChange 0.000000 1 2 7.838656 ControlChange 0.000000 1 4 24.358587 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.740969 ControlChange 0.000000 1 2 7.732876 ControlChange 0.000000 1 4 24.365727 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 36.175738 ControlChange 0.000000 1 2 7.622572 ControlChange 0.000000 1 4 24.374024 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 35.589859 ControlChange 0.000000 1 2 7.509122 ControlChange 0.000000 1 4 24.383473 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 35.001419 ControlChange 0.000000 1 2 7.393942 ControlChange 0.000000 1 4 24.394057 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.485392 ControlChange 0.000000 1 2 7.278421 ControlChange 0.000000 1 4 24.405748 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 34.049632 ControlChange 0.000000 1 2 7.163862 ControlChange 0.000000 1 4 24.418501 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 33.461349 ControlChange 0.000000 1 2 7.051441 ControlChange 0.000000 1 4 24.432254 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 32.657887 ControlChange 0.000000 1 2 6.942168 ControlChange 0.000000 1 4 24.446925 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 31.697321 ControlChange 0.000000 1 2 6.836881 ControlChange 0.000000 1 4 24.462412 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 30.621932 ControlChange 0.000000 1 2 6.736243 ControlChange 0.000000 1 4 24.478594 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 29.457385 ControlChange 0.000000 1 2 6.640749 ControlChange 0.000000 1 4 24.495331 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 28.220759 ControlChange 0.000000 1 2 6.550749 ControlChange 0.000000 1 4 24.512464 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 26.924065 ControlChange 0.000000 1 2 6.466467 ControlChange 0.000000 1 4 24.529819 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 25.576186 ControlChange 0.000000 1 2 6.388015 ControlChange 0.000000 1 4 24.547212 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 24.183932 ControlChange 0.000000 1 2 6.315424 ControlChange 0.000000 1 4 24.564455 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 22.752601 ControlChange 0.000000 1 2 6.248658 ControlChange 0.000000 1 4 24.581358 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 21.286377 ControlChange 0.000000 1 2 6.187628 ControlChange 0.000000 1 4 24.597736 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 19.788686 ControlChange 0.000000 1 2 6.132209 ControlChange 0.000000 1 4 24.613419 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 18.262340 ControlChange 0.000000 1 2 6.082248 ControlChange 0.000000 1 4 24.628247 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 16.709625 ControlChange 0.000000 1 2 6.037578 ControlChange 0.000000 1 4 24.642081 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 15.132440 ControlChange 0.000000 1 2 5.998016 ControlChange 0.000000 1 4 24.654805 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 13.532363 ControlChange 0.000000 1 2 5.963372 ControlChange 0.000000 1 4 24.666321 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 11.910669 ControlChange 0.000000 1 2 5.933460 ControlChange 0.000000 1 4 24.676555 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 10.268386 ControlChange 0.000000 1 2 5.908098 ControlChange 0.000000 1 4 24.685453 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 8.606252 ControlChange 0.000000 1 2 5.887096 ControlChange 0.000000 1 4 24.692981 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 6.924717 ControlChange 0.000000 1 2 5.870274 ControlChange 0.000000 1 4 24.699121 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 5.223839 ControlChange 0.000000 1 2 5.857460 ControlChange 0.000000 1 4 24.703871 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 3.502979 ControlChange 0.000000 1 2 5.848486 ControlChange 0.000000 1 4 24.707239 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 1.745933 ControlChange 0.000000 1 2 5.845487 ControlChange 0.000000 1 4 24.708968 ControlChange 0.000000 1 101 369.994423 ControlChange 0.004167 1 100 0.190687 ControlChange 0.000000 1 2 5.874867 ControlChange 0.000000 1 4 24.705939 ControlChange 0.000000 1 101 371.529620 ControlChange 0.004167 1 100 2.557166 ControlChange 0.000000 1 2 6.017252 ControlChange 0.000000 1 4 24.689100 ControlChange 0.000000 1 101 387.526745 ControlChange 0.004167 1 100 5.281838 ControlChange 0.000000 1 2 6.365500 ControlChange 0.000000 1 4 24.649640 ControlChange 0.000000 1 101 422.467678 ControlChange 0.004167 1 100 8.129759 ControlChange 0.000000 1 2 6.974073 ControlChange 0.000000 1 4 24.585 4 ControlChange 0.000000 1 101 438.464803 ControlChange 0.004167 1 100 10.986931 ControlChange 0.000000 1 2 7.874002 ControlChange 0.000000 1 4 24.496283 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 13.821863 ControlChange 0.000000 1 2 9.072571 ControlChange 0.000000 1 4 24.384629 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 16.619413 ControlChange 0.000000 1 2 10.491175 ControlChange 0.000000 1 4 24.252047 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 19.367465 ControlChange 0.000000 1 2 11.829799 ControlChange 0.000000 1 4 24.100941 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 22.053918 ControlChange 0.000000 1 2 12.643206 ControlChange 0.000000 1 4 23.934218 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 24.665037 ControlChange 0.000000 1 2 12.895419 ControlChange 0.000000 1 4 23.755281 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 27.183793 ControlChange 0.000000 1 2 12.972634 ControlChange 0.000000 1 4 23.568029 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 29.587436 ControlChange 0.000000 1 2 13.063784 ControlChange 0.000000 1 4 23.376791 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 31.843521 ControlChange 0.000000 1 2 13.182357 ControlChange 0.000000 1 4 23.186240 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 33.901771 ControlChange 0.000000 1 2 13.323264 ControlChange 0.000000 1 4 23.001284 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 35.673060 ControlChange 0.000000 1 2 13.481324 ControlChange 0.000000 1 4 22.826933 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.002861 ControlChange 0.000000 1 2 13.650691 ControlChange 0.000000 1 4 22.668151 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.860491 ControlChange 0.000000 1 2 13.823731 ControlChange 0.000000 1 4 22.529707 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 38.639946 ControlChange 0.000000 1 2 13.988275 ControlChange 0.000000 1 4 22.416034 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 39.665417 ControlChange 0.000000 1 2 14.119846 ControlChange 0.000000 1 4 22.331112 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.833310 ControlChange 0.000000 1 2 14.172500 ControlChange 0.000000 1 4 22.277912 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 41.957852 ControlChange 0.000000 1 2 14. 4722 ControlChange 0.000000 1 4 22.254046 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.911476 ControlChange 0.000000 1 2 13.928900 ControlChange 0.000000 1 4 22.246411 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.575416 ControlChange 0.000000 1 2 13.683677 ControlChange 0.000000 1 4 22.240862 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.829927 ControlChange 0.000000 1 2 13.400447 ControlChange 0.000000 1 4 22.232550 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.609779 ControlChange 0.000000 1 2 13.099624 ControlChange 0.000000 1 4 22.221228 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.932108 ControlChange 0.000000 1 2 12.794287 ControlChange 0.000000 1 4 22.207096 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 41.831935 ControlChange 0.000000 1 2 12.492872 ControlChange 0.000000 1 4 22.190356 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.348535 ControlChange 0.000000 1 2 12.200838 ControlChange 0.000000 1 4 22.171221 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 38.614312 ControlChange 0.000000 1 2 11.921697 ControlChange 0.000000 1 4 22.149909 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.021750 ControlChange 0.000000 1 2 11.657673 ControlChange 0.000000 1 4 22.126647 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 35.782949 ControlChange 0.000000 1 2 11.410136 ControlChange 0.000000 1 4 22.101675 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.336062 ControlChange 0.000000 1 2 11.179864 ControlChange 0.000000 1 4 22.075244 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 32.521195 ControlChange 0.000000 1 2 10.967219 ControlChange 0.000000 1 4 22.047620 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 30.472787 ControlChange 0.000000 1 2 10.772299 ControlChange 0.000000 1 4 22.019087 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 28.270864 ControlChange 0.000000 1 2 10.595018 ControlChange 0.000000 1 4 21.989951 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 25.956840 ControlChange 0.000000 1 2 10.435165 ControlChange 0.000000 1 4 21.960542 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 23.555928 ControlChange 0.000000 1 2 10.292443 ControlChange 0.000000 1 4 21.931219 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 21.084948 ControlChange 0.000000 1 2 10.166485 ControlChange 0.000000 1 4 21.902377 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 18.555886 ControlChange 0.000000 1 2 10.056899 ControlChange 0.000000 1 4 21.874453 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 15.977830 ControlChange 0.000000 1 2 9.963265 ControlChange 0.000000 1 4 21.847934 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 13.358035 ControlChange 0.000000 1 2 9.885157 ControlChange 0.000000 1 4 21.823371 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 10.702755 ControlChange 0.000000 1 2 9.822153 ControlChange 0.000000 1 4 21.801390 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 8.018370 ControlChange 0.000000 1 2 9.773840 ControlChange 0.000000 1 4 21.782708 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 5.315866 ControlChange 0.000000 1 2 9.739781 ControlChange 0.000000 1 4 21.768163 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 2.659962 ControlChange 0.000000 1 2 9.719903 ControlChange 0.000000 1 4 21.758677 ControlChange 0.000000 1 101 443.230884 ControlChange 0.004167 1 100 0.356517 ControlChange 0.000000 1 2 9.717436 ControlChange 0.000000 1 4 21.754663 ControlChange 0.000000 1 101 476.897473 ControlChange 0.004167 1 100 1.365071 ControlChange 0.000000 1 2 9.741748 ControlChange 0.000000 1 4 21.755067 ControlChange 0.000000 1 101 550.432063 ControlChange 0.004167 1 100 3.047324 ControlChange 0.000000 1 2 9.799992 ControlChange 0.000000 1 4 21.758313 ControlChange 0.000000 1 101 584.098651 ControlChange 0.004167 1 100 4.879878 ControlChange 0.000000 1 2 9.890757 ControlChange 0.000000 1 4 21.763777 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 6.779856 ControlChange 0.000000 1 2 10.009094 ControlChange 0.000000 1 4 21.771370 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 8.707965 ControlChange 0.000000 1 2 10.150064 ControlChange 0.000000 1 4 21.781056 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 10.647249 ControlChange 0.000000 1 2 10.309100 ControlChange 0.000000 1 4 21.792793 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 12.587312 ControlChange 0.000000 1 2 10.482006 ControlChange 0.000000 1 4 21.806544 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 14.520595 ControlChange 0.000000 1 2 10.664944 ControlChange 0.000000 1 4 21.822263 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 16.440833 ControlChange 0.000000 1 2 10.854421 ControlChange 0.000000 1 4 21.839903 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 18.342253 ControlChange 0.000000 1 2 11.047268 ControlChange 0.000000 1 4 21.859417 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 20.219052 ControlChange 0.000000 1 2 11.240626 ControlChange 0.000000 1 4 21.880756 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 22.064955 ControlChange 0.000000 1 2 11.431925 ControlChange 0.000000 1 4 21.903867 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.872745 ControlChange 0.000000 1 2 11.618864 ControlChange 0.000000 1 4 21.928694 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.633621 ControlChange 0.000000 1 2 11.799387 ControlChange 0.000000 1 4 21.955179 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 27.336321 ControlChange 0.000000 1 2 11.971665 ControlChange 0.000000 1 4 21.983259 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.965709 ControlChange 0.000000 1 2 12.134080 ControlChange 0.000000 1 4 22.012870 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 30.499854 ControlChange 0.000000 1 2 12.285207 ControlChange 0.000000 1 4 22.043946 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 31.904539 ControlChange 0.000000 1 2 12.423792 ControlChange 0.000000 1 4 22.076414 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.118936 ControlChange 0.000000 1 2 12.548736 ControlChange 0.000000 1 4 22.110199 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.031433 ControlChange 0.000000 1 2 12.659076 ControlChange 0.000000 1 4 22.145224 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.577209 ControlChange 0.000000 1 2 12.753993 ControlChange 0.000000 1 4 22.181404 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.995664 ControlChange 0.000000 1 2 12.832775 ControlChange 0.000000 1 4 22.218653 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.658918 ControlChange 0.000000 1 2 12.894803 ControlChange 0.000000 1 4 22.256879 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.648745 ControlChange 0.000000 1 2 12.939574 ControlChange 0.000000 1 4 22.295986 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.845866 ControlChange 0.000000 1 2 12.966394 ControlChange 0.000000 1 4 22.335871 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.084199 ControlChange 0.000000 1 2 12.972476 ControlChange 0.000000 1 4 22.376429 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.201334 ControlChange 0.000000 1 2 12.955810 ControlChange 0.000000 1 4 22.417546 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.070344 ControlChange 0.000000 1 2 12.924756 ControlChange 0.000000 1 4 22.459103 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.616829 ControlChange 0.000000 1 2 12.887963 ControlChange 0.000000 1 4 22.500976 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.842694 ControlChange 0.000000 1 2 12.848891 ControlChange 0.000000 1 4 22.543032 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.844627 ControlChange 0.000000 1 2 12.808676 ControlChange 0.000000 1 4 22.585133 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.730753 ControlChange 0.000000 1 2 12.767897 ControlChange 0.000000 1 4 22.627132 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.544098 ControlChange 0.000000 1 2 12.726998 ControlChange 0.000000 1 4 22.668874 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 41.294595 ControlChange 0.000000 1 2 12.686467 ControlChange 0.000000 1 4 22.710195 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.987933 ControlChange 0.000000 1 2 12.647213 ControlChange 0.000000 1 4 22.750923 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.628993 ControlChange 0.000000 1 2 12.609910 ControlChange 0.000000 1 4 22.790875 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 40.221957 ControlChange 0.000000 1 2 12.556195 ControlChange 0.000000 1 4 22.829857 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.770367 ControlChange 0.000000 1 2 12.422159 ControlChange 0.000000 1 4 22.867667 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 39.277282 ControlChange 0.000000 1 2 12.155099 ControlChange 0.000000 1 4 22.904085 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.745398 ControlChange 0.000000 1 2 11.779129 ControlChange 0.000000 1 4 22.938886 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 38.177112 ControlChange 0.000000 1 2 11.347504 ControlChange 0.000000 1 4 22.971825 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 37.574562 ControlChange 0.000000 1 2 10.900605 ControlChange 0.000000 1 4 23.002645 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.939651 ControlChange 0.000000 1 2 10.462051 ControlChange 0.000000 1 4 23.031072 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 36.274157 ControlChange 0.000000 1 2 10.043721 ControlChange 0.000000 1 4 23.056816 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 35.579809 ControlChange 0.000000 1 2 9.650677 ControlChange 0.000000 1 4 23.079570 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.858524 ControlChange 0.000000 1 2 9.284392 ControlChange 0.000000 1 4 23.099005 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 34.112890 ControlChange 0.000000 1 2 8.944542 ControlChange 0.000000 1 4 23.114772 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 33.349300 ControlChange 0.000000 1 2 8.629981 ControlChange 0.000000 1 4 23.126499 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 32.601317 ControlChange 0.000000 1 2 8.339227 ControlChange 0.000000 1 4 23.133848 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 31.980339 ControlChange 0.000000 1 2 8.070720 ControlChange 0.000000 1 4 23.137072 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 31.509935 ControlChange 0.000000 1 2 7.822920 ControlChange 0.000000 1 4 23.137745 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 30.914785 ControlChange 0.000000 1 2 7.594360 ControlChange 0.000000 1 4 23.137622 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 30.108268 ControlChange 0.000000 1 2 7.383701 ControlChange 0.000000 1 4 23.137332 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 29.146817 ControlChange 0.000000 1 2 7.189725 ControlChange 0.000000 1 4 23.136940 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 28.073005 ControlChange 0.000000 1 2 7.011313 ControlChange 0.000000 1 4 23.136453 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 26.912452 ControlChange 0.000000 1 2 6.847459 ControlChange 0.000000 1 4 23.135881 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 25.682060 ControlChange 0.000000 1 2 6.697233 ControlChange 0.000000 1 4 23.135235 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 24.393844 ControlChange 0.000000 1 2 6.559804 ControlChange 0.000000 1 4 23.134524 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 23.056675 ControlChange 0.000000 1 2 6.434414 ControlChange 0.000000 1 4 23.133760 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 21.677292 ControlChange 0.000000 1 2 6.320369 ControlChange 0.000000 1 4 23.132954 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 20.261014 ControlChange 0.000000 1 2 6.217040 ControlChange 0.000000 1 4 23.132119 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 18.812160 ControlChange 0.000000 1 2 6.123864 ControlChange 0.000000 1 4 23.131266 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 17.334258 ControlChange 0.000000 1 2 6.040315 ControlChange 0.000000 1 4 23.130408 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 15.830245 ControlChange 0.000000 1 2 5.965893 ControlChange 0.000000 1 4 23.129559 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 14.302640 ControlChange 0.000000 1 2 5.900146 ControlChange 0.000000 1 4 23.128731 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 12.753677 ControlChange 0.000000 1 2 5.842689 ControlChange 0.000000 1 4 23.127937 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 11.185389 ControlChange 0.000000 1 2 5.793122 ControlChange 0.000000 1 4 23.127190 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 9.599710 ControlChange 0.000000 1 2 5.751089 ControlChange 0.000000 1 4 23.126504 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 7.998615 ControlChange 0.000000 1 2 5.716271 ControlChange 0.000000 1 4 23.125891 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 6.384416 ControlChange 0.000000 1 2 5.688362 ControlChange 0.000000 1 4 23.125364 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 4.760435 ControlChange 0.000000 1 2 5.667071 ControlChange 0.000000 1 4 23.124934 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 3.134970 ControlChange 0.000000 1 2 5.652137 ControlChange 0.000000 1 4 23.124615 ControlChange 0.000000 1 101 587.329536 ControlChange 0.004167 1 100 1.516500 ControlChange 0.000000 1 2 5.644132 ControlChange 0.000000 1 4 23.124538 ControlChange 0.000000 1 101 585.924319 ControlChange 0.004167 1 100 0.273694 ControlChange 0.000000 1 2 5.652095 ControlChange 0.000000 1 4 23.126085 ControlChange 0.000000 1 101 571.281625 ControlChange 0.004167 1 100 2.584998 ControlChange 0.000000 1 2 5.703725 ControlChange 0.000000 1 4 23.133058 ControlChange 0.000000 1 101 539.299041 ControlChange 0.004167 1 100 5.233694 ControlChange 0.000000 1 2 5.829977 ControlChange 0.000000 1 4 23.148677 ControlChange 0.000000 1 101 524.656347 ControlChange 0.004167 1 100 7.952410 ControlChange 0.000000 1 2 6.048027 ControlChange 0.000000 1 4 23.173029 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 10.657518 ControlChange 0.000000 1 2 6.368935 ControlChange 0.000000 1 4 23.204736 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 13.328030 ControlChange 0.000000 1 2 6.804915 ControlChange 0.000000 1 4 23.242184 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 15.950784 ControlChange 0.000000 1 2 7.370457 ControlChange 0.000000 1 4 23.283652 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 18.511909 ControlChange 0.000000 1 2 8.081512 ControlChange 0.000000 1 4 23.327288 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 20.993752 ControlChange 0.000000 1 2 8.952284 ControlChange 0.000000 1 4 23.371083 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 23.370719 ControlChange 0.000000 1 2 9.972874 ControlChange 0.000000 1 4 23.412845 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 25.600925 ControlChange 0.000000 1 2 11.012083 ControlChange 0.000000 1 4 23.450167 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 27.601479 ControlChange 0.000000 1 2 11.748290 ControlChange 0.000000 1 4 23.480380 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 29.217490 ControlChange 0.000000 1 2 12.039914 ControlChange 0.000000 1 4 23.500669 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 30.574520 ControlChange 0.000000 1 2 12.186484 ControlChange 0.000000 1 4 23.509635 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 32.551385 ControlChange 0.000000 1 2 12.350590 ControlChange 0.000000 1 4 23.509750 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 35.629913 ControlChange 0.000000 1 2 12.535117 ControlChange 0.000000 1 4 23.504936 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.147352 ControlChange 0.000000 1 2 12.732882 ControlChange 0.000000 1 4 23.496763 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 42.265672 ControlChange 0.000000 1 2 12.940064 ControlChange 0.000000 1 4 23.485452 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 44.420335 ControlChange 0.000000 1 2 13.153726 ControlChange 0.000000 1 4 23.471116 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 45.380937 ControlChange 0.000000 1 2 13.363452 ControlChange 0.000000 1 4 23.453887 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 45.4 255 ControlChange 0.000000 1 2 13.509675 ControlChange 0.000000 1 4 23.433919 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 44.931823 ControlChange 0.000000 1 2 13.510067 ControlChange 0.000000 1 4 23.411393 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 44.103782 ControlChange 0.000000 1 2 13.409616 ControlChange 0.000000 1 4 23.386514 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 42.934151 ControlChange 0.000000 1 2 13.267916 ControlChange 0.000000 1 4 23.359513 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 41.417662 ControlChange 0.000000 1 2 13.111602 ControlChange 0.000000 1 4 23.330646 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 39.565989 ControlChange 0.000000 1 2 12.955016 ControlChange 0.000000 1 4 23.300189 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 37.516773 ControlChange 0.000000 1 2 12.805703 ControlChange 0.000000 1 4 23.268446 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 35.726782 ControlChange 0.000000 1 2 12.667125 ControlChange 0.000000 1 4 23.235736 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 34.441232 ControlChange 0.000000 1 2 12.540551 ControlChange 0.000000 1 4 23.202399 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 33.011364 ControlChange 0.000000 1 2 12.426135 ControlChange 0.000000 1 4 23.168789 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 31.223026 ControlChange 0.000000 1 2 12.323502 ControlChange 0.000000 1 4 23.135268 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 29.204326 ControlChange 0.000000 1 2 12.232047 ControlChange 0.000000 1 4 23. 2209 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 27.035517 ControlChange 0.000000 1 2 12.151081 ControlChange 0.000000 1 4 23.069982 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 24.758428 ControlChange 0.000000 1 2 12.079901 ControlChange 0.000000 1 4 23.038958 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 22.398952 ControlChange 0.000000 1 2 12.017834 ControlChange 0.000000 1 4 23.009502 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 19.974799 ControlChange 0.000000 1 2 11.964269 ControlChange 0.000000 1 4 22.981964 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 17.499 4 ControlChange 0.000000 1 2 11.918629 ControlChange 0.000000 1 4 22.956680 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 14.982474 ControlChange 0.000000 1 2 11.880383 ControlChange 0.000000 1 4 22.933968 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 12.434423 ControlChange 0.000000 1 2 11.849052 ControlChange 0.000000 1 4 22.914124 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 9.864788 ControlChange 0.000000 1 2 11.824196 ControlChange 0.000000 1 4 22.897417 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 7.286292 ControlChange 0.000000 1 2 11.805425 ControlChange 0.000000 1 4 22.884095 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 4.726376 ControlChange 0.000000 1 2 11.792388 ControlChange 0.000000 1 4 22.874371 ControlChange 0.000000 1 101 523.251131 ControlChange 0.004167 1 100 2.260957 ControlChange 0.000000 1 2 11.788191 ControlChange 0.000000 1 4 22.867962 ControlChange 0.000000 1 101 522.607105 ControlChange 0.004167 1 100 0.148024 ControlChange 0.000000 1 2 11.832254 ControlChange 0.000000 1 4 22.859655 ControlChange 0.000000 1 101 515.896199 ControlChange 0.004167 1 100 2.866028 ControlChange 0.000000 1 2 12.042058 ControlChange 0.000000 1 4 22.834240 ControlChange 0.000000 1 101 501.238233 ControlChange 0.004167 1 100 5.990448 ControlChange 0.000000 1 2 12.535235 ControlChange 0.000000 1 4 22.777324 ControlChange 0.000000 1 101 494.527327 ControlChange 0.004167 1 100 9.289343 ControlChange 0.000000 1 2 13.310689 ControlChange 0.000000 1 4 22.685481 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 12.608701 ControlChange 0.000000 1 2 14.169001 ControlChange 0.000000 1 4 22.560575 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 15.896218 ControlChange 0.000000 1 2 14.712420 ControlChange 0.000000 1 4 22.405209 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 19.118851 ControlChange 0.000000 1 2 14.770675 ControlChange 0.000000 1 4 22.222280 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 22.240128 ControlChange 0.000000 1 2 14.642481 ControlChange 0.000000 1 4 22.015080 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 25.206435 ControlChange 0.000000 1 2 14.533766 ControlChange 0.000000 1 4 21.787291 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 27.912887 ControlChange 0.000000 1 2 14.488163 ControlChange 0.000000 1 4 21.543089 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 30.139581 ControlChange 0.000000 1 2 14.458035 ControlChange 0.000000 1 4 21.287265 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.875165 ControlChange 0.000000 1 2 14.410303 ControlChange 0.000000 1 4 21.025335 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 33.808808 ControlChange 0.000000 1 2 14.338934 ControlChange 0.000000 1 4 20.763698 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.223708 ControlChange 0.000000 1 2 14.241180 ControlChange 0.000000 1 4 20.509861 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.383427 ControlChange 0.000000 1 2 14.115087 ControlChange 0.000000 1 4 20.272716 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 39.515575 ControlChange 0.000000 1 2 13.960467 ControlChange 0.000000 1 4 20.062905 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 39.563800 ControlChange 0.000000 1 2 13.779996 ControlChange 0.000000 1 4 19.893360 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 38.972516 ControlChange 0.000000 1 2 13.579841 ControlChange 0.000000 1 4 19.778815 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 37.966388 ControlChange 0.000000 1 2 13.369078 ControlChange 0.000000 1 4 19.724878 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 36.579713 ControlChange 0.000000 1 2 13.157823 ControlChange 0.000000 1 4 19.710652 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 34.843281 ControlChange 0.000000 1 2 12.954976 ControlChange 0.000000 1 4 19.706689 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 32.903854 ControlChange 0.000000 1 2 12.766759 ControlChange 0.000000 1 4 19.701923 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 31.180698 ControlChange 0.000000 1 2 12.596507 ControlChange 0.000000 1 4 19.695507 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 29.866771 ControlChange 0.000000 1 2 12.445286 ControlChange 0.000000 1 4 19.687630 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 28.367281 ControlChange 0.000000 1 2 12.312710 ControlChange 0.000000 1 4 19.678505 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 26.517094 ControlChange 0.000000 1 2 12.197640 ControlChange 0.000000 1 4 19.668366 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 24.450768 ControlChange 0.000000 1 2 12.098616 ControlChange 0.000000 1 4 19.657469 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 22.245707 ControlChange 0.000000 1 2 12.014134 ControlChange 0.000000 1 4 19.646090 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 19.940839 ControlChange 0.000000 1 2 11.942753 ControlChange 0.000000 1 4 19.634525 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 17.559763 ControlChange 0.000000 1 2 11.883158 ControlChange 0.000000 1 4 19.623085 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 15.118489 ControlChange 0.000000 1 2 11.834186 ControlChange 0.000000 1 4 19.612094 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 12.628876 ControlChange 0.000000 1 2 11.794809 ControlChange 0.000000 1 4 19.601888 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 10.100726 ControlChange 0.000000 1 2 11.764109 ControlChange 0.000000 1 4 19.592805 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 7.543762 ControlChange 0.000000 1 2 11.741296 ControlChange 0.000000 1 4 19.585187 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 4.974493 ControlChange 0.000000 1 2 11.725676 ControlChange 0.000000 1 4 19.579372 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 2.438871 ControlChange 0.000000 1 2 11.718342 ControlChange 0.000000 1 4 19.576553 ControlChange 0.000000 1 101 493.883301 ControlChange 0.004167 1 100 0.067620 ControlChange 0.000000 1 2 11.737790 ControlChange 0.000000 1 4 19.586695 ControlChange 0.000000 1 101 492.701660 ControlChange 0.004167 1 100 2.790947 ControlChange 0.000000 1 2 11.835337 ControlChange 0.000000 1 4 19.636126 ControlChange 0.000000 1 101 480.388671 ControlChange 0.004167 1 100 5.917658 ControlChange 0.000000 1 2 12.052322 ControlChange 0.000000 1 4 19.745442 ControlChange 0.000000 1 101 453.494631 ControlChange 0.004167 1 100 9.270762 ControlChange 0.000000 1 2 12.388139 ControlChange 0.000000 1 4 19.913382 ControlChange 0.000000 1 101 441.181642 ControlChange 0.004167 1 100 12.687426 ControlChange 0.000000 1 2 12.826137 ControlChange 0.000000 1 4 20.130483 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 16.112941 ControlChange 0.000000 1 2 13.349678 ControlChange 0.000000 1 4 20.388103 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 19.519071 ControlChange 0.000000 1 2 13.937509 ControlChange 0.000000 1 4 20.678902 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 22.881117 ControlChange 0.000000 1 2 14.529672 ControlChange 0.000000 1 4 20.996498 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 26.169867 ControlChange 0.000000 1 2 14.960356 ControlChange 0.000000 1 4 21.335211 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 29.340983 ControlChange 0.000000 1 2 15.103957 ControlChange 0.000000 1 4 21.689855 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 32.301470 ControlChange 0.000000 1 2 15.128343 ControlChange 0.000000 1 4 22.055578 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.805376 ControlChange 0.000000 1 2 15.146013 ControlChange 0.000000 1 4 22.427721 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 36.546408 ControlChange 0.000000 1 2 15.167108 ControlChange 0.000000 1 4 22.801696 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.812360 ControlChange 0.000000 1 2 15.190455 ControlChange 0.000000 1 4 23.172878 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 39.281005 ControlChange 0.000000 1 2 15.215173 ControlChange 0.000000 1 4 23.536473 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.857358 ControlChange 0.000000 1 2 15.240464 ControlChange 0.000000 1 4 23.887377 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.197811 ControlChange 0.000000 1 2 15.265427 ControlChange 0.000000 1 4 24.220017 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.158983 ControlChange 0.000000 1 2 15.288672 ControlChange 0.000000 1 4 24.528133 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.719975 ControlChange 0.000000 1 2 15.305960 ControlChange 0.000000 1 4 24.804490 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.891831 ControlChange 0.000000 1 2 15.296639 ControlChange 0.000000 1 4 25.040525 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.673776 ControlChange 0.000000 1 2 15.21 21 ControlChange 0.000000 1 4 25.225747 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 43.072537 ControlChange 0.000000 1 2 15.005403 ControlChange 0.000000 1 4 25.348058 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 42.119679 ControlChange 0.000000 1 2 14.678315 ControlChange 0.000000 1 4 25.404025 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 40.853973 ControlChange 0.000000 1 2 14.261568 ControlChange 0.000000 1 4 25.415498 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 39.321470 ControlChange 0.000000 1 2 13.800679 ControlChange 0.000000 1 4 25.411912 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 37.641324 ControlChange 0.000000 1 2 13.338340 ControlChange 0.000000 1 4 25.404400 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 36.082064 ControlChange 0.000000 1 2 12.904148 ControlChange 0.000000 1 4 25.394113 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 34.635261 ControlChange 0.000000 1 2 12.513499 ControlChange 0.000000 1 4 25.381265 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 32.715601 ControlChange 0.000000 1 2 12.171632 ControlChange 0.000000 1 4 25.366139 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 30.255759 ControlChange 0.000000 1 2 11.878111 ControlChange 0.000000 1 4 25.349097 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 27.454838 ControlChange 0.000000 1 2 11.629946 ControlChange 0.000000 1 4 25.330585 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 24.425164 ControlChange 0.000000 1 2 11.423227 ControlChange 0.000000 1 4 25.311144 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 21.225763 ControlChange 0.000000 1 2 11.253929 ControlChange 0.000000 1 4 25.291419 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 17.892785 ControlChange 0.000000 1 2 11.118343 ControlChange 0.000000 1 4 25.272158 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 14.450476 ControlChange 0.000000 1 2 11.013086 ControlChange 0.000000 1 4 25.254209 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 10.916354 ControlChange 0.000000 1 2 10.935159 ControlChange 0.000000 1 4 25.238513 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 7.306726 ControlChange 0.000000 1 2 10.882001 ControlChange 0.000000 1 4 25.226079 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 3.705568 ControlChange 0.000000 1 2 10.851229 ControlChange 0.000000 1 4 25.217839 ControlChange 0.000000 1 101 440.000000 ControlChange 0.004167 1 100 0.64 29 ControlChange 0.000000 1 2 10.839492 ControlChange 0.000000 1 4 25.213424 ControlChange 0.000000 1 101 438.947277 ControlChange 0.004167 1 100 1.304457 ControlChange 0.000000 1 2 10.841298 ControlChange 0.000000 1 4 25.209671 ControlChange 0.000000 1 101 427.977651 ControlChange 0.004167 1 100 2.878871 ControlChange 0.000000 1 2 10.851417 ControlChange 0.000000 1 4 25.203264 ControlChange 0.000000 1 101 404.017785 ControlChange 0.004167 1 100 4.514231 ControlChange 0.000000 1 2 10.867408 ControlChange 0.000000 1 4 25.193436 ControlChange 0.000000 1 101 393.048159 ControlChange 0.004167 1 100 6.192299 ControlChange 0.000000 1 2 10.888281 ControlChange 0.000000 1 4 25.180584 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 7.890621 ControlChange 0.000000 1 2 10.913331 ControlChange 0.000000 1 4 25.165135 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 9.599861 ControlChange 0.000000 1 2 10.941974 ControlChange 0.000000 1 4 25.147438 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 11.314034 ControlChange 0.000000 1 2 10.973724 ControlChange 0.000000 1 4 25.127790 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 13.028301 ControlChange 0.000000 1 2 11.008164 ControlChange 0.000000 1 4 25.106441 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.737830 ControlChange 0.000000 1 2 11.044931 ControlChange 0.000000 1 4 25.083607 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 16.436662 ControlChange 0.000000 1 2 11.083707 ControlChange 0.000000 1 4 25.059481 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 18.115520 ControlChange 0.000000 1 2 11.124211 ControlChange 0.000000 1 4 25.034230 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 19.752089 ControlChange 0.000000 1 2 11.166185 ControlChange 0.000000 1 4 25.008006 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.251415 ControlChange 0.000000 1 2 11.209396 ControlChange 0.000000 1 4 24.980946 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.323194 ControlChange 0.000000 1 2 11.253627 ControlChange 0.000000 1 4 24.953176 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.802106 ControlChange 0.000000 1 2 11.298674 ControlChange 0.000000 1 4 24.924813 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.139896 ControlChange 0.000000 1 2 11.344344 ControlChange 0.000000 1 4 24.895966 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.558371 ControlChange 0.000000 1 2 11.390451 ControlChange 0.000000 1 4 24.866740 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.012713 ControlChange 0.000000 1 2 11.436812 ControlChange 0.000000 1 4 24.837234 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.447241 ControlChange 0.000000 1 2 11.483249 ControlChange 0.000000 1 4 24.807543 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.826286 ControlChange 0.000000 1 2 11.529580 ControlChange 0.000000 1 4 24.777763 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.129781 ControlChange 0.000000 1 2 11.575624 ControlChange 0.000000 1 4 24.747985 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.348223 ControlChange 0.000000 1 2 11.621191 ControlChange 0.000000 1 4 24.718303 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.478897 ControlChange 0.000000 1 2 11.666086 ControlChange 0.000000 1 4 24.688812 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.525098 ControlChange 0.000000 1 2 11.710100 ControlChange 0.000000 1 4 24.659606 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.505246 ControlChange 0.000000 1 2 11.753013 ControlChange 0.000000 1 4 24.630786 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.454877 ControlChange 0.000000 1 2 11.794581 ControlChange 0.000000 1 4 24.602455 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.395553 ControlChange 0.000000 1 2 11.834540 ControlChange 0.000000 1 4 24.574722 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.333295 ControlChange 0.000000 1 2 11.872591 ControlChange 0.000000 1 4 24.547704 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.269697 ControlChange 0.000000 1 2 11.908398 ControlChange 0.000000 1 4 24.521527 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.205448 ControlChange 0.000000 1 2 11.941577 ControlChange 0.000000 1 4 24.496328 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.140945 ControlChange 0.000000 1 2 11.971674 ControlChange 0.000000 1 4 24.472258 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.076452 ControlChange 0.000000 1 2 11.998154 ControlChange 0.000000 1 4 24.449484 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 25.012162 ControlChange 0.000000 1 2 12.020368 ControlChange 0.000000 1 4 24.428197 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.948224 ControlChange 0.000000 1 2 12.037509 ControlChange 0.000000 1 4 24.408613 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.884761 ControlChange 0.000000 1 2 12.048679 ControlChange 0.000000 1 4 24.390980 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.821882 ControlChange 0.000000 1 2 12.053935 ControlChange 0.000000 1 4 24.375592 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.759686 ControlChange 0.000000 1 2 12.055723 ControlChange 0.000000 1 4 24.362798 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.698265 ControlChange 0.000000 1 2 12.056772 ControlChange 0.000000 1 4 24.353017 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.637712 ControlChange 0.000000 1 2 12.057916 ControlChange 0.000000 1 4 24.346707 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.578119 ControlChange 0.000000 1 2 12.059145 ControlChange 0.000000 1 4 24.343802 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.519578 ControlChange 0.000000 1 2 12.060425 ControlChange 0.000000 1 4 24.342901 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.462191 ControlChange 0.000000 1 2 12.061740 ControlChange 0.000000 1 4 24.342326 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.406064 ControlChange 0.000000 1 2 12.063080 ControlChange 0.000000 1 4 24.341475 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.351312 ControlChange 0.000000 1 2 12.064439 ControlChange 0.000000 1 4 24.340310 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.298063 ControlChange 0.000000 1 2 12.065814 ControlChange 0.000000 1 4 24.338847 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.246459 ControlChange 0.000000 1 2 12.067200 ControlChange 0.000000 1 4 24.337099 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.196659 ControlChange 0.000000 1 2 12.068595 ControlChange 0.000000 1 4 24.335082 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.148844 ControlChange 0.000000 1 2 12.069998 ControlChange 0.000000 1 4 24.332808 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.103224 ControlChange 0.000000 1 2 12.071405 ControlChange 0.000000 1 4 24.330290 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.060044 ControlChange 0.000000 1 2 12.072815 ControlChange 0.000000 1 4 24.327541 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 24.019598 ControlChange 0.000000 1 2 12.074227 ControlChange 0.000000 1 4 24.324573 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.982232 ControlChange 0.000000 1 2 12.075638 ControlChange 0.000000 1 4 24.321397 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.948375 ControlChange 0.000000 1 2 12.077045 ControlChange 0.000000 1 4 24.318025 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.918557 ControlChange 0.000000 1 2 12.078445 ControlChange 0.000000 1 4 24.314467 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.893460 ControlChange 0.000000 1 2 12.079833 ControlChange 0.000000 1 4 24.310734 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.873977 ControlChange 0.000000 1 2 12.081200 ControlChange 0.000000 1 4 24.306836 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.860927 ControlChange 0.000000 1 2 12.082526 ControlChange 0.000000 1 4 24.302783 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.851467 ControlChange 0.000000 1 2 12.082255 ControlChange 0.000000 1 4 24.298584 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.834284 ControlChange 0.000000 1 2 12.064637 ControlChange 0.000000 1 4 24.294249 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.797214 ControlChange 0.000000 1 2 11.994746 ControlChange 0.000000 1 4 24.289787 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.735773 ControlChange 0.000000 1 2 11.861853 ControlChange 0.000000 1 4 24.285207 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.649343 ControlChange 0.000000 1 2 11.685266 ControlChange 0.000000 1 4 24.280519 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.537757 ControlChange 0.000000 1 2 11.483327 ControlChange 0.000000 1 4 24.275730 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.400919 ControlChange 0.000000 1 2 11.265777 ControlChange 0.000000 1 4 24.270849 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.238805 ControlChange 0.000000 1 2 11.038111 ControlChange 0.000000 1 4 24.265884 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 23.051519 ControlChange 0.000000 1 2 10.803828 ControlChange 0.000000 1 4 24.260845 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.839248 ControlChange 0.000000 1 2 10.565327 ControlChange 0.000000 1 4 24.255739 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.602314 ControlChange 0.000000 1 2 10.324346 ControlChange 0.000000 1 4 24.250573 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.341177 ControlChange 0.000000 1 2 10.082197 ControlChange 0.000000 1 4 24.245358 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 22.056432 ControlChange 0.000000 1 2 9.839905 ControlChange 0.000000 1 4 24.240099 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.748836 ControlChange 0.000000 1 2 9.598295 ControlChange 0.000000 1 4 24.234806 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.419318 ControlChange 0.000000 1 2 9.358044 ControlChange 0.000000 1 4 24.229486 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 21.068963 ControlChange 0.000000 1 2 9.119723 ControlChange 0.000000 1 4 24.224147 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 20.699051 ControlChange 0.000000 1 2 8.883821 ControlChange 0.000000 1 4 24.218797 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 20.311033 ControlChange 0.000000 1 2 8.650765 ControlChange 0.000000 1 4 24.213445 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 19.906524 ControlChange 0.000000 1 2 8.420932 ControlChange 0.000000 1 4 24.208097 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 19.487322 ControlChange 0.000000 1 2 8.194661 ControlChange 0.000000 1 4 24.202763 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 19.055381 ControlChange 0.000000 1 2 7.972262 ControlChange 0.000000 1 4 24.197450 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 18.612801 ControlChange 0.000000 1 2 7.754023 ControlChange 0.000000 1 4 24.192166 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 18.161809 ControlChange 0.000000 1 2 7.540206 ControlChange 0.000000 1 4 24.186920 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 17.704729 ControlChange 0.000000 1 2 7.331064 ControlChange 0.000000 1 4 24.181720 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 17.243962 ControlChange 0.000000 1 2 7.126839 ControlChange 0.000000 1 4 24.176575 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 16.781954 ControlChange 0.000000 1 2 6.927762 ControlChange 0.000000 1 4 24.171493 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 16.321169 ControlChange 0.000000 1 2 6.734055 ControlChange 0.000000 1 4 24.166482 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 15.864053 ControlChange 0.000000 1 2 6.545934 ControlChange 0.000000 1 4 24.161553 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 15.413007 ControlChange 0.000000 1 2 6.363617 ControlChange 0.000000 1 4 24.156714 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.970358 ControlChange 0.000000 1 2 6.187319 ControlChange 0.000000 1 4 24.151974 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.538332 ControlChange 0.000000 1 2 6.017248 ControlChange 0.000000 1 4 24.147343 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 14.119033 ControlChange 0.000000 1 2 5.853615 ControlChange 0.000000 1 4 24.142831 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 13.714418 ControlChange 0.000000 1 2 5.696634 ControlChange 0.000000 1 4 24.138448 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 13.326283 ControlChange 0.000000 1 2 5.546525 ControlChange 0.000000 1 4 24.134205 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 12.956248 ControlChange 0.000000 1 2 5.403507 ControlChange 0.000000 1 4 24.130112 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 12.605766 ControlChange 0.000000 1 2 5.267804 ControlChange 0.000000 1 4 24.126180 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 12.276122 ControlChange 0.000000 1 2 5.139642 ControlChange 0.000000 1 4 24.122421 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 11.968399 ControlChange 0.000000 1 2 5.019256 ControlChange 0.000000 1 4 24.118848 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 11.683528 ControlChange 0.000000 1 2 4.906883 ControlChange 0.000000 1 4 24.115471 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 11.422271 ControlChange 0.000000 1 2 4.802769 ControlChange 0.000000 1 4 24.112305 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 11.185224 ControlChange 0.000000 1 2 4.707167 ControlChange 0.000000 1 4 24.109364 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.972850 ControlChange 0.000000 1 2 4.620344 ControlChange 0.000000 1 4 24.106660 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.785468 ControlChange 0.000000 1 2 4.542581 ControlChange 0.000000 1 4 24. 4209 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.623268 ControlChange 0.000000 1 2 4.474161 ControlChange 0.000000 1 4 24. 2027 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.486356 ControlChange 0.000000 1 2 4.415372 ControlChange 0.000000 1 4 24.100131 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.374710 ControlChange 0.000000 1 2 4.366524 ControlChange 0.000000 1 4 24.098536 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.288232 ControlChange 0.000000 1 2 4.327952 ControlChange 0.000000 1 4 24.097262 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.226755 ControlChange 0.000000 1 2 4.299990 ControlChange 0.000000 1 4 24.096328 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.189770 ControlChange 0.000000 1 2 4.189133 ControlChange 0.000000 1 4 24.095750 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.173981 ControlChange 0.000000 1 2 3.205135 ControlChange 0.000000 1 4 24.095498 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170397 ControlChange 0.000000 1 2 1.070413 ControlChange 0.000000 1 4 24.095440 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.093718 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 ControlChange 0.004167 1 100 10.170130 ControlChange 0.000000 1 2 0.000000 ControlChange 0.000000 1 4 24.095436 ControlChange 0.000000 1 101 391.995436 NoteOff 0 1 62 0.000000 stk-4.5.0/projects/demo/scores/organs.ski0000644000076600007660000001614312327014024016214 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000327 1 68 64 NoteOn 0.011439 1 72 60 NoteOn 0.100661 1 69 58 NoteOff 0.022910 1 68 0 NoteOff 0.087179 1 69 0 NoteOff 0.002768 1 72 0 NoteOn 0.146276 1 74 60 NoteOn 0.007877 1 70 73 NoteOff 0.065823 1 74 0 NoteOff 0.034091 1 70 0 NoteOn 0.071562 1 65 42 NoteOff 0.095505 1 65 0 NoteOn 0.117222 1 72 36 NoteOn 0.003568 1 75 57 NoteOff 0.867934 1 72 0 NoteOff 0.016747 1 75 0 NoteOn 0.001292 1 70 66 NoteOn 0.016806 1 74 41 NoteOff 0.903721 1 70 0 NoteOn 0.002269 1 71 60 NoteOff 0.002452 1 74 0 NoteOff 0.024367 1 71 0 NoteOn 0.573769 1 71 71 NoteOn 0.071125 1 72 47 NoteOff 0.017603 1 71 0 NoteOn 0.099531 1 77 63 NoteOff 0.005133 1 72 0 NoteOn 0.002825 1 75 57 NoteOff 0.051047 1 77 0 NoteOn 0.062443 1 72 42 NoteOff 0.003421 1 75 0 NoteOn 0.004190 1 73 22 NoteOff 0.032476 1 73 0 NoteOff 0.003357 1 72 0 NoteOn 0.003412 1 71 51 NoteOff 0.082169 1 71 0 NoteOn 0.030527 1 70 64 NoteOff 0.068936 1 70 0 NoteOn 0.002836 1 68 63 NoteOff 0.069395 1 68 0 NoteOn 0.024967 1 65 52 NoteOff 0.083696 1 65 0 NoteOn 0.027784 1 63 69 NoteOff 0.102489 1 63 0 NoteOn 0.048174 1 60 61 NoteOff 0.094914 1 60 0 NoteOn 0.076034 1 58 62 NoteOff 0.080772 1 58 0 NoteOn 0.107826 1 56 73 NoteOff 0.114325 1 56 0 NoteOn 0.159665 1 53 71 NoteOff 0.094385 1 53 0 NoteOn 0.218823 1 56 82 NoteOff 0.396073 1 56 0 NoteOn 0.016601 1 53 79 NoteOff 0.590675 1 53 0 NoteOn 0.013945 1 41 61 NoteOn 0.003797 1 53 48 NoteOn 0.749734 1 57 69 NoteOn 0.006420 1 63 69 NoteOff 0.004025 1 53 0 NoteOn 0.001033 1 59 71 NoteOff 0.183718 1 59 0 ControlChange 0.981560 1 1 1 ControlChange 0.014051 1 1 2 ControlChange 0.018312 1 1 3 ControlChange 0.013991 1 1 4 ControlChange 0.014672 1 1 5 ControlChange 0.008917 1 1 6 ControlChange 0.009676 1 1 7 ControlChange 0.009401 1 1 8 ControlChange 0.014007 1 1 9 ControlChange 0.009716 1 1 10 ControlChange 0.009322 1 1 11 ControlChange 0.009533 1 1 12 ControlChange 0.009596 1 1 13 ControlChange 0.009475 1 1 14 ControlChange 0.014006 1 1 15 ControlChange 0.009540 1 1 16 ControlChange 0.010279 1 1 17 ControlChange 0.013663 1 1 18 ControlChange 0.009675 1 1 19 ControlChange 0.009790 1 1 20 ControlChange 0.014027 1 1 21 ControlChange 0.013973 1 1 22 ControlChange 0.009544 1 1 23 ControlChange 0.014007 1 1 24 ControlChange 0.010353 1 1 25 ControlChange 0.010221 1 1 26 ControlChange 0.017407 1 1 27 ControlChange 0.010088 1 1 28 ControlChange 0.009214 1 1 29 ControlChange 0.009312 1 1 31 ControlChange 0.014216 1 1 32 ControlChange 0.004844 1 1 33 ControlChange 0.009540 1 1 34 ControlChange 0.005039 1 1 35 ControlChange 0.009520 1 1 36 ControlChange 0.010018 1 1 37 ControlChange 0.004663 1 1 38 ControlChange 0.009539 1 1 39 ControlChange 0.009540 1 1 41 ControlChange 0.005017 1 1 42 ControlChange 0.009504 1 1 43 ControlChange 0.005097 1 1 44 ControlChange 0.009941 1 1 45 ControlChange 0.004610 1 1 46 ControlChange 0.005284 1 1 47 ControlChange 0.004821 1 1 48 ControlChange 0.005134 1 1 49 ControlChange 0.009580 1 1 51 ControlChange 0.009561 1 1 52 ControlChange 0.019091 1 1 54 ControlChange 0.001107 1 1 55 ControlChange 0.003756 1 1 56 ControlChange 0.009684 1 1 57 ControlChange 0.004888 1 1 58 ControlChange 0.014042 1 1 59 ControlChange 0.009508 1 1 60 ControlChange 0.009528 1 1 61 ControlChange 0.014029 1 1 62 ControlChange 0.009753 1 1 63 ControlChange 0.018303 1 1 64 ControlChange 0.014210 1 1 65 ControlChange 0.027270 1 1 66 ControlChange 0.027450 1 1 67 ControlChange 0.072463 1 1 68 ControlChange 0.040774 1 1 69 ControlChange 0.022966 1 1 70 ControlChange 0.018511 1 1 71 ControlChange 0.023463 1 1 72 ControlChange 0.013521 1 1 73 ControlChange 0.014483 1 1 74 ControlChange 0.013854 1 1 75 ControlChange 0.009555 1 1 76 ControlChange 0.018674 1 1 77 ControlChange 0.009540 1 1 78 ControlChange 0.009616 1 1 79 ControlChange 0.013994 1 1 80 ControlChange 0.014260 1 1 81 ControlChange 0.018448 1 1 82 ControlChange 0.032114 1 1 83 ControlChange 0.058711 1 1 84 ControlChange 0.049895 1 1 85 ControlChange 0.032104 1 1 86 ControlChange 0.036434 1 1 87 ControlChange 0.022873 1 1 88 ControlChange 0.068096 1 1 89 ControlChange 0.112544 1 1 90 ControlChange 0.018361 1 1 91 ControlChange 0.018528 1 1 92 ControlChange 0.018461 1 1 93 ControlChange 0.014041 1 1 94 ControlChange 0.037010 1 1 95 ControlChange 0.008956 1 1 96 ControlChange 0.099445 1 1 95 ControlChange 0.013834 1 1 94 ControlChange 0.009499 1 1 93 ControlChange 0.010104 1 1 92 ControlChange 0.005027 1 1 91 ControlChange 0.010180 1 1 90 ControlChange 0.008871 1 1 89 ControlChange 0.009510 1 1 88 ControlChange 0.005047 1 1 87 ControlChange 0.014061 1 1 86 ControlChange 0.009903 1 1 85 ControlChange 0.009119 1 1 84 ControlChange 0.009573 1 1 83 ControlChange 0.009491 1 1 82 ControlChange 0.005078 1 1 81 ControlChange 0.005002 1 1 80 ControlChange 0.009607 1 1 78 ControlChange 0.005082 1 1 77 ControlChange 0.009826 1 1 76 ControlChange 0.004771 1 1 75 ControlChange 0.005025 1 1 74 ControlChange 0.005486 1 1 72 ControlChange 0.004613 1 1 71 ControlChange 0.005046 1 1 70 ControlChange 0.005514 1 1 69 ControlChange 0.004571 1 1 67 ControlChange 0.005025 1 1 66 ControlChange 0.005039 1 1 65 ControlChange 0.005033 1 1 63 ControlChange 0.005073 1 1 62 ControlChange 0.005017 1 1 60 ControlChange 0.005073 1 1 59 ControlChange 0.005033 1 1 57 ControlChange 0.005061 1 1 56 ControlChange 0.005057 1 1 54 ControlChange 0.005024 1 1 52 ControlChange 0.005068 1 1 51 ControlChange 0.004988 1 1 49 ControlChange 0.005074 1 1 47 ControlChange 0.005035 1 1 45 ControlChange 0.005221 1 1 44 ControlChange 0.005234 1 1 42 ControlChange 0.005196 1 1 40 ControlChange 0.005115 1 1 38 ControlChange 0.005286 1 1 36 ControlChange 0.005148 1 1 34 ControlChange 0.005234 1 1 32 ControlChange 0.005301 1 1 30 ControlChange 0.005069 1 1 28 ControlChange 0.005155 1 1 26 ControlChange 0.008498 1 1 24 ControlChange 0.002918 1 1 21 ControlChange 0.004145 1 1 20 ControlChange 0.005652 1 1 17 ControlChange 0.004790 1 1 15 ControlChange 0.005180 1 1 13 ControlChange 0.005223 1 1 10 ControlChange 0.005177 1 1 8 ControlChange 0.005270 1 1 6 ControlChange 0.005135 1 1 4 ControlChange 0.005196 1 1 2 ControlChange 0.005197 1 1 0 NoteOff 0.354573 1 63 0 NoteOff 0.014193 1 57 0 NoteOff 0.008219 1 41 0 stk-4.5.0/projects/demo/scores/pickdamp.ski0000644000076600007660000000522612327014024016513 0ustar gary/* Howdy!!!! SKINI0.9 Test Score ***********/ PickPosition 0.0 2 64.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 PickPosition 0.0 2 56.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 PickPosition 0.0 2 48.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 PickPosition 0.0 2 40.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 PickPosition 0.0 2 32.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 PickPosition 0.0 2 24.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 PickPosition 0.0 2 16.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 PickPosition 0.0 2 8.0 NoteOn 0.0 2 55.0 64.0 NoteOff 1.25 2 55.0 64.0 PickPosition 0.0 2 64.0 BodySize 0.0 2 0.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 BodySize 0.0 2 16.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 BodySize 0.0 2 32.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 BodySize 0.0 2 48.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 BodySize 0.0 2 60.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 BodySize 0.0 2 80.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 BodySize 0.0 2 96.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 BodySize 0.0 2 127.0 NoteOn 0.0 2 55.0 64.0 NoteOff 0.25 2 55.0 64.0 BodySize 0.0 2 64.0 NoteOn 0.0 2 55.0 64.0 NoteOff 1.25 2 55.0 64.0 StringDamping 0.0 2 0.0 PickPosition 0.0 2 64.0 NoteOn 0.0 2 55.0 64.0 NoteOff 1.25 2 55.0 64.0 StringDamping 0.0 2 128.0 NoteOn 0.0 2 55.0 64.0 NoteOff 1.25 2 55.0 64.0 stk-4.5.0/projects/demo/scores/pictures.ski0000644000076600007660000000231312327014024016553 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 72 127.000000 NoteOff 0.540000 1 72 63.500000 NoteOn 0.060000 1 70 127.000000 NoteOff 0.540000 1 70 63.500000 NoteOn 0.060000 1 75 127.000000 NoteOff 0.540000 1 75 63.500000 NoteOn 0.060000 1 77 127.000000 NoteOff 0.270023 1 77 63.500000 NoteOn 0.030023 1 70 127.000000 ControlChange 0.000000 1 2 96.000000 NoteOff 0.299728 1 70 63.500000 NoteOn 0.000317 1 79 127.000000 NoteOff 0.540000 1 79 63.500000 NoteOn 0.060000 1 77 127.000000 NoteOff 0.270023 1 77 63.500000 NoteOn 0.030023 1 70 127.000000 ControlChange 0.000000 1 2 96.000000 NoteOff 0.299728 1 70 63.500000 NoteOn 0.000317 1 79 127.000000 NoteOff 0.540000 1 79 63.500000 NoteOn 0.060000 1 75 127.000000 NoteOff 0.540000 1 75 63.500000 NoteOn 0.060000 1 77 127.000000 NoteOff 0.540000 1 77 63.500000 NoteOn 0.060000 1 72 127.000000 NoteOff 0.540000 1 72 63.500000 NoteOn 0.060000 1 70 127.000000 NoteOff 0.540000 1 70 63.500000 NoteOff 0.060000 1 70 63.500000 stk-4.5.0/projects/demo/scores/README0000644000076600007660000000070112327014024015064 0ustar garySuggested Score/Instrument Pairings: BeeThree bookert.ski, organs.ski Rhodey doogie.ski Mandolin duelingb.ski Bowed muneira.ski, fiddle.ski PercFlut misacrio.ski ModalBar morazbel.ski Brass pictures.ski Wurley riderson.ski Flute simplgft.ski Clarinet simplgft.ski ModalBar spain.ski HevyMetl streetsf.ski Moog thecars.ski TubeBell tubebell.ski FMVoices lacrymos.ski, vocaliz.ski VoicForm lacrymos.ski, vocaliz.ski stk-4.5.0/projects/demo/scores/riderson.ski0000644000076600007660000000476312327014024016555 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ ControlChange 0.000000 1 1 50.000000 NoteOn 0.000000 1 60 114.299997 NoteOff 0.480045 1 60 88.899998 NoteOn 0.120045 1 60 76.200003 NoteOff 0.150023 1 60 63.500000 NoteOn 0.150023 1 62 101.600002 NoteOff 0.720000 1 62 88.899998 NoteOn 0.180000 1 62 76.200003 NoteOff 0.150023 1 62 63.500000 NoteOn 0.150023 1 63 101.600002 NoteOff 0.720000 1 63 88.899998 NoteOn 0.180000 1 63 38.100002 NoteOff 0.150023 1 63 63.500000 NoteOn 0.150023 1 62 101.600002 NoteOff 0.720000 1 62 88.899998 NoteOn 0.180000 1 62 76.200003 NoteOff 0.480045 1 62 88.899998 NoteOn 0.120045 1 48 114.299997 NoteOff 0.480045 1 48 88.899998 NoteOn 0.120045 1 48 76.200003 NoteOff 0.150023 1 48 63.500000 NoteOn 0.150023 1 50 101.600002 NoteOff 0.720000 1 50 88.899998 NoteOn 0.180000 1 50 76.200003 NoteOff 0.150023 1 50 63.500000 NoteOn 0.150023 1 51 101.600002 NoteOff 0.720000 1 51 88.899998 NoteOn 0.180000 1 51 38.100002 NoteOff 0.150023 1 51 63.500000 NoteOn 0.150023 1 50 101.600002 NoteOff 0.720000 1 50 88.899998 NoteOn 0.180000 1 48 76.200003 NoteOff 0.240045 1 48 88.899998 NoteOn 0.060045 1 72 88.899998 NoteOff 0.240045 1 72 88.899998 NoteOn 0.060045 1 77 114.299997 NoteOff 0.240045 1 77 88.899998 NoteOn 0.060045 1 77 101.600002 NoteOff 0.240045 1 77 88.899998 NoteOn 0.060045 1 77 88.899998 NoteOff 0.240045 1 77 88.899998 NoteOn 0.060045 1 75 76.200003 NoteOff 0.240045 1 75 88.899998 NoteOn 0.060045 1 77 88.899998 NoteOff 0.480045 1 77 88.899998 NoteOn 0.120045 1 77 88.899998 NoteOff 0.150023 1 77 63.500000 NoteOn 0.150023 1 77 88.899998 NoteOff 0.150023 1 77 63.500000 NoteOn 0.150023 1 87 101.600002 NoteOff 0.240045 1 87 88.899998 NoteOn 0.060045 1 84 76.200003 NoteOff 0.150023 1 84 63.500000 NoteOn 0.150023 1 84 76.200003 NoteOff 0.240045 1 84 88.899998 NoteOn 0.060045 1 82 76.200003 NoteOff 0.240045 1 82 88.899998 NoteOn 0.060045 1 84 88.899998 NoteOff 0.960045 1 84 88.899998 NoteOn 0.240045 1 48 127.000000 ControlChange 0.000000 1 1 127.000000 NoteOff 1.300000 1 48 63.500000 stk-4.5.0/projects/demo/scores/scales.ski0000644000076600007660000000370612327014024016176 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ PlayerSkill 0.0 2 100 NoteOn 0.0 2 67 64 NoteOff 0.5 2 67 0 NoteOn 0.0 2 69 64 NoteOff 0.5 2 69 0 NoteOn 0.0 2 71 64 NoteOff 0.5 2 71 0 NoteOn 0.0 2 72 64 NoteOff 0.5 2 72 0 NoteOn 0.0 2 74 64 NoteOff 0.5 2 74 0 NoteOn 0.0 2 72 64 NoteOff 0.5 2 72 0 NoteOn 0.0 2 71 64 NoteOff 0.5 2 71 0 NoteOn 0.0 2 69 64 NoteOff 0.5 2 69 0 PlayerSkill 0.0 2 10 NoteOn 0.0 2 67 64 NoteOff 0.5 2 67 0 NoteOn 0.0 2 69 64 NoteOff 0.5 2 69 0 NoteOn 0.0 2 71 64 NoteOff 0.5 2 71 0 NoteOn 0.0 2 72 64 NoteOff 0.5 2 72 0 NoteOn 0.0 2 74 64 NoteOff 0.5 2 74 0 NoteOn 0.0 2 72 64 NoteOff 0.5 2 72 0 NoteOn 0.0 2 71 64 NoteOff 0.5 2 71 0 NoteOn 0.0 2 69 64 NoteOff 0.5 2 69 0 Strumming 0.0 2 127 PlayerSkill 0.0 2 127 NoteOn 0.0 2 67 64 NoteOff 0.5 2 67 0 NoteOn 0.0 2 69 64 NoteOff 0.5 2 69 0 NoteOn 0.0 2 71 64 NoteOff 0.5 2 71 0 NoteOn 0.0 2 72 64 NoteOff 0.5 2 72 0 NoteOn 0.0 2 74 64 NoteOff 0.5 2 74 0 NoteOn 0.0 2 72 64 NoteOff 0.5 2 72 0 NoteOn 0.0 2 71 64 NoteOff 0.5 2 71 0 NoteOn 0.0 2 69 64 NoteOff 0.5 2 69 0 PlayerSkill 0.0 2 0 NoteOn 0.0 2 67 64 NoteOff 0.5 2 67 0 NoteOn 0.0 2 69 64 NoteOff 0.5 2 69 0 NoteOn 0.0 2 71 64 NoteOff 0.5 2 71 0 NoteOn 0.0 2 72 64 NoteOff 0.5 2 72 0 NoteOn 0.0 2 74 64 NoteOff 0.5 2 74 0 NoteOn 0.0 2 72 64 NoteOff 0.5 2 72 0 NoteOn 0.0 2 71 64 NoteOff 0.5 2 71 0 NoteOn 0.0 2 69 64 NoteOff 0.5 2 69 0 NoteOn 0.0 2 67 64 NoteOff 2.0 2 67 0 stk-4.5.0/projects/demo/scores/shaktest.ski0000644000076600007660000000363412327014024016552 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ Maraca 0.000000 1 NoteOn 0.500000 1 80 10.000000 NoteOn 0.500000 1 80 50.000000 NoteOn 0.500000 1 80 90.000000 NoteOn 0.500000 1 80 127.000000 ControlChange 0.500000 1 1 1 NoteOn 0.000000 1 80 64.000000 ControlChange 0.500000 1 1 40 NoteOn 0.000000 1 80 64.000000 ControlChange 0.500000 1 1 80 NoteOn 0.000000 1 80 64.000000 ControlChange 0.500000 1 1 120 NoteOn 0.000000 1 80 64.000000 Maraca 0.500000 1 ControlChange 0.000000 1 4 1 NoteOn 0.000000 1 80 64.000000 ControlChange 0.500000 1 4 40 NoteOn 0.000000 1 80 64.000000 ControlChange 0.500000 1 4 80 NoteOn 0.000000 1 80 64.000000 ControlChange 0.500000 1 4 120 NoteOn 0.000000 1 80 64.000000 Maraca 0.500000 1 ControlChange 0.000000 1 11 1 NoteOn 0.000000 1 80 64.000000 ControlChange 1.000000 1 11 4 NoteOn 0.000000 1 80 64.000000 ControlChange 1.000000 1 11 16 NoteOn 0.000000 1 80 64.000000 ControlChange 1.000000 1 11 64 NoteOn 0.000000 1 80 64.000000 ControlChange 1.000000 1 11 128 NoteOn 0.000000 1 80 64.000000 Cabasa 0.500000 1 NoteOn 0.000000 1 80 10.000000 NoteOn 0.500000 1 80 50.000000 NoteOn 0.500000 1 80 90.000000 NoteOn 0.500000 1 80 127.000000 Sekere 0.500000 1 NoteOn 0.000000 1 80 10.000000 NoteOn 0.500000 1 80 50.000000 NoteOn 0.500000 1 80 90.000000 NoteOn 0.500000 1 80 127.000000 Tambourn 0.500000 1 NoteOn 0.000000 1 80 10.000000 NoteOn 0.500000 1 80 50.000000 NoteOn 0.500000 1 80 90.000000 NoteOn 0.500000 1 80 127.000000 Sleighbl 0.500000 1 NoteOn 0.000000 1 80 10.000000 NoteOn 0.500000 1 80 50.000000 NoteOn 0.500000 1 80 90.000000 NoteOn 0.500000 1 80 127.000000 Exit stk-4.5.0/projects/demo/scores/simplgft.ski0000644000076600007660000000357312327014024016553 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 60 127.000000 NoteOff 0.475011 1 60 63.500000 NoteOn 0.025034 1 65 127.000000 NoteOff 0.475011 1 65 63.500000 NoteOn 0.025034 1 65 127.000000 NoteOff 0.124989 1 65 63.500000 NoteOn 0.124989 1 67 127.000000 NoteOff 0.124989 1 67 63.500000 NoteOn 0.124989 1 69 127.000000 NoteOff 0.237506 1 69 63.500000 NoteOn 0.012517 1 65 127.000000 NoteOff 0.124989 1 65 63.500000 NoteOn 0.124989 1 69 127.000000 NoteOff 0.124989 1 69 63.500000 NoteOn 0.124989 1 70 127.000000 NoteOff 0.237506 1 70 63.500000 NoteOn 0.012517 1 72 127.000000 NoteOff 0.475011 1 72 63.500000 NoteOn 0.025034 1 72 127.000000 NoteOff 0.237506 1 72 63.500000 NoteOn 0.012517 1 70 127.000000 NoteOff 0.124989 1 70 63.500000 NoteOn 0.124989 1 69 127.000000 NoteOff 0.475011 1 69 63.500000 NoteOn 0.025034 1 79 127.000000 NoteOff 0.124989 1 79 63.500000 NoteOn 0.124989 1 77 127.000000 NoteOff 0.124989 1 77 63.500000 NoteOn 0.124989 1 79 127.000000 NoteOff 0.475011 1 79 63.500000 NoteOn 0.025034 1 79 127.000000 NoteOff 0.475011 1 79 63.500000 NoteOn 0.025034 1 81 127.000000 NoteOff 0.475011 1 81 63.500000 NoteOn 0.025034 1 81 127.000000 NoteOff 0.124989 1 81 63.500000 NoteOn 0.124989 1 79 127.000000 NoteOff 0.124989 1 79 63.500000 NoteOn 0.124989 1 77 127.000000 ControlChange 0.000000 1 1 32.000000 NoteOff 0.475011 1 77 63.500000 NoteOn 0.025034 1 65 127.000000 NoteOff 0.475011 1 65 63.500000 NoteOn 0.025034 1 41 127.000000 NoteOff 0.950023 1 41 63.500000 NoteOff 0.050023 1 41 63.500000 stk-4.5.0/projects/demo/scores/spain.ski0000644000076600007660000000165612327014024016040 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 48 88.899998 NoteOff 0.416009 1 48 63.500000 NoteOn 0.104036 1 53 101.600002 NoteOff 0.312018 1 53 63.500000 NoteOn 0.078005 1 56 63.500000 NoteOn 0.130023 1 55 101.600002 NoteOn 0.260000 1 51 76.200003 NoteOn 0.130023 1 48 38.100002 NoteOn 0.130023 1 53 101.600002 NoteOn 0.520000 1 58 127.000000 NoteOff 0.312018 1 58 63.500000 NoteOn 0.078005 1 63 76.200003 NoteOn 0.130023 1 62 114.299997 NoteOff 0.416009 1 62 63.500000 NoteOn 0.104036 1 58 127.000000 NoteOn 0.130023 1 60 50.800001 NoteOn 0.260000 1 56 88.899998 NoteOn 0.260000 1 56 63.500000 NoteOn 0.130023 1 63 76.200003 NoteOn 0.260000 1 41 127.000000 ControlChange 0.000000 1 1 127.000000 NoteOff 1.950023 1 41 63.500000 stk-4.5.0/projects/demo/scores/streetsf.ski0000644000076600007660000000435112327014024016560 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 60 127.000000 NoteOff 0.126032 1 60 63.500000 NoteOn 0.014014 1 60 127.000000 NoteOff 0.252018 1 60 63.500000 NoteOn 0.028027 1 60 127.000000 NoteOff 0.252018 1 60 63.500000 NoteOn 0.028027 1 60 127.000000 NoteOff 0.126032 1 60 63.500000 NoteOn 0.014014 1 63 127.000000 NoteOff 0.126032 1 63 63.500000 NoteOn 0.014014 1 60 127.000000 NoteOff 0.126032 1 60 63.500000 NoteOn 0.014014 1 65 127.000000 NoteOff 0.252018 1 65 63.500000 NoteOn 0.028027 1 67 127.000000 NoteOff 0.756009 1 67 63.500000 NoteOn 0.084036 1 72 127.000000 NoteOff 0.252018 1 72 63.500000 NoteOn 0.028027 1 75 127.000000 NoteOff 0.126032 1 75 63.500000 NoteOn 0.014014 1 72 127.000000 NoteOff 0.378005 1 72 63.500000 NoteOn 0.042041 1 70 127.000000 NoteOff 0.126032 1 70 63.500000 NoteOn 0.014014 1 67 127.000000 NoteOff 0.126032 1 67 63.500000 NoteOn 0.014014 1 72 127.000000 NoteOff 0.252018 1 72 63.500000 NoteOn 0.028027 1 70 127.000000 NoteOff 0.252018 1 70 63.500000 NoteOn 0.028027 1 67 127.000000 NoteOff 0.126032 1 67 63.500000 NoteOn 0.014014 1 65 127.000000 NoteOff 0.126032 1 65 63.500000 NoteOn 0.014014 1 63 127.000000 NoteOff 0.252018 1 63 63.500000 NoteOn 0.028027 1 48 127.000000 NoteOff 0.126032 1 48 63.500000 NoteOn 0.014014 1 48 127.000000 NoteOff 0.252018 1 48 63.500000 NoteOn 0.028027 1 48 127.000000 NoteOff 0.252018 1 48 63.500000 NoteOn 0.028027 1 48 127.000000 NoteOff 0.126032 1 48 63.500000 NoteOn 0.014014 1 51 127.000000 NoteOff 0.126032 1 51 63.500000 NoteOn 0.014014 1 48 127.000000 NoteOff 0.126032 1 48 63.500000 NoteOn 0.014014 1 53 127.000000 NoteOff 0.252018 1 53 63.500000 NoteOn 0.028027 1 51 127.000000 NoteOff 1.260000 1 51 63.500000 NoteOn 0.140000 1 84 127.000000 NoteOff 0.630023 1 84 63.500000 NoteOff 0.070023 1 84 63.500000 stk-4.5.0/projects/demo/scores/test.ski0000644000076600007660000000016012327014024015672 0ustar gary/* Howdy!! SKINI File, Perry Cook */ NoteOn 0.2 1 60 127.000000 NoteOff 0.6 1 60 63.500000 stk-4.5.0/projects/demo/scores/thecars.ski0000644000076600007660000000302012327014024016342 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 48 127.000000 NoteOff 0.380000 1 48 63.500000 NoteOn 0.020000 1 48 127.000000 NoteOff 0.100000 1 48 63.500000 NoteOn 0.100000 1 48 127.000000 NoteOff 0.100000 1 48 63.500000 NoteOn 0.100000 1 51 127.000000 NoteOff 0.100000 1 51 63.500000 NoteOn 0.100000 1 51 127.000000 NoteOff 0.570023 1 51 63.500000 NoteOn 0.030023 1 50 127.000000 NoteOff 0.100000 1 50 63.500000 NoteOn 0.100000 1 46 127.000000 NoteOff 0.200000 1 46 63.500000 NoteOn 0.200000 1 60 127.000000 NoteOff 0.950023 1 60 63.500000 NoteOn 0.050023 1 77 127.000000 NoteOff 0.190023 1 77 63.500000 NoteOn 0.010023 1 72 127.000000 NoteOff 0.190023 1 72 63.500000 NoteOn 0.010023 1 69 127.000000 NoteOff 0.100000 1 69 63.500000 NoteOn 0.100000 1 75 127.000000 NoteOff 0.380000 1 75 63.500000 NoteOn 0.020000 1 70 127.000000 NoteOff 0.100000 1 70 63.500000 NoteOn 0.100000 1 67 127.000000 NoteOff 0.100000 1 67 63.500000 NoteOn 0.100000 1 74 127.000000 NoteOff 0.380000 1 74 63.500000 NoteOn 0.020000 1 70 127.000000 NoteOff 0.100000 1 70 63.500000 NoteOn 0.100000 1 65 127.000000 NoteOff 0.100000 1 65 63.500000 NoteOn 0.100000 1 72 127.000000 ControlChange 0.000000 1 1 20.000000 NoteOff 1.000000 1 72 63.500000 stk-4.5.0/projects/demo/scores/tubebell.ski0000644000076600007660000000141612327014024016516 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ NoteOn 0.000000 1 65 63.500000 NoteOn 0.200000 1 73 101.600002 NoteOn 0.200000 1 65 76.200003 NoteOn 0.200000 1 75 114.299997 NoteOn 0.200000 1 65 63.500000 NoteOn 0.200000 1 72 76.200003 NoteOn 0.200000 1 73 114.299997 NoteOn 0.200000 1 65 50.800001 NoteOn 0.200000 1 72 114.299997 NoteOn 0.200000 1 65 63.500000 NoteOn 0.200000 1 70 114.299997 NoteOn 0.200000 1 65 50.800001 NoteOn 0.200000 1 85 127.000000 NoteOn 0.200000 1 65 76.200003 NoteOn 0.200000 1 80 76.200003 NoteOn 0.200000 1 46 127.000000 ControlChange 0.000000 1 1 120.000000 NoteOff 2.000000 1 46 63.500000 stk-4.5.0/projects/demo/scores/vocaliz.ski0000644000076600007660000001414712327014024016374 0ustar gary/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ /**** BASS ****/ ControlChange 0.000000 1 1 20.000000 ControlChange 0.000000 1 4 8.000000 NoteOn 0.000000 1 40 64.000000 NoteOff 0.500000 1 40 64.500000 NoteOn 0.000000 1 44 74.000000 NoteOff 0.500000 1 44 64.500000 NoteOn 0.000000 1 47 84.000000 NoteOff 0.500000 1 47 64.500000 NoteOn 0.000000 1 52 94.000000 NoteOff 0.500000 1 52 64.500000 ControlChange 0.000000 1 4 0.000000 NoteOn 0.000000 1 51 84.000000 NoteOff 0.500000 1 51 64.500000 NoteOn 0.000000 1 47 74.000000 NoteOff 0.500000 1 47 64.500000 NoteOn 0.000000 1 45 64.000000 NoteOff 0.500000 1 45 64.500000 NoteOn 0.000000 1 42 54.000000 NoteOff 0.500000 1 42 64.500000 ControlChange 0.000000 1 4 20.000000 NoteOn 0.000000 1 40 64.000000 NoteOff 0.500000 1 40 64.500000 NoteOn 0.000000 1 44 74.000000 NoteOff 0.500000 1 44 64.500000 NoteOn 0.000000 1 47 84.000000 NoteOff 0.500000 1 47 64.500000 NoteOn 0.000000 1 52 94.000000 NoteOff 0.500000 1 52 64.500000 ControlChange 0.000000 1 4 12.000000 NoteOn 0.000000 1 51 84.000000 NoteOff 0.500000 1 51 64.500000 NoteOn 0.000000 1 47 74.000000 NoteOff 0.500000 1 47 64.500000 NoteOn 0.000000 1 45 64.000000 NoteOff 0.500000 1 45 64.500000 NoteOn 0.000000 1 42 54.000000 NoteOff 0.500000 1 42 64.500000 NoteOn 0.000000 1 40 64.000000 NoteOff 1.000000 1 40 64.500000 /**** TENOR ****/ ControlChange 0.000000 1 4 40.000000 NoteOn 0.000000 1 45 64.000000 NoteOff 0.500000 1 45 64.500000 NoteOn 0.000000 1 49 74.000000 NoteOff 0.500000 1 49 64.500000 NoteOn 0.000000 1 52 84.000000 NoteOff 0.500000 1 52 64.500000 NoteOn 0.000000 1 57 94.000000 NoteOff 0.500000 1 57 64.500000 ControlChange 0.000000 1 4 32.000000 NoteOn 0.000000 1 56 84.000000 NoteOff 0.500000 1 56 64.500000 NoteOn 0.000000 1 52 74.000000 NoteOff 0.500000 1 52 64.500000 NoteOn 0.000000 1 50 64.000000 NoteOff 0.500000 1 50 64.500000 NoteOn 0.000000 1 47 54.000000 NoteOff 0.500000 1 47 64.500000 ControlChange 0.000000 1 4 52.000000 NoteOn 0.000000 1 45 64.000000 NoteOff 0.500000 1 45 64.500000 NoteOn 0.000000 1 49 74.000000 NoteOff 0.500000 1 49 64.500000 NoteOn 0.000000 1 52 84.000000 NoteOff 0.500000 1 52 64.500000 NoteOn 0.000000 1 57 94.000000 NoteOff 0.500000 1 57 64.500000 ControlChange 0.000000 1 4 44.000000 NoteOn 0.000000 1 56 84.000000 NoteOff 0.500000 1 56 64.500000 NoteOn 0.000000 1 52 74.000000 NoteOff 0.500000 1 52 64.500000 NoteOn 0.000000 1 50 64.000000 NoteOff 0.500000 1 50 64.500000 NoteOn 0.000000 1 47 54.000000 NoteOff 0.500000 1 47 64.500000 NoteOn 0.000000 1 45 64.000000 NoteOff 1.000000 1 45 64.500000 /**** ALTO ****/ ControlChange 0.000000 1 4 72.000000 NoteOn 0.000000 1 50 64.000000 NoteOff 0.500000 1 50 64.500000 NoteOn 0.000000 1 54 74.000000 NoteOff 0.500000 1 54 64.500000 NoteOn 0.000000 1 57 84.000000 NoteOff 0.500000 1 57 64.500000 NoteOn 0.000000 1 62 94.000000 NoteOff 0.500000 1 62 64.500000 ControlChange 0.000000 1 4 64.000000 NoteOn 0.000000 1 61 84.000000 NoteOff 0.500000 1 61 64.500000 NoteOn 0.000000 1 57 74.000000 NoteOff 0.500000 1 57 64.500000 NoteOn 0.000000 1 55 64.000000 NoteOff 0.500000 1 55 64.500000 NoteOn 0.000000 1 52 54.000000 NoteOff 0.500000 1 52 64.500000 ControlChange 0.000000 1 4 84.000000 NoteOn 0.000000 1 50 64.000000 NoteOff 0.500000 1 50 64.500000 NoteOn 0.000000 1 54 74.000000 NoteOff 0.500000 1 54 64.500000 NoteOn 0.000000 1 57 84.000000 NoteOff 0.500000 1 57 64.500000 NoteOn 0.000000 1 62 94.000000 NoteOff 0.500000 1 62 64.500000 ControlChange 0.000000 1 4 76.000000 NoteOn 0.000000 1 61 84.000000 NoteOff 0.500000 1 61 64.500000 NoteOn 0.000000 1 57 74.000000 NoteOff 0.500000 1 57 64.500000 NoteOn 0.000000 1 55 64.000000 NoteOff 0.500000 1 55 64.500000 NoteOn 0.000000 1 52 54.000000 NoteOff 0.500000 1 52 64.500000 NoteOn 0.000000 1 50 64.000000 NoteOff 1.000000 1 50 64.500000 /**** SOPRANO ****/ ControlChange 0.000000 1 4 104.000000 NoteOn 0.000000 1 70 64.000000 NoteOff 0.500000 1 70 64.500000 NoteOn 0.000000 1 74 74.000000 NoteOff 0.500000 1 74 64.500000 NoteOn 0.000000 1 77 84.000000 NoteOff 0.500000 1 77 64.500000 NoteOn 0.000000 1 82 94.000000 NoteOff 0.500000 1 82 64.500000 ControlChange 0.000000 1 4 96.000000 NoteOn 0.000000 1 81 84.000000 NoteOff 0.500000 1 81 64.500000 NoteOn 0.000000 1 77 74.000000 NoteOff 0.500000 1 77 64.500000 NoteOn 0.000000 1 75 64.000000 NoteOff 0.500000 1 75 64.500000 NoteOn 0.000000 1 72 54.000000 NoteOff 0.500000 1 72 64.500000 ControlChange 0.000000 1 4 116.000000 NoteOn 0.000000 1 70 64.000000 NoteOff 0.500000 1 70 64.500000 NoteOn 0.000000 1 74 74.000000 NoteOff 0.500000 1 74 64.500000 NoteOn 0.000000 1 77 84.000000 NoteOff 0.500000 1 77 64.500000 NoteOn 0.000000 1 82 94.000000 NoteOff 0.500000 1 82 64.500000 ControlChange 0.000000 1 4 108.000000 NoteOn 0.000000 1 81 84.000000 NoteOff 0.500000 1 81 64.500000 NoteOn 0.000000 1 77 74.000000 NoteOff 0.500000 1 77 64.500000 NoteOn 0.000000 1 75 64.000000 NoteOff 0.500000 1 75 64.500000 NoteOn 0.000000 1 72 54.000000 NoteOff 0.500000 1 72 64.500000 NoteOn 0.000000 1 70 64.000000 NoteOff 1.000000 1 70 64.500000 stk-4.5.0/projects/demo/Shakers0000755000076600007660000000005712327014024014240 0ustar garywish < tcl/Shakers.tcl | ./demo Shakers -or -ipstk-4.5.0/projects/demo/Shakers.bat0000755000076600007660000000005512327014024015003 0ustar garywish < tcl/Shakers.tcl | demo Shakers -or -ipstk-4.5.0/projects/demo/StkDemo0000755000076600007660000000005612327014024014205 0ustar garywish < tcl/Demo.tcl | ./demo Clarinet -or -ip stk-4.5.0/projects/demo/StkDemo.bat0000755000076600007660000000005412327014024014750 0ustar garywish < tcl/Demo.tcl | demo Clarinet -or -ip stk-4.5.0/projects/demo/tcl/0000755000076600007660000000000012327014024013472 5ustar garystk-4.5.0/projects/demo/tcl/Banded.tcl0000644000076600007660000001275612327014024015366 0ustar gary# Tcl/Tk Bowed Bar Model GUI for the Synthesis Toolkit (STK) set press 64.0 set pitch 64.0 set cont1 127.0 set cont2 0.0 set cont4 0.0 set cont11 0.0 set struckbow 0 set preset 0 # Configure main window wm title . "STK Bowed Bar Controller" wm iconname . "bowedbar" . config -bg black # Configure preset radio buttons frame .radio1 -bg black radiobutton .radio1.0 -text Bar -bg grey66 \ -command {printWhatz "ControlChange 0.0 1 " 16 0} \ -variable preset -value 0 radiobutton .radio1.1 -text Marimba -bg grey66 \ -command {printWhatz "ControlChange 0.0 1 " 16 1} \ -variable preset -value 1 radiobutton .radio1.2 -text GlassHarmonica -bg grey66 \ -command {printWhatz "ControlChange 0.0 1 " 16 2} \ -variable preset -value 2 radiobutton .radio1.3 -text PrayerBowl -bg grey66 \ -command {printWhatz "ControlChange 0.0 1 " 16 3} \ -variable preset -value 3 pack .radio1.0 -side left -padx 5 pack .radio1.1 -side left -padx 5 -pady 10 pack .radio1.2 -side left -padx 5 -pady 10 pack .radio1.3 -side left -padx 5 -pady 10 pack .radio1 # Configure message box label .note -font {Times 10 normal} -background white \ -foreground darkred -relief raised -height 4 \ -wraplength 300 -width 60 \ -text "To strike, set the Bow Pressure to zero and hit NoteOn or the spacebar. To bow, use the 'Bow Velocity' slider to set a fixed velocity or move the 'Bow Motion' slider as if it were the bow (with a non-zero Bow Pressure)." pack .note -padx 5 -pady 10 # Configure "note-on" buttons frame .noteOn -bg black button .noteOn.on -text NoteOn -bg grey66 -command { noteOn $pitch $press } button .noteOn.off -text NoteOff -bg grey66 -command { noteOff $pitch 127.0 } button .noteOn.exit -text "Exit Program" -bg grey66 -command myExit pack .noteOn.on -side left -padx 5 pack .noteOn.off -side left -padx 5 -pady 10 pack .noteOn.exit -side left -padx 5 -pady 10 pack .noteOn -pady 10 # Configure sliders frame .left -bg black frame .right -bg black scale .left.bPressure -from 0 -to 128 -length 200 \ -command {changePress } -variable press\ -orient horizontal -label "Strike/Bow Velocity" \ -tickinterval 32 -showvalue true -bg grey66 scale .left.pitch -from 0 -to 128 -length 200 \ -command {changePitch } -variable pitch \ -orient horizontal -label "MIDI Note Number" \ -tickinterval 32 -showvalue true -bg grey66 scale .left.cont2 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 2} \ -orient horizontal -label "Bowing Pressure (0 = Strike)" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont2 scale .right.cont4 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 4} \ -orient horizontal -label "Bowing Motion" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont4 scale .right.cont11 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 11} \ -orient horizontal -label "Integration" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont11 scale .right.reson -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 1} \ -orient horizontal -label "Mode Resonance" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont1 . config -bg grey20 pack .left.bPressure -padx 10 -pady 10 pack .left.pitch -padx 10 -pady 10 pack .left.cont2 -padx 10 -pady 10 pack .right.cont4 -padx 10 -pady 10 pack .right.cont11 -padx 10 -pady 10 pack .right.reson -padx 10 -pady 10 pack .left -side left pack .right -side right bind all { noteOn $pitch $press } # Bind an X windows "close" event with the Exit routine bind . +myExit proc myExit {} { global pitch puts [format "NoteOff 0.0 1 %f 127" $pitch ] flush stdout puts [format "ExitProgram"] flush stdout close stdout exit } proc noteOn {pitchVal pressVal} { puts [format "NoteOn 0.0 1 %f %f" $pitchVal $pressVal] flush stdout } proc noteOff {pitchVal pressVal} { puts [format "NoteOff 0.0 1 %f %f" $pitchVal $pressVal] flush stdout } proc patchChange {value} { global patch set patch $value puts [format "ProgramChange 0.0 1 %i" $value] flush stdout } proc printWhatz {tag value1 value2 } { puts [format "%s %i %f" $tag $value1 $value2] flush stdout } proc changePress {value} { puts [format "AfterTouch 0.0 1 %f" $value] flush stdout } proc changePitch {value} { puts [format "PitchChange 0.0 1 %.3f" $value] flush stdout } proc activateVel {} { global pitch noteOn $pitch 127 printWhatz "ControlChange 0.0 1 " 65 0 } bind . { center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return } stk-4.5.0/projects/demo/tcl/bitmaps/0000755000076600007660000000000012327014024015131 5ustar garystk-4.5.0/projects/demo/tcl/bitmaps/bamboo.xbm0000644000076600007660000002451212327014024017104 0ustar gary#define bamboo_width 125 #define bamboo_height 126 static char bamboo_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x24,0x00,0x04,0xe0,0x00,0x00,0x00,0x00,0x22,0x40,0x04,0x88, 0x00,0x19,0x20,0x03,0x24,0x80,0x04,0xe0,0x00,0x00,0x88,0x01,0x22,0x40,0x04, 0x88,0x00,0x11,0x20,0x02,0x64,0x80,0x04,0xe0,0x00,0x00,0x88,0x00,0x22,0x40, 0x04,0x98,0x00,0x11,0x20,0x02,0x24,0x80,0x04,0xe0,0x00,0x00,0x08,0x01,0x22, 0x40,0x04,0x88,0x00,0x11,0x60,0x02,0x24,0x80,0x04,0xe0,0x00,0x00,0x88,0x00, 0x22,0x40,0x02,0x88,0x00,0x09,0x00,0x01,0x44,0x80,0x04,0xe0,0x00,0x00,0x08, 0x01,0x22,0x40,0x04,0x88,0x00,0x11,0x20,0x02,0x24,0x80,0x04,0xe0,0x00,0x00, 0x08,0x01,0x22,0x40,0x04,0x88,0x00,0x11,0x20,0x02,0x64,0x80,0x04,0xe0,0x00, 0x00,0x88,0x00,0x22,0x40,0x04,0x88,0x00,0x11,0x60,0x02,0x24,0x80,0x04,0xe0, 0x00,0x00,0x08,0x01,0x22,0x40,0x04,0x88,0x00,0x11,0x20,0x02,0x24,0x80,0x04, 0xe0,0x00,0x00,0x08,0x01,0x22,0x40,0x04,0x88,0x00,0x11,0x20,0x02,0x44,0x80, 0x04,0xe0,0x00,0x00,0x88,0x00,0x22,0x40,0x04,0x88,0x00,0x11,0x20,0x02,0x24, 0x80,0x04,0xe0,0x00,0x00,0x08,0x01,0x22,0x40,0x04,0x98,0x00,0x13,0x40,0x02, 0x64,0x80,0x04,0xe0,0x00,0x00,0x08,0x01,0x22,0x40,0x04,0x88,0x00,0x11,0x20, 0x02,0x24,0x80,0x04,0xe0,0x00,0x00,0x08,0x01,0x22,0x40,0x04,0x88,0x00,0x11, 0x40,0x00,0x24,0x80,0x04,0xe0,0x00,0x00,0x88,0x00,0x22,0x40,0x04,0x88,0x00, 0x12,0x60,0x03,0x68,0x80,0x04,0xe0,0x00,0x00,0xf8,0x01,0x76,0xc0,0x07,0xf8, 0x01,0x3f,0xe0,0x0f,0xfe,0xc0,0x1f,0xe0,0x00,0x00,0xf8,0x03,0xfe,0xe0,0x1f, 0xfc,0xc7,0xff,0xf0,0x1e,0xef,0xf3,0x3f,0xe0,0x00,0x00,0x5e,0x87,0xab,0xf1, 0x3a,0x9e,0xc6,0xd3,0xf8,0x9a,0x5f,0xf3,0x75,0xe0,0x00,0x00,0xbe,0x8e,0xb7, 0xf3,0x77,0x7a,0x4d,0xaf,0xe9,0xb6,0x7d,0xd3,0x6a,0xe0,0x00,0x00,0x5a,0x8d, 0xaf,0xf3,0x74,0xbf,0xe7,0xf5,0x78,0x3d,0xaf,0xf3,0x7f,0xe0,0x00,0x00,0xfe, 0x8f,0xff,0xf3,0x3f,0xfe,0xcf,0xff,0xf9,0xaf,0xff,0xd2,0x5f,0xe0,0x00,0x00, 0xfa,0x8b,0x7e,0xc2,0x4f,0xda,0x44,0x97,0x68,0x23,0x2c,0x92,0x40,0xe0,0x00, 0x00,0x0a,0x88,0x00,0x52,0x40,0x09,0x28,0x01,0x21,0xa0,0x04,0x92,0x40,0xe0, 0x00,0x00,0x0a,0x88,0x02,0x52,0x20,0x0a,0x44,0x01,0x49,0xa0,0x04,0x92,0x40, 0xe0,0x00,0x00,0x0a,0x88,0x02,0x52,0x40,0x12,0x48,0x02,0x29,0xa0,0x04,0x92, 0x40,0xe0,0x00,0x00,0x0a,0x88,0x02,0x42,0x40,0x0a,0x48,0x01,0x49,0xa0,0x2c, 0x92,0x47,0xe0,0x00,0x00,0x08,0x80,0x02,0x52,0x40,0x12,0x48,0x02,0x49,0x91, 0x78,0x12,0x4d,0xe0,0x00,0x00,0x12,0x88,0x02,0x52,0x40,0x0a,0x4c,0x01,0xc9, 0xa3,0xd8,0x12,0x49,0xe0,0x00,0x00,0x0a,0x08,0x02,0x92,0x40,0xd2,0x44,0x1e, 0xc9,0xa6,0x50,0x12,0x4f,0xe0,0x00,0x00,0x0a,0x88,0x14,0x92,0x47,0xf2,0x48, 0x36,0x89,0x22,0x21,0x12,0x40,0xe0,0x00,0x00,0x52,0x88,0x3c,0x92,0x4d,0x22, 0x49,0xb4,0x08,0xa1,0x00,0x12,0x40,0xe0,0x00,0x00,0xf2,0x88,0x24,0x92,0x44, 0xe2,0x48,0x0c,0x09,0x20,0x01,0x12,0x40,0xe0,0x00,0x00,0xb2,0x89,0x38,0x12, 0x43,0x42,0x48,0x00,0x09,0xa0,0x00,0x12,0x40,0xe0,0x00,0x00,0xa2,0x88,0x11, 0x12,0x40,0x02,0x4c,0x80,0x08,0x20,0x01,0x12,0x40,0xe0,0x00,0x00,0xc2,0x88, 0x00,0x12,0x40,0x02,0x40,0x00,0x09,0xa0,0x00,0x12,0x40,0xe0,0x00,0x00,0x02, 0x88,0x00,0x12,0x40,0x02,0x4c,0x00,0x09,0x20,0x01,0x12,0x40,0xe0,0x00,0x00, 0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00,0x09,0xa0,0x00,0x12,0x40,0xe0,0x00, 0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x80,0x08,0x20,0x01,0x12,0x40,0xe0, 0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00,0x09,0xa0,0x00,0x12,0x40, 0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00,0x09,0x20,0x01,0x12, 0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00,0x09,0xa0,0x00, 0x12,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x00,0x02,0x48,0x80,0x08,0x20, 0x01,0x12,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00,0x09, 0x20,0x01,0x12,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00, 0x09,0xa0,0x00,0x12,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48, 0x00,0x09,0x20,0x01,0x12,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02, 0x48,0x00,0x09,0x20,0x01,0x12,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40, 0x02,0x48,0x00,0x09,0xa0,0x00,0x12,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12, 0x40,0x02,0x44,0x00,0x09,0x20,0x01,0x12,0x40,0xe0,0x00,0x00,0x02,0x88,0x00, 0x12,0x40,0x02,0x48,0x00,0x09,0x20,0x01,0x32,0x40,0xe0,0x00,0x00,0x02,0x88, 0x00,0x12,0x40,0x02,0x48,0x80,0x08,0x20,0x01,0x12,0x40,0xe0,0x00,0x00,0x02, 0x88,0x00,0x12,0x40,0x02,0x48,0x00,0x09,0xa0,0x00,0x12,0x40,0xe0,0x00,0x00, 0x02,0x88,0x00,0x12,0x40,0x02,0x40,0x00,0x09,0x20,0x01,0x12,0x40,0xe0,0x00, 0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00,0x09,0x20,0x01,0x12,0x40,0xe0, 0x00,0x00,0x02,0x88,0x00,0x12,0x00,0x02,0x48,0x00,0x09,0x20,0x01,0x12,0x40, 0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00,0x09,0x20,0x01,0x12, 0x40,0xe0,0x00,0x00,0x02,0x08,0x01,0x12,0x40,0x02,0x48,0x00,0x09,0x20,0x01, 0x22,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00,0x09,0x20, 0x01,0x12,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x40,0x00,0x09, 0x20,0x01,0x12,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00, 0x09,0x20,0x01,0x24,0x40,0xe0,0x00,0x00,0x02,0x08,0x01,0x12,0x40,0x02,0x48, 0x00,0x09,0x20,0x01,0x32,0x40,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02, 0x48,0x00,0x09,0x20,0x01,0xc2,0x72,0xe0,0x00,0x00,0x04,0x88,0x00,0x12,0x40, 0x02,0x48,0x00,0x11,0x20,0x03,0x83,0x0e,0xe0,0x00,0x00,0x02,0x08,0x01,0x12, 0x40,0x02,0x48,0x00,0x09,0x20,0xfc,0x01,0x00,0xe0,0x00,0x00,0x02,0x88,0x00, 0x12,0x40,0x02,0x48,0x00,0x19,0x20,0x00,0x00,0x00,0xe0,0x00,0x00,0x04,0x08, 0x01,0x12,0x40,0x02,0x40,0x00,0xe1,0x1c,0x00,0x00,0x00,0xe0,0x00,0x00,0x02, 0x88,0x00,0x12,0x40,0x06,0x48,0x00,0x01,0x07,0x00,0x00,0x00,0xe0,0x00,0x00, 0x02,0x88,0x00,0x12,0x40,0x02,0x48,0x00,0x01,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x04,0x08,0x01,0x32,0x40,0x02,0x88,0x81,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x02,0x08,0x7e,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x04,0x18,0x01,0x12,0x40,0x06,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x02,0x88,0x00,0x12,0x40,0x9c,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x04,0x08,0x01,0x62,0x60,0xf0,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x02,0x88,0x00,0x86,0x1f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x04,0x08,0x01,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x02,0x08,0x01,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x04,0x08,0xae,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x02,0x10,0x50,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x04,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x0c,0x0c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0xf0,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0}; stk-4.5.0/projects/demo/tcl/bitmaps/cabasa.xbm0000644000076600007660000002451212327014024017057 0ustar gary#define cabasa_width 125 #define cabasa_height 126 static char cabasa_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xbb,0xff,0x4a, 0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00,0x00, 0xa0,0x3f,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x00,0xc0,0x0f,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x80,0x03,0x00, 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xc0,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x80,0x01,0x00,0xe0,0x00, 0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xd8,0x01,0x00,0x00,0x00,0x03,0x00,0xe0, 0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0xe0,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06, 0x00,0xe0,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0xe0,0x00,0x00,0x00,0x00,0x60,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0xe0,0x00,0x00,0x00,0x00,0xa0,0x71,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x02,0x00,0xe0,0x00,0x00,0x00,0x00,0x30,0x04,0x07,0x00,0x00,0x00, 0x00,0x00,0x30,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0xd8,0x50,0x90,0x02,0x00, 0x00,0x00,0x00,0xc6,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x50,0xc1,0x04,0x0a, 0x05,0x00,0x00,0x95,0xd1,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x70,0x06,0x3c, 0x01,0xfd,0xaa,0xda,0x05,0xdc,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xe8,0x1d, 0x80,0x3e,0x00,0x00,0x00,0xe0,0xcf,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x80, 0x67,0x00,0x80,0xf4,0xb6,0xf6,0x13,0x7b,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0xb8,0x9c,0x01,0x00,0x00,0x49,0x02,0xd0,0xcc,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0xf0,0xf2,0x0b,0x00,0x00,0x00,0x80,0x98,0xeb,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0xa0,0xdb,0xdb,0x00,0x00,0x00,0x90,0x53,0x63,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0xb8,0x0d,0x47,0x97,0x00,0x00,0x6e,0x2f,0x7c,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0xe8,0x72,0x7c,0x6b,0xef,0xbf,0x09,0xa5,0xee,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0xa8,0xc7,0xa1,0x5b,0x2d,0xa9,0xee,0xa4,0x61,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0xb0,0x6e,0xab,0xd5,0xb5,0xcd,0x96,0x96,0x6c, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xf8,0x5c,0x99,0xd4,0x9a,0x5a,0x72,0xaf, 0x6f,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xa0,0x33,0xcf,0xaf,0x4a,0xf3,0xbe, 0x99,0x60,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xb8,0xdd,0x54,0x99,0xd3,0xae, 0x25,0x75,0x7e,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xe8,0xf4,0xf5,0x6b,0x3d, 0x6d,0xdd,0xc4,0x6b,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x94,0xe7,0xb5,0x69, 0xa5,0x51,0xb3,0xeb,0x63,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x18,0x3e,0xae, 0xf4,0x5b,0x96,0x26,0xb7,0x6c,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xf8,0xb4, 0xd2,0x17,0xb5,0xbd,0xed,0x2c,0x7f,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xcc, 0xc3,0x1b,0xbb,0xa6,0xed,0xbf,0xe9,0x71,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x58,0x0f,0x5d,0xe6,0xfb,0x3f,0x57,0xfa,0x7c,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x3c,0x74,0xf2,0x99,0x56,0xd0,0xfa,0x9f,0x56,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0xec,0xb5,0x4b,0xfe,0xf3,0xbf,0xfd,0xe5,0x6b,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0xa6,0x96,0x7c,0x91,0x6e,0x69,0x4b,0xfb,0x7c,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0xb6,0xfd,0xf4,0x9e,0xb6,0xd6,0xea,0x2f,0x7e,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0xca,0xe0,0x93,0x3f,0xf7,0xfa,0xef,0xeb,0x2f,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x36,0x87,0xef,0xd2,0xff,0xdb,0xb5,0xfa,0x79, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x84,0x51,0x74,0x9f,0x84,0x2d,0xe5,0x9f, 0x6e,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x18,0xa4,0x36,0xf9,0xbd,0xed,0x7e, 0xa5,0x68,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xf0,0x18,0xa9,0xd6,0xff,0xfe, 0xbf,0x6c,0x6d,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x80,0xc3,0x43,0xb7,0xa0, 0x2d,0x45,0x0b,0x33,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x0e,0x70,0x03, 0xbf,0xf6,0x3a,0x3a,0x18,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0xf0,0x01, 0xd0,0xff,0x96,0xde,0x80,0x07,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x80, 0xae,0x00,0x50,0xb5,0x02,0xda,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x5f,0x04,0x00,0x48,0x1f,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0xff,0xff,0x57,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x60,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x40,0x04,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x60,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x60,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20, 0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xc0,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xc0,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xc0,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x80,0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x04,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xc0,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x60, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x60,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0}; stk-4.5.0/projects/demo/tcl/bitmaps/cokecan.xbm0000644000076600007660000001221412327014024017244 0ustar gary#define cokecan_width 62 #define cokecan_height 126 static char cokecan_bits[] = { 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,0xe0,0xff,0xff,0xff,0xff,0xff,0xff, 0xc1,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,0xc0,0xff,0x02,0x00,0x00,0xea, 0xff,0xc1,0xc0,0x2b,0xa9,0x94,0x55,0xb5,0xfe,0xc0,0xc0,0xd5,0x02,0x00,0x80, 0x54,0xfb,0xc0,0x60,0x4b,0x09,0x21,0x5a,0xaf,0xfd,0xc1,0xe0,0x55,0x45,0x04, 0xa9,0xa4,0xee,0xc1,0xf0,0x96,0x90,0x4a,0xa4,0xda,0xfa,0xc3,0xb0,0x49,0x04, 0x11,0x4a,0x51,0xed,0xc3,0xf0,0x96,0x42,0x44,0xaa,0xac,0xfd,0xc3,0xb8,0x6b, 0x12,0x05,0x80,0xf2,0xee,0xc7,0xfc,0xbd,0x81,0x10,0xa5,0xa8,0xfb,0xc7,0xfc, 0xb7,0x24,0x42,0x00,0xf5,0xef,0xcf,0xfe,0xff,0x02,0x00,0x48,0xa0,0xff,0xdf, 0x7e,0x6f,0x01,0x00,0x00,0x55,0xff,0xdf,0xff,0xbd,0x02,0x02,0x22,0xc0,0xff, 0xff,0xff,0x77,0x00,0x00,0x00,0xaa,0xfe,0xff,0xdf,0x9f,0xfc,0xb7,0xdb,0xaf, 0xbd,0xff,0xff,0x36,0x14,0x88,0x94,0x8a,0xfe,0xfe,0xff,0x2f,0xf4,0xef,0xfa, 0x4f,0xfd,0xff,0xef,0x9d,0x04,0x00,0x02,0xa9,0xff,0xff,0xbf,0x2f,0x00,0x60, 0x08,0xa8,0xf6,0xff,0xff,0x56,0x40,0xdc,0x23,0x42,0xff,0xff,0xff,0xbb,0x04, 0x6c,0x83,0xa8,0xfa,0xff,0xff,0x4f,0x10,0xe8,0x23,0x44,0xdf,0xff,0xff,0x3f, 0x00,0x00,0x00,0xa1,0xff,0xff,0xbf,0x55,0xf6,0xb5,0xbd,0x57,0xfd,0xff,0xfb, 0x1f,0xda,0xbf,0xad,0xa7,0xff,0xff,0xff,0x2e,0x5a,0xf7,0xbf,0xcd,0xfe,0xfd, 0xff,0x27,0x10,0x09,0xa4,0x56,0xef,0xff,0xdf,0x55,0x00,0x00,0x00,0x40,0x7f, 0xff,0xff,0x0f,0x01,0x00,0x20,0xd5,0xfe,0xff,0xff,0x29,0x00,0xe8,0x07,0x50, 0xff,0xff,0x7f,0x57,0x08,0xbb,0x12,0xc5,0xfb,0xff,0xf7,0xaf,0xc0,0x80,0x48, 0x50,0xbf,0xff,0xff,0x9d,0x60,0xfc,0x63,0xd5,0xfe,0xff,0xff,0xbf,0x18,0xa3, 0x4e,0xa0,0xff,0xff,0xbf,0xab,0xd0,0xfc,0xbf,0x75,0xfb,0xff,0xff,0x5f,0x2c, 0xdf,0xb6,0xd2,0xef,0xff,0xfb,0xbf,0x94,0x6a,0xfb,0xb6,0xbf,0xff,0xdf,0x55, 0xb2,0xfb,0xde,0xd6,0xff,0xff,0xff,0x3f,0x6a,0xc9,0xf6,0xed,0xff,0xff,0xff, 0x6e,0xf3,0xff,0xb7,0xb5,0xfd,0xff,0xff,0xbb,0x1c,0xfd,0x71,0xd5,0xff,0xff, 0xdf,0x5f,0xdc,0x7f,0x1c,0xb3,0xff,0xff,0xff,0xad,0x64,0x40,0xdf,0xeb,0xdb, 0xff,0xff,0xbf,0x04,0xba,0x6b,0x67,0xff,0xff,0xef,0x57,0x54,0x9f,0xa2,0xa3, 0xff,0xff,0x7f,0xbd,0x94,0x93,0x91,0xcb,0xff,0xfd,0xff,0x5f,0x04,0x10,0x05, 0x52,0xfd,0xff,0xff,0xb7,0xec,0xff,0xff,0x8b,0xef,0xff,0xbb,0x5d,0xf1,0x98, 0xb1,0xd1,0xfe,0xff,0xff,0xf7,0xda,0xe2,0xf7,0x49,0xff,0xfd,0xff,0x3e,0x79, 0x6b,0xf4,0xd1,0xfd,0xff,0xff,0xb7,0xe1,0x99,0x71,0x44,0xff,0xfe,0xef,0xff, 0xa0,0x9a,0xdd,0x68,0xf7,0xff,0x7f,0xaf,0xc0,0xff,0x3f,0xc4,0xff,0xfe,0xff, 0xbb,0x80,0xfd,0x3b,0xa1,0xfe,0xff,0xff,0x7f,0x04,0xee,0x0f,0x54,0xdf,0xff, 0xff,0x17,0x80,0x12,0x48,0x80,0xfe,0xfe,0x6f,0x5f,0x00,0x06,0x0e,0x2a,0xfb, 0xff,0xff,0x5b,0x00,0x28,0x01,0x90,0xde,0xff,0xff,0x5f,0x02,0x00,0x90,0x44, 0xfb,0xff,0xff,0x57,0x08,0x00,0x00,0xa1,0xfe,0xff,0x7d,0x6f,0x40,0x82,0x20, 0x94,0xfb,0xff,0xef,0xb7,0xb8,0xff,0xfe,0xc1,0xfe,0xff,0xff,0xaf,0xf0,0x7f, 0xd2,0x69,0xdf,0xff,0xbf,0xbb,0xf8,0xaf,0xee,0xa4,0xfd,0xff,0xff,0x5f,0x01, 0x00,0x00,0xd8,0xff,0xff,0xff,0xb7,0x01,0x00,0x00,0xb6,0xfe,0xff,0xff,0xdd, 0x04,0x00,0x00,0xfa,0xf7,0xff,0x6f,0x7f,0x57,0x55,0xa1,0xd5,0xbf,0xfb,0xff, 0xab,0xa9,0xaa,0x8a,0xfe,0xfe,0xff,0xff,0xff,0x57,0xb5,0xf5,0xf6,0xff,0xff, 0xff,0xbd,0xde,0xd6,0x56,0xbf,0xff,0xfb,0xff,0xef,0xb7,0x7f,0xff,0xfb,0xfb, 0xff,0xf7,0x7f,0xe5,0xd5,0x05,0x4e,0xff,0xfb,0xbf,0xed,0x5b,0xff,0x57,0xb8, 0xff,0xff,0xff,0xff,0xf4,0x6d,0xf9,0xcd,0xef,0xff,0xff,0xb6,0xac,0x56,0xdd, 0xeb,0xfe,0xfb,0xff,0x7f,0x3a,0xab,0xa4,0xf3,0xff,0xff,0xef,0x57,0xb3,0x6b, 0xfe,0xfd,0xff,0xff,0xff,0x3d,0x8b,0x74,0xb3,0x4a,0xf7,0xfb,0xfd,0x3f,0x59, 0x20,0xdd,0xd6,0xff,0xff,0xf7,0x36,0x99,0x90,0x09,0x6e,0xff,0xff,0xdf,0x3f, 0x7f,0x3f,0x7f,0xf9,0xff,0xff,0xff,0x2e,0x0b,0x98,0x65,0xe9,0xfb,0xfb,0xff, 0xfb,0xfc,0x65,0x6e,0xf2,0xdf,0xff,0xff,0xbf,0xf7,0xde,0xfd,0x7f,0xff,0xff, 0xff,0xef,0xad,0x6a,0xa7,0xfe,0xff,0xfb,0xbf,0x7d,0x7f,0xaa,0xa8,0xdb,0xff, 0xff,0xff,0xef,0xad,0xb5,0xff,0xff,0xfd,0xff,0xff,0xbf,0xff,0xff,0x6a,0xff, 0xf7,0xfb,0x7f,0xfb,0xb5,0xad,0xff,0xdb,0xff,0xfe,0xef,0x6f,0x7f,0xff,0xdb, 0xfe,0xff,0xff,0xbf,0xff,0xeb,0x20,0xea,0x3b,0xfd,0xfb,0xff,0xfb,0xbd,0xdf, 0x57,0x4f,0xff,0xff,0x7f,0x0f,0xf6,0xd6,0xee,0xf5,0xf5,0xff,0xff,0xbf,0x5d, 0xfd,0xdd,0x9b,0x7a,0xf5,0xff,0x66,0xfd,0x73,0xdf,0x75,0xff,0xff,0xff,0xff, 0xdb,0xaa,0x60,0xaf,0xfa,0xff,0xef,0x5b,0x77,0x29,0xdc,0xcb,0xfe,0xfe,0x7f, 0xb7,0xdc,0x43,0xe9,0x2d,0xfe,0xff,0xff,0x8b,0x75,0xff,0xa7,0xc7,0xff,0xfb, 0xff,0xf3,0xf6,0xd8,0xfe,0x6b,0xf3,0xff,0x7f,0x5f,0xdb,0x22,0xc5,0xf6,0xff, 0xfe,0xfb,0x5f,0x7b,0xef,0xf7,0xeb,0xf9,0xff,0xff,0xf6,0xed,0xfe,0xdf,0x4f, 0xfd,0xfd,0xff,0xef,0xfe,0xa2,0x6a,0xaf,0xfe,0xff,0xdf,0xff,0xaf,0xff,0xfd, 0xff,0xff,0xff,0xff,0x7b,0xfb,0x5d,0x6f,0xfb,0xf7,0xfa,0x7f,0xef,0x6f,0xf7, 0xfd,0xdf,0xff,0xff,0xff,0xbf,0xdf,0xbd,0xf7,0x7f,0xff,0xff,0xfb,0xff,0xfa, 0xf7,0xde,0xfe,0xff,0xff,0xef,0xfb,0xdf,0xde,0xff,0xfb,0xff,0xff,0x7f,0x7f, 0xbb,0xfb,0xf6,0xef,0xfd,0xff,0x97,0x80,0x00,0x00,0x00,0x14,0x55,0xff,0x7e, 0x5b,0x6d,0x55,0xad,0xd5,0xf6,0xfd,0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xdf, 0xfe,0xef,0xbf,0xbf,0xf7,0xff,0xff,0xdf,0xfc,0xbf,0xed,0xf6,0xbd,0xfd,0xff, 0xc7,0xf0,0xff,0xff,0x7f,0xff,0xf7,0xff,0xc3,0xc0,0xff,0x7f,0xdb,0xff,0xff, 0xff,0xc1,0xc0,0xff,0xee,0xff,0x77,0xff,0xff,0xc0,0x80,0xaf,0xbb,0xaa,0xfa, 0xed,0x7f,0xc0}; stk-4.5.0/projects/demo/tcl/bitmaps/guiro.xbm0000644000076600007660000002450712327014024016776 0ustar gary#define guiro_width 125 #define guiro_height 126 static char guiro_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x0f,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x05,0x50,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1f,0x00,0x40,0x01,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x20,0x00,0x00,0x05, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0b,0x29,0x00,0x00, 0xf0,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x00,0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x40,0x02,0x40, 0x00,0x00,0x84,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x08, 0x40,0x00,0x00,0xe0,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x20,0x09, 0x00,0x00,0x00,0x00,0x30,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x80,0x00,0x00,0x10,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 0x09,0x02,0x00,0x08,0x04,0x21,0x1a,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x00,0x20,0x04,0x00,0x01,0x00,0x08,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x60,0x40,0x10,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x01,0x10,0x06,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x0a,0x04,0x00,0x01,0x00,0x00,0x40,0x00,0x02,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x89,0x01,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x00,0x12,0xc0,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x80,0x05,0x00,0x00,0x00,0x04,0x04,0x41,0x30,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x60,0x20,0x02,0x00,0x00,0x00,0x40,0x00,0x1c,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x20,0x00,0x00,0x02,0x07, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x0c,0x90,0x00,0x00,0x00,0x00,0x29,0xe1, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x01,0x11,0x80, 0x3c,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x60,0x00,0x04,0x00,0x00,0x00,0x80, 0x64,0x07,0x00,0x00,0x00,0xe0,0x00,0x00,0x80,0x0e,0x00,0x04,0x88,0x08,0x00, 0x10,0xf2,0x00,0x00,0x00,0x00,0xe0,0x00,0xaa,0x7a,0x00,0x00,0x08,0x00,0x00, 0x09,0x44,0x0d,0x00,0x00,0x00,0x00,0xe0,0x00,0x4d,0x05,0x00,0x00,0x48,0x02, 0x40,0x80,0xd0,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x22,0x05, 0x04,0x10,0x10,0x2c,0x00,0x00,0x00,0x00,0x00,0xe0,0x80,0x04,0x00,0xa0,0x04, 0x24,0x88,0x0a,0x42,0x07,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x80,0x0a, 0x90,0x4c,0x20,0x20,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x80,0x08,0x10, 0x40,0xfb,0x06,0x08,0xd5,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x81, 0x44,0xb4,0x02,0xb4,0xea,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x10,0x92,0x07,0x00,0x40,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x20,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0}; stk-4.5.0/projects/demo/tcl/bitmaps/kasm.xbm0000644000076600007660000002140012327014024016571 0ustar gary#define KASM_width 220 #define KASM_height 61 static char KASM_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, 0xbf,0x7f,0x55,0xab,0xea,0x6f,0xff,0xaa,0x7f,0x55,0x55,0x55,0x55,0xf5,0xca, 0xaa,0xaa,0xfa,0xea,0xbd,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0xbe, 0x00,0x03,0x70,0x3d,0x7c,0x80,0x1f,0x00,0x00,0x00,0x00,0xf5,0x5a,0x00,0x00, 0x06,0x10,0x36,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x0c,0xd4,0x53, 0xb5,0x30,0xf9,0xaa,0x4f,0x55,0x55,0x55,0x55,0xf5,0x4a,0x55,0xd5,0x91,0x84, 0x2c,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x42,0x81,0x07,0x38,0xba, 0xf8,0x40,0x0f,0x00,0x00,0x00,0x00,0xf5,0x6a,0x00,0x60,0x08,0x51,0x78,0x60, 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x13,0xa8,0x57,0xba,0x20,0xec,0xd5, 0xaf,0x52,0x4a,0x29,0x55,0xf5,0xca,0x52,0x3a,0x45,0x04,0xf2,0x29,0x42,0x08, 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x88,0xc2,0x0f,0xf9,0x54,0xf9,0x41,0x0f,0x84, 0x10,0x42,0x00,0xf5,0x4a,0x04,0x4c,0x10,0xa1,0xe0,0x63,0x08,0x21,0x14,0xfd, 0x50,0x79,0x84,0xff,0x42,0x50,0x4f,0xf4,0x03,0xca,0x35,0xaf,0x10,0x42,0x08, 0x55,0xf5,0x5a,0xa1,0x06,0xff,0x09,0x4a,0x2b,0x42,0x08,0x41,0xfc,0x07,0x7a, 0x21,0xff,0x10,0x65,0x1e,0xf1,0xaf,0xe8,0xa3,0x0f,0x84,0x10,0x42,0x00,0xf5, 0x4a,0x88,0xd3,0x01,0xff,0xc7,0xa6,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, 0x4b,0x20,0x5f,0xd4,0x1f,0x8c,0x37,0x5f,0x51,0x44,0x11,0xa9,0xf5,0x6a,0xc5, 0x38,0x24,0x00,0x9c,0x3c,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0x03,0x6a, 0x1c,0x41,0x7f,0xa9,0x17,0x0f,0x04,0x12,0x48,0x02,0xf5,0x4a,0x60,0x0e,0x01, 0x49,0x90,0xab,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xdf,0x57,0xf1,0x7f,0x18, 0x3d,0x98,0xb7,0x4f,0x51,0x41,0x05,0x50,0xf5,0x6a,0xb5,0xe1,0xff,0x10,0x35, 0x2a,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x41,0x8f,0x0f,0x14,0x3e,0x4a,0xb8,0x4a, 0x0f,0x2f,0x04,0x14,0x50,0x05,0xf5,0x4a,0xd0,0x38,0xc0,0x5f,0xe0,0xbe,0xa8, 0x40,0x55,0x26,0x9e,0xf8,0x14,0x5f,0x5f,0x59,0x79,0x19,0x3d,0x08,0x4f,0x0f, 0x51,0x41,0x05,0x50,0xf5,0xda,0x5a,0x8e,0x14,0xe0,0x75,0x26,0x02,0x2a,0x00, 0x8e,0x46,0x7c,0x40,0x8f,0x3e,0x08,0x7c,0x5c,0x58,0xad,0x2e,0x5f,0x04,0x14, 0x50,0x05,0xf5,0x4a,0xcc,0x23,0x00,0x89,0x12,0xb2,0x90,0x80,0xaa,0x2e,0x0b, 0x79,0x15,0x2f,0xbe,0x2e,0xf9,0x39,0x1d,0x18,0x86,0x0f,0x21,0x81,0x04,0x50, 0xf5,0x6a,0x66,0x88,0xaa,0x10,0xb4,0x60,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc1, 0xbf,0xff,0x7e,0xfe,0xd9,0x47,0x7f,0xd5,0x7f,0x88,0x28,0x51,0x05,0xf5,0xca, 0x36,0x22,0x00,0x5e,0x3d,0x2a,0x12,0x89,0x54,0x09,0x28,0x22,0x2a,0x01,0x12, 0x01,0x44,0x44,0x10,0x00,0x04,0x08,0x25,0x02,0x04,0x50,0xf5,0x5a,0x93,0x88, 0xfa,0xe3,0xe8,0x20,0x41,0x20,0x01,0xa2,0x82,0x88,0x40,0xa8,0x40,0x54,0x11, 0x11,0x85,0x2a,0xa1,0x42,0x80,0x50,0x91,0x04,0xf5,0xca,0x01,0x7f,0x0f,0x88, 0xca,0x6a,0x14,0x0a,0xa4,0x08,0x28,0x22,0x12,0x05,0x14,0x01,0x44,0x44,0x20, 0x40,0x14,0x28,0x2a,0x0a,0x04,0x51,0xf5,0xca,0xd4,0x01,0x40,0xe2,0xf8,0x20, 0x41,0x41,0x09,0x42,0x82,0x88,0x44,0xa0,0x42,0x54,0x11,0x11,0x15,0x09,0x81, 0x82,0x80,0x20,0x51,0x04,0xf5,0xda,0x60,0xa0,0x94,0x3c,0x24,0x35,0x12,0x14, 0x90,0x28,0x21,0x22,0x10,0x0a,0x10,0x01,0x44,0x44,0x40,0x44,0x28,0x24,0x2a, 0x44,0x04,0x51,0xf5,0x4a,0x34,0x0a,0x01,0x87,0x1e,0xa0,0x20,0x81,0x22,0x02, 0x88,0x08,0x45,0x41,0x45,0x28,0x11,0x11,0x15,0x21,0x82,0x88,0x00,0x11,0x51, 0x04,0xf5,0x6a,0x11,0x41,0x28,0xf1,0x7b,0x35,0x8a,0x28,0x88,0x50,0x25,0x42, 0x10,0x14,0x10,0x42,0x04,0x44,0x40,0x14,0x29,0x22,0xa9,0x44,0x04,0xa1,0xf5, 0x4a,0x5a,0x14,0xc5,0x3d,0x60,0xa0,0x20,0x84,0x03,0x0a,0xf0,0x28,0x22,0xf9, 0x45,0x11,0xa7,0x10,0x1d,0xe1,0x9f,0x08,0xf7,0x6e,0x48,0x14,0xf5,0xda,0x08, 0x41,0x60,0x04,0x69,0x29,0x0a,0xd1,0xa9,0xa0,0x66,0x82,0x44,0xcc,0x10,0xc4, 0x16,0x42,0x4c,0x28,0x33,0x90,0x66,0x6e,0x05,0x41,0xf5,0x4a,0x4c,0x14,0x35, 0x46,0x3c,0xa4,0x40,0xc4,0x03,0x08,0x6e,0x28,0x10,0xae,0x44,0x71,0x46,0x11, 0x0a,0x65,0x97,0x22,0xee,0x43,0x2e,0x12,0xf5,0x5a,0x15,0x41,0xf0,0x13,0x46, 0x31,0x2a,0x51,0xfb,0xf3,0xef,0xe3,0x9b,0x9c,0xf3,0xf7,0x1f,0xde,0xef,0x13, 0xc3,0xf3,0x66,0x79,0x8f,0x40,0xf5,0x4a,0x44,0x14,0x05,0x88,0x12,0xa4,0x00, 0x64,0x67,0xdb,0x67,0xf3,0x37,0x7a,0xd7,0x66,0xbe,0xf7,0x6e,0x42,0x73,0xdf, 0xef,0xe3,0x26,0x14,0xf5,0x6a,0x15,0x41,0x40,0x42,0x4a,0x31,0xa9,0xa8,0x76, 0xbf,0x77,0xfb,0x8f,0xe8,0xd3,0x6e,0x36,0xff,0xed,0x15,0xe7,0xbe,0x67,0x6b, 0x8e,0x42,0xf5,0x4a,0x44,0x10,0x95,0x28,0x03,0x24,0x02,0xf2,0xe7,0x9b,0xe7, 0x33,0x26,0xc4,0xde,0xe6,0x76,0xcb,0xdf,0x83,0x6b,0x9e,0x77,0xe7,0x26,0x10, 0xf5,0x6a,0x1d,0x45,0x00,0x02,0xaa,0xa8,0xa8,0x30,0x6e,0xfb,0x6f,0xf7,0x86, 0xee,0xee,0x76,0x36,0x27,0x6f,0x2b,0xe3,0xff,0xe7,0x6e,0x0e,0x45,0xf5,0x4a, 0x50,0x10,0xaa,0x50,0x05,0x22,0x02,0xbc,0x7f,0xf7,0x7c,0xe7,0x2f,0x7c,0xed, 0xcf,0x7f,0xff,0xff,0x83,0xd7,0xf3,0x7f,0xfe,0x4d,0x10,0xf5,0x6a,0x35,0x85, 0x00,0x0a,0xac,0xb0,0x50,0x01,0x24,0x09,0x82,0x10,0x89,0x12,0x14,0x20,0x41, 0x28,0x01,0xa8,0x04,0x08,0x11,0x12,0x20,0x45,0xf5,0xca,0x60,0x50,0xaa,0x40, 0x0d,0x2a,0x04,0x54,0x41,0xa0,0x28,0x44,0x22,0x80,0x87,0x4a,0x14,0x42,0xa8, 0x02,0x50,0x45,0x84,0x88,0x0a,0x10,0xf5,0xda,0x44,0x05,0x00,0x14,0x98,0x60, 0x51,0x01,0x14,0x0a,0x82,0x12,0x08,0x55,0x2b,0x00,0x41,0x11,0x05,0x50,0x05, 0x10,0x51,0x42,0x40,0x45,0xf5,0xca,0x00,0x00,0x4a,0x01,0x48,0x24,0x04,0x54, 0x41,0xa1,0x28,0x80,0xa2,0x00,0x02,0x55,0x14,0x44,0xa0,0x0a,0x50,0x45,0x04, 0x28,0x2a,0x20,0xf5,0xda,0x20,0x49,0x00,0x22,0x09,0x31,0x51,0x01,0x14,0x08, 0x82,0x2a,0x08,0xaa,0xa8,0x00,0x41,0x11,0x0a,0x40,0x05,0x10,0xa1,0x02,0x81, 0x8a,0xf5,0xca,0x34,0xc0,0x0d,0x40,0x02,0x60,0x04,0x28,0x81,0xa2,0x28,0x00, 0x91,0x00,0x02,0x2a,0x12,0x44,0x21,0x15,0xa0,0x44,0x14,0x50,0x28,0x20,0xf5, 0x5a,0x10,0x39,0xa4,0xf7,0x85,0x20,0xc9,0x47,0x54,0x08,0x02,0x55,0x24,0x94, 0xb8,0x80,0xf0,0x13,0xbc,0x80,0xea,0x11,0x71,0x8f,0x83,0x0b,0xf5,0x4a,0x54, 0xaa,0x20,0x02,0x01,0x60,0x20,0x0b,0x01,0x93,0xa8,0x00,0x01,0x41,0x3a,0x29, 0xea,0x86,0xdc,0x2a,0xc0,0x44,0x38,0xdf,0xf7,0x40,0xf5,0xda,0x00,0x03,0x00, 0x04,0x24,0x24,0x8a,0x43,0xa8,0x21,0x02,0x54,0xa8,0xf4,0x30,0x82,0x60,0x2e, 0xc6,0x80,0xd4,0x00,0x35,0xfb,0x66,0x2a,0xf5,0x4a,0x88,0x01,0x42,0x20,0x00, 0xb0,0x20,0xff,0xfa,0xef,0xfb,0x36,0xfd,0xf3,0xf4,0x98,0xeb,0x86,0x0e,0x7d, 0xde,0x5e,0x70,0xdb,0xbe,0x00,0xf5,0x6a,0x0d,0xa3,0x00,0x8a,0x20,0x22,0x09, 0xb3,0xcd,0x5b,0x9b,0x6d,0xee,0x66,0xf2,0xbd,0xe0,0x27,0x46,0xfc,0xfb,0x06, 0x35,0x9e,0xf7,0xaa,0xf5,0x4a,0x14,0x09,0x11,0x20,0x82,0x20,0xa2,0xbb,0xbd, 0x59,0xdf,0xef,0xfe,0xee,0xb8,0x99,0x69,0x90,0x16,0xcd,0xf7,0x53,0xb0,0xba, 0xb6,0x01,0xf5,0x6a,0x05,0x21,0x40,0x88,0x08,0xb2,0x08,0xf3,0xfb,0x1d,0x9b, 0x7d,0xc6,0x67,0xb2,0xb5,0xe4,0x42,0x46,0xec,0xf3,0x07,0x3a,0x0c,0xbb,0x53, 0xf5,0x4a,0x24,0x89,0x14,0x21,0xa0,0x20,0x42,0xb7,0xed,0x59,0xbf,0x6d,0xdf, 0x6e,0xf0,0x71,0x61,0x18,0x9d,0xdd,0xf7,0xbc,0xb0,0xce,0xb3,0x05,0xf5,0x6a, 0x00,0x21,0x40,0x00,0x00,0xa4,0x90,0xbf,0x7f,0xbf,0xf6,0xed,0xfc,0xde,0xd5, 0x75,0xf8,0x5d,0x78,0x78,0xfe,0x3e,0x7a,0xd3,0xe9,0x50,0xf5,0xca,0xff,0xff, 0xff,0xff,0xff,0x3f,0x44,0x40,0x00,0x12,0x08,0x92,0x84,0x40,0x10,0x60,0x05, 0x10,0x85,0x8a,0x92,0xb0,0x48,0x0a,0xa2,0x04,0xf5,0x2a,0x41,0x42,0x12,0x09, 0x49,0xa2,0x12,0x15,0xaa,0x88,0xa2,0x04,0x21,0x0a,0x45,0x3a,0xa0,0x44,0x20, 0x20,0x08,0x54,0x82,0x40,0x08,0x51,0xf5,0x0a,0x14,0x11,0x41,0x44,0x84,0x08, 0x40,0x40,0x01,0x42,0x08,0x50,0x88,0x40,0x10,0x19,0x15,0x11,0x95,0x8a,0xa2, 0x02,0x28,0x2a,0x22,0x04,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/KFiddl.xbm0000644000076600007660000002140612327014024017001 0ustar gary#define KFiddl_width 220 #define KFiddl_height 61 static char KFiddl_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, 0xbf,0xff,0xff,0x7f,0x57,0xfd,0x55,0x7f,0x5f,0x55,0x55,0x55,0x55,0xf5,0x4a, 0x53,0xbd,0xaa,0xaa,0xaa,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0x3e, 0x7e,0x3d,0x0f,0xf0,0x00,0x3c,0x3c,0x00,0x00,0x00,0x00,0xf5,0x6a,0x02,0x66, 0x00,0x00,0x00,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x84,0x3c,0x70, 0x5f,0xe5,0x54,0xb9,0x1e,0x55,0x55,0x55,0x55,0xf5,0xca,0x81,0x44,0x55,0x55, 0x55,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x2a,0x3c,0x29,0x06,0xe0, 0x01,0x38,0x5c,0x00,0x00,0x00,0x00,0xf5,0x5a,0x40,0x69,0x00,0x00,0x00,0x60, 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x83,0xbe,0x24,0x25,0xf5,0x48,0x7d, 0x1d,0x52,0x4a,0x29,0x55,0xf5,0x4a,0xc0,0x42,0xa5,0x94,0x72,0x29,0x42,0x08, 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x28,0x7c,0x56,0x1f,0xef,0xc5,0x3b,0x5c,0xf9, 0x10,0x42,0x00,0xf5,0x6a,0x40,0x10,0x08,0x21,0xe4,0x63,0x08,0x21,0x14,0xfd, 0x50,0x79,0x84,0xff,0x02,0x3d,0x07,0xce,0xf3,0xf0,0xbc,0x1e,0xc6,0x42,0x08, 0x55,0xf5,0xca,0x80,0x4a,0x21,0x84,0xe8,0x2e,0x42,0x08,0x41,0xfc,0x07,0x7a, 0x21,0xff,0xa8,0xfc,0xaf,0x8e,0xe9,0x64,0x3a,0x5c,0xd7,0x10,0x42,0x00,0xf5, 0x5a,0x01,0x80,0x08,0x21,0xbe,0xad,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, 0x03,0xbc,0x07,0xde,0xe3,0xf1,0x78,0x1d,0xc7,0x45,0x11,0xa9,0xf5,0x4a,0xaa, 0x54,0xa7,0x88,0xde,0x3a,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0xa7,0x3e, 0xa6,0xce,0xe9,0x74,0x3a,0x5c,0xff,0x13,0x48,0x02,0xf5,0x6a,0x15,0x01,0x0d, 0x24,0x1d,0xbb,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xdf,0x0f,0xbc,0x16,0xde, 0xe3,0xf1,0xb8,0x3e,0x4f,0x40,0x05,0x50,0xf5,0x4a,0x58,0x54,0xa9,0x02,0x74, 0x3d,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x41,0x8f,0x4f,0x3d,0x84,0xce,0xe9,0x74, 0x3c,0x1c,0x17,0x15,0x50,0x05,0xf5,0xda,0x62,0x01,0x08,0xa8,0x4e,0xbf,0xa8, 0x40,0x55,0x26,0x9e,0xf8,0x14,0x2f,0x3f,0xbc,0x52,0xde,0xe1,0x71,0x79,0xbd, 0x4f,0x40,0x05,0x50,0xf5,0x4a,0x90,0xa9,0xae,0x02,0xae,0x3d,0x02,0x2a,0x00, 0x8e,0x46,0x7c,0x40,0x4f,0xbe,0x3e,0x08,0x8e,0xeb,0x68,0x38,0x1c,0x0e,0x15, 0x50,0x05,0xf5,0x6a,0x25,0x03,0x0a,0x50,0xff,0xa3,0x90,0x80,0xaa,0x2e,0x0b, 0x79,0x15,0x1f,0x3e,0xbc,0x42,0xaf,0xf3,0xe4,0x3e,0x9d,0xfe,0x81,0x04,0x50, 0xf5,0x4a,0x40,0xaa,0x20,0x85,0xde,0x69,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc1, 0xbf,0xff,0xff,0x11,0x5f,0xef,0xe3,0x7b,0x3e,0x7a,0x28,0x51,0x05,0xf5,0x5a, 0x15,0x1a,0x4a,0x70,0x8f,0x23,0x12,0x89,0x54,0x09,0x28,0x44,0x54,0x01,0x80, 0x24,0x8a,0x00,0x29,0x88,0xa4,0xa4,0x08,0x05,0x04,0x50,0xf5,0x4a,0xf0,0xb3, 0xf8,0xf5,0x57,0x30,0x41,0x20,0x01,0xa2,0x02,0x11,0x01,0xa8,0x2a,0x81,0x40, 0x54,0x80,0x22,0x08,0x08,0x42,0x50,0x91,0x04,0xf5,0xea,0x8e,0x78,0x86,0x6f, 0x03,0x65,0x14,0x0a,0xa4,0x08,0xa8,0x44,0x54,0x05,0x00,0x28,0x2a,0x02,0x2a, 0x88,0xa2,0xa2,0x90,0x04,0x04,0x51,0xf5,0x4a,0x2c,0xa4,0xa9,0xf2,0x55,0x20, 0x41,0x41,0x09,0x42,0x02,0x10,0x01,0x50,0x55,0x85,0x00,0x51,0x81,0x22,0x08, 0x08,0x0a,0x21,0x51,0x04,0xf5,0xda,0x02,0xe1,0x05,0xef,0x01,0x35,0x12,0x14, 0x90,0x28,0x51,0x45,0x28,0x05,0x00,0x20,0x54,0x04,0x24,0x40,0x42,0x91,0x40, 0x48,0x04,0x51,0xf5,0x4a,0xa9,0x94,0xa1,0x7d,0x48,0xa0,0x20,0x81,0x22,0x02, 0x04,0x10,0x42,0x50,0x55,0x15,0x01,0x21,0x11,0x95,0x28,0x44,0x14,0x05,0x51, 0x04,0xf5,0x5a,0x03,0x80,0xcb,0x3e,0x12,0x35,0x8a,0x28,0x88,0x50,0x51,0x45, 0x09,0x05,0x00,0x80,0x54,0x48,0x44,0x00,0x02,0x01,0x41,0x50,0x04,0xa1,0xf5, 0x4a,0x51,0xd5,0xf7,0x77,0x41,0xa0,0x20,0x84,0x23,0x04,0x74,0x10,0x40,0xf8, 0x4a,0x29,0x07,0x85,0x1c,0xf5,0x5f,0x54,0xf7,0x6f,0x48,0x14,0xf5,0xda,0xc5, 0x7f,0xdc,0x3b,0x14,0x29,0x0a,0xd1,0x81,0xa2,0xe4,0x44,0x15,0xed,0x10,0xc2, 0x56,0x20,0x4c,0x60,0x1b,0x01,0x6e,0x66,0x05,0x41,0xf5,0x4a,0x37,0x80,0x3c, 0x6f,0x41,0xa4,0x40,0xc4,0x2b,0x10,0x66,0x11,0x40,0x8c,0x42,0x68,0x06,0x8a, 0x02,0x25,0x53,0x54,0x67,0x53,0x2e,0x12,0xf5,0x6a,0xbe,0x7a,0xb5,0x73,0x12, 0x31,0x2a,0x51,0xf3,0xf5,0xef,0xe5,0x1f,0x5e,0xfb,0xf3,0xbe,0xde,0xef,0x4b, 0xd3,0xf3,0xee,0x75,0x8f,0x40,0xf5,0x4a,0x09,0x3e,0xfe,0x45,0x44,0xa4,0x00, 0x64,0xe7,0xdb,0x6f,0x73,0x57,0x79,0xd3,0x6e,0x37,0x77,0x6e,0x12,0x67,0xdf, 0xe7,0xe1,0x26,0x14,0xf5,0xda,0x5c,0x8f,0xd7,0x70,0x11,0x31,0x52,0xb1,0x6e, 0xdb,0x67,0xfb,0x2f,0xe8,0xd7,0x67,0x76,0xff,0xed,0x81,0xe3,0x9e,0x6f,0x6b, 0x8e,0x42,0xf5,0xca,0x1f,0xe3,0xf3,0x75,0x04,0xa4,0x04,0xf0,0x67,0x9f,0x77, 0xb3,0x86,0xd6,0xde,0x76,0x37,0xe7,0xdf,0x2b,0x77,0xbe,0x67,0xe7,0x26,0x10, 0xf5,0xca,0xd7,0xe9,0x78,0x5f,0x51,0x21,0x50,0x15,0x6e,0xbb,0xe7,0x77,0x26, 0xcc,0xee,0x66,0x76,0xa7,0x6f,0x07,0xe3,0xbe,0x77,0x6f,0x0e,0x45,0xf5,0xda, 0xe3,0x63,0xdf,0x73,0x04,0x74,0x05,0xb8,0xff,0xf7,0x7d,0xef,0x0f,0xfd,0xec, 0xde,0x77,0xfe,0xff,0xd1,0xd7,0xf3,0x7f,0xfe,0x4d,0x10,0xf5,0x4a,0x17,0x78, 0x37,0x7e,0x51,0x21,0x50,0x25,0x12,0x28,0x12,0x20,0xa9,0x10,0x85,0x42,0x8a, 0x12,0x84,0x04,0x82,0x8a,0x80,0x12,0x20,0x45,0xf5,0xda,0x8c,0xde,0xda,0x0d, 0x04,0xa8,0x04,0x88,0x88,0x42,0x44,0x09,0x02,0x24,0x2f,0x90,0x20,0x40,0x11, 0xa1,0x28,0x20,0x2a,0x88,0x0a,0x10,0xf5,0x4a,0x5e,0x74,0x6d,0x35,0xa1,0x22, 0x51,0x22,0x42,0x08,0x11,0xa0,0xa8,0x02,0x83,0x0a,0x0a,0x15,0x44,0x08,0x82, 0x8a,0x80,0x22,0x40,0x45,0xf5,0x6a,0x13,0xbd,0x76,0x58,0x08,0x68,0x84,0x08, 0x28,0x22,0x84,0x0a,0x02,0x50,0x29,0xa0,0x40,0x40,0x11,0xa5,0x28,0x20,0x2a, 0x88,0x2a,0x20,0xf5,0xca,0x45,0xf4,0x1a,0x72,0xa2,0x2f,0x11,0xa2,0x82,0x88, 0x50,0xa0,0xa8,0x0a,0x00,0x09,0x2a,0x15,0x44,0x00,0x02,0x89,0x40,0x22,0x80, 0x8a,0xf5,0xda,0x14,0x32,0x5a,0xc1,0x49,0x2c,0x84,0x08,0x20,0x42,0x04,0x0a, 0x02,0xa0,0xaa,0x90,0x00,0x20,0x11,0x95,0x50,0x22,0x14,0x88,0x2a,0x20,0xf5, 0xca,0x4c,0x79,0x0b,0x54,0x7f,0x64,0xa1,0xa7,0x8a,0x28,0xa2,0x40,0x48,0x09, 0x38,0x24,0xfa,0x87,0xb8,0x40,0xe4,0x08,0x71,0x9f,0x83,0x0b,0xf5,0x6a,0x19, 0x4c,0x4d,0xe1,0x61,0x2b,0x14,0x0b,0x20,0x03,0x11,0x14,0x11,0xc4,0xb2,0x82, 0xe0,0x16,0xce,0x14,0xc9,0x42,0x3a,0xdb,0xf6,0x40,0xf5,0x4a,0xd8,0x2f,0x15, 0x3c,0x2f,0x20,0x41,0xa3,0x8a,0x51,0x88,0x42,0x44,0x71,0x34,0x28,0x74,0x46, 0xae,0x41,0xe0,0x28,0x30,0xdb,0x66,0x2a,0xf5,0x6a,0x35,0xc2,0x8b,0x86,0xbf, 0x6a,0x14,0xfb,0xf8,0xef,0xdb,0x3e,0xfd,0xf3,0xf1,0x99,0xe1,0x26,0x46,0x7c, 0xdf,0x8d,0xba,0xfb,0xbe,0x00,0xf5,0x4a,0xe0,0xe8,0x41,0xc2,0xdc,0x21,0x81, 0xb7,0xdd,0xdb,0xbb,0x6d,0xee,0x6e,0xb8,0xb9,0xe5,0x8b,0x16,0xed,0xfb,0x26, 0x30,0x9e,0xf7,0xaa,0xf5,0x6a,0x95,0xdf,0x14,0x7d,0xfe,0x68,0x28,0xb3,0xbd, 0x19,0x9f,0xed,0xfe,0x66,0xb2,0x9b,0x68,0x22,0x46,0xdc,0xf7,0x13,0xb5,0xba, 0xb6,0x01,0xf5,0x4a,0x40,0x7c,0x42,0x24,0xbf,0x24,0x42,0xf7,0xfb,0x5d,0xdb, 0x6d,0xce,0xee,0xb8,0xf1,0xe2,0x08,0x0f,0xcd,0xf3,0x46,0x30,0x0c,0xbb,0x53, 0xf5,0xda,0x12,0x05,0x11,0xe1,0x82,0x62,0x11,0xb3,0xe5,0x19,0x9f,0xef,0xee, 0x66,0xf2,0x75,0x68,0x5a,0xac,0xdc,0xf7,0x3e,0xba,0xce,0xb3,0x05,0xf5,0x4a, 0x44,0x50,0x44,0x28,0x83,0x30,0x88,0xbf,0x7f,0xbf,0xf6,0xed,0xfc,0xdf,0xd0, 0xe2,0xf2,0x38,0x79,0x7a,0xfe,0xbc,0x78,0xd3,0xe9,0x50,0xf5,0xda,0xff,0xff, 0xff,0xff,0xff,0x3f,0x45,0x92,0x08,0x49,0x48,0x28,0x02,0x20,0x15,0x28,0x10, 0x05,0x84,0x48,0x25,0x69,0x24,0x05,0xa2,0x04,0xf5,0x8a,0x80,0x04,0x10,0x02, 0x81,0x8a,0x90,0x00,0x22,0x22,0x22,0x82,0xa8,0x8a,0x80,0x3a,0x45,0x50,0x21, 0x12,0x40,0x12,0x41,0x50,0x08,0x51,0xf5,0x2a,0x2a,0x50,0x45,0x51,0x28,0x20, 0x04,0xaa,0x88,0x08,0x09,0x29,0x02,0x20,0x54,0x58,0x90,0x04,0x94,0x40,0x15, 0x48,0x14,0x05,0x22,0x04,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/KFloot.xbm0000644000076600007660000002140612327014024017042 0ustar gary#define KFloot_width 220 #define KFloot_height 61 static char KFloot_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0x7f,0x55,0x55,0x55,0x55,0xbf,0xfd,0xff, 0xfd,0xf7,0xff,0xff,0xf7,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, 0xb5,0xaa,0xaa,0xaa,0xaa,0x2a,0x00,0x00,0x00,0x80,0xf7,0xb9,0xef,0xf1,0xc5, 0xc7,0xaf,0xcf,0x03,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0xf5,0x6a,0x20,0x00, 0x00,0x00,0x02,0xa0,0xaa,0xaa,0xaa,0xaa,0x81,0x3b,0x9f,0xe5,0x91,0x90,0x07, 0xe6,0xa9,0xaa,0xaa,0x6a,0x55,0x55,0x55,0x55,0xf5,0x4a,0x15,0x55,0x55,0x55, 0x55,0x35,0x00,0x00,0x00,0xc0,0xa9,0x49,0x8f,0xf1,0x45,0x85,0x57,0xc5,0x01, 0x00,0x00,0x60,0x00,0x00,0x00,0x00,0xf5,0x6a,0x8c,0x01,0x00,0x80,0x06,0x60, 0x29,0xa5,0x94,0xd2,0x03,0x1b,0x4f,0xe5,0x73,0xd0,0x87,0xd4,0x2b,0xa5,0x94, 0xfa,0x52,0x4a,0x29,0x55,0xf5,0xca,0x8a,0x93,0x24,0xa9,0x22,0x29,0x42,0x08, 0x21,0xc8,0xaf,0x80,0x2f,0xe2,0x19,0x85,0xd7,0xca,0xc1,0x0b,0x3c,0xf8,0x85, 0x10,0x42,0x00,0xf5,0x5a,0x90,0x21,0x42,0x42,0x49,0x62,0x08,0x21,0x84,0xa2, 0x1f,0x2a,0x8f,0xf0,0x5f,0xa0,0xe7,0xc0,0x73,0x46,0xe7,0x72,0x10,0x42,0x08, 0x55,0xf5,0x4a,0x0a,0x8a,0x10,0xb0,0x04,0x28,0x42,0x08,0x21,0x88,0xff,0x40, 0x2f,0xe4,0x1f,0x95,0xff,0xea,0x31,0x2d,0xd3,0x74,0x85,0x10,0x42,0x00,0xf5, 0xda,0x20,0x20,0x4a,0xf5,0xa2,0x22,0x11,0x45,0x14,0x42,0xfe,0x14,0x8f,0xe2, 0x7f,0xc0,0xf7,0xc0,0xbd,0x9c,0xcb,0x71,0x50,0x44,0x11,0xa9,0xf5,0x4a,0xd4, 0x89,0x00,0x68,0x18,0xb0,0x48,0x20,0x81,0x10,0xf9,0x81,0x2f,0xe8,0x7d,0x92, 0xc7,0xd5,0x39,0xde,0xc3,0x7b,0x05,0x12,0x48,0x02,0xf5,0xda,0x02,0x23,0x54, 0x25,0x5d,0x65,0x04,0x15,0x54,0x4a,0xe4,0x2b,0x8f,0xe4,0xfb,0x88,0xaf,0xc0, 0xbb,0x9c,0xeb,0x71,0x50,0x41,0x05,0x50,0xf5,0x4a,0x50,0x89,0x02,0x5c,0x38, 0x20,0x51,0x40,0x01,0x60,0xd1,0x41,0x2f,0xe8,0xf1,0xc3,0x87,0xd4,0x39,0xbc, 0xc3,0x75,0x05,0x14,0x50,0x05,0xf5,0x6a,0x0a,0x26,0x50,0x0f,0x7a,0x35,0x04, 0x15,0xa8,0xca,0xc4,0x13,0x9f,0xe2,0xeb,0x93,0x57,0xc1,0xbd,0x9e,0xd7,0x71, 0x50,0x41,0x05,0x50,0xf5,0xca,0x40,0x19,0x05,0x59,0x79,0x60,0x51,0x40,0x05, 0xc0,0xd1,0x88,0x0f,0xe8,0xc1,0xa7,0x07,0xe8,0x31,0x4c,0xc3,0xfa,0x06,0x14, 0x50,0x05,0xf5,0x5a,0x2a,0x54,0xa0,0x06,0xec,0x2a,0x04,0x12,0x50,0xd5,0x65, 0x21,0xaf,0xe2,0xe9,0x8f,0xaf,0xc2,0xf5,0x96,0x76,0xf0,0x21,0x81,0x04,0x50, 0xf5,0xca,0x00,0x31,0x4a,0x52,0x79,0x20,0xa1,0x88,0x04,0x40,0x7e,0xc8,0x3f, 0xf8,0xe7,0xff,0x3f,0xe8,0xc3,0x07,0x7c,0xe5,0x8a,0x28,0x51,0x05,0xf5,0x4a, 0x54,0x64,0xd1,0x06,0xe8,0xb4,0x08,0x22,0x91,0x2a,0x01,0x85,0x88,0x2a,0x12, 0x90,0x80,0x92,0x24,0x50,0x05,0x20,0x20,0x02,0x04,0x50,0xf5,0x6a,0x01,0x1f, 0xe4,0x91,0x2a,0x21,0xa4,0x08,0x24,0x40,0x54,0x20,0x22,0x80,0x44,0x05,0x2a, 0x00,0x11,0x05,0x90,0x8a,0x8a,0x50,0x91,0x04,0xf5,0x4a,0xe8,0x21,0xd1,0x44, 0x28,0xa8,0x02,0x42,0x81,0x14,0x01,0x95,0x08,0x25,0x10,0xa0,0x00,0x55,0x84, 0xa0,0x22,0x20,0x20,0x0a,0x04,0x51,0xf5,0xda,0x42,0x08,0x4c,0x11,0xae,0x32, 0x90,0x28,0x28,0x41,0x48,0x00,0xa2,0x10,0x45,0x15,0xaa,0x00,0x51,0x14,0x88, 0x0a,0x89,0x20,0x51,0x04,0xf5,0x4a,0x30,0xa5,0x44,0x84,0x0f,0x60,0x25,0x82, 0x02,0x12,0x25,0xaa,0x08,0x84,0x10,0x80,0x00,0x4a,0x04,0x81,0x22,0x40,0x22, 0x44,0x04,0x51,0xf5,0x6a,0xa5,0x00,0x62,0xa1,0xaf,0x2a,0x40,0x24,0x50,0x44, 0x80,0x00,0xa2,0x22,0x84,0x2a,0xaa,0x20,0x48,0x28,0x88,0x2a,0x08,0x11,0x51, 0x04,0xf5,0x4a,0x30,0x54,0x1f,0xc8,0x1f,0x20,0x15,0x11,0x05,0x11,0x2a,0xaa, 0x08,0x10,0x21,0x80,0x00,0x8a,0x22,0x82,0x22,0x80,0xa2,0x44,0x04,0xa1,0xf5, 0x5a,0xc5,0x02,0x9d,0xd2,0x87,0x6a,0x40,0x40,0x53,0x84,0xe0,0x00,0x22,0xf5, 0x95,0x2a,0x9e,0x20,0x18,0xd1,0x7f,0x2a,0xee,0xdd,0x48,0x14,0xf5,0x6a,0xd0, 0xa9,0x58,0xc0,0x27,0x20,0x0a,0x15,0x07,0x50,0xda,0x92,0x48,0xb8,0x01,0x80, 0x4d,0x88,0xba,0x48,0xa6,0x80,0xcc,0xdc,0x0a,0x41,0xf5,0x4a,0x05,0x42,0x04, 0x55,0x88,0x6a,0x41,0xa0,0x57,0x05,0xcc,0x21,0x02,0x5a,0x55,0xe9,0x1c,0x22, 0x04,0xc4,0x2e,0x24,0xde,0x87,0x2c,0x12,0xf5,0x5a,0x50,0xf7,0x48,0x00,0x61, 0x20,0x28,0x8a,0xe6,0xf3,0xdf,0xcb,0xbf,0xb8,0xe6,0xe7,0x7d,0xbd,0xdf,0x27, 0xa6,0xe7,0xcd,0xea,0x9e,0x40,0xf5,0xca,0xff,0xe4,0x22,0x4a,0xc4,0xb7,0x82, 0xe0,0xce,0xf6,0xef,0xe6,0x6e,0xf2,0xae,0xcd,0x6d,0xee,0xdc,0x8d,0xc6,0xbe, 0xdf,0xd3,0x2d,0x14,0xf5,0xea,0xff,0xd7,0x89,0x10,0xd1,0x2f,0x28,0x49,0xcd, 0x36,0xcf,0xee,0x1f,0xc8,0xa7,0xdd,0xec,0xfe,0xdb,0x23,0xee,0x7e,0xcf,0xc6, 0x8c,0x42,0xf5,0x4a,0x2e,0x8a,0x22,0x44,0xc4,0xad,0x02,0xe2,0xef,0xb7,0xdf, 0x67,0x8c,0xaa,0xed,0xcf,0x6e,0xce,0x9f,0x8f,0xc6,0x3c,0xdf,0xdf,0x2e,0x10, 0xf5,0xda,0xfc,0xcd,0x08,0x11,0x51,0x3c,0xa8,0x30,0xdc,0x76,0xcf,0xf6,0x4d, 0x98,0x9d,0xed,0xec,0x4e,0x7f,0x26,0xd6,0x7d,0xcf,0xdc,0x1c,0x45,0xf5,0x4a, 0xf1,0x52,0xa2,0x44,0x04,0xa7,0x02,0x74,0xff,0xee,0xf9,0xce,0x1f,0xfa,0xdd, 0x9d,0xef,0xfc,0xff,0x83,0xcf,0xe7,0xff,0xfd,0x59,0x10,0xf5,0x5a,0x84,0x25, 0x08,0x00,0x51,0x2b,0x90,0x42,0x08,0x95,0x24,0x49,0x50,0x21,0x28,0x49,0x12, 0x25,0x44,0x2a,0x12,0x2a,0x21,0x24,0x05,0x45,0xf5,0xca,0x90,0xdf,0xa3,0x2a, 0x84,0x61,0x25,0x10,0x42,0x00,0x08,0x20,0x0a,0x88,0x1e,0x20,0x44,0x00,0x91, 0x80,0x80,0x40,0x88,0x40,0x50,0x10,0xf5,0x5a,0xa2,0x5e,0xff,0x81,0xd0,0x2f, 0x80,0x8a,0x28,0xaa,0xa2,0x0a,0x41,0x25,0x86,0x0a,0x11,0x55,0x04,0x2a,0x54, 0x14,0x22,0x14,0x05,0x45,0xf5,0x4a,0x64,0x3e,0xe2,0x55,0xc4,0xad,0x2a,0x40, 0x02,0x01,0x08,0x40,0x14,0x80,0x52,0x40,0x44,0x00,0x91,0x80,0x02,0x41,0x89, 0x42,0x50,0x20,0xf5,0x6a,0x31,0x24,0x0c,0x06,0x62,0x3c,0x80,0x2a,0xa8,0xa8, 0xa2,0x2a,0x81,0x2a,0x04,0x2a,0x11,0x55,0x44,0x24,0x50,0x14,0x20,0x88,0x04, 0x8a,0xf5,0x4a,0x1c,0x52,0x2e,0xa0,0x88,0xa6,0x2a,0x80,0x02,0x04,0x08,0x00, 0x28,0x00,0x51,0x01,0x44,0x00,0x11,0x11,0x05,0x81,0x8a,0x22,0xa2,0x20,0xf5, 0x6a,0x09,0xaa,0xf8,0x0a,0x22,0x2b,0x80,0x2f,0x50,0xa1,0x42,0x55,0x05,0x55, 0x70,0x54,0xe1,0x4f,0x70,0x45,0xd0,0x29,0x60,0x1c,0x0f,0x0b,0xf5,0x4a,0x06, 0xc3,0x0a,0xa1,0x88,0x63,0x25,0x0e,0x05,0x0a,0x10,0x00,0x50,0x80,0x6a,0x01, 0xd4,0x1c,0xbd,0x11,0x8a,0x83,0xfa,0xf6,0xed,0x45,0xf5,0xda,0x82,0xa4,0x13, 0x08,0xe2,0x28,0x88,0xa6,0xa0,0xa3,0x8a,0x54,0x05,0xea,0x60,0x28,0xc1,0x4d, 0x8c,0x85,0xa0,0x29,0x60,0xb6,0xcd,0x21,0xf5,0x4a,0x42,0x00,0x4d,0xa2,0x48, 0x22,0x21,0xf6,0xf5,0xdf,0xb7,0x6d,0xf8,0xe7,0xeb,0x33,0xd7,0x0c,0x2d,0xf0, 0xbe,0x99,0x6a,0xbf,0x6d,0x14,0xf5,0xda,0x42,0x55,0x32,0x08,0x22,0xb1,0x08, 0x6f,0x9b,0xb7,0x76,0xdb,0xfe,0xdd,0x60,0x73,0xc1,0x57,0x0c,0xdd,0xf7,0x2f, 0x60,0xbc,0xff,0x81,0xf5,0x4a,0x7d,0x00,0xc4,0x92,0x88,0x28,0x44,0x66,0x7b, 0x73,0x3e,0xdb,0xfc,0xcd,0x75,0x37,0xe9,0x04,0xad,0xb8,0xef,0x87,0xf4,0x32, 0x6c,0x2b,0xf5,0x6a,0x05,0xaa,0x14,0x03,0x22,0xa4,0x22,0xee,0xfb,0xb7,0xb6, 0xff,0x8d,0xdd,0x60,0x6b,0xc3,0x51,0x0c,0x9a,0xe7,0x1d,0x61,0x58,0xe7,0x03, 0xf5,0xca,0xa1,0x00,0x40,0xac,0x08,0x31,0x90,0x66,0xcb,0x33,0x3e,0xdb,0xdc, 0xcd,0xea,0xe3,0xd0,0x32,0x5d,0xb9,0xef,0x79,0x68,0x1e,0x6f,0x57,0xf5,0xda, 0x0a,0x52,0x29,0x02,0x42,0xa4,0x0a,0x7f,0x7f,0x7e,0xed,0xdb,0xfb,0xbd,0xa1, 0xe9,0xe5,0x71,0xf0,0xfa,0xfc,0xfb,0xf2,0xae,0xd1,0x01,0xf5,0xca,0xff,0xff, 0xff,0xff,0xff,0x3f,0x40,0x91,0x52,0x49,0x50,0x24,0x10,0x05,0x2a,0x42,0x10, 0x0a,0x25,0x40,0x25,0x48,0x24,0x81,0x84,0x54,0xf5,0xaa,0x20,0x01,0x00,0x51, 0x24,0xa1,0x2a,0x24,0x04,0x02,0x05,0x01,0x45,0xa0,0x80,0x78,0x85,0x40,0x10, 0x15,0x88,0x22,0x41,0x24,0x21,0x02,0xf5,0x0a,0x4a,0x54,0x55,0x04,0x11,0x08, 0x00,0x81,0x90,0x50,0x90,0xa8,0x10,0x15,0x2a,0x72,0x50,0x14,0x85,0x40,0x22, 0x50,0x14,0x11,0x88,0x50,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/KFMod.xbm0000644000076600007660000002140312327014024016601 0ustar gary#define KFMod_width 220 #define KFMod_height 61 static char KFMod_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0x7f,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x9f,0xfc,0xff,0xfc,0xf3, 0xf7,0xff,0xf3,0x03,0xf8,0x01,0x00,0xf8,0x00,0x00,0x00,0xf5,0x6a,0x00,0x00, 0x00,0x00,0x00,0xa0,0xaa,0xaa,0xaa,0xea,0xf1,0x9c,0xe7,0xf1,0xc4,0xc1,0x83, 0xc7,0x53,0x7d,0xa8,0xaa,0xe2,0x54,0x55,0x55,0xf5,0x4a,0x80,0x7f,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0xc0,0xd4,0xad,0xcf,0xf4,0x51,0xd4,0x2b,0xd3,0x0f, 0xfc,0x02,0x00,0xe8,0x02,0x00,0x00,0xf5,0x5a,0x80,0x80,0x01,0x00,0x00,0x60, 0xa5,0x94,0x52,0xea,0xc1,0x84,0xa7,0xf0,0xa4,0xc2,0x83,0xc2,0x47,0x7b,0xa8, 0x94,0xe2,0x48,0x29,0x55,0xf5,0x4a,0x80,0x1c,0x02,0x00,0x00,0x20,0x08,0x21, 0x84,0xe0,0xa8,0xad,0x87,0xf5,0x38,0xd0,0x57,0x6a,0x1f,0x7a,0x02,0x21,0xf0, 0x12,0x42,0x00,0xf5,0x6a,0x80,0x14,0x04,0x00,0x00,0x60,0x42,0x08,0x21,0xf4, 0x03,0x80,0x57,0xf0,0x8e,0xca,0xe3,0x42,0x4f,0x7b,0xe9,0x85,0xef,0x40,0x08, 0x55,0xf5,0x4a,0x80,0x22,0x06,0x00,0x00,0xa0,0x10,0x42,0x08,0xc1,0xaf,0xaa, 0x07,0xf5,0x2e,0xd0,0x77,0xd0,0x0e,0x7d,0x30,0x93,0xf7,0x15,0x42,0x00,0xf5, 0x5a,0x80,0x22,0x7e,0x00,0x00,0x20,0x4a,0x29,0xa5,0xe4,0x3f,0x80,0x57,0xf0, 0x8f,0xc2,0x7f,0x4a,0x5e,0x79,0xbd,0xa6,0xe9,0x40,0x11,0xa9,0xf5,0x4a,0x80, 0x40,0x45,0x00,0x00,0xa0,0x00,0x00,0x00,0x88,0x7f,0xd5,0x07,0xfa,0x3f,0xd0, 0x73,0x61,0x9d,0x7a,0x1c,0xce,0xe1,0x14,0x48,0x02,0xf5,0x6a,0x80,0xc0,0x45, 0x00,0x00,0x20,0xaa,0xaa,0xaa,0x22,0xfe,0x80,0x57,0xf1,0xbe,0xca,0x6b,0x48, 0xfc,0x78,0x5d,0xdf,0xeb,0x41,0x05,0x50,0xf5,0x4a,0x80,0x00,0x42,0x00,0x00, 0xa0,0x00,0x00,0x00,0xa0,0xf0,0xaa,0x07,0xf4,0x7d,0xe0,0xd3,0xc2,0xbe,0x7d, 0x1c,0xce,0xe1,0x14,0x50,0x05,0xf5,0x5a,0x80,0x80,0x41,0x00,0x00,0x20,0xaa, 0xaa,0xaa,0x2a,0xea,0x80,0x2f,0xf1,0xf8,0xca,0x47,0x50,0x78,0x78,0xbd,0xde, 0xf5,0x41,0x05,0x50,0xf5,0x4a,0x80,0x7f,0x40,0x00,0x00,0xa0,0x00,0x00,0x00, 0xe0,0xe0,0xd5,0x47,0xf4,0xf4,0xc1,0x23,0x65,0x7a,0xfa,0x1c,0xce,0xe1,0x10, 0x50,0x05,0xf5,0x6a,0x00,0x00,0x40,0x00,0x00,0x20,0x4a,0x29,0xa5,0x6a,0x74, 0x80,0x0f,0xf1,0xe2,0xd7,0x8b,0xc0,0x34,0x79,0x9a,0xa6,0xeb,0x85,0x04,0x50, 0xf5,0x4a,0x00,0x00,0x40,0x00,0x00,0xa0,0x10,0x42,0x08,0xe0,0xb1,0xa4,0x47, 0xf8,0xe8,0xc3,0x23,0x54,0x70,0x7c,0x34,0x93,0xf3,0x20,0x51,0x05,0xf5,0x5a, 0x00,0x00,0x40,0x00,0x00,0x20,0x84,0x10,0x42,0x35,0x1f,0xe2,0x3f,0xfe,0xf3, 0xff,0x9f,0xf2,0x2b,0xfe,0xf1,0x45,0xef,0x15,0x04,0x50,0xf5,0x4a,0x80,0x7f, 0x40,0xfe,0x01,0x60,0x21,0x84,0x10,0x80,0xa4,0x10,0x80,0x20,0x25,0x92,0x24, 0x88,0x40,0x21,0x45,0x11,0x11,0x41,0x91,0x04,0xf5,0x5a,0x80,0x80,0x41,0x02, 0x06,0x20,0x94,0x52,0x4a,0x55,0x10,0xa4,0x2a,0x44,0x88,0x20,0x42,0x22,0x14, 0x48,0x10,0x04,0x44,0x14,0x04,0x51,0xf5,0x4a,0x80,0x1c,0x42,0x72,0x08,0x20, 0x01,0x00,0x00,0x00,0x85,0x02,0x00,0x11,0x22,0x8a,0x10,0x88,0x42,0x85,0x44, 0x51,0x11,0x21,0x51,0x04,0xf5,0x5a,0x80,0x14,0x44,0x52,0x10,0x60,0x54,0x55, 0x55,0x4a,0x50,0xa8,0xaa,0x84,0x88,0x20,0x8a,0x22,0x10,0x10,0x11,0x04,0x44, 0x44,0x04,0x51,0xf5,0x4a,0x80,0x22,0x46,0x8a,0x18,0x20,0x01,0x00,0x80,0x10, 0x05,0x02,0x00,0x20,0x22,0x8a,0x40,0x88,0x8a,0x22,0x04,0x51,0x11,0x08,0x51, 0x04,0xf5,0x5a,0x80,0x22,0xfe,0x8b,0xf8,0x67,0xa8,0xaa,0x2a,0x42,0x50,0x51, 0x55,0x95,0x88,0x20,0x14,0x22,0x40,0x88,0x50,0x04,0x84,0x22,0x04,0xa1,0xf5, 0x4a,0x80,0x40,0x45,0x02,0x15,0x20,0x02,0x00,0x83,0x10,0xe2,0x08,0x00,0xf0, 0x21,0x88,0x8e,0x08,0x1d,0xc2,0x3f,0x91,0xfe,0xdd,0x48,0x14,0xf5,0x5a,0x80, 0xc0,0x45,0x02,0x17,0x20,0x51,0x4a,0x27,0x44,0xc9,0xa2,0xaa,0x9a,0x8b,0x82, 0x2d,0x42,0xb8,0x68,0x66,0x44,0xcc,0xec,0x0a,0x41,0xf5,0x4a,0x80,0x00,0x42, 0x02,0x08,0x60,0x84,0x90,0x8f,0x12,0xdc,0x08,0x00,0x58,0x21,0xe8,0x8c,0x10, 0x05,0x42,0x2f,0x11,0xdd,0x87,0x2c,0x12,0xf5,0x5a,0x80,0x80,0x41,0x02,0x06, 0x20,0x21,0x84,0xe6,0xe3,0xdf,0xe3,0x77,0x3d,0xe6,0xe7,0x3f,0xbe,0xbf,0x4f, 0x86,0xe7,0xcd,0xf6,0x9e,0x40,0xf5,0x4a,0x80,0x7f,0x40,0xfe,0x01,0xa0,0x08, 0xe1,0xd6,0xfe,0xdf,0xe7,0x2f,0xf0,0xb7,0xcf,0xfc,0xee,0xdc,0x24,0xee,0xbe, 0xdf,0xc3,0x2d,0x14,0xf5,0x5a,0x00,0x00,0x40,0x00,0x00,0x20,0xa4,0x48,0xcd, 0x36,0xcf,0xee,0x2f,0xd5,0xa7,0xdd,0x6c,0xfe,0xdb,0x87,0xc6,0x7d,0xcf,0xd6, 0x8c,0x42,0xf5,0x4a,0x00,0x00,0x40,0x00,0x00,0xa0,0x02,0xe4,0xef,0x76,0xef, 0x66,0x4c,0x88,0xed,0xcd,0xed,0xa6,0xbf,0x27,0xd6,0x3c,0xef,0xce,0x2e,0x10, 0xf5,0x5a,0x00,0x00,0x40,0x00,0x00,0x20,0x50,0x31,0xdc,0x77,0xcf,0xf6,0x1e, 0xba,0x9f,0xed,0x6c,0xce,0xde,0x16,0xc7,0x7f,0xcf,0xfd,0x1c,0x45,0xf5,0x4a, 0x00,0x00,0x40,0x00,0x00,0xa0,0x0a,0x74,0xff,0xee,0xfb,0xcf,0x5f,0xf9,0xd8, 0x9f,0xef,0xfe,0xff,0x43,0xaf,0xef,0xff,0xfc,0x59,0x10,0xf5,0x5a,0x80,0x7f, 0x40,0x00,0x00,0x20,0x40,0x41,0x08,0x24,0x20,0x90,0x00,0x44,0x5a,0x90,0x94, 0x24,0x04,0x14,0x08,0x80,0x88,0x04,0x05,0x45,0xf5,0x4a,0x80,0x80,0x41,0x00, 0x00,0xa0,0x2a,0x14,0x42,0x89,0x0a,0x25,0x2a,0x11,0x8e,0x04,0x21,0x10,0x51, 0x41,0x45,0x29,0x22,0x51,0x50,0x10,0xf5,0x5a,0x80,0x1c,0x42,0x00,0x00,0x20, 0x00,0x81,0x28,0x20,0x40,0x80,0x40,0x44,0x17,0x51,0x08,0x45,0x04,0x14,0x20, 0x82,0x08,0x04,0x05,0x45,0xf5,0x4a,0x80,0x14,0x44,0xfc,0x1d,0xae,0x54,0x54, 0x82,0x8a,0x2a,0x2a,0x14,0x11,0x40,0x04,0x45,0x10,0x51,0x81,0x8a,0x28,0x42, 0x51,0x50,0x20,0xf5,0x5a,0x80,0x22,0x46,0x98,0x19,0x27,0x01,0x01,0x28,0x20, 0x00,0x01,0x41,0x44,0x15,0x51,0x20,0x42,0x04,0x54,0x20,0x82,0x10,0x84,0x04, 0x8a,0xf5,0x4a,0x80,0x22,0x7e,0x18,0x18,0x67,0x54,0xa8,0x02,0x89,0xaa,0xa8, 0x08,0x11,0x00,0x04,0x15,0x11,0x51,0x01,0x0a,0x28,0x4a,0x11,0xa2,0x20,0xf5, 0x5a,0x80,0x40,0x05,0x4c,0x9c,0x22,0x81,0x0f,0x50,0x22,0x00,0x02,0x22,0x84, 0x7a,0x51,0xe0,0x47,0x70,0xa9,0xe0,0x83,0x60,0x5c,0x0f,0x0b,0xf5,0x4a,0x80, 0xc0,0x05,0x7c,0x54,0x23,0x24,0x4e,0x05,0x8a,0xaa,0xa8,0x10,0xa1,0x60,0x04, 0xd2,0x1c,0x9d,0x03,0x8a,0x25,0x74,0xb7,0xed,0x45,0xf5,0x5a,0x80,0x00,0x02, 0x2c,0x74,0xa3,0x88,0x26,0xa0,0x23,0x00,0x02,0x8a,0xc8,0x74,0xa1,0xc8,0x4e, 0x4c,0xa9,0xa0,0x11,0x69,0xb6,0xcd,0x21,0xf5,0x4a,0x80,0x80,0x01,0x06,0xb6, 0x21,0x22,0xf6,0xfb,0xdf,0xbf,0xed,0xf8,0xe7,0xe3,0x35,0xe3,0x0c,0x1d,0xf1, 0xbe,0x9b,0xe0,0xf6,0x6d,0x14,0xf5,0x5a,0x80,0x7f,0x00,0x06,0xb6,0xa1,0x08, 0x67,0x9b,0xb7,0x76,0xdf,0xdd,0xdd,0x68,0x73,0xcb,0x57,0x2c,0xda,0xf7,0x2d, 0x6a,0x3e,0xff,0x81,0xf5,0x4a,0x00,0x00,0x00,0x0f,0x97,0x23,0x42,0x76,0x7b, 0x73,0x37,0xdb,0xfc,0xcf,0x62,0x37,0xe1,0x04,0x8d,0x98,0xef,0x87,0xe0,0x30, 0x6d,0x2b,0xf5,0x5a,0x00,0x00,0x00,0x00,0x00,0xa0,0x28,0x67,0xf7,0x37,0x76, 0xdb,0xae,0xed,0x70,0xe3,0xc9,0x51,0x1c,0xba,0xe7,0x2d,0x6a,0x5c,0xe6,0x03, 0xf5,0x4a,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x76,0xdb,0xb3,0x3e,0xff,0x9c, 0xcd,0xea,0xeb,0xc2,0x34,0x5a,0xb9,0xff,0xfd,0x60,0x3d,0x6f,0x57,0xf5,0x5a, 0x00,0x00,0x00,0x00,0x00,0xa0,0xa8,0xff,0x7f,0x7e,0xed,0xdb,0xfb,0xbf,0xa1, 0xc5,0xf0,0xb1,0xf0,0xf5,0xfc,0x79,0xfa,0x86,0xd1,0x01,0xf5,0xca,0xff,0xff, 0xff,0xff,0xff,0x3f,0x02,0x02,0x80,0x12,0x24,0x01,0x48,0x40,0x4a,0x60,0x8a, 0x24,0x0a,0x40,0x82,0x44,0x40,0x52,0x85,0x54,0xf5,0x4a,0x00,0x00,0x00,0x00, 0x00,0xa4,0x48,0xa8,0x2a,0x40,0x11,0x54,0x11,0x8a,0x10,0xf5,0x20,0x82,0xa0, 0x94,0x28,0x68,0x15,0x08,0x20,0x02,0xf5,0x1a,0x55,0x55,0x55,0x55,0x55,0x09, 0x22,0x02,0x00,0x15,0x44,0x01,0x44,0x21,0x42,0x30,0x8a,0x28,0x0a,0x02,0x82, 0x02,0x80,0xa2,0x8a,0x50,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/KHose.xbm0000644000076600007660000002140312327014024016652 0ustar gary#define KHose_width 220 #define KHose_height 61 static char KHose_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xea,0xb7,0xff,0xbf, 0xff,0xfe,0xff,0xfb,0x5f,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, 0xab,0xaa,0xaa,0xaa,0xaa,0x6a,0x00,0x00,0x00,0xf0,0x3e,0xf7,0x3d,0xbe,0xf8, 0xf8,0xe2,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x6a,0x02,0x00, 0x00,0x00,0x00,0x20,0x55,0x55,0x55,0x35,0x70,0xe7,0xb3,0x3c,0x12,0xf2,0xc8, 0x53,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0xca,0x51,0x55,0x55,0x55, 0x55,0x35,0x00,0x00,0x00,0x38,0x35,0xe9,0x31,0xbe,0x58,0xf8,0xc2,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x5a,0x18,0x00,0x00,0x00,0x00,0x60, 0xa5,0x94,0x52,0x7a,0x60,0xe3,0xa9,0x7c,0x06,0xf2,0xe9,0x57,0x4a,0x29,0xa5, 0x94,0x52,0x4a,0x29,0x55,0xf5,0x4a,0x38,0xa5,0x94,0x52,0x4a,0x29,0x08,0x21, 0x04,0xf9,0x15,0xf0,0x45,0x3c,0x53,0xf1,0xc0,0x03,0x1e,0x72,0xc9,0xc3,0xb3, 0x10,0x42,0x00,0xf5,0x6a,0x59,0x08,0x21,0x8c,0x10,0x22,0x21,0x84,0x50,0xf4, 0x43,0xe5,0x11,0xfe,0x0b,0xf8,0xd5,0xab,0xb3,0x88,0x31,0xae,0x7f,0x42,0x08, 0x55,0xf5,0xca,0x00,0x42,0x08,0x3d,0x84,0xb0,0x08,0x21,0x04,0xf1,0x1f,0xe8, 0x85,0xfc,0xa3,0xf2,0xff,0x83,0x75,0xae,0x75,0x87,0xf7,0x10,0x42,0x00,0xf5, 0x5a,0xa2,0x10,0xa2,0x64,0x21,0x24,0xa2,0x88,0x42,0xc8,0x9f,0xe2,0x51,0xfc, 0x0f,0xf0,0xc0,0xd7,0xe1,0x1c,0x38,0xae,0x03,0x44,0x11,0xa9,0xf5,0x4a,0x0d, 0x8a,0x08,0xc6,0x95,0xb2,0x08,0x24,0x10,0x22,0x3f,0xf0,0x05,0xbd,0x4f,0xf5, 0xd4,0xc3,0xeb,0xfe,0xfa,0x8f,0xab,0x12,0x48,0x02,0xf5,0x6a,0xb4,0x40,0xa2, 0x04,0x07,0x20,0xa2,0x82,0x4a,0x89,0x7c,0xe5,0xa3,0x7c,0x1f,0xf0,0xc2,0xeb, 0xe1,0xf8,0x79,0xd2,0x03,0x40,0x05,0x50,0xf5,0x4a,0x11,0x2a,0x08,0x04,0xac, 0xaa,0x08,0x28,0x00,0x2c,0x3a,0xe8,0x09,0xbd,0xbe,0xfa,0xe8,0xc3,0xf5,0xea, 0x3f,0x84,0x57,0x15,0x50,0x05,0xf5,0x5a,0xe8,0x80,0xa2,0x06,0x30,0x20,0xa2, 0x02,0x55,0x99,0x78,0xe2,0x21,0x3c,0x7c,0xf0,0xc2,0xd3,0xe1,0x82,0x7b,0xa1, 0x03,0x40,0x05,0x50,0xf5,0x4a,0x85,0x2b,0x08,0x04,0x40,0xb5,0x08,0xa8,0x00, 0x38,0x9a,0xe8,0x0b,0xbd,0xfa,0xf5,0xd0,0x8b,0x6b,0x57,0x73,0x8c,0x2b,0x15, 0x50,0x05,0xf5,0xda,0x20,0x41,0xa2,0x06,0x80,0x21,0x42,0x02,0xaa,0xba,0x0c, 0xe2,0xa1,0x3c,0xf8,0xf0,0xc5,0x43,0x73,0x0e,0xf9,0xa7,0x43,0x80,0x04,0x50, 0xf5,0x4a,0x94,0x8a,0x08,0x02,0x00,0xb6,0x10,0x91,0x00,0xc8,0xaf,0xf8,0x0f, 0xff,0xfe,0xff,0xf3,0x2f,0x1e,0xfa,0xc2,0xd3,0x0f,0x29,0x51,0x05,0xf5,0x6a, 0x02,0x12,0x42,0x03,0x00,0x2c,0x4a,0x24,0x52,0x25,0x00,0x4a,0x20,0x49,0x91, 0x24,0x54,0x8a,0xa2,0x42,0x51,0x84,0x54,0x04,0x04,0x50,0xf5,0xca,0xf8,0x85, 0x10,0x02,0x00,0xac,0x00,0x81,0x04,0x10,0xa5,0x20,0x4a,0x04,0x04,0x08,0x81, 0x20,0x08,0x10,0x08,0x20,0x00,0x51,0x91,0x04,0xf5,0x5a,0x4d,0x21,0x8a,0x02, 0x00,0x36,0x54,0x28,0x50,0x85,0x08,0x0a,0x01,0x51,0xa1,0xa2,0x14,0x0a,0xa2, 0x4a,0x45,0x15,0x55,0x04,0x04,0x51,0xf5,0x4a,0x24,0x88,0x20,0x03,0x00,0x61, 0x01,0x05,0x05,0x20,0xa2,0x40,0x54,0x04,0x14,0x08,0x80,0xa0,0x08,0x00,0x20, 0x80,0x00,0x21,0x51,0x04,0xf5,0x5a,0x0b,0x25,0x49,0x01,0xe0,0x2a,0x48,0x50, 0x20,0x95,0x08,0x2a,0x01,0x51,0x81,0xa2,0x2a,0x0a,0xa2,0xaa,0x8a,0x2a,0x4a, 0x48,0x04,0x51,0xf5,0x4a,0xa2,0x00,0x02,0x01,0x10,0x60,0x85,0x04,0x8a,0x00, 0x82,0x00,0x28,0x04,0x28,0x08,0x80,0xa0,0x08,0x00,0x20,0x80,0x10,0x05,0x51, 0x04,0xf5,0x6a,0x0b,0x54,0xa8,0x00,0xac,0x2a,0x20,0x51,0x21,0xaa,0x28,0xaa, 0x82,0x48,0x85,0xa2,0x2a,0x09,0xa2,0x54,0x0a,0x29,0x42,0x50,0x04,0xa1,0xf5, 0x4a,0xa4,0x02,0x82,0x00,0x02,0x20,0x15,0x04,0x8e,0x00,0xc2,0x01,0x28,0xe2, 0x23,0x08,0x1c,0xa2,0x30,0x81,0x7f,0x82,0xdc,0xbb,0x49,0x14,0xf5,0xda,0x9e, 0xa9,0xe8,0x00,0x55,0xb5,0x40,0xa1,0x26,0x52,0xb4,0xa9,0x82,0x38,0x4b,0x82, 0x59,0x08,0x3a,0xa8,0xdc,0x28,0xba,0x9b,0x13,0x41,0xf5,0x4a,0x68,0x01,0x42, 0x80,0x01,0x20,0x12,0x08,0x0f,0x04,0x99,0x03,0x28,0xb2,0x02,0xa8,0x1b,0x91, 0x80,0x82,0x4d,0x82,0x98,0x4d,0x38,0x12,0xf5,0x5a,0x41,0xae,0x50,0x40,0x54, 0xb5,0x08,0x45,0xed,0xd7,0xbf,0xd7,0xef,0x70,0xee,0xcf,0x7b,0x78,0x3f,0x5f, 0x2c,0xdf,0xbb,0xd5,0xbd,0x40,0xf5,0x4a,0x68,0xf8,0x3f,0x20,0x01,0x20,0x42, 0x90,0x9d,0x6d,0xdf,0xcd,0x5d,0xea,0xcd,0x9b,0xfb,0xde,0xfd,0x09,0x8d,0x7d, 0x9f,0x8f,0x1b,0x14,0xf5,0xea,0x45,0x00,0x18,0xf0,0x55,0xaa,0x28,0xc5,0xda, 0xed,0x9e,0xdd,0x3f,0xa0,0x5f,0xbb,0xd9,0xfc,0xb7,0x4f,0xdc,0xf9,0xde,0xcd, 0xb9,0x42,0xf5,0xca,0x7f,0x00,0x06,0x0c,0x8f,0x20,0x02,0xd0,0x9f,0x6f,0xbe, 0xcd,0x19,0x15,0x5b,0x9f,0xdd,0x4d,0x3f,0x1f,0x8d,0x7b,0x9e,0x9d,0x1b,0x10, 0xf5,0x5a,0x5f,0x00,0x01,0x03,0x38,0xb4,0x50,0x45,0xb8,0xfd,0x9e,0xcf,0x9b, 0xb0,0x7b,0xbb,0xf9,0x9c,0xfd,0x4c,0xac,0xfb,0xbf,0xbb,0x59,0x45,0xf5,0xca, 0x50,0xf8,0xc0,0x3f,0xe0,0x22,0x0a,0xf0,0xfe,0xdd,0xf7,0xbd,0x3f,0xfa,0xb5, 0x7b,0xdf,0xfd,0xff,0x07,0x1f,0xcf,0xff,0xf9,0x37,0x10,0xf5,0x5a,0x44,0x66, 0x70,0xe0,0x41,0xb0,0xa0,0x84,0x48,0x22,0x21,0x01,0xa4,0x40,0x30,0x02,0x02, 0x21,0x08,0x52,0xa4,0x24,0x00,0x4a,0x20,0x45,0xf5,0x4a,0x72,0x35,0x1c,0x15, 0xc7,0x25,0x09,0x22,0x11,0x08,0x14,0x94,0x10,0x14,0x9e,0x90,0xa8,0x88,0xa2, 0x08,0x01,0x88,0xaa,0x20,0x4a,0x10,0xf5,0xda,0xb4,0x11,0xa6,0x80,0x8c,0x31, 0xa2,0x10,0x84,0x42,0x41,0x41,0x84,0x42,0x2d,0x24,0x02,0x22,0x08,0x42,0xa8, 0x22,0x00,0x0a,0x01,0x45,0xf5,0x4a,0x9f,0x1c,0x0b,0x2a,0x0a,0xa7,0x08,0x44, 0x51,0x28,0x10,0x14,0x51,0x10,0x84,0x82,0xa8,0x48,0xa2,0x10,0x05,0x88,0xaa, 0x40,0x54,0x20,0xf5,0xea,0x10,0x88,0xa1,0x80,0x18,0x2a,0x42,0x11,0x04,0x02, 0x45,0x41,0x04,0x8a,0x20,0x28,0x02,0x82,0x08,0x4a,0x50,0x22,0x00,0x2a,0x01, 0x8a,0xf5,0xca,0x85,0x8e,0x0a,0x2a,0x14,0xa2,0x10,0x24,0xa1,0xa8,0x10,0x14, 0xa1,0x20,0x8a,0x82,0x90,0x10,0xa2,0x00,0x85,0x88,0xaa,0x00,0xa4,0x20,0xf5, 0xda,0x50,0xc4,0x90,0x00,0x11,0x32,0x8a,0x9e,0x08,0x02,0x44,0x41,0x08,0x8a, 0xe0,0x24,0xca,0x8f,0xe0,0x56,0x90,0x23,0xc0,0xbc,0x1e,0x0e,0xf5,0x4a,0x04, 0xc5,0x22,0xaa,0x14,0xa6,0x40,0x0c,0xa4,0x54,0x11,0x10,0xa5,0x20,0xd5,0x88, 0xa0,0x3d,0x3a,0x03,0x44,0x8b,0xea,0x7d,0xdb,0x43,0xf5,0x6a,0x49,0x84,0x89, 0x00,0x18,0x32,0x2a,0xae,0x02,0x06,0x44,0x45,0x00,0x8a,0xc1,0x21,0x8a,0x99, 0x98,0x52,0x11,0x23,0xc0,0x6c,0x9b,0x2b,0xf5,0xca,0x10,0x05,0x03,0xa9,0x0e, 0xa7,0x80,0xec,0xf3,0xff,0x6f,0xdb,0xfa,0xef,0xd7,0x67,0xa6,0x3b,0x5a,0xe4, 0x7b,0xb7,0xd4,0xec,0xdb,0x00,0xf5,0x5a,0x42,0x04,0xfc,0xff,0x03,0x31,0x2a, 0xdd,0xb6,0x6f,0x6d,0xb6,0xb9,0x9b,0xc1,0xee,0x8a,0x8f,0x18,0xb2,0xef,0x1b, 0xc2,0x7a,0xfe,0xab,0xf5,0x4a,0x10,0x0a,0x00,0x00,0xc0,0xa3,0x00,0xcc,0xf6, 0x66,0x7d,0xbf,0xfb,0xdb,0xd5,0x66,0xc2,0x21,0xbc,0x38,0xef,0xaf,0xe8,0x68, 0xda,0x06,0xf5,0xda,0x8a,0x18,0x00,0x00,0x70,0x28,0x52,0xdd,0xef,0x6f,0x6c, 0xf6,0x59,0x9f,0xc1,0xd6,0x96,0x0b,0x19,0x72,0xcf,0x1b,0xc2,0xb2,0xcc,0x57, 0xf5,0x4a,0x40,0xf4,0xff,0xff,0x0f,0xa2,0x04,0xcc,0x96,0x67,0xfd,0xb6,0x3d, 0xbb,0xeb,0xc6,0x81,0xe1,0xb4,0x72,0xdf,0xf7,0xd0,0x79,0xde,0x06,0xf5,0x6a, 0x15,0x11,0x12,0x00,0x50,0x31,0x50,0xff,0xfe,0xfc,0xda,0xb7,0xf3,0x3b,0xc3, 0xd3,0xeb,0x77,0xe0,0xe9,0xfb,0xf3,0xe5,0x0d,0xa3,0x53,0xf5,0xca,0xff,0xff, 0xff,0xff,0xff,0x7f,0x05,0x90,0xa4,0x4a,0x20,0x92,0x48,0x44,0x11,0x8a,0x00, 0x80,0x2a,0x04,0x90,0xa8,0x20,0xa8,0x0a,0x0a,0xf5,0x2a,0x80,0x20,0x41,0x55, 0x05,0x04,0x20,0x05,0x08,0x20,0x8a,0x08,0x04,0x11,0x88,0xe0,0xaa,0x2a,0x40, 0x51,0x25,0x42,0x15,0x05,0xa0,0x40,0xf5,0x8a,0x2a,0x4a,0x14,0x00,0x50,0x91, 0x8a,0xa0,0x42,0x09,0x21,0x42,0x51,0x84,0x22,0xea,0x00,0x00,0x15,0x04,0x80, 0x24,0x80,0xa0,0x0a,0x2a,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/Klar.xbm0000644000076600007660000002140012327014024016527 0ustar gary#define Klar_width 220 #define Klar_height 61 static char Klar_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, 0xbf,0x7f,0x5f,0x55,0x55,0xd5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, 0x53,0xbd,0xaa,0xaa,0xaa,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0xbe, 0x3c,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0xf5,0x6a,0x02,0x66, 0x00,0x00,0x00,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x0c,0x1e,0x55, 0x55,0xd5,0xab,0xaa,0xaa,0xaa,0x55,0x55,0x55,0xf5,0xca,0x81,0x44,0x55,0x75, 0x55,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x82,0x5c,0x00,0x00,0x80, 0x03,0x00,0x00,0x80,0x01,0x00,0x00,0xf5,0x5a,0x40,0x69,0x00,0xdc,0x00,0x60, 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x53,0x1c,0x4a,0x29,0x55,0xa8,0x94, 0x52,0xea,0x4b,0x29,0x55,0xf5,0x4a,0xc0,0x42,0xa9,0x87,0x4a,0x29,0x42,0x08, 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x08,0xbe,0x7c,0xf2,0xcc,0xe3,0x39,0xe4,0xe1, 0x17,0x42,0x00,0xf5,0x6a,0x40,0x10,0x82,0xfc,0x10,0x62,0x08,0x21,0x14,0xfd, 0x50,0x79,0x84,0xff,0xa2,0x1c,0xc2,0xe4,0xbf,0xcb,0xfd,0x18,0xcb,0x41,0x08, 0x55,0xf5,0xca,0x80,0x8a,0x28,0x42,0x42,0x28,0x42,0x08,0x41,0xfc,0x07,0x7a, 0x21,0xff,0x08,0xbc,0xef,0xf1,0x9c,0xd3,0xe7,0xba,0xd3,0x15,0x42,0x00,0xf5, 0x5a,0x01,0xa0,0x82,0x10,0x11,0xa2,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, 0x43,0x1d,0xc7,0xe3,0xc2,0xc7,0xe9,0x1c,0xc7,0x41,0x11,0xa9,0xf5,0x4a,0x5a, 0x0a,0x27,0x4a,0x44,0x31,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0x2b,0x3c, 0xe9,0xe9,0x91,0xe3,0xe1,0xfd,0xef,0x15,0x48,0x02,0xf5,0x6a,0x95,0x40,0x8d, 0x00,0x11,0xa4,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xdf,0x07,0x9d,0xd8,0xe3, 0x88,0xcb,0xeb,0x3c,0xc1,0x41,0x05,0x50,0xf5,0x4a,0x14,0x94,0x28,0x54,0x44, 0x31,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x41,0x8f,0xaf,0x1c,0xd6,0xe9,0xc5,0xc3, 0xe1,0x1d,0xd4,0x15,0x50,0x05,0xf5,0x5a,0xf1,0x02,0x18,0x01,0x11,0xa4,0xa8, 0x40,0x55,0x26,0x9e,0xf8,0x14,0x4f,0x1f,0xbe,0xc7,0xe1,0x90,0xeb,0xeb,0x7c, 0xc1,0x41,0x05,0x50,0xf5,0x4a,0x84,0x51,0x8f,0x28,0x22,0x31,0x02,0x2a,0x00, 0x8e,0x46,0x7c,0x40,0x2f,0xbe,0x1c,0xd7,0xeb,0xa4,0xc3,0xe1,0x3a,0xec,0x1b, 0x50,0x05,0xf5,0xda,0x48,0x09,0x48,0x42,0x44,0xa4,0x90,0x80,0xaa,0x2e,0x0b, 0x79,0x15,0x0f,0x3f,0x5c,0xff,0xe3,0x81,0xd7,0xf5,0xf8,0xc3,0x87,0x04,0x50, 0xf5,0x4a,0x11,0xa3,0x22,0x08,0x11,0x31,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc1, 0x7f,0xff,0x3f,0x8f,0xf9,0xeb,0xe7,0xf3,0xeb,0x94,0x2b,0x51,0x05,0xf5,0x5a, 0x44,0x0a,0x88,0x42,0x40,0xa0,0x12,0x89,0x54,0x09,0x28,0x44,0x54,0x12,0x24, 0x44,0xa8,0x04,0x82,0x10,0x44,0x40,0x81,0x00,0x04,0x50,0xf5,0x4a,0xf1,0x43, 0x22,0x28,0x0a,0x35,0x40,0x20,0x01,0xa2,0x02,0x11,0x01,0x41,0x89,0x10,0x02, 0xa2,0x28,0x44,0x11,0x15,0x54,0x54,0x91,0x04,0xf5,0x6a,0x1c,0x90,0x88,0x02, 0x41,0x60,0x15,0x0a,0xa4,0x08,0xa8,0x44,0x54,0x14,0x20,0x44,0x91,0x10,0x82, 0x12,0x44,0x40,0x01,0x02,0x04,0x51,0xf5,0xca,0x86,0x0a,0x22,0xa8,0x28,0x2a, 0x40,0x41,0x09,0x42,0x02,0x10,0x01,0x81,0x0a,0x11,0x24,0x8a,0x20,0x40,0x11, 0x12,0xa8,0x28,0x51,0x04,0xf5,0x5a,0x52,0x40,0x88,0x02,0x84,0xa0,0x12,0x14, 0x90,0x28,0x51,0x45,0x54,0x28,0xa0,0x44,0x81,0x40,0x14,0x15,0x84,0x88,0x02, 0x42,0x04,0x51,0xf5,0x4a,0x05,0x2a,0xfe,0xff,0x23,0x32,0x20,0x81,0x22,0x02, 0x04,0x10,0x01,0x05,0x09,0x10,0x28,0x14,0x42,0x20,0x51,0x42,0xa8,0x08,0x51, 0x04,0xf5,0xda,0xa1,0x00,0x03,0x00,0xff,0xac,0x8a,0x28,0x88,0x50,0xa1,0x44, 0x48,0x50,0x44,0x45,0x05,0x41,0x11,0x09,0x04,0x10,0x02,0x42,0x04,0xa1,0xf5, 0x4a,0x15,0xea,0xc3,0x0f,0x01,0x38,0x20,0x84,0x23,0x04,0xe8,0x11,0x22,0xf2, 0x21,0x10,0xae,0x14,0x58,0xe2,0xbf,0x8a,0xfe,0xdd,0x48,0x14,0xf5,0x6a,0x81, 0xf8,0xf7,0xcf,0x0d,0xba,0x0a,0x21,0x87,0xa2,0xca,0x44,0x09,0x99,0x8b,0xc4, 0x0c,0x40,0x1d,0xc8,0x66,0x40,0xcc,0xdd,0x0a,0x41,0xf5,0xca,0x57,0x0e,0x02, 0x08,0x01,0x38,0x40,0x94,0x27,0x10,0xdc,0x10,0x40,0x5c,0x21,0xc2,0x5d,0x15, 0xa0,0x42,0x2e,0x15,0xdd,0x86,0x2c,0x12,0xf5,0x5a,0xde,0x77,0x23,0x1d,0x23, 0xb3,0x2a,0xc1,0xee,0xe7,0xdf,0xc7,0x3f,0x39,0xee,0xf7,0x3d,0xfc,0x9f,0x97, 0xa6,0xe7,0xcd,0xf6,0x9e,0x40,0xf5,0x4a,0xf9,0x02,0xaa,0x38,0xce,0x34,0x00, 0xc8,0xc6,0xb6,0xcf,0xf6,0x6e,0xf4,0xa7,0xcd,0xec,0xee,0xde,0x24,0xc6,0xbe, 0xdf,0xc3,0x2d,0x14,0xf5,0xda,0xfe,0xff,0xff,0xef,0xff,0x7f,0xa9,0x52,0xed, 0xbe,0xef,0xe6,0x0f,0xd1,0xb7,0xdd,0x6e,0xfe,0xfb,0x0b,0xd7,0x7d,0xcf,0xd6, 0x8c,0x42,0xf5,0xca,0xff,0xff,0xff,0xdf,0xfe,0x3f,0x02,0xe0,0xcf,0x36,0xcf, 0x77,0x5d,0x88,0xed,0xcd,0xec,0x86,0x9f,0x47,0xc6,0x3c,0xef,0xce,0x2e,0x10, 0xf5,0x6a,0xff,0xff,0xc9,0x0e,0x02,0x70,0xa8,0x2a,0xdc,0x77,0xdf,0xe6,0x0c, 0xdd,0x9d,0xef,0x6d,0x6e,0xde,0x2e,0xd7,0x7f,0xcf,0xfd,0x1c,0x45,0xf5,0xca, 0x5e,0x05,0x84,0x4b,0xff,0x3f,0x02,0x70,0xff,0xfe,0xf9,0xde,0x5f,0xf8,0xda, 0x9d,0xff,0xfe,0xff,0x03,0x8f,0xef,0xff,0xfc,0x59,0x10,0xf5,0x5a,0x08,0x10, 0x89,0x27,0xfc,0xbf,0xa8,0xaa,0x28,0x41,0x05,0x42,0x12,0x12,0x48,0x20,0x82, 0x10,0x11,0x52,0x52,0xa0,0x24,0x05,0x05,0x45,0xf5,0xca,0x1a,0xc0,0x4d,0x43, 0xc0,0x30,0x02,0x00,0x02,0x14,0xa0,0x10,0x81,0x44,0x2f,0x8a,0x28,0x44,0x84, 0x08,0x84,0x04,0x00,0x50,0x50,0x10,0xf5,0x4a,0xfe,0xe7,0x2d,0x40,0x84,0xbf, 0x48,0xa5,0x50,0x41,0x15,0x44,0x54,0x10,0x16,0x21,0x02,0x11,0x21,0x42,0x21, 0x50,0x55,0x05,0x05,0x45,0xf5,0x6a,0x43,0xe0,0xbf,0x6c,0x99,0x3f,0x12,0x08, 0x0a,0x12,0x40,0x11,0x01,0x45,0x85,0x88,0xa8,0x44,0x94,0x28,0x14,0x05,0x00, 0x50,0x50,0x20,0xf5,0xca,0x15,0x0a,0xce,0x7f,0x98,0xbf,0x40,0xa1,0x40,0x44, 0x15,0x44,0x54,0x10,0x20,0x22,0x02,0x10,0x01,0x02,0x81,0xa0,0xaa,0x84,0x04, 0x8a,0xf5,0xda,0x40,0x41,0x36,0xf0,0x7e,0x24,0x14,0x08,0x14,0x11,0x40,0x01, 0x01,0x45,0x95,0x88,0x50,0x45,0xa8,0x50,0x28,0x0a,0x00,0x11,0xa2,0x20,0xf5, 0xca,0x14,0x14,0x12,0xba,0x01,0x69,0x81,0xaf,0x42,0x84,0x14,0x54,0x48,0x10, 0x70,0x22,0xe4,0x17,0x72,0x05,0xc2,0x41,0x75,0x5c,0x0f,0x0b,0xf5,0xda,0x42, 0x81,0x8e,0x98,0x54,0x22,0x54,0x06,0x10,0x22,0x41,0x01,0x22,0x84,0xe5,0x80, 0xc2,0x4c,0x99,0x51,0xa9,0x15,0x70,0xb7,0xed,0x45,0xf5,0x4a,0x10,0x54,0x40, 0x64,0x00,0x68,0x01,0x97,0x8a,0x13,0x14,0x54,0x09,0xe1,0x68,0x2a,0xd0,0x1d, 0xac,0x05,0x80,0x81,0x64,0xb6,0xcd,0x21,0xf5,0xda,0x24,0x01,0x2a,0x11,0xaa, 0x22,0x48,0xf6,0xf1,0xdf,0xf7,0x6d,0xf8,0xef,0xe1,0xb1,0xcb,0x8c,0x0e,0xf2, 0xfe,0x3d,0x71,0xf7,0x6d,0x14,0xf5,0x4a,0x42,0x54,0x01,0x84,0x00,0xb0,0x22, 0x6e,0xbb,0xf7,0x36,0xdb,0xfe,0xcd,0x6a,0x37,0xc5,0x47,0x9c,0xf8,0xf7,0x0d, 0x64,0x3c,0xff,0x81,0xf5,0x6a,0x08,0x01,0x54,0x51,0x54,0x25,0x08,0x67,0x7b, 0x33,0xb7,0xdb,0xfc,0xed,0x60,0x73,0xe1,0x14,0x4d,0x9c,0xef,0xa7,0x68,0x35, 0x6d,0x2b,0xf5,0xca,0x42,0x28,0x01,0x04,0x01,0xa8,0x42,0xee,0xf7,0x37,0x36, 0xff,0x8d,0xcf,0xf5,0x6b,0xcb,0x41,0x0c,0xb9,0xe7,0x1d,0xe2,0x58,0xe6,0x03, 0xf5,0x4a,0x28,0x42,0x54,0x51,0xa4,0x22,0x28,0x66,0xcb,0xb3,0x7e,0xdb,0xbc, 0xdd,0x60,0xe3,0xd0,0x38,0x5d,0xb9,0xef,0xfb,0x68,0x3e,0x6f,0x57,0xf5,0x6a, 0x82,0x08,0x01,0x04,0x09,0xb0,0x82,0x7f,0x7f,0x7e,0xee,0xdb,0xfb,0x9d,0xab, 0xd5,0xe5,0x73,0xf0,0xf4,0xfc,0x79,0xf2,0x86,0xd1,0x01,0xf5,0xca,0xff,0xff, 0xff,0xff,0xff,0x3f,0x28,0x90,0xa4,0x92,0x10,0x24,0x08,0x42,0x80,0x40,0x20, 0x08,0x25,0x82,0x4a,0xc4,0x10,0x51,0x85,0x54,0xf5,0x5a,0x24,0x42,0x24,0x41, 0x90,0x92,0x02,0x25,0x08,0x20,0x44,0x01,0xa1,0x10,0x29,0x7a,0x89,0x22,0x88, 0x28,0x10,0x31,0x44,0x08,0x20,0x02,0xf5,0x0a,0x81,0x10,0x11,0x14,0x25,0x44, 0xa8,0x80,0xa2,0x0a,0x11,0xa8,0x08,0x4a,0x84,0x70,0x22,0x08,0x21,0x82,0x42, 0x84,0x12,0xa2,0x8a,0x50,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/KModal.xbm0000644000076600007660000002140612327014024017013 0ustar gary#define KModal_width 220 #define KModal_height 61 static char KModal_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0x7f,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xf0,0xc9,0xff,0xcf,0x3f,0x7f, 0x7e,0x00,0x3f,0x00,0x00,0x3e,0x00,0xe0,0x01,0x00,0x00,0xf5,0x6a,0x00,0x00, 0x00,0xfc,0x1f,0xa0,0xaa,0xaa,0xaa,0x1e,0xcf,0x79,0x1e,0x4f,0x9c,0x78,0xaa, 0x8f,0xaa,0xaa,0xb8,0xaa,0xca,0x55,0x55,0x55,0xf5,0x4a,0x00,0x00,0x00,0x04, 0x10,0x20,0x00,0x00,0x00,0x4c,0xdd,0xfa,0x4c,0x1f,0x25,0xfa,0x81,0x2f,0x00, 0x00,0x3a,0x00,0xd0,0x01,0x00,0x00,0xf5,0x5a,0x00,0x00,0x00,0x24,0x10,0xa0, 0x4a,0x29,0xa5,0x1e,0x4c,0x78,0x0a,0x4f,0x8a,0xf8,0x68,0x1f,0x29,0xa5,0x78, 0xa5,0xc4,0x4b,0x29,0x55,0xf5,0x4a,0x00,0x00,0x00,0x24,0x10,0x20,0x10,0x42, 0x08,0x8e,0xda,0x7a,0x58,0x8f,0x21,0xec,0x43,0x4f,0x42,0x08,0x3a,0x08,0xd1, 0x11,0x42,0x00,0xf5,0x6a,0x00,0x00,0x00,0x64,0x10,0xa0,0x84,0x10,0x42,0x3f, 0x00,0x78,0x05,0xef,0x0a,0xe9,0x69,0x0f,0x78,0xe1,0x3b,0xf9,0xc4,0x43,0x08, 0x55,0xf5,0x4a,0x00,0x00,0x80,0xf7,0xf0,0x21,0x21,0x84,0x10,0xfc,0xaa,0x7a, 0x50,0xef,0xa0,0xd8,0xa1,0xaf,0xce,0xe4,0xbd,0xa4,0xd1,0x11,0x42,0x00,0xf5, 0x5a,0x00,0x00,0x80,0x94,0x11,0x61,0x94,0x52,0x4a,0xfe,0x03,0x78,0x05,0xff, 0x0a,0xcc,0x2b,0x1f,0xae,0x69,0x3a,0x8e,0xc7,0x45,0x11,0xa9,0xf5,0x4a,0x00, 0x00,0x80,0x14,0x13,0x21,0x01,0x00,0x80,0xf8,0x57,0x7d,0xa0,0xff,0x41,0xa9, 0x53,0x4f,0x87,0x73,0x78,0xaf,0xe3,0x11,0x48,0x02,0xf5,0x6a,0x00,0x00,0x80, 0x1c,0x16,0x21,0xa8,0xaa,0x2a,0xe2,0x0f,0x78,0x15,0xef,0x17,0x8a,0x1f,0x0f, 0xd7,0x77,0x3d,0xc8,0xcb,0x45,0x05,0x50,0xf5,0x4a,0x00,0x00,0x80,0x04,0x10, 0xa1,0x02,0x00,0x00,0x0a,0xaf,0x7a,0x40,0xdf,0x87,0xd8,0x57,0x5f,0x87,0x73, 0x38,0xb5,0xd3,0x11,0x50,0x05,0xf5,0x5a,0x00,0x00,0x80,0xfc,0x1f,0x61,0xa8, 0xaa,0xaa,0xa2,0x0e,0xf8,0x12,0x8f,0x2f,0x0a,0x1f,0x0f,0xa7,0xfb,0x7a,0xdc, 0xc7,0x45,0x05,0x50,0xf5,0x4a,0x00,0x00,0x80,0x00,0x00,0x21,0x02,0x00,0x00, 0x0e,0x5e,0x7d,0x44,0x5f,0x9f,0x48,0x4f,0xaf,0x97,0x73,0xb8,0x8e,0xe3,0x11, 0x50,0x05,0xf5,0x6a,0x00,0xfe,0x81,0xfc,0x1f,0x21,0x91,0x52,0xaa,0x46,0x07, 0xf8,0x10,0x0f,0x3e,0x2c,0x16,0x0f,0xc6,0x65,0x3a,0xae,0xcb,0x85,0x04,0x50, 0xf5,0x4a,0x00,0x02,0x86,0x04,0x10,0x61,0x24,0x84,0x00,0x1e,0x4b,0x7a,0x84, 0x4f,0x7f,0x19,0x87,0xaf,0xce,0xf1,0xbc,0xfe,0xd7,0x23,0x51,0x05,0xf5,0x5a, 0x00,0x12,0x88,0x24,0x10,0x21,0x01,0x21,0x54,0xf3,0x21,0xfe,0xd1,0x3f,0xff, 0xbe,0xd4,0x3f,0x78,0xc4,0x7b,0x1c,0xe3,0x13,0x04,0x50,0xf5,0x4a,0x00,0x32, 0x90,0x24,0x10,0x61,0x54,0x08,0x01,0x48,0x0a,0x01,0x45,0x90,0x08,0x02,0x24, 0x22,0x95,0x50,0x95,0xa2,0x24,0x44,0x91,0x04,0xf5,0x5a,0x00,0x32,0x90,0x64, 0x10,0x21,0x01,0xa5,0x54,0x05,0x41,0xaa,0x10,0x25,0xa2,0x50,0x81,0x88,0x00, 0x04,0x20,0x08,0x11,0x11,0x04,0x51,0xf5,0x4a,0x00,0x32,0xf0,0xf7,0xf0,0x2f, 0x54,0x00,0x00,0x50,0x28,0x00,0x44,0x80,0x08,0x0a,0x28,0x22,0xaa,0xa2,0x84, 0x42,0x44,0x24,0x51,0x04,0xf5,0x5a,0x00,0xda,0x97,0x94,0x11,0x61,0x01,0x55, 0xa5,0x04,0x05,0x55,0x11,0x2a,0xa2,0xa0,0x82,0x88,0x00,0x08,0x22,0x10,0x11, 0x41,0x04,0x51,0xf5,0x4a,0x00,0x02,0x90,0x14,0x13,0x21,0x54,0x00,0x08,0x51, 0xa0,0x00,0x44,0x81,0x08,0x0a,0x28,0x22,0xa8,0xa2,0x88,0x4a,0x44,0x08,0x51, 0x04,0xf5,0x5a,0x00,0x02,0x88,0x1c,0x16,0x21,0x01,0xaa,0x22,0x04,0x15,0x54, 0x11,0x24,0xa2,0xa0,0x02,0x88,0x02,0x08,0x22,0x00,0x11,0x22,0x04,0xa1,0xf5, 0x4a,0x00,0x02,0x86,0x04,0x10,0x61,0xa4,0x00,0x0b,0x41,0xe0,0x01,0x44,0xf1, 0x09,0x0a,0x5e,0x21,0x38,0xd1,0xbf,0x2a,0xee,0xdd,0x48,0x14,0xf5,0x5a,0x00, 0xfe,0x81,0xfc,0x1f,0x21,0x09,0x4a,0x43,0x14,0xda,0x28,0x11,0x9c,0x91,0xc0, 0x0c,0x08,0x5d,0x44,0x26,0x00,0xed,0xee,0x0a,0x41,0xf5,0x4a,0x00,0x00,0x80, 0x00,0x00,0x21,0xa0,0x90,0x2f,0x81,0xcc,0x42,0x04,0x59,0x45,0xd4,0xad,0xa2, 0x00,0xd1,0x6e,0xaa,0xcc,0x8e,0x2c,0x12,0xf5,0x5a,0x00,0x00,0x80,0xfc,0x1f, 0xa1,0x0a,0x84,0xe6,0xf7,0xff,0xcb,0xb7,0xb8,0xe6,0xe7,0x3d,0xbc,0xbf,0x27, 0x86,0xe7,0xdd,0xe2,0x9e,0x40,0xf5,0x4a,0x00,0x00,0x80,0x04,0x10,0x21,0x40, 0xe1,0xce,0xb6,0xcf,0xe6,0x6e,0xf4,0xb6,0xcd,0x6d,0xef,0xdd,0x8c,0xee,0xbe, 0xcf,0xd3,0x2d,0x14,0xf5,0x5a,0x00,0x00,0x80,0x24,0x10,0x61,0x15,0x54,0xdd, 0x76,0xdf,0xf6,0x1f,0xc9,0xa7,0xdd,0x7c,0xfe,0xdb,0x23,0xc6,0x7d,0xef,0xc7, 0x8c,0x42,0xf5,0x4a,0x00,0x00,0x80,0x24,0x10,0x21,0x40,0xe1,0xcf,0x36,0xcf, 0x67,0x4d,0xa8,0xef,0xcf,0xed,0x8e,0xbf,0x0f,0xd7,0x3c,0xcf,0xde,0x2e,0x10, 0xf5,0x5a,0x00,0x00,0x80,0x64,0x10,0x21,0x15,0x28,0xfc,0x7f,0xdf,0xee,0x1c, 0x9a,0x9d,0xdd,0x6c,0x6e,0xde,0x46,0xc6,0xfd,0xdf,0xdc,0x1c,0x45,0xf5,0x4a, 0x00,0x00,0x80,0xf7,0xf0,0x61,0x80,0xf2,0xfe,0xee,0xf9,0xce,0x5f,0xf9,0xd8, 0x9d,0xef,0xfd,0xff,0x2b,0xaf,0xe7,0xff,0xfe,0x59,0x10,0xf5,0x5a,0x00,0x00, 0x00,0x94,0x11,0x20,0x55,0x10,0x02,0x90,0x04,0x51,0x02,0x24,0x2d,0xa2,0x24, 0x80,0x04,0x02,0x49,0x12,0x80,0x48,0x05,0x45,0xf5,0x4a,0x00,0x00,0x00,0x14, 0x13,0x60,0x00,0x8a,0x50,0x05,0x51,0x04,0x50,0x41,0x8e,0x08,0x88,0x2a,0xa2, 0x50,0x82,0x88,0x2a,0x02,0x50,0x10,0xf5,0x5a,0x00,0x00,0x00,0x1c,0x16,0x20, 0x55,0x41,0x04,0x50,0x04,0xa1,0x0a,0x94,0x26,0xa2,0x22,0x80,0x10,0x04,0x28, 0x42,0x80,0x50,0x05,0x45,0xf5,0x4a,0x00,0x00,0x00,0x04,0x10,0x20,0x00,0x28, 0x52,0x05,0x51,0x14,0x40,0x01,0x92,0x08,0x88,0x2a,0x8a,0xa2,0x82,0x28,0x2a, 0x0a,0x50,0x20,0xf5,0x5a,0x00,0x00,0x00,0xfc,0x1f,0xa0,0x94,0x02,0x01,0x50, 0x04,0x41,0x15,0xa8,0x08,0xa2,0x22,0x80,0x40,0x10,0x10,0x02,0x81,0xa0,0x04, 0x8a,0xf5,0x4a,0x1c,0x0e,0xe0,0x00,0x00,0x20,0x41,0x50,0xa8,0x04,0x51,0x14, 0x80,0x02,0xa2,0x08,0x08,0x25,0x2a,0x8a,0x8a,0x50,0x14,0x09,0xa2,0x20,0xf5, 0x5a,0x18,0x07,0xc0,0x80,0x01,0x60,0x14,0x0f,0x02,0x48,0x04,0x41,0x55,0x90, 0x70,0x42,0xe2,0x8f,0xf0,0x21,0xe0,0x05,0x61,0x5c,0x0f,0x0b,0xf5,0x4a,0x18, 0x07,0x60,0x80,0x01,0x20,0x41,0x57,0x51,0x03,0x41,0x10,0x00,0x8a,0x6a,0x90, 0xd0,0x2c,0x9a,0x09,0x89,0x51,0x78,0xb7,0xed,0x45,0xf5,0x5a,0x9c,0xe2,0x78, 0xd6,0x00,0x20,0x12,0x06,0x04,0x57,0x14,0x85,0x54,0xe1,0xe0,0x0a,0xca,0x8c, 0x2c,0x45,0xa2,0x05,0x62,0xb6,0xcd,0x21,0xf5,0x4a,0x54,0xb3,0x6d,0xdb,0x00, 0xa0,0x88,0xfe,0xf3,0xdf,0xb7,0x7d,0xf9,0xef,0xeb,0x71,0xe3,0x2d,0x0c,0xf1, 0xbc,0x59,0xe9,0xfe,0x6d,0x14,0xf5,0x5a,0x74,0x9b,0xa7,0x59,0x00,0x20,0x42, 0x66,0xbb,0xb3,0x76,0xdb,0xdc,0xcd,0x60,0x37,0xc9,0x87,0x5e,0xdc,0xf7,0x1f, 0x64,0x3c,0xff,0x81,0xf5,0x4a,0xb6,0x99,0xb7,0x6d,0x00,0xa0,0x10,0x77,0x7b, 0x37,0x37,0xdb,0xfd,0xdd,0x6a,0x73,0xc3,0x28,0x0c,0xb9,0xef,0x87,0xf0,0x32, 0x6d,0x2b,0xf5,0x5a,0xb6,0xd9,0xb6,0x6d,0x01,0x20,0x4a,0xe6,0xf7,0x73,0x76, 0xdf,0x8c,0xcd,0x60,0x6b,0xe9,0x02,0x4d,0x98,0xe7,0x2d,0x62,0x58,0xe6,0x03, 0xf5,0x4a,0x97,0x73,0x6c,0xdb,0x00,0xa0,0x00,0x6e,0xcb,0x3b,0x3f,0xdb,0xde, 0xed,0xf5,0xe3,0xc2,0x78,0x9a,0xfd,0xff,0xfb,0x68,0x1e,0x6f,0x57,0xf5,0x5a, 0x00,0x00,0x00,0x00,0x00,0x20,0xaa,0x7f,0x7f,0x7e,0xec,0xfb,0xf9,0x9f,0xa1, 0xd5,0xe8,0x33,0xf8,0xf0,0xfc,0x79,0xf2,0xd6,0xd1,0x01,0xf5,0xca,0xff,0xff, 0xff,0xff,0xff,0xbf,0x00,0x00,0x51,0x21,0x95,0x04,0x12,0x40,0x24,0x40,0x42, 0x88,0x22,0x0a,0x02,0xc8,0x90,0x02,0x85,0x54,0xf5,0x4a,0x00,0x00,0x00,0x00, 0x00,0x22,0x54,0x55,0x04,0x44,0x20,0xa2,0x44,0x15,0x89,0xfa,0x28,0x22,0x08, 0xa1,0xa8,0x22,0x04,0x50,0x20,0x02,0xf5,0x2a,0xaa,0xaa,0xaa,0xaa,0xaa,0x10, 0x01,0x00,0x51,0x11,0x85,0x10,0x10,0x40,0x20,0x30,0x82,0x48,0xa2,0x08,0x02, 0x90,0xa2,0x0a,0x8a,0x50,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/KPluk.xbm0000644000076600007660000002140312327014024016667 0ustar gary#define KPluk_width 220 #define KPluk_height 61 static char KPluk_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, 0xbf,0xff,0xfe,0xbf,0xbe,0xaa,0xea,0x57,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, 0x53,0xbd,0xaa,0xaa,0xaa,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0x3e, 0xf8,0x7a,0x78,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0xf5,0x6a,0x02,0x66, 0x00,0x00,0x00,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x84,0xf2,0x71, 0x3d,0x55,0xd5,0x53,0x55,0x55,0x55,0x55,0x55,0xf5,0xca,0x81,0x44,0x55,0x55, 0x55,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x16,0xf4,0xf8,0x38,0x00, 0x80,0x07,0x00,0x00,0x00,0x00,0x00,0xf5,0x5a,0x40,0x69,0x00,0x00,0x00,0x60, 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x81,0xf0,0xf2,0xba,0x4a,0xa9,0xa3, 0x94,0x52,0x4a,0x29,0x55,0xf5,0x4a,0xc0,0x42,0x95,0x52,0x4a,0x29,0x42,0x08, 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x2a,0xfa,0xf4,0x38,0xcf,0x83,0xf7,0x21,0x84, 0x10,0x42,0x00,0xf5,0x6a,0x40,0x10,0x20,0x84,0x10,0x62,0x08,0x21,0x14,0xfd, 0x50,0x79,0x84,0xff,0x80,0xf0,0x71,0x7d,0xae,0xab,0x63,0x85,0x10,0x42,0x08, 0x55,0xf5,0xca,0x80,0x8a,0x84,0x10,0x42,0x28,0x42,0x08,0x41,0xfc,0x07,0x7a, 0x21,0xff,0x2a,0xf4,0x7a,0xb8,0x8e,0x83,0x37,0x20,0x84,0x10,0x42,0x00,0xf5, 0x5a,0x01,0x20,0x22,0x84,0x10,0xa2,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, 0x01,0xf1,0x1f,0x3a,0xde,0xab,0x53,0x15,0x51,0x44,0x11,0xa9,0xf5,0x4a,0x5a, 0x8a,0x10,0x51,0x44,0x31,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0xab,0xf4, 0xa0,0xb8,0x8e,0x87,0x1b,0x80,0x04,0x12,0x48,0x02,0xf5,0x6a,0x95,0x20,0x8a, 0x04,0x12,0xa4,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xdf,0x07,0xf0,0x0a,0x3a, 0xae,0xd3,0x3f,0x55,0x50,0x41,0x05,0x50,0xf5,0x4a,0x14,0x8a,0x40,0x50,0x41, 0x31,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x41,0xcf,0xaf,0xfa,0x20,0x79,0x8f,0x83, 0x7b,0x00,0x05,0x14,0x50,0x05,0xf5,0x5a,0xf1,0x20,0x14,0x05,0x14,0xa4,0xa8, 0x40,0x55,0x26,0x9e,0xf8,0x14,0x0f,0x1f,0xf0,0x4a,0x3c,0xae,0xab,0xfb,0x55, 0x50,0x41,0x05,0x50,0xf5,0x4a,0x84,0x09,0x41,0x20,0x21,0x31,0x02,0x2a,0x00, 0x8e,0x46,0x7c,0x40,0xaf,0x7e,0xf5,0x01,0xb9,0x9e,0x83,0xe3,0x00,0x05,0x14, 0x50,0x05,0xf5,0x6a,0x41,0xa3,0x14,0x4a,0x44,0xa4,0x90,0x80,0xaa,0x2e,0x0b, 0x79,0x15,0x0f,0x3e,0xf0,0x54,0x38,0xfc,0xd7,0xf7,0x49,0x20,0x81,0x04,0x50, 0xf5,0x4a,0x14,0x0a,0x40,0x81,0x1c,0x31,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc1, 0xbf,0xff,0xfe,0x03,0x7e,0x9d,0xc7,0xf7,0x23,0x8a,0x28,0x51,0x05,0xf5,0x6a, 0x81,0x42,0x15,0x28,0x7c,0xa0,0x12,0x89,0x54,0x09,0x28,0x22,0xaa,0x52,0x88, 0x10,0xa8,0x48,0xa2,0x20,0x80,0x8a,0x20,0x02,0x04,0x50,0xf5,0xca,0xf8,0x2b, 0x40,0x05,0xdd,0x35,0x40,0x20,0x01,0xa2,0x82,0x88,0x00,0x04,0x42,0x84,0x02, 0x22,0x08,0x8a,0x2a,0x20,0x8a,0x50,0x91,0x04,0xf5,0x5a,0x2e,0x80,0x12,0xe0, 0xb7,0x61,0x15,0x0a,0xa4,0x08,0x28,0x22,0xaa,0x50,0x11,0x51,0xa8,0x88,0xa2, 0x20,0x80,0x8a,0x20,0x0a,0x04,0x51,0xf5,0x4a,0x84,0x52,0x44,0xca,0x57,0x2b, 0x40,0x41,0x09,0x42,0x82,0x88,0x00,0x04,0x48,0x04,0x02,0x20,0x08,0x8a,0x2a, 0x20,0x8a,0x20,0x51,0x04,0xf5,0x6a,0x2b,0xa4,0x93,0xa0,0x6b,0xa3,0x12,0x14, 0x90,0x28,0x21,0x22,0x52,0x51,0x05,0xa2,0x48,0x85,0xa2,0x20,0x00,0x89,0x20, 0x44,0x04,0x51,0xf5,0x4a,0x01,0x31,0x1c,0x8a,0xa6,0x37,0x20,0x81,0x22,0x02, 0x88,0x88,0x04,0x04,0xa0,0x10,0x22,0x20,0x08,0x0a,0x55,0x22,0x08,0x11,0x51, 0x04,0xf5,0x6a,0x55,0x1c,0xf0,0xa0,0xeb,0xa3,0x8a,0x28,0x88,0x50,0x25,0x22, 0x50,0x51,0x15,0x8a,0x08,0x15,0x91,0xa0,0x00,0x88,0xa2,0x44,0x04,0xa1,0xf5, 0xca,0x81,0x0c,0x00,0xcf,0xbd,0x29,0x20,0x84,0x03,0x0a,0x70,0x08,0x05,0xf8, 0x80,0x20,0xa7,0x80,0x4c,0xe4,0x5f,0x21,0xf7,0x6e,0x48,0x14,0xf5,0x5a,0x25, 0xc2,0x1f,0xf8,0xb3,0xa4,0x0a,0xd1,0xa9,0x40,0xed,0x42,0x90,0xce,0x2a,0xca, 0x0e,0x2a,0x0e,0x29,0x37,0x88,0x6e,0x6e,0x05,0x41,0xf5,0x4a,0x8f,0x61,0xe8, 0x70,0x32,0x31,0x40,0xc4,0x03,0x14,0x66,0x10,0x45,0xac,0x80,0x60,0x96,0x80, 0x50,0x60,0x93,0x22,0xe6,0x43,0x2e,0x12,0xf5,0xda,0x9e,0x90,0x92,0xef,0x64, 0xa4,0x2a,0x51,0xfb,0xf1,0xef,0xeb,0x1b,0x9d,0xfb,0xfb,0x5e,0xde,0xcf,0x17, 0xcb,0xf3,0x66,0x79,0x8f,0x40,0xf5,0x4a,0x48,0x28,0x3f,0xbe,0x39,0x31,0x00, 0x64,0xe3,0xdf,0x6f,0x73,0x57,0x78,0xd3,0xe6,0x36,0x7f,0x6e,0x82,0x63,0xdf, 0xef,0xe3,0x26,0x14,0xf5,0x5a,0x3d,0xce,0xf0,0x3f,0x08,0xa4,0x52,0x61,0x77, 0xbb,0x67,0xf7,0x17,0xea,0xf7,0x6e,0xb6,0xff,0xfd,0x29,0xf7,0xbe,0x67,0x6b, 0x8e,0x42,0xf5,0xca,0x1f,0x63,0xd5,0x3f,0x5e,0x31,0x04,0xf8,0x67,0x9b,0x77, 0x73,0x8e,0xc4,0xd6,0x67,0x37,0xe3,0xcf,0x03,0x63,0x9e,0x77,0xe7,0x26,0x10, 0xf5,0xea,0x88,0x59,0xe0,0xfe,0x07,0x60,0xa1,0x12,0x6e,0xfb,0xe7,0xf3,0x46, 0xee,0xce,0x76,0x7e,0xaf,0xbf,0xab,0xeb,0xff,0xe7,0x6e,0x0e,0x45,0xf5,0xca, 0x6b,0x0a,0x9a,0xdf,0xa4,0x2a,0x14,0xb8,0xff,0xf7,0x7d,0xef,0x2f,0x7c,0xfd, 0xce,0x77,0xfe,0xff,0x85,0xc7,0xf3,0x7f,0xfe,0x4d,0x10,0xf5,0xda,0xbe,0xa8, 0x68,0x43,0x11,0x20,0x81,0x4a,0x14,0x0a,0x12,0x00,0x88,0x12,0x04,0x22,0x01, 0x01,0x00,0x41,0x28,0x08,0x12,0x12,0x20,0x45,0xf5,0x4a,0x3d,0xce,0xb7,0x17, 0x84,0x6a,0x28,0x10,0x41,0x20,0x88,0xaa,0x22,0x80,0xaf,0x48,0x54,0x54,0x55, 0x28,0x02,0xa5,0xa0,0x88,0x0a,0x10,0xf5,0x4a,0xf4,0x77,0x5b,0x23,0x21,0x20, 0x02,0x45,0x14,0x89,0x42,0x00,0x08,0x55,0x03,0x02,0x01,0x01,0x00,0x85,0xa8, 0x00,0x0a,0x42,0x40,0x45,0xf5,0xda,0x9e,0x20,0xbe,0x86,0x88,0x6a,0x51,0x10, 0x41,0x22,0x28,0xaa,0xa2,0x00,0xa9,0x50,0x54,0x54,0x55,0x20,0x02,0xaa,0xa0, 0x28,0x2a,0x20,0xf5,0x4a,0x2e,0xfe,0x5c,0x2e,0x24,0x20,0x08,0x42,0x14,0x48, 0x82,0x00,0x08,0x2a,0x02,0x0a,0x01,0x01,0x00,0x8a,0xa8,0x00,0x0a,0x02,0x81, 0x8a,0xf5,0x6a,0x87,0xfe,0x71,0x85,0x02,0xb5,0xa2,0x08,0x81,0x02,0x24,0x4a, 0x91,0x80,0xa8,0x40,0x54,0xa8,0xaa,0x20,0x02,0xaa,0xa0,0x50,0x28,0x20,0xf5, 0x4a,0x11,0x7f,0x41,0x26,0x50,0x20,0x88,0x47,0x54,0x50,0x89,0x10,0x22,0x2a, 0x38,0x14,0xf1,0x03,0xb8,0x8a,0xf0,0x00,0x34,0x8e,0x83,0x0b,0xf5,0xea,0xc9, 0xff,0xc1,0x8e,0x0a,0xaa,0x42,0x17,0x01,0x0b,0x20,0x42,0x88,0xc0,0x72,0x41, 0x64,0x4f,0xcd,0x20,0xc4,0x4a,0xb9,0xdf,0xf7,0x40,0xf5,0xca,0x85,0xff,0x40, 0x25,0xa0,0x30,0x10,0x43,0xa8,0x41,0x89,0x10,0x02,0x69,0x34,0x14,0x68,0x16, 0xa6,0x89,0xe2,0x10,0x34,0xfb,0x66,0x2a,0xf5,0x5a,0xd0,0xbf,0x80,0x86,0x0a, 0xa2,0x4a,0xfb,0xfa,0xef,0xdb,0xb7,0xfc,0xf3,0xf1,0xd9,0xe3,0x86,0x16,0x78, 0xde,0x4d,0x71,0xdb,0xbe,0x00,0xf5,0xca,0xa4,0x9f,0x84,0x2b,0xa0,0x30,0x20, 0xb7,0xcd,0x5d,0x9b,0x6d,0xfe,0x6e,0xb4,0x99,0xe8,0x53,0x86,0xee,0xfb,0x16, 0x34,0x9e,0xf7,0xaa,0xf5,0x5a,0x79,0xa2,0x0f,0x43,0x0a,0xa4,0x8a,0xb3,0xbd, 0x59,0xbf,0x7f,0xff,0x66,0xb1,0xbb,0x62,0x04,0x57,0xdc,0xf7,0x43,0xb1,0xba, 0xb6,0x01,0xf5,0x4a,0xb4,0xd5,0x1e,0x8b,0xa0,0x32,0x00,0xfb,0xfb,0x1d,0x9b, 0x6d,0xc6,0x77,0xb8,0xb1,0x70,0x51,0x0e,0xcd,0xf3,0x16,0x38,0x0c,0xbb,0x53, 0xf5,0xda,0x5b,0x41,0x23,0x26,0x0a,0x60,0x55,0xb3,0xf5,0x59,0xbf,0xed,0xde, 0xe6,0xf2,0x75,0x65,0x9a,0xac,0xfc,0xff,0xbe,0x72,0xcf,0xb3,0x05,0xf5,0x4a, 0x76,0xff,0x55,0x84,0xa0,0x2a,0x80,0xbf,0xbf,0x3f,0xf6,0xed,0xfc,0xce,0xd4, 0xe8,0xf0,0x18,0x7a,0x7a,0xfe,0x3c,0x78,0xd3,0xe9,0x50,0xf5,0xda,0xff,0xff, 0xff,0xff,0xff,0x7f,0xaa,0x44,0x04,0xa4,0x02,0x25,0x05,0x29,0x20,0x22,0x2a, 0xa5,0x00,0x01,0x81,0xa2,0x0a,0x08,0xa2,0x04,0xf5,0x4a,0x00,0x09,0x01,0x12, 0x04,0x80,0x00,0x10,0x51,0x09,0x50,0x10,0x50,0x82,0x0a,0xb9,0x40,0x08,0xaa, 0xa8,0x28,0x38,0x40,0x45,0x08,0x51,0xf5,0x0a,0x55,0x44,0xa8,0x44,0x51,0x15, 0x54,0x45,0x04,0xa0,0x0a,0x85,0x04,0x28,0x40,0x3c,0x0a,0xa1,0x00,0x04,0x84, 0x82,0x2a,0x20,0x22,0x04,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/KVoiceFM.xbm0000644000076600007660000002141412327014024017246 0ustar gary#define KVoiceFM_width 220 #define KVoiceFM_height 61 static char KVoiceFM_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, 0xbf,0x7f,0xff,0xfb,0x55,0xd5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0xca, 0xaa,0xaa,0xfa,0xea,0xbd,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0xbe, 0xfc,0xe0,0x02,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x5a,0x00,0x00, 0x06,0x10,0x36,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x0c,0x7c,0xca, 0x50,0xd5,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a,0x55,0xd5,0x91,0x84, 0x2c,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x42,0x79,0x40,0x04,0x80, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x6a,0x00,0x60,0x08,0x51,0x78,0x60, 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x13,0xf4,0x6a,0x22,0x55,0x29,0xa5, 0x94,0x52,0x4a,0x29,0x55,0xf5,0xca,0x52,0x3a,0x45,0x04,0xf2,0x29,0x42,0x08, 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x44,0xf1,0x20,0xe9,0xc1,0x03,0x0f,0x79,0x84, 0x10,0x42,0x00,0xf5,0x4a,0x04,0x4c,0x10,0xa1,0xe0,0x63,0x08,0x21,0x14,0xfd, 0x50,0x79,0x84,0xff,0x10,0xf4,0x5b,0x30,0x97,0xd7,0x79,0xc6,0x10,0x42,0x08, 0x55,0xf5,0x5a,0xa1,0x06,0xff,0x09,0x4a,0x2b,0x42,0x08,0x41,0xfc,0x07,0x7a, 0x21,0xff,0x45,0xe1,0x11,0x9d,0x86,0xc3,0x3c,0xee,0x85,0x10,0x42,0x00,0xf5, 0x4a,0x88,0xd3,0x01,0xff,0xc7,0xa6,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, 0x11,0xd2,0x5b,0x5c,0xde,0xeb,0xb9,0xc7,0x51,0x44,0x11,0xa9,0xf5,0x6a,0xc5, 0x38,0x24,0x00,0x9c,0x3c,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0x47,0xc4, 0x1b,0x1d,0x8e,0xe3,0x24,0xff,0x05,0x12,0x48,0x02,0xf5,0x4a,0x60,0x0e,0x01, 0x49,0x90,0xab,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xcf,0x17,0xa1,0x4f,0xbc, 0xae,0xeb,0x01,0x27,0x50,0x41,0x05,0x50,0xf5,0x6a,0xb5,0xe1,0xff,0x10,0x35, 0x2a,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x89,0xaf,0x4f,0x94,0x17,0x1e,0x8e,0xe7, 0xa8,0x0f,0x05,0x14,0x50,0x05,0xf5,0x4a,0xd0,0x38,0xc0,0x5f,0xe0,0xbe,0xa8, 0x40,0x55,0x26,0x9e,0xf8,0x20,0x0f,0x1f,0xc1,0x87,0x5c,0xaf,0xf3,0x05,0xaf, 0x50,0x41,0x05,0x50,0xf5,0xda,0x5a,0x8e,0x14,0xe0,0x75,0x26,0x02,0x2a,0x00, 0x8e,0x46,0x7c,0x0a,0xaf,0x3e,0x14,0x57,0x1a,0x96,0xc3,0x63,0x0e,0x05,0x14, 0x50,0x05,0xf5,0x4a,0xcc,0x23,0x00,0x89,0x12,0xb2,0x90,0x80,0xaa,0x2e,0x0b, 0x79,0xa0,0x0f,0x7e,0x81,0x07,0xb0,0xc3,0xab,0x9f,0xfe,0x21,0x81,0x04,0x50, 0xf5,0x6a,0x66,0x88,0xaa,0x10,0xb4,0x60,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc9, 0x7f,0xff,0x28,0xa2,0xea,0xcb,0x07,0x2f,0x3a,0x88,0x28,0x51,0x05,0xf5,0xca, 0x36,0x22,0x00,0x5e,0x3d,0x2a,0x12,0x89,0x54,0x09,0x28,0x92,0x22,0x88,0x04, 0x82,0x12,0x20,0x20,0x52,0x89,0x48,0x25,0x02,0x04,0x50,0xf5,0x5a,0x93,0x88, 0xfa,0xe3,0xe8,0x20,0x41,0x20,0x01,0xa2,0x82,0x40,0x88,0x12,0xa1,0x28,0x88, 0x0a,0x89,0x04,0x22,0x22,0x80,0x50,0x91,0x04,0xf5,0xca,0x01,0x7f,0x0f,0x88, 0xca,0x6a,0x14,0x0a,0xa4,0x08,0x28,0x14,0x22,0x40,0x14,0x42,0x42,0x40,0x22, 0xa0,0x88,0x88,0x2a,0x0a,0x04,0x51,0xf5,0xca,0xd4,0x01,0x40,0xe2,0xf8,0x20, 0x41,0x41,0x09,0x42,0x82,0x82,0x08,0x15,0x81,0x08,0x11,0x2a,0x88,0x0a,0x02, 0x22,0x80,0x20,0x51,0x04,0xf5,0xda,0x60,0xa0,0x94,0x3c,0x24,0x35,0x12,0x14, 0x90,0x28,0x24,0x28,0xa2,0x40,0x28,0x22,0x44,0x81,0x22,0xa0,0x50,0x08,0x29, 0x44,0x04,0x51,0xf5,0x4a,0x34,0x0a,0x01,0x87,0x1e,0xa0,0x20,0x81,0x22,0x02, 0x89,0x82,0x08,0x0a,0x85,0x08,0x11,0x28,0x88,0x0a,0x0a,0x42,0x02,0x11,0x51, 0x04,0xf5,0x6a,0x11,0x41,0x28,0xf1,0x7b,0x35,0x8a,0x28,0x88,0xa8,0x20,0x28, 0x91,0x40,0x20,0x42,0x84,0x02,0x21,0x90,0xa0,0x28,0xa8,0x44,0x04,0xa1,0xf5, 0x4a,0x5a,0x14,0xc5,0x3d,0x60,0xa0,0x20,0x84,0x03,0x02,0x74,0x02,0x44,0xfc, 0x8a,0x28,0x27,0xa8,0x4c,0xe2,0x1f,0x82,0xf7,0x6e,0x48,0x14,0xf5,0xda,0x08, 0x41,0x60,0x04,0x69,0x29,0x0a,0xd1,0xa9,0x50,0xe5,0x50,0x01,0xdd,0x20,0xc2, 0x96,0x02,0x8e,0x28,0xb7,0x24,0x66,0x6e,0x05,0x41,0xf5,0x4a,0x4c,0x14,0x35, 0x46,0x3c,0xa4,0x40,0xc4,0x03,0x04,0x6e,0x04,0x54,0x8c,0x8a,0x68,0x06,0x90, 0x28,0x62,0x13,0x88,0xee,0x43,0x2e,0x12,0xf5,0x5a,0x15,0x41,0xf0,0x13,0x46, 0x31,0x2a,0x51,0xfb,0xf3,0xef,0xf3,0x1b,0x5d,0xf3,0xf3,0x5f,0xdf,0xcf,0x13, 0xd3,0xf3,0x66,0x79,0x8f,0x40,0xf5,0x4a,0x44,0x14,0x05,0x88,0x12,0xa4,0x00, 0x64,0x67,0xdf,0x6f,0x73,0x57,0x78,0xd7,0x6e,0x3e,0x77,0x6e,0x8a,0xe7,0xdf, 0xef,0xe3,0x26,0x14,0xf5,0x6a,0x15,0x41,0x40,0x42,0x4a,0x31,0xa9,0xa8,0x76, 0xbb,0x67,0xf7,0x17,0xea,0xf3,0xe6,0x76,0xff,0xfd,0x23,0x6b,0xbe,0x67,0x6b, 0x8e,0x42,0xf5,0x4a,0x44,0x10,0x95,0x28,0x03,0x24,0x02,0xf2,0x67,0x9b,0x77, 0xb3,0x86,0xd4,0xd6,0x6f,0x36,0xe7,0xcf,0x0b,0xe3,0x9e,0x77,0xe7,0x26,0x10, 0xf5,0x6a,0x1d,0x45,0x00,0x02,0xaa,0xa8,0xa8,0x30,0xee,0xbb,0xe7,0x7b,0x2e, 0xcd,0xcf,0xe6,0x76,0x2f,0x6f,0x43,0xeb,0xbe,0xe7,0x6e,0x0e,0x45,0xf5,0x4a, 0x50,0x10,0xaa,0x50,0x05,0x22,0x02,0xba,0x7f,0xff,0x7c,0xe7,0x0f,0x7c,0xfc, 0xde,0x77,0xfe,0xff,0xa9,0xc7,0xf7,0x7f,0xfe,0x4d,0x10,0xf5,0x6a,0x35,0x85, 0x00,0x0a,0xac,0xb0,0xa8,0x08,0x92,0xa0,0x12,0x24,0x51,0x49,0x06,0x01,0x09, 0x41,0x89,0x04,0x52,0x20,0x11,0x12,0x20,0x45,0xf5,0xca,0x60,0x50,0xaa,0x40, 0x0d,0x24,0x02,0x42,0x08,0x0a,0x44,0x41,0x04,0x22,0x57,0x48,0x44,0x14,0x20, 0xa2,0x04,0x4a,0x84,0x88,0x0a,0x10,0xf5,0xda,0x44,0x05,0x00,0x14,0xa8,0xb2, 0x90,0x28,0xa2,0x40,0x11,0x14,0xa1,0x08,0x03,0x12,0x11,0x81,0x8a,0x10,0x50, 0x01,0x51,0x42,0x40,0x45,0xf5,0xca,0x62,0xa0,0x52,0x01,0x08,0x20,0x24,0x82, 0x08,0x14,0x44,0x41,0x08,0xa2,0x54,0x41,0x44,0x28,0x20,0x44,0x05,0x54,0x04, 0x28,0x2a,0x20,0xf5,0xda,0x28,0x0a,0x04,0x84,0x8a,0xa2,0x82,0x28,0x42,0x81, 0x10,0x14,0x45,0x08,0x02,0x14,0x11,0x05,0x09,0x11,0x20,0x01,0xa1,0x02,0x81, 0x8a,0xf5,0xca,0x32,0xe1,0x5f,0x21,0x06,0x30,0x28,0x82,0x10,0x54,0x44,0x41, 0x20,0xa2,0x50,0x41,0x44,0x50,0xa2,0x84,0x4a,0x54,0x14,0x50,0x28,0x20,0xf5, 0x5a,0x50,0xbc,0xf0,0xef,0x89,0xa0,0x82,0x27,0x4a,0x01,0x11,0x12,0x8a,0x08, 0x3a,0x08,0xf1,0x07,0xb8,0x20,0xe0,0x01,0x71,0x8f,0x83,0x0b,0xf5,0x4a,0x15, 0x06,0x04,0x44,0x02,0x20,0x50,0x8b,0x00,0x55,0x44,0x44,0x21,0xc2,0x34,0x45, 0x68,0xa6,0xce,0x95,0xca,0x48,0x38,0xdf,0xf7,0x40,0xf5,0x6a,0x98,0x53,0x51, 0x01,0x20,0x64,0x05,0x23,0xaa,0x01,0x81,0x10,0x88,0x70,0xb0,0x10,0xe5,0x16, 0xae,0x00,0xd0,0x12,0x35,0xfb,0x66,0x2a,0xf5,0x4a,0x49,0x09,0x04,0x08,0x04, 0x30,0x50,0xff,0xf8,0xef,0xdf,0xb6,0xfe,0xf7,0xfa,0xba,0x61,0x86,0x86,0xfc, 0xde,0x4c,0x70,0xdb,0xbe,0x00,0xf5,0x6a,0x1c,0x45,0xa1,0xa2,0x22,0x22,0x05, 0xb3,0xcd,0x5d,0xbb,0x6f,0xee,0xe6,0xb0,0x99,0xf4,0x2b,0x16,0xed,0xfb,0x0e, 0x35,0x9e,0xf7,0xaa,0xf5,0x4a,0x85,0x21,0x08,0x00,0x40,0x60,0xa0,0xf3,0xbf, 0x59,0x9b,0x7d,0xfe,0x6e,0xb4,0xbb,0x61,0x82,0x46,0xdc,0xf7,0x43,0xb0,0xba, 0xb6,0x01,0xf5,0x6a,0x24,0x0b,0xa5,0x8a,0x0a,0x25,0x0a,0xb7,0xf9,0x3b,0xbb, 0xed,0xd6,0x66,0xb2,0xb1,0xe8,0x28,0x16,0xcd,0xf3,0x2e,0x3a,0x0c,0xbb,0x53, 0xf5,0xca,0x16,0xa1,0x00,0x40,0x40,0x60,0x41,0xb3,0xf7,0x99,0x9f,0x6d,0xce, 0xf7,0xf8,0x75,0x65,0x1a,0x8d,0xdc,0xff,0x3d,0xb1,0xce,0xb3,0x05,0xf5,0x5a, 0x82,0x09,0xaa,0x0a,0x85,0x24,0x94,0xbf,0x7f,0x3f,0xf6,0xef,0xfd,0xce,0xd2, 0x61,0xf0,0xb8,0xfc,0x7a,0xfe,0xbc,0x78,0xd3,0xe9,0x50,0xf5,0xca,0xff,0xff, 0xff,0xff,0xff,0x3f,0x21,0x49,0x00,0x92,0x4a,0x20,0x48,0x20,0x08,0xb4,0x2a, 0x05,0x20,0x48,0x21,0x22,0x4a,0x0a,0xa2,0x04,0xf5,0x2a,0x52,0x44,0x00,0x20, 0x10,0x50,0x44,0x20,0x2a,0x21,0x20,0x8a,0x22,0x8a,0xa2,0x38,0x40,0x90,0x8a, 0x22,0x88,0x98,0x80,0x40,0x08,0x51,0xf5,0x8a,0x04,0x11,0xaa,0x0a,0x45,0x05, 0x11,0x0a,0x81,0x08,0x09,0x21,0x08,0x21,0x08,0x9a,0x0a,0x45,0x20,0x88,0x22, 0x22,0x2a,0x2a,0x22,0x04,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/KVoicForm.xbm0000644000076600007660000002141712327014024017505 0ustar gary#define KVoicForm_width 220 #define KVoicForm_height 61 static char KVoicForm_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, 0xbf,0x7f,0xff,0xfb,0x55,0xd5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0xca, 0xaa,0xaa,0xfa,0xea,0xbd,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0xbe, 0xfc,0xe0,0x02,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x5a,0x00,0x00, 0x06,0x10,0x36,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x0c,0x7c,0xca, 0x50,0xd5,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a,0x55,0xd5,0x91,0x84, 0x2c,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x42,0x79,0x40,0x04,0x80, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x6a,0x00,0x60,0x08,0x51,0x78,0x60, 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x13,0xf4,0x6a,0x22,0x55,0x29,0xa5, 0x94,0x52,0x4a,0x29,0x55,0xf5,0xca,0x52,0x3a,0x45,0x04,0xf2,0x29,0x42,0x08, 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x44,0xf1,0x20,0xe9,0xc1,0x03,0x0f,0x79,0x84, 0x10,0x42,0x00,0xf5,0x4a,0x04,0x4c,0x10,0xa1,0xe0,0x63,0x08,0x21,0x14,0xfd, 0x50,0x79,0x84,0xff,0x10,0xf4,0x5b,0x30,0x97,0xd7,0x79,0xc6,0x10,0x42,0x08, 0x55,0xf5,0x5a,0xa1,0x06,0xff,0x09,0x4a,0x2b,0x42,0x08,0x41,0xfc,0x07,0x7a, 0x21,0xff,0x45,0xe1,0x11,0x9d,0x86,0xc3,0x3c,0xee,0x85,0x10,0x42,0x00,0xf5, 0x4a,0x88,0xd3,0x01,0xff,0xc7,0xa6,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, 0x11,0xd2,0x5b,0x5c,0xde,0xeb,0xb9,0xc7,0x51,0x44,0x11,0xa9,0xf5,0x6a,0xc5, 0x38,0x24,0x00,0x9c,0x3c,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0x47,0xc4, 0x1b,0x1d,0x8e,0xe3,0x24,0xff,0x05,0x12,0x48,0x02,0xf5,0x4a,0x60,0x0e,0x01, 0x49,0x90,0xab,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xcf,0x17,0xa1,0x4f,0xbc, 0xae,0xeb,0x01,0x27,0x50,0x41,0x05,0x50,0xf5,0x6a,0xb5,0xe1,0xff,0x10,0x35, 0x2a,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x89,0xaf,0x4f,0x94,0x17,0x1e,0x8e,0xe7, 0xa8,0x0f,0x05,0x14,0x50,0x05,0xf5,0x4a,0xd0,0x38,0xc0,0x5f,0xe0,0xbe,0xa8, 0x40,0x55,0x26,0x9e,0xf8,0x20,0x0f,0x1f,0xc1,0x87,0x5c,0xaf,0xf3,0x05,0xaf, 0x50,0x41,0x05,0x50,0xf5,0xda,0x5a,0x8e,0x14,0xe0,0x75,0x26,0x02,0x2a,0x00, 0x8e,0x46,0x7c,0x0a,0xaf,0x3e,0x14,0x57,0x1a,0x96,0xc3,0x63,0x0e,0x05,0x14, 0x50,0x05,0xf5,0x4a,0xcc,0x23,0x00,0x89,0x12,0xb2,0x90,0x80,0xaa,0x2e,0x0b, 0x79,0xa0,0x0f,0x7e,0x81,0x07,0xb0,0xc3,0xab,0x9f,0xfe,0x21,0x81,0x04,0x50, 0xf5,0x6a,0x66,0x88,0xaa,0x10,0xb4,0x60,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc9, 0x7f,0xff,0x28,0xa2,0xea,0xcb,0x07,0x2f,0x3a,0x88,0x28,0x51,0x05,0xf5,0xca, 0x36,0x22,0x00,0x5e,0x3d,0x2a,0x12,0x89,0x54,0x09,0x28,0x92,0x22,0x88,0x04, 0x82,0x12,0x20,0x20,0x52,0x89,0x48,0x25,0x02,0x04,0x50,0xf5,0x5a,0x93,0x88, 0xfa,0xe3,0xe8,0x20,0x41,0x20,0x01,0xa2,0x82,0x40,0x88,0x12,0xa1,0x28,0x88, 0x0a,0x89,0x04,0x22,0x22,0x80,0x50,0x91,0x04,0xf5,0xca,0x01,0x7f,0x0f,0x88, 0xca,0x6a,0x14,0x0a,0xa4,0x08,0x28,0x14,0x22,0x40,0x14,0x42,0x42,0x40,0x22, 0xa0,0x88,0x88,0x2a,0x0a,0x04,0x51,0xf5,0xca,0xd4,0x01,0x40,0xe2,0xf8,0x20, 0x41,0x41,0x09,0x42,0x82,0x82,0x08,0x15,0x81,0x08,0x11,0x2a,0x88,0x0a,0x02, 0x22,0x80,0x20,0x51,0x04,0xf5,0xda,0x60,0xa0,0x94,0x3c,0x24,0x35,0x12,0x14, 0x90,0x28,0x24,0x28,0xa2,0x40,0x28,0x22,0x44,0x81,0x22,0xa0,0x50,0x08,0x29, 0x44,0x04,0x51,0xf5,0x4a,0x34,0x0a,0x01,0x87,0x1e,0xa0,0x20,0x81,0x22,0x02, 0x89,0x82,0x08,0x0a,0x85,0x08,0x11,0x28,0x88,0x0a,0x0a,0x42,0x02,0x11,0x51, 0x04,0xf5,0x6a,0x11,0x41,0x28,0xf1,0x7b,0x35,0x8a,0x28,0x88,0xa8,0x20,0x28, 0x91,0x40,0x20,0x42,0x84,0x02,0x21,0x90,0xa0,0x28,0xa8,0x44,0x04,0xa1,0xf5, 0x4a,0x5a,0x14,0xc5,0x3d,0x60,0xa0,0x20,0x84,0x03,0x02,0x74,0x02,0x44,0xfc, 0x8a,0x28,0x27,0xa8,0x4c,0xe2,0x1f,0x82,0xf7,0x6e,0x48,0x14,0xf5,0xda,0x08, 0x41,0x60,0x04,0x69,0x29,0x0a,0xd1,0xa9,0x50,0xe5,0x50,0x01,0xdd,0x20,0xc2, 0x96,0x02,0x8e,0x28,0xb7,0x24,0x66,0x6e,0x05,0x41,0xf5,0x4a,0x4c,0x14,0x35, 0x46,0x3c,0xa4,0x40,0xc4,0x03,0x04,0x6e,0x04,0x54,0x8c,0x8a,0x68,0x06,0x90, 0x28,0x62,0x13,0x88,0xee,0x43,0x2e,0x12,0xf5,0x5a,0x15,0x41,0xf0,0x13,0x46, 0x31,0x2a,0x51,0xfb,0xf3,0xef,0xf3,0x1b,0x5d,0xf3,0xf3,0x5f,0xdf,0xcf,0x13, 0xd3,0xf3,0x66,0x79,0x8f,0x40,0xf5,0x4a,0x44,0x14,0x05,0x88,0x12,0xa4,0x00, 0x64,0x67,0xdf,0x6f,0x73,0x57,0x78,0xd7,0x6e,0x3e,0x77,0x6e,0x8a,0xe7,0xdf, 0xef,0xe3,0x26,0x14,0xf5,0x6a,0x15,0x41,0x40,0x42,0x4a,0x31,0xa9,0xa8,0x76, 0xbb,0x67,0xf7,0x17,0xea,0xf3,0xe6,0x76,0xff,0xfd,0x23,0x6b,0xbe,0x67,0x6b, 0x8e,0x42,0xf5,0x4a,0x44,0x10,0x95,0x28,0x03,0x24,0x02,0xf2,0x67,0x9b,0x77, 0xb3,0x86,0xd4,0xd6,0x6f,0x36,0xe7,0xcf,0x0b,0xe3,0x9e,0x77,0xe7,0x26,0x10, 0xf5,0x6a,0x1d,0x45,0x00,0x02,0xaa,0xa8,0xa8,0x30,0xee,0xbb,0xe7,0x7b,0x2e, 0xcd,0xcf,0xe6,0x76,0x2f,0x6f,0x43,0xeb,0xbe,0xe7,0x6e,0x0e,0x45,0xf5,0x4a, 0x50,0x10,0xaa,0x50,0x05,0x22,0x02,0xba,0x7f,0xff,0x7c,0xe7,0x0f,0x7c,0xfc, 0xde,0x77,0xfe,0xff,0xa9,0xc7,0xf7,0x7f,0xfe,0x4d,0x10,0xf5,0x6a,0x35,0x85, 0x00,0x0a,0xac,0xb0,0xa8,0x08,0x92,0xa0,0x12,0x24,0x51,0x49,0x06,0x01,0x09, 0x41,0x89,0x04,0x52,0x20,0x11,0x12,0x20,0x45,0xf5,0xca,0x60,0x50,0xaa,0x40, 0x0d,0x24,0x02,0x42,0x08,0x0a,0x44,0x41,0x04,0x22,0x57,0x48,0x44,0x14,0x20, 0xa2,0x04,0x4a,0x84,0x88,0x0a,0x10,0xf5,0xda,0x44,0x05,0x00,0x14,0xa8,0xb2, 0x90,0x28,0xa2,0x40,0x11,0x14,0xa1,0x08,0x03,0x12,0x11,0x81,0x8a,0x10,0x50, 0x01,0x51,0x42,0x40,0x45,0xf5,0xca,0x62,0x10,0x20,0x00,0x0a,0x20,0x24,0x82, 0x08,0x14,0x44,0x41,0x08,0xa2,0x54,0x41,0x44,0x28,0x20,0x44,0x05,0x54,0x04, 0x28,0x2a,0x20,0xf5,0xda,0xa8,0x84,0x0a,0x42,0x88,0xa2,0x82,0x28,0x42,0x81, 0x10,0x14,0x45,0x08,0x02,0x14,0x11,0x05,0x09,0x11,0x20,0x01,0xa1,0x02,0x81, 0x8a,0xf5,0xca,0x32,0xc2,0x8f,0x88,0x02,0x30,0x28,0x82,0x10,0x54,0x44,0x41, 0x20,0xa2,0x50,0x41,0x44,0x50,0xa2,0x84,0x4a,0x54,0x14,0x50,0x28,0x20,0xf5, 0x5a,0x90,0x18,0xd0,0xeb,0x89,0xa0,0x82,0x27,0x4a,0x01,0x11,0x12,0x8a,0x08, 0x3a,0x08,0xf1,0x07,0xb8,0x20,0xe0,0x01,0x71,0x8f,0x83,0x0b,0xf5,0x4a,0x15, 0x96,0x4a,0x00,0x00,0x20,0x50,0x8b,0x00,0x55,0x44,0x44,0x21,0xc2,0x34,0x45, 0x68,0xa6,0xce,0x95,0xca,0x48,0x38,0xdf,0xf7,0x40,0xf5,0x6a,0xb8,0x07,0x00, 0x02,0x22,0x64,0x05,0x23,0xaa,0x01,0x81,0x10,0x88,0x70,0xb0,0x10,0xe5,0x16, 0xae,0x00,0xd0,0x12,0x35,0xfb,0x66,0x2a,0xf5,0x4a,0x09,0x09,0x90,0x48,0x04, 0x30,0x50,0xff,0xf8,0xef,0xdf,0xb6,0xfe,0xf7,0xfa,0xba,0x61,0x86,0x86,0xfc, 0xde,0x4c,0x70,0xdb,0xbe,0x00,0xf5,0x6a,0x4c,0x41,0x45,0x00,0x20,0x22,0x05, 0xb3,0xcd,0x5d,0xbb,0x6f,0xee,0xe6,0xb0,0x99,0xf4,0x2b,0x16,0xed,0xfb,0x0e, 0x35,0x9e,0xf7,0xaa,0xf5,0x4a,0x05,0x0b,0x00,0xa2,0x44,0x60,0xa0,0xf3,0xbf, 0x59,0x9b,0x7d,0xfe,0x6e,0xb4,0xbb,0x61,0x82,0x46,0xdc,0xf7,0x43,0xb0,0xba, 0xb6,0x01,0xf5,0x5a,0x54,0x81,0x8a,0x00,0x00,0x25,0x0a,0xb7,0xf9,0x3b,0xbb, 0xed,0xd6,0x66,0xb2,0xb1,0xe8,0x28,0x16,0xcd,0xf3,0x2e,0x3a,0x0c,0xbb,0x53, 0xf5,0xca,0x06,0x15,0x10,0x48,0x41,0x60,0x41,0xb3,0xf7,0x99,0x9f,0x6d,0xce, 0xf7,0xf8,0x75,0x65,0x1a,0x8d,0xdc,0xff,0x3d,0xb1,0xce,0xb3,0x05,0xf5,0x5a, 0xaa,0x41,0x45,0x02,0x88,0x24,0x94,0xbf,0x7f,0x3f,0xf6,0xef,0xfd,0xce,0xd2, 0x61,0xf0,0xb8,0xfc,0x7a,0xfe,0xbc,0x78,0xd3,0xe9,0x50,0xf5,0xca,0xff,0xff, 0xff,0xff,0xff,0x3f,0x21,0x49,0x00,0x92,0x4a,0x20,0x48,0x20,0x08,0xb4,0x2a, 0x05,0x20,0x48,0x21,0x22,0x4a,0x0a,0xa2,0x04,0xf5,0x4a,0x00,0x09,0x00,0x48, 0x02,0x50,0x44,0x20,0x2a,0x21,0x20,0x8a,0x22,0x8a,0xa2,0x38,0x40,0x90,0x8a, 0x22,0x88,0x98,0x80,0x40,0x08,0x51,0xf5,0x1a,0x55,0xa2,0xaa,0x82,0x50,0x05, 0x11,0x0a,0x81,0x08,0x09,0x21,0x08,0x21,0x08,0x9a,0x0a,0x45,0x20,0x88,0x22, 0x22,0x2a,0x2a,0x22,0x04,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/maraca.xbm0000644000076600007660000002451212327014024017071 0ustar gary#define maraca_width 125 #define maraca_height 126 static char maraca_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xdf,0x03,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x0c,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0e,0x00,0x28,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x01,0x80,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00, 0x02,0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x00,0x40,0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x80,0x03, 0x00,0x20,0x08,0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0xc0, 0x00,0x00,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x30,0x10,0x02,0x04,0x84,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x0e,0x00,0x08,0x80,0x90,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0xc0,0x01,0x00,0x00,0x10,0x81,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x1f,0x40,0x20,0x00,0x00,0x64,0x00,0x00,0xaa,0x00,0x00,0xe0,0x00, 0x00,0x00,0x7a,0x00,0x00,0x04,0xa2,0x24,0x30,0x00,0xe0,0xd5,0x07,0x00,0xe0, 0x00,0x00,0xa8,0x00,0x00,0x00,0x92,0x08,0x00,0x09,0x00,0x1a,0x00,0x38,0x00, 0xe0,0x00,0x00,0x06,0x00,0x00,0xfd,0x05,0x02,0x82,0x06,0x00,0x03,0x00,0xe0, 0x00,0xe0,0x00,0xc0,0x01,0x00,0x74,0x57,0x7b,0x20,0xa8,0x01,0xc0,0x00,0x02, 0x80,0x00,0xe0,0x00,0x14,0x00,0x80,0x0a,0x00,0x80,0x97,0x3e,0x00,0x20,0x02, 0x08,0x00,0x03,0xe0,0x00,0x02,0x00,0x50,0x01,0x00,0x00,0xfc,0x03,0x00,0x10, 0x10,0x00,0x00,0x02,0xe0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x00,0xe0,0x80,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0x40,0x00,0x04,0xe0,0x00,0x54,0x0f,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x00,0x00,0x00,0x00,0x02,0xe0,0x00,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x68,0x00,0x01,0x00,0x04,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x40,0x02,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0xa0,0x00,0x08,0x20,0x00,0x00,0x03,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x87,0x00,0x40,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x40,0x04,0x89,0xc8,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x58,0x00,0x00,0x02,0x21,0x00,0x00,0x20,0x60,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x07,0x00,0x00,0xc0,0xff,0x17,0x49,0x00,0x39,0x00,0xe0, 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x84,0x3a,0x80,0x5a,0x80,0x24,0x0e,0x00, 0xe0,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x71,0x00,0x00,0xe0,0x15,0xd0,0x02, 0x00,0xe0,0x00,0x00,0x00,0x00,0x80,0x28,0xa9,0x04,0x00,0x00,0x00,0xde,0x6f, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x42,0x04,0x00,0x00,0x00,0x00,0x20, 0x09,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0}; stk-4.5.0/projects/demo/tcl/bitmaps/phism.xbm0000644000076600007660000001527312327014024016771 0ustar gary#define phism_width 100 #define phism_height 100 static char phism_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x20,0x84,0x10,0x42,0x08,0x21, 0x84,0x10,0x42,0x08,0x21,0x84,0xf0,0x48,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5, 0x94,0x52,0x4a,0x51,0xf2,0x24,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08, 0x21,0x8a,0xf6,0x90,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x14,0x21, 0xf6,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xe8, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xc0,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xf7,0xd4,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xf7,0xc8,0xab,0xaa,0xaa,0xaa,0xaa,0xaa, 0xfa,0xd5,0x55,0x55,0xbb,0xf7,0xe0,0x57,0x55,0x55,0x55,0x55,0x55,0xf5,0xea, 0xaa,0xaa,0xca,0xf7,0xc8,0x57,0x55,0x55,0xfd,0xff,0x57,0xd5,0xd7,0xaa,0xaa, 0xaa,0xf7,0xd0,0xab,0xaa,0xaa,0xfa,0xff,0xab,0xea,0xeb,0x55,0x55,0xd5,0xf7, 0xc8,0x57,0x55,0xd5,0xff,0xff,0xbf,0xaa,0xd7,0xaa,0xaa,0xaa,0xf7,0xe4,0xab, 0xaa,0xaa,0xff,0xff,0x7f,0x55,0xeb,0x55,0x55,0xd5,0xf7,0xc8,0x57,0x55,0xf5, 0x7f,0x80,0xff,0xaa,0xab,0xaa,0xaa,0xaa,0xf7,0xd0,0xab,0xaa,0xea,0x7f,0x80, 0xff,0x55,0x57,0x55,0x55,0xd5,0xf7,0xc4,0x57,0x55,0xfd,0x07,0x00,0xfc,0xab, 0xab,0xaa,0xaa,0xaa,0xf7,0xe8,0xab,0xaa,0xfa,0x07,0x00,0xfc,0x57,0x57,0x55, 0x55,0xd5,0xf7,0xc0,0x57,0x55,0x7f,0xe0,0x81,0xc1,0xaf,0xaa,0xaa,0xaa,0xaa, 0xf7,0xd4,0xab,0xaa,0x7e,0xe0,0x81,0xc1,0x5f,0x55,0x55,0x55,0xd5,0xf7,0xc8, 0xaf,0xaa,0x1f,0xe0,0x81,0x03,0xbf,0xaa,0xaa,0xaa,0xaa,0xf7,0xe0,0x53,0x55, 0x1f,0xe0,0x81,0x03,0x7f,0x55,0x55,0x55,0xd5,0xf7,0xc8,0xaf,0xaa,0xe7,0x01, 0x84,0x03,0xbf,0xaa,0xb6,0xaa,0xaa,0xf7,0xd0,0x57,0x55,0xe7,0x01,0x80,0x03, 0x7f,0x55,0xa9,0x55,0xd5,0xf7,0xc8,0xab,0xaa,0xe7,0x09,0x80,0x03,0xbf,0xaa, 0xaa,0xaa,0xaa,0xf7,0xe4,0xd7,0xea,0xe7,0x21,0x00,0xc0,0x7f,0x55,0x55,0x55, 0xd5,0xf7,0xc8,0x57,0xd5,0xe7,0x01,0x10,0xc0,0xbf,0xaa,0xaa,0xaa,0xaa,0xf7, 0xd0,0xab,0xea,0x07,0x00,0x00,0xc2,0x7f,0x55,0x55,0x55,0xd5,0xf7,0xc4,0x57, 0xd5,0x07,0x00,0x00,0xc0,0xbf,0xad,0xaa,0xaa,0xaa,0xf7,0xd0,0xab,0xea,0x07, 0x80,0x06,0x0c,0x7c,0x55,0x55,0x55,0xd5,0xf7,0xc8,0xab,0xea,0x47,0x00,0x06, 0x0c,0xbc,0xaa,0xaa,0xaa,0xaa,0xf7,0xe4,0x57,0xd5,0x87,0x81,0x07,0x0e,0xfc, 0xd5,0xaa,0x56,0xd5,0xf7,0xd0,0xab,0xea,0x87,0x83,0x27,0x0e,0xfc,0xaa,0xaa, 0xaa,0xaa,0xf7,0xc4,0xaf,0xea,0x87,0x87,0x07,0x02,0xfc,0x55,0x55,0x55,0xd5, 0xf7,0xd0,0x53,0xd5,0x87,0x87,0x07,0x0a,0xfc,0xaa,0xaa,0xaa,0xaa,0xf7,0xc8, 0xaf,0xea,0x87,0x07,0x00,0x00,0xfc,0x57,0x55,0x55,0xd5,0xf7,0xe4,0xab,0xea, 0x87,0x17,0x00,0x00,0xfc,0xab,0xaa,0xaa,0xaa,0xf7,0xd0,0xab,0xaa,0x1f,0x00, 0x42,0x3c,0xff,0x7f,0x55,0x55,0xd5,0xf7,0xc4,0xaf,0xaa,0x1f,0x00,0x00,0x3c, 0xff,0xbf,0xaa,0xaa,0xaa,0xf7,0xd0,0xab,0xaa,0x1f,0x00,0x00,0xfc,0xff,0xff, 0x57,0x55,0xd5,0xf7,0xc8,0x57,0x55,0x1f,0x00,0x00,0xfc,0xff,0xff,0xab,0xaa, 0xaa,0xf7,0xe4,0xab,0xaa,0x7f,0x10,0x1e,0xc0,0x3f,0xfc,0x5f,0x55,0xd5,0xf7, 0xd0,0xab,0xaa,0xfe,0x40,0x1e,0xc1,0x3f,0xfc,0xbf,0xaa,0xaa,0xf7,0xc4,0xaf, 0xab,0xfe,0x07,0x1e,0xfc,0xff,0xc3,0xff,0x57,0xd5,0xf7,0xd0,0x53,0xaf,0xfa, 0x07,0x1e,0xfc,0xff,0xc3,0xff,0xa9,0xaa,0xf7,0xc8,0xaf,0x5f,0xf5,0x7f,0x80, 0xff,0xfe,0x3f,0xfc,0x5f,0xd5,0xf7,0xe4,0x53,0xaf,0xea,0x7f,0x88,0xff,0xfd, 0x3f,0xfc,0xbf,0xaa,0xf7,0xd0,0x5f,0xd5,0xd5,0xff,0xff,0xbf,0xea,0xff,0xe0, 0x7f,0xd5,0xf7,0xc4,0xa3,0xea,0xaa,0xff,0xff,0x7f,0xd5,0xff,0xe0,0xff,0xaa, 0xf7,0xd0,0x5f,0xd5,0xd5,0xff,0xff,0xbf,0xea,0xff,0xe0,0x7f,0xd5,0xf7,0xc8, 0xa3,0xea,0x56,0xfd,0xff,0xaf,0xaa,0xfe,0x07,0xfe,0xaa,0xf7,0xe4,0x5f,0xd5, 0x55,0xfd,0xff,0x53,0x55,0xfd,0x07,0x7e,0xd5,0xf7,0xd0,0xa7,0xea,0xaf,0x6a, 0x6b,0xad,0xaa,0xfa,0x7f,0xf8,0xaa,0xf7,0xc4,0x5b,0xd5,0x57,0x55,0x55,0x55, 0x55,0xf5,0x7f,0x78,0xd5,0xf7,0xd0,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0xb5, 0xff,0xff,0xaa,0xf7,0xc8,0xab,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xff,0x7f, 0xd5,0xf7,0xe4,0x57,0x55,0xff,0x55,0x55,0x55,0x55,0x55,0xfd,0xdf,0xaa,0xf7, 0xc8,0xab,0xaa,0xfe,0x55,0x55,0x55,0x55,0x55,0xfd,0x5f,0xd5,0xf7,0xd0,0xab, 0xaa,0xaa,0x56,0x55,0x55,0x55,0x55,0xd5,0xb7,0xaa,0xf7,0xc4,0x57,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0xd5,0x57,0xd5,0xf7,0xe8,0x57,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0xad,0xaa,0xf7,0xc0,0xab,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0xd5,0xf7,0xd4,0xab,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xf7,0xc8,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xd5, 0xf7,0xe0,0xab,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xf7,0xc8, 0x57,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xd5,0xf7,0xd0,0xab,0xaa, 0x7f,0x5d,0x7d,0xbf,0xfa,0xeb,0xf5,0xaa,0xaa,0xf7,0xc8,0x57,0xad,0xff,0xba, 0x5a,0x7f,0xf5,0xd7,0x6a,0x55,0xd5,0xf7,0xe4,0x57,0x55,0xd5,0x5d,0xbd,0xae, 0xae,0xee,0xff,0xaa,0xaa,0xf7,0xc8,0xab,0xaa,0xab,0xbd,0x5a,0xbd,0x5e,0xdd, 0x7b,0x55,0xd5,0xf7,0xd0,0xab,0xaa,0xd5,0x5b,0xbd,0x4e,0xad,0xea,0xf6,0xaa, 0xaa,0xf7,0xc8,0x57,0x55,0xd7,0xbd,0x5a,0xbd,0x5e,0xd5,0x6d,0x55,0xd5,0xf7, 0xe0,0x57,0x55,0x7f,0xfb,0xbf,0xae,0xfa,0xeb,0xf6,0xaa,0xaa,0xf7,0xc8,0xab, 0xaa,0x7f,0xfd,0x5f,0x5d,0xf5,0xd7,0x69,0x55,0xd5,0xf7,0xd4,0x57,0x55,0xff, 0xfa,0xbf,0xae,0xfa,0xeb,0xf6,0xaa,0xaa,0xf7,0xc0,0xab,0xaa,0x55,0x5d,0x5d, 0xad,0xaa,0xee,0x6a,0x55,0xd5,0xf7,0xe8,0x57,0x55,0xab,0xba,0xba,0xbe,0xaa, 0xde,0xf5,0xaa,0xaa,0xf7,0xc4,0xab,0xaa,0x55,0x5d,0x5d,0x4d,0x5d,0xed,0x75, 0x55,0xd5,0xf7,0xd0,0x57,0x55,0xab,0xba,0xba,0xbe,0xae,0xde,0xea,0xaa,0xaa, 0xf7,0xc8,0xab,0xaa,0x55,0x5d,0x5d,0xbf,0xfa,0xeb,0xf5,0x56,0xd5,0xf7,0xe4, 0x57,0x55,0xab,0xba,0xba,0x7e,0xf5,0xd7,0xea,0xaa,0xaa,0xf7,0xd0,0xab,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x2a,0x55,0xd5,0xf7,0xc8,0xd7,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xf7,0xe0,0x57,0x55,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0xd5,0xf7,0xc8,0xab,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xf7,0xd0,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0xd5,0xf7,0xc8,0xab,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xf7, 0xe4,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xd5,0xf7,0xc8,0xab, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xf7,0xd0,0x55,0x55,0x55, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xd5,0xf7,0xc4,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xf7,0xe8,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xf7,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xf7,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xf7,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/prc.xbm0000644000076600007660000001674212327014024016437 0ustar gary#define prc_width 100 #define prc_height 112 static char prc_bits[] = { 0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb5,0x6a, 0xad,0x55,0xfd,0xff,0xff,0xbf,0xaa,0x6a,0x6d,0x55,0xfd,0xff,0xff,0xff,0xff, 0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0xb6,0xb5,0xd5,0xff,0xff, 0xff,0xff,0x6f,0xad,0xb5,0x6d,0xfb,0xbf,0xdf,0xdf,0xff,0xff,0xff,0x7f,0xff, 0xff,0xff,0xff,0xbf,0xff,0xf6,0x75,0x7d,0xf5,0xff,0xff,0xf7,0xfb,0xff,0xd5, 0xda,0xea,0xfd,0xbd,0xfe,0xef,0xff,0xff,0x7b,0xdf,0xae,0xff,0xff,0xff,0xbf, 0xfe,0xef,0x57,0xbb,0xff,0xff,0xde,0xf5,0x75,0xfd,0xdb,0xb6,0xed,0xfb,0xbb, 0xfd,0xef,0xff,0x57,0xab,0x2e,0x5b,0xf5,0xbf,0xff,0xdf,0xfe,0xee,0x57,0xfd, 0x7f,0xab,0x6a,0x55,0xad,0xaa,0xff,0x6a,0xf5,0xfb,0x7b,0xfd,0xf7,0xff,0x75, 0xad,0x6a,0xb5,0xa5,0xff,0xff,0x5f,0xff,0xde,0x57,0xfd,0x3f,0x95,0x55,0xab, 0xd5,0xaa,0xfe,0x6f,0xfb,0xfd,0xb7,0xfd,0xff,0xaf,0x5a,0x55,0x55,0x55,0xab, 0xfe,0xfb,0x6e,0xff,0xfb,0xaf,0xfe,0x5b,0x55,0x55,0x55,0x55,0xad,0xfa,0xbf, 0xbb,0xfb,0xae,0xf5,0xff,0x6b,0x55,0x55,0xa9,0xaa,0x6a,0xf5,0xef,0xef,0xfd, 0xfb,0xbf,0x7f,0xad,0x55,0x52,0x4a,0x55,0xb5,0xf6,0xbf,0xba,0xfe,0x6f,0xed, 0xff,0x55,0xa5,0x4a,0xa5,0xaa,0x56,0xeb,0xff,0xef,0xfb,0xfb,0xf7,0x5f,0x5b, 0x95,0x2a,0x29,0x55,0xd5,0xda,0xff,0xdd,0xfe,0xad,0xfd,0xbf,0x55,0x55,0x52, 0xa5,0x54,0x55,0x6d,0xbf,0xbb,0xfb,0xff,0xef,0xef,0x56,0xaa,0x4a,0x95,0xaa, 0xaa,0xb5,0xff,0xef,0xfe,0xd5,0xfa,0x5f,0x55,0x49,0xaa,0x54,0x55,0xb5,0xda, 0xfe,0x7b,0xff,0xff,0xff,0xbf,0x55,0x55,0x55,0xaa,0xa4,0xaa,0x6d,0xff,0xaf, 0xfb,0xd5,0xfa,0xef,0xaa,0xaa,0x24,0x45,0xaa,0xaa,0xd6,0xfe,0xfb,0xfe,0xff, 0xff,0xbf,0xad,0x92,0xaa,0x28,0xa5,0xaa,0x7a,0xff,0xae,0xfb,0xda,0xfa,0xdf, 0xaa,0x4a,0x45,0x55,0x29,0x55,0xd5,0xfe,0xfb,0xfe,0xf7,0xff,0x6f,0x55,0x55, 0x28,0x82,0x94,0xaa,0xaa,0xff,0xaf,0xfb,0x7d,0xfd,0xbf,0x55,0x55,0x93,0x54, 0x52,0xaa,0xf6,0xfe,0xff,0xfe,0xd7,0xff,0xdf,0xea,0x57,0x49,0x22,0xd5,0x75, 0xab,0xff,0xb7,0xfb,0xfd,0xfd,0x6f,0xfd,0xff,0x2b,0x95,0x74,0xff,0x7d,0xff, 0xef,0xff,0x6f,0xff,0xbf,0x6e,0x7f,0x95,0x40,0xda,0xff,0xaf,0xff,0xbf,0xfa, 0xf5,0xfd,0x6f,0xff,0xef,0x5b,0x94,0xea,0xff,0x6f,0xff,0xef,0xff,0xbf,0xff, 0xdf,0xba,0x7a,0xab,0x4a,0x74,0xbd,0xbf,0xff,0xff,0xfa,0xea,0xfd,0x6f,0xd7, 0xaa,0x2a,0x21,0x95,0x67,0x7d,0xff,0xaf,0xff,0x7f,0xff,0xbf,0xad,0x5d,0xab, 0x94,0xea,0xba,0xb6,0xff,0xf7,0xfb,0xda,0xfd,0xaf,0xf7,0xff,0x5d,0xaa,0x7a, 0xdf,0xfb,0xfe,0xaf,0xfe,0x7d,0xff,0x6f,0x79,0xf7,0x6f,0x45,0xdf,0x77,0xad, 0xff,0xff,0xfb,0xef,0xfb,0xdf,0xee,0x7f,0xbb,0x52,0xf7,0xfe,0xf7,0xff,0xaf, 0xfe,0xf5,0xfe,0xaf,0xbe,0xbf,0xaf,0xaa,0xff,0xff,0xaf,0xfe,0xfb,0xfb,0xbf, 0xff,0x77,0xfb,0xbe,0xf5,0xda,0xb6,0xff,0xdf,0xff,0xaf,0xfe,0xf5,0xf5,0xaf, 0xbd,0x7f,0x5f,0xb7,0xdf,0xbe,0xaf,0xfe,0xfa,0xfb,0x7f,0xef,0xaf,0xd6,0xd4, 0xb5,0xd9,0x75,0x6b,0x7b,0xff,0xaf,0xfe,0xd5,0xdf,0xb7,0x2a,0x6b,0xdf,0x6e, 0xdf,0xad,0xad,0xbf,0xfa,0xfb,0x7e,0x6b,0x5f,0x55,0xbd,0xb5,0xaa,0xfb,0xb6, 0xd6,0x7e,0x6f,0xff,0xeb,0xdd,0xaa,0xd5,0x52,0xd5,0x75,0xad,0xdb,0x5a,0xdb, 0xbb,0xfb,0xff,0x6b,0xb7,0x6a,0x5f,0xad,0xae,0xf7,0x6e,0xab,0x76,0xed,0xfe, 0x6a,0xaf,0x5d,0xb5,0x55,0x75,0xb3,0x95,0xb5,0x75,0xbb,0xbf,0xfb,0xff,0xbb, 0xb6,0xda,0xaa,0xda,0xaa,0x5e,0xda,0xaa,0xd7,0xea,0xfe,0xdb,0xae,0xdb,0x4a, 0x55,0xad,0xaa,0xb6,0xaa,0xaa,0x6e,0xbf,0xfb,0xf6,0xdb,0x56,0x55,0x8a,0x56, 0xa5,0x7a,0x51,0x55,0xad,0xeb,0xfe,0xbf,0xbf,0x5b,0x55,0x51,0x55,0xa9,0xca, 0xaa,0x6a,0xff,0xfe,0xfb,0xf5,0xd5,0x6f,0xab,0x8a,0xeb,0xa6,0xbf,0x45,0xad, 0x5a,0x57,0xff,0xdf,0xff,0x5a,0x55,0x68,0xfd,0xfb,0x7f,0x93,0x6a,0xef,0xfb, 0xfd,0x7b,0xb5,0x6e,0x95,0xaa,0xfe,0xef,0xdf,0x4d,0x52,0xbb,0xae,0xff,0xfe, 0xdf,0xba,0x25,0x69,0xff,0xff,0xff,0x26,0xea,0xed,0xfb,0xfa,0x6b,0x75,0x5d, 0x95,0xb4,0xff,0xff,0xff,0x5f,0xa9,0xd6,0xde,0xff,0xff,0x7f,0x6b,0x55,0xea, 0xff,0xff,0xff,0x4f,0x6a,0xfb,0xfb,0xfd,0xb6,0xda,0xbd,0x2b,0xfd,0xff,0xff, 0xff,0x7f,0xd5,0x6d,0x5f,0xff,0xdf,0xff,0xd6,0x94,0xfe,0xff,0xff,0xff,0xbf, 0x6a,0xfb,0xf5,0xfb,0xf5,0xda,0x7d,0xab,0xfe,0xff,0xff,0xff,0xff,0xb4,0xbf, 0xdf,0xfe,0x5f,0x7f,0xd7,0xaa,0xff,0xff,0xff,0xff,0xff,0xd6,0xfa,0xfb,0xff, 0xfb,0xf7,0x7f,0xd5,0xff,0xff,0xff,0xff,0xff,0xe9,0xef,0x5e,0xfb,0x5f,0xbd, 0xed,0xd5,0xff,0xff,0xff,0xff,0xff,0x5a,0xbf,0xf7,0xff,0xf6,0xef,0xbe,0xd6, 0xff,0x7f,0x55,0xfd,0xff,0xea,0xfd,0xdf,0xfe,0xdf,0xfe,0x6b,0xd3,0xff,0xaa, 0xb7,0xb7,0xff,0xb6,0xff,0xfa,0xff,0xfb,0x6b,0xff,0xda,0x5f,0xb7,0xd4,0xea, 0x7e,0xea,0xdb,0x6f,0xfb,0x5f,0xff,0xad,0xd7,0xbf,0xfd,0xff,0xff,0xff,0xfd, 0x7e,0xff,0xff,0xfb,0xd7,0xff,0xa9,0xd7,0xfe,0xff,0x5f,0x7d,0xd5,0xf7,0xbb, 0xfd,0x6e,0xfb,0xb6,0xd6,0x6f,0xff,0xff,0xff,0x7e,0x7b,0xff,0xef,0xff,0xfb, 0xaf,0xfb,0xdf,0xbf,0xfe,0xff,0xbf,0xfe,0xee,0xdd,0x7e,0xff,0x5f,0xfb,0xdf, 0xea,0xbf,0xff,0xff,0xdf,0x7e,0xfb,0xfb,0xfb,0xfd,0xf7,0xdf,0xf6,0xbf,0xff, 0xfe,0xff,0xaf,0xff,0xdd,0xff,0xdf,0xff,0xdf,0xf6,0xff,0xab,0xff,0xff,0xff, 0xff,0x7f,0xff,0xbf,0xfd,0xfe,0xfb,0xbb,0xdb,0xfe,0xfe,0xfe,0xff,0xef,0xff, 0xee,0xf6,0xef,0xff,0xdf,0xef,0xff,0xaf,0xff,0xff,0xff,0xff,0xff,0xf7,0xff, 0xbe,0xfb,0xfd,0xfd,0xf6,0xfb,0xff,0xff,0xff,0xff,0x7f,0x5f,0xf7,0xfb,0xff, 0xb7,0xd7,0xff,0xae,0xfe,0xff,0xff,0xff,0xff,0xbb,0xde,0xef,0xfe,0xff,0xff, 0x9b,0xfa,0xff,0xff,0xff,0xff,0xbf,0xbd,0x7e,0xff,0xff,0xdb,0xf6,0x4f,0xef, 0xfe,0xff,0xff,0xff,0xff,0xff,0xfa,0xbb,0xfd,0xfe,0xdf,0xe2,0xb7,0xff,0xff, 0xff,0xff,0x5f,0xf5,0xfc,0xff,0xff,0xef,0x7b,0xf9,0xf7,0xfe,0xff,0xff,0xff, 0xff,0xfd,0xd9,0xdd,0xff,0xbd,0x3f,0xfe,0xab,0xfd,0xff,0xff,0xff,0x6f,0xfb, 0xf8,0xf7,0xfd,0xff,0x9d,0xff,0xff,0xfb,0xff,0xff,0xff,0xbb,0xfd,0xf9,0xbf, 0xff,0xed,0xcf,0xff,0x57,0xef,0xff,0xff,0xff,0xef,0xf6,0x70,0xff,0xff,0xff, 0xdd,0xff,0xaf,0xbd,0xff,0xff,0x7f,0x5b,0xfb,0xfa,0xdb,0xfd,0xb7,0xcf,0xff, 0xf7,0x76,0xdd,0xff,0xd7,0x6e,0xfd,0xd0,0xff,0xff,0xfe,0xcb,0xff,0x5b,0xef, 0xb6,0xd4,0x7a,0xb7,0xfe,0x01,0xfa,0xfe,0xff,0x8e,0xff,0xaf,0xba,0xdb,0x56, 0xd5,0xda,0x7b,0x84,0xd0,0xff,0xed,0xa7,0xff,0x7b,0xdb,0xaa,0xaa,0xae,0x55, 0x3f,0x10,0x82,0xfe,0xff,0x8b,0xff,0xaf,0x6d,0x55,0xd5,0x6a,0xab,0xbf,0x40, 0x10,0xf8,0xf7,0x0a,0xfe,0xbf,0xb6,0xb7,0x55,0x55,0xd5,0x1f,0x02,0x40,0xf2, 0x7e,0x41,0xfe,0xdb,0xda,0x54,0xaa,0xaa,0xfa,0x0f,0x20,0x05,0xf0,0x17,0x00, 0xfc,0x7f,0x6b,0x55,0x55,0x55,0xd5,0x01,0x04,0x10,0xf2,0x47,0x12,0xfc,0xdf, 0xaa,0x56,0xa9,0xaa,0xfe,0x00,0x20,0x81,0xf0,0x00,0x80,0xf8,0xff,0xd7,0x52, 0xa5,0xaa,0x7d,0x22,0x01,0x08,0xf2,0x00,0x08,0xf0,0x7f,0xad,0xaa,0x2a,0x55, 0x2f,0x00,0x24,0x02,0xf0,0x24,0x21,0xf0,0xff,0x57,0x15,0x49,0xe9,0x0f,0x00, 0x00,0x48,0xf0,0x00,0x00,0xe1,0xff,0x7d,0xa5,0x24,0xf6,0x03,0x42,0x90,0x00, 0xf2,0x92,0x08,0xa0,0xff,0xaf,0x12,0x49,0x7d,0x01,0x00,0x02,0x04,0xf0,0x00, 0x42,0x80,0xff,0xff,0xaa,0x24,0x57,0x40,0x08,0x08,0x90,0xf0,0x08,0x08,0x04, 0xff,0xb7,0x4a,0xd2,0x00,0x09,0x20,0x80,0x00,0xf2,0x40,0x40,0x01,0xfe,0xff, 0x55,0xa9,0x40,0x02,0x00,0x11,0x02,0xf0,0x02,0x01,0x10,0xfc,0x7f,0xaf,0x6a, 0x28,0x50,0x02,0x00,0x48,0xf0,0x08,0x24,0x42,0xe4,0xff,0x5d,0x3b,0x82,0x00, 0x08,0x42,0x00,0xf2,0x20,0x80,0x00,0x8a,0xfe,0xff,0x7d,0x00,0x52,0x40,0x08, 0x20,0xf0,0x01,0x01,0x08,0x34,0xfc,0xff,0x3f,0x00,0x48,0x00,0x20,0x82,0xf0, 0x08,0x10,0x82,0xf4,0xf1,0xfe,0x3f,0x49,0x20,0x84,0x00,0x00,0xf2,0x40,0x42, 0x10,0xe0,0xd3,0x60,0x7f,0x00,0x52,0x10,0x82,0x08,0xf0,0x02,0x00,0x42,0x84, 0x87,0xc1,0xff,0x25,0x00,0x00,0x08,0x20,0xf0,0x48,0x08,0x10,0x00,0x0a,0x80, 0xff,0x81,0x28,0x01,0x20,0x00,0xf2,0x00,0x21,0x81,0x10,0x24,0x84,0xff,0x07, 0x00,0x48,0x00,0x42,0xf0,0x00,0x00,0x10,0x00,0x10,0x00,0xfe,0x07,0x92,0x01, 0x81,0x00,0xf1,0x24,0x09,0x40,0x42,0x48,0x00,0xfc,0x27,0x88,0x05,0x08,0x08, 0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/prcFunny.xbm0000644000076600007660000001060612327014024017450 0ustar gary#define prcFunny_width 100 #define prcFunny_height 65 static char prcFunny_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x07,0xf0,0x00,0xa8,0xea,0x7d,0xef,0x7f,0xfb,0xdb,0xb5,0x5e,0x55,0x05, 0xf0,0x00,0xfc,0xff,0xf7,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0x07,0xf0,0x00, 0x58,0xd5,0x5f,0x5f,0xf7,0xff,0xdb,0xbb,0x7f,0x55,0x05,0xf0,0x00,0xf4,0x7f, 0x01,0x39,0x76,0xbc,0x91,0x13,0xe3,0xff,0x07,0xf0,0x00,0xbc,0xed,0x01,0x39, 0x76,0xb2,0x11,0x12,0xe3,0x6d,0x05,0xf0,0x00,0xd8,0xfb,0x00,0x00,0xf6,0xb3, 0x0d,0x62,0x83,0xdf,0x07,0xf0,0x00,0xec,0xfe,0x00,0x00,0x80,0x0f,0x0c,0x00, 0x83,0x77,0x05,0xf0,0x00,0x7c,0x1f,0x00,0x00,0x80,0x0f,0xe0,0x0f,0x00,0xdf, 0x07,0xf0,0x00,0xd4,0x03,0x00,0xff,0x07,0x02,0x1e,0xf0,0x00,0x7f,0x05,0xf0, 0x00,0x7c,0x03,0xf8,0x00,0x78,0xc0,0x01,0x00,0x03,0xec,0x07,0xf0,0x00,0xd4, 0x03,0x1f,0x00,0x80,0x73,0x00,0x00,0x04,0x7c,0x05,0xf0,0x00,0xfc,0x03,0x00, 0x00,0x00,0x3e,0x00,0x00,0x18,0xd8,0x07,0xf0,0x00,0xa8,0x00,0xc0,0xff,0x3f, 0x8e,0xff,0x7f,0x60,0x78,0x05,0xf0,0x00,0xfc,0x00,0x20,0x00,0x70,0x40,0x00, 0x80,0x00,0xe0,0x07,0xf0,0x00,0xd8,0x00,0x1e,0x00,0xc0,0x31,0x00,0x00,0x07, 0x40,0x05,0xf0,0x00,0xec,0x00,0x07,0x00,0x00,0x0e,0x00,0x08,0x1c,0xe0,0x07, 0xf0,0x00,0xfc,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x78,0x60,0x05,0xf0,0x00, 0xe4,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x07,0xf0,0x00,0x64,0xe4, 0x80,0x02,0x08,0x10,0x00,0x00,0x80,0x23,0x04,0xf0,0x00,0x64,0x24,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x20,0x04,0xf0,0x00,0x60,0x38,0x00,0x00,0x00,0x10, 0x04,0x00,0x80,0x20,0x04,0xf0,0x00,0x60,0x38,0x00,0x00,0x00,0x02,0x00,0x00, 0x80,0x20,0x04,0xf0,0x00,0x60,0x18,0x08,0x00,0x00,0x00,0x04,0x00,0x81,0x00, 0x04,0xf0,0x00,0x60,0x18,0x00,0x00,0x3f,0x04,0x00,0x20,0x00,0xc0,0x04,0xf0, 0x00,0x64,0x18,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0xc3,0x04,0xf0,0x00,0x64, 0x18,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0xc3,0x04,0xf0,0x00,0xe4,0x18,0x00, 0x00,0x0e,0x80,0x03,0x00,0x00,0xc3,0x07,0xf0,0x00,0xfc,0x38,0x00,0x00,0x00, 0xc0,0x0f,0x00,0x80,0xc3,0x07,0xf0,0x00,0xfc,0x23,0x00,0x00,0x00,0xc0,0x0f, 0x00,0x80,0x00,0x05,0xf0,0x00,0xa8,0xe3,0x80,0x00,0x00,0x80,0x03,0x00,0x80, 0x00,0x07,0xf0,0x00,0xfc,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 0xf0,0x00,0xac,0x03,0x40,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0xf0,0x00, 0xf8,0x03,0x01,0x00,0x02,0x02,0x00,0x00,0x78,0xc0,0x07,0xf0,0x00,0xac,0x03, 0x07,0x00,0x00,0x0e,0x80,0x00,0x1c,0x60,0x03,0xf0,0x00,0xfc,0x03,0x20,0x00, 0x72,0x40,0x00,0x80,0x00,0xc0,0x06,0xf0,0x00,0xa8,0x03,0xc0,0xff,0x3f,0x80, 0x7f,0x7f,0x00,0xc0,0x07,0xf0,0x00,0xfc,0x03,0x00,0x00,0x80,0x31,0x00,0x00, 0x00,0x40,0x05,0xf0,0x00,0x58,0x03,0x00,0x00,0x80,0x31,0x00,0x00,0x00,0xc0, 0x07,0xf0,0x00,0xf4,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x40,0x05,0xf0, 0x00,0xbc,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0xf0,0x00,0xd8, 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x05,0xf0,0x00,0x74,0x1d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0xf0,0x00,0xdc,0x37,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x60,0x05,0xf0,0x00,0x78,0xfd,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x07,0xf0,0x00,0xdc,0xd7,0x00,0x07,0x81,0x03,0x10,0x00,0x00, 0x40,0x05,0xf0,0x00,0xf4,0xfd,0xc0,0xf8,0xff,0x3f,0xfe,0x0f,0x00,0xfc,0x07, 0xf0,0x00,0x5c,0xaf,0x00,0x00,0x70,0xc0,0xed,0x0f,0x00,0x6c,0x05,0xf0,0x00, 0xf4,0xf5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x07,0xf0,0x00,0x5c,0xbf, 0x1e,0x00,0x00,0x00,0x00,0x00,0x80,0x77,0x05,0xf0,0x00,0xf4,0xd6,0x3b,0x00, 0x00,0x00,0x00,0x00,0x80,0xdd,0x07,0xf0,0x00,0xdc,0xfd,0xfe,0x01,0x00,0x00, 0x00,0x80,0xff,0x77,0x05,0xf0,0x00,0xb8,0xb7,0xd7,0x0f,0x00,0x00,0x00,0xf0, 0xaf,0xde,0x07,0xf0,0x00,0xec,0xee,0x7a,0xff,0xff,0xff,0x9f,0xff,0xfb,0x7b, 0x05,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0}; stk-4.5.0/projects/demo/tcl/bitmaps/rachet.xbm0000644000076600007660000002451212327014024017113 0ustar gary#define rachet_width 125 #define rachet_height 126 static char rachet_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xfa, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0xb4,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x50,0x00,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x04,0x41,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0xf0,0x23,0x08,0x38,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x1a,0x1d,0x00,0x22,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x20,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x01,0x70,0x20,0xe0,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x80,0x00,0x80,0x04,0x90,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x80,0x81,0x0a,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xc1,0x0c,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x80,0x00,0x00,0x52,0x10,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x85, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x40,0x00,0x00,0x0c, 0xe0,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x80,0x01, 0x08,0xa8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x40,0x50, 0x03,0x8c,0x86,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x80, 0x20,0x06,0xe8,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x10,0x05,0x18,0xd0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x80,0x30,0x06,0x08,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x80,0x40,0x05,0x08,0x42,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x91,0x02,0x50,0x68,0x0a,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x20,0x12,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x01,0x01,0x88,0x1a,0x26,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x01,0x01,0x0c,0x0a,0x42,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x82,0x00,0xac,0x01,0x46,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x6d,0x00,0x08,0x10,0x0c,0x01, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x28,0x00,0x18,0x00,0x14, 0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x80,0x02,0x48,0x10, 0x2c,0x02,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x6a,0x08,0x08, 0x00,0x4c,0x04,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x80,0x10,0x0a, 0x18,0x20,0x88,0x08,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xc0,0x82, 0x09,0x80,0x00,0x18,0x11,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x60,0x08,0x10,0x40,0x18,0x22,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x80,0x00,0x10,0x10,0x00,0x10,0x44,0x00,0x00,0x80,0x03,0x00,0xe0,0x00,0x00, 0x00,0x80,0x20,0x08,0x10,0x00,0x30,0x88,0x00,0x00,0x60,0x00,0x00,0xe0,0x00, 0x02,0x00,0x40,0x20,0x09,0x30,0x01,0x30,0x08,0x01,0x00,0x18,0x06,0x00,0xe0, 0x00,0x08,0x00,0x80,0x20,0x14,0x20,0x00,0x20,0x10,0x01,0x00,0x04,0x01,0x00, 0xe0,0x00,0x00,0x00,0x80,0x20,0x07,0x20,0x80,0x60,0x20,0x04,0x80,0xc1,0x00, 0x00,0xe0,0x00,0x00,0x00,0x20,0xc7,0x1d,0x20,0x02,0x60,0x40,0x04,0x40,0x20, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xb8,0x00,0x60,0x00,0x40,0x80,0x08,0x10, 0x0c,0x00,0x00,0xe0,0x00,0x00,0x00,0x20,0x40,0x08,0x40,0x00,0xc1,0x00,0x11, 0x0c,0x07,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x04,0x19,0x40,0x04,0x40,0x00, 0x62,0x83,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x20,0x01,0x0a,0xc0,0x00,0x80, 0x00,0x04,0x60,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x07,0x2c,0x80,0x00, 0x82,0x01,0x0c,0x18,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x10,0xa8,0x23,0x80, 0x00,0x80,0x00,0x30,0x06,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x10,0xd0,0x20, 0x80,0x09,0x80,0x01,0xc0,0x01,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x40,0x00,0x01,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x10, 0x80,0x40,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x40,0x40,0x00,0x11,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x08,0x40,0x40,0x00,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x60,0x80,0x00,0x02,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x08,0x20,0xa0,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x06,0x10,0x06,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x04,0x20,0x00,0x01,0x44,0x00,0x0c,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x20,0x10,0x01,0x04,0x00,0x08,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x04,0x20,0x00,0x01,0x0c,0x00,0x0c,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x30,0x00,0x02,0x08,0x00,0x08, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x04,0x10,0x80,0x02,0x88,0x40, 0x18,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x10,0x88,0x03,0x18, 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x02,0x10,0x80,0x04, 0x10,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x10,0x80, 0x00,0x10,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x02,0x18, 0xc8,0x04,0x10,0x80,0x20,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x08,0x80,0x08,0x30,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x08,0x40,0x00,0x20,0x02,0x60,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x01,0x08,0xc4,0x08,0x20,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x08,0x40,0x08,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x01,0x0c,0x60,0x10,0x40,0x00,0xc2,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x04,0x40,0x10,0x40,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0xc0,0x00,0x80,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x84,0x22,0x20,0x80,0x08,0x84,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x80,0x00,0x26,0x24,0x20,0x80,0x00,0x80,0x01, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x0e,0x38,0x00,0x80,0x01,0x00, 0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x80,0x00,0x02,0x30,0x40,0x00,0x11, 0x08,0x03,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x02,0x11,0x40,0x00, 0x01,0x00,0x02,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x02,0x10,0x40, 0x00,0x01,0x08,0x03,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x40,0x00,0x0b,0x10, 0x00,0x00,0x23,0x00,0x02,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x01, 0x18,0x80,0x00,0x02,0x10,0x06,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x40,0x00, 0x01,0x18,0x80,0x00,0x26,0x00,0x04,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x01,0x08,0x80,0x00,0x06,0x20,0x04,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x80,0x01,0x08,0x00,0x01,0x04,0x00,0x0c,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x20,0x80,0x00,0x0c,0x00,0x01,0x04,0x60,0x0c,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x80,0x00,0x0c,0x00,0x01,0x0c,0x10,0x0b,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x20,0x80,0x00,0x0c,0x00,0x02,0x08,0x84,0x18,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x80,0x00,0x0c,0x00,0x02,0x0c,0x21,0x10,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x20,0x40,0x00,0x04,0x00,0x02,0x58,0x08,0x18,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x40,0x40,0x00,0x04,0x00,0x00,0x18,0x02,0x30, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x80,0x40,0x00,0x03,0x00,0x04,0x30,0x01, 0x10,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x41,0x80,0x00,0x00,0x04,0x70, 0x00,0x20,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x42,0x30,0x00,0x00,0x04, 0x10,0x00,0x60,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x64,0x08,0x00,0x00, 0x08,0x10,0x00,0x40,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x28,0x03,0x00, 0x00,0x08,0x20,0x00,0x60,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xf0,0x00, 0x00,0x00,0x00,0x20,0x00,0xc0,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10,0x40,0x00,0x80,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x80,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x01,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0x00,0x00,0x01,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0x00,0x00,0x01,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x00,0x03,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x03, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00, 0x02,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01, 0x00,0x06,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00, 0x02,0x80,0x01,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x02,0x40,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x00,0x02,0x30,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x06,0x0c,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x84,0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x44,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6a,0x3f,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0}; stk-4.5.0/projects/demo/tcl/bitmaps/sleighbell.xbm0000644000076600007660000002452612327014024017764 0ustar gary#define sleighbell_width 125 #define sleighbell_height 126 static char sleighbell_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x88,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x82,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x82,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x82,0x10,0x04,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc5,0x08,0x06,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x89,0xa4,0x10,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xc1,0x63,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x28,0x6c, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00, 0x68,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x80,0x40, 0xc1,0x24,0x40,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x82,0x43,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x6a,0xd2,0x32,0x20,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd6,0x1c,0x09,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x80,0x80,0x43,0x90,0x0d,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x1f,0xc1,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0xc0,0x1a,0x43,0x34,0x20,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xc4,0x24,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x11,0x7c,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0xe5,0x04,0x40,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x80,0xa0,0x48,0x30,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x44,0x24,0x20,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x41,0x20,0x30, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xf6,0x95, 0x0a,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x6f, 0x8f,0x0d,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 0x41,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0xc0, 0x8f,0x41,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x40,0x08,0x42,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x64,0x12,0x6c,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x40,0xa0,0xd0,0x10,0x24,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x80,0xa0,0x62,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x81,0x28,0x11,0x20,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x22,0x20,0x18,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x61,0x44,0x08,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0xff,0x09,0x01,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x21,0x0e,0x02,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x20,0x48,0x08,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0xe0,0x87,0x21,0x38,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0xa0,0x8c,0x32,0x0e, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x30, 0x01,0x3c,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x20,0xe0, 0xb2,0x02,0x34,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x40, 0x40,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x80,0x20,0xe9,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x14,0x42,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x82,0x40,0x48,0x08,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x80,0x20,0xce,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x40,0x40,0xf7,0x0b,0x04,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x60,0x07,0x40,0x18,0x10,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0xe0,0x85,0x62,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x44,0x0e,0x3e,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x70,0x09,0x34,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x40,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0xa1,0x08, 0x10,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x6a, 0x11,0x08,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x4a, 0x60,0x84,0x06,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x80, 0x40,0x22,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x20,0x42,0xef,0x28,0x08,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0xf1,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0xe0,0x43,0x21,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x20,0x46,0x20,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x22,0x06,0x14,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x20,0x60,0x64,0x09,0x20,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0xa1,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x40,0x10,0x00,0x08,0x18,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x84,0x06,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x04, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x12, 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x40, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0}; stk-4.5.0/projects/demo/tcl/bitmaps/tambourine.xbm0000644000076600007660000002452612327014024020017 0ustar gary#define tambourine_width 125 #define tambourine_height 126 static char tambourine_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x09,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe8,0xaf,0xf4,0x0b,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0xa0,0x0b,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x0e,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xe0,0x00,0x00,0x00,0x80,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xe0,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0xe0,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xe0,0x00,0x00,0x00,0x18, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01,0xe0,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0xe0,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x02,0xe0,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x02,0xe0, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03, 0xe0,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x03,0xe0,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x03,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x03,0xe0,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x02,0xe0,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x01,0xe0,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc0,0x00,0xe0,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0xe0,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0xe0,0x00,0x00,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x07,0xe0,0x00,0x00,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x0d,0xe0,0x00,0x00,0x0e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x17,0xe0,0x00,0x00,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x3e,0xe0,0x00,0x80, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x2e,0xe0,0x00, 0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x34,0xe0, 0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x1c, 0xe0,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f, 0x3c,0xe0,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x2f,0xe0,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x59,0x27,0xe0,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0xd8,0x28,0xe0,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x64,0x30,0x30,0xe0,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x34,0x30,0xe0,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd8,0x1e,0x1e,0xe0,0x00,0x00,0x38,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0xec,0xf9,0x0e,0xe0,0x00,0x00,0x78,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x90,0x06,0xe0,0x00,0x00,0xf8,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc1,0xf9,0x00,0xe0,0x00,0x00,0xa2,0x21, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x60,0x69,0x00,0xe0,0x00,0x00,0x62, 0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xb0,0x79,0x00,0xe0,0x00,0x00, 0xd5,0x06,0x10,0x00,0x40,0x00,0x00,0x00,0x00,0xfa,0xfc,0x40,0x00,0xe0,0x00, 0x00,0xe1,0x0d,0x00,0x10,0x00,0x00,0x00,0x00,0x81,0x66,0xfe,0x21,0x00,0xe0, 0x00,0x00,0xb6,0x3f,0x40,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x07,0x23,0x00, 0xe0,0x00,0x00,0x6e,0xc6,0x00,0x00,0x00,0x00,0x00,0x80,0x70,0xc0,0x84,0x13, 0x00,0xe0,0x00,0x00,0xfe,0x0e,0x03,0x00,0x00,0x00,0x08,0x10,0x5e,0x70,0x86, 0x08,0x00,0xe0,0x00,0x00,0x5c,0x3d,0x8c,0x80,0x00,0x00,0x80,0x84,0xe3,0x3c, 0xe0,0x0b,0x00,0xe0,0x00,0x00,0xe1,0x91,0x76,0x02,0x84,0x20,0x02,0x7c,0xe0, 0x1f,0xf0,0x05,0x00,0xe0,0x00,0x00,0x8a,0x14,0x07,0x15,0x00,0x02,0xb0,0x0f, 0xe0,0xef,0xfd,0x03,0x00,0xe0,0x00,0x00,0xa6,0x0b,0x04,0xe8,0x12,0x40,0x7d, 0x04,0x38,0x79,0xfb,0x03,0x00,0xe0,0x00,0x00,0xfe,0x03,0x3f,0x0c,0xfd,0xff, 0x03,0x0e,0x07,0xcf,0xff,0x01,0x00,0xe0,0x00,0x00,0xbc,0x86,0xec,0x1e,0x20, 0x40,0x00,0xfc,0x01,0x12,0xfc,0x00,0x00,0xe0,0x00,0x00,0x70,0x8d,0xfa,0x3f, 0x70,0x60,0x40,0x7f,0x00,0x58,0xfa,0x00,0x00,0xe0,0x00,0x00,0x00,0x0a,0x73, 0xff,0xff,0xea,0xff,0x9f,0x00,0xfc,0x3f,0x00,0x00,0xe0,0x00,0x00,0x00,0x0e, 0x24,0xe4,0x03,0xfd,0xff,0xb7,0x00,0xc4,0x05,0x00,0x00,0xe0,0x00,0x00,0x00, 0x06,0x84,0xe0,0x02,0xfc,0x07,0xd8,0x00,0x14,0x02,0x00,0x00,0xe0,0x00,0x00, 0x00,0x04,0x5f,0xfb,0x02,0x34,0x78,0x7c,0x00,0x2c,0x02,0x00,0x00,0xe0,0x00, 0x00,0x00,0x90,0x7f,0x7d,0x03,0xb4,0xa0,0x0f,0x00,0x80,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0xa0,0xfc,0x0b,0x00,0x78,0xaf,0xc7,0x00,0x60,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0xc0,0xbf,0x07,0x00,0xc0,0xaa,0x7f,0x01,0x08,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x7d,0xf8,0x01,0x00,0x7f,0x6e,0x01,0x06,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x2c,0xe0,0x07,0xe0,0x02,0xf2,0xc1,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xf8,0x7a,0x04,0xf8,0xe7,0x38,0x28, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xf0,0xbe,0x04,0xc8,0x11,0x9f, 0x06,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x80,0x07,0x03,0xd0,0xff, 0x47,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x20, 0xfe,0x03,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xb4, 0xaa,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0}; stk-4.5.0/projects/demo/tcl/Demo.tcl0000644000076600007660000010571512327014024015073 0ustar gary# Tcl/Tk Demo GUI for the Synthesis Toolkit (STK) # by Gary P. Scavone, CCRMA, Stanford University, 1995--2014. # Set initial control values set pitch 64.0 set press 64.0 set velocity 96.0 set cont1 0.0 set cont2 10.0 set cont4 20.0 set cont7 128.0 set cont11 64.0 set cont44 24.0 set patchnum 0 set oldpatch 0 set temp 0 # Configure main window wm title . "STK Demo GUI" wm iconname . "demo" . config -bg black # Configure instrument change menu. Use a unique number for each # voice. The STK program change value is found by dividing by 100, # while the remainder corresponds to within-class preset values. menu .menu -tearoff 0 menu .menu.instrument -tearoff 0 .menu add cascade -label "Instruments" -menu .menu.instrument \ -underline 0 .menu.instrument add radio -label "Clarinet" -variable patchnum \ -value 0 -command { patchChange $patchnum } .menu.instrument add radio -label "BlowHole" -variable patchnum \ -value 100 -command { patchChange $patchnum } .menu.instrument add radio -label "Saxofony" -variable patchnum \ -value 200 -command { patchChange $patchnum } .menu.instrument add radio -label "Flute" -variable patchnum \ -value 300 -command { patchChange $patchnum } .menu.instrument add radio -label "Brass" -variable patchnum \ -value 400 -command { patchChange $patchnum } .menu.instrument add radio -label "Blown Bottle" -variable patchnum \ -value 500 -command { patchChange $patchnum } .menu.instrument add radio -label "Bowed String" -variable patchnum \ -value 600 -command { patchChange $patchnum } .menu.instrument add radio -label "Plucked String" -variable patchnum \ -value 700 -command { patchChange $patchnum } .menu.instrument add radio -label "Stiff String" -variable patchnum \ -value 800 -command { patchChange $patchnum } .menu.instrument add radio -label "Sitar" -variable patchnum \ -value 900 -command { patchChange $patchnum } .menu.instrument add radio -label "Mandolin" -variable patchnum \ -value 1000 -command { patchChange $patchnum } .menu.instrument add radio -label "Rhodey" -variable patchnum \ -value 1100 -command { patchChange $patchnum } .menu.instrument add radio -label "Wurley" -variable patchnum \ -value 1200 -command { patchChange $patchnum } .menu.instrument add radio -label "Tubular Bell" -variable patchnum \ -value 1300 -command { patchChange $patchnum } .menu.instrument add radio -label "Heavy Metal" -variable patchnum \ -value 1400 -command { patchChange $patchnum } .menu.instrument add radio -label "Percussive Flute" -variable patchnum \ -value 1500 -command { patchChange $patchnum } .menu.instrument add radio -label "B3 Organ" -variable patchnum \ -value 1600 -command { patchChange $patchnum } .menu.instrument add radio -label "FM Voice" -variable patchnum \ -value 1700 -command { patchChange $patchnum } .menu.instrument add radio -label "Formant Voice" -variable patchnum \ -value 1800 -command { patchChange $patchnum } .menu.instrument add radio -label "Moog" -variable patchnum \ -value 1900 -command { patchChange $patchnum } .menu.instrument add radio -label "Simple" -variable patchnum \ -value 2000 -command { patchChange $patchnum } .menu.instrument add radio -label "Drum Kit" -variable patchnum \ -value 2100 -command { patchChange $patchnum } .menu.instrument add radio -label "Banded Bar" -variable patchnum \ -value 2200 -command { patchChange $patchnum } .menu.instrument add radio -label "Banded Marimba" -variable patchnum \ -value 2201 -command { patchChange $patchnum } .menu.instrument add radio -label "Banded Glass" -variable patchnum \ -value 2202 -command { patchChange $patchnum } .menu.instrument add radio -label "Banded Bowl" -variable patchnum \ -value 2203 -command { patchChange $patchnum } .menu.instrument add radio -label "Maraca" -variable patchnum \ -value 2300 -command { patchChange $patchnum } .menu.instrument add radio -label "Cabasa" -variable patchnum \ -value 2301 -command { patchChange $patchnum } .menu.instrument add radio -label "Sekere" -variable patchnum \ -value 2302 -command { patchChange $patchnum } .menu.instrument add radio -label "Tambourine" -variable patchnum \ -value 2303 -command { patchChange $patchnum } .menu.instrument add radio -label "Sleigh Bells" -variable patchnum \ -value 2304 -command { patchChange $patchnum } .menu.instrument add radio -label "Bamboo Chimes" -variable patchnum \ -value 2305 -command { patchChange $patchnum } \ -columnbreak 1 .menu.instrument add radio -label "Sandpaper" -variable patchnum \ -value 2306 -command { patchChange $patchnum } .menu.instrument add radio -label "Coke Can" -variable patchnum \ -value 2307 -command { patchChange $patchnum } .menu.instrument add radio -label "Sticks" -variable patchnum \ -value 2308 -command { patchChange $patchnum } .menu.instrument add radio -label "Crunch" -variable patchnum \ -value 2309 -command { patchChange $patchnum } .menu.instrument add radio -label "Big Rocks" -variable patchnum \ -value 2310 -command { patchChange $patchnum } .menu.instrument add radio -label "Little Rocks" -variable patchnum \ -value 2311 -command { patchChange $patchnum } .menu.instrument add radio -label "NeXT Mug" -variable patchnum \ -value 2312 -command { patchChange $patchnum } .menu.instrument add radio -label "Mug & Penny" -variable patchnum \ -value 2313 -command { patchChange $patchnum } .menu.instrument add radio -label "Mug & Nickle" -variable patchnum \ -value 2314 -command { patchChange $patchnum } .menu.instrument add radio -label "Mug & Dime" -variable patchnum \ -value 2315 -command { patchChange $patchnum } .menu.instrument add radio -label "Mug & Quarter" -variable patchnum \ -value 2316 -command { patchChange $patchnum } .menu.instrument add radio -label "Mug & Franc" -variable patchnum \ -value 2317 -command { patchChange $patchnum } .menu.instrument add radio -label "Mug & Peso" -variable patchnum \ -value 2318 -command { patchChange $patchnum } .menu.instrument add radio -label "Guiro" -variable patchnum \ -value 2319 -command { patchChange $patchnum } .menu.instrument add radio -label "Wrench" -variable patchnum \ -value 2320 -command { patchChange $patchnum } .menu.instrument add radio -label "Water Drops" -variable patchnum \ -value 2321 -command { patchChange $patchnum } .menu.instrument add radio -label "Tuned Bamboo" -variable patchnum \ -value 2322 -command { patchChange $patchnum } .menu.instrument add radio -label "Marimba" -variable patchnum \ -value 2400 -command { patchChange $patchnum } .menu.instrument add radio -label "Vibraphone" -variable patchnum \ -value 2401 -command { patchChange $patchnum } .menu.instrument add radio -label "Agogo Bell" -variable patchnum \ -value 2402 -command { patchChange $patchnum } .menu.instrument add radio -label "Wood 1" -variable patchnum \ -value 2403 -command { patchChange $patchnum } .menu.instrument add radio -label "Reso" -variable patchnum \ -value 2404 -command { patchChange $patchnum } .menu.instrument add radio -label "Wood 2" -variable patchnum \ -value 2405 -command { patchChange $patchnum } .menu.instrument add radio -label "Beats" -variable patchnum \ -value 2406 -command { patchChange $patchnum } .menu.instrument add radio -label "Two Fixed" -variable patchnum \ -value 2407 -command { patchChange $patchnum } .menu.instrument add radio -label "Clump" -variable patchnum \ -value 2408 -command { patchChange $patchnum } .menu.instrument add radio -label "2D Mesh" -variable patchnum \ -value 2500 -command { patchChange $patchnum } .menu.instrument add radio -label "Resonate" -variable patchnum \ -value 2600 -command { patchChange $patchnum } .menu.instrument add radio -label "Police Whistle" -variable patchnum \ -value 2700 -command { patchChange $patchnum } . configure -menu .menu # Configure message box label .note -font {Times 12 normal} -background white \ -foreground darkred -relief raised \ -wraplength 300 -width 60 \ -text "Select instruments using the menu above. Impulsively excited instruments can be plucked/struck using the NoteOn button or the spacebar." pack .note -padx 5 -pady 10 # Configure bitmap display if {[file isdirectory bitmaps]} { set bitmappath bitmaps } else { set bitmappath tcl/bitmaps } button .pretty -bitmap @$bitmappath/Klar.xbm \ -background white -foreground black pack .pretty -padx 5 -pady 10 # Configure "note on" buttons frame .noteOn -bg black button .noteOn.on -text NoteOn -bg grey66 -command { noteOn $pitch $press } button .noteOn.off -text NoteOff -bg grey66 -command { noteOff $pitch 127.0 } button .noteOn.exit -text "Exit Program" -bg grey66 -command myExit pack .noteOn.on -side left -padx 5 pack .noteOn.off -side left -padx 5 -pady 10 pack .noteOn.exit -side left -padx 5 -pady 10 pack .noteOn # Configure sliders frame .left -bg black frame .right -bg black scale .left.volume -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 7} \ -orient horizontal -label "Volume" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont7 scale .left.bPressure -from 0 -to 128 -length 200 \ -command {changePress } -variable press \ -orient horizontal -label "Breath Pressure" \ -tickinterval 32 -showvalue true -bg grey66 scale .left.pitch -from 0 -to 128 -length 200 \ -command {changePitch } -variable pitch \ -orient horizontal -label "MIDI Note Number" \ -tickinterval 32 -showvalue true -bg grey66 scale .left.cont2 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 2} \ -orient horizontal -label "Reed Stiffness" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont2 scale .right.reverb -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 44} \ -orient horizontal -label "Reverb Mix" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont44 scale .right.cont4 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 4} \ -orient horizontal -label "Breath Noise" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont4 scale .right.cont11 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 11} \ -orient horizontal -label "Vibrato Rate" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont11 scale .right.cont1 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 1} \ -orient horizontal -label "Vibrato Amount" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont1 pack .left.volume -padx 10 -pady 10 pack .left.bPressure -padx 10 -pady 10 pack .left.pitch -padx 10 -pady 10 pack .left.cont2 -padx 10 -pady 10 pack .right.reverb -padx 10 -pady 10 pack .right.cont4 -padx 10 -pady 10 pack .right.cont11 -padx 10 -pady 10 pack .right.cont1 -padx 10 -pady 10 pack .left -side left pack .right -side right # DrumKit popup window set p .drumwindow proc myExit {} { global pitch puts [format "ExitProgram"] flush stdout close stdout exit } proc noteOn {pitchVal pressVal} { puts [format "NoteOn 0.0 1 %3.2f %3.2f" $pitchVal $pressVal] flush stdout } proc noteOff {pitchVal pressVal} { puts [format "NoteOff 0.0 1 %3.2f %3.2f" $pitchVal $pressVal] flush stdout } # Set bindings bind . { noteOn $pitch $press } bind . +myExit proc playDrum {value} { global velocity puts [format "NoteOn 0.0 1 %3i %3.2f" $value $velocity] flush stdout } proc printWhatz {tag value1 value2 } { puts [format "%s %2i %3.2f" $tag $value1 $value2] flush stdout } proc changePress {value} { global patchnum if { $patchnum<700 || ($patchnum>900 && $patchnum<2500) || $patchnum>=2600 } { puts [format "AfterTouch 0.0 1 %3.2f" $value] flush stdout } } proc changePitch {value} { puts [format "PitchChange 0.0 1 %3.2f" $value] flush stdout } proc patchChange {value} { global bitmappath cont1 cont2 cont4 cont11 oldpatch press pitch temp if {$value!=$oldpatch} { set program [expr $value / 100] puts [format "ProgramChange 0.0 1 %2i" $program] flush stdout # This stuff below sets up the correct bitmaps, slider labels, and control # parameters. if {$program==0} { # Clarinet .pretty config -bitmap @$bitmappath/Klar.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Reed Stiffness" .right.cont4 config -state normal -label "Breath Noise" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 20.0 set cont2 64.0 set cont4 20.0 set cont11 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$program==1} { # BlowHole .pretty config -bitmap @$bitmappath/Klar.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Reed Stiffness" .right.cont4 config -state normal -label "Breath Noise" .right.cont11 config -state normal -label "Tonehole Openness" .right.cont1 config -state normal -label "Register Vent Openness" set cont1 0.0 set cont2 64.0 set cont4 20.0 set cont11 0.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$program==2} { # Saxofony .pretty config -bitmap @$bitmappath/prcFunny.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Reed Stiffness" .right.cont4 config -state normal -label "Breath Noise" .right.cont11 config -state normal -label "Blow Position" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 20.0 set cont2 64.0 set cont4 20.0 set cont11 26.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$program==3} { # Flute .pretty config -bitmap @$bitmappath/KFloot.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Embouchure Adjustment" .right.cont4 config -state normal -label "Breath Noise" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 20.0 set cont2 64.0 set cont4 20.0 set cont11 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$program==4} { # Brass .pretty config -bitmap @$bitmappath/KHose.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Lip Adjustment" .right.cont4 config -state normal -label "Slide Length" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 0.0 set cont2 64.0 set cont4 20.0 set cont11 64.0 set press 80.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 puts [format "NoteOn 0.0 1 %3.2f %3.2f" $pitch $press] } if {$program==5} { # Bottle .pretty config -bitmap @$bitmappath/prcFunny.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state disabled -label "Disabled" .right.cont4 config -state normal -label "Breath Noise" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 20.0 set cont4 20.0 set cont11 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$program==6} { # Bowed String .pretty config -bitmap @$bitmappath/KFiddl.xbm .left.bPressure config -state normal -label "Volume" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Bow Pressure" .right.cont4 config -state normal -label "Bow Position" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 4.0 set cont2 64.0 set cont4 24.0 set cont11 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$program==7} { # Yer Basic Pluck .pretty config -bitmap @$bitmappath/KPluk.xbm .left.bPressure config -state normal -label "Pluck Strength" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state disabled -label "Disabled" .right.cont4 config -state disabled -label "Disabled" .right.cont11 config -state disabled -label "Disabled" .right.cont1 config -state disabled -label "Disabled" } if {$program==8} { # Stiff String .pretty config -bitmap @$bitmappath/KPluk.xbm .left.bPressure config -state normal -label "Pluck Strength" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state disabled -label "Disabled" .right.cont4 config -state normal -label "Pickup Position" .right.cont11 config -state normal -label "String Sustain" .right.cont1 config -state normal -label "String Stretch" set cont1 10.0 set cont4 64.0 set cont11 96.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$program==9} { # Sitar .pretty config -bitmap @$bitmappath/KPluk.xbm .left.bPressure config -state normal -label "Pluck Strength" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state disabled -label "Disabled" .right.cont4 config -state disabled -label "Disabled" .right.cont11 config -state disabled -label "Disabled" .right.cont1 config -state disabled -label "Disabled" } if {$program==10} { # Mandolin .pretty config -bitmap @$bitmappath/KPluk.xbm .left.bPressure config -state normal -label "Microphone Position and Gain" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Mandolin Body Size" .right.cont4 config -state normal -label "Pick Position" .right.cont11 config -state normal -label "String Sustain" .right.cont1 config -state normal -label "String Detune" set cont1 10.0 set cont2 64.0 set cont4 64.0 set cont11 96.0 set press 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 changePress $press } if {$program>=11 && $program <=16} { # FM Instruments .pretty config -bitmap @$bitmappath/KFMod.xbm .left.bPressure config -state normal -label "ADSR 2 and 4 Targets" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Modulator Index" .right.cont4 config -state normal -label "FM Pair Crossfader" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" } if {$program>=17 && $program <=18} { # FM Voices or Voice Formants .pretty config -bitmap @$bitmappath/KVoiceFM.xbm .left.bPressure config -state normal -label "Loudness (Spectral Tilt)" .left.pitch config -state normal -label "MIDI Note Number" .right.cont4 config -state normal -label "Vowel (Bass, Tenor, Alto, Sop.)" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" if {$program == 17} { .left.cont2 config -state normal -label "Formant Q" } if {$program == 18} { .left.cont2 config -state normal -label "Voiced/Unvoiced Mix" } set cont1 26.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 } if {$program==19} { # Moog .pretty config -bitmap @$bitmappath/prcFunny.xbm .left.bPressure config -state normal -label "Volume" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Filter Q" .right.cont4 config -state normal -label "Filter Sweep Rate" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$program==20} { # Simple .pretty config -bitmap @$bitmappath/prcFunny.xbm .left.bPressure config -state normal -label "Volume" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Pole Position" .right.cont4 config -state normal -label "Noise/Pitched Cross-Fade" .right.cont11 config -state normal -label "Envelope Rate" .right.cont1 config -state disabled -label "Disabled" set cont2 64.0 set cont4 80.0 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$program==21} { # Drum Kit # Given the vastly different interface for the Drum Kit, we open # a new GUI popup window with the appropriate controls and lock # focus there until the user hits the "Close" button. We then # switch back to the Clarinet (0) instrument. global p toplevel $p wm title $p "STK DrumKit" $p config -bg black wm resizable $p 0 0 grab $p scale $p.velocity -from 0 -to 128 -length 100 \ -variable velocity -orient horizontal -label "Velocity" \ -tickinterval 64 -showvalue true -bg grey66 pack $p.velocity -pady 5 -padx 5 # Configure buttons frame $p.buttons -bg black frame $p.buttons.left -bg black frame $p.buttons.right -bg black button $p.buttons.left.bass -text Bass -bg grey66 \ -command { playDrum 36 } -width 7 button $p.buttons.left.snare -text Snare -bg grey66 \ -command { playDrum 38 } -width 7 button $p.buttons.left.tomlo -text LoTom -bg grey66 \ -command { playDrum 41 } -width 7 button $p.buttons.left.tommid -text MidTom -bg grey66 \ -command { playDrum 45 } -width 7 button $p.buttons.left.tomhi -text HiTom -bg grey66 \ -command { playDrum 50 } -width 7 button $p.buttons.left.homer -text Homer -bg grey66 \ -command { playDrum 90 } -width 7 button $p.buttons.right.hat -text Hat -bg grey66 \ -command { playDrum 42 } -width 7 button $p.buttons.right.ride -text Ride -bg grey66 \ -command { playDrum 46 } -width 7 button $p.buttons.right.crash -text Crash -bg grey66 \ -command { playDrum 49 } -width 7 button $p.buttons.right.cowbel -text CowBel -bg grey66 \ -command { playDrum 56 } -width 7 button $p.buttons.right.tamb -text Tamb -bg grey66 \ -command { playDrum 54 } -width 7 button $p.buttons.right.homer -text Homer -bg grey66 \ -command { playDrum 90 } -width 7 pack $p.buttons.left.bass -pady 5 pack $p.buttons.left.snare -pady 5 pack $p.buttons.left.tomlo -pady 5 pack $p.buttons.left.tommid -pady 5 pack $p.buttons.left.tomhi -pady 5 pack $p.buttons.left.homer -pady 5 pack $p.buttons.right.hat -pady 5 pack $p.buttons.right.ride -pady 5 pack $p.buttons.right.crash -pady 5 pack $p.buttons.right.cowbel -pady 5 pack $p.buttons.right.tamb -pady 5 pack $p.buttons.right.homer -pady 5 pack $p.buttons.left -side left -pady 5 -padx 5 pack $p.buttons.right -side right -pady 5 -padx 5 pack $p.buttons -padx 5 -pady 10 set temp $oldpatch button $p.close -text "Close" -bg grey66 \ -command { destroy $p set patchnum $temp patchChange $patchnum} pack $p.close -side bottom -padx 5 -pady 10 } if {$program==22} { # Banded Waveguide Instruments .pretty config -bitmap @$bitmappath/prcFunny.xbm .left.bPressure config -state normal -label "Strike/Bow Velocity" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Bowing Pressure (0 = Strike)" .right.cont4 config -state normal -label "Bow Motion" .right.cont11 config -state normal -label "Integration Control" .right.cont1 config -state normal -label "Mode Resonance" set preset [expr $value-2200] set press 100.0 set cont1 127.0 set cont2 0.0 set cont4 0.0 set cont11 0.0 puts [format "ControlChange 0.0 1 16 %3.2f" $preset] puts [format "NoteOn 0.0 1 %3.2f %3.2f" $pitch $press] printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 11 $cont11 flush stdout } if {$program==23} { # Shakers .pretty config -bitmap @$bitmappath/phism.xbm .left.bPressure config -state normal -label "Shake Energy" .left.pitch config -state disabled -label "Disabled" .left.cont2 config -state disabled -label "Disabled" .right.cont4 config -state normal -label "Number of Objects" .right.cont11 config -state normal -label "(<--High) Damping (Low-->)" .right.cont1 config -state normal -label "Resonance Center Frequency" set pitch [expr $value-2300] switch $pitch { 0 { .pretty config -bitmap @$bitmappath/maraca.xbm } 1 { .pretty config -bitmap @$bitmappath/cabasa.xbm } 3 { .pretty config -bitmap @$bitmappath/tambourine.xbm } 4 { .pretty config -bitmap @$bitmappath/sleighbell.xbm } 5 { .pretty config -bitmap @$bitmappath/bamboo.xbm } 7 { .pretty config -bitmap @$bitmappath/cokecan.xbm } 19 { .pretty config -bitmap @$bitmappath/guiro.xbm } 20 { .pretty config -bitmap @$bitmappath/rachet.xbm } 22 { .pretty config -bitmap @$bitmappath/bamboo.xbm } } set cont1 64.0 set cont2 64.0 set cont4 64.0 set cont11 64.0 puts [format "NoteOn 0.0 1 %3.2f %3.2f" $pitch $press] printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 flush stdout } if {$program==24} { # Modal Instruments .pretty config -bitmap @$bitmappath/KModal.xbm .left.bPressure config -state normal -label "Strike Vigor" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Stick Hardness" .right.cont4 config -state normal -label "Stick Position" set preset [expr $value-2400] if {$preset == 1} { .right.cont11 config -state normal -label "Vibrato Rate" } else { .right.cont11 config -state disabled -label "Disabled" } .right.cont1 config -state normal -label "Direct Stick Mix" set cont1 20.0 set cont2 64.0 set cont4 64.0 set cont11 64.0 puts $outID [format "ControlChange 0.0 1 16 %3.2f" $preset] printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 flush stdout } if { $program==25 } { # Mesh2D .pretty config -bitmap @$bitmappath/prcFunny.xbm .left.bPressure config -state normal -label "Strike Vigor" .left.pitch config -state disabled -label "Disabled" .left.cont2 config -state normal -label "X Dimension" .right.cont4 config -state normal -label "Y Dimension" .right.cont11 config -state normal -label "Mesh Decay" .right.cont1 config -state normal -label "X-Y Input Position" set cont1 0.0 set cont2 96.0 set cont4 120.0 set cont11 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 flush stdout } if { $program==26 } { # Resonate .pretty config -bitmap @$bitmappath/prcFunny.xbm .left.bPressure config -state normal -label "Gain" .left.pitch config -state disabled -label "Disabled" .left.cont2 config -state normal -label "Resonance Frequency" .right.cont4 config -state normal -label "Resonance Radius" .right.cont11 config -state normal -label "Notch Frequency" .right.cont1 config -state normal -label "Notch Radius" set cont2 20.0 set cont4 120.0 set cont11 64.0 set cont1 0.0 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 flush stdout } if { $program==27 } { # Whistle .pretty config -bitmap @$bitmappath/prcFunny.xbm .left.bPressure config -state normal -label "Gain" .left.pitch config -state normal -label "Whistle Pitch" .left.cont2 config -state normal -label "Blowing Modulation" .right.cont4 config -state normal -label "Noise Gain" .right.cont11 config -state normal -label "Fipple Frequency Modulation" .right.cont1 config -state normal -label "Fipple Gain Modulation" set cont2 64.0 set cont4 40.0 set cont11 64.0 set cont1 64.0 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 flush stdout } set oldpatch $value } } bind . {+ center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return } stk-4.5.0/projects/demo/tcl/Drums.tcl0000644000076600007660000000705012327014024015272 0ustar gary# Tcl/Tk Drum GUI for the Synthesis Toolkit (STK) # Set initial control values set press 127 # Turn down the reverb puts "ControlChange 0.0 1 44.0 0.0" # Configure main window wm title . "STK Drum Controller" wm iconname . "drum" . config -bg black # Configure slider scale .bPressure -from 0 -to 128 -length 100 \ -command {changePress } -variable press\ -orient horizontal -label "Velocity" \ -tickinterval 64 -showvalue true -bg grey66 pack .bPressure -pady 5 -padx 5 # Configure buttons frame .buttons -bg black frame .buttons.left -bg black frame .buttons.right -bg black button .buttons.left.bass -text Bass -bg grey66 \ -command { playDrum 36 } -width 7 button .buttons.left.snare -text Snare -bg grey66 \ -command { playDrum 38 } -width 7 button .buttons.left.tomlo -text LoTom -bg grey66 \ -command { playDrum 41 } -width 7 button .buttons.left.tommid -text MidTom -bg grey66 \ -command { playDrum 45 } -width 7 button .buttons.left.tomhi -text HiTom -bg grey66 \ -command { playDrum 50 } -width 7 button .buttons.left.homer -text Homer -bg grey66 \ -command { playDrum 90 } -width 7 button .buttons.right.hat -text Hat -bg grey66 \ -command { playDrum 42 } -width 7 button .buttons.right.ride -text Ride -bg grey66 \ -command { playDrum 46 } -width 7 button .buttons.right.crash -text Crash -bg grey66 \ -command { playDrum 49 } -width 7 button .buttons.right.cowbel -text CowBel -bg grey66 \ -command { playDrum 56 } -width 7 button .buttons.right.tamb -text Tamb -bg grey66 \ -command { playDrum 54 } -width 7 button .buttons.right.homer -text Homer -bg grey66 \ -command { playDrum 90 } -width 7 pack .buttons.left.bass -pady 5 pack .buttons.left.snare -pady 5 pack .buttons.left.tomlo -pady 5 pack .buttons.left.tommid -pady 5 pack .buttons.left.tomhi -pady 5 pack .buttons.left.homer -pady 5 pack .buttons.right.hat -pady 5 pack .buttons.right.ride -pady 5 pack .buttons.right.crash -pady 5 pack .buttons.right.cowbel -pady 5 pack .buttons.right.tamb -pady 5 pack .buttons.right.homer -pady 5 pack .buttons.left -side left -pady 5 -padx 5 pack .buttons.right -side right -pady 5 -padx 5 pack .buttons -pady 5 -padx 5 # Configure exit button button .exit -text "Exit Program" -bg grey66 -command myExit pack .exit -side bottom -pady 20 # Bind an X windows "close" event with the Exit routine bind . +myExit proc myExit {} { puts [format "ExitProgram"] flush stdout close stdout exit } proc playDrum {value} { global press puts [format "NoteOn 0.0 1 %i %f" $value $press] flush stdout } proc changePress {value} { global press set press $value } bind . { center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return }stk-4.5.0/projects/demo/tcl/Modal.tcl0000644000076600007660000001476312327014024015245 0ustar garyset pitch 64.0 set press 64.0 set cont1 0.0 set cont2 64.0 set cont4 64.0 set cont7 128.0 set cont11 64.0 set cont44 24.0 set preset 0 # Configure main window wm title . "STK Modal Bar Interface" wm iconname . "modal" . config -bg black # Configure preset radio buttons frame .radio1 -bg black frame .radio2 -bg black radiobutton .radio1.0 -text Marimba -bg grey66 \ -variable preset -value 0 -command { patchChange $preset } radiobutton .radio1.1 -text Vibraphone -bg grey66 \ -variable preset -value 1 -command { patchChange $preset } radiobutton .radio1.2 -text Agogo -bg grey66 \ -variable preset -value 2 -command { patchChange $preset } radiobutton .radio1.3 -text Wood1 -bg grey66 \ -variable preset -value 3 -command { patchChange $preset } radiobutton .radio2.4 -text Reso -bg grey66 \ -variable preset -value 4 -command { patchChange $preset } radiobutton .radio2.5 -text Wood2 -bg grey66 \ -variable preset -value 5 -command { patchChange $preset } radiobutton .radio2.6 -text Beats -bg grey66 \ -variable preset -value 6 -command { patchChange $preset } radiobutton .radio2.7 -text 2Fix -bg grey66 \ -variable preset -value 7 -command { patchChange $preset } radiobutton .radio2.8 -text Clump -bg grey66 \ -variable preset -value 8 -command { patchChange $preset } pack .radio1.0 -side left -padx 5 pack .radio1.1 -side left -padx 5 -pady 10 pack .radio1.2 -side left -padx 5 -pady 10 pack .radio1.3 -side left -padx 5 -pady 10 pack .radio1 pack .radio2.4 -side left -padx 5 pack .radio2.5 -side left -padx 5 pack .radio2.6 -side left -padx 5 -pady 10 pack .radio2.7 -side left -padx 5 -pady 10 pack .radio2.8 -side left -padx 5 -pady 10 pack .radio2 # Configure bitmap display if {[file isdirectory bitmaps]} { set bitmappath bitmaps } else { set bitmappath tcl/bitmaps } button .pretty -bitmap @$bitmappath/KModal.xbm \ -background white -foreground black pack .pretty -padx 5 -pady 10 # Configure "note-on" buttons frame .noteOn -bg black button .noteOn.on -text NoteOn -bg grey66 -command { noteOn $pitch $press } button .noteOn.off -text NoteOff -bg grey66 -command { noteOff $pitch 127.0 } button .noteOn.exit -text "Exit Program" -bg grey66 -command myExit pack .noteOn.on -side left -padx 5 pack .noteOn.off -side left -padx 5 -pady 10 pack .noteOn.exit -side left -padx 5 -pady 10 pack .noteOn # Configure sliders frame .left -bg black frame .right -bg black scale .left.volume -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 7} \ -orient horizontal -label "Volume" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont7 scale .left.bPressure -from 0 -to 128 -length 200 \ -command {changePress } -variable press \ -orient horizontal -label "Strike Vigor" \ -tickinterval 32 -showvalue true -bg grey66 scale .left.pitch -from 0 -to 128 -length 200 \ -command {changePitch } -variable pitch \ -orient horizontal -label "MIDI Note Number" \ -tickinterval 32 -showvalue true -bg grey66 scale .left.cont2 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 2} \ -orient horizontal -label "Stick Hardness" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont2 scale .right.reverb -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 44} \ -orient horizontal -label "Reverb Mix" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont44 scale .right.cont4 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 4} \ -orient horizontal -label "Stick Position" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont4 scale .right.cont11 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 11} \ -orient horizontal -label "Disabled" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont11 -state disabled scale .right.cont1 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 1} \ -orient horizontal -label "Direct Stick Mix" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont1 pack .left.volume -padx 10 -pady 10 pack .left.bPressure -padx 10 -pady 10 pack .left.pitch -padx 10 -pady 10 pack .left.cont2 -padx 10 -pady 10 pack .right.reverb -padx 10 -pady 10 pack .right.cont4 -padx 10 -pady 10 pack .right.cont11 -padx 10 -pady 10 pack .right.cont1 -padx 10 -pady 10 pack .left -side left pack .right -side right #bind all { bind . { noteOn $pitch $press } # Bind an X windows "close" event with the Exit routine bind . +myExit proc myExit {} { global pitch puts [format "ExitProgram"] flush stdout close stdout exit } proc noteOn {pitchVal pressVal} { puts [format "NoteOn 0.0 1 %3.2f %3.2f" $pitchVal $pressVal] flush stdout } proc noteOff {pitchVal pressVal} { puts [format "NoteOff 0.0 1 %3.2f %3.2f" $pitchVal $pressVal] flush stdout } proc patchChange {value} { global preset if {$preset == 1} { .right.cont11 config -state normal -label "Vibrato Rate" } else { .right.cont11 config -state disabled -label "Disabled" } printWhatz "ControlChange 0.0 1 " 16 $preset } proc printWhatz {tag value1 value2 } { puts [format "%s %2i %3.2f" $tag $value1 $value2] flush stdout } proc changePress {value} { puts [format "AfterTouch 0.0 1 %3.2f" $value] flush stdout } proc changePitch {value} { puts [format "PitchChange 0.0 1 %3.2f" $value] flush stdout } bind . { center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return } stk-4.5.0/projects/demo/tcl/Physical.tcl0000644000076600007660000003727312327014024015766 0ustar gary# Tcl/Tk Physical Model GUI for the Synthesis Toolkit (STK) # Set initial control values set pitch 64.0 set press 64.0 set cont1 0.0 set cont2 20.0 set cont4 64.0 set cont7 128.0 set cont11 64.0 set cont44 24.0 set oldpatch 0 set patchnum 0 # Configure main window wm title . "STK Physical Model Controller" wm iconname . "physical" . config -bg black # Configure patch change buttons frame .radios1 -bg black frame .radios2 -bg black radiobutton .radios1.clar -text "Clarinet" -bg grey66 \ -variable patchnum -value 0 -command { patchChange $patchnum } radiobutton .radios1.hole -text "BlowHole" -bg grey66 \ -variable patchnum -value 1 -command { patchChange $patchnum } radiobutton .radios1.fony -text "Saxofony" -bg grey66 \ -variable patchnum -value 2 -command { patchChange $patchnum } radiobutton .radios1.flut -text "Flute" -bg grey66 \ -variable patchnum -value 3 -command { patchChange $patchnum } radiobutton .radios1.bras -text "Brass" -bg grey66 \ -variable patchnum -value 4 -command { patchChange $patchnum } radiobutton .radios1.botl -text "BlowBotl" -bg grey66 \ -variable patchnum -value 5 -command { patchChange $patchnum } radiobutton .radios2.bowd -text "Bowed" -bg grey66 \ -variable patchnum -value 6 -command { patchChange $patchnum } radiobutton .radios2.pluk -text "Plucked" -bg grey66 \ -variable patchnum -value 7 -command { patchChange $patchnum } radiobutton .radios2.karp -text "StifKarp" -bg grey66 \ -variable patchnum -value 8 -command { patchChange $patchnum } radiobutton .radios2.sitr -text "Sitar" -bg grey66 \ -variable patchnum -value 9 -command { patchChange $patchnum } radiobutton .radios2.mand -text "Mandolin" -bg grey66 \ -variable patchnum -value 10 -command { patchChange $patchnum } pack .radios1.clar -side left -padx 5 -pady 10 pack .radios1.hole -side left -padx 5 -pady 10 pack .radios1.fony -side left -padx 5 -pady 10 pack .radios1.flut -side left -padx 5 -pady 10 pack .radios1.bras -side left -padx 5 -pady 10 pack .radios1.botl -side left -padx 5 -pady 10 pack .radios2.bowd -side left -padx 5 -pady 10 pack .radios2.pluk -side left -padx 5 -pady 10 pack .radios2.karp -side left -padx 5 -pady 10 pack .radios2.sitr -side left -padx 5 -pady 10 pack .radios2.mand -side left -padx 5 -pady 10 pack .radios1 pack .radios2 # Configure bitmap display if {[file isdirectory bitmaps]} { set bitmappath bitmaps } else { set bitmappath tcl/bitmaps } button .pretty -bitmap @$bitmappath/Klar.xbm \ -background white -foreground black pack .pretty -padx 5 -pady 10 # Configure "note-on" buttons frame .noteOn -bg black button .noteOn.on -text NoteOn -bg grey66 -command { noteOn $pitch $press } button .noteOn.off -text NoteOff -bg grey66 -command { noteOff $pitch 127.0 } button .noteOn.exit -text "Exit Program" -bg grey66 -command myExit pack .noteOn.on -side left -padx 5 pack .noteOn.off -side left -padx 5 -pady 10 pack .noteOn.exit -side left -padx 5 -pady 10 pack .noteOn # Configure sliders frame .left -bg black frame .right -bg black scale .left.volume -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 7} \ -orient horizontal -label "Volume" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont7 scale .left.bPressure -from 0 -to 128 -length 200 \ -command {changePress } -variable press \ -orient horizontal -label "Breath Pressure" \ -tickinterval 32 -showvalue true -bg grey66 scale .left.pitch -from 0 -to 128 -length 200 \ -command {changePitch } -variable pitch \ -orient horizontal -label "MIDI Note Number" \ -tickinterval 32 -showvalue true -bg grey66 scale .left.cont2 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 2} \ -orient horizontal -label "Reed Stiffness" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont2 scale .right.reverb -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 44} \ -orient horizontal -label "Reverb Mix" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont44 scale .right.cont4 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 4} \ -orient horizontal -label "Breath Noise" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont4 scale .right.cont11 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 11} \ -orient horizontal -label "Vibrato Rate" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont11 scale .right.cont1 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 1} \ -orient horizontal -label "Vibrato Amount" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont1 pack .left.volume -padx 10 -pady 10 pack .left.bPressure -padx 10 -pady 10 pack .left.pitch -padx 10 -pady 10 pack .left.cont2 -padx 10 -pady 10 pack .right.reverb -padx 10 -pady 10 pack .right.cont4 -padx 10 -pady 10 pack .right.cont11 -padx 10 -pady 10 pack .right.cont1 -padx 10 -pady 10 pack .left -side left pack .right -side right bind . { noteOn $pitch $press } # Bind an X windows "close" event with the Exit routine bind . +myExit proc myExit {} { global pitch puts [format "ExitProgram"] flush stdout close stdout exit } proc noteOn {pitchVal pressVal} { puts [format "NoteOn 0.0 1 %f %f" $pitchVal $pressVal] flush stdout } proc noteOff {pitchVal pressVal} { puts [format "NoteOff 0.0 1 %f %f" $pitchVal $pressVal] flush stdout } proc patchChange {value} { global bitmappath cont1 cont2 cont4 cont11 pitch oldpatch puts [format "ProgramChange 0.0 1 %i" $value] if {$value==0} { # Clarinet .pretty config -bitmap @$bitmappath/Klar.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Reed Stiffness" .right.cont4 config -state normal -label "Breath Noise" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 20.0 set cont2 64.0 set cont4 20.0 set cont11 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$value==1} { # BlowHole .pretty config -bitmap @$bitmappath/Klar.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Reed Stiffness" .right.cont4 config -state normal -label "Breath Noise" .right.cont11 config -state normal -label "Tonehole Openness" .right.cont1 config -state normal -label "Register Vent Openness" set cont1 0.0 set cont2 64.0 set cont4 20.0 set cont11 0.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$value==2} { # Saxofony .pretty config -bitmap @$bitmappath/prcFunny.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Reed Stiffness" .right.cont4 config -state normal -label "Breath Noise" .right.cont11 config -state normal -label "Blow Position" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 20.0 set cont2 64.0 set cont4 20.0 set cont11 26.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$value==3} { # Flute .pretty config -bitmap @$bitmappath/KFloot.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Embouchure Adjustment" .right.cont4 config -state normal -label "Breath Noise" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 20.0 set cont2 64.0 set cont4 20.0 set cont11 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$value==4} { # Brass .pretty config -bitmap @$bitmappath/KHose.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Lip Adjustment" .right.cont4 config -state normal -label "Slide Length" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 0.0 set cont2 64.0 set cont4 20.0 set cont11 64.0 set press 80.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 puts [format "NoteOn 0.0 1 %3.2f %3.2f" $pitch $press] } if {$value==5} { # Bottle .pretty config -bitmap @$bitmappath/prcFunny.xbm .left.bPressure config -state normal -label "Breath Pressure" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state disabled -label "Disabled" .right.cont4 config -state normal -label "Breath Noise" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 20.0 set cont4 20.0 set cont11 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$value==6} { # Bowed String .pretty config -bitmap @$bitmappath/KFiddl.xbm .left.bPressure config -state normal -label "Volume" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Bow Pressure" .right.cont4 config -state normal -label "Bow Position" .right.cont11 config -state normal -label "Vibrato Rate" .right.cont1 config -state normal -label "Vibrato Amount" set cont1 4.0 set cont2 64.0 set cont4 24.0 set cont11 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$value==7} { # Yer Basic Pluck .pretty config -bitmap @$bitmappath/KPluk.xbm .left.bPressure config -state normal -label "Pluck Strength" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state disabled -label "Disabled" .right.cont4 config -state disabled -label "Disabled" .right.cont11 config -state disabled -label "Disabled" .right.cont1 config -state disabled -label "Disabled" } if {$value==8} { # Stiff String .pretty config -bitmap @$bitmappath/KPluk.xbm .left.bPressure config -state normal -label "Pluck Strength" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state disabled -label "Disabled" .right.cont4 config -state normal -label "Pickup Position" .right.cont11 config -state normal -label "String Sustain" .right.cont1 config -state normal -label "String Stretch" set cont1 10.0 set cont4 64.0 set cont11 96.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 } if {$value==9} { # Sitar .pretty config -bitmap @$bitmappath/KPluk.xbm .left.bPressure config -state normal -label "Pluck Strength" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state disabled -label "Disabled" .right.cont4 config -state disabled -label "Disabled" .right.cont11 config -state disabled -label "Disabled" .right.cont1 config -state disabled -label "Disabled" } if {$value==10} { # Mandolin .pretty config -bitmap @$bitmappath/KPluk.xbm .left.bPressure config -state normal -label "Microphone Position and Gain" .left.pitch config -state normal -label "MIDI Note Number" .left.cont2 config -state normal -label "Mandolin Body Size" .right.cont4 config -state normal -label "Pick Position" .right.cont11 config -state normal -label "String Sustain" .right.cont1 config -state normal -label "String Detune" set cont1 10.0 set cont2 64.0 set cont4 64.0 set cont11 96.0 set press 64.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 11 $cont11 changePress $press } set oldpatch $value } proc printWhatz {tag value1 value2 } { puts [format "%s %i %f" $tag $value1 $value2] flush stdout } proc changePress {value} { global patchnum if { $patchnum<7 || $patchnum>9 } { puts [format "AfterTouch 0.0 1 %f" $value] flush stdout } } proc changePitch {value} { puts [format "PitchChange 0.0 1 %.3f" $value] flush stdout } bind . { center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return }stk-4.5.0/projects/demo/tcl/Shakers.tcl0000644000076600007660000002052612327014024015603 0ustar gary# Tcl/Tk Shakers GUI for the Synthesis Toolkit (STK) # Set initial control values set press 64.0 set cont1 64.0 set cont4 64.0 set cont11 64.0 set cont99 24.0 set patchnum 0 # Configure main window wm title . "STK Shakers Controller" wm iconname . "shakers" . config -bg black # Configure sliders frame .right -bg black scale .right.bPressure -from 0 -to 128 -length 300 \ -command {changePress } -variable press\ -orient horizontal -label "Shake Energy" \ -tickinterval 32 -showvalue true -bg grey66 scale .right.cont2 -from 0 -to 128 -length 300 \ -command {printWhatz "ControlChange -1.0 1 " 11} \ -orient horizontal -label "(<--High) System Damping (Low-->)" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont4 scale .right.cont3 -from 0 -to 128 -length 300 \ -command {printWhatz "ControlChange -1.0 1 " 4} \ -orient horizontal -label "Number of Objects" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont11 scale .right.vibrato -from 0 -to 128 -length 300 \ -command {printWhatz "ControlChange -1.0 1 " 1} \ -orient horizontal -label "Resonance Center Freq." \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont1 scale .right.reverb -from 0 -to 128 -length 300 \ -command {printWhatz "ControlChange -1.0 1 " 44} \ -orient horizontal -label "Reverb Mix" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont99 pack .right.bPressure -padx 10 -pady 10 pack .right.vibrato -padx 10 -pady 10 pack .right.cont2 -padx 10 -pady 10 pack .right.cont3 -padx 10 -pady 10 pack .right.reverb -padx 10 -pady 10 pack .right -side right -padx 5 -pady 5 # Configure radio buttons frame .buttons -bg black frame .buttons.columns -bg black frame .buttons.columns.left1 -bg black frame .buttons.columns.left2 -bg black radiobutton .buttons.columns.left1.maraca -text Maraca -bg grey66 \ -command { patchChange 0 } -variable patchnum -width 15 \ -justify left -value 0 radiobutton .buttons.columns.left1.cabasa -text Cabasa -bg grey66 \ -command { patchChange 1 } -variable patchnum -width 15 \ -justify left -value 1 radiobutton .buttons.columns.left1.sekere -text Sekere -bg grey66 \ -command { patchChange 2 } -variable patchnum -width 15 \ -justify left -value 2 radiobutton .buttons.columns.left1.tambourn -text Tambourine -bg grey66 \ -command { patchChange 3 } -variable patchnum -width 15 \ -justify left -value 3 radiobutton .buttons.columns.left1.sleighbl -text "Sleigh Bells" -bg grey66 \ -command { patchChange 4 } -variable patchnum -width 15 \ -justify left -value 4 radiobutton .buttons.columns.left1.bamboo -text Bamboo -bg grey66 \ -command { patchChange 5 } -variable patchnum -width 15 \ -justify left -value 5 radiobutton .buttons.columns.left1.sandpapr -text "Sand Paper" -bg grey66 \ -command { patchChange 6 } -variable patchnum -width 15 \ -justify left -value 6 radiobutton .buttons.columns.left1.cokecan -text "Coke Can" -bg grey66 \ -command { patchChange 7 } -variable patchnum -width 15 \ -justify left -value 7 radiobutton .buttons.columns.left1.stix1 -text Sticks -bg grey66 \ -command { patchChange 8 } -variable patchnum -width 15 \ -justify left -value 8 radiobutton .buttons.columns.left1.crunch1 -text Crunch -bg grey66 \ -command { patchChange 9 } -variable patchnum -width 15 \ -justify left -value 9 radiobutton .buttons.columns.left1.bigrocks -text "Big Rocks" -bg grey66 \ -command { patchChange 10 } -variable patchnum -width 15 \ -justify left -value 10 radiobutton .buttons.columns.left1.littlerocks -text "Little Rocks" -bg grey66 \ -command { patchChange 11 } -variable patchnum -width 15 \ -justify left -value 11 radiobutton .buttons.columns.left2.nextmug -text "NeXT Mug" -bg grey66 \ -command { patchChange 12 } -variable patchnum -width 15 \ -justify left -value 12 radiobutton .buttons.columns.left2.pennymug -text "Mug & Penny" -bg grey66 \ -command { patchChange 13 } -variable patchnum -width 15 \ -justify left -value 13 radiobutton .buttons.columns.left2.nicklemug -text "Mug & Nickle" -bg grey66 \ -command { patchChange 14 } -variable patchnum -width 15 \ -justify left -value 14 radiobutton .buttons.columns.left2.dimemug -text "Mug & Dime" -bg grey66 \ -command { patchChange 15 } -variable patchnum -width 15 \ -justify left -value 15 radiobutton .buttons.columns.left2.quartermug -text "Mug & Quarter" -bg grey66 \ -command { patchChange 16 } -variable patchnum -width 15 \ -justify left -value 16 radiobutton .buttons.columns.left2.francmug -text "Mug & Franc" -bg grey66 \ -command { patchChange 17 } -variable patchnum -width 15 \ -justify left -value 17 radiobutton .buttons.columns.left2.pesomug -text "Mug & Peso" -bg grey66 \ -command { patchChange 18 } -variable patchnum -width 15 \ -justify left -value 18 radiobutton .buttons.columns.left2.guiro -text Guiro -bg grey66 \ -command { patchChange 19 } -variable patchnum -width 15 \ -justify left -value 19 radiobutton .buttons.columns.left2.wrench -text Wrench -bg grey66 \ -command { patchChange 20 } -variable patchnum -width 15 \ -justify left -value 20 radiobutton .buttons.columns.left2.waterdrp -text "Water Drops" -bg grey66 \ -command { patchChange 21 } -variable patchnum -width 15 \ -justify left -value 21 radiobutton .buttons.columns.left2.tunedbamboo -text "Tuned Bamboo" -bg grey66 \ -command { patchChange 22 } -variable patchnum -width 15 \ -justify left -value 22 pack .buttons.columns.left1.maraca -pady 5 pack .buttons.columns.left1.cabasa -pady 5 pack .buttons.columns.left1.sekere -pady 5 pack .buttons.columns.left1.tambourn -pady 5 pack .buttons.columns.left1.sleighbl -pady 5 pack .buttons.columns.left1.bamboo -pady 5 pack .buttons.columns.left1.sandpapr -pady 5 pack .buttons.columns.left1.cokecan -pady 5 pack .buttons.columns.left1.stix1 -pady 5 pack .buttons.columns.left1.crunch1 -pady 5 pack .buttons.columns.left1.bigrocks -pady 5 pack .buttons.columns.left1.littlerocks -pady 5 pack .buttons.columns.left2.nextmug -pady 5 pack .buttons.columns.left2.pennymug -pady 5 pack .buttons.columns.left2.nicklemug -pady 5 pack .buttons.columns.left2.dimemug -pady 5 pack .buttons.columns.left2.quartermug -pady 5 pack .buttons.columns.left2.francmug -pady 5 pack .buttons.columns.left2.pesomug -pady 5 pack .buttons.columns.left2.guiro -pady 5 pack .buttons.columns.left2.wrench -pady 5 pack .buttons.columns.left2.waterdrp -pady 5 pack .buttons.columns.left2.tunedbamboo -pady 5 pack .buttons.columns.left1 -side left -padx 10 pack .buttons.columns.left2 -side left -padx 10 pack .buttons.columns -padx 10 -side top # Configure exit button button .buttons.exit -text "Exit Program" -bg grey66 -command myExit pack .buttons.exit -pady 10 -side bottom pack .buttons -pady 5 #bind all { bind . { patchChange $patchnum } # Bind an X windows "close" event with the Exit routine bind . +myExit proc myExit {} { puts [format "ExitProgram"] flush stdout close stdout exit } proc patchChange {value} { global press puts [format "NoteOn -1.0 1 %i $press" $value] flush stdout } proc printWhatz {tag value1 value2 } { puts [format "%s %i %f" $tag $value1 $value2] flush stdout } proc changePress {value} { puts [format "AfterTouch -1.0 1 %f" $value] flush stdout } eval patchChange $patchnum bind . { center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return } stk-4.5.0/projects/demo/tcl/Voice.tcl0000644000076600007660000001204712327014024015247 0ustar gary# Tcl/Tk Voice GUI for the Synthesis Toolkit (STK) # Set initial control values set pitch 64.0 set press 64.0 set cont1 20.0 set cont2 64.0 set cont4 64.0 set cont11 64.0 set patchnum 17 # Configure main window wm title . "STK Voice Model Controller" wm iconname . "voice" . config -bg black # Configure patch change buttons frame .instChoice -bg black radiobutton .instChoice.fm -text "FMVoice" -bg grey66 \ -command { patchChange 17 } -value 17 -variable patchnum radiobutton .instChoice.form -text "Formant" -bg grey66 \ -command { patchChange 18 } -value 18 -variable patchnum pack .instChoice.fm -side left -padx 5 pack .instChoice.form -side left -padx 5 -pady 10 pack .instChoice -side top # Configure bitmap display if {[file isdirectory bitmaps]} { set bitmappath bitmaps } else { set bitmappath tcl/bitmaps } button .pretty -bitmap @$bitmappath/KVoiceFM.xbm \ -background white -foreground black pack .pretty -padx 5 -pady 10 # Configure "note-on" buttons frame .noteOn -bg black button .noteOn.on -text NoteOn -bg grey66 -command { noteOn $pitch $press } button .noteOn.off -text NoteOff -bg grey66 -command { noteOff $pitch 127.0 } button .noteOn.exit -text "Exit Program" -bg grey66 -command myExit pack .noteOn.on -side left -padx 5 pack .noteOn.off -side left -padx 5 -pady 10 pack .noteOn.exit -side left -padx 5 -pady 10 pack .noteOn # Configure sliders frame .left -bg black frame .right -bg black scale .left.bPressure -from 0 -to 128 -length 200 \ -command {changePress } -variable press \ -orient horizontal -label "Loudness (Spectral Tilt)" \ -tickinterval 32 -showvalue true -bg grey66 scale .left.pitch -from 0 -to 128 -length 200 \ -command {changePitch } -variable pitch \ -orient horizontal -label "MIDI Note Number" \ -tickinterval 32 -showvalue true -bg grey66 scale .left.cont1 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange -1.0 1 " 2} \ -orient horizontal -label "Formant Q / Voiced/Un." \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont2 scale .right.cont2 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange -1.0 1 " 4} \ -orient horizontal -label "Vowel (Bass, Tenor, Alto, Sop.)" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont4 scale .right.cont3 -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange -1.0 1 " 11} \ -orient horizontal -label "Vibrato Rate" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont11 scale .right.vibrato -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange -1.0 1 " 1} \ -orient horizontal -label "Vibrato Amount" \ -tickinterval 32 -showvalue true -bg grey66\ -variable cont1 pack .left.bPressure -padx 10 -pady 10 pack .left.pitch -padx 10 -pady 10 pack .left.cont1 -padx 10 -pady 10 pack .right.cont2 -padx 10 -pady 10 pack .right.cont3 -padx 10 -pady 10 pack .right.vibrato -padx 10 -pady 10 pack .left -side left pack .right -side right # Bind an X windows "close" event with the Exit routine bind . +myExit proc myExit {} { global pitch puts [format "ExitProgram"] flush stdout close stdout exit } proc noteOn {pitchVal pressVal} { puts [format "NoteOn 0.0 1 %f %f" $pitchVal $pressVal] flush stdout } proc noteOff {pitchVal pressVal} { puts [format "NoteOff 0.0 1 %f %f" $pitchVal $pressVal] flush stdout } proc patchChange {value} { global bitmappath cont1 cont2 cont4 cont11 puts [format "ProgramChange 0.0 1 %i" $value] if {$value==16} { .pretty config -bitmap @$bitmappath/KVoiceFM.xbm } if {$value==17} { .pretty config -bitmap @$bitmappath/KVoicForm.xbm } flush stdout set cont1 0.0 set cont2 20.0 set cont4 64.0 set cont11 64.0 } proc printWhatz {tag value1 value2 } { puts [format "%s %i %f" $tag $value1 $value2] flush stdout } proc changePress {value} { puts [format "AfterTouch 0.0 1 %f" $value] flush stdout } proc changePitch {value} { puts [format "PitchChange 0.0 1 %.3f" $value] flush stdout } bind . { center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return }stk-4.5.0/projects/demo/utilities.cpp0000644000076600007660000002267512327014024015443 0ustar gary// Miscellaneous parsing and error functions for use with STK demo program. // // Gary P. Scavone, 1999. #include #include "utilities.h" // STK Instrument Classes #include "Clarinet.h" #include "BlowHole.h" #include "Saxofony.h" #include "Flute.h" #include "Brass.h" #include "BlowBotl.h" #include "Bowed.h" #include "Plucked.h" #include "StifKarp.h" #include "Sitar.h" #include "Mandolin.h" #include "Rhodey.h" #include "Wurley.h" #include "TubeBell.h" #include "HevyMetl.h" #include "PercFlut.h" #include "BeeThree.h" #include "FMVoices.h" #include "VoicForm.h" #include "Moog.h" #include "Simple.h" #include "Drummer.h" #include "BandedWG.h" #include "Shakers.h" #include "ModalBar.h" #include "Mesh2D.h" #include "Resonate.h" #include "Whistle.h" using namespace stk; #define NUM_INSTS 28 // The order of the following list is important. The location of a particular // instrument in the list should correspond to that instrument's ProgramChange // number (i.e. Clarinet = ProgramChange 0). char insts[NUM_INSTS][10] = { "Clarinet", "BlowHole", "Saxofony", "Flute", "Brass", "BlowBotl", "Bowed", "Plucked", "StifKarp", "Sitar", "Mandolin", "Rhodey", "Wurley", "TubeBell", "HevyMetl", "PercFlut", "BeeThree", "FMVoices", "VoicForm", "Moog", "Simple", "Drummer", "BandedWG", "Shakers", "ModalBar", "Mesh2D", "Resonate", "Whistle" }; int voiceByNumber(int number, Instrmnt **instrument) { int temp = number; if (number==0) *instrument = new Clarinet(10.0); else if (number==1) *instrument = new BlowHole(10.0); else if (number==2) *instrument = new Saxofony(10.0); else if (number==3) *instrument = new Flute(10.0); else if (number==4) *instrument = new Brass(10.0); else if (number==5) *instrument = new BlowBotl; else if (number==6) *instrument = new Bowed(10.0); else if (number==7) *instrument = new Plucked(5.0); else if (number==8) *instrument = new StifKarp(5.0); else if (number==9) *instrument = new Sitar(5.0); else if (number==10) *instrument = new Mandolin(5.0); else if (number==11) *instrument = new Rhodey; else if (number==12) *instrument = new Wurley; else if (number==13) *instrument = new TubeBell; else if (number==14) *instrument = new HevyMetl; else if (number==15) *instrument = new PercFlut; else if (number==16) *instrument = new BeeThree; else if (number==17) *instrument = new FMVoices; else if (number==18) *instrument = new VoicForm; else if (number==19) *instrument = new Moog; else if (number==20) *instrument = new Simple; else if (number==21) *instrument = new Drummer; else if (number==22) *instrument = new BandedWG; else if (number==23) *instrument = new Shakers; else if (number==24) *instrument = new ModalBar; else if (number==25) *instrument = new Mesh2D(10, 10); else if (number==26) *instrument = new Resonate; else if (number==27) *instrument = new Whistle; else { printf("\nUnknown instrument or program change requested!\n"); temp = -1; } return temp; } int voiceByName(char *name, Instrmnt **instrument) { int i = 0, temp = -1, notFound = 1;; while ( i < NUM_INSTS && notFound ) { if ( !strcmp(name, insts[i]) ) { notFound = 0; temp = voiceByNumber(i, instrument); } i++; } if (temp < 0) printf("\nUnknown instrument or program change requested!\n"); return temp; } void usage(char *function) { // Error function in case of incorrect command-line argument specifications int i, j; printf("\nuseage: %s Instrument flag(s) \n", function); printf(" where flag = -s RATE to specify a sample rate,\n"); printf(" -n NUMBER specifies the number of voices to allocate,\n"); printf(" -ow for .wav audio output file,\n"); printf(" -os for .snd audio output file,\n"); printf(" -om for .mat audio output file,\n"); printf(" -oa for .aif audio output file,\n"); #if defined(__STK_REALTIME__) printf(" -or for realtime audio output,\n"); #endif printf(" -if to read control input from SKINI file,\n"); #if defined(__STK_REALTIME__) printf(" -ip for realtime control input by pipe,\n"); printf(" -im for realtime control input by MIDI (virtual port = 0, default = 1),\n"); #endif printf(" and Instrument = one of these:\n"); for ( i=0; i are not\n"); printf("specified, default names will be indicated. Each flag\n"); printf("must include its own '-' sign.\n\n"); exit(0); } int checkArgs(int nArgs, char *args[]) { int w, i = 2, j = 0; int nWvOuts = 0; char flags[2][50] = {""}; bool realtime = false; if (nArgs < 3 || nArgs > 22) usage(args[0]); while (i < nArgs) { if (args[i][0] == '-') { if (args[i][1] == 'o') { if ( args[i][2] == 'r' ) realtime = true; if ( (args[i][2] == 's') || (args[i][2] == 'w') || (args[i][2] == 'm') || (args[i][2] == 'a') ) nWvOuts++; flags[0][j] = 'o'; flags[1][j++] = args[i][2]; } else if (args[i][1] == 'i') { if ( (args[i][2] != 'p') && (args[i][2] != 'm') && (args[i][2] != 'f') ) usage(args[0]); flags[0][j] = 'i'; flags[1][j++] = args[i][2]; } else if (args[i][1] == 's' && (i+1 < nArgs) && args[i+1][0] != '-' ) { Stk::setSampleRate( atoi(args[i+1]) ); flags[0][j++] = 's'; } else if (args[i][1] == 'n' && (i+1 < nArgs) && args[i+1][0] != '-' ) { flags[0][j++] = 'n'; } else usage(args[0]); } i++; } // Check for multiple flags of the same type for ( i=0; i<=j; i++ ) { w = i+1; while (w <= j ) { if ( flags[0][i] == flags[0][w] && flags[1][i] == flags[1][w] ) { printf("\nError: Multiple command line flags of the same type specified.\n\n"); usage(args[0]); } w++; } } // Make sure we have at least one output type if ( nWvOuts < 1 && !realtime ) usage(args[0]); return nWvOuts; } int countVoices(int nArgs, char *args[]) { int i = 2, nInstruments = 1; while ( i < nArgs ) { if ( strncmp( args[i], "-n", 2) == 0 ) { if ( i+1 < nArgs && args[i+1][0] != '-' ) { nInstruments = atoi( args[i+1] ); if ( nInstruments < 1 ) nInstruments = 1; } } i++; } return nInstruments; } bool parseArgs(int nArgs, char *args[], WvOut **output, Messager& messager) { int i = 2, j = 0, nWvIns = 0; bool realtime = false; char fileName[256]; while (i < nArgs) { if ( (args[i][0] == '-') && (args[i][1] == 'i') ) { switch(args[i][2]) { case 'f': strcpy(fileName,args[++i]); if ( !messager.setScoreFile( fileName ) ) exit(0); nWvIns++; break; case 'p': #if defined(__STK_REALTIME__) if ( !messager.startStdInput() ) exit(0); nWvIns++; break; #else usage(args[0]); #endif case 'm': #if defined(__STK_REALTIME__) // Check for an optional MIDI port argument. if ((i+1 < nArgs) && args[i+1][0] != '-') { int port = atoi(args[++i]); if ( !messager.startMidiInput( port-1 ) ) exit(0); } else if ( !messager.startMidiInput() ) exit(0); nWvIns++; break; #else usage(args[0]); #endif default: usage(args[0]); break; } } else if ( (args[i][0] == '-') && (args[i][1] == 'o') ) { switch(args[i][2]) { case 'r': #if defined(__STK_REALTIME__) realtime = true; break; #else usage(args[0]); #endif case 'w': if ((i+1 < nArgs) && args[i+1][0] != '-') { i++; strcpy(fileName,args[i]); } else strcpy(fileName,"testwav"); output[j] = new FileWvOut(fileName, 1, FileWrite::FILE_WAV ); j++; break; case 's': if ((i+1 < nArgs) && args[i+1][0] != '-') { i++; strcpy(fileName,args[i]); } else strcpy(fileName,"testsnd"); output[j] = new FileWvOut(fileName,1, FileWrite::FILE_SND); j++; break; case 'm': if ((i+1 < nArgs) && args[i+1][0] != '-') { i++; strcpy(fileName,args[i]); } else strcpy(fileName,"testmat"); output[j] = new FileWvOut(fileName,1, FileWrite::FILE_MAT); j++; break; case 'a': if ((i+1 < nArgs) && args[i+1][0] != '-') { i++; strcpy(fileName,args[i]); } else strcpy(fileName,"testaif"); output[j] = new FileWvOut(fileName,1, FileWrite::FILE_AIF ); j++; break; default: usage(args[0]); break; } } i++; } if ( nWvIns == 0 ) { #if defined(__STK_REALTIME__) if ( !messager.startStdInput() ) exit(0); #else printf("\nError: The -if file input flag must be specified for non-realtime use.\n\n"); usage(args[0]); #endif } return realtime; } stk-4.5.0/projects/demo/utilities.h0000644000076600007660000000076012327014024015077 0ustar gary// Miscellaneous parsing and error functions for use with STK demo program. // // Gary P. Scavone, 1999. #include "Instrmnt.h" #include "FileWvOut.h" #include "Messager.h" int voiceByNumber(int number, stk::Instrmnt **instrument); int voiceByName(char *name, stk::Instrmnt **instrument); void usage(char *function); int checkArgs(int numArgs, char *args[]); int countVoices(int nArgs, char *args[]); bool parseArgs(int numArgs, char *args[], stk::WvOut **output, stk::Messager& messager); stk-4.5.0/projects/demo/Voice0000755000076600007660000000005612327014024013704 0ustar garywish < tcl/Voice.tcl | ./demo FMVoices -or -ipstk-4.5.0/projects/demo/Voice.bat0000755000076600007660000000005412327014024014447 0ustar garywish < tcl/Voice.tcl | demo FMVoices -or -ipstk-4.5.0/projects/effects/0000755000076600007660000000000012327014024013403 5ustar garystk-4.5.0/projects/effects/effects.cpp0000644000076600007660000002070112327014024015526 0ustar gary/************** Effects Program *********************/ #include "Skini.h" #include "SKINI.msg" #include "Envelope.h" #include "PRCRev.h" #include "JCRev.h" #include "NRev.h" #include "FreeVerb.h" #include "Echo.h" #include "PitShift.h" #include "LentPitShift.h" #include "Chorus.h" #include "Messager.h" #include "RtAudio.h" #include #include #include #include using std::min; using namespace stk; void usage(void) { // Error function in case of incorrect command-line argument specifications std::cout << "\nuseage: effects flags \n"; std::cout << " where flag = -s RATE to specify a sample rate,\n"; std::cout << " flag = -ip for realtime SKINI input by pipe\n"; std::cout << " (won't work under Win95/98),\n"; std::cout << " and flag = -is for realtime SKINI input by socket.\n"; exit(0); } bool done; static void finish(int ignore){ done = true; } // The TickData structure holds all the class instances and data that // are shared by the various processing functions. struct TickData { unsigned int effectId; PRCRev prcrev; JCRev jcrev; NRev nrev; FreeVerb frev; Echo echo; PitShift shifter; LentPitShift lshifter; Chorus chorus; Envelope envelope; Messager messager; Skini::Message message; StkFloat lastSample; StkFloat t60; int counter; bool settling; bool haveMessage; // Default constructor. TickData() : effectId(0), t60(1.0), counter(0), settling( false ), haveMessage( false ) {} }; #define DELTA_CONTROL_TICKS 64 // default sample frames between control input checks // The processMessage() function encapsulates the handling of control // messages. It can be easily relocated within a program structure // depending on the desired scheduling scheme. void processMessage( TickData* data ) { register unsigned int value1 = data->message.intValues[0]; register StkFloat value2 = data->message.floatValues[1]; register StkFloat temp = value2 * ONE_OVER_128; switch( data->message.type ) { case __SK_Exit_: if ( data->settling == false ) goto settle; done = true; return; case __SK_NoteOn_: if ( value2 == 0.0 ) // velocity is zero ... really a NoteOff data->envelope.setTarget( 0.0 ); else // a NoteOn data->envelope.setTarget( 1.0 ); break; case __SK_NoteOff_: data->envelope.setTarget( 0.0 ); break; case __SK_ControlChange_: // Change all effect values so they are "synched" to the interface. switch ( value1 ) { case 20: { // effect type change int type = data->message.intValues[1]; data->effectId = (unsigned int) type; break; } case 22: // effect parameter change 1 data->echo.setDelay( (unsigned long) (temp * Stk::sampleRate() * 0.95) ); data->lshifter.setShift( 1.4 * temp + 0.3 ); data->shifter.setShift( 1.4 * temp + 0.3 ); data->chorus.setModFrequency( temp ); data->prcrev.setT60( temp * 10.0 ); data->jcrev.setT60( temp * 10.0 ); data->nrev.setT60( temp * 10.0 ); data->frev.setDamping( temp ); break; case 23: // effect parameter change 2 data->chorus.setModDepth( temp * 0.2 ); data->frev.setRoomSize( temp ); break; case 44: // effect mix data->echo.setEffectMix( temp ); data->shifter.setEffectMix( temp ); data->lshifter.setEffectMix( temp ); data->chorus.setEffectMix( temp ); data->prcrev.setEffectMix( temp ); data->jcrev.setEffectMix( temp ); data->nrev.setEffectMix( temp ); data->frev.setEffectMix( temp ); break; default: break; } } // end of type switch data->haveMessage = false; return; settle: // Exit and program change messages are preceeded with a short settling period. data->envelope.setTarget( 0.0 ); data->counter = (int) (0.3 * data->t60 * Stk::sampleRate()); data->settling = true; } // The tick() function handles sample computation and scheduling of // control updates. It will be called automatically by RtAudio when // the system needs a new buffer of audio samples. int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *dataPointer ) { TickData *data = (TickData *) dataPointer; register StkFloat *oSamples = (StkFloat *) outputBuffer, *iSamples = (StkFloat *) inputBuffer; register StkFloat sample; Effect *effect; int i, counter, nTicks = (int) nBufferFrames; while ( nTicks > 0 && !done ) { if ( !data->haveMessage ) { data->messager.popMessage( data->message ); if ( data->message.type > 0 ) { data->counter = (long) (data->message.time * Stk::sampleRate()); data->haveMessage = true; } else data->counter = DELTA_CONTROL_TICKS; } counter = min( nTicks, data->counter ); data->counter -= counter; for ( i=0; ieffectId < 3 ) { // Echo, PitShift and LentPitShift ... mono output if ( data->effectId == 0 ) sample = data->envelope.tick() * data->echo.tick( *iSamples++ ); else if ( data->effectId == 1 ) sample = data->envelope.tick() * data->shifter.tick( *iSamples++ ); else sample = data->envelope.tick() * data->lshifter.tick( *iSamples++ ); *oSamples++ = sample; // two channels interleaved *oSamples++ = sample; } else { // Chorus or a reverb ... stereo output if ( data->effectId == 3 ) { data->chorus.tick( *iSamples++ ); effect = (Effect *) &(data->chorus); } else if ( data->effectId == 4 ) { data->prcrev.tick( *iSamples++ ); effect = (Effect *) &(data->prcrev); } else if ( data->effectId == 5 ) { data->jcrev.tick( *iSamples++ ); effect = (Effect *) &(data->jcrev); } else if ( data->effectId == 6 ) { data->nrev.tick( *iSamples++ ); effect = (Effect *) &(data->nrev); } else { data->frev.tick( *iSamples++ ); effect = (Effect *) &(data->frev); } const StkFrames& samples = effect->lastFrame(); *oSamples++ = data->envelope.tick() * samples[0]; *oSamples++ = data->envelope.lastOut() * samples[1]; } nTicks--; } if ( nTicks == 0 ) break; // Process control messages. if ( data->haveMessage ) processMessage( data ); } return 0; } int main( int argc, char *argv[] ) { TickData data; RtAudio adac; int i; if ( argc < 2 || argc > 6 ) usage(); // If you want to change the default sample rate (set in Stk.h), do // it before instantiating any objects! If the sample rate is // specified in the command line, it will override this setting. Stk::setSampleRate( 44100.0 ); // Parse the command-line arguments. unsigned int port = 2001; for ( i=1; i # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=effects - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "effects.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "effects.mak" CFG="effects - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "effects - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "effects - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "effects - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib dsound.lib winmm.lib /nologo /subsystem:console /machine:I386 # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "effects - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib dsound.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # SUBTRACT LINK32 /pdb:none !ENDIF # Begin Target # Name "effects - Win32 Release" # Name "effects - Win32 Debug" # Begin Source File SOURCE=..\..\src\Chorus.cpp # End Source File # Begin Source File SOURCE=..\..\include\Chorus.h # End Source File # Begin Source File SOURCE=..\..\src\Delay.cpp # End Source File # Begin Source File SOURCE=..\..\include\Delay.h # End Source File # Begin Source File SOURCE=..\..\src\DelayL.cpp # End Source File # Begin Source File SOURCE=..\..\include\DelayL.h # End Source File # Begin Source File SOURCE=..\..\src\Echo.cpp # End Source File # Begin Source File SOURCE=..\..\include\Echo.h # End Source File # Begin Source File SOURCE=..\..\include\Effect.h # End Source File # Begin Source File SOURCE=.\effects.cpp # End Source File # Begin Source File SOURCE=..\..\src\Envelope.cpp # End Source File # Begin Source File SOURCE=..\..\include\Envelope.h # End Source File # Begin Source File SOURCE=..\..\src\OnePole.cpp # End Source File # Begin Source File SOURCE=..\..\include\OnePole.h # End Source File # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=..\..\include\FileRead.h # End Source File # Begin Source File SOURCE=..\..\src\FileWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\include\FileWvIn.h # End Source File # Begin Source File SOURCE=..\..\include\Filter.h # End Source File # Begin Source File SOURCE=..\..\include\Generator.h # End Source File # Begin Source File SOURCE=..\..\src\JCRev.cpp # End Source File # Begin Source File SOURCE=..\..\include\JCRev.h # End Source File # Begin Source File SOURCE=..\..\src\Messager.cpp # End Source File # Begin Source File SOURCE=..\..\include\Messager.h # End Source File # Begin Source File SOURCE=..\..\src\Mutex.cpp # End Source File # Begin Source File SOURCE=..\..\include\Mutex.h # End Source File # Begin Source File SOURCE=..\..\src\NRev.cpp # End Source File # Begin Source File SOURCE=..\..\include\NRev.h # End Source File # Begin Source File SOURCE=..\..\src\FreeVerb.cpp # End Source File # Begin Source File SOURCE=..\..\include\FreeVerb.h # End Source File # Begin Source File SOURCE=..\..\src\PitShift.cpp # End Source File # Begin Source File SOURCE=..\..\include\PitShift.h # End Source File # Begin Source File SOURCE=..\..\src\LentPitShift.cpp # End Source File # Begin Source File SOURCE=..\..\include\LentPitShift.h # End Source File # Begin Source File SOURCE=..\..\src\PRCRev.cpp # End Source File # Begin Source File SOURCE=..\..\include\PRCRev.h # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\src\RtMidi.cpp # End Source File # Begin Source File SOURCE=..\..\include\RtMidi.h # End Source File # Begin Source File SOURCE=..\..\src\SineWave.cpp # End Source File # Begin Source File SOURCE=..\..\include\SineWave.h # End Source File # Begin Source File SOURCE=..\..\src\SKINI.cpp # End Source File # Begin Source File SOURCE=..\..\include\SKINI.h # End Source File # Begin Source File SOURCE=..\..\src\Socket.cpp # End Source File # Begin Source File SOURCE=..\..\include\Socket.h # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\src\TcpServer.cpp # End Source File # Begin Source File SOURCE=..\..\include\TcpServer.h # End Source File # Begin Source File SOURCE=..\..\src\Thread.cpp # End Source File # Begin Source File SOURCE=..\..\include\Thread.h # End Source File # Begin Source File SOURCE=..\..\src\FileLoop.cpp # End Source File # Begin Source File SOURCE=..\..\include\FileLoop.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # End Target # End Project stk-4.5.0/projects/effects/effects.dsw0000644000076600007660000000103112327014024015534 0ustar garyMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "effects"=.\effects.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### stk-4.5.0/projects/effects/Makefile.in0000644000076600007660000000334712327014024015457 0ustar gary### Do not edit -- Generated by 'configure --with-whatever' from Makefile.in ### STK effects Makefile - for various flavors of unix PROGRAMS = RM = /bin/rm SRC_PATH = ../../src OBJECT_PATH = @object_path@ vpath %.o $(OBJECT_PATH) OBJECTS = Stk.o Generator.o Envelope.o SineWave.o \ Filter.o Delay.o DelayL.o OnePole.o \ Effect.o Echo.o PitShift.o Chorus.o LentPitShift.o \ PRCRev.o JCRev.o NRev.o FreeVerb.o \ FileRead.o WvIn.o FileWvIn.o WaveLoop.o Skini.o Messager.o INCLUDE = @include@ ifeq ($(strip $(INCLUDE)), ) INCLUDE = ../../include endif vpath %.h $(INCLUDE) CC = @CXX@ DEFS = @CPPFLAGS@ DEFS += @byte_order@ CFLAGS = @CXXFLAGS@ CFLAGS += -I$(INCLUDE) -I$(INCLUDE)/../src/include LIBRARY = @LIBS@ REALTIME = @realtime@ ifeq ($(REALTIME),yes) PROGRAMS += effects OBJECTS += RtMidi.o RtAudio.o Thread.o Mutex.o Socket.o TcpServer.o @objects@ endif RAWWAVES = @rawwaves@ ifeq ($(strip $(RAWWAVES)), ) RAWWAVES = ../../rawwaves/ endif DEFS += -DRAWWAVE_PATH=\"$(RAWWAVES)\" %.o : $(SRC_PATH)/%.cpp $(OBJECT_PATH)/.placeholder $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $(OBJECT_PATH)/$@ %.o : ../../src/include/%.cpp $(OBJECT_PATH)/.placeholder $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $(OBJECT_PATH)/$@ all : $(PROGRAMS) $(OBJECT_PATH)/.placeholder: mkdir -vp $(OBJECT_PATH) touch $(OBJECT_PATH)/.placeholder effects: effects.cpp $(OBJECTS) $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o effects effects.cpp $(OBJECT_PATH)/*.o $(LIBRARY) libeffects: effects.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o effects effects.cpp -L../../src -lstk $(LIBRARY) $(OBJECTS) : Stk.h clean : $(RM) -f $(OBJECT_PATH)/*.o $(RM) -f $(PROGRAMS) *.exe $(RM) -fR *~ *.dSYM distclean: clean $(RM) Makefile strip : strip $(PROGRAMS) stk-4.5.0/projects/effects/README-effects.txt0000644000076600007660000000177512327014024016530 0ustar garyThe Synthesis ToolKit in C++ (STK) By Perry R. Cook and Gary P. Scavone, 1995--2014. EFFECTS PROJECT: This directory contains a program that demonstrates realtime duplex mode (simultaneous audio input and output) operation, as well as several simple delay-line based effects algorithms. Duplex mode operation is very hardware dependent. If you have trouble with this application, make sure your soundcard supports the desired sample rate and sample size (16-bit). NOTES: 1. This project will not run under WindowsNT or NeXTStep, due to lack of realtime audio input support. However, it should run under other flavors of Windows. 2. Audio input from either a microphone or line-input device MUST be available to the audio input port when the program is started. 3. Latency can be controlled using the nBufferFrames argument to the RtAudio openStream() function. The default settings in effects.cpp are relatively high because some Windows soundcard drivers crash if the settings are too low. stk-4.5.0/projects/effects/StkEffects0000755000076600007660000000004712327014024015373 0ustar garywish < tcl/Effects.tcl | ./effects -ip stk-4.5.0/projects/effects/StkEffects.bat0000755000076600007660000000004512327014024016136 0ustar garywish < tcl/Effects.tcl | effects -ip stk-4.5.0/projects/effects/tcl/0000755000076600007660000000000012327014024014165 5ustar garystk-4.5.0/projects/effects/tcl/Effects.tcl0000644000076600007660000002241712327014024016256 0ustar garyset mixlevel 64.0 set effect1 64.0 set effect2 64.0 set effect 0 set outID "stdout" set commtype "stdout" # Configure main window wm title . "STK Effects Controller" wm iconname . "Effects" . config -bg black # Configure "communications" menu menu .menu -tearoff 0 menu .menu.communication -tearoff 0 .menu add cascade -label "Communication" -menu .menu.communication \ -underline 0 .menu.communication add radio -label "Console" -variable commtype \ -value "stdout" -command { setComm } .menu.communication add radio -label "Socket" -variable commtype \ -value "socket" -command { setComm } . configure -menu .menu # Configure title display label .title -text "STK Effects Controller" \ -font {Times 14 bold} -background white \ -foreground darkred -relief raised label .title2 -text "by Gary P. Scavone\n Music Technology, McGill University" \ -font {Times 12 bold} -background white \ -foreground darkred -relief raised pack .title -padx 5 -pady 10 pack .title2 -padx 5 -pady 10 # Configure "note-on" buttons frame .noteOn -bg black button .noteOn.on -text NoteOn -bg grey66 -command { noteOn 64.0 64.0 } button .noteOn.off -text NoteOff -bg grey66 -command { noteOff 64.0 127.0 } button .noteOn.exit -text "Exit Program" -bg grey66 -command myExit pack .noteOn.on -side left -padx 5 pack .noteOn.off -side left -padx 5 -pady 10 pack .noteOn.exit -side left -padx 5 -pady 10 pack .noteOn # Configure sliders frame .left -bg black scale .left.effectsmix -from 0 -to 127 -length 400 \ -command {printWhatz "ControlChange 0.0 1 " 44} \ -orient horizontal -label "Effects Mix (0% effect - 100% effect)" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable mixlevel scale .left.effect1 -from 0 -to 127 -length 400 \ -command {printWhatz "ControlChange 0.0 1 " 22} \ -orient horizontal -label "Echo Delay" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable effect1 scale .left.effect2 -from 0 -to 127 -length 400 \ -command {printWhatz "ControlChange 0.0 1 " 23} \ -orient horizontal -label "Disabled" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable effect2 pack .left.effectsmix -padx 10 -pady 3 pack .left.effect1 -padx 10 -pady 3 pack .left.effect2 -padx 10 -pady 3 pack .left -side left # Configure effect select buttons frame .effectSelect -bg black pack .effectSelect -side right -padx 5 -pady 5 radiobutton .effectSelect.echo -text "Echo" -variable effect -relief flat \ -value 0 -command {changeEffect "ControlChange 0.0 1 " 20 $effect} radiobutton .effectSelect.shifter -text "Pitch Shift" -variable effect -relief flat \ -value 1 -command {changeEffect "ControlChange 0.0 1 " 20 $effect} radiobutton .effectSelect.lshifter -text "Lent Pitch Shift" -variable effect -relief flat \ -value 2 -command {changeEffect "ControlChange 0.0 1 " 20 $effect} radiobutton .effectSelect.chorus -text "Chorus" -variable effect -relief flat \ -value 3 -command {changeEffect "ControlChange 0.0 1 " 20 $effect} radiobutton .effectSelect.prcrev -text "PRC Reverb" -variable effect -relief flat \ -value 4 -command {changeEffect "ControlChange 0.0 1 " 20 $effect} radiobutton .effectSelect.jcrev -text "JC Reverb" -variable effect -relief flat \ -value 5 -command {changeEffect "ControlChange 0.0 1 " 20 $effect} radiobutton .effectSelect.nrev -text "NRev Reverb" -variable effect -relief flat \ -value 6 -command {changeEffect "ControlChange 0.0 1 " 20 $effect} radiobutton .effectSelect.freerev -text "FreeVerb" -variable effect -relief flat \ -value 7 -command {changeEffect "ControlChange 0.0 1 " 20 $effect} pack .effectSelect.echo -pady 2 -padx 5 -side top -anchor w -fill x pack .effectSelect.shifter -pady 2 -padx 5 -side top -anchor w -fill x pack .effectSelect.lshifter -pady 2 -padx 5 -side top -anchor w -fill x pack .effectSelect.chorus -pady 2 -padx 5 -side top -anchor w -fill x pack .effectSelect.prcrev -pady 2 -padx 5 -side top -anchor w -fill x pack .effectSelect.jcrev -pady 2 -padx 5 -side top -anchor w -fill x pack .effectSelect.nrev -pady 2 -padx 5 -side top -anchor w -fill x pack .effectSelect.freerev -pady 2 -padx 5 -side top -anchor w -fill x proc myExit {} { global outID puts $outID [format "NoteOff 0.0 1 64 127" ] flush $outID puts $outID [format "ExitProgram"] flush $outID close $outID exit } proc noteOn {pitchVal pressVal} { global outID puts $outID [format "NoteOn 0.0 1 %f %f" $pitchVal $pressVal] flush $outID } proc noteOff {pitchVal pressVal} { global outID puts $outID [format "NoteOff 0.0 1 %f %f" $pitchVal $pressVal] flush $outID } proc printWhatz {tag value1 value2 } { global outID puts $outID [format "%s %i %f" $tag $value1 $value2] flush $outID } proc changeEffect {tag value1 value2 } { global outID if ($value2==0) { .left.effect1 config -state normal -label "Echo Delay" .left.effect2 config -state disabled -label "Disabled" } if {$value2>=1 && $value2<=2} { .left.effect1 config -state normal -label "Pitch Shift Amount (center = no shift)" .left.effect2 config -state disabled -label "Disabled" } if ($value2==3) { .left.effect1 config -state normal -label "Chorus Modulation Frequency" .left.effect2 config -state normal -label "Chorus Modulation Depth" } if {$value2>=4 && $value2<=6} { .left.effect1 config -state normal -label "T60 Decay Time ( 0 - 10 seconds)" .left.effect2 config -state disabled -label "Disabled" } if ($value2==7) { .left.effect1 config -state normal -label "Damping (low to high)" .left.effect2 config -state normal -label "Room Size (comb feedback gain)" } puts $outID [format "%s %i %f" $tag $value1 $value2] flush $outID } # Bind an X windows "close" event with the Exit routine bind . +myExit # Socket connection procedure set d .socketdialog proc setComm {} { global outID global commtype global d if {$commtype == "stdout"} { if { [string compare "stdout" $outID] } { set i [tk_dialog .dialog "Break Socket Connection?" {You are about to break an existing socket connection ... is this what you want to do?} "" 0 Cancel OK] switch $i { 0 {set commtype "socket"} 1 {close $outID set outID "stdout"} } } } elseif { ![string compare "stdout" $outID] } { set sockport 2001 set sockhost localhost toplevel $d wm title $d "STK Client Socket Connection" wm resizable $d 0 0 grab $d label $d.message -text "Specify a socket host and port number below (if different than the STK defaults shown) and then click the \"Connect\" button to invoke a socket-client connection attempt to the STK socket server." \ -background white -font {Helvetica 10 bold} \ -wraplength 3i -justify left frame $d.sockhost entry $d.sockhost.entry -width 15 label $d.sockhost.text -text "Socket Host:" \ -font {Helvetica 10 bold} frame $d.sockport entry $d.sockport.entry -width 15 label $d.sockport.text -text "Socket Port:" \ -font {Helvetica 10 bold} pack $d.message -side top -padx 5 -pady 10 pack $d.sockhost.text -side left -padx 1 -pady 2 pack $d.sockhost.entry -side right -padx 5 -pady 2 pack $d.sockhost -side top -padx 5 -pady 2 pack $d.sockport.text -side left -padx 1 -pady 2 pack $d.sockport.entry -side right -padx 5 -pady 2 pack $d.sockport -side top -padx 5 -pady 2 $d.sockhost.entry insert 0 $sockhost $d.sockport.entry insert 0 $sockport frame $d.buttons button $d.buttons.cancel -text "Cancel" -bg grey66 \ -command { set commtype "stdout" set outID "stdout" destroy $d } button $d.buttons.connect -text "Connect" -bg grey66 \ -command { set sockhost [$d.sockhost.entry get] set sockport [$d.sockport.entry get] set err [catch {socket $sockhost $sockport} outID] if {$err == 0} { destroy $d } else { tk_dialog $d.error "Socket Error" {Error: Unable to make socket connection. Make sure the STK socket server is first running and that the port number is correct.} "" 0 OK } } pack $d.buttons.cancel -side left -padx 5 -pady 10 pack $d.buttons.connect -side right -padx 5 -pady 10 pack $d.buttons -side bottom -padx 5 -pady 10 } } bind . {+ center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return } stk-4.5.0/projects/eguitar/0000755000076600007660000000000012327014024013424 5ustar garystk-4.5.0/projects/eguitar/eguitar.cpp0000644000076600007660000002747512327014024015607 0ustar gary// Eguitar.cpp // // This is a program to create a simple electric guitar model using // the STK Guitar class. The is model is derived in part from an // implementation made by Nicholas Donaldson at McGill University in // 2009. The distortion model is poor, using a simple soft-clipping // expression provided by Charles R. Sullivan in "Extending the // Karplus-String Algorithm to Synthesize Electric Guitar Timbres with // Distortion and Feedback," Computer Music Journal, Vol.14 No.3, Fall // 1990. Other distortion models would be better, such as that found // in Pakarinen and Yeh's "A Review of Digital Techniques for Modeling // Vacuum-Tube Guitar Amplifiers," Computer Music Journal, Vol 33 // No. 2, Summer 2009. // // This program performs simple voice management if all noteOn and // noteOff events are on channel 0. Otherwise, channel values > 0 are // mapped to specific string numbers. By default, the program creates // a 6-string guitar. If the normalized noteOn() velocity is < 0.2, a // string is undamped but not plucked (this is implemented in the // stk::Guitar class). Thus, you can lightly depress a key on a MIDI // keyboard and then experiment with string coupling. // // The Tcl/Tk GUI allows you to experiment with various parameter // settings and that can be used in conjunction with a MIDI keyboard // as: wish < tcl/EGuitar.tcl | ./eguitar -or -ip -im 1 // // For the moment, this program does not support pitch bends. // // Gary P. Scavone, McGill University 2012. #include "Guitar.h" #include "SKINI.msg" #include "WvOut.h" #include "JCRev.h" #include "Skini.h" #include "RtAudio.h" #include "Delay.h" #include "Cubic.h" // Miscellaneous command-line parsing and instrument allocation // functions are defined in utilites.cpp ... specific to this program. #include "utilities.h" #include #include #include #include using std::min; bool done; static void finish(int ignore){ done = true; } using namespace stk; const unsigned int nStrings = 6; // Data structure for string information. struct StringInfo{ bool inUse; // is this string being used? unsigned int iNote; // note number associated with this string StringInfo() : inUse(false), iNote(0) {}; }; // The TickData structure holds all the class instances and data that // are shared by the various processing functions. struct TickData { WvOut **wvout; Guitar *guitar; StringInfo voices[nStrings]; JCRev reverb; Messager messager; Skini::Message message; StkFloat volume; StkFloat t60; unsigned int nWvOuts; int channels; int counter; bool realtime; bool settling; bool haveMessage; int keysDown; StkFloat feedbackGain; StkFloat oldFeedbackGain; StkFloat distortionGain; StkFloat distortionMix; Delay feedbackDelay; Cubic distortion; StkFloat feedbackSample; // Default constructor. TickData() : wvout(0), volume(1.0), t60(0.75), nWvOuts(0), channels(2), counter(0), realtime( false ), settling( false ), haveMessage( false ), keysDown(0), feedbackSample( 0.0 ) {} }; #define DELTA_CONTROL_TICKS 30 // default sample frames between control input checks // The processMessage() function encapsulates the handling of control // messages. It can be easily relocated within a program structure // depending on the desired scheduling scheme. void processMessage( TickData* data ) { register StkFloat value1 = data->message.floatValues[0]; register StkFloat value2 = data->message.floatValues[1]; unsigned int channel = (unsigned int) data->message.channel; switch( data->message.type ) { case __SK_Exit_: if ( data->settling == false ) goto settle; done = true; return; case __SK_NoteOn_: if ( value2 > 0.0 ) { // velocity > 0 unsigned int iNote = data->message.intValues[0]; if ( channel == 0 ) { // do basic voice management unsigned int s; if ( data->keysDown >= (int) nStrings ) break; // ignore extra note on's // Find first unused string for ( s=0; svoices[s].inUse ) break; if ( s == nStrings ) break; data->voices[s].inUse = true; data->voices[s].iNote = iNote; data->guitar->noteOn( Midi2Pitch[iNote], value2 * ONE_OVER_128, s ); data->keysDown++; // If first key down, turn on feedback gain if ( data->keysDown == 1 ) data->feedbackGain = data->oldFeedbackGain; } else if ( channel <= nStrings ) data->guitar->noteOn( Midi2Pitch[iNote], value2 * ONE_OVER_128, channel-1 ); break; } // else a note off, so continue to next case case __SK_NoteOff_: if ( channel == 0 ) { // do basic voice management if ( !data->keysDown ) break; // Search for the released note unsigned int s, iNote; iNote = data->message.intValues[0]; for ( s=0; svoices[s].inUse && iNote == data->voices[s].iNote ) break; if ( s == nStrings ) break; data->voices[s].inUse = false; data->guitar->noteOff( value2 * ONE_OVER_128, s ); data->keysDown--; if ( data->keysDown == 0 ) { // turn off feedback gain and clear delay data->feedbackDelay.clear(); data->feedbackGain = 0.0; } } else if ( channel <= nStrings ) data->guitar->noteOff( value2 * ONE_OVER_128, channel-1 ); break; case __SK_ControlChange_: if ( value1 == 44.0 ) data->reverb.setEffectMix( value2 * ONE_OVER_128 ); else if ( value1 == 7.0 ) data->volume = value2 * ONE_OVER_128; else if ( value1 == 27 ) // feedback delay data->feedbackDelay.setDelay( (value2 * Stk::sampleRate() / 127) + 1 ); else if ( value1 == 28 ) { // feedback gain //data->oldFeedbackGain = value2 * 0.01 / 127.0; data->oldFeedbackGain = value2 * 0.02 / 127.0; data->feedbackGain = data->oldFeedbackGain; } else if ( value1 == 71 ) // pre-distortion gain data->distortionGain = 2.0 * value2 * ONE_OVER_128; else if ( value1 == 72 ) // distortion mix data->distortionMix = value2 * ONE_OVER_128; else data->guitar->controlChange( (int) value1, value2 ); break; case __SK_AfterTouch_: data->guitar->controlChange( 128, value1 ); break; case __SK_PitchBend_: // Implement me! break; case __SK_Volume_: data->volume = value1 * ONE_OVER_128; break; } // end of switch data->haveMessage = false; return; settle: // Exit and program change messages are preceeded with a short settling period. for ( unsigned int s=0; svoices[s].inUse ) data->guitar->noteOff( 0.6, s ); data->counter = (int) (0.3 * data->t60 * Stk::sampleRate()); data->settling = true; } // The tick() function handles sample computation and scheduling of // control updates. If doing realtime audio output, it will be called // automatically when the system needs a new buffer of audio samples. int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *dataPointer ) { TickData *data = (TickData *) dataPointer; register StkFloat temp, sample, *samples = (StkFloat *) outputBuffer; int counter, nTicks = (int) nBufferFrames; while ( nTicks > 0 && !done ) { if ( !data->haveMessage ) { data->messager.popMessage( data->message ); if ( data->message.type > 0 ) { data->counter = (long) (data->message.time * Stk::sampleRate()); data->haveMessage = true; } else data->counter = DELTA_CONTROL_TICKS; } counter = min( nTicks, data->counter ); data->counter -= counter; for ( int i=0; ifeedbackDelay.tick( data->feedbackSample * data->feedbackGain ); sample = data->guitar->tick( sample ); // Apply distortion (x - x^3/3) and mix temp = data->distortionGain * sample; if ( temp > 0.6666667 ) temp = 0.6666667; else if ( temp < -0.6666667 ) temp = -0.6666667; else temp = data->distortion.tick( temp ); sample = (data->distortionMix * temp) + ((1 - data->distortionMix) * sample ); data->feedbackSample = sample; // Tick instrument and apply reverb sample = data->volume * data->reverb.tick( sample ); for ( unsigned int j=0; jnWvOuts; j++ ) data->wvout[j]->tick( sample ); if ( data->realtime ) for ( int k=0; kchannels; k++ ) *samples++ = sample; nTicks--; } if ( nTicks == 0 ) break; // Process control messages. if ( data->haveMessage ) processMessage( data ); } return 0; } int main( int argc, char *argv[] ) { TickData data; int i; #if defined(__STK_REALTIME__) RtAudio dac; #endif // If you want to change the default sample rate (set in Stk.h), do // it before instantiating any objects! If the sample rate is // specified in the command line, it will override this setting. Stk::setSampleRate( 44100.0 ); // By default, warning messages are not printed. If we want to see // them, we need to specify that here. Stk::showWarnings( true ); // Check the command-line arguments for errors and to determine // the number of WvOut objects to be instantiated (in utilities.cpp). data.nWvOuts = checkArgs( argc, argv ); data.wvout = (WvOut **) calloc( data.nWvOuts, sizeof(WvOut *) ); // Parse the command-line flags, instantiate WvOut objects, and // instantiate the input message controller (in utilities.cpp). try { data.realtime = parseArgs( argc, argv, data.wvout, data.messager ); } catch (StkError &) { goto cleanup; } // If realtime output, allocate the dac here. #if defined(__STK_REALTIME__) if ( data.realtime ) { RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32; RtAudio::StreamParameters parameters; parameters.deviceId = dac.getDefaultOutputDevice(); parameters.nChannels = data.channels; unsigned int bufferFrames = RT_BUFFER_SIZE; try { dac.openStream( ¶meters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&data ); } catch ( RtAudioError& error ) { error.printMessage(); goto cleanup; } } #endif // Set the reverb parameters. data.reverb.setT60( data.t60 ); data.reverb.setEffectMix( 0.2 ); // Allocate guitar data.guitar = new Guitar( nStrings ); // Configure distortion and feedback. data.distortion.setThreshold( 2.0 / 3.0 ); data.distortion.setA1( 1.0 ); data.distortion.setA2( 0.0 ); data.distortion.setA3( -1.0 / 3.0 ); data.distortionMix = 0.9; data.distortionGain = 1.0; data.feedbackDelay.setMaximumDelay( (unsigned long int)( 1.1 * Stk::sampleRate() ) ); data.feedbackDelay.setDelay( 20000 ); data.feedbackGain = 0.001; data.oldFeedbackGain = 0.001; // Install an interrupt handler function. (void) signal(SIGINT, finish); // If realtime output, set our callback function and start the dac. #if defined(__STK_REALTIME__) if ( data.realtime ) { try { dac.startStream(); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } } #endif // Setup finished. while ( !done ) { #if defined(__STK_REALTIME__) if ( data.realtime ) // Periodically check "done" status. Stk::sleep( 200 ); else #endif // Call the "tick" function to process data. tick( NULL, NULL, 256, 0, 0, (void *)&data ); } // Shut down the output stream. #if defined(__STK_REALTIME__) if ( data.realtime ) { try { dac.closeStream(); } catch ( RtAudioError& error ) { error.printMessage(); } } #endif cleanup: for ( i=0; i<(int)data.nWvOuts; i++ ) delete data.wvout[i]; free( data.wvout ); delete data.guitar; std::cout << "\nStk eguitar finished ... goodbye.\n\n"; return 0; } stk-4.5.0/projects/eguitar/eguitar.dsp0000644000076600007660000001641112327014024015577 0ustar gary# Microsoft Developer Studio Project File - Name="eguitar" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=eguitar - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ragamat.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ragamat.mak" CFG="eguitar - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "eguitar - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "eguitar - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "eguitar - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib dsound.lib winmm.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "eguitar - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib dsound.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "eguitar - Win32 Release" # Name "eguitar - Win32 Debug" # Begin Source File SOURCE=..\..\src\Fir.cpp # End Source File # Begin Source File SOURCE=..\..\include\Fir.h # End Source File # Begin Source File SOURCE=..\..\src\Delay.cpp # End Source File # Begin Source File SOURCE=..\..\include\Delay.h # End Source File # Begin Source File SOURCE=..\..\src\DelayA.cpp # End Source File # Begin Source File SOURCE=..\..\include\DelayA.h # End Source File # Begin Source File SOURCE=..\..\src\DelayL.cpp # End Source File # Begin Source File SOURCE=..\..\include\DelayL.h # End Source File # Begin Source File SOURCE=..\..\include\Effect.h # End Source File # Begin Source File SOURCE=..\..\src\Twang.cpp # End Source File # Begin Source File SOURCE=..\..\include\Twang.h # End Source File # Begin Source File SOURCE=..\..\src\Guitar.cpp # End Source File # Begin Source File SOURCE=..\..\include\Guitar.h # End Source File # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=..\..\include\FileRead.h # End Source File # Begin Source File SOURCE=..\..\src\FileWrite.cpp # End Source File # Begin Source File SOURCE=..\..\include\FileWrite.h # End Source File # Begin Source File SOURCE=..\..\src\FileWvOut.cpp # End Source File # Begin Source File SOURCE=..\..\include\FileWvOut.h # End Source File # Begin Source File SOURCE=..\..\src\FileWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\include\FileWvIn.h # End Source File # Begin Source File SOURCE=..\..\include\Filter.h # End Source File # Begin Source File SOURCE=..\..\include\Generator.h # End Source File # Begin Source File SOURCE=..\..\src\JCRev.cpp # End Source File # Begin Source File SOURCE=..\..\include\JCRev.h # End Source File # Begin Source File SOURCE=..\..\src\Messager.cpp # End Source File # Begin Source File SOURCE=..\..\include\Messager.h # End Source File # Begin Source File SOURCE=..\..\src\Mutex.cpp # End Source File # Begin Source File SOURCE=..\..\include\Mutex.h # End Source File # Begin Source File SOURCE=..\..\src\Noise.cpp # End Source File # Begin Source File SOURCE=..\..\include\Noise.h # End Source File # Begin Source File SOURCE=..\..\include\Cubic.h # End Source File # Begin Source File SOURCE=..\..\src\OnePole.cpp # End Source File # Begin Source File SOURCE=..\..\include\OnePole.h # End Source File # Begin Source File SOURCE=.\eguitar.cpp # End Source File # Begin Source File SOURCE=.\utilities.cpp # End Source File # Begin Source File SOURCE=.\utilities.h # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\src\RtMidi.cpp # End Source File # Begin Source File SOURCE=..\..\include\RtMidi.h # End Source File # Begin Source File SOURCE=..\..\src\SKINI.cpp # End Source File # Begin Source File SOURCE=..\..\include\SKINI.h # End Source File # Begin Source File SOURCE=..\..\src\Socket.cpp # End Source File # Begin Source File SOURCE=..\..\include\Socket.h # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\src\TcpServer.cpp # End Source File # Begin Source File SOURCE=..\..\include\TcpServer.h # End Source File # Begin Source File SOURCE=..\..\src\Thread.cpp # End Source File # Begin Source File SOURCE=..\..\include\Thread.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Target # End Project stk-4.5.0/projects/eguitar/eguitar.dsw0000644000076600007660000000103112327014024015576 0ustar garyMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "eguitar"=.\eguitar.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### stk-4.5.0/projects/eguitar/ElectricGuitar0000755000076600007660000000005312327014024016256 0ustar garywish < tcl/Eguitar.tcl | ./eguitar -or -ip stk-4.5.0/projects/eguitar/ElectricGuitar.bat0000755000076600007660000000005112327014024017021 0ustar garywish < tcl/EGuitar.tcl | eguitar -or -ip stk-4.5.0/projects/eguitar/Makefile.in0000644000076600007660000000351712327014024015477 0ustar gary### Do not edit -- Generated by 'configure --with-whatever' from Makefile.in ### STK eguitar Makefile - for various flavors of unix PROGRAMS = RM = /bin/rm SRC_PATH = ../../src OBJECT_PATH = @object_path@ vpath %.o $(OBJECT_PATH) OBJECTS = Stk.o Filter.o Fir.o Delay.o DelayL.o DelayA.o OnePole.o \ Effect.o JCRev.o Twang.o \ Guitar.o Noise.o Cubic.o \ FileRead.o WvIn.o FileWvIn.o FileWrite.o FileWvOut.o \ Skini.o Messager.o utilities.o INCLUDE = @include@ ifeq ($(strip $(INCLUDE)), ) INCLUDE = ../../include endif vpath %.h $(INCLUDE) CC = @CXX@ DEFS = @CPPFLAGS@ DEFS += @byte_order@ CFLAGS = @CXXFLAGS@ CFLAGS += -I$(INCLUDE) -I$(INCLUDE)/../src/include LIBRARY = @LIBS@ REALTIME = @realtime@ ifeq ($(REALTIME),yes) PROGRAMS += eguitar OBJECTS += RtMidi.o RtAudio.o Thread.o Mutex.o Socket.o TcpServer.o @objects@ endif RAWWAVES = @rawwaves@ ifeq ($(strip $(RAWWAVES)), ) RAWWAVES = ../../rawwaves/ endif DEFS += -DRAWWAVE_PATH=\"$(RAWWAVES)\" %.o : $(SRC_PATH)/%.cpp $(OBJECT_PATH)/.placeholder $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $(OBJECT_PATH)/$@ %.o : ../../src/include/%.cpp $(OBJECT_PATH)/.placeholder $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $(OBJECT_PATH)/$@ all : $(PROGRAMS) $(OBJECT_PATH)/.placeholder: mkdir -vp $(OBJECT_PATH) touch $(OBJECT_PATH)/.placeholder eguitar: eguitar.cpp $(OBJECTS) $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o eguitar eguitar.cpp $(OBJECT_PATH)/*.o $(LIBRARY) libeguitar: eguitar.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o eguitar utilities.cpp eguitar.cpp -L../../src -lstk $(LIBRARY) $(OBJECTS) : Stk.h clean : $(RM) -f $(OBJECT_PATH)/*.o $(RM) -f $(PROGRAMS) *.exe $(RM) -fR *~ *.dSYM distclean: clean $(RM) Makefile strip : strip $(PROGRAMS) # Project specific objects: utilities.o: utilities.cpp $(CC) $(CFLAGS) $(DEFS) -c utilities.cpp -o $(OBJECT_PATH)/$@ stk-4.5.0/projects/eguitar/README-eguitar.txt0000644000076600007660000000354212327014024016564 0ustar garyThis is eguitar by Gary Scavone, McGill University, 2012. This is a program to create a simple electric guitar model using the STK Guitar class. The is model is derived in part from an implementation made by Nicholas Donaldson at McGill University in 2009. The distortion model is poor, using a simple soft-clipping expression provided by Charles R. Sullivan in "Extending the Karplus-String Algorithm to Synthesize Electric Guitar Timbres with Distortion and Feedback," Computer Music Journal, Vol.14 No.3, Fall 1990. Other distortion models would be better, such as that found in Pakarinen and Yeh's "A Review of Digital Techniques for Modeling Vacuum-Tube Guitar Amplifiers," Computer Music Journal, Vol 33 No. 2, Summer 2009. This program performs simple voice management if all noteOn and noteOff events are on channel 0. Otherwise, channel values > 0 are mapped to specific string numbers. By default, the program creates a 6-string guitar. If the normalized noteOn() velocity is < 0.2, a string is undamped but not plucked (this is implemented in the stk::Guitar class). Thus, you can lightly depress a key on a MIDI keyboard and then experiment with string coupling. The Tcl/Tk GUI allows you to experiment with various parameter settings and that can be used in conjunction with a MIDI keyboard as: wish < tcl/EGuitar.tcl | ./eguitar -or -ip -im 1 For the moment, this program does not support pitch bends. In the eguitar directory, type: > make to compile and then > ElectricGuitar.bat to run the program with the Tcl/Tk GUI. There are many improvements that could be made to this project. In particular, you could record real body responses from different guitars and use those with the Guitar class. As well, you could improve the distortion model and perhaps add some typical electric guitar effects, such as an echo. If you find any bugs, please let me know! stk-4.5.0/projects/eguitar/scores/0000755000076600007660000000000012327014024014722 5ustar garystk-4.5.0/projects/eguitar/scores/test.ski0000644000076600007660000000160712327014024016415 0ustar gary/* Howdy!! SKINI File, Perry Cook */ NoteOn 0.1 0 40 100.000000 NoteOn 0.01 0 44 100.000000 NoteOn 0.01 0 47 100.000000 NoteOn 0.01 0 52 100.000000 NoteOff 1.0 0 40 64.000000 NoteOff 0.0 0 44 64.000000 NoteOff 0.0 0 47 64.000000 NoteOff 0.0 0 52 64.000000 NoteOn 0.3 0 39 100.000000 NoteOn 0.01 0 42 100.000000 NoteOn 0.01 0 47 100.000000 NoteOn 0.01 0 51 100.000000 NoteOff 1.0 0 39 64.000000 NoteOff 0.0 0 42 64.000000 NoteOff 0.0 0 47 64.000000 NoteOff 0.0 0 51 64.000000 NoteOn 0.3 0 40 100.000000 NoteOn 0.01 0 44 100.000000 NoteOn 0.01 0 47 100.000000 NoteOn 0.01 0 52 100.000000 NoteOff 2.0 0 40 64.000000 NoteOff 0.0 0 44 64.000000 NoteOff 0.0 0 47 64.000000 NoteOff 0.0 0 52 64.000000stk-4.5.0/projects/eguitar/tcl/0000755000076600007660000000000012327014024014206 5ustar garystk-4.5.0/projects/eguitar/tcl/EGuitar.tcl0000644000076600007660000002015612327014024016256 0ustar gary# Tcl/Tk Electric Guitar Model GUI for the Synthesis Toolkit (STK) # by Gary P. Scavone, McGill University, 2012. # Set lowest string note numbers and range set stringRange 20 array set stringMin { 1 40 2 45 3 50 4 55 5 59 6 64 } array set stringNote { 1 40 2 45 3 50 4 55 5 59 6 64 } #array set stringAmp { 1 64 2 64 3 64 4 64 5 64 6 64 } array set stringAmp { 1 64 2 64 3 64 4 64 5 64 6 64 } # Set initial control values set cont2 20.0 set cont7 100.0 set cont27 64.0 set cont28 0.0 set cont44 24.0 set cont72 64.0 set cont128 64.0 set velocity 64.0 # Configure main window wm title . "STK Electric Guitar Model Controller" wm iconname . "guitar" . config -bg white # Configure message box label .message -font {Times 14 normal} -background white \ -foreground darkred -relief raised \ -wraplength 300 -width 60 \ -text "Use the spacebar or button to strum all the strings. Use the pulldown menu next to the velocity slider to control the velocity for individual strings." pack .message -padx 5 -pady 10 # Configure "note on" buttons frame .top button .top.on -text Strum -bg grey66 -command strum button .top.off -text "All Off" -bg grey66 -command allOff button .top.exit -text "Quit" -bg grey66 -command quit pack .top.on -side left -padx 5 pack .top.off -side left -padx 5 -pady 10 pack .top.exit -side left -padx 5 -pady 10 pack .top frame .left -borderwidth 5 -relief groove -bg grey88 scale .left.volume -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 7} \ -orient horizontal -label "Volume" \ -tickinterval 32 -showvalue true \ -variable cont7 scale .left.reverb -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 44} \ -orient horizontal -label "Reverb Mix" \ -tickinterval 32 -showvalue true \ -variable cont44 scale .left.bridge -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 2} \ -orient horizontal -label "Bridge Coupling Gain" \ -tickinterval 32 -showvalue true -variable cont2 scale .left.fbGain -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 28} \ -orient horizontal -label "Feedback Gain" \ -tickinterval 32 -showvalue true -variable cont28 scale .left.fbDelay -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 27} \ -orient horizontal -label "Feedback Delay" \ -tickinterval 32 -showvalue true -variable cont27 scale .left.dmix -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 72} \ -orient horizontal -label "Distortion Mix" \ -tickinterval 32 -showvalue true -variable cont72 scale .left.pick -from 0 -to 128 -length 200 \ -command {printWhatz "ControlChange 0.0 1 " 128} \ -orient horizontal -label "Pick Hardness" \ -tickinterval 32 -showvalue true -variable cont128 pack .left.volume -padx 10 -pady 5 pack .left.reverb -padx 10 -pady 5 pack .left.bridge -padx 10 -pady 5 pack .left.fbGain -padx 10 -pady 5 pack .left.fbDelay -padx 10 -pady 5 pack .left.dmix -padx 10 -pady 5 pack .left.pick -padx 10 -pady 10 pack .left -side left proc quit {} { puts [format "ExitProgram"] flush stdout close stdout exit } proc strum {} { global stringNote stringAmp for {set n 1} {$n < 7} {incr n} { puts [format "NoteOn %2.3f %d %3.2f %3.2f" [expr rand()*0.04] $n $stringNote($n) $stringAmp($n)] } flush stdout } proc allOff {} { global stringNote stringAmp for {set n 1} {$n < 7} {incr n} { puts [format "NoteOff 0.0 %d %3f %3f" $n $stringNote($n) $stringAmp($n)] } flush stdout } # Set bindings bind . { strum } bind . +quit proc printWhatz {tag value1 value2 } { puts [format "%s %2i %3.2f" $tag $value1 $value2] flush stdout } proc pluckOne {value} { global stringNote stringAmp puts [format "NoteOn 0.0 %d %3f %3f" $value $stringNote($value) $stringAmp($value)] flush stdout } proc setNote {string value} { global stringNote set stringNote($string) $value } proc setStringAmp {value} { global stringAmp cbpath set n [$cbpath current] if { $n > 0 } { set stringAmp($n) $value } else { for {set i 1} {$i < 7} {incr i} { set stringAmp($i) $value } } } frame .strings -bg grey88 -borderwidth 5 -relief groove scale .strings.s1 -from $stringMin(1) -to [expr $stringMin(1)+$stringRange] \ -length 350 -orient horizontal -label "String 1: Note Number" \ -tickinterval 5 -showvalue true -variable $stringNote(1) \ -command {setNote 1} scale .strings.s2 -from $stringMin(2) -to [expr $stringMin(2)+$stringRange] \ -length 350 -orient horizontal -label "String 2: Note Number" \ -tickinterval 5 -showvalue true -variable $stringNote(2) \ -command {setNote 2} scale .strings.s3 -from $stringMin(3) -to [expr $stringMin(3)+$stringRange] \ -length 350 -orient horizontal -label "String 3: Note Number" \ -tickinterval 5 -showvalue true -variable $stringNote(3) \ -command {setNote 3} scale .strings.s4 -from $stringMin(4) -to [expr $stringMin(4)+$stringRange] \ -length 350 -orient horizontal -label "String 4: Note Number" \ -tickinterval 5 -showvalue true -variable $stringNote(4) \ -command {setNote 4} scale .strings.s5 -from $stringMin(5) -to [expr $stringMin(5)+$stringRange] \ -length 350 -orient horizontal -label "String 5: Note Number" \ -tickinterval 5 -showvalue true -variable $stringNote(5) \ -command {setNote 5} scale .strings.s6 -from $stringMin(6) -to [expr $stringMin(6)+$stringRange] \ -length 350 -orient horizontal -label "String 6: Note Number" \ -tickinterval 5 -showvalue true -variable $stringNote(6) \ -command {setNote 6} button .strings.b1 -text Pluck -command { pluckOne 1 } button .strings.b2 -text Pluck -command { pluckOne 2 } button .strings.b3 -text Pluck -command { pluckOne 3 } button .strings.b4 -text Pluck -command { pluckOne 4 } button .strings.b5 -text Pluck -command { pluckOne 5 } button .strings.b6 -text Pluck -command { pluckOne 6 } grid .strings -column 0 -row 0 grid .strings.b1 -column 1 -row 0 -padx 5 -pady 5 grid .strings.b2 -column 1 -row 1 grid .strings.b3 -column 1 -row 2 grid .strings.b4 -column 1 -row 3 grid .strings.b5 -column 1 -row 4 grid .strings.b6 -column 1 -row 5 grid .strings.s1 -column 0 -row 0 -padx 5 -pady 5 grid .strings.s2 -column 0 -row 1 -padx 5 -pady 5 grid .strings.s3 -column 0 -row 2 -padx 5 -pady 5 grid .strings.s4 -column 0 -row 3 -padx 5 -pady 5 grid .strings.s5 -column 0 -row 4 -padx 5 -pady 5 grid .strings.s6 -column 0 -row 5 -padx 5 -pady 5 set stringSelect "All" ttk::combobox .strings.combo \ -values [ list "All" "String 1" "String 2" "String 3" "String 4" "String 5" "String 6" ] \ -width 8 -textvariable stringSelect -justify center scale .strings.velocity -from 0 -to 128 -length 350 \ -orient horizontal -label "Note Velocity" \ -tickinterval 32 -showvalue true -command setStringAmp -variable velocity grid .strings.combo -column 1 -row 7 grid .strings.velocity -column 0 -row 7 -padx 5 -pady 10 pack .strings set cbpath .strings.combo bind . { center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return }stk-4.5.0/projects/eguitar/utilities.cpp0000644000076600007660000001306012327014024016143 0ustar gary// Miscellaneous parsing and error functions for use with STK projects. // // Gary P. Scavone, 1999. #include "utilities.h" #include #include #if defined(__STK_REALTIME__) #include "RtAudio.h" #endif using namespace stk; void usage(char *function) { // Error function in case of incorrect command-line argument specifications printf("\nusage: %s flag(s)\n", function); printf(" where flag(s) = \n"); printf(" -s RATE to specify a sample rate,\n"); printf(" -ow for .wav audio output file,\n"); printf(" -os for .snd audio output file,\n"); printf(" -om for .mat audio output file,\n"); printf(" -oa for .aif audio output file,\n"); printf(" -if to read control input from SKINI file,\n"); #if defined(__STK_REALTIME__) printf(" -or for realtime audio output,\n"); printf(" -ip for realtime control input by pipe,\n"); printf(" -im for realtime control input by MIDI (virtual port = 0, default = 1)."); #endif printf("\n"); printf("\n Simultaneous multiple output types are supported.\n"); printf(" Likewise, simultaneous control input types are supported.\n"); printf(" SKINI formatted scorefiles can be piped or redirected\n"); printf(" to %s, though realtime control flags should be omitted\n", function); printf(" when doing so. If the optional are not\n"); printf(" specified, default names will be indicated. Each flag\n"); printf(" must include its own '-' sign.\n\n"); exit(0); } int checkArgs(int nArgs, char *args[]) { int w, i = 1, j = 0; int nWvOuts = 0; char flags[2][50] = {""}; bool realtime = false; if (nArgs < 3 || nArgs > 22) usage(args[0]); while (i < nArgs) { if (args[i][0] == '-') { if (args[i][1] == 'o') { if ( args[i][2] == 'r' ) realtime = true; if ( (args[i][2] == 's') || (args[i][2] == 'w') || (args[i][2] == 'm') || (args[i][2] == 'a') ) nWvOuts++; flags[0][j] = 'o'; flags[1][j++] = args[i][2]; } else if (args[i][1] == 'i') { if ( (args[i][2] != 'p') && (args[i][2] != 'm') && (args[i][2] != 'f') ) usage(args[0]); flags[0][j] = 'i'; flags[1][j++] = args[i][2]; } else if (args[i][1] == 's' && (i+1 < nArgs) && args[i+1][0] != '-' ) { Stk::setSampleRate( atoi(args[i+1]) ); flags[0][j++] = 's'; } else usage(args[0]); } i++; } // Check for multiple flags of the same type for ( i=0; i<=j; i++ ) { w = i+1; while (w <= j ) { if ( flags[0][i] == flags[0][w] && flags[1][i] == flags[1][w] ) { printf("\nError: Multiple command line flags of the same type specified.\n\n"); usage(args[0]); } w++; } } // Make sure we have at least one output type if ( nWvOuts < 1 && !realtime ) usage(args[0]); return nWvOuts; } bool parseArgs(int nArgs, char *args[], WvOut **output, Messager& messager) { int i = 1, j = 0, nWvIns = 0; bool realtime = false; char fileName[256]; while (i < nArgs) { if ( (args[i][0] == '-') && (args[i][1] == 'i') ) { switch(args[i][2]) { case 'f': strcpy(fileName,args[++i]); if ( !messager.setScoreFile( fileName ) ) exit(0); nWvIns++; break; case 'p': #if defined(__STK_REALTIME__) if ( !messager.startStdInput() ) exit(0); nWvIns++; break; #else usage(args[0]); #endif case 'm': #if defined(__STK_REALTIME__) // Check for an optional MIDI port argument. if ((i+1 < nArgs) && args[i+1][0] != '-') { int port = atoi(args[++i]); if ( !messager.startMidiInput( port-1 ) ) exit(0); } else if ( !messager.startMidiInput() ) exit(0); nWvIns++; break; #else usage(args[0]); #endif default: usage(args[0]); break; } } else if ( (args[i][0] == '-') && (args[i][1] == 'o') ) { switch(args[i][2]) { case 'r': #if defined(__STK_REALTIME__) realtime = true; break; #else usage(args[0]); #endif case 'w': if ((i+1 < nArgs) && args[i+1][0] != '-') { i++; strcpy(fileName,args[i]); } else strcpy(fileName,"testwav"); output[j] = new FileWvOut(fileName, 1, FileWrite::FILE_WAV ); j++; break; case 's': if ((i+1 < nArgs) && args[i+1][0] != '-') { i++; strcpy(fileName,args[i]); } else strcpy(fileName,"testsnd"); output[j] = new FileWvOut(fileName,1, FileWrite::FILE_SND); j++; break; case 'm': if ((i+1 < nArgs) && args[i+1][0] != '-') { i++; strcpy(fileName,args[i]); } else strcpy(fileName,"testmat"); output[j] = new FileWvOut(fileName,1, FileWrite::FILE_MAT); j++; break; case 'a': if ((i+1 < nArgs) && args[i+1][0] != '-') { i++; strcpy(fileName,args[i]); } else strcpy(fileName,"testaif"); output[j] = new FileWvOut(fileName,1, FileWrite::FILE_AIF ); j++; break; default: usage(args[0]); break; } } i++; } if ( nWvIns == 0 ) { #if defined(__STK_REALTIME__) if ( !messager.startStdInput() ) exit(0); #else printf("\nError: The -if file input flag must be specified for non-realtime use.\n\n"); usage(args[0]); #endif } return realtime; } stk-4.5.0/projects/eguitar/utilities.h0000644000076600007660000000046512327014024015615 0ustar gary// Miscellaneous parsing and error functions for use with STK projects. // // Gary P. Scavone, 1999. #include "FileWvOut.h" #include "Messager.h" void usage(char *function); int checkArgs(int numArgs, char *args[]); bool parseArgs(int numArgs, char *args[], stk::WvOut **output, stk::Messager& messager); stk-4.5.0/projects/examples/0000755000076600007660000000000012327014024013602 5ustar garystk-4.5.0/projects/examples/audioprobe.cpp0000644000076600007660000000571712327014024016451 0ustar gary/******************************************/ /* audioprobe.cpp by Gary P. Scavone, 2001 Probe audio system and prints device info. */ /******************************************/ #include "RtAudio.h" #include #include int main() { // Create an api map. std::map apiMap; apiMap[RtAudio::MACOSX_CORE] = "OS-X Core Audio"; apiMap[RtAudio::WINDOWS_ASIO] = "Windows ASIO"; apiMap[RtAudio::WINDOWS_DS] = "Windows Direct Sound"; apiMap[RtAudio::UNIX_JACK] = "Jack Client"; apiMap[RtAudio::LINUX_ALSA] = "Linux ALSA"; apiMap[RtAudio::LINUX_OSS] = "Linux OSS"; apiMap[RtAudio::RTAUDIO_DUMMY] = "RtAudio Dummy"; std::vector< RtAudio::Api > apis; RtAudio :: getCompiledApi( apis ); std::cout << "\nCompiled APIs:\n"; for ( unsigned int i=0; i # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=audioprobe - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "audioprobe.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "audioprobe.mak" CFG="audioprobe - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "audioprobe - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "audioprobe - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "audioprobe - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "audioprobe___Win32_Release" # PROP BASE Intermediate_Dir "audioprobe___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "__WINDOWS_DS__" /D "__WINDOWS_ASIO__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "audioprobe - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "audioprobe___Win32_Debug" # PROP BASE Intermediate_Dir "audioprobe___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__WINDOWS_ASIO__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "audioprobe - Win32 Release" # Name "audioprobe - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\include\asio.cpp # End Source File # Begin Source File SOURCE=..\..\src\include\asiodrivers.cpp # End Source File # Begin Source File SOURCE=..\..\src\include\asiolist.cpp # End Source File # Begin Source File SOURCE=.\audioprobe.cpp # End Source File # Begin Source File SOURCE=..\..\src\include\iasiothiscallresolver.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\src\include\asio.h # End Source File # Begin Source File SOURCE=..\..\src\include\asiodrivers.h # End Source File # Begin Source File SOURCE=..\..\src\include\asiodrvr.h # End Source File # Begin Source File SOURCE=..\..\src\include\asiolist.h # End Source File # Begin Source File SOURCE=..\..\src\include\asiosys.h # End Source File # Begin Source File SOURCE=..\..\src\include\ginclude.h # End Source File # Begin Source File SOURCE=..\..\src\include\iasiodrv.h # End Source File # Begin Source File SOURCE=..\..\src\include\iasiothiscallresolver.h # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/bethree.cpp0000644000076600007660000000476412327014024015737 0ustar gary// bethree.cpp STK tutorial program #include "BeeThree.h" #include "RtAudio.h" using namespace stk; // The TickData structure holds all the class instances and data that // are shared by the various processing functions. struct TickData { Instrmnt *instrument; StkFloat frequency; StkFloat scaler; long counter; bool done; // Default constructor. TickData() : instrument(0), scaler(1.0), counter(0), done( false ) {} }; // This tick() function handles sample computation only. It will be // called automatically when the system needs a new buffer of audio // samples. int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) { TickData *data = (TickData *) userData; register StkFloat *samples = (StkFloat *) outputBuffer; for ( unsigned int i=0; iinstrument->tick(); if ( ++data->counter % 2000 == 0 ) { data->scaler += 0.025; data->instrument->setFrequency( data->frequency * data->scaler ); } } if ( data->counter > 80000 ) data->done = true; return 0; } int main() { // Set the global sample rate and rawwave path before creating class instances. Stk::setSampleRate( 44100.0 ); Stk::setRawwavePath( "../../rawwaves/" ); TickData data; RtAudio dac; // Figure out how many bytes in an StkFloat and setup the RtAudio stream. RtAudio::StreamParameters parameters; parameters.deviceId = dac.getDefaultOutputDevice(); parameters.nChannels = 1; RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32; unsigned int bufferFrames = RT_BUFFER_SIZE; try { dac.openStream( ¶meters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&data ); } catch ( RtAudioError& error ) { error.printMessage(); goto cleanup; } try { // Define and load the BeeThree instrument data.instrument = new BeeThree(); } catch ( StkError & ) { goto cleanup; } data.frequency = 220.0; data.instrument->noteOn( data.frequency, 0.5 ); try { dac.startStream(); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } // Block waiting until callback signals done. while ( !data.done ) Stk::sleep( 100 ); // Shut down the callback and output stream. try { dac.closeStream(); } catch ( RtAudioError &error ) { error.printMessage(); } cleanup: delete data.instrument; return 0; } stk-4.5.0/projects/examples/bethree.dsp0000755000076600007660000001460612327014024015742 0ustar gary# Microsoft Developer Studio Project File - Name="bethree" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=bethree - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "bethree.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "bethree.mak" CFG="bethree - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "bethree - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "bethree - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "bethree - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "bethree___Win32_Release" # PROP BASE Intermediate_Dir "bethree___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "bethree - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "bethree___Win32_Debug" # PROP BASE Intermediate_Dir "bethree___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "bethree - Win32 Release" # Name "bethree - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\ADSR.cpp # End Source File # Begin Source File SOURCE=..\..\src\BeeThree.cpp # End Source File # Begin Source File SOURCE=.\bethree.cpp # End Source File # Begin Source File SOURCE=..\..\src\Envelope.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\src\FM.cpp # End Source File # Begin Source File SOURCE=..\..\src\Mutex.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtWvOut.cpp # End Source File # Begin Source File SOURCE=..\..\src\SineWave.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # Begin Source File SOURCE=..\..\src\TwoZero.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileLoop.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\ADSR.h # End Source File # Begin Source File SOURCE=..\..\include\BeeThree.h # End Source File # Begin Source File SOURCE=..\..\include\Envelope.h # End Source File # Begin Source File SOURCE=..\..\include\FileRead.h # End Source File # Begin Source File SOURCE=..\..\include\FileWvIn.h # End Source File # Begin Source File SOURCE=..\..\include\Filter.h # End Source File # Begin Source File SOURCE=..\..\include\FM.h # End Source File # Begin Source File SOURCE=..\..\include\Generator.h # End Source File # Begin Source File SOURCE=..\..\include\Instrmnt.h # End Source File # Begin Source File SOURCE=..\..\src\Mutex.h # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\include\SineWave.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\TwoZero.h # End Source File # Begin Source File SOURCE=..\..\include\FileLoop.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/controlbee.cpp0000644000076600007660000001065012327014024016444 0ustar gary// controlbee.cpp STK tutorial program #include "BeeThree.h" #include "RtAudio.h" #include "Messager.h" #include "SKINI.msg" #include #include using std::min; using namespace stk; void usage(void) { // Error function in case of incorrect command-line // argument specifications. std::cout << "\nuseage: controlbee file\n"; std::cout << " where file = a SKINI scorefile.\n\n"; exit(0); } // The TickData structure holds all the class instances and data that // are shared by the various processing functions. struct TickData { Instrmnt *instrument; Messager messager; Skini::Message message; int counter; bool haveMessage; bool done; // Default constructor. TickData() : instrument(0), counter(0), haveMessage(false), done( false ) {} }; #define DELTA_CONTROL_TICKS 64 // default sample frames between control input checks // The processMessage() function encapsulates the handling of control // messages. It can be easily relocated within a program structure // depending on the desired scheduling scheme. void processMessage( TickData* data ) { register StkFloat value1 = data->message.floatValues[0]; register StkFloat value2 = data->message.floatValues[1]; switch( data->message.type ) { case __SK_Exit_: data->done = true; return; case __SK_NoteOn_: if ( value2 == 0.0 ) // velocity is zero ... really a NoteOff data->instrument->noteOff( 0.5 ); else { // a NoteOn StkFloat frequency = 220.0 * pow( 2.0, (value1 - 57.0) / 12.0 ); data->instrument->noteOn( frequency, value2 * ONE_OVER_128 ); } break; case __SK_NoteOff_: data->instrument->noteOff( value2 * ONE_OVER_128 ); break; case __SK_ControlChange_: data->instrument->controlChange( (int) value1, value2 ); break; case __SK_AfterTouch_: data->instrument->controlChange( 128, value1 ); } // end of switch data->haveMessage = false; return; } // This tick() function handles sample computation and scheduling of // control updates. It will be called automatically when the system // needs a new buffer of audio samples. int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *dataPointer ) { TickData *data = (TickData *) dataPointer; register StkFloat *samples = (StkFloat *) outputBuffer; int counter, nTicks = (int) nBufferFrames; while ( nTicks > 0 && !data->done ) { if ( !data->haveMessage ) { data->messager.popMessage( data->message ); if ( data->message.type > 0 ) { data->counter = (long) (data->message.time * Stk::sampleRate()); data->haveMessage = true; } else data->counter = DELTA_CONTROL_TICKS; } counter = min( nTicks, data->counter ); data->counter -= counter; for ( int i=0; iinstrument->tick(); nTicks--; } if ( nTicks == 0 ) break; // Process control messages. if ( data->haveMessage ) processMessage( data ); } return 0; } int main( int argc, char *argv[] ) { if ( argc != 2 ) usage(); // Set the global sample rate and rawwave path before creating class instances. Stk::setSampleRate( 44100.0 ); Stk::setRawwavePath( "../../rawwaves/" ); TickData data; RtAudio dac; // Figure out how many bytes in an StkFloat and setup the RtAudio stream. RtAudio::StreamParameters parameters; parameters.deviceId = dac.getDefaultOutputDevice(); parameters.nChannels = 1; RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32; unsigned int bufferFrames = RT_BUFFER_SIZE; try { dac.openStream( ¶meters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&data ); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } try { // Define and load the BeeThree instrument data.instrument = new BeeThree(); } catch ( StkError & ) { goto cleanup; } if ( data.messager.setScoreFile( argv[1] ) == false ) goto cleanup; try { dac.startStream(); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } // Block waiting until callback signals done. while ( !data.done ) Stk::sleep( 100 ); // Shut down the output stream. try { dac.closeStream(); } catch ( RtAudioError &error ) { error.printMessage(); } cleanup: delete data.instrument; return 0; } stk-4.5.0/projects/examples/controlbee.dsp0000755000076600007660000001576012327014024016462 0ustar gary# Microsoft Developer Studio Project File - Name="controlbee" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=controlbee - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "controlbee.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "controlbee.mak" CFG="controlbee - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "controlbee - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "controlbee - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "controlbee - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "controlbee___Win32_Release" # PROP BASE Intermediate_Dir "controlbee___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib Wsock32.lib winmm.lib /nologo /subsystem:console /machine:I386 # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "controlbee - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "controlbee___Win32_Debug" # PROP BASE Intermediate_Dir "controlbee___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib Wsock32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "controlbee - Win32 Release" # Name "controlbee - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\ADSR.cpp # End Source File # Begin Source File SOURCE=..\..\src\BeeThree.cpp # End Source File # Begin Source File SOURCE=.\controlbee.cpp # End Source File # Begin Source File SOURCE=..\..\src\Envelope.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\src\FM.cpp # End Source File # Begin Source File SOURCE=..\..\src\Messager.cpp # End Source File # Begin Source File SOURCE=..\..\src\Mutex.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtMidi.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtWvOut.cpp # End Source File # Begin Source File SOURCE=..\..\src\SineWave.cpp # End Source File # Begin Source File SOURCE=..\..\src\SKINI.cpp # End Source File # Begin Source File SOURCE=..\..\src\Socket.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # Begin Source File SOURCE=..\..\src\TcpServer.cpp # End Source File # Begin Source File SOURCE=..\..\src\Thread.cpp # End Source File # Begin Source File SOURCE=..\..\src\TwoZero.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileLoop.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\ADSR.h # End Source File # Begin Source File SOURCE=..\..\include\BeeThree.h # End Source File # Begin Source File SOURCE=..\..\include\Envelope.h # End Source File # Begin Source File SOURCE=..\..\include\Filter.h # End Source File # Begin Source File SOURCE=..\..\include\FM.h # End Source File # Begin Source File SOURCE=..\..\include\Instrmnt.h # End Source File # Begin Source File SOURCE=..\..\include\Messager.h # End Source File # Begin Source File SOURCE=..\..\include\Mutex.h # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\include\RtMidi.h # End Source File # Begin Source File SOURCE=..\..\include\RtWvOut.h # End Source File # Begin Source File SOURCE=..\..\include\SKINI.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\TcpServer.h # End Source File # Begin Source File SOURCE=..\..\include\TwoZero.h # End Source File # Begin Source File SOURCE=..\..\include\FileLoop.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/crtsine.cpp0000644000076600007660000000327712327014024015766 0ustar gary// crtsine.cpp STK tutorial program #include "SineWave.h" #include "RtAudio.h" using namespace stk; // This tick() function handles sample computation only. It will be // called automatically when the system needs a new buffer of audio // samples. int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *dataPointer ) { SineWave *sine = (SineWave *) dataPointer; register StkFloat *samples = (StkFloat *) outputBuffer; for ( unsigned int i=0; itick(); return 0; } int main() { // Set the global sample rate before creating class instances. Stk::setSampleRate( 44100.0 ); SineWave sine; RtAudio dac; // Figure out how many bytes in an StkFloat and setup the RtAudio stream. RtAudio::StreamParameters parameters; parameters.deviceId = dac.getDefaultOutputDevice(); parameters.nChannels = 1; RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32; unsigned int bufferFrames = RT_BUFFER_SIZE; try { dac.openStream( ¶meters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&sine ); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } sine.setFrequency(440.0); try { dac.startStream(); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } // Block waiting here. char keyhit; std::cout << "\nPlaying ... press to quit.\n"; std::cin.get( keyhit ); // Shut down the output stream. try { dac.closeStream(); } catch ( RtAudioError &error ) { error.printMessage(); } cleanup: return 0; } stk-4.5.0/projects/examples/crtsine.dsp0000755000076600007660000001122112327014024015761 0ustar gary# Microsoft Developer Studio Project File - Name="crtsine" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=crtsine - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "crtsine.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "crtsine.mak" CFG="crtsine - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "crtsine - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "crtsine - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "crtsine - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "crtsine___Win32_Release" # PROP BASE Intermediate_Dir "crtsine___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_DS__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "crtsine - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "crtsine___Win32_Debug" # PROP BASE Intermediate_Dir "crtsine___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_DS__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "crtsine - Win32 Release" # Name "crtsine - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\crtsine.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\src\SineWave.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\Generator.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/duplex.cpp0000644000076600007660000000756412327014024015623 0ustar gary/******************************************/ /* duplex.cpp by Gary P. Scavone, 2006-2007. This program opens a duplex stream and passes input directly through to the output. */ /******************************************/ #include "RtAudio.h" #include #include #include /* typedef signed long MY_TYPE; #define FORMAT RTAUDIO_SINT24 typedef char MY_TYPE; #define FORMAT RTAUDIO_SINT8 typedef signed short MY_TYPE; #define FORMAT RTAUDIO_SINT16 typedef signed long MY_TYPE; #define FORMAT RTAUDIO_SINT32 typedef float MY_TYPE; #define FORMAT RTAUDIO_FLOAT32 */ typedef double MY_TYPE; #define FORMAT RTAUDIO_FLOAT64 void usage( void ) { // Error function in case of incorrect command-line // argument specifications std::cout << "\nuseage: duplex N fs \n"; std::cout << " where N = number of channels,\n"; std::cout << " fs = the sample rate,\n"; std::cout << " iDevice = optional input device to use (default = 0),\n"; std::cout << " oDevice = optional output device to use (default = 0),\n"; std::cout << " iChannelOffset = an optional input channel offset (default = 0),\n"; std::cout << " and oChannelOffset = optional output channel offset (default = 0).\n\n"; exit( 0 ); } int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *data ) { // Since the number of input and output channels is equal, we can do // a simple buffer copy operation here. if ( status ) std::cout << "Stream over/underflow detected." << std::endl; unsigned long *bytes = (unsigned long *) data; memcpy( outputBuffer, inputBuffer, *bytes ); return 0; } int main(int argc, char *argv[]) { unsigned int channels, fs, bufferBytes, oDevice = 0, iDevice = 0, iOffset = 0, oOffset = 0; // Minimal command-line checking if (argc < 3 || argc > 7 ) usage(); RtAudio adac; if ( adac.getDeviceCount() < 1 ) { std::cout << "\nNo audio devices found!\n"; exit( 0 ); } channels = (unsigned int) atoi(argv[1]); fs = (unsigned int) atoi(argv[2]); if ( argc > 3 ) iDevice = (unsigned int) atoi(argv[3]); if ( argc > 4 ) oDevice = (unsigned int) atoi(argv[4]); if ( argc > 5 ) iOffset = (unsigned int) atoi(argv[5]); if ( argc > 6 ) oOffset = (unsigned int) atoi(argv[6]); // Let RtAudio print messages to stderr. adac.showWarnings( true ); // Set the same number of channels for both input and output. unsigned int bufferFrames = 512; RtAudio::StreamParameters iParams, oParams; if ( iDevice == 0 ) iParams.deviceId = adac.getDefaultInputDevice(); else iParams.deviceId = iDevice - 1; iParams.nChannels = channels; iParams.firstChannel = iOffset; if ( oDevice == 0 ) oParams.deviceId = adac.getDefaultOutputDevice(); else oParams.deviceId = oDevice - 1; oParams.nChannels = channels; oParams.firstChannel = oOffset; RtAudio::StreamOptions options; //options.flags |= RTAUDIO_NONINTERLEAVED; try { adac.openStream( &oParams, &iParams, FORMAT, fs, &bufferFrames, &inout, (void *)&bufferBytes, &options ); } catch ( RtAudioError& e ) { std::cout << '\n' << e.getMessage() << '\n' << std::endl; exit( 1 ); } bufferBytes = bufferFrames * channels * sizeof( MY_TYPE ); // Test RtAudio functionality for reporting latency. std::cout << "\nStream latency = " << adac.getStreamLatency() << " frames" << std::endl; try { adac.startStream(); char input; std::cout << "\nRunning ... press to quit (buffer frames = " << bufferFrames << ").\n"; std::cin.get(input); // Stop the stream. adac.stopStream(); } catch ( RtAudioError& e ) { std::cout << '\n' << e.getMessage() << '\n' << std::endl; goto cleanup; } cleanup: if ( adac.isStreamOpen() ) adac.closeStream(); return 0; } stk-4.5.0/projects/examples/duplex.dsp0000755000076600007660000001306212327014024015620 0ustar gary# Microsoft Developer Studio Project File - Name="duplex" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=duplex - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "duplex.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "duplex.mak" CFG="duplex - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "duplex - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "duplex - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "duplex - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "duplex___Win32_Release" # PROP BASE Intermediate_Dir "duplex___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__WINDOWS_ASIO__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "duplex - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "duplex___Win32_Debug" # PROP BASE Intermediate_Dir "duplex___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__WINDOWS_ASIO__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "duplex - Win32 Release" # Name "duplex - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\include\asio.cpp # End Source File # Begin Source File SOURCE=..\..\src\include\asiodrivers.cpp # End Source File # Begin Source File SOURCE=..\..\src\include\asiolist.cpp # End Source File # Begin Source File SOURCE=.\duplex.cpp # End Source File # Begin Source File SOURCE=..\..\src\include\iasiothiscallresolver.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\src\include\asio.h # End Source File # Begin Source File SOURCE=..\..\src\include\asiodrivers.h # End Source File # Begin Source File SOURCE=..\..\src\include\asiodrvr.h # End Source File # Begin Source File SOURCE=..\..\src\include\asiolist.h # End Source File # Begin Source File SOURCE=..\..\src\include\asiosys.h # End Source File # Begin Source File SOURCE=..\..\src\include\ginclude.h # End Source File # Begin Source File SOURCE=..\..\src\include\iasiodrv.h # End Source File # Begin Source File SOURCE=..\..\src\include\iasiothiscallresolver.h # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/examples.dsw0000755000076600007660000000701312327014024016143 0ustar garyMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "audioprobe"=".\audioprobe.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "bethree"=".\bethree.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "controlbee"=".\controlbee.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "crtsine"=".\crtsine.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "duplex"=".\duplex.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "foursine"=".\foursine.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "grains"=".\grains.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "inetIn"=".\inetIn.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "inetOut"=".\inetOut.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "midiprobe"=".\midiprobe.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "play"=".\play.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "playsmf"=".\playsmf.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "record"=".\record.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "rtsine"=".\rtsine.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "sine"=".\sine.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "sineosc"=".\sineosc.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "threebees"=".\threebees.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### stk-4.5.0/projects/examples/foursine.cpp0000644000076600007660000000163612327014024016146 0ustar gary// foursine.cpp STK tutorial program #include "SineWave.h" #include "FileWvOut.h" #include using namespace stk; int main() { // Set the global sample rate before creating class instances. Stk::setSampleRate( 44100.0 ); int i; FileWvOut output; SineWave inputs[4]; // Set the sine wave frequencies. for ( i=0; i<4; i++ ) inputs[i].setFrequency( 220.0 * (i+1) ); // Define and open a 16-bit, four-channel AIFF formatted output file try { output.openFile( "foursine.aif", 4, FileWrite::FILE_AIF, Stk::STK_SINT16 ); } catch (StkError &) { exit( 1 ); } // Write two seconds of four sines to the output file StkFrames frames( 88200, 4 ); for ( i=0; i<4; i++ ) inputs[i].tick( frames, i ); output.tick( frames ); // Now write the first sine to all four channels for two seconds for ( i=0; i<88200; i++ ) { output.tick( inputs[0].tick() ); } return 0; } stk-4.5.0/projects/examples/foursine.dsp0000755000076600007660000001205012327014024016145 0ustar gary# Microsoft Developer Studio Project File - Name="foursine" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=foursine - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "foursine.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "foursine.mak" CFG="foursine - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "foursine - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "foursine - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "foursine - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "foursine___Win32_Release" # PROP BASE Intermediate_Dir "foursine___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /D "__WINDOWS_DS__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "foursine - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "foursine___Win32_Debug" # PROP BASE Intermediate_Dir "foursine___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /D "__WINDOWS_DS__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "foursine - Win32 Release" # Name "foursine - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\FileWrite.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvOut.cpp # End Source File # Begin Source File SOURCE=.\foursine.cpp # End Source File # Begin Source File SOURCE=..\..\src\SineWave.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\FileWrite.h # End Source File # Begin Source File SOURCE=..\..\include\FileWvOut.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/grains.cpp0000644000076600007660000000650712327014024015601 0ustar gary// grains.cpp // // A simple test program for the STK Granulate class. #include "Granulate.h" #include "RtAudio.h" #include using namespace stk; // This tick() function handles sample computation only. It will be // called automatically when the system needs a new buffer of audio // samples. int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *dataPointer ) { Granulate *grani = (Granulate *) dataPointer; register StkFloat *samples = (StkFloat *) outputBuffer; const StkFrames& lastframe = grani->lastFrame(); unsigned int nChannels = lastframe.channels(); unsigned int j; for ( unsigned int i=0; itick(); for ( j=0; j to quit.\n"; std::cin.get( keyhit ); // Shut down the callback and output stream. try { dac.closeStream(); } catch ( RtAudioError &error ) { error.printMessage(); } cleanup: return 0; } stk-4.5.0/projects/examples/grains.dsp0000755000076600007660000001175512327014024015611 0ustar gary# Microsoft Developer Studio Project File - Name="grains" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=grains - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "grains.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "grains.mak" CFG="grains - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "grains - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "grains - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "grains - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "grains___Win32_Release" # PROP BASE Intermediate_Dir "grains___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_DS__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "grains - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "grains___Win32_Debug" # PROP BASE Intermediate_Dir "grains___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_DS__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "grains - Win32 Release" # Name "grains - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=.\grains.cpp # End Source File # Begin Source File SOURCE=..\..\src\Granulate.cpp # End Source File # Begin Source File SOURCE=..\..\src\Noise.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\FileRead.h # End Source File # Begin Source File SOURCE=..\..\include\Generator.h # End Source File # Begin Source File SOURCE=..\..\include\Granulate.h # End Source File # Begin Source File SOURCE=..\..\include\Noise.h # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/inetIn.cpp0000644000076600007660000000463312327014024015542 0ustar gary/******************************************/ /* Example program to read N channels of audio data that are streamed over a network connection. by Gary P. Scavone, 2000 NOTE: This program makes use of blocking audio input/output routines. On systems where the underlying audio API is based on a callback scheme (Macintosh OS-X, Windows ASIO, and Linux JACK), these routines are not fully robust (over/underruns can happen with some frequency). See the STK tutorial for example programs using callback schemes and/or visit the RtAudio tutorial page (http://music.mcgill.ca/~gary/rtaudio/) for more information. This program is currently written to play the input data in realtime. However, it is simple to replace the instance of RtWvOut with FileWvOut for writing to a soundfile. The streamed data format is assumed to be signed 16-bit integers. However, both InetWvIn and InetWvOut can be initialized to read/write any of the defined StkFormats. The class InetWvIn sets up a socket server and waits for a connection. Therefore, this program needs to be started before the streaming client. This program will terminate when the socket connection is closed. */ /******************************************/ #include "InetWvIn.h" #include "RtWvOut.h" #include using namespace stk; void usage(void) { // Error function in case of incorrect command-line // argument specifications. std::cout << "\nuseage: inetIn N fs \n"; std::cout << " where N = number of channels,\n"; std::cout << " and fs = the data sample rate.\n\n"; exit( 0 ); } int main(int argc, char *argv[]) { // Minimal command-line checking. if ( argc != 3 ) usage(); Stk::showWarnings( true ); Stk::setSampleRate( atof( argv[2] ) ); int channels = (int) atoi( argv[1] ); StkFrames frame( 1, channels ); // Create instances and pointers. InetWvIn input; RtWvOut *output = 0; // Listen for a socket connection. try { //input.listen( 2006, channels, Stk::STK_SINT16, Socket::PROTO_UDP ); input.listen( 2006, channels, Stk::STK_SINT16, Socket::PROTO_TCP ); } catch ( StkError & ) { goto cleanup; } // Open the realtime output device. try { output = new RtWvOut( channels ); } catch ( StkError & ) { goto cleanup; } // Here's the runtime loop. while ( input.isConnected() ) output->tick( input.tick( frame ) ); cleanup: delete output; return 0; } stk-4.5.0/projects/examples/inetIn.dsp0000755000076600007660000001255212327014024015550 0ustar gary# Microsoft Developer Studio Project File - Name="inetIn" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=inetIn - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "inetIn.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "inetIn.mak" CFG="inetIn - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "inetIn - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "inetIn - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "inetIn - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "inetIn___Win32_Release" # PROP BASE Intermediate_Dir "inetIn___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__LITTLE_ENDIAN__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib wsock32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "inetIn - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "inetIn___Win32_Debug" # PROP BASE Intermediate_Dir "inetIn___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__LITTLE_ENDIAN__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib wsock32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "inetIn - Win32 Release" # Name "inetIn - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\inetIn.cpp # End Source File # Begin Source File SOURCE=..\..\src\InetWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\src\Mutex.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtWvOut.cpp # End Source File # Begin Source File SOURCE=..\..\src\Socket.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # Begin Source File SOURCE=..\..\src\TcpServer.cpp # End Source File # Begin Source File SOURCE=..\..\src\Thread.cpp # End Source File # Begin Source File SOURCE=..\..\src\UdpSocket.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\InetWvIn.h # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\include\RtWvOut.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\UdpSocket.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/inetOut.cpp0000644000076600007660000000443012327014024015736 0ustar gary/******************************************/ /* Example program to output N channels of audio data over a network socket connection. by Gary P. Scavone, 2000 This program will load a specified WAV, SND, AIFF, STK RAW, or MAT-file formatted file. The output data format is set for signed 16-bit integers. However, it is easy to change the InetWvOut setting to any of the other defined StkFormats. If using tcpIn, it will be necessary to change the expected data format there as well. The class InetWvOut first attempts to establish a socket connection to a socket server running on port 2006. Therefore, this program needs to be started AFTER the streaming server. */ /******************************************/ #include "FileWvIn.h" #include "InetWvOut.h" #include using namespace stk; void usage(void) { // Error function in case of incorrect command-line // argument specifications. std::cout << "\nuseage: inetOut file host \n"; std::cout << " where file = the file to load,\n"; std::cout << " host = the hostname where the receiving\n"; std::cout << " application is running.\n"; std::cout << " and rate = an optional playback rate for the file.\n"; std::cout << " (default = 1.0, can be negative)\n\n"; exit( 0 ); } int main( int argc, char *argv[] ) { // Minimal command-line checking. if ( argc < 3 || argc > 4 ) usage(); FileWvIn input; InetWvOut output; // Load the file. try { input.openFile( (char *)argv[1] ); } catch ( StkError & ) { exit( 1 ); } // Set the global STK sample rate to the file rate. Stk::setSampleRate( input.getFileRate() ); // Set input read rate. double rate = 1.0; if ( argc == 4 ) rate = atof( argv[3] ); input.setRate( rate ); // Find out how many channels we have. int channels = input.channelsOut(); StkFrames frames( 4096, channels ); // Attempt to connect to the socket server. try { //output.connect( 2006, Socket::PROTO_UDP, (char *)argv[2], channels, Stk::STK_SINT16 ); output.connect( 2006, Socket::PROTO_TCP, (char *)argv[2], channels, Stk::STK_SINT16 ); } catch ( StkError & ) { exit( 1 ); } // Here's the runtime loop while ( !input.isFinished() ) output.tick( input.tick( frames ) ); return 0; } stk-4.5.0/projects/examples/inetOut.dsp0000755000076600007660000001222612327014024015747 0ustar gary# Microsoft Developer Studio Project File - Name="inetOut" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=inetOut - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "inetOut.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "inetOut.mak" CFG="inetOut - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "inetOut - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "inetOut - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "inetOut - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "inetOut___Win32_Release" # PROP BASE Intermediate_Dir "inetOut___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__LITTLE_ENDIAN__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "inetOut - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "inetOut___Win32_Debug" # PROP BASE Intermediate_Dir "inetOut___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__LITTLE_ENDIAN__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "inetOut - Win32 Release" # Name "inetOut - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvIn.cpp # End Source File # Begin Source File SOURCE=.\inetOut.cpp # End Source File # Begin Source File SOURCE=..\..\src\InetWvOut.cpp # End Source File # Begin Source File SOURCE=..\..\src\Socket.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # Begin Source File SOURCE=..\..\src\TcpClient.cpp # End Source File # Begin Source File SOURCE=..\..\src\UdpSocket.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\FileRead.h # End Source File # Begin Source File SOURCE=..\..\include\FileWvIn.h # End Source File # Begin Source File SOURCE=..\..\include\InetWvOut.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\TcpClient.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/libMakefile.in0000644000076600007660000000510412327014024016336 0ustar gary### STK examples Makefile - for various flavors of unix PROGRAMS = sine sineosc foursine RM = /bin/rm INCLUDE = @include@ ifeq ($(strip $(INCLUDE)), ) INCLUDE = ../../include endif vpath %.h $(INCLUDE) CC = @CXX@ DEFS = @CPPFLAGS@ DEFS += @byte_order@ CFLAGS = @CXXFLAGS@ CFLAGS += -I$(INCLUDE) -Iinclude LIBRARY = @LIBS@ REALTIME = @realtime@ ifeq ($(REALTIME),yes) PROGRAMS += audioprobe midiprobe duplex play record inetIn inetOut rtsine crtsine bethree controlbee threebees playsmf grains endif RAWWAVES = @rawwaves@ ifeq ($(strip $(RAWWAVES)), ) RAWWAVES = ../../rawwaves/ endif DEFS += -DRAWWAVE_PATH=\"$(RAWWAVES)\" all : $(PROGRAMS) $(OBJECTS) : Stk.h clean : $(RM) -f $(PROGRAMS) *.exe strip : strip $(PROGRAMS) audioprobe: audioprobe.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o audioprobe audioprobe.cpp -L../../src -lstk $(LIBRARY) midiprobe: midiprobe.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o midiprobe midiprobe.cpp -L../../src -lstk $(LIBRARY) play: play.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o play play.cpp -L../../src -lstk $(LIBRARY) record: record.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o record record.cpp -L../../src -lstk $(LIBRARY) sine: sine.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o sine sine.cpp -L../../src -lstk $(LIBRARY) duplex: duplex.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o duplex duplex.cpp -L../../src -lstk $(LIBRARY) inetIn: inetIn.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o inetIn inetIn.cpp -L../../src -lstk $(LIBRARY) inetOut: inetOut.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o inetOut inetOut.cpp -L../../src -lstk $(LIBRARY) sineosc: sineosc.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o sineosc sineosc.cpp -L../../src -lstk $(LIBRARY) rtsine: rtsine.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o rtsine rtsine.cpp -L../../src -lstk $(LIBRARY) crtsine: crtsine.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o crtsine crtsine.cpp -L../../src -lstk $(LIBRARY) bethree: bethree.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o bethree bethree.cpp -L../../src -lstk $(LIBRARY) controlbee: controlbee.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o controlbee controlbee.cpp -L../../src -lstk $(LIBRARY) foursine: foursine.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o foursine foursine.cpp -L../../src -lstk $(LIBRARY) threebees: threebees.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o threebees threebees.cpp -L../../src -lstk $(LIBRARY) playsmf: playsmf.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o playsmf playsmf.cpp -L../../src -lstk $(LIBRARY) grains: grains.cpp $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o grains grains.cpp -L../../src -lstk $(LIBRARY) stk-4.5.0/projects/examples/Makefile.in0000644000076600007660000001451412327014024015654 0ustar gary### Do not edit -- Generated by 'configure --with-whatever' from Makefile.in ### STK examples Makefile - for various flavors of unix PROGRAMS = sine sineosc foursine RM = /bin/rm SRC_PATH = ../../src OBJECT_PATH = @object_path@ vpath %.o $(OBJECT_PATH) INCLUDE = @include@ ifeq ($(strip $(INCLUDE)), ) INCLUDE = ../../include endif vpath %.h $(INCLUDE) CC = @CXX@ DEFS = @CPPFLAGS@ DEFS += @byte_order@ CFLAGS = @CXXFLAGS@ CFLAGS += -I$(INCLUDE) -I$(INCLUDE)/../src/include LIBRARY = @LIBS@ REALTIME = @realtime@ ifeq ($(REALTIME),yes) PROGRAMS += play record audioprobe midiprobe duplex inetIn inetOut rtsine crtsine bethree controlbee threebees playsmf grains endif RAWWAVES = @rawwaves@ ifeq ($(strip $(RAWWAVES)), ) RAWWAVES = ../../rawwaves/ endif DEFS += -DRAWWAVE_PATH=\"$(RAWWAVES)\" %.o : $(SRC_PATH)/%.cpp $(OBJECT_PATH)/.placeholder $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $(OBJECT_PATH)/$@ %.o : ../../src/include/%.cpp $(OBJECT_PATH)/.placeholder $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $(OBJECT_PATH)/$@ all : $(PROGRAMS) $(OBJECT_PATH)/.placeholder: mkdir -vp $(OBJECT_PATH) touch $(OBJECT_PATH)/.placeholder $(OBJECTS) : Stk.h clean : $(RM) -f $(OBJECT_PATH)/*.o $(RM) -f $(PROGRAMS) *.exe $(RM) -fR *~ *.dSYM distclean: clean $(RM) Makefile strip : strip $(PROGRAMS) audioprobe: RtAudio.o @objects@ $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o audioprobe audioprobe.cpp $(OBJECT_PATH)/*.o $(LIBRARY) midiprobe: RtMidi.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o midiprobe midiprobe.cpp $(OBJECT_PATH)/RtMidi.o $(LIBRARY) play: play.cpp Stk.o FileRead.o FileWvIn.o RtAudio.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o play play.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/FileRead.o $(OBJECT_PATH)/FileWvIn.o $(OBJECT_PATH)/RtAudio.o $(LIBRARY) record: record.cpp Stk.o FileWrite.o FileWvOut.o RtWvIn.o RtAudio.o Mutex.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o record record.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/FileWrite.o $(OBJECT_PATH)/FileWvOut.o $(OBJECT_PATH)/RtWvIn.o $(OBJECT_PATH)/Mutex.o $(OBJECT_PATH)/RtAudio.o $(LIBRARY) sine: sine.cpp Stk.o SineWave.o FileWrite.o FileWvOut.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o sine sine.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/SineWave.o $(OBJECT_PATH)/FileWrite.o $(OBJECT_PATH)/FileWvOut.o $(LIBRARY) duplex: duplex.cpp RtAudio.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o duplex duplex.cpp $(OBJECT_PATH)/RtAudio.o $(LIBRARY) inetIn: inetIn.cpp Stk.o InetWvIn.o RtWvOut.o RtAudio.o Socket.o TcpServer.o UdpSocket.o Thread.o Mutex.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o inetIn inetIn.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/InetWvIn.o $(OBJECT_PATH)/Socket.o $(OBJECT_PATH)/TcpServer.o $(OBJECT_PATH)/UdpSocket.o $(OBJECT_PATH)/Thread.o $(OBJECT_PATH)/Mutex.o $(OBJECT_PATH)/RtWvOut.o $(OBJECT_PATH)/RtAudio.o $(LIBRARY) inetOut: inetOut.cpp Stk.o FileRead.o FileWvIn.o InetWvOut.o Socket.o TcpClient.o UdpSocket.o Thread.o Mutex.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o inetOut inetOut.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/FileRead.o $(OBJECT_PATH)/FileWvIn.o $(OBJECT_PATH)/Socket.o $(OBJECT_PATH)/TcpClient.o $(OBJECT_PATH)/UdpSocket.o $(OBJECT_PATH)/Thread.o $(OBJECT_PATH)/Mutex.o $(OBJECT_PATH)/InetWvOut.o $(LIBRARY) sineosc: sineosc.cpp Stk.o FileRead.o FileWvIn.o FileLoop.o FileWrite.o FileWvOut.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o sineosc sineosc.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/FileWrite.o $(OBJECT_PATH)/FileRead.o $(OBJECT_PATH)/FileWvIn.o $(OBJECT_PATH)/FileWvOut.o $(OBJECT_PATH)/FileLoop.o $(LIBRARY) rtsine: rtsine.cpp Stk.o SineWave.o RtWvOut.o RtAudio.o Mutex.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o rtsine rtsine.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/SineWave.o $(OBJECT_PATH)/RtWvOut.o $(OBJECT_PATH)/RtAudio.o $(OBJECT_PATH)/Mutex.o $(LIBRARY) crtsine: crtsine.cpp Stk.o SineWave.o RtAudio.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o crtsine crtsine.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/SineWave.o $(OBJECT_PATH)/RtAudio.o $(LIBRARY) bethree: bethree.cpp Stk.o FileRead.o FileWvIn.o FileLoop.o FM.o RtAudio.o TwoZero.o SineWave.o ADSR.o BeeThree.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o bethree bethree.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/FileRead.o $(OBJECT_PATH)/FileWvIn.o $(OBJECT_PATH)/FileLoop.o $(OBJECT_PATH)/FM.o $(OBJECT_PATH)/RtAudio.o $(OBJECT_PATH)/TwoZero.o $(OBJECT_PATH)/SineWave.o $(OBJECT_PATH)/ADSR.o $(OBJECT_PATH)/BeeThree.o $(LIBRARY) controlbee: controlbee.cpp Stk.o FileRead.o FileWvIn.o FileLoop.o FM.o RtAudio.o TwoZero.o SineWave.o ADSR.o BeeThree.o Messager.o RtMidi.o Socket.o TcpServer.o Thread.o Mutex.o Skini.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o controlbee controlbee.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/FileRead.o $(OBJECT_PATH)/FileWvIn.o $(OBJECT_PATH)/FileLoop.o $(OBJECT_PATH)/FM.o $(OBJECT_PATH)/RtAudio.o $(OBJECT_PATH)/TwoZero.o $(OBJECT_PATH)/SineWave.o $(OBJECT_PATH)/ADSR.o $(OBJECT_PATH)/BeeThree.o $(OBJECT_PATH)/Messager.o $(OBJECT_PATH)/RtMidi.o $(OBJECT_PATH)/Socket.o $(OBJECT_PATH)/TcpServer.o $(OBJECT_PATH)/Thread.o $(OBJECT_PATH)/Mutex.o $(OBJECT_PATH)/Skini.o $(LIBRARY) foursine: foursine.cpp Stk.o SineWave.o FileWrite.o FileWvOut.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o foursine foursine.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/SineWave.o $(OBJECT_PATH)/FileWrite.o $(OBJECT_PATH)/FileWvOut.o $(LIBRARY) threebees: threebees.cpp Stk.o FileRead.o FileWvIn.o FileLoop.o FM.o RtAudio.o TwoZero.o SineWave.o ADSR.o BeeThree.o Messager.o RtMidi.o Socket.o TcpServer.o Thread.o Mutex.o Skini.o Voicer.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o threebees threebees.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/FileRead.o $(OBJECT_PATH)/FileWvIn.o $(OBJECT_PATH)/FileLoop.o $(OBJECT_PATH)/FM.o $(OBJECT_PATH)/RtAudio.o $(OBJECT_PATH)/TwoZero.o $(OBJECT_PATH)/SineWave.o $(OBJECT_PATH)/ADSR.o $(OBJECT_PATH)/BeeThree.o $(OBJECT_PATH)/Messager.o $(OBJECT_PATH)/RtMidi.o $(OBJECT_PATH)/Socket.o $(OBJECT_PATH)/TcpServer.o $(OBJECT_PATH)/Thread.o $(OBJECT_PATH)/Mutex.o $(OBJECT_PATH)/Skini.o $(OBJECT_PATH)/Voicer.o $(LIBRARY) playsmf: playsmf.cpp Stk.o MidiFileIn.o RtMidi.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o playsmf playsmf.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/MidiFileIn.o $(OBJECT_PATH)/RtMidi.o $(LIBRARY) grains: grains.cpp Stk.o Granulate.o Noise.o FileRead.o RtAudio.o $(CC) $(LDFLAGS) $(CFLAGS) $(DEFS) -o grains grains.cpp $(OBJECT_PATH)/Stk.o $(OBJECT_PATH)/Granulate.o $(OBJECT_PATH)/Noise.o $(OBJECT_PATH)/FileRead.o $(OBJECT_PATH)/RtAudio.o $(LIBRARY) stk-4.5.0/projects/examples/midifiles/0000755000076600007660000000000012327014024015547 5ustar garystk-4.5.0/projects/examples/midifiles/bwv772.mid0000644000076600007660000001073112327014024017302 0ustar garyMThd€MTrkÿQ¡ ÿX„ÿ/MTrk‘ÿharpsichord: John SankeyÀà@Ááp<ÂâD=Ãã>Ääp<Åå0?Ææ <Ççe>Èè@=Êê <Ëë`>Ìì@=ÿTrack 1a<(€< ’>(‚> ”@(„@ •A2…A’>(‚> ”@2„@<(€< —C40‡C€0H’20‚2”4€H„4H•5W€HœGV…5ŒGšE’2WŠEœGV‚2ŒGH”40„400€0€H’J—72‚J—C(‡C šE—+(ŠE œG(ŒG‡7H%‡+ €HšE(ŠE œG2ŒG—C(‡C ’J4—7‚J‡7—Oš90Š9œ;‡OŒ;—O<W‡O•MV€<…M”Lš9W„L•MVŠ9…M—Oœ;0Œ;—70‡7‡O”L<2„LšQ(ŠQ€<—Oœ;(‡O •M'Œ;…M ”L<2„L—O(‡O€<•M’>2…MšQ'‚>ŠQ —O”@2‡O•M(…M ”L—7!„@„L ’J'‡7‚J Hš92€H”L(„LŠ9’Jœ;2‚J•M'Œ;…M ”L<2„L’J(‚J H”4!€<€H œG'„4ŒG šE–62ŠEH(€H†6œG—72ŒG’J(‚J‡7Hš92€HœG(ŒGŠ9šEœ;(ŠE —C(‡CŒ;–B<^œ;€<Q†BšE<Œ;ŠE —C2‡CœG(ŒG šE)€< ’2ŠE‚2’>”40„4–6‚>†6H—7W€HœGV‡7ŒGH”40„4–60†6€H’J’20‚2‚JœG—72ŒGšE(ŠE‡7—Cœ/(‡C –B(†BŒ/”@02„@—C(‡C€0–B’22†BšE'‚2ŠE —C”42‡CœG(ŒG„4šE–62ŠEH'†6€H œG—72ŒG’J(‚J‡7H”42€H”L'„4„L ’Jœ/2‚JœGWŒGHW€H’J(‚JŒ/—O0(‡O€0H’2W€HœGWŒGHW€HœGWŒGšE’&2ŠE—C+‚2‚&‡C—C4—+0‡+š-0Š-œ/0Œ/00€0š-0Š-‡Cœ/0Œ/—+0‡+’24—C(‡C‚2šE—7(ŠE œG'‡7ŒG H–62€HšE(ŠE†6œG—72ŒG—C'‡7‡C –Bš90Š9’20‚2†B”40„4–60†6—70‡7”40„4–60†6’20‚2š94šE(ŠEŠ9œG’>(ŒG H'‚>€H ’J<2‚JœG(ŒG€<H’>2€HšE'‚>ŠE œG—70‡7—C0‡C•A0…A”@0„@’>0‚>ŒG•A0…A”@0„@—C0‡C•A4’J(‚J…AH”@(€H œG(ŒG„@šE•A2ŠEH(€H…AœG’>2ŒG’J(‚J‚>H”@^œG€HO„@šEHŒG%ŠE—C0‡C•A0…A”@0„@—C0‡C•A0…AšE0ŠE—C€H3”L(„L‡C’J•A(‚J H(€H…AœG—C2ŒG’J(‚J‡C‘I”@2I”L(„L„@’J•A0…A›F0‹F‚J‘IšE0ŠE—C'I ‡C’J•A0…AšE0ŠE‚J•M—CW…M”LW‡C„L’J›FW‚J”LW‹F„L•MšE0ŠE—C0‡C…MšE•A0…A”@'ŠE „@œG’>0‚>•A0…AŒG’J”@W‚J‘IW„@IœG—CWŒG‘IW‡CI’J•A0…A”@0„@‚J–B’>0‚><'†B €<˜Dœ;0Œ;’>0‚>ˆDšE<0€<”@'ŠE „@œG’>0‚><0€<ŒGHœ;0Œ;š9'€H Š9œG˜8^HŒGOˆ8œ;’J€H%Œ;š90Š9<0€<œ;‚J/”@0Œ;„@–B”4(†B ˜D(ˆD„4šE’>V‚><TŠE€<–B’> †B ˜D2ˆD”@o‚>9„@ ”L<0€<„L’Jœ;(‚JŒ;Hš90Š9€H”L—7(„L‡7’J–60†6‚JHš9(€HŠ9œG˜80ˆ8ŒG’Jœ;(‚JŒ;Hš90Š9€HšQ<(ŠQ€<˜Pœ;0Œ;ˆPœS’>(ŒS‚>šQ<0€<ŠQ”L”@(„L„@•M’>0‚>…M’J•A‚J…A˜D”@2ˆD•M(…M„@”Lš9(„L ’J#‚JŠ9 ’J”@W‚JHW€H’JW‚JHV„@€HœG”42ŒGšE&„4ŠEšEš94šQŠEŠQ—Oš-2‡O•M2…M”L2„L—O2‡OŠ9•M2…MŠ-šQ2ŠQ—OW‡O•MW…M—O”@0„@’>0‚><0€<œ;0Œ;’>0‚>‘=0=”@0„@’>V‚>‘=V=‡O”L’>2„L•M2…M—O2‡OšQ2ŠQ•M2…M—O2‡O”L2„L•MW…M‚>”LW„L•Mš90Š9œ;0Œ;<0€<’>0‚>œ;0Œ;<0€<š90Š9œ;VŒ;š9VŠ9…M—Oœ;2‡O•M2…M”L2„L’J2‚J•M2…M”L2„L—O2‡O•MW…MŒ;”LW„L•M’>0‚><0€<œ;0Œ;š90Š9<0€<œ;0Œ;’>0‚><V€<œ;VŒ;…M’J<2‚J”L2„L•M2…M—O2‡O”L2„L•M2…M’J2‚J’J$€<‚J”L—7Z•M„LO‡7”Lš9…ML•M„LL”L…MŠ9›:B•M„LL”L…M‹:<'•M „L@”L …M7€<š90Š9›:0‹:—70‡7š9 „L&H(€HŠ9’J›:(‚J ”L(„L‹:•Mš92…M’J(‚JŠ9”L—72„LH(€H‡7’J•52‚J”L(„L…5•M’>(…M —O(‡O‚>šQ<2ŠQ•M(…M€<—O›:2‡O”L(„L‹:•Mš92…M—O(‡OŠ9šQ•A(ŠQ œS(ŒS…AT”@2€TšQ(ŠQ„@œS’>2ŒS—O(‡O‚>”@T3„@’2€T‚2”4—O3„4•5‡O…5•M—7Y…M”LX‡7„L•M”4Y…M”LW„4„L’J•53…5H‚J’2€H‚2 H”4=€H›F3‹F„4šE0=ŠE—C3‡C€0•A’2=…AšE3ŠE ‚2—C”4=‡C›F3‹F „4šE•5G…5ŠEœG’2G‚2ŒGH”4G„4”@•5?„@…5’>—7P€HH`‚>•A—+Q‡7€HœG_‡+…AŒG$H—C”@–$„@‡C€H€$cÿ/MTrk ÿMIDIŒÿ/stk-4.5.0/projects/examples/midifiles/jesu.mid0000644000076600007660000004220312327014024017211 0ustar garyMThd àMTrkgÿAÿXÿYÿQ6ÿ gmjesu.mid†ˆ ÿQ„u‚@ÿQYD ÿQF+‚@ÿQ¯) ÿQTv ÿQnj‚@ÿQ›6ÿ/MTrkœÿ!ÿOboeÄD´y´ T´[\@]ä@&”ClEo CGoEJnGHq JaH2HoLnHJoLvJ'JnOmJNm$OsNOo&JqOGoJ"CmGEpC GlEHp GJjHLlJ JoLHjJGpHEnGGmE CnGBj CCm BEoCE>nBl >En BHoEGmHEoGGnE"CnGEn CGnEJoGJHmqH&Hl%LnHJjL~JJm"OoJNmOOo NOJlGo JCn GEoCGnE@j GJl@!HmJGmHEoGCjE!>nC>Ci(BlCCo BGoCJoG OoJJnOGpJCqGGoCJpGOoJƒoOŸ>v@u >Br@EsBCrE EuCHsE HGuHuGErHBr E>rB"Br>Eu BHuEGrHGEr GuE GCuEuCGuE JuG HuJiHHo#LvH Ju LsJ JrOuJNsO}OrN"JrOGsJCuG EuC GrE@uGJr @HuJsHGv EvGCrE>v CCr >BrCCu BGrCEu GGvEJu GHr JmH&Hu LrH JrLsJ%Jr%OnJNqOOrN#JoO GuJCr GErCGqEHu GJr HLrJ JuLHr JGo HErGGrECr GBr CCqBErC!>sEBq> ErBHu EGrHEr GGr ECrGEr CGuEJs GHrJTH0Hu LrHJr LpJ&JrOq JNoO Or NJsOGrJCrGEsC GuE@rGJq @HoJGrHEuGCrE>uCCr>BqCCrBƒrCž}>v @v>Bu@ EuBCu E EyC Hr EGu HHu GEuHBrE >u BBr>Eu BHv E$GsH EuGGrECsG!EuCGrEJrGHr JsH(HuLuHJr LoJ*JuOrJ NrOOr NJrOGsJ"Cr GEvCGuE@r GJs@Hr JGuHEr G"Cu E>vCCu>BsC Cu BGuCEr GGuEJs GHuJhH*HrLuHJu LgJ&Jr OrJNrO|OrNJsO GrJCr GErCGrE HoGJuHLuJJrL Hq JGrHEr GGrECrGBo CCsBErC$E>rBr>ErBHr EGr HErGGr ECrGEqCGuE"Jq G{HrJNHAHuLrHJuLfJ0Jr'OrJ~NrOOoN#JrOGr J#Cr GErCGuE@rGJr@HrJGuHErGCo E>v CCr>Br CCrBGrCyJrGOr JJqO Gu JCuGGuCIrGJyI>vJ @x>Bw@Eu B Dy E`D0Dy#GwD Ey GYE3Ey&HwEGwHHv GEwH @u Ew< @w> @AwJuAHtJ Ju H"GuJDuG@uDBw@DuB EwD&HuEGu HHu GLuHJw LuJ!JrMrJ LrMgLLr#QuLPrQ{QuP(LuQHrLErH"GrEHr GMrHLr MJrL!Hu JGr HEo G@r EEv@Dr EEvDHuE LuHQuLkQ†YHwJwHLuJOu LMu OOvM RuOQxRQQwTuQSv TTu SQwTMsQJuM LwJ MvL Lu MOsLMw OOwMLuOHuL Cu HEuCFrEEr FHrEGr HHrGEs HArE>qA @r>Ar@@uA@r<@s>Cr@#Bo CCr BGuC Er GGwExGCxEwCGvEJwGHw JhH)HvLxHJuLcJ$Jv%Ov JNvOOv NJvOGv JCvGEvC GtEHvGJvHLv JJv L Hv JGv HEx GGvEGCv*Bv C>vB @x>Bu@Ex BCuE"ExCHrE GsH)HuGEr HBrE>rBBr>Eu B"HsEGs HEr GGr EG CyEuCGuEJwGHu JiH0HxLuH Ju LjJ-Js0Os JNtOOx N JuO GuJCuG EwCGuE@uGJu @Hu JGu HEuGCuE%>uCCu>Bu CCtBGwCJuG OxJ Ju OGuJCuGGuCJu GMu J Jr M Gr J/Cr GGrCJqGLrJHoLErHBoEEqBHr E#Jr HGrJCqG@rCCr@GrCHrGEr HBqE>qB Bo >Eq BHrEGrHEr GGs EGCoEuCGrEJrG"Hr JeH*HsLrHJq LwJJs!OrJ Nn O$Os N JrOGr JCqGErCGrEHrGJoH LrJJrLHr JGrH EsGGrECrGBrCCrB ErC"E>nBq> ErBHsEGrHEr GGrEGCrEu!C~GrEJrGHrJcH%Hq&LrHJrLaJ,Ju%OoJ NoOOr NJr O GrJCo G ErC GqE@rGJs @Hr JGuH ErGCo E">v CCr>BqCCrBŠrCÿ/MTrkpÿ!ÿTrumpetÂ9²{² K²[}@]â@Ú’G‡RHGƒHJH†wJJ{ƒaH{J‡9G~HƒFE~Gƒ!E(E~„#EŽFG}‡>H{GƒBJ{H‡GG~Jƒ>E~GpG~EaH~G_GHƒ3G0G~OE~GGzEEz GG{EE{GGwEEzGGzEEzGG{EE~G C~)E‡!CÆ|G‡DH~ GƒMJ~H†tJ-J~ƒnH{ J‡+G~Hƒ8E~Gƒ$E6E~ƒpEŽ}G‡@HGƒ>JH‡@G}JƒCEG_GEcH~GnGHƒ5G*GUE~GGzE Ez GGzEE|GG|EEzGGzEE~G1C E‡,CÒ@E‡*GEƒ_HG†aH-H~ƒSG~ H…EHG\J~HkG} JƒlE~Gƒ4E E}„E™pH‡.JHƒSLJ†vLL~ƒiJL…1LJYM~LnJ~Mƒ=H~Jƒ;H,HƒH™~G‡(HGƒAJ~H‡J%J~ƒ\H~Jƒ H)H~mG~H9H{G5G~HHzG%GwHHyGGzHHzGGz HHyGGz HHwGGwH'HzG Gu HHzG"GwH/E~G‡ EG‡NHGƒWJH†vGJƒmE G{G~ESH{GbG~HOE~GHG~E5E~G!GwE!EwGGvEEw GGwEE{ GGwEEz GGwEEwGGuEEzG%GwE"EwG$GzEE{G%C~ EŠSCÿ/MTrk¡ÿ!ÿViolin IÁ0±y± ±[pá@±]@&‘CrEu CGuEJtGHv JaH2HuLtHJuLvJ'JtOsJNs$OsNOu&JvOGuJ"CsGEvC GrEHv GJqHLrJ JuLHqJGvHEtGGsE CtGBq CCs BEuCE>tBr >Et BHuEGsHEuGGtE"CtGEt CGtEJuGJHsqH&Hr%LtHJqL~JJs"OuJNsOOu NOJrGu JCt GEuCGtE@q GJr@!HsJGsHEuGCqE!>tC>Cp(BrCCu BGuCJuG OuJJtOGvJCvGGuCJvGOuJƒoOŸ>z@y >Bw@ExBCwE EyCHxE HGyHyGEwHBw E>wB"Bw>Ey BHyEGwHGEw GyE GCyEyCGyE JyG HyJiHHu#L{H Jy LsJ JwOyJNxO}OwN"JwOGxJCyG EyC GwE@yGJw @HyJsHG{ E{GCwE>{ CCw >BwCCy BGwCEy GGzEJy GHw JmH&Hy LwH JwLsJ%Jw%OtJNvOOwN#JuO GyJCw GEwCGvEHy GJw HLwJ JyLHw JGu HEwGGwECw GBw CCvBEwC!>xEBv> EwBHy EGwHEw GGw ECwGEw CGyEJx GHwJTH0Hy LwHJw LpJ&JwOv JNuO Ow NJxOGwJCwGExC GyE@wGJv @HuJGwHEyGCwE>yCCw>BvCCwBƒrCž}>z @z>By@ EyBCy E E}C Hw EGy HHy GEyHBwE >y BBw>Ez BH{ E$GxH EyGGwEC{G!E|CGzEJzGHz JsH(H|L|HJz LoJ*J|OzJ NzOOz NJzOG{J"Cz GE}CG|E@z GJ{@Hz JG|HEz G"C| E>~CC|>B{C C| BG|CEz GG|EJ{ GH|JhH*HzL|HJ| LgJ&Jw OwJNwO|OwNJxO GwJCw GEwCGwE HuGJyHLyJJwL Hv JGwHEw GGwECwGBu CCxBEwC$E>wBw>EwBHw EGw HEwGGw ECwGEvCGyE"Jv G{HwJNHAHyLwHJyLfJ0Jw'OwJ~NwOOuN#JwOGw J#Cw GEwCGyE@wGJw@HwJGyHEwGCu E>{ CCw>Bw CCwBGwCyJwGOw JJvO Gy JCyGGyCIwGJ~I>|J @~>B}@E{ B D~ E`D0D~#G}D E~ GYE3E~&H}EG}HH| GE}H @{ E<{@>}< @}> @A}J{AH{J J{ H"G{JD{G@{DB}@D{B E}D&H{EG{ HH{ GL{HJ} LuJ!JwMwJ LwMgLLw#QyLPwQ{QyP(LyQHwLEwH"GwEHw GMwHLw MJwL!Hy JGw HEu G@w EEz@Dw EEzDHyE LyHQyLkQ†YH}J}HL{JO{ LM{ OO|M R{OQ~RQQ}T{QS| TT{ SQ}TMzQJ{M L}J M|L L{ MOzLM} OO}ML{OH{L C{ HEyCFwEEw FHwEGw HHwGEx HAwE>vA @w>Aw@@yA@w<@x>Cw@#Bu CCw BGyC Ew GG}ExGC~E}CG|EJ}GH} JhH)H|L~HJ{LcJ$J|%O| JN|OO| NJ|OG| JC|GE|C GzEH|GJ|HL| JJ| L H| JG| HE~ GG|EGC|*B| C>|B @~>B|@E~ BC{E"E~CHwE GxH)HyGEw HBwE>wBBw>Ey B"HxEGx HEw GGw EG CE|CG|EJ}GH| JiH0H~L|H J| LjJ-Jz0Oz JN{OO~ N J|O G|JC|G E}CG|E@|GJ| @H| JG| HE|GC|E%>|CC|>B| CC{BG}CJ|G O~J J| OG|JC|GG|CJ| GM| J Jw M Gw J/Cw GGwCJvGLwJHuLEwHBuEEvBHw E#Jw HGwJCvG@wCCw@GwCHwGEw HBvE>vB Bu >Ev BHwEGwHEw GGx EGCuEyCGwEJwG"Hw JeH*HxLwHJv LwJJx!OwJ Nt O$Ox N JwOGw JCvGEwCGwEHwGJuH LwJJwLHw JGwH ExGGwECwGBwCCwB EwC"E>tBv> EwBHxEGwHEw GGwEGCwEy!C~GwEJwGHwJcH%Hv&LwHJwLaJ,Jy%OuJ NuOOw NJw O GwJCu G EwC GvE@wGJx @Hw JGyH EwGCu E">z CCw>BvCCwBŠrCÿ/MTrk =ÿ!ÿ Violin IIÅ0µyµ hµ[på@µ]@ƒh•Cu‚1CBs'CuB‚$Eu CGtE‚+EuGGu E‚4CuG @u C‚@>u@@u>‚#Bp @CtB‚(>u C@t>‚@;u"9u;‚4>u 9Eu>‚?CtE Eu C‚=BrE>tB‚4Bq>CrB‚2BqC#CrB‚,EuCGu E‚#GEu$Gv E‚5CuG@u C‚+Cs @EuC‚ABsECsB‚B@uC9u@‚Hw‚4@w>Bs@‚BCwEsC‚,Hs EEuH‚-BsE>uB‚9Bt&>Cs B‚:>u CCu>‚,Bu CCuB‚:EuCGuE‚.EuGCuE‚?BsC@s B‚4Cu@ EuC‚s;Cs>‚FBsC Cs B‚.EsCGsE‚*EtGGuE‚7CsG@s C‚9>u @@u >‚1Bt @CsB‚->t C@u>‚5;u@9s ;‚+>u 9Es>‚'Cu EEsC‚:BsE >s B‚&Bs >CsB‚(BsCCs B‚.Et CGuE‚GEs$Gs E‚7CtG @u C‚/Cs@Et C‚:BsE CrB‚3@sC 9s @‚+u‚,@u> Bs@‚5CsBEsC‚)Hs EEuH‚)BsE>sB‚9Bp>CuB‚5>u CCs >‚'BsCCsB‚4EvCGsE‚/EuGCs E‚)Bs C@uB‚5Cs@ Eu C‚3Cu EBs C‚CCuBEwC‚Iu; Cu>‚*Bs CCsB‚7EtCGvE‚6EuGGsE‚9CsG @sC‚?>s@(@u>‚%Bs@ Cs B‚0>u C@s >‚;;s @#;9s‚,>s9Es>‚.CsEEtC‚EBsE!>sB‚%Bs>Ct B‚+Bs CCuB‚)EuC GuE‚EsGGt E‚8Ct G@s C‚ACs@ Et C‚.BsECu4B‚@u C9s@‚?u J‚-}<#>u<@w >‚7u<‚&@u>xAu@‚8>u A ;u>‚B>s; ‚?@w <Es @‚;Dw EEuD‚-GuEHwG‚5Gt HHs G‚:EuHAuE‚EEwAwE,Ew‚&Du EEuD‚;BuE;u B‚5>u;ƒn<Š}Hw‚&JuHLuJ‚.HvLAt H‚8CsAEuC‚-JuE GwJ‚5JsGHw J‚,CsHHs C‚OCu H @tC‚C>u @‚-@u< Au@‚+EwAGu E‚>Ju GHs J‚,Cs H Hu C‚EEwHJtE‚8BtJCwB‚%C>w(Cu>‚*BwCCu B‚)EuCGwE‚)Ew GGuE‚w@@u>‚0Bs@ CsB‚.>sC@u>‚/;u @9v;‚G=v9>u=‚'@w>Bs@‚:CuBEwC‚3Hu EEu H‚*Bs E>sB‚NBu> Ct B‚4>wCCt>‚,Bs CCsB‚;EwC GuE‚Eu G CsE‚CBsC@s B‚:Cs@EsC‚Ct EBs C‚?CuBEtC‚?uB‚;Bs> CsB‚>sCCw>‚@Bv C Cu B‚QEwCGs E‚,Eu GGtE‚.Ct G@uC‚?>s @@s >‚2Bs@CsB‚2>u C@s>‚$;t@#9s;‚<>s9 Et>‚5Cs EEt C‚ABsE>uB‚)Bs >CuB‚%BsCCuB‚$EuCGs E‚5Eu GGuE‚CCs G$@uC‚/Cu@ EsC‚ABsECuB‚:@wC9u@‚-uƒc@w>ƒ@Cu@ƒR@uCƒK;u@ƒL9t;ƒ`>s#9ƒJ‡#9u<ƒCBt9ƒ`Cu"Bƒ?7tCƒ?@u7ƒ_Ct@ƒL@uCƒM;u!@ƒ>uƒ7>1>tƒj>s>s!;v>‚7Cu;>tC„ >¡'9uv9<9w>z 9‚>&>s#Bt>‚"Eu BBsE‚(>uB#9u>‚<>u 9z>%>uƒ0>1>wƒM>@wƒiCs"@ƒA>u/Cƒ1;u >ƒTw 9o;w>du;ƒF@s >ƒaCu@ƒ=@u CƒW;s@ƒV9s;ƒD>u9ƒP‡F9t<ƒ<9Brƒ^CuBƒM7tCƒR@u 7ƒYCs @ƒK@sCƒS;s@ƒQs@ƒ#>&>uƒt>¡T9sp919w>w 9‚>/>u'Bs>‚EsBBs E‚7>uB9s>‚4>s9>3>uƒE>#>sƒ0@w>ƒVCs@ƒn>tCƒN;w$>ƒ;w 9f;w >du ;ƒN@s>ƒDCu@ƒ7@uCƒQ;s @ƒn9s;ƒA>s9ƒP‡L9s<ƒLBs9ƒJCuBƒC7sCƒQ@u7ƒGCs@ƒI@sCƒQ;s@ƒ[u@ƒ%>1>u„->VCu)>uC‚6@u>Bz3@ƒH>w Bƒ%>3>wƒM@w>ƒ=9w @ƒoEw9†wE2EzƒUDw EƒK@w DƒZ9u@ƒLAw9ƒdEwAƒKAuEƒPz<ƒTBv>ƒD@wBƒ'@@w„ @ŠlEwƒZCsEƒF>wCƒQAu>ƒBCuAƒ9C*CuƒN@wCƒ`Cu@ƒ@AuCƒUEuAƒaCuEƒ5CCtƒlC‚>w> >s‚#>2>w~>(>wƒ2>#>uƒY@w>ƒTCw @ƒ=@uCƒN;u@ƒH9s ;ƒ[>u 9ƒn‡A9u<v9%9u>w 9o>H>u&Bs >‚)EwBBsE‚>t B9s>‚=>t9r>+>uƒ:>>uƒU@w>ƒ[Cz@ƒK>z CƒW;w>ƒNs9s;w >ku C‚Ct >&>uCƒH>‚FCs@uC‚&u">;u‚6@u ;$4w @‚%9u4~6s 9‚=Es6Bu E‚;>uB2>wL>‚f>!>uƒK@s>ƒeCu @ƒ<@sCƒQ;u @ƒ_9s ;ƒc>v9ƒD‡<9s <ƒ_Bu 9ƒ]CuBƒF7s CƒJ@w7ƒ:Cu@ƒC@uCƒ9;u@ƒau@ƒI>(>u‹ >ÿ/MTrk }ÿ!ÿOrganÀ°w° @à@°]@[}ÚCwGw>w7w+wƒh6w*w+7ƒ#C4w(w 6*HwCw@wG>ƒH+C6w*w9wJwEw@ 4(ƒ34w(w 6* Cw E‚uCJ02w&w;wJw(4Bw9ƒ$JB!;4w(w;wCwHw&2ƒL6w*w9w;>wC4(ƒ:7w+w7wGw*69Hƒ>62w&w>w6wEw 7G 7+ƒ!2& E>9wEw>w62w&w„92&E>ŽNCw>w7w+wGwƒT6w*w+7ƒCI@wCw>4w(wHw G*6ƒ?C;w/wCw>w Jw4(@Hƒ-/w#w>w;w;/C>ƒ;J @wGw>;w 4w(w./#ƒ@4(wGw2w&wBw9H@$0;;w@w>B,&2)EwG2w&wwE2&B‡6+ >; CÆ_CwGw>w7w+wƒ\6w*w+7ƒ!C>@wHwG 4w(wCw6*ƒ2CEwJw9w6w*w4(@HƒKCw4w(wE6*ƒ+JBw;wJwC2w&w9(4ƒ.;HwCwJ;w4w(w&2BƒH>w6w*w9w;C4(ƒ@7w7w+w9*6Gw$Hƒ>6w2w&wEw>w 7G7+ƒ>2&E>w2w&w9wEw6ƒY&2>E!9Ž>Cw7w+w>wGwƒV6w*w+7ƒ(CHw4w(wCwG6* @w>ƒ"CJw>wCw;w/wH@ (4ƒ*>wC;w /w#w> /;ƒ;&@w ;w>4w(wGwJ#/ƒ/@0w$ww@H$0 9H@w B;w >2&*BwEw 2w&w G@wBE;w<‡;+C >Ò/>wEwBw 2w&wƒ]0w$w&2ƒ >Gw>wEDw/w#wB $0ƒHwGEw-w!w@w #/D >ƒ@9w-w -!d7w+w-9#HEHw5w)wEw 7+Aw@>4w(w5)gE2w&wAGw EwH4(Awƒ@>w/w#w A2&jHwGYJwH]Dw@w4w(wGwE /#>Jƒ@-w!wEww-9@‚tC:Cw Jƒ(Hw9w-w C0<ƒ&L <Cw4w(wHLww Cw7w+wGw‡@wCHw >4w(wGCw+7ƒC>w;w/w@CwJw(4Hƒ2;w>@w4w/;ƒ C;)J;wCwJw 4w(w4@‚ECUCwHww B/w#w<-!$GwH3HwG%GwH"HwG$Gw HHwGGwHHwGGw0w$wH@w>#/HwGGw HHwGGwH HwGGwHHwGGwH HwG(GwH5Bw Ew2w&w9wGC@$0‡!2& BE9ŽXCw7w+w>w Gwƒe6w*w+7ƒC4w(wCwHw@wG>6*ƒ!C;w/wCw4(>wJw H @ƒ';w>w/w#w>C/;‚};6;w Gw@w4w(wJ >#/ƒ!@wBw0$Gw9H@SEwGBGwE$@w ;wB>Ew G%GwE$Ew GGwEEw G Bw w B+wwCw;w E< &2Šh;C>+ÿ/MTrkøÿ!ÿBassÃ0³y³ P³[pã@³]@“+uƒL7v&+ƒ:4v7ƒZ/w4ƒ[4v&/ƒ:(v4ƒQ-u(ƒY/v -ƒT0v /ƒ@2u0ƒO6t2ƒE2s 6ƒT7s'2ƒ94v7ƒO0u4ƒD0/sƒ`4w /ƒU2v-4ƒ30u2ƒF1u*0ƒ62v$1ƒ<+t2ƒ_+‚(7t 2s 7‚42/s +t /ƒU6q+ƒE4s 6ƒT6s34ƒ-4t6ƒO2s4ƒK4r2ƒL6q<4ƒ$67rƒT7 2s„2‚2sb2>2ub2^2t &s2ƒU&‚92ty2'2ts2M2q 7r2ƒI76sƒ`4s6ƒR;t#4ƒ-;/sƒ`4q/ƒP0s 4ƒS2t0ƒD&t2ƒY&+uƒ`7r+ƒF4t7ƒO/q4ƒ^4r/ƒ^(s4ƒA-r (ƒW/r-ƒP0tA/ƒ2q)0ƒ.2 6pƒZ62qƒ`7n2ƒJ4o/7ƒ10k4ƒO/q0ƒ[4s /ƒS2t4ƒM0r 2ƒT1q%0ƒ;2s1ƒE2+tƒ`6s@+ƒ 4u6ƒY6t4ƒP4r 6ƒW42tƒ`4q92ƒ'6p94ƒ6 7sƒ`2r7ƒX2‚22rh282tW2i2s &p2ƒf&‚82q[2E2qn2R2t 7n 2ƒ*7*6pƒ`4s16ƒ/;t+4ƒ5/t ;ƒW4p5/ƒ+0r4ƒJ2s)0ƒ7&q 2ƒW+t&ƒZ7q(+ƒ84r7ƒI/s4ƒL4r)/ƒ7(q 4ƒ@-q(ƒK/r-ƒQ0r-/ƒ32s.0ƒ26s2ƒO2r6ƒQ7s 2ƒW4t7ƒ]40tƒ`/r 0ƒS4s/ƒF2r"4ƒ>0s 2ƒV1s00ƒ02s41ƒ2+sƒI+‚W7v 6v07x64u 2u 4ƒS0t2ƒ^/t0ƒJ-r8/ƒ(9p-k7s9a7 5tn54tl42tƒ`/s2ƒB4p/ƒL-r#4ƒ=5n-ƒ452tƒ`0t2ƒZ5t90ƒ54vƒJ42rƒ`3p!2ƒ?4r53ƒ+-t 4ƒT9r-ƒI;t 9ƒT4ƒ"5p0ƒA2r5ƒP7o2ƒI70sƒm0‚30~ /00‚ /2~ +~2ƒD7t+ƒO4r7ƒH/s14ƒ /4vƒ`(q4ƒS(-rƒ`/t5-ƒ+0t4/ƒ,2q0ƒs2‚2r_2A2w2'2t &t2ƒQ&‚A2pw2)2pr2N2r 7r!2ƒ?76sƒ`4r.6ƒ2;v.4ƒ2/s&;ƒ:4r/ƒE0t4ƒR2t'0ƒ9&q!2ƒ?&+s°`7o+ƒC4r%7ƒ;/t4ƒN4t/ƒP(r4ƒQ( -qƒ`/t/-ƒ10q4/ƒ,2r*0ƒ66p2ƒA2q6ƒJ7q2ƒN4q!7ƒ?0p4ƒV0/qƒ`4q'/ƒ92q)4ƒ 20rƒ`1t<0ƒ$2q1ƒY+r2Šx+£M T Aÿ/MTrk#ÿ!ÿCopyright (C) 1992 MTAÿ/MTrk!ÿ!ÿAll rights reserved.ÿ/stk-4.5.0/projects/examples/midifiles/tango.mid0000644000076600007660000002776212327014024017370 0ustar garyMThd€MTrk+ÿX`ÿAÿQ5x…ûDÿQPÿQ®Äÿ/MTrk.lÿTango°À°[ÿY‰°[2'&'°@H°@ €&€2‚|93X€9&$€E€6€>‚@-+!0°@X °@°@ €-€!°@8°@h °@‚$2.&!X°@X°@(°@<°@°@h°@H€&$€2D9&4€9pE: >(6(P€E€6 €>‚H-+ !&<€!€-ƒBE2&>(&/°@89 °@P°@(€& €2€9°@€>4€B@BM`€BdBKd€BdBC>&(€> 82 €BEE8CM€E €8,9($°@H°@|°@X°@l€C €9 BD(-,4€-<€B 6.8-'&(€6>4 °@8 °@TED€>°@h°@€-€E€&ƒ\8+L€893°@X°@\°@8°@@€9(JNB9-1p€-€B€JDLR E;(€E\€L|NTJ7- &+°@8°@l°@8°@€& €-0€Jd€N,IHE>,€E0€I8)<€8L@49*JHB,°@8€L °@\°@H€J°@ €BH€9@GB-(,€C€G JL G5 &(1-"°@8°@h°@X°@ €& €-€1 €Gp€JhEFB-4€B82€E8€809.IGE:°@H°@l°@h°@\€E€I0€9,C?@/-",€@ €-0€CG;2)-&A)&),°@X°@\°@(°@X°@€A €G4E8B*°@H °@(€&€-0°@8€2°@4€B‚°@h8*°@<€8°@89- °@ €ED4A+4€A|Q@E1H€D°@H°@°@°@H°@D€Q€EC/@(8€C€@@€9‚ B>6'-(&->',°@X°@€>,€-€&€6 °@X °@(€BBET€BpBID60€B<70$B@€781€60€8€BE@$9/€ECG$°@X °@p°@H°@,€C€9(BF-5H€-,€Bd6-&,-)°@X °@D>0°@(°@€6,€& €-ED€>4€EƒDE1\J- °@8Q( °@ €J°@NV'°@h°@4€Q]4€N€V €E@€]‚hJP -5 C1G;°@°@0°@H°@€G@€JLTIA(€C0€L$€IJ3&+NSB-L°@H°@\°@8 °@ €J`€-@€B@\./<€N@lIMC8$€CX€I8L 0€LJL€.B#°@X °@//@€J €&@°@X°@€B€/`GD B/?'0,°@H&)°@,€G€B€? °@H°@€&€0‚ C;9'1(&(°@H@ °@\°@h €&@€9@°@€@@€1@ €C@‚PE(TQ$ L O,U,8€E €L€O]1€Q(€U€]‚hCD @6,-€@4€- €CDEPB?D€B@€EPGLCB°@H&&°@-!1T°@X°@€&€- €1 €C@$€G@‚IME70€E 6/ €I 77(€6 €784 LL I@€8°@89. °@<°@8°@|€L4€I0JK€9G6 -. €G$€-0€JhJK°@8-' &(G4°@4*0€J@LE°@°@X€G@°@JD€LL€JIGE.°@8 °@L€&@°@X€-@ °@€4@€ED€IPE1LL2$Q4O-U/ €E$€L€O €Q]0 €U$€]‚DLM-. I6P€-€L€IDGLC;4€C@ €G@0JL G4 &&1! °@X-°@`€& °@h€-°@€1,€GH€J‚ EIB'6$ €B(7. €E(84 €6€7<€8EAIG95\°@h°@°@X°@X°@ €E€I -1@8CF€9T€-@€@@€C@,G= A/&,- 2!$°@(°@\°@8°@$€&€G€A€-B*E:°@( °@$°@H°@(€B €2€E|E-LJ.(€JQ-N,@€E V,€Nh€Q €V].8€]ƒ@JVB6>,&0°@(., °@<°@X°@8€&(€J€. €B€>@JV >8/.#0B0°@X°@€# €/°@°@h °@€B@€JtIR€I0€>$GRP/60€GPIS€/@C6:.>4°@H43 °@€>€C€4°@X€:°@€I8S3(;3@5C5 _< GR€S€;(€_€C€@€GX>58B8€>JS#0/2 °@X €B°@4€#(°@h°@@€J<;:dBO €;p:>€B>&(€>CB8BL>+9@ €C °@8 °@€98°@°@h°@8AL€B€:@d8<(€8€/@€A(BL€>H€BD75(>.°@(°@#2/,€7CP$€>€#°@8€/°@€CHGQ8€G,JPl/;€J<€/IPC7;+56>5°@h°@4€>@°@€5@°@h€C@€;@°@ €I@@S6X_<GMC3=5€S4€_€G8€=€C|>6B2JM/=°@H°@\°@X°@€BX5;€>`€5€JGG8€/@65$°@X°@0€6/64€/°@X €G°@>;F>°@8 °@ €>@\€F@xE@ €E(2NN<€( D?$€D€N-8T°@( °@E4NR €-=7€E°@X°@p€N€=dLUD3\€D°@H .5°@46°@(°@$€LITC?€.€CH€I@h€4@JOB994/4X°@H°@0€B €9 °@H°@d€/€J,GNA581234°@8°@€A8°@8°@p€GL€2PLR@;1-(°@ °@P°@(°@d€8`€LIM9)L€@(€I@8€9@@;L€1@EH$°@X 6'°@D€6 °@8°@\€E GP€@€GQ;?34€Q€?4IS €I>8XE@5+/2°@h°@HLP°@h°@€/€5 €L$JRQ:4€Q€J@€E@IM8€>@€IDIK82D->-,°@(°@<°@(°@h°@X€I€842€D8€4HGG,€>t(54€(€G,€Q(€O€C€J€E€>pNN95B8J,,€9 €B25\€2-6,€-p&64-6°@h°@8 €J°@€&QQ E3(69°@( °@h€-°@€E4€N$€Q€6ƒE'PQ#$J",V.N'8€E€J]0€N€Q €V €]‚`VPJFN591H€9€J€N€V25PXW L<Q>€2 -6€L€X €QZLN/ V.&30°@H °@T€& °@X °@ €Z€V,€N€-xUII; Q$ €Q-*€I2!4€-€29$ €9€U XJ(€X0>'VGJ@ N8E04€E€J€>€V(€N|93SK N4H4G2 °@h°@( °@(€9°@°@H °@ 35 €S€N €H€G8€3-6D€-(&2-* OF I,C1,°@X45°@°@8°@€&€C€-€I€40€O‚\E*XQ$L4U,O*X€Q€E €O]1€L€U€]‚xOJL9>5C;,€C€>€L,€O46DRK F=NA(€4 /9€F €N€/$€R\SOG8O?(&9°@H°@0€&/>°@8 °@L€G€O 44€/0€S€4X=A(€=UUIER?t€I€R€UdXY;AU?LD °@X °@<€;°@(7?°@,€U€X(€7/F€L<€/pVT &@J?S>8<€&€x(@9€J€S€V €€(DVQR:7*<JBN8D°@X °@P€°@8°@€*<€V€JPUGI::6\€:048@€4065<€RD€N@B,:+D°@8°@P°@h €6°@ €:€U €B€I0RHF2CF L5H€F€L€CB9$€R0SRG@J2D€B€GA8€S€J €A\@5UOI:O@°@h°@(°@8°@( €O°@€@;-€;t4A4€IL€4 €U*8$VTJN0€J €V€* ZXNE;VB°@°@P°@8°@$€V *< €Z€N€€*xXRU?L@ 7,64€,€ 4€U€X€L@.7"5d€",€.`UJ#8/7MDI8°@h°@H€M°@( °@ €I$€UHVE°@J7N5°@8€#°@( °@€/‚ 634€V€N €J(€6dB.;+l°@h °@X°@4JIG16,>0,€G €; °@8€B°@ €>°@(€6°@h °@(€J‚ IC@/G27)/.4°@8 °@€@€G,€/€7°@X °@D€I(LEh€L*€97<G8<°@8°@P°@H °@€> €/€Jt€7JC>/68 /2°@h °@°@€> °@ °@X°@ €6 €J€/‚€G@7I>/376°@H °@€@ °@8°@€I€/€7L?t€LNJ,€NlLE4€L;,1',)0°@(°@€1X€, °@( °@X°@L€;@I@%.D€Ip€%0€APB2:(*+1&t°@H°@X°@`€1$€*,€:€BƒDBA@90*$+900°@H °@`°@X °@0€@ €$,€08ED €B ?:°@X #)/*°@P°@X°@€E€#CH(€9P€?$€CBE9-(1D°@8 °@\°@H°@ €9<€B@EL°@h°@80210€/°@X°@`€(€8€2G3€@D€G‚0@;=(7)-#!4°@H°@°@ °@X °@T€@xA6t°@8°@\°@H°@€7€-0€! €=€AƒB06)) >!&°@h °@( °@D°@( €>°@4€€6€B€&B= 7/>+ €70€B€>d86BD>.8€8€> €B06(@7-€6B,>-€780(E@€B€> €8€ECF91D°@h°@(°@T°@8 °@<€C,€9,B<-7D€-€B-6.&°@ °@8€6°@>5t€>E?<€E€&€-„N2J-9/8>(€N€J$B-(E-(J-(€BQ;(€E €> €9€J€Q‚`JMB1-2$€B\€J4LNED €E€L@J>@NI&0@°@8 °@€JD°@X°@l€&<6->/,€N,€6€>\@/9-$IIE0€-@6"€@€I€9€E$9% L4>- €L€9JNB8,€>(€BL€J€6‚(GDA29(3+<04€9 €G€A€3h€<DB5<€BDC<=(4.&'9&-%D°@H °@|€9°@H€&°@€4€=€-8€Cƒ\S7L/I,H€S€I €L,C3X€C0O2@$9&G(I),€90€G €O€@€I‚hCD-->*@*°@°@8°@h°@,€CH€@ €>ENB9L€B$€Ex°@X°@GH°@=5C6&1D€-°@H°@@€&<€=€CD€GL;4@6=9,°@8°@L€=°@H °@€@€C‚°@X°@°@G==4-,&,A-\°@(°@h €A°@4€=,€G@°@hE6B+>/ °@(°@8€&(€-°@8 °@‚<-/‚918°@H°@H€- °@°@X €>°@€B€E€9-,tJM>/6.‚ €>€-€62: €2,€JxJN@2(°@H"2.+°@0€@8°@(°@h€"€.°@5°@h°@°@,€H$°@( €J°@h °@JU=3F< €J €>tLS$€C€F0€L\€=T°@h°@( °@OR<3E4$€< °@X€5°@@€O()5MM(€)4€MHG93€E0€H €9TE@ €EFAT€AxFE=&+12(,°@H°@°@H€2€=€+°@\>2 €F€>HB2€B24EB<7@90°@(°@`°@(°@X €E°@DFD<°@8°@@:4°@€F°@XC5 °@€C IF€: €@@€It€<@°@h90°@LHB/h°@H€9 °@€24€L\€BJDL€JA>D€A<&.B=-0>5 °@`°@8 °@8€B(€-8E<0CG€E€>T°@X@2.)$+°@p°@h°@4€.€$€&€@BG€C‚l?/9)#-/*°@X°@l€#°@H€/ °@T€BlCD€?X€90EG€CX€E H1t€HK%CH9-Q&T(?+°@8°@8€Q€T °@°@X°@0€K$€?H€CPBFH1H€H€9l€Bƒ°@hB=(/9//-°@>6°@t€(°@h°@8€B$€9€/GG\€G,€>tB?D€B G4€GP@<>$S#8%L'Jp°@X°@t€S€J°@X€L °@p(+€(x€>‚ --!0 °@8°@p°@H°@€8€-€!8CF=&:%L€@€: €=€C@BG93=((€90€=€BE9H= B<€=8€B CB 9-(BG°@X€C=+°@Q7X€Q°@8€E°@€9P€=0€B7* °@h°@= -,!"@@ €7°@H°@E3€=€@€-€E€!‚p°@h°@H>2&$+6+E*(°@h°@€E€6 €€>€&… E99!T€EQCJ6>)B$€J€>€Q€B€9‚p-+ƒ$°@h °@°@€>H°@(°@h€-°@€6<€B‚D€&\E19&h€EHQC>"B"J((€J€>€B €Q€9ƒ`-*„B7>*&-6 H°@(°@D€>€6°@(°@8€B€-‚D€&ƒ8N62+J9B(€J$€B$€9 €N€2‰V*>$E!JN#€>€E,€J€N€V°@h°@X°@Hd°@h°@‚(°@H°@(°@ÿ/MTrkÿAlbeniz-GodowskyÿYÿ/MTrk%ÿCopyright 1996 R FinleyÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/MTrk ÿYÿ/stk-4.5.0/projects/examples/midiprobe.cpp0000644000076600007660000000270012327014024016257 0ustar gary// midiprobe.cpp // // Simple program to check MIDI inputs and outputs. // // by Gary Scavone, 2003-2004. #include #include #include "RtMidi.h" int main() { RtMidiIn *midiin = 0; RtMidiOut *midiout = 0; // RtMidiIn constructor try { midiin = new RtMidiIn(); } catch ( RtMidiError &error ) { error.printMessage(); exit( EXIT_FAILURE ); } // Check inputs. unsigned int nPorts = midiin->getPortCount(); std::cout << "\nThere are " << nPorts << " MIDI input sources available.\n"; std::string portName; unsigned int i; for ( i=0; igetPortName(i); } catch ( RtMidiError &error ) { error.printMessage(); goto cleanup; } std::cout << " Input Port #" << i+1 << ": " << portName << '\n'; } // RtMidiOut constructor try { midiout = new RtMidiOut(); } catch ( RtMidiError &error ) { error.printMessage(); exit( EXIT_FAILURE ); } // Check outputs. nPorts = midiout->getPortCount(); std::cout << "\nThere are " << nPorts << " MIDI output ports available.\n"; for ( i=0; igetPortName(i); } catch ( RtMidiError &error ) { error.printMessage(); goto cleanup; } std::cout << " Output Port #" << i+1 << ": " << portName << '\n'; } std::cout << '\n'; // Clean up cleanup: delete midiin; delete midiout; return 0; } stk-4.5.0/projects/examples/midiprobe.dsp0000755000076600007660000001053512327014024016273 0ustar gary# Microsoft Developer Studio Project File - Name="midiprobe" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=midiprobe - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "midiprobe.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "midiprobe.mak" CFG="midiprobe - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "midiprobe - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "midiprobe - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "midiprobe - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "midiprobe___Win32_Release" # PROP BASE Intermediate_Dir "midiprobe___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "midiprobe - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "midiprobe___Win32_Debug" # PROP BASE Intermediate_Dir "midiprobe___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_MM__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "midiprobe - Win32 Release" # Name "midiprobe - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\midiprobe.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtMidi.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\RtMidi.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/play.cpp0000644000076600007660000000677212327014024015267 0ustar gary/******************************************/ /* Example program to play an N channel soundfile. This program will load WAV, SND, AIF, and MAT-file formatted files of various data types. If the audio system does not support the number of channels or sample rate of the soundfile, the program will stop. By Gary P. Scavone, 2000 - 2004. */ /******************************************/ #include "FileWvIn.h" #include "RtAudio.h" #include #include #include using namespace stk; // Eewww ... global variables! :-) bool done; StkFrames frames; static void finish(int ignore){ done = true; } void usage(void) { // Error function in case of incorrect command-line // argument specifications. std::cout << "\nuseage: play file sr \n"; std::cout << " where file = the file to play,\n"; std::cout << " where sr = sample rate,\n"; std::cout << " and rate = an optional playback rate.\n"; std::cout << " (default = 1.0, can be negative)\n\n"; exit( 0 ); } // This tick() function handles sample computation only. It will be // called automatically when the system needs a new buffer of audio // samples. int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) { FileWvIn *input = (FileWvIn *) userData; register StkFloat *samples = (StkFloat *) outputBuffer; input->tick( frames ); for ( unsigned int i=0; iisFinished() ) { done = true; return 1; } else return 0; } int main(int argc, char *argv[]) { // Minimal command-line checking. if ( argc < 3 || argc > 4 ) usage(); // Set the global sample rate before creating class instances. Stk::setSampleRate( (StkFloat) atof( argv[2] ) ); // Initialize our WvIn and RtAudio pointers. RtAudio dac; FileWvIn input; // Try to load the soundfile. try { input.openFile( argv[1] ); } catch ( StkError & ) { exit( 1 ); } // Set input read rate based on the default STK sample rate. double rate = 1.0; rate = input.getFileRate() / Stk::sampleRate(); if ( argc == 4 ) rate *= atof( argv[3] ); input.setRate( rate ); input.ignoreSampleRateChange(); // Find out how many channels we have. int channels = input.channelsOut(); // Figure out how many bytes in an StkFloat and setup the RtAudio stream. RtAudio::StreamParameters parameters; parameters.deviceId = dac.getDefaultOutputDevice(); parameters.nChannels = channels; RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32; unsigned int bufferFrames = RT_BUFFER_SIZE; try { dac.openStream( ¶meters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&input ); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } // Install an interrupt handler function. (void) signal(SIGINT, finish); // Resize the StkFrames object appropriately. frames.resize( bufferFrames, channels ); try { dac.startStream(); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } // Block waiting until callback signals done. while ( !done ) Stk::sleep( 100 ); // By returning a non-zero value in the callback above, the stream // is automatically stopped. But we should still close it. try { dac.closeStream(); } catch ( RtAudioError &error ) { error.printMessage(); } cleanup: return 0; } stk-4.5.0/projects/examples/play.dsp0000755000076600007660000001122612327014024015264 0ustar gary# Microsoft Developer Studio Project File - Name="play" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=play - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "play.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "play.mak" CFG="play - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "play - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "play - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "play - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "play - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "play - Win32 Release" # Name "play - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvIn.cpp # End Source File # Begin Source File SOURCE=.\play.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/playsmf.cpp0000644000076600007660000000633712327014024015772 0ustar gary// playsmf.cpp // // Simple program to test the MidiFileIn class by reading and playing // a single track from a given Standard MIDI file. // // by Gary Scavone, 2003. #include "MidiFileIn.h" #include "RtMidi.h" #include #include bool done = false; static void finish(int ignore){ done = true; } using namespace stk; void usage(void) { // Error function in case of incorrect command-line // argument specifications. std::cout << "\nusage: playsmf file track \n"; std::cout << " where file = a standard MIDI file,\n"; std::cout << " track = the track to play (0 = 1st track),\n"; std::cout << " and an optional port integer identifier can be specified\n"; std::cout << " (default = 0) or a value of -1 to use a virtual MIDI output port.\n\n"; exit( 0 ); } int main( int argc, char *argv[] ) { RtMidiOut *midiout = 0; if ( argc < 3 || argc > 4 ) usage(); // Attempt to instantiate MIDI output class. try { midiout = new RtMidiOut(); } catch ( RtMidiError& error ) { error.printMessage(); exit(0); } // Check command-line arguments. int port = 0; if ( argc == 4 ) port = atoi( argv[3] ); if ( port == -1 ) { try { midiout->openVirtualPort(); } catch ( RtMidiError& error ) { error.printMessage(); goto cleanup; } std::cout << "\nVirtual port open.\n\n"; } else { if ( midiout->getPortCount() < 1 ) { std::cout << "\nThere are no MIDI output destinations available!\n\n"; goto cleanup; } try { midiout->openPort( port ); } catch ( RtMidiError& error ) { error.printMessage(); goto cleanup; } } // Install an interrupt handler function. Type "ctrl-c" to quit the // program. (void) signal( SIGINT, finish ); try { MidiFileIn midiFile( argv[1] ); // Print a little information about the file. std::cout << "\nThe MIDI file (" << argv[1] << ") information:\n"; std::cout << " - format = " << midiFile.getFileFormat() << "\n"; std::cout << " - tracks = " << midiFile.getNumberOfTracks() << "\n"; std::cout << " - seconds / ticks = " << midiFile.getTickSeconds() << "\n"; unsigned int track = (unsigned int) atoi( argv[2] ); if ( midiFile.getNumberOfTracks() <= track ) { std::cout << "\nInvalid track number ... playing track 0.\n"; track = 0; } std::cout << "\nPress to start reading/playing.\n"; char input; std::cin.get(input); std::vector event; unsigned long ticks = midiFile.getNextMidiEvent( &event, track ); while ( !done && event.size() ) { // Pause for the MIDI event delta time. Stk::sleep( (unsigned long) (ticks * midiFile.getTickSeconds() * 1000 ) ); midiout->sendMessage( &event ); // Get a new event. ticks = midiFile.getNextMidiEvent( &event, track ); } // Send a "all notes off" to the synthesizer. event.clear(); event.push_back( 0xb0 ); event.push_back( 0x7b ); event.push_back( 0x0 ); midiout->sendMessage( &event ); } catch ( StkError & ) { // You might want to do something more useful here. std::cout << "\nAborting program!\n"; goto cleanup; } cleanup: delete midiout; return 0; } stk-4.5.0/projects/examples/playsmf.dsp0000755000076600007660000001122512327014024015771 0ustar gary# Microsoft Developer Studio Project File - Name="playsmf" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=playsmf - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "playsmf.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "playsmf.mak" CFG="playsmf - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "playsmf - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "playsmf - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "playsmf - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_DS__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "playsmf - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "playsmf___Win32_Debug" # PROP BASE Intermediate_Dir "playsmf___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_DS__" /D "__WINDOWS_MM__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "playsmf - Win32 Release" # Name "playsmf - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\MidiFileIn.cpp # End Source File # Begin Source File SOURCE=.\playsmf.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtMidi.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\MidiFileIn.h # End Source File # Begin Source File SOURCE=..\..\include\RtMidi.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/rawwaves/0000755000076600007660000000000012327014024015441 5ustar garystk-4.5.0/projects/examples/rawwaves/sinewave.raw0000644000076600007660000000100012327014024017764 0ustar gary$G j ‹«Çáø "#%'(&+.0û3Þ6¹9Œ using namespace stk; void usage( void ) { // Error function in case of incorrect command-line // argument specifications. std::cout << "\nuseage: record N file time fs \n"; std::cout << " where N = number of channels,\n"; std::cout << " file = the .wav file to create,\n"; std::cout << " time = the amount of time to record (in seconds),\n"; std::cout << " and fs = the sample rate.\n\n"; exit( 0 ); } int main( int argc, char *argv[] ) { // minimal command-line checking if ( argc != 5 ) usage(); Stk::showWarnings( true ); unsigned int channels = (unsigned int) atoi( argv[1] ); double sampleRate = atof( argv[4] ); double time = atof( argv[3] ); long samples, i; StkFrames frame( 1, channels ); // Set the global sample rate. Stk::setSampleRate( sampleRate ); // Initialize our WvIn/WvOut pointers. RtWvIn *input = 0; FileWvOut *output = 0; // Open the realtime input device try { input = new RtWvIn( channels ); } catch ( StkError & ) { exit( 1 ); } // Open the soundfile for output. try { output = new FileWvOut( argv[2], channels, FileWrite::FILE_WAV ); } catch ( StkError & ) { goto cleanup; } // Here's the runtime loop samples = (long) ( time * Stk::sampleRate() ); for ( i=0; itick( input->tick( frame ) ); } cleanup: delete input; delete output; return 0; } stk-4.5.0/projects/examples/record.dsp0000755000076600007660000001214712327014024015600 0ustar gary# Microsoft Developer Studio Project File - Name="record" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=record - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "record.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "record.mak" CFG="record - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "record - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "record - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "record - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # SUBTRACT CPP /Fr # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "record - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "record___Win32_Debug" # PROP BASE Intermediate_Dir "record___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "record - Win32 Release" # Name "record - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\FileWrite.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvOut.cpp # End Source File # Begin Source File SOURCE=.\record.cpp # End Source File # Begin Source File SOURCE=..\..\src\Mutex.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\include\RtWvIn.h # End Source File # Begin Source File SOURCE=..\..\src\Mutex.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/rtsine.cpp0000644000076600007660000000162612327014024015617 0ustar gary// rtsine.cpp STK tutorial program #include "SineWave.h" #include "RtWvOut.h" #include using namespace stk; int main() { // Set the global sample rate before creating class instances. Stk::setSampleRate( 44100.0 ); Stk::showWarnings( true ); int nFrames = 100000; SineWave sine; RtWvOut *dac = 0; try { // Define and open the default realtime output device for one-channel playback dac = new RtWvOut( 1 ); } catch ( StkError & ) { exit( 1 ); } sine.setFrequency( 441.0 ); // Option 1: Use StkFrames /* StkFrames frames( nFrames, 1 ); try { dac->tick( sine.tick( frames ) ); } catch ( StkError & ) { goto cleanup; } */ // Option 2: Single-sample computations for ( int i=0; itick( sine.tick() ); } catch ( StkError & ) { goto cleanup; } } cleanup: delete dac; return 0; } stk-4.5.0/projects/examples/rtsine.dsp0000755000076600007660000001171012327014024015621 0ustar gary# Microsoft Developer Studio Project File - Name="rtsine" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=rtsine - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "rtsine.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "rtsine.mak" CFG="rtsine - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "rtsine - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "rtsine - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "rtsine - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "rtsine___Win32_Release" # PROP BASE Intermediate_Dir "rtsine___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "rtsine - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "rtsine___Win32_Debug" # PROP BASE Intermediate_Dir "rtsine___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "rtsine - Win32 Release" # Name "rtsine - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=.\rtsine.cpp # End Source File # Begin Source File SOURCE=..\..\src\Mutex.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtWvOut.cpp # End Source File # Begin Source File SOURCE=..\..\src\SineWave.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\include\RtWvOut.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\Mutex.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/scores/0000755000076600007660000000000012327014024015100 5ustar garystk-4.5.0/projects/examples/scores/bachfugue.ski0000644000076600007660000015225212327014024017550 0ustar gary///COM: Bach, Johann Sebastian ///OTA: Das wohltemperirte Clavier ///OPR: Das wohltemperierte Klavier ///OTL: Fuga 2, Vol. 1 ///XEN: The Well-Tempered Clavier, Volume 1, Fugue 2. ///ONB: C minor, 3-part ///SCT: BWV 847b ///YEC: Copyright 1994, David Huron ///YEM: Rights to all derivative electronic formats reserved. // Keysig 3 flats // Tempo 72 MM per quarter note // Measure number 1 =0 NoteOn 0.416667 2 72 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 71 64 NoteOff 0.208333 2 71 64 NoteOn 0 2 72 64 NoteOff 0.416667 2 72 64 NoteOn 0 2 67 64 NoteOff 0.416667 2 67 64 NoteOn 0 2 68 64 NoteOff 0.416667 2 68 64 NoteOn 0 2 72 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 71 64 NoteOff 0.208333 2 71 64 NoteOn 0 2 72 64 NoteOff 0.416667 2 72 64 NoteOn 0 2 74 64 NoteOff 0.416667 2 74 64 // Measure number 2 =3.33333 NoteOn 0 2 67 64 NoteOff 0.416667 2 67 64 NoteOn 0 2 72 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 71 64 NoteOff 0.208333 2 71 64 NoteOn 0 2 72 64 NoteOff 0.416667 2 72 64 NoteOn 0 2 74 64 NoteOff 0.416667 2 74 64 NoteOn 0 2 65 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 67 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 68 64 NoteOff 0.833333 2 68 64 NoteOn 0 2 67 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 65 64 NoteOff 0.208333 2 65 64 // Measure number 3 =6.66667 NoteOn 0 2 63 64 NoteOff 0.208333 2 63 64 NoteOn 0 2 72 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 71 64 NoteOn 0 3 79 64 NoteOff 0.208333 2 71 64 NoteOff 0 3 79 64 NoteOn 0 2 69 64 NoteOn 0 3 78 64 NoteOff 0.208333 2 69 64 NoteOff 0 3 78 64 NoteOn 0 2 67 64 NoteOn 0 3 79 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 65 64 NoteOff 0.208333 3 79 64 NoteOff 0 2 65 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 63 64 NoteOn 0 2 62 64 NoteOff 0.208333 3 72 64 NoteOff 0 2 62 64 NoteOn 0 2 60 64 NoteOn 0 3 75 64 NoteOff 0.416667 2 60 64 NoteOff 0 3 75 64 NoteOn 0 2 75 64 NoteOn 0 3 79 64 NoteOff 0.208333 3 79 64 NoteOn 0 3 78 64 NoteOff 0.208333 2 75 64 NoteOff 0 3 78 64 NoteOn 0 2 74 64 NoteOn 0 3 79 64 NoteOff 0.416667 2 74 64 NoteOff 0 3 79 64 NoteOn 0 2 72 64 NoteOn 0 3 81 64 NoteOff 0.416667 2 72 64 NoteOff 0 3 81 64 // Measure number 4 =10 NoteOn 0 2 70 64 NoteOn 0 3 74 64 NoteOff 0.416667 2 70 64 NoteOff 0 3 74 64 NoteOn 0 2 69 64 NoteOn 0 3 79 64 NoteOff 0.208333 3 79 64 NoteOn 0 3 78 64 NoteOff 0.208333 2 69 64 NoteOff 0 3 78 64 NoteOn 0 2 70 64 NoteOn 0 3 79 64 NoteOff 0.416667 2 70 64 NoteOff 0 3 79 64 NoteOn 0 2 72 64 NoteOn 0 3 81 64 NoteOff 0.416667 2 72 64 NoteOff 0 3 81 64 NoteOn 0 2 66 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 66 64 NoteOff 0 3 74 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.416667 2 67 64 NoteOn 0 2 69 64 NoteOff 0.416667 3 75 64 NoteOff 0 2 69 64 NoteOn 0 2 66 64 NoteOn 0 3 74 64 NoteOff 0.208333 3 74 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 66 64 NoteOff 0 3 72 64 // Measure number 5 =13.3333 NoteOn 0 2 67 64 NoteOn 0 3 70 64 NoteOff 0.416667 3 70 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 74 64 NoteOn 0 3 75 64 NoteOn 0.208333 2 60 64 NoteOff 0.208333 3 75 64 NoteOff 0 2 60 64 NoteOn 0 2 62 64 NoteOn 0 3 67 64 NoteOff 0.208333 2 62 64 NoteOn 0 2 63 64 NoteOff 0.208333 3 67 64 NoteOff 0 2 63 64 NoteOn 0 2 65 64 NoteOn 0 3 68 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 67 64 NoteOff 0.208333 3 68 64 NoteOff 0 2 67 64 NoteOn 0 2 68 64 NoteOn 0 3 77 64 NoteOff 0.208333 3 77 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 77 64 NoteOff 0.208333 2 68 64 NoteOn 0 2 62 64 NoteOff 0.208333 3 77 64 NoteOff 0 2 62 64 NoteOn 0 2 63 64 NoteOn 0 3 69 64 NoteOff 0.208333 2 63 64 NoteOn 0 2 65 64 NoteOff 0.208333 3 69 64 NoteOff 0 2 65 64 // Measure number 6 =16.6667 NoteOn 0 2 67 64 NoteOn 0 3 70 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 69 64 NoteOff 0.208333 3 70 64 NoteOff 0 2 69 64 NoteOn 0 2 70 64 NoteOn 0 3 79 64 NoteOff 0.208333 3 79 64 NoteOn 0 3 77 64 NoteOff 0.208333 3 77 64 NoteOn 0 3 79 64 NoteOff 0.208333 2 70 64 NoteOn 0 2 63 64 NoteOff 0.208333 3 79 64 NoteOff 0 2 63 64 NoteOn 0 2 65 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 67 64 NoteOff 0.208333 3 71 64 NoteOff 0 2 67 64 NoteOn 0 2 68 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 68 64 NoteOn 0 2 67 64 NoteOff 0.208333 3 72 64 NoteOff 0 2 67 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 74 64 NoteOn 0 2 63 64 NoteOn 0 3 75 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 75 64 NoteOn 0 2 62 64 NoteOn 0 3 77 64 NoteOff 0.416667 2 62 64 NoteOn 0 2 72 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 71 64 NoteOff 0.208333 2 71 64 // Measure number 7 =20 NoteOn 0 2 72 64 NoteOff 0.416667 3 77 64 NoteOn 0 1 60 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 60 64 NoteOff 0 3 75 64 NoteOn 0 1 59 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 72 64 NoteOff 0 1 59 64 NoteOff 0 3 74 64 NoteOn 0 1 60 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 60 64 NoteOff 0 3 70 64 NoteOn 0 1 55 64 NoteOn 0 3 68 64 NoteOff 0.208333 3 68 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 55 64 NoteOff 0 3 67 64 NoteOn 0 1 56 64 NoteOn 0 3 65 64 NoteOff 0.416667 1 56 64 NoteOff 0 3 65 64 NoteOn 0 1 60 64 NoteOn 0 2 77 64 NoteOn 0 3 80 64 NoteOff 0.208333 1 60 64 NoteOn 0 1 59 64 NoteOff 0.208333 2 77 64 NoteOff 0 3 80 64 NoteOff 0 1 59 64 NoteOn 0 1 60 64 NoteOn 0 2 75 64 NoteOn 0 3 79 64 NoteOff 0.416667 1 60 64 NoteOff 0 2 75 64 NoteOff 0 3 79 64 NoteOn 0 1 62 64 NoteOn 0 2 74 64 NoteOn 0 3 77 64 NoteOff 0.416667 1 62 64 NoteOff 0 2 74 64 NoteOff 0 3 77 64 // Measure number 8 =23.3333 NoteOn 0 1 55 64 NoteOn 0 3 75 64 NoteOff 0.416667 1 55 64 NoteOff 0 3 75 64 NoteOn 0 1 60 64 NoteOn 0 2 68 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 60 64 NoteOn 0 1 59 64 NoteOff 0.208333 2 68 64 NoteOff 0 3 74 64 NoteOff 0 1 59 64 NoteOn 0 1 60 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.416667 1 60 64 NoteOff 0 2 67 64 NoteOff 0 3 75 64 NoteOn 0 1 62 64 NoteOn 0 2 65 64 NoteOn 0 3 77 64 NoteOff 0.416667 1 62 64 NoteOff 0 2 65 64 NoteOff 0 3 77 64 NoteOn 0 1 53 64 NoteOn 0 2 67 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 53 64 NoteOn 0 1 55 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 71 64 NoteOff 0 1 55 64 NoteOn 0 1 56 64 NoteOn 0 2 65 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 63 64 NoteOff 0.208333 3 72 64 NoteOff 0 2 63 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.416667 1 56 64 NoteOff 0 2 65 64 NoteOff 0 3 74 64 NoteOn 0 1 55 64 NoteOn 0 2 62 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 55 64 NoteOn 0 1 53 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 71 64 NoteOff 0 1 53 64 // Measure number 9 =26.6667 NoteOn 0 1 51 64 NoteOn 0 2 67 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 60 64 NoteOff 0.208333 3 72 64 NoteOff 0 1 60 64 NoteOn 0 1 59 64 NoteOn 0 3 79 64 NoteOff 0.208333 1 59 64 NoteOff 0 3 79 64 NoteOn 0 1 57 64 NoteOn 0 3 78 64 NoteOff 0.208333 2 67 64 NoteOff 0 1 57 64 NoteOff 0 3 78 64 NoteOn 0 1 55 64 NoteOn 0 3 79 64 NoteOff 0.208333 1 55 64 NoteOn 0 1 53 64 NoteOff 0.208333 3 79 64 NoteOff 0 1 53 64 NoteOn 0 1 51 64 NoteOn 0 2 71 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 50 64 NoteOff 0.208333 2 71 64 NoteOff 0 3 74 64 NoteOff 0 1 50 64 NoteOn 0 1 48 64 NoteOn 0 2 72 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 50 64 NoteOff 0.208333 2 72 64 NoteOff 0 1 50 64 NoteOn 0 1 51 64 NoteOn 0 2 72 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 72 64 NoteOn 0 1 50 64 NoteOn 0 2 71 64 NoteOff 0.208333 3 75 64 NoteOff 0 1 50 64 NoteOff 0 2 71 64 NoteOn 0 1 48 64 NoteOn 0 2 72 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 46 64 NoteOff 0.208333 2 72 64 NoteOff 0 1 46 64 NoteOn 0 1 44 64 NoteOn 0 2 67 64 NoteOn 0 3 76 64 NoteOff 0.208333 1 44 64 NoteOn 0 1 43 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 76 64 NoteOff 0 1 43 64 // Measure number 10 =30 NoteOn 0 1 41 64 NoteOn 0 2 68 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 41 64 NoteOn 0 1 58 64 NoteOff 0.208333 3 77 64 NoteOff 0 1 58 64 NoteOn 0 1 56 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 56 64 NoteOff 0 3 77 64 NoteOn 0 1 55 64 NoteOn 0 3 76 64 NoteOff 0.208333 2 68 64 NoteOff 0 1 55 64 NoteOff 0 3 76 64 NoteOn 0 1 53 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 53 64 NoteOn 0 1 51 64 NoteOff 0.208333 3 77 64 NoteOff 0 1 51 64 NoteOn 0 1 50 64 NoteOn 0 2 69 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 50 64 NoteOn 0 1 48 64 NoteOff 0.208333 2 69 64 NoteOff 0 3 72 64 NoteOff 0 1 48 64 NoteOn 0 1 46 64 NoteOn 0 2 70 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 46 64 NoteOn 0 1 48 64 NoteOff 0.208333 2 70 64 NoteOff 0 1 48 64 NoteOn 0 1 50 64 NoteOn 0 2 70 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 70 64 NoteOn 0 1 48 64 NoteOn 0 2 69 64 NoteOff 0.208333 3 74 64 NoteOff 0 1 48 64 NoteOff 0 2 69 64 NoteOn 0 1 46 64 NoteOn 0 2 70 64 NoteOff 0.208333 1 46 64 NoteOn 0 1 44 64 NoteOff 0.208333 2 70 64 NoteOff 0 1 44 64 NoteOn 0 1 43 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 43 64 NoteOn 0 1 41 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 74 64 NoteOff 0 1 41 64 // Measure number 11 =33.3333 NoteOn 0 1 39 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 39 64 NoteOn 0 1 56 64 NoteOff 0.208333 3 75 64 NoteOff 0 1 56 64 NoteOn 0 1 55 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 55 64 NoteOff 0 3 75 64 NoteOn 0 1 53 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 67 64 NoteOff 0 1 53 64 NoteOff 0 3 74 64 NoteOn 0 1 51 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 49 64 NoteOff 0.208333 3 75 64 NoteOff 0 1 49 64 NoteOn 0 1 48 64 NoteOn 0 2 67 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 46 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 70 64 NoteOff 0 1 46 64 NoteOn 0 1 44 64 NoteOn 0 2 68 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 44 64 NoteOff 0 2 68 64 NoteOff 0 3 72 64 NoteOn 0 1 60 64 NoteOn 0 2 68 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 60 64 NoteOff 0 2 68 64 NoteOff 0 3 74 64 NoteOn 0 1 58 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.416667 1 58 64 NoteOff 0 2 67 64 NoteOff 0 3 75 64 NoteOn 0 1 56 64 NoteOn 0 2 65 64 NoteOn 0 3 77 64 NoteOff 0.416667 1 56 64 NoteOff 0 2 65 64 NoteOff 0 3 77 64 // Measure number 12 =36.6667 NoteOn 0 1 55 64 NoteOn 0 3 70 64 NoteOff 0.416667 1 55 64 NoteOff 0 3 70 64 NoteOn 0 1 53 64 NoteOn 0 2 56 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 53 64 NoteOff 0 2 56 64 NoteOff 0 3 74 64 NoteOn 0 1 55 64 NoteOn 0 2 58 64 NoteOn 0 3 75 64 NoteOff 0.416667 1 55 64 NoteOff 0 2 58 64 NoteOff 0 3 75 64 NoteOn 0 1 56 64 NoteOn 0 2 60 64 NoteOn 0 3 77 64 NoteOff 0.416667 1 56 64 NoteOff 0 2 60 64 NoteOff 0 3 77 64 NoteOn 0 1 50 64 NoteOn 0 3 68 64 NoteOff 0.208333 3 68 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 50 64 NoteOff 0 3 70 64 NoteOn 0 1 51 64 NoteOn 0 2 56 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 56 64 NoteOn 0 2 55 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 55 64 NoteOn 0 1 53 64 NoteOn 0 2 56 64 NoteOff 0.416667 3 72 64 NoteOff 0 1 53 64 NoteOff 0 2 56 64 NoteOn 0 1 50 64 NoteOn 0 2 53 64 NoteOn 0 3 70 64 NoteOff 0.208333 3 70 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 53 64 NoteOff 0 3 68 64 // Measure number 13 =40 NoteOn 0 1 51 64 NoteOn 0 2 58 64 NoteOn 0 3 67 64 NoteOff 0.208333 3 67 64 NoteOn 0 3 63 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 58 64 NoteOff 0 3 63 64 NoteOn 0 1 56 64 NoteOn 0 2 60 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 56 64 NoteOff 0 2 60 64 NoteOff 0 3 67 64 NoteOn 0 1 55 64 NoteOn 0 2 58 64 NoteOn 0 3 68 64 NoteOff 0.208333 3 68 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 55 64 NoteOff 0 2 58 64 NoteOff 0 3 70 64 NoteOn 0 1 53 64 NoteOn 0 2 56 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 53 64 NoteOff 0 2 56 64 NoteOff 0 3 74 64 NoteOn 0 1 55 64 NoteOn 0 2 58 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 55 64 NoteOff 0 2 58 64 NoteOff 0 3 74 64 NoteOn 0 1 51 64 NoteOn 0 2 55 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 55 64 NoteOff 0 3 74 64 NoteOn 0 1 50 64 NoteOn 0 2 53 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 53 64 NoteOff 0 3 77 64 NoteOn 0 1 48 64 NoteOn 0 2 51 64 NoteOn 0 3 79 64 NoteOff 0.208333 3 79 64 NoteOn 0 3 81 64 NoteOff 0.208333 1 48 64 NoteOff 0 2 51 64 NoteOff 0 3 81 64 // Measure number 14 =43.3333 NoteOn 0 1 50 64 NoteOn 0 2 53 64 NoteOn 0 3 82 64 NoteOff 0.208333 3 82 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 53 64 NoteOff 0 3 65 64 NoteOn 0 1 58 64 NoteOn 0 2 61 64 NoteOn 0 3 67 64 NoteOff 0.208333 3 67 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 58 64 NoteOff 0 2 61 64 NoteOff 0 3 68 64 NoteOn 0 1 56 64 NoteOn 0 2 60 64 NoteOn 0 3 70 64 NoteOff 0.208333 3 70 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 56 64 NoteOff 0 2 60 64 NoteOff 0 3 72 64 NoteOn 0 1 55 64 NoteOn 0 2 58 64 NoteOn 0 3 74 64 NoteOff 0.208333 3 74 64 NoteOn 0 3 76 64 NoteOff 0.208333 1 55 64 NoteOff 0 2 58 64 NoteOff 0 3 76 64 NoteOn 0 1 56 64 NoteOn 0 2 60 64 NoteOn 0 3 77 64 NoteOff 0.208333 3 77 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 56 64 NoteOff 0 2 60 64 NoteOff 0 3 75 64 NoteOn 0 1 53 64 NoteOn 0 2 56 64 NoteOn 0 3 74 64 NoteOff 0.208333 3 74 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 53 64 NoteOff 0 2 56 64 NoteOff 0 3 75 64 NoteOn 0 1 51 64 NoteOn 0 2 55 64 NoteOn 0 3 77 64 NoteOff 0.208333 3 77 64 NoteOn 0 3 79 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 55 64 NoteOff 0 3 79 64 NoteOn 0 1 50 64 NoteOn 0 2 53 64 NoteOn 0 3 81 64 NoteOff 0.208333 3 81 64 NoteOn 0 3 83 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 53 64 NoteOff 0 3 83 64 // Measure number 15 =46.6667 NoteOn 0 1 51 64 NoteOn 0 2 55 64 NoteOn 0 3 84 64 NoteOff 0.416667 1 51 64 NoteOff 0 2 55 64 NoteOff 0 3 84 64 NoteOn 0 2 67 64 NoteOn 0 3 83 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 83 64 NoteOn 0 2 66 64 NoteOn 0 3 81 64 NoteOff 0.208333 2 66 64 NoteOff 0 3 81 64 NoteOn 0 2 67 64 NoteOn 0 3 79 64 NoteOff 0.208333 3 79 64 NoteOn 0 3 77 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 77 64 NoteOn 0 2 60 64 NoteOn 0 3 75 64 NoteOff 0.208333 3 75 64 NoteOn 0 3 74 64 NoteOff 0.208333 2 60 64 NoteOff 0 3 74 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.416667 2 63 64 NoteOff 0 3 72 64 NoteOn 0 1 48 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 66 64 NoteOff 0.208333 1 48 64 NoteOff 0 3 75 64 NoteOff 0 2 66 64 NoteOn 0 1 46 64 NoteOn 0 2 67 64 NoteOn 0 3 74 64 NoteOff 0.416667 1 46 64 NoteOff 0 2 67 64 NoteOff 0 3 74 64 NoteOn 0 1 45 64 NoteOn 0 2 69 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 45 64 NoteOff 0 2 69 64 NoteOff 0 3 72 64 // Measure number 16 =50 NoteOn 0 2 62 64 NoteOn 0 3 70 64 NoteOff 0.416667 2 62 64 NoteOff 0 3 70 64 NoteOn 0 1 51 64 NoteOn 0 2 67 64 NoteOn 0 3 69 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 66 64 NoteOff 0.208333 1 51 64 NoteOff 0 3 69 64 NoteOff 0 2 66 64 NoteOn 0 1 50 64 NoteOn 0 2 67 64 NoteOn 0 3 70 64 NoteOff 0.416667 1 50 64 NoteOff 0 2 67 64 NoteOff 0 3 70 64 NoteOn 0 1 48 64 NoteOn 0 2 69 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 48 64 NoteOff 0 2 69 64 NoteOff 0 3 72 64 NoteOn 0 1 50 64 NoteOn 0 2 60 64 NoteOn 0 3 66 64 NoteOff 0.208333 2 60 64 NoteOn 0 2 62 64 NoteOff 0.208333 1 50 64 NoteOff 0 3 66 64 NoteOff 0 2 62 64 NoteOn 0 1 48 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 46 64 NoteOff 0.208333 3 67 64 NoteOff 0 1 46 64 NoteOn 0 1 48 64 NoteOn 0 3 69 64 NoteOff 0.416667 2 63 64 NoteOff 0 1 48 64 NoteOff 0 3 69 64 NoteOn 0 1 50 64 NoteOn 0 2 62 64 NoteOn 0 3 66 64 NoteOff 0.208333 2 62 64 NoteOn 0 2 60 64 NoteOff 0.208333 1 50 64 NoteOff 0 3 66 64 NoteOff 0 2 60 64 // Measure number 17 =53.3333 NoteOn 0 1 43 64 NoteOn 0 2 58 64 NoteOn 0 3 67 64 NoteOff 0.416667 1 43 64 NoteOff 0 2 58 64 NoteOff 0 3 67 64 NoteOn 0 1 58 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 58 64 NoteOff 0 3 74 64 NoteOn 0 1 57 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 57 64 NoteOff 0 3 72 64 NoteOn 0 1 58 64 NoteOn 0 3 74 64 NoteOn 0.208333 2 62 64 NoteOff 0.208333 1 58 64 NoteOff 0 3 74 64 NoteOff 0 2 62 64 NoteOn 0 1 50 64 NoteOn 0 2 64 64 NoteOff 0.208333 2 64 64 NoteOn 0 2 66 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 66 64 NoteOn 0 1 51 64 NoteOn 0 2 67 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 69 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 69 64 NoteOn 0 1 60 64 NoteOn 0 2 70 64 NoteOn 0 3 76 64 NoteOff 0.208333 1 60 64 NoteOff 0 3 76 64 NoteOn 0 1 58 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 58 64 NoteOff 0 3 74 64 NoteOn 0 1 60 64 NoteOn 0 3 76 64 NoteOff 0.208333 2 70 64 NoteOn 0 2 64 64 NoteOff 0.208333 1 60 64 NoteOff 0 3 76 64 NoteOff 0 2 64 64 NoteOn 0 1 52 64 NoteOn 0 2 65 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 67 64 NoteOff 0.208333 1 52 64 NoteOff 0 2 67 64 // Measure number 18 =56.6667 NoteOn 0 1 53 64 NoteOn 0 2 69 64 NoteOff 0.208333 2 69 64 NoteOn 0 2 70 64 NoteOff 0.208333 1 53 64 NoteOff 0 2 70 64 NoteOn 0 1 62 64 NoteOn 0 2 72 64 NoteOn 0 3 78 64 NoteOff 0.208333 1 62 64 NoteOff 0 3 78 64 NoteOn 0 1 60 64 NoteOn 0 3 76 64 NoteOff 0.208333 1 60 64 NoteOff 0 3 76 64 NoteOn 0 1 62 64 NoteOn 0 3 78 64 NoteOff 0.208333 2 72 64 NoteOn 0 2 66 64 NoteOff 0.208333 1 62 64 NoteOff 0 3 78 64 NoteOff 0 2 66 64 NoteOn 0 1 54 64 NoteOn 0 2 67 64 NoteOff 0.208333 2 67 64 NoteOn 0 2 69 64 NoteOff 0.208333 1 54 64 NoteOff 0 2 69 64 NoteOn 0 1 55 64 NoteOn 0 2 70 64 NoteOff 0.416667 2 70 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 67 64 NoteOn 0 2 62 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 55 64 NoteOff 0 2 62 64 NoteOff 0 3 65 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOn 0.208333 1 43 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 67 64 NoteOff 0 1 43 64 NoteOn 0 1 45 64 NoteOn 0 2 55 64 NoteOff 0.208333 1 45 64 NoteOn 0 1 47 64 NoteOff 0.208333 2 55 64 NoteOff 0 1 47 64 // Measure number 19 =60 NoteOn 0 1 48 64 NoteOn 0 2 56 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 50 64 NoteOff 0.208333 2 56 64 NoteOff 0 1 50 64 NoteOn 0 1 51 64 NoteOn 0 2 65 64 NoteOn 0 3 69 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 69 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 67 64 NoteOn 0 2 65 64 NoteOn 0 3 69 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 45 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 69 64 NoteOff 0 1 45 64 NoteOn 0 1 46 64 NoteOn 0 2 57 64 NoteOff 0.208333 1 46 64 NoteOn 0 1 48 64 NoteOff 0.208333 2 57 64 NoteOff 0 1 48 64 NoteOn 0 1 50 64 NoteOn 0 2 58 64 NoteOff 0.208333 1 50 64 NoteOn 0 1 51 64 NoteOff 0.208333 2 58 64 NoteOff 0 1 51 64 NoteOn 0 1 53 64 NoteOn 0 2 67 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 71 64 NoteOn 0 2 65 64 NoteOn 0 3 69 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 69 64 NoteOn 0 2 67 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 53 64 NoteOn 0 1 47 64 NoteOff 0.208333 2 67 64 NoteOff 0 3 71 64 NoteOff 0 1 47 64 NoteOn 0 1 48 64 NoteOn 0 2 59 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 50 64 NoteOff 0.208333 2 59 64 NoteOff 0 1 50 64 // Measure number 20 =63.3333 NoteOn 0 1 51 64 NoteOn 0 2 60 64 NoteOff 0.208333 2 60 64 NoteOn 0 2 65 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 65 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 72 64 NoteOn 0 2 62 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 71 64 NoteOn 0 2 60 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 60 64 NoteOn 0 2 58 64 NoteOff 0.208333 3 72 64 NoteOff 0 2 58 64 NoteOn 0 1 52 64 NoteOn 0 2 56 64 NoteOn 0 3 67 64 NoteOff 0.208333 2 56 64 NoteOn 0 2 55 64 NoteOff 0.208333 1 52 64 NoteOff 0 3 67 64 NoteOff 0 2 55 64 NoteOn 0 1 53 64 NoteOn 0 2 53 64 NoteOn 0 3 68 64 NoteOff 0.416667 1 53 64 NoteOff 0 2 53 64 NoteOff 0 3 68 64 NoteOn 0 1 41 64 NoteOn 0 2 68 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 41 64 NoteOff 0 2 68 64 NoteOff 0 3 71 64 NoteOn 0 1 39 64 NoteOn 0 2 67 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 39 64 NoteOff 0 2 67 64 NoteOff 0 3 72 64 NoteOn 0 1 38 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.416667 1 38 64 NoteOff 0 2 65 64 NoteOff 0 3 74 64 // Measure number 21 =66.6667 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.416667 2 63 64 NoteOff 0 3 67 64 NoteOn 0 1 44 64 NoteOn 0 2 62 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 44 64 NoteOff 0 2 62 64 NoteOff 0 3 71 64 NoteOn 0 1 43 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 43 64 NoteOff 0 2 63 64 NoteOff 0 3 72 64 NoteOn 0 1 41 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.416667 1 41 64 NoteOff 0 2 65 64 NoteOff 0 3 74 64 NoteOn 0 1 43 64 NoteOn 0 2 59 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 43 64 NoteOff 0 2 59 64 NoteOff 0 3 67 64 NoteOn 0 1 41 64 NoteOn 0 2 60 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 41 64 NoteOn 0 1 39 64 NoteOff 0.208333 2 60 64 NoteOff 0 1 39 64 NoteOn 0 1 41 64 NoteOn 0 2 62 64 NoteOff 0.416667 3 68 64 NoteOff 0 1 41 64 NoteOff 0 2 62 64 NoteOn 0 1 43 64 NoteOn 0 2 59 64 NoteOn 0 3 67 64 NoteOff 0.208333 3 67 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 43 64 NoteOff 0 2 59 64 NoteOff 0 3 65 64 // Measure number 22 =70 NoteOn 0 1 48 64 NoteOn 0 2 60 64 NoteOn 0 3 63 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 50 64 NoteOff 0.208333 3 63 64 NoteOff 0 1 50 64 NoteOn 0 1 51 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 51 64 NoteOff 0 3 72 64 NoteOn 0 1 50 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 60 64 NoteOff 0 1 50 64 NoteOff 0 3 71 64 NoteOn 0 1 48 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 46 64 NoteOff 0.208333 3 72 64 NoteOff 0 1 46 64 NoteOn 0 1 44 64 NoteOn 0 2 64 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 44 64 NoteOn 0 1 43 64 NoteOff 0.208333 2 64 64 NoteOff 0 3 67 64 NoteOff 0 1 43 64 NoteOn 0 1 41 64 NoteOn 0 2 65 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 41 64 NoteOn 0 1 58 64 NoteOff 0.208333 2 65 64 NoteOff 0 1 58 64 NoteOn 0 1 56 64 NoteOn 0 2 65 64 NoteOff 0.208333 1 56 64 NoteOff 0 2 65 64 NoteOn 0 1 55 64 NoteOn 0 2 64 64 NoteOff 0.208333 3 68 64 NoteOff 0 1 55 64 NoteOff 0 2 64 64 NoteOn 0 1 53 64 NoteOn 0 2 65 64 NoteOff 0.208333 1 53 64 NoteOn 0 1 51 64 NoteOff 0.208333 2 65 64 NoteOff 0 1 51 64 NoteOn 0 1 50 64 NoteOn 0 2 60 64 NoteOn 0 3 69 64 NoteOff 0.208333 1 50 64 NoteOn 0 1 48 64 NoteOff 0.208333 2 60 64 NoteOff 0 3 69 64 NoteOff 0 1 48 64 // Measure number 23 =73.3333 NoteOn 0 1 46 64 NoteOn 0 2 62 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 46 64 NoteOn 0 1 48 64 NoteOff 0.208333 3 70 64 NoteOff 0 1 48 64 NoteOn 0 1 50 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 50 64 NoteOff 0 3 70 64 NoteOn 0 1 48 64 NoteOn 0 3 69 64 NoteOff 0.208333 2 62 64 NoteOff 0 1 48 64 NoteOff 0 3 69 64 NoteOn 0 1 46 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 46 64 NoteOn 0 1 44 64 NoteOff 0.208333 3 70 64 NoteOff 0 1 44 64 NoteOn 0 1 43 64 NoteOn 0 2 62 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 43 64 NoteOn 0 1 41 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 65 64 NoteOff 0 1 41 64 NoteOn 0 1 39 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 39 64 NoteOn 0 1 56 64 NoteOff 0.208333 2 63 64 NoteOff 0 1 56 64 NoteOn 0 1 55 64 NoteOn 0 2 63 64 NoteOff 0.208333 1 55 64 NoteOff 0 2 63 64 NoteOn 0 1 53 64 NoteOn 0 2 62 64 NoteOff 0.208333 3 67 64 NoteOff 0 1 53 64 NoteOff 0 2 62 64 NoteOn 0 1 51 64 NoteOn 0 2 63 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 50 64 NoteOff 0.208333 2 63 64 NoteOff 0 1 50 64 NoteOn 0 1 48 64 NoteOn 0 2 58 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 46 64 NoteOff 0.208333 2 58 64 NoteOff 0 1 46 64 // Measure number 24 =76.6667 NoteOn 0 1 44 64 NoteOn 0 2 60 64 NoteOff 0.208333 1 44 64 NoteOn 0 1 46 64 NoteOff 0.208333 3 67 64 NoteOff 0 1 46 64 NoteOn 0 1 48 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 48 64 NoteOff 0 3 68 64 NoteOn 0 1 46 64 NoteOn 0 3 70 64 NoteOff 0.208333 1 46 64 NoteOff 0 3 70 64 NoteOn 0 1 44 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 44 64 NoteOff 0 3 72 64 NoteOn 0 1 43 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 43 64 NoteOff 0 3 71 64 NoteOn 0 1 41 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 41 64 NoteOff 0 3 72 64 NoteOn 0 1 39 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 39 64 NoteOff 0 3 68 64 NoteOn 0 1 38 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 38 64 NoteOn 0 1 55 64 NoteOff 0.208333 2 60 64 NoteOff 0 1 55 64 NoteOn 0 1 53 64 NoteOn 0 2 62 64 NoteOff 0.208333 1 53 64 NoteOff 0 2 62 64 NoteOn 0 1 51 64 NoteOn 0 2 63 64 NoteOff 0.208333 1 51 64 NoteOff 0 2 63 64 NoteOn 0 1 50 64 NoteOn 0 2 65 64 NoteOff 0.208333 1 50 64 NoteOff 0 2 65 64 NoteOn 0 1 48 64 NoteOn 0 2 63 64 NoteOff 0.208333 1 48 64 NoteOff 0 2 63 64 NoteOn 0 1 47 64 NoteOn 0 2 65 64 NoteOff 0.208333 1 47 64 NoteOff 0 2 65 64 NoteOn 0 1 45 64 NoteOn 0 2 62 64 NoteOff 0.208333 1 45 64 NoteOff 0 2 62 64 // Measure number 25 =80 NoteOn 0 1 43 64 NoteOn 0 2 59 64 NoteOff 0.416667 3 65 64 NoteOff 0 2 59 64 NoteOn 0 3 74 64 NoteOff 0.208333 3 74 64 NoteOn 0 3 72 64 NoteOff 0.208333 1 43 64 NoteOff 0 3 72 64 NoteOn 0 3 74 64 NoteOff 0.416667 3 74 64 NoteOn 0 2 59 64 NoteOn 0 3 65 64 NoteOff 0.416667 2 59 64 NoteOff 0 3 65 64 NoteOn 0 2 60 64 NoteOn 0 3 63 64 NoteOn 0.208333 1 43 64 NoteOff 0.208333 2 60 64 NoteOff 0 3 63 64 NoteOff 0 1 43 64 NoteOn 0 1 45 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 45 64 NoteOff 0 3 75 64 NoteOn 0 1 47 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 47 64 NoteOff 0 3 74 64 NoteOn 0 1 48 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 50 64 NoteOff 0.208333 3 75 64 NoteOff 0 1 50 64 NoteOn 0 1 51 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 51 64 NoteOn 0 1 53 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 67 64 NoteOff 0 1 53 64 // Measure number 26 =83.3333 NoteOn 0 1 55 64 NoteOn 0 2 62 64 NoteOn 0 3 65 64 NoteOff 0.208333 1 55 64 NoteOn 0 1 53 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 65 64 NoteOff 0 1 53 64 NoteOn 0 1 56 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 56 64 NoteOff 0 3 77 64 NoteOn 0 1 55 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 55 64 NoteOff 0 3 75 64 NoteOn 0 1 53 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 53 64 NoteOn 0 1 51 64 NoteOff 0.208333 3 77 64 NoteOff 0 1 51 64 NoteOn 0 1 50 64 NoteOn 0 2 65 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 50 64 NoteOn 0 1 48 64 NoteOff 0.208333 3 68 64 NoteOff 0 1 48 64 NoteOn 0 1 47 64 NoteOn 0 3 67 64 NoteOff 0.208333 3 67 64 NoteOn 0 3 77 64 NoteOff 0.208333 2 65 64 NoteOff 0 1 47 64 NoteOff 0 3 77 64 NoteOn 0 1 48 64 NoteOn 0 3 75 64 NoteOff 0.208333 1 48 64 NoteOff 0 3 75 64 NoteOn 0 1 47 64 NoteOn 0 3 74 64 NoteOff 0.208333 1 47 64 NoteOff 0 3 74 64 NoteOn 0 1 48 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 71 64 NoteOff 0.208333 1 48 64 NoteOff 0 3 71 64 NoteOn 0 1 43 64 NoteOn 0 2 65 64 NoteOn 0 3 69 64 NoteOff 0.208333 3 69 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 43 64 NoteOff 0 2 65 64 NoteOff 0 3 67 64 // Measure number 27 =86.6667 NoteOn 0 1 44 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.416667 1 44 64 NoteOff 0 2 63 64 NoteOff 0 3 72 64 NoteOn 0 1 48 64 NoteOn 0 2 68 64 NoteOn 0 3 77 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 47 64 NoteOff 0.208333 2 68 64 NoteOff 0 3 77 64 NoteOff 0 1 47 64 NoteOn 0 1 48 64 NoteOn 0 2 67 64 NoteOn 0 3 75 64 NoteOff 0.416667 1 48 64 NoteOff 0 2 67 64 NoteOff 0 3 75 64 NoteOn 0 1 50 64 NoteOn 0 2 65 64 NoteOn 0 3 74 64 NoteOff 0.416667 1 50 64 NoteOff 0 2 65 64 NoteOff 0 3 74 64 NoteOn 0 1 43 64 NoteOn 0 2 63 64 NoteOff 0.416667 1 43 64 NoteOff 0 2 63 64 NoteOn 0 1 48 64 NoteOn 0 2 62 64 NoteOn 0 3 68 64 NoteOff 0.208333 1 48 64 NoteOn 0 1 47 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 68 64 NoteOff 0 1 47 64 NoteOn 0 1 48 64 NoteOn 0 2 63 64 NoteOn 0 3 67 64 NoteOff 0.416667 1 48 64 NoteOff 0 2 63 64 NoteOff 0 3 67 64 NoteOn 0 1 50 64 NoteOn 0 2 65 64 NoteOn 0 3 65 64 NoteOff 0.416667 1 50 64 NoteOff 0 2 65 64 NoteOff 0 3 65 64 // Measure number 28 =90 NoteOn 0 1 41 64 NoteOn 0 2 59 64 NoteOn 0 3 67 64 NoteOff 0.208333 1 41 64 NoteOn 0 1 43 64 NoteOff 0.208333 2 59 64 NoteOff 0 3 67 64 NoteOff 0 1 43 64 NoteOn 0 1 44 64 NoteOn 0 2 60 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 3 63 64 NoteOff 0.208333 2 60 64 NoteOff 0 3 63 64 NoteOn 0 2 62 64 NoteOn 0 3 65 64 NoteOff 0.416667 1 44 64 NoteOff 0 2 62 64 NoteOff 0 3 65 64 NoteOn 0 1 43 64 NoteOn 0 2 59 64 NoteOn 0 3 62 64 NoteOff 0.208333 1 43 64 NoteOn 0 1 41 64 NoteOff 0.208333 2 59 64 NoteOff 0 3 62 64 NoteOff 0 1 41 64 NoteOn 0 1 39 64 NoteOn 0 2 59 64 NoteOn 0 3 68 64 NoteOff 0.416667 2 59 64 NoteOff 0 3 68 64 NoteOn 0 2 60 64 NoteOn 0 3 67 64 NoteOff 0.416667 1 39 64 NoteOff 0 2 60 64 NoteOff 0 3 67 64 NoteOn 0.416667 1 51 64 NoteOn 0 2 60 64 NoteOn 0 3 69 64 NoteOff 0.416667 1 51 64 NoteOff 0 2 60 64 NoteOff 0 3 69 64 // Measure number 29 =93.3333 NoteOn 0 1 50 64 NoteOn 0 2 65 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 65 64 NoteOn 0 2 62 64 NoteOff 0.208333 1 50 64 NoteOff 0 3 71 64 NoteOff 0 2 62 64 NoteOn 0 1 48 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 63 64 NoteOn 0 2 60 64 NoteOff 0.208333 1 48 64 NoteOff 0 3 72 64 NoteOn 0 1 55 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 3 63 64 NoteOff 0.208333 2 60 64 NoteOff 0 1 55 64 NoteOff 0 3 63 64 NoteOn 0 1 43 64 NoteOn 0 2 59 64 NoteOn 0 3 62 64 NoteOff 0.208333 3 62 64 NoteOn 0 3 60 64 NoteOff 0.208333 1 43 64 NoteOff 0 2 59 64 NoteOff 0 3 60 64 NoteOn 0 1 36 64 NoteOn 0 1 48 64 NoteOn 0 2 60 64 NoteOn 0 3 60 64 NoteOff 0.416667 3 60 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 60 64 NoteOff 0 3 71 64 NoteOn 0 3 72 64 NoteOff 0.416667 3 72 64 NoteOn 0 2 64 64 NoteOn 0 3 67 64 NoteOff 0.416667 1 48 64 NoteOff 0 2 64 64 NoteOff 0 3 67 64 // Measure number 30 =96.6667 NoteOn 0 2 65 64 NoteOn 0 3 68 64 NoteOff 0.416667 3 68 64 NoteOn 0 3 72 64 NoteOff 0.208333 3 72 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 65 64 NoteOff 0 3 71 64 NoteOn 0 3 72 64 NoteOff 0.416667 3 72 64 NoteOn 0 2 65 64 NoteOn 0 2 68 64 NoteOn 0 3 71 64 NoteOn 0 3 74 64 NoteOff 0.416667 2 65 64 NoteOff 0 2 68 64 NoteOff 0 3 71 64 NoteOff 0 3 74 64 NoteOn 0 2 65 64 NoteOn 0 3 67 64 NoteOff 0.416667 2 65 64 NoteOff 0 3 67 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.208333 2 63 64 NoteOff 0 3 72 64 NoteOn 0 2 62 64 NoteOn 0 3 71 64 NoteOff 0.208333 2 62 64 NoteOff 0 3 71 64 NoteOn 0 2 63 64 NoteOn 0 3 72 64 NoteOff 0.416667 2 63 64 NoteOff 0 3 72 64 NoteOn 0 2 65 64 NoteOn 0 2 68 64 NoteOn 0 3 74 64 NoteOff 0.416667 2 65 64 NoteOff 0 2 68 64 NoteOff 0 3 74 64 // Measure number 31 =100 NoteOn 0 2 59 64 NoteOn 0 2 62 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 3 67 64 NoteOff 0.208333 2 59 64 NoteOff 0 2 62 64 NoteOff 0 3 67 64 NoteOn 0 3 68 64 NoteOn 0.416667 2 59 64 NoteOn 0 2 62 64 NoteOff 0.416667 3 68 64 NoteOff 0 2 59 64 NoteOff 0 2 62 64 NoteOn 0 3 67 64 NoteOff 0.208333 3 67 64 NoteOn 0 3 65 64 NoteOff 0.208333 3 65 64 NoteOn 0 2 55 64 NoteOn 0 2 60 64 NoteOn 0 3 64 64 NoteOff 1.66667 1 36 64 NoteOff 0 2 55 64 NoteOff 0 2 60 64 NoteOff 0 3 64 64 // Measure =103.333 ///CDT: 1685/3/-1750/7/28 ///OCY: Deutschland ///PPP: Coethen; Cothen; Co2then ///ODT: <1722// ///PDT: 1722 ///AFR: fuga; fugue ///AST: polyphony ///AMT: simple quadruple ///SCA: Bach-Werke-Verzeichnis ///YOR: Bach Gesellschaft ///SMS: British Library, various ///AIN: cemba; clavi ///EEV: 1.0 ///RDT: 1986 November 14 ///YER: 1994 August 10 ///EFL: 2/48 ///VTS: 1035528445 stk-4.5.0/projects/examples/scores/bookert.ski0000644000076600007660000000703512327014024017262 0ustar gary/* Howdy!! SKINI File, Perry Cook */ NoteOn 0.000000 1 60 114.299997 NoteOff 0.380000 1 60 63.500000 NoteOn 0.020000 1 60 101.600002 NoteOff 0.100000 1 60 63.500000 NoteOn 0.100000 1 48 63.500000 NoteOff 0.200000 1 48 63.500000 NoteOn 0.200000 1 48 88.899998 NoteOff 0.190023 1 48 63.500000 NoteOn 0.010023 1 51 101.600002 NoteOff 0.570023 1 51 63.500000 NoteOn 0.030023 1 53 88.899998 NoteOff 0.570023 1 53 63.500000 NoteOn 0.030023 1 48 38.100002 NoteOff 0.300000 1 48 63.500000 NoteOn 0.300000 1 67 101.600002 NoteOff 0.570023 1 67 63.500000 NoteOn 0.030023 1 66 76.200003 NoteOff 0.190023 1 66 63.500000 NoteOn 0.010023 1 65 63.500000 NoteOff 0.190023 1 65 63.500000 NoteOn 0.010023 1 63 50.800001 NoteOff 0.190023 1 63 63.500000 NoteOn 0.010023 1 60 76.200003 NoteOff 0.380000 1 60 63.500000 NoteOn 0.020000 1 58 50.800001 NoteOff 0.190023 1 58 63.500000 NoteOn 0.010023 1 48 114.299997 NoteOff 0.380000 1 48 63.500000 NoteOn 0.020000 1 48 101.600002 NoteOff 0.100000 1 48 63.500000 NoteOn 0.100000 1 36 63.500000 NoteOff 0.200000 1 36 63.500000 NoteOn 0.200000 1 36 88.899998 NoteOff 0.190023 1 36 63.500000 NoteOn 0.010023 1 39 101.600002 NoteOff 0.570023 1 39 63.500000 NoteOn 0.030023 1 41 88.899998 NoteOff 0.570023 1 41 63.500000 NoteOn 0.030023 1 84 127.000000 NoteOff 0.475011 1 84 63.500000 NoteOn 0.025034 1 83 120.649998 NoteOff 0.066531 1 83 63.500000 NoteOn 0.003537 1 82 114.299997 NoteOff 0.057007 1 82 63.500000 NoteOn 0.003039 1 81 107.950003 NoteOff 0.047528 1 81 63.500000 NoteOn 0.002540 1 80 101.600002 NoteOff 0.047528 1 80 63.500000 NoteOn 0.002540 1 78 95.250000 NoteOff 0.038005 1 78 63.500000 NoteOn 0.002041 1 78 88.899998 NoteOff 0.028526 1 78 63.500000 NoteOn 0.001542 1 77 82.549997 NoteOff 0.019002 1 77 63.500000 NoteOn 0.001043 1 76 76.200003 NoteOff 0.019002 1 76 63.500000 NoteOn 0.001043 1 75 69.850002 NoteOff 0.019002 1 75 63.500000 NoteOn 0.001043 1 74 63.500000 NoteOff 0.019002 1 74 63.500000 NoteOn 0.001043 1 73 63.500000 NoteOff 0.028526 1 73 63.500000 NoteOn 0.001542 1 72 63.500000 NoteOff 0.019002 1 72 63.500000 NoteOn 0.001043 1 71 57.149998 NoteOff 0.028526 1 71 63.500000 NoteOn 0.001542 1 70 50.800001 NoteOff 0.038005 1 70 63.500000 NoteOn 0.002041 1 69 44.449999 NoteOff 0.047528 1 69 63.500000 NoteOn 0.002540 1 68 38.100002 NoteOff 0.057007 1 68 63.500000 NoteOn 0.003039 1 67 31.750000 NoteOff 0.057007 1 67 63.500000 NoteOn 0.003039 1 66 25.400000 NoteOff 0.057007 1 66 63.500000 NoteOn 0.003039 1 65 31.750000 NoteOff 0.066531 1 65 63.500000 NoteOn 0.003537 1 64 25.400000 NoteOff 0.076009 1 64 63.500000 NoteOn 0.004036 1 63 19.050001 NoteOff 0.085533 1 63 63.500000 NoteOn 0.004535 1 62 31.750000 NoteOff 0.095011 1 62 63.500000 NoteOn 0.005034 1 61 44.449999 NoteOff 0.104535 1 61 63.500000 ControlChange 0.005533 1 1 127.000000 NoteOn 0.000000 1 60 63.500000 NoteOff 1.500000 1 60 63.500000 stk-4.5.0/projects/examples/simple.tcl0000644000076600007660000000413712327014024015604 0ustar gary# A simple Tcl/Tk example script # Set initial control values set pitch 64.0 set press 64.0 # Configure main window wm title . "A Simple GUI" wm iconname . "simple" . config -bg black # Configure a "note-on" button frame .noteOn -bg black button .noteOn.on -text NoteOn -bg grey66 -command { noteOn $pitch $press } pack .noteOn.on -side left -padx 5 pack .noteOn # Configure sliders frame .slider -bg black scale .slider.pitch -from 0 -to 128 -length 200 \ -command {changePitch } -variable pitch \ -orient horizontal -label "MIDI Note Number" \ -tickinterval 32 -showvalue true -bg grey66 pack .slider.pitch -padx 10 -pady 10 pack .slider -side left # Bind an X windows "close" event with the Exit routine bind . +myExit proc myExit {} { global pitch outID puts [format "NoteOff 0.0 1 %f 127" $pitch ] flush stdout puts [format "ExitProgram"] flush stdout close stdout exit } proc noteOn {pitchVal pressVal} { puts [format "NoteOn 0.0 1 %f %f" $pitchVal $pressVal] flush stdout } proc changePitch {value} { puts [format "PitchChange 0.0 1 %.3f" $value] flush stdout } bind . {+ center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return } stk-4.5.0/projects/examples/sine.cpp0000644000076600007660000000445412327014024015253 0ustar gary/******************************************/ /* Example program to write N sine tones to an N channel soundfile. By default, the program will write an N channel WAV file. However, it is simple to change the file type argument in the FileWvOut constructor. By Gary P. Scavone, 2000 - 2002. */ /******************************************/ #include "SineWave.h" #include "FileWvOut.h" #include using namespace stk; void usage(void) { // Error function in case of incorrect command-line // argument specifications. std::cout << "\nuseage: sine N file time fs\n"; std::cout << " where N = number of channels (sines),\n"; std::cout << " file = the .wav file to create,\n"; std::cout << " time = the amount of time to record (in seconds),\n"; std::cout << " and fs = the sample rate (in Hz).\n\n"; exit( 0 ); } int main( int argc, char *argv[] ) { float base_freq = 220.0; int i; // Minimal command-line checking. if ( argc != 5 ) usage(); int channels = (int) atoi( argv[1] ); double time = atof( argv[3] ); double srate = atof( argv[4] ); // Create our object instances. FileWvOut output; SineWave **oscs = (SineWave **) malloc( channels * sizeof(SineWave *) ); for ( i=0; isetFrequency( base_freq + i*(45.0) ); long nFrames = (long) ( time * Stk::sampleRate() ); StkFrames frames( nFrames, channels ); // Open the soundfile for output. Other file format options // include: FILE_SND, FILE_AIF, FILE_MAT, and FILE_RAW. Other data // type options include: STK_SINT8, STK_INT24, STK_SINT32, // STK_FLOAT32, and STK_FLOAT64. try { output.openFile( argv[2], channels, FileWrite::FILE_WAV, Stk::STK_SINT16 ); } catch ( StkError & ) { goto cleanup; } // Here's the runtime code ... no loop for ( i=0; itick( frames, i ); output.tick( frames ); cleanup: for ( i=0; i # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=sine - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "sine.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "sine.mak" CFG="sine - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "sine - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "sine - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "sine - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /D "__WINDOWS_DS__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "sine - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "sine___Win32_Debug" # PROP BASE Intermediate_Dir "sine___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /D "__WINDOWS_DS__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "sine - Win32 Release" # Name "sine - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\FileWrite.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvOut.cpp # End Source File # Begin Source File SOURCE=.\sine.cpp # End Source File # Begin Source File SOURCE=..\..\src\SineWave.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\FileWrite.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # Begin Source File SOURCE=..\..\include\FileWvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/sineosc.cpp0000644000076600007660000000173012327014024015752 0ustar gary// sineosc.cpp STK tutorial program #include "FileLoop.h" #include "FileWvOut.h" #include using namespace stk; int main() { // Set the global sample rate before creating class instances. Stk::setSampleRate( 44100.0 ); int nFrames = 100000; FileLoop input; FileWvOut output; try { // Load the sine wave file. input.openFile( "rawwaves/sinewave.raw", true ); // Open a 16-bit, one-channel WAV formatted output file output.openFile( "hellosine.wav", 1, FileWrite::FILE_WAV, Stk::STK_SINT16 ); } catch ( StkError & ) { exit( 1 ); } input.setFrequency( 440.0 ); // Option 1: Use StkFrames /* StkFrames frames( nFrames, 1 ); try { output.tick( input.tick( frames ) ); } catch ( StkError & ) { exit( 1 ); } */ // Option 2: Single-sample computations for ( int i=0; i # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=sineosc - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "sineosc.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "sineosc.mak" CFG="sineosc - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "sineosc - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "sineosc - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "sineosc - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /D "__WINDOWS_DS__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "sineosc - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "sineosc___Win32_Debug" # PROP BASE Intermediate_Dir "sineosc___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 2 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "_AFXDLL" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /D "__WINDOWS_DS__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "sineosc - Win32 Release" # Name "sineosc - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWrite.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvOut.cpp # End Source File # Begin Source File SOURCE=.\sineosc.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileLoop.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\Generator.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\FileRead.h # End Source File # Begin Source File SOURCE=..\..\include\FileWrite.h # End Source File # Begin Source File SOURCE=..\..\include\FileLoop.h # End Source File # Begin Source File SOURCE=..\..\include\FileWvOut.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/examples/threebees.cpp0000644000076600007660000001062012327014024016253 0ustar gary// threebees.cpp STK tutorial program #include "BeeThree.h" #include "RtAudio.h" #include "Messager.h" #include "Voicer.h" #include "SKINI.msg" #include using std::min; using namespace stk; // The TickData structure holds all the class instances and data that // are shared by the various processing functions. struct TickData { Voicer voicer; Messager messager; Skini::Message message; int counter; bool haveMessage; bool done; // Default constructor. TickData() : counter(0), haveMessage(false), done( false ) {} }; #define DELTA_CONTROL_TICKS 64 // default sample frames between control input checks // The processMessage() function encapsulates the handling of control // messages. It can be easily relocated within a program structure // depending on the desired scheduling scheme. void processMessage( TickData* data ) { register StkFloat value1 = data->message.floatValues[0]; register StkFloat value2 = data->message.floatValues[1]; switch( data->message.type ) { case __SK_Exit_: data->done = true; return; case __SK_NoteOn_: if ( value2 == 0.0 ) // velocity is zero ... really a NoteOff data->voicer.noteOff( value1, 64.0 ); else { // a NoteOn data->voicer.noteOn( value1, value2 ); } break; case __SK_NoteOff_: data->voicer.noteOff( value1, value2 ); break; case __SK_ControlChange_: data->voicer.controlChange( (int) value1, value2 ); break; case __SK_AfterTouch_: data->voicer.controlChange( 128, value1 ); case __SK_PitchChange_: data->voicer.setFrequency( value1 ); break; case __SK_PitchBend_: data->voicer.pitchBend( value1 ); } // end of switch data->haveMessage = false; return; } // This tick() function handles sample computation and scheduling of // control updates. It will be called automatically when the system // needs a new buffer of audio samples. int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *dataPointer ) { TickData *data = (TickData *) dataPointer; register StkFloat *samples = (StkFloat *) outputBuffer; int counter, nTicks = (int) nBufferFrames; while ( nTicks > 0 && !data->done ) { if ( !data->haveMessage ) { data->messager.popMessage( data->message ); if ( data->message.type > 0 ) { data->counter = (long) (data->message.time * Stk::sampleRate()); data->haveMessage = true; } else data->counter = DELTA_CONTROL_TICKS; } counter = min( nTicks, data->counter ); data->counter -= counter; for ( int i=0; ivoicer.tick(); nTicks--; } if ( nTicks == 0 ) break; // Process control messages. if ( data->haveMessage ) processMessage( data ); } return 0; } int main() { // Set the global sample rate and rawwave path before creating class instances. Stk::setSampleRate( 44100.0 ); Stk::setRawwavePath( "../../rawwaves/" ); int i; TickData data; RtAudio dac; Instrmnt *instrument[3]; for ( i=0; i<3; i++ ) instrument[i] = 0; // Figure out how many bytes in an StkFloat and setup the RtAudio stream. RtAudio::StreamParameters parameters; parameters.deviceId = dac.getDefaultOutputDevice(); parameters.nChannels = 1; RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32; unsigned int bufferFrames = RT_BUFFER_SIZE; try { dac.openStream( ¶meters, NULL, format, (unsigned int)Stk::sampleRate(), &bufferFrames, &tick, (void *)&data ); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } try { // Define and load the BeeThree instruments for ( i=0; i<3; i++ ) instrument[i] = new BeeThree(); } catch ( StkError & ) { goto cleanup; } // "Add" the instruments to the voicer. for ( i=0; i<3; i++ ) data.voicer.addInstrument( instrument[i] ); if ( data.messager.startStdInput() == false ) goto cleanup; try { dac.startStream(); } catch ( RtAudioError &error ) { error.printMessage(); goto cleanup; } // Block waiting until callback signals done. while ( !data.done ) Stk::sleep( 100 ); // Shut down the callback and output stream. try { dac.closeStream(); } catch ( RtAudioError &error ) { error.printMessage(); } cleanup: for ( i=0; i<3; i++ ) delete instrument[i]; return 0; } stk-4.5.0/projects/examples/threebees.dsp0000755000076600007660000001612112327014024016264 0ustar gary# Microsoft Developer Studio Project File - Name="threebees" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=threebees - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "threebees.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "threebees.mak" CFG="threebees - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "threebees - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "threebees - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "threebees - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "threebees___Win32_Release" # PROP BASE Intermediate_Dir "threebees___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/include" /D "NDEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib winmm.lib dsound.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "threebees - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "threebees___Win32_Debug" # PROP BASE Intermediate_Dir "threebees___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../../src/include" /D "_DEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib winmm.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "threebees - Win32 Release" # Name "threebees - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\ADSR.cpp # End Source File # Begin Source File SOURCE=..\..\src\BeeThree.cpp # End Source File # Begin Source File SOURCE=..\..\src\Envelope.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\src\FM.cpp # End Source File # Begin Source File SOURCE=..\..\src\Messager.cpp # End Source File # Begin Source File SOURCE=..\..\src\Mutex.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtMidi.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtWvOut.cpp # End Source File # Begin Source File SOURCE=..\..\src\SineWave.cpp # End Source File # Begin Source File SOURCE=..\..\src\SKINI.cpp # End Source File # Begin Source File SOURCE=..\..\src\Socket.cpp # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # Begin Source File SOURCE=..\..\src\TcpServer.cpp # End Source File # Begin Source File SOURCE=..\..\src\Thread.cpp # End Source File # Begin Source File SOURCE=.\threebees.cpp # End Source File # Begin Source File SOURCE=..\..\src\TwoZero.cpp # End Source File # Begin Source File SOURCE=..\..\src\Voicer.cpp # End Source File # Begin Source File SOURCE=..\..\src\FileLoop.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\ADSR.h # End Source File # Begin Source File SOURCE=..\..\include\BeeThree.h # End Source File # Begin Source File SOURCE=..\..\include\Envelope.h # End Source File # Begin Source File SOURCE=..\..\include\Filter.h # End Source File # Begin Source File SOURCE=..\..\include\FM.h # End Source File # Begin Source File SOURCE=..\..\include\Instrmnt.h # End Source File # Begin Source File SOURCE=..\..\include\Messager.h # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\include\RtMidi.h # End Source File # Begin Source File SOURCE=..\..\include\RtWvOut.h # End Source File # Begin Source File SOURCE=..\..\include\SKINI.h # End Source File # Begin Source File SOURCE=..\..\include\Socket.h # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=..\..\include\Thread.h # End Source File # Begin Source File SOURCE=..\..\include\TwoZero.h # End Source File # Begin Source File SOURCE=..\..\include\Voicer.h # End Source File # Begin Source File SOURCE=..\..\include\FileLoop.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project stk-4.5.0/projects/ragamatic/0000755000076600007660000000000012327014024013714 5ustar garystk-4.5.0/projects/ragamatic/Drone.cpp0000644000076600007660000000411312327014024015466 0ustar gary/***************************************************/ /*! \class Drone \brief STK "drone" plucked string model. This class implements a simple plucked string physical model based on the Karplus-Strong algorithm. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. There exist at least two patents, assigned to Stanford, bearing the names of Karplus and/or Strong. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Drone.h" #include namespace stk { Drone :: Drone( StkFloat lowestFrequency ) { if ( lowestFrequency <= 0.0 ) { oStream_ << "Drone::Drone: argument is less than or equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } unsigned long delays = (unsigned long) ( Stk::sampleRate() / lowestFrequency ); delayLine_.setMaximumDelay( delays + 1 ); this->setFrequency( 220.0 ); envelope_.setAllTimes( 2.0, 0.5, 0.0, 0.5 ); this->clear(); } Drone :: ~Drone( void ) { } void Drone :: clear( void ) { delayLine_.clear(); loopFilter_.clear(); } void Drone :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Drone::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif // Delay = length - approximate filter delay. StkFloat delay = (Stk::sampleRate() / frequency) - 0.5; delayLine_.setDelay( delay ); loopGain_ = 0.997 + (frequency * 0.000002); if ( loopGain_ >= 1.0 ) loopGain_ = 0.99999; } void Drone :: pluck( StkFloat amplitude ) { envelope_.keyOn(); } void Drone :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); this->pluck( amplitude ); } void Drone :: noteOff( StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "Plucked::noteOff: amplitude is out of range!"; handleError( StkError::WARNING ); return; } loopGain_ = 1.0 - amplitude; } } // stk namespace stk-4.5.0/projects/ragamatic/Drone.h0000644000076600007660000000626712327014024015147 0ustar gary#ifndef STK_DRONE_H #define STK_DRONE_H #include "Instrmnt.h" #include "DelayA.h" #include "OneZero.h" #include "ADSR.h" #include "Noise.h" namespace stk { /***************************************************/ /*! \class Drone \brief STK "drone" plucked string model. This class implements a simple plucked string physical model based on the Karplus-Strong algorithm. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. There exist at least two patents, assigned to Stanford, bearing the names of Karplus and/or Strong. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ class Drone : public Instrmnt { public: //! Class constructor, taking the lowest desired playing frequency. Drone( StkFloat lowestFrequency = 20 ); //! Class destructor. ~Drone( void ); //! Reset and clear all internal state. void clear( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Pluck the string with the given amplitude using the current frequency. void pluck( StkFloat amplitude ); //! Start a note with the given frequency and amplitude. void noteOn( StkFloat frequency, StkFloat amplitude ); //! Stop a note with the given amplitude (speed of decay). void noteOff( StkFloat amplitude ); //! Compute and return one output sample. StkFloat tick( unsigned int channel = 0 ); //! Fill a channel of the StkFrames object with computed outputs. /*! The \c channel argument must be less than the number of channels in the StkFrames argument (the first channel is specified by 0). However, range checking is only performed if _STK_DEBUG_ is defined during compilation, in which case an out-of-range value will trigger an StkError exception. */ StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ); protected: DelayA delayLine_; OneZero loopFilter_; ADSR envelope_; Noise noise_; StkFloat loopGain_; unsigned long length_; }; inline StkFloat Drone :: tick( unsigned int ) { // Here's the whole inner loop of the instrument!! lastFrame_[0] = delayLine_.tick( loopFilter_.tick( delayLine_.lastOut() * loopGain_ ) + ( 0.005 * envelope_.tick() * noise_.tick() ) ); return lastFrame_[0]; } inline StkFrames& Drone :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Drone::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i #include #include #include #include using std::min; using namespace stk; StkFloat float_random(StkFloat max) // Return random float between 0.0 and max { StkFloat temp = (StkFloat) (max * rand() / (RAND_MAX + 1.0) ); return temp; } void usage(void) { // Error function in case of incorrect command-line argument specifications. std::cout << "\nuseage: ragamat flags \n"; std::cout << " where flag = -s RATE to specify a sample rate,\n"; std::cout << " flag = -ip for realtime SKINI input by pipe\n"; std::cout << " (won't work under Win95/98),\n"; std::cout << " and flag = -is for realtime SKINI input by socket.\n"; exit(0); } bool done; static void finish(int ignore){ done = true; } // The TickData structure holds all the class instances and data that // are shared by the various processing functions. struct TickData { JCRev reverbs[2]; Drone drones[3]; Sitar sitar; VoicDrum voicDrums; Tabla tabla; Messager messager; Skini::Message message; StkFloat lastSample; StkFloat t60; int counter; bool settling; bool haveMessage; StkFloat droneChance, noteChance; StkFloat drumChance, voiceChance; int tempo; int chanceCounter; int key; int ragaStep; int ragaPoint; int endPhase; StkFloat rateScaler; // Default constructor. TickData() : t60(4.0), counter(0), settling( false ), haveMessage( false ), droneChance(0.01), noteChance(0.01), drumChance(0.0), voiceChance(0.0), tempo(3000), chanceCounter(3000), key(0), ragaPoint(6), endPhase(0) {} }; // Raga key numbers and drone frequencies. const int ragaUp[2][13] = {{57, 60, 62, 64, 65, 68, 69, 71, 72, 76, 77, 81}, {52, 54, 55, 57, 59, 60, 63, 64, 66, 67, 71, 72}}; const int ragaDown[2][13] = {{57, 60, 62, 64, 65, 67, 69, 71, 72, 76, 79, 81}, {48, 52, 53, 55, 57, 59, 60, 64, 66, 68, 70, 72}}; StkFloat droneFreqs[3] = { 55.0, 82.5, 220.0 }; #define DELTA_CONTROL_TICKS 64 // default sample frames between control input checks // The processMessage() function encapsulates the handling of control // messages. It can be easily relocated within a program structure // depending on the desired scheduling scheme. void processMessage( TickData* data ) { register unsigned int value1 = data->message.intValues[0]; register StkFloat value2 = data->message.floatValues[1]; register StkFloat temp = value2 * ONE_OVER_128; switch( data->message.type ) { case __SK_Exit_: if ( data->settling == false ) goto settle; if ( data->endPhase < 5 ) return; done = true; return; case __SK_ControlChange_: switch ( value1 ) { case 1: data->droneChance = temp; break; case 2: data->noteChance = temp; break; case 4: data->voiceChance = temp; break; case 7: data->tempo = (int) (11025 - value2 * 70.0 ); break; case 11: data->drumChance = temp; break; case 64: if ( value2 == 0.0 ) { data->key = 1; droneFreqs[0] = 55.0; droneFreqs[1] = 82.5; droneFreqs[2] = 220.0; } else { data->key = 0; droneFreqs[0] = 82.5; droneFreqs[1] = 123.5; droneFreqs[2] = 330.0; } break; default: break; } } // end of type switch data->haveMessage = false; return; settle: // Exit and program change messages are preceeded with a short settling period. data->counter = (int) (data->t60 * Stk::sampleRate()); data->drones[1].noteOn( droneFreqs[1], 0.1 ); data->settling = true; std::cout << "What Need Have I for This?" << std::endl; } // The tick() function handles sample computation and scheduling of // control updates. It will be called automatically by RtAudio when // the system needs a new buffer of audio samples. int tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *dataPointer ) { TickData *data = (TickData *) dataPointer; register StkFloat temp, outs[2], *samples = (StkFloat *) outputBuffer; int i, voiceNote, counter, nTicks = (int) nBufferFrames; while ( nTicks > 0 && !done ) { if ( !data->haveMessage ) { data->messager.popMessage( data->message ); if ( data->message.type > 0 ) { data->counter = (long) (data->message.time * Stk::sampleRate()); data->haveMessage = true; } else data->counter = DELTA_CONTROL_TICKS; } counter = min( nTicks, data->counter ); data->counter -= counter; for ( i=0; ireverbs[0].tick( data->drones[0].tick() + data->drones[2].tick() + data->sitar.tick() ); outs[1] = data->reverbs[1].tick( 1.5 * data->drones[1].tick() + 0.5 * data->voicDrums.tick() + 0.5 * data->tabla.tick() ); // Mix a little left to right and back. *samples++ = outs[0] + 0.3 * outs[1]; *samples++ = outs[1] + 0.3 * outs[0]; nTicks--; // Do a bunch of random controls unless settling down to end. if ( data->settling ) { if ( data->counter == 0 ) { data->counter = (int) (data->t60 * Stk::sampleRate()); if ( data->endPhase == 0 ) { data->drones[2].noteOn( droneFreqs[2], 0.1 ); std::cout << "What Need Have I for This?" << std::endl; } else if ( data->endPhase == 1 ) { data->drones[0].noteOn( droneFreqs[0], 0.1 ); std::cout << "RagaMatic finished ... " << std::endl; } else if ( data->endPhase == 2 ) { std::cout << "All is Bliss ... " << std::endl; } else if ( data->endPhase == 3 ) { std::cout << "All is Bliss ..." << std::endl; } data->endPhase++; } } else { data->chanceCounter--; if (data->chanceCounter == 0) { data->chanceCounter = (int) ( data->tempo / data->rateScaler ); if ( float_random(1.0) < data->droneChance ) data->drones[0].noteOn( droneFreqs[0], 0.1 ); if ( float_random(1.0) < data->droneChance ) data->drones[1].noteOn( droneFreqs[1], 0.1 ); if ( float_random(1.0) < data->droneChance ) data->drones[2].noteOn( droneFreqs[2], 0.1 ); if ( float_random(1.0) < data->noteChance ) { temp = float_random(1.0); if ( temp < 0.1) data->ragaStep = 0; else if (temp < 0.5) data->ragaStep = 1; else data->ragaStep = -1; data->ragaPoint += data->ragaStep; if ( data->ragaPoint < 0 ) data->ragaPoint -= ( 2 * data->ragaStep ); if ( data->ragaPoint > 11 ) data->ragaPoint = 11; if ( data->ragaStep > 0 ) data->sitar.noteOn( Midi2Pitch[ragaUp[data->key][data->ragaPoint]], 0.05 + float_random(0.3) ); else data->sitar.noteOn( Midi2Pitch[ragaDown[data->key][data->ragaPoint]], 0.05 + float_random(0.3) ); } if ( float_random(1.0) < data->voiceChance ) { voiceNote = (int) float_random(11); data->voicDrums.noteOn( voiceNote, 0.3 + (0.4 * data->drumChance) + float_random(0.3 * data->voiceChance)); } if ( float_random(1.0) < data->drumChance ) { voiceNote = (int) float_random(TABLA_NUMWAVES); data->tabla.noteOn( voiceNote, 0.2 + (0.2 * data->drumChance) + float_random(0.6 * data->drumChance)); } } } } if ( nTicks == 0 ) break; // Process control messages. if ( data->haveMessage ) processMessage( data ); } return 0; } int main( int argc, char *argv[] ) { TickData data; RtAudio dac; int i; if ( argc < 2 || argc > 6 ) usage(); // If you want to change the default sample rate (set in Stk.h), do // it before instantiating any objects! If the sample rate is // specified in the command line, it will override this setting. Stk::setSampleRate( 44100.0 ); // Parse the command-line arguments. unsigned int port = 2001; for ( i=1; i # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=ragamatic - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ragamat.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ragamat.mak" CFG="ragamatic - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ragamatic - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "ragamatic - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "ragamatic - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib dsound.lib winmm.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "ragamatic - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "" # PROP Intermediate_Dir "debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_DS__" /D "__LITTLE_ENDIAN__" /D "__WINDOWS_MM__" /YX /FD /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib dsound.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "ragamatic - Win32 Release" # Name "ragamatic - Win32 Debug" # Begin Source File SOURCE=..\..\src\ADSR.cpp # End Source File # Begin Source File SOURCE=..\..\include\ADSR.h # End Source File # Begin Source File SOURCE=..\..\src\Delay.cpp # End Source File # Begin Source File SOURCE=..\..\include\Delay.h # End Source File # Begin Source File SOURCE=..\..\src\DelayA.cpp # End Source File # Begin Source File SOURCE=..\..\include\DelayA.h # End Source File # Begin Source File SOURCE=..\..\src\DelayL.cpp # End Source File # Begin Source File SOURCE=..\..\include\DelayL.h # End Source File # Begin Source File SOURCE=.\Drone.cpp # End Source File # Begin Source File SOURCE=.\Drone.h # End Source File # Begin Source File SOURCE=..\..\include\Effect.h # End Source File # Begin Source File SOURCE=..\..\src\Envelope.cpp # End Source File # Begin Source File SOURCE=..\..\include\Envelope.h # End Source File # Begin Source File SOURCE=..\..\src\FileRead.cpp # End Source File # Begin Source File SOURCE=..\..\include\FileRead.h # End Source File # Begin Source File SOURCE=..\..\src\FileWvIn.cpp # End Source File # Begin Source File SOURCE=..\..\include\FileWvIn.h # End Source File # Begin Source File SOURCE=..\..\include\Filter.h # End Source File # Begin Source File SOURCE=..\..\include\Generator.h # End Source File # Begin Source File SOURCE=..\..\include\Instrmnt.h # End Source File # Begin Source File SOURCE=..\..\src\JCRev.cpp # End Source File # Begin Source File SOURCE=..\..\include\JCRev.h # End Source File # Begin Source File SOURCE=..\..\src\Messager.cpp # End Source File # Begin Source File SOURCE=..\..\include\Messager.h # End Source File # Begin Source File SOURCE=..\..\src\Mutex.cpp # End Source File # Begin Source File SOURCE=..\..\include\Mutex.h # End Source File # Begin Source File SOURCE=..\..\src\Noise.cpp # End Source File # Begin Source File SOURCE=..\..\include\Noise.h # End Source File # Begin Source File SOURCE=..\..\src\OnePole.cpp # End Source File # Begin Source File SOURCE=..\..\include\OnePole.h # End Source File # Begin Source File SOURCE=..\..\src\OneZero.cpp # End Source File # Begin Source File SOURCE=..\..\include\OneZero.h # End Source File # Begin Source File SOURCE=.\ragamat.cpp # End Source File # Begin Source File SOURCE=..\..\src\RtAudio.cpp # End Source File # Begin Source File SOURCE=..\..\include\RtAudio.h # End Source File # Begin Source File SOURCE=..\..\src\RtMidi.cpp # End Source File # Begin Source File SOURCE=..\..\include\RtMidi.h # End Source File # Begin Source File SOURCE=..\..\src\Sitar.cpp # End Source File # Begin Source File SOURCE=..\..\include\Sitar.h # End Source File # Begin Source File SOURCE=..\..\src\SKINI.cpp # End Source File # Begin Source File SOURCE=..\..\include\SKINI.h # End Source File # Begin Source File SOURCE=..\..\src\Socket.cpp # End Source File # Begin Source File SOURCE=..\..\include\Socket.h # End Source File # Begin Source File SOURCE=..\..\src\Stk.cpp # End Source File # Begin Source File SOURCE=..\..\include\Stk.h # End Source File # Begin Source File SOURCE=.\Tabla.cpp # End Source File # Begin Source File SOURCE=.\Tabla.h # End Source File # Begin Source File SOURCE=..\..\src\TcpServer.cpp # End Source File # Begin Source File SOURCE=..\..\include\TcpServer.h # End Source File # Begin Source File SOURCE=..\..\src\Thread.cpp # End Source File # Begin Source File SOURCE=..\..\include\Thread.h # End Source File # Begin Source File SOURCE=.\VoicDrum.cpp # End Source File # Begin Source File SOURCE=.\VoicDrum.h # End Source File # Begin Source File SOURCE=..\..\src\FileLoop.cpp # End Source File # Begin Source File SOURCE=..\..\include\FileLoop.h # End Source File # Begin Source File SOURCE=..\..\include\WvIn.h # End Source File # Begin Source File SOURCE=..\..\include\WvOut.h # End Source File # End Target # End Project stk-4.5.0/projects/ragamatic/ragamatic.dsw0000644000076600007660000000103312327014024016360 0ustar garyMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "ragamatic"=.\ragamat.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### stk-4.5.0/projects/ragamatic/rawwaves/0000755000076600007660000000000012327014024015553 5ustar garystk-4.5.0/projects/ragamatic/rawwaves/bee1.raw0000644000076600007660000001014012327014024017076 0ustar garyýzýlýžþþ9ý÷ýÊýÏþýÿý¼ýûþ¶ÿþÊÿ ÿ ÿÐ.²vØ,»Î…"J…ªï;; õ³o\†›l5ý׺½˜mc‘é¾BÔÃõ®[àµdÿíÿœÿ„ÿyÿþjþHþYþUýÖý@ý"ýýxýýýtýàþ%ýÒý—ý°ýÒýUüðýFý”ýªýÑýýþþ8þ%ýöýòþ þ+þýÕýÎýÈþ þ.þþ%þ@þhþþrþKþ/þTþZþýªýÂý¶ýPüêüºü†ü(û®ûjû¡üü‰üâüàýzþBþÑÿÃ0E¾¶c=9³ " 6 = X d †G µû[Jr Úe_ äù’ÿŠâm-ÊY$ämÿåÿvþ÷þŸþCýèýÌýñýòý‰ý ýVý½ýêþþšÿÿ>ÿAÿ4ÿ$ÿ]ÿ´ÿ­ÿõÇþw#ÿüÿÿ8þ‰þ'þ"þýÑý$ü—ürüMûèûTû.û­ü+ü:ûÏû‚û§ûæüûØûÌû×üûÍûuü?ý üÇüqüÉý-þÿ™Æ‚žöUª¢ÿW '  "  Ï [ V À ² ç € ¿  › r ô΄ÄôìÃAÖë5ÿ›þsýJü¨üdügülü!ûûyû´û©ûFûûú÷û2ûŸü6üiüGü“ý üòý%ýšþ þŸÿ+ÿhÿ÷ —FqÞB6ÔÖí…ÛPÿƒþvý“üWûú^ù?÷Õöíö&õpõôƒôó³ó2ô3ö@÷#÷<øÆú±ü(þ!~ˆÄŒ› S Z Ï 6 ’ ÒO©8ÄgÙŒ7 Û & ® A à !9£‚”*Lþkü½ûâúyøŠøø ÷æ÷ÿ÷Ù÷ ÷ª÷FödõÔö`÷¢øÊúúýü~ýZýýôþ9ÿ>9¢*tÊUðäÏÿìÿÁÿdþRý1üoû"ùøÆ÷önõvôkó©óIò›ñ[ñKñ¬ò>ôËöôúõ™÷`ø„úóþb¿Êlì ° Á ¨  œM·8Ø®Ÿ·ÿ†Q ' ¤ ² ê 3ž”~þóýûõû#ùL÷†÷ö”õžöö6õÝöõˆõõÃöï÷¤ùsûøý‚ÿh\bY*À%ùEª%^´ÿÌþÐýâýü»û7ø[ö¦õyó_ñ{ðîií«íí£îRñ4ó'ðëðEñ€ñøó}öÉúsýËž 5 k« } ᒳƥ¨ía²g ± + ¤ y6¬ºaÿbý$û¨ù¼÷—õ‡ô½ôÞô{ô®õOõôVô+ôÊõPöïø‰úbý²=:çÞ¾ ò  ê … ± ô {»(·ø¤ÿüÓúT÷ºõéô¡ñôðñ›ò–óUñ²îÌïGð/ðÒòÙö9ùú}ü·þ²úmy|k — ª LŸ²xg Ñ I } ¸ R„t±ÿ—ýú÷ùdø+öÍõôö"õaôó=ñ¥ðÖðjð»ñó'ö:÷¹ùrûuü6ü’ýFÿxAÀJ³ Õ B ð R  Yïü3ÐŒ3Åáý‡ú(øöWõ ô³÷4÷üó}ñOñÏñòçõ=ööø™û…ý•þ¦æ’³( è Á F “C¹cÊ î <  >fìpªþñûlúòù§÷õCôDôEôŽô¬óÝò<ñúñãñËòšó›õ(öÝù<û¸ü}üÍýÐÿäW'› ÑÕÁµ– _Æ1KÿVý¶ûeùL÷9õó§ôÇö£ö%òð ðØðòö{ø±ú²ýþ¡ÿUˆIö.Œ  ó ¾ê¿>8 ¥ – \  ½ ¥ ,ÊýüÖúù’øç÷‡õ÷ó¼òtñ•ñðïï1îÀðñ7òðõ3÷M÷•øåü:ý‡ý×ÿ:™Õ{ É Ñ æ \ àþ…žÄ‹qÿÀüêù,õÂó¨ñæò”ö1ó|íËíãî'íkîÔñ òXô3÷Sù¬ý^ÿIþs¢ ˆ ) ¯ÁŸJÇ · × ƒ  1 ‰Jÿ©ý»ý3ûGøåöCõ²õNôdôñ6îî_ï½ðOñô õöÐùâûgûoüýÚÂTˆC ‘ ­ í O š 1 ì È @ƒ°\ÿãýmü·ü¦ûÁ÷£ó¶ô'õõi÷÷Ëö*öLø¾ù—úþü#û`üÏ ý¡½ - g c Å Â ä Ñ _ c  Š F !â†(¸ÿ²þWüiùöøU÷Iö$ô>ñÙððñó ó/óïõÑ÷Yøø—ù$û ýƒOÔh ² e  {· € _ m žaj‡þIÿªüëõªõäúúù‰üBúùø‡úÍúÏúöüÒþÿŽz7Äf   · §ä 8 ´Íæ Ÿ ¨ ½horp9üâüjüú·økôçò0ð¬ðÍñ¦ñÐò½óKôÑõEô¨ôÄõëøMûUýZÿ¨<"öNî ?¥¿"X3?”eªú)ø¦ûü9ý†þÕþæþ"þjþºýÐü¥ûý¸ÆqXÛ‡ í %ÿì¬  / Ö Ÿ  …*¸A~wûÿ:ý]ûYø÷1øøçøzø~ùTø×÷½öcö öò÷èøæùlûdýsþnÿ-ÿbþ±ýCüçþJýÚþHÿšÿïþþÏ·þgù:ø¡û@ýžÿ*ÿ!XK/ýÕ…Õl  $ ­fm-BY5\©« ’“ÿ.ÿŒ°ÿŒ5s|þ¦ýdü%ùQøÄùýúÑüWü­ýûÔû{ûúïû³ûûÍþHÿïí"w/ÿ›þPý1üêûËûxûžùôû)ýtùôõ\ø‡ø¯ù•û»û¿ýЀa1ì§}ï n þ  : f\šx™\÷ƽ¦'è þ±ÿrþ†þ¡ÿéÿÿ2þ7ü*û°üû{üÿý«ýÓýÒýýýÀþýDýOþ3þ"ÿÿËÿþžþ3üõü+û—ú,ù"ú ú®úbøüôéõvùùÚø{ùrûûü3üÝþ—ý ý­ýØÿ²ÃÇG8ìúáŽÒåèÕ‚”¡ƒþcIüÌJ |µ$‚žþÿÿ˜=þöÿe|çUKA6—þçþ}ÿ`ÿ ÿ¢`ÿIþ þ5þ”ü°ûû—úœú\ûûrúRù\û‡üŠû¬û…û÷ûýû9üüõü²üµüÆý´þJý¢üóü½ý ý©þoþÂþ8ÿQÿñÿþ‚þï ÑÓÑs1Ü¡üî~Hj+z9–‰RýŽ2^¬Å.1°¶ÿò "³3àKR„ÿÑÿóâî?+ÿYþ“þúþßý¤ýý&ü¤üüjüµüyüûWú¦úmúŒú•ú›úúnûûïûÈûÛü‡üiüüœý#ýoþ)þÒÿpSOâ¾ ª…«s<#b¥µ?k"Õ±»Œæ¦ìº…z¿·ÿªÿÆ!RV˜‚F„wÿ¿ÿ•ÿ¥ÿþkþ¢þ£þ7þýÁý.ü—üoü;ûUú¾úÚûû˜û[û½û›ûúõûúàúÇû`û„ûáüÇý@ý¯þþ?þ„þõÿþ´ÿm{ì/LýWbuðKb¬,®Zð(_žÍ4ŽE3ÿ¾ÿ"þúÿ þÉþœþ…þŸþ¬þEýìþ"þªþÙþÎÿÿ£ÿæS‘ØÌIo9ÿÃÿÿ‡ÿþ&ýtüæü–üBûÇû?úöûKû|ûGû*ûEúúúÝúâúÎúóû ûÔûÅü`ýEý³ýôþŽþþÿBÿgÿOÿ4ÿ]¶c=º>@Ò‰8ÿóÿü‡lžQv“J&rÖøôÍÄÍÕ¯YTQÿ÷ÿ·ÿ‡ÿ:þ§þbþ{þWýûý±ý‚ýü­üWûÀû˜ûžû©û¯ûàü&ü ûÆûsû.û û…üƒýýˆþþjþ¥ÿ6ÿŸÿ~ÿMÿpÿ½ÿæÿÀÿöÄ`hFÇÃí›YÉáìáÈŸxIÿÔÿÿªÿôÿñÿªÿzÿ¥ÿÉÿÁÿçÿÖÿýkŒ ÿïÿóÿ”ÿDÿ<þËþ4þ4þeþLþ-þþýüøü˜üŽüJüIü’ürüªý'ý€ý}ýýÛþ:þÄÿQÿæ·k¢Ø“g©-5^U6Ò0dÏ{ÿöÿÿþºþ<ý—üòü¡üŠü&üûöûëüVü®ýýlý×þ\þúÿÿ¹DíEaÞÕn™ÿ§ÿGþèþöþ¯þQýýý¤ý´ýŸýlüõüþýeýgý\ýˆýúþhþòÿwÿœÿ•ÿÃ4qåxTº6i¡âÛªÆü£PxYö¬7«>ØŒ<ÿÌÿZÿ)ÿþêþüþûþîÿ+ÿdÿ|ÿÁÿõkª½R[eRÓgÿvÿ)þÕþ;ýØý§ý€ý1üÕü[ü6üvüqüOühüåýžþþuþÅÿÿgÿ‰ÿ¥ÿµ•ñ6›/_Rr²ü?e«?·Ö«¯»‰.ó£ž@ºm4ÊMˆÿÛÿpÿþþþ¿þ‰þeþaþqþ ýÍýÃýØþ-þQþþ§ÿxÿ›ÿ¾ÿùOe™“¨7P àÉ ÿoÿÿ'ÿ6þÌþ¢þþ®þ…þ{þ6þ3þhþiþ¤þñstk-4.5.0/projects/ragamatic/rawwaves/dee1.raw0000644000076600007660000001105212327014024017103 0ustar garyý)ýuýlýüìýtýýý/üõüýý`ýãý[ýýïý ýýKýü4üüÿýŠýnþhþËþQÿÞ%ø ŸONÌ6„( íùvHÿß¶ÿvþ3þ\þ(ýÜý¿þ¹þüºþý5û§ü·ý$ûÒúËúÒú²ú€ú¦ú ù ù¤ú‚úsúúæútúRüý,ý ÿ Hÿþ ¤ ’†Pþ3¢/1 F–Z”X—|7Ntÿ^ÿÇþÌþÿ ÿ…ÿý@üÈüúáû0ûúTùåøÎøõøˆø…øçøÃøöÚõ`ö´úü\÷1õxúÐø^ø4ýù\ÿòÿ£è—娉¨!t… ¯ 5 ˜ ŸUP͆ñva—Z"°lÿ€ÿü'û‰üzüUýþ&þ}üùòú´ü‡ü»üÜýœþ§ý'üZþý˜þTÿÔÿgý‰û¦ü.üEûsú€úù2õâõ ø û[ùsñ¸òkõgó‰öPû·ýöû¢ý›5ÿ[1[ º ê4f èFÌý / è á l – ÐR=„ÿ8ýþ.ý–ú\øËø¨øÚøpø_öÿö1ö’öÚø÷¥ø›üþ(ü÷ü¥ÑáE!‹_ö <àóÿ÷„ÿBø¶ö>ù×úñù-ô1è”êið‚îÀñd÷0ú£öë÷íý]ýŸ$ I 9¬ ëãUÖô P "éú :·ªÿü%üG ÿ¶÷¨ôÁõ8÷ ú©ùô´òÁóóôR÷tü|ǪùßøËýðþÛ _ H  z¼å 2W‹9ýûùýtò™áéˆóbò[öÌüjóŸîSön÷ãö{à ìý^ P åÅ  à °àé-Œ›òÿ±Ô&gþXùè÷0ô2øvûøø$òÏô6õ|õ–ûý›ûóýïþQøKôÇü'ª"2^ÿ†þN³Ê´LúäøÕûYøàù©ƒóUà ëîùiúþ–QõÌì©õ÷ü‰ý€ ž;Ê  åê€s 6 ¬ úå â :ÿ<ý5ÿþ[Á+û óñ‡ñƒø˜þrú*óôsø(øöý#tþWüñÿýü·5 ê ÝHΧÿ›s F û…øìú®ûìúúü_·ø,Þ÷ã©û(ý8ø`ú ô2çøîûÎþ± í§ûtÿÓ ¦àš2 wa ÓÉ™ øÄýÆ#¾yòú(ð`ñAó úsŸûTï~í×òúõÔù¬ý‡ü$ö´ö}øÆû5 ‡<ÃkZ‚ § ? £þ~ÿÚÿkZq:õ™æìÓüæþ1ûêø*òíôýšþ“’]ÿ«z 9 =0"æLº …1±RDÿt}ÅŠ Åù†ôÛõšö ûIcùÏïÏðFø úNú û}ùâ÷ßøïú*ý𦠿ÿf¥¨7¼÷Pû/ý (üùüüþDúòòWèîrümþqùŸò"ïðõüýã²à ëæÉMp¤Û ’ " à·°¼ ¿ªØ\%6™ÑûŸôÙòOõXø®ûÂüömï}ïL÷)ü_ûŠúŠù‚÷rø9ûÃ4h aû¿b6 ±+¤þ/üFÿ‘¾ü“û1ùºò’çØñÿþöùóNï$îÝðÌø_ÿmý"ÿÏüÄ¢W—[ µ¹ ã •Æ-9ì a1 eÙèÿåúíömößúÁù¸úù®ôŠï²ñƒùRü!ùn÷•öz÷gúýXz©ýnøšÿš9èï|ÜþOû¾üb6ð¹øë÷„ùqï«ï"þ×’ø²õÎóWñø˜ªýw¯ý¨ü²W T > º ÏÊŸ ÐÓÉ Ü蹆4Ç*û÷Ã÷ûJûŒúaúÁöAòTñ•õöúLúù=÷l÷NúüÏR߯ÿþû]ÿ½C. Íýcûúüaû€ýᶪ÷aõ¸úµñpìSú»ÿ-÷vö”÷óˆ÷+ÿ6ú‹Œ1­I Å ˜« ½ ÃÕ ë0 mÕ wÞÏâýÐùF÷åú“úUøùôøô›óSõgøpøûùÔú{ù4ú¾üeýþÿS‰oþôÍŸ²ÈÿÊýbüùÄý:9üâ÷.øNøìÍíjû_û ÷ ø<õñÜ÷äÿ±üûÑKÿxýrà ç i˜ m £c Ÿþ ¶ f Æ(É -fhþ9úú[ýnûøû%ûÁø2ôÎóëö4ù«ú=ùÌø}ø úÚüÅýGþÕeþôþyŒ½Õ7£ýüü ûóÿ¿ ú‹õ|ùËô ìÜöèþEøö÷+ø(òpò•ü´þòû¯ÿ×ÿôÄ  o ‚ ôÞPj 8 W­ªö»ÿéþËû_ø)û6ü„ûžü2úDöuô„öùûgû#ú`ùÇùþý3ÿÐÿÀÿ.ÿz^Šg@ü³ýáý‚üùÈ”üÊötù³ôôî–÷=þ‡ùÌöløþõ[óKûÏÿRühþ:oÖ[¨ Lë² ²%S ¾X H ¹²{d ¸]i]ýûüÜýÿüËüJú‚ø*öDõÞø®ûüû¯úùÒúZýr“D"Ùå÷ŒÿûÍüåën‹û,úÖôhï|øÿYý%ù|øƒõõô¹ûëþãuO†- ¿ ” 0 ‡Šs n ü ٠퀠À7,ÿ~üžúŠûýýký‘ý%û/ùÅøTø[û·þ©ý;úâúÒûZýÂ’2ÿµuþë‘]<yýÅúºü þ ýÜýôûðòôŸÿFhýü¬ú4õ?ùèÿáþØËeþˆAç {g &ÕñÞ ( ‹ . 6`£=-вjýýTÿ½þÎþný•ú°÷ì÷NùCüýˆú•ùùûÿcuçÿOÉçžP.¨4tþ\ý$é§eý6þ§øïñŠúHÛý©ûxü?øRö+ýç5þŒÊtýðþŠ mJÜïª ¸  ÐjÑ+M–ˆý¿P–6)ÿùÎøû!þÇþÞü}ûoúMù,üš…þ=þMüøüg«%¨ÿ¤ü:ü¿ßÈePôdóÙ5Ìþrÿ’ü‰ôÅ÷m?þMÿ° ÿÑúeýíó8 ¦Å( ê Œ Ysá^î1ªý0ûÿžíúþFù’øsüþ²þiþ°ýãûŠú§þ Z{,üŠüîIZrþöü\ý@¶ÑU/öùTÿôÿ0LµþhøÄúÜýªü"ãký`/Âå$~ExtøT Ý Ÿ*ÈSŽˆu·ÑÿAý—aÿp]ÿMû\ûQý ý÷þÈÿ2ýµû^úvûãþÿ,þßû üXÿïŽOÿ6þáþIÿD›æÿ˜÷7þ<Úüåhëÿ»úšþ*þHúTsÑÿÐýäˆ:°‡Ùd`ú쎿¤¸³—,ý¾üÅý üÌ mþÂû¾ûÕþ þþlj þÀüøþÒÿúF¯èþwÿ£iÿÿAþ¼ÿßžûÈø<ÿ=ýËÿrHüèûaÿþÇþ· ¦½”3ì ”:þœˆù÷`¬ÿëöÿÖd5™üËýý{ýiÿOÿ ýBý(ý1ýýVý’ÿ¡6þý$þêÿjþÿØÿëþ;ÿýéü™ýº;ÖýºúüBþ-ý×êþEûýzÿ&ÿX •-®çF3oyÃãP„õ«þïþ¼š™þRü3üRü>ýþ+ýü[üDüªýŠýwýóÿ6þüßü¥þ¬þÝýôÿpÿ©þwýôþÿ[ÿÌÿ£þLþ¢þIýoþ þ¹þŒþˆþ9þ5þ•þŒþÛþaý¹þŒÿ©ÿ¸ÿ•àýÿÂ(Qÿ˜ÿÓö \ý ÿÁÿ1þÄÿÿþQý¯ýpýsýüYü?ûþûlûùü•üwüºýkýýÅþ4þÂÿÀÿçÿÖ°o‘½Eå± JÿÔÿqþØýóýÄý$üçüåýýüÜýgýýJþ†þYýîþ?þòþ‘þ{ÿSþàþDþþ¦þvþ¦þ÷þcýÚþþ,þýÁýÐýúý+ý ýeüêüôý¬ý¹üÚüÖýýCüôý2ýRü®ü üùýýûþýôý²ýíþÿÿ‚ÿ½fKÿÂÿðÿïÿ«ÿ›ÿ~ÿ`ÿ ÿÿþžþŠþŒþþ›þüÿ+ÿ0ÿœÿÕÿèÿwÿ}ÿŠÿx$‚'þüÿÿ™þàþöþãþ:ýÎý¹ý=üü˜ü®ükûIúíûûûbû°ücü~ü´ýlý†ýÉýÈþ þŠþ²ÿEÿ ÿkÿðÿ³ÿeÿ|ÿ)ÿLÿÌÿ¨ÿ2ÿ^ÿUþµþ›þþþÚþ½þÆþpþ~þðÿÿþþ‡þÈÿ ÿHÿ]ÿ`þÎþšÿ\ÿyÿ•ÿ¬ÿ_ÿ þ¿þ¼þuþYþjþ0ý»ýSýtý9üoüûºûˆü ühü‘üÛüìüþý(ýhýûþ.þþÿÿw6¯Í®àªvÉ´ÐûæÆ¾àøÁ¸¢¡•heCL1ÿ»ÿÞÿßÿlÿ"ÿÿþ€ýïý‡ý,üëý ý—ýzý üòý"ý4ýŸþþ_ýþþþYþœþêþàþSýÒþ þ«ÿ8ÿµÿÀÿ þÇÿ$ÿoÿˆÿ´ÿôÿßÿÖgðõ;“J!7^N;’Z•®}¶¿frÝìãe6z]$ÿÓÿšÿwÿ$þµþ<þšþÈþªþãþiþýØý}ý¡ýÌþPþOýöýöþtÿGÿ_ÿ3þÛþ¯ÿ5ÿ þþ³þ÷ÿÿÿþÑþ÷ÿ`ÿÙÿ¼ÿói\€žæ%[CÍRUýEOE(ùƒ‰´ÎÏÄŸŸo{sÔœoIÿ¸ÿ1þÍþÐÿ$ÿ;ÿ<ÿ<þ¼þwþ÷ÿ‰ÿÈ+‘|‹ºŸñ °ÿdÿ"þãþñÿ)ÿþ›þŒþ¬þžþóÿÿIÿ’ÿ^ÿdÿ‰ÿ€ÿñUÿ¸ÿrÿ¬ÿû‚—ŠŒ·µ ÓçÄ´õR›Â•ÏÒÎ[ÿwÿbÿHþÛÿYÿGÿþÙþþSþDþÎÿÿwÿ¾ÿºtÈq*ÿéÿÃÿÁÿ®ÿŽÿ¹ÿÁÿÙÿ¬ÿ° TQC•ñ<?7Ä'ÂÚøæ·‚·ðý’ã~ÿýÿÀÿÑÿÞÿªÿ•ÿÿÿ2þÍþªþûÿþ}þ~ÿÿ>ÿBÿ4ÿKÿ_ÿ¶ÿÁÿDÿ3ÿâ€V!q§ÎçïØÈˆoÍØÆ¡nž­J9ddstk-4.5.0/projects/ragamatic/rawwaves/dee2.raw0000644000076600007660000002114012327014024017103 0ustar garyþ_þZþýÊý×ý×ý¼ýwýoýsýDýüÑü¦üNü üûèûûeü.ûßü)üú6û8üü´ûtúûœüTüUü,ünûlûkýLüPûüsþý^ùùÄþÆý’üEùìú˜/¤úÐü”þÙý)mÿrü<ý8ÿDÿ‹ýŒþÿMÿ‘ÿÿ þþ§ÿQÿb5ÿßÌ@"_@Õ,¨éj´!62xÆCÇKN@I®gB¡ë£Ð4*[憡÷j6#¢‘¿¬•þpü,ýÞüðûØü´üâýû€ûÅüŸûÈûüpýÍüúüûÀþKþlûŠü˜ÿ%ýéûwüþóÿûÌýÿEþVü–ü>ûTüÑüþ÷Júúú¾ù¬ù ö_ö<ö,ônñåð ïˆðñ ô¿õˆý¤þ"õeù%¿  w ô§\¼G›ëüY%ÞT #•W ª ¤ ÃVŠ›þÈúõÊôì÷åú|úúöoô–÷ÈöPò1òŽùÉü°õ¤òå÷ü·ÿòý“üýFþxüjùÎü±çK—ý‡ûýoþ«þFügû¶ûáø{ö õ÷Éù¶ö ñ­ï¸ïýï6îÐìøêÙébê‘ëñYüůù3æÒíËz[Õþò b˜4"%¹L7‰±&Ê&dÇ€…I±7Kƒˆ …’€þìü‹úà÷?ôùð îóì³ðêø­ö©íÑë²îæò%ô`ö'ø8ù«ûDüKýÐÕÈrâ| ß c Ü ƒ1 "2è[ðxþ¹úë÷ËôÄñ´ðùï`ì^èìåòã"â²é—ô×õêàQæ­ûöqóÇü ¾ _ -…³#«2(,&Á, %‡Ê:?úÌ[|£ ¥Ô,eÿhúƒóòZõ±ñ¡é¡éï7ðöï¾ññ]ííVñbõÄøRù¾ýõÿcþ¾2sÇçï¸ H Ä N ¥ Q oî<œ±#8ýGû?øÞõ”öqõôò1ñhõ˜úõäÚà‰öÚëöíù¤PþHý嘷 ï=Ÿtª½ # ¦ ƒ – ±#H\4ã.ýœø×öÇô:õù–ùóXñºò8ñ9ð†ñïëñ ókó‹ô÷7ùjû×ý÷ý2úñúJþ?‰ý`Áʱ #Là¯þC0ÁéÈüâù¼üÞ(ú‡æâ5öèÿÄñ;íÄ÷+÷ôòwò<øÕüý›ü8öÓ÷Yµ¯" [Ü„ ¦ w M Z$ ð " ‚ Á-5`ýúýZ•ÿ©úÁ÷ï÷óKðúï€ì¢ì¯ï‘ð&ïþðXñhó„óÓó/ó”öªü ÿ«ÿãa 0  ¸î 3 N ;ë m • ;5‰5ïàâmñÿö‚î•ð7ðêté¿ð†ñˆíØî\ísî÷ÖŸ:þþš‹R~¥¸‘)xph ü wˆ‰ãyàúaö±ó©ò³òöï{ë^éê)ëgèÕè!ë=í&í–îÕòöÂûûfû Zß ‹7Û šÜ•ë}s^D*Ù F O\õhë-õŠÿ”ùðñÕñvñPëçkèÜèç¯èéþîÔöŒýÊýÒù3÷’ú´þ\ ¯ -aØ.¨]à ú8 a© Ãþû.øröåõqó\ñïÃì€éqèæèAæ0æcêÜð1óSöùFûEüÔþír X †h¥°oTm èÿ»ò3ú{þìúÂû ø$ñIê(ëÝîjë/êlê4íºöú9ùÏöö÷çùþc&S ™xvÕY»Žåix¢B± ZÅ/ÿèþýlúä÷RôuòôðêÊèÖèåçÑê<ísð*òÍôà÷&ùNü™Þ¹ m ݧ¸~ hè¦ ¯Hû4õ ÷4ÿ¨üÄ÷çòbòï@í*î6íÿó˜ùøôºñ¹ôî÷‰ømùáý ÷/ ã ` îÇDbõóÞP  ½JÚ¯ÿüéûÝú–ø»õñSï¶î+îfðˆñsñ?ðøôø£ûFýÝÿÓ=þlš  æ*_(cÍÿö 3¨ŽþÅþmÿŸþ5ù*ó¼ò!õûeÿký‘ø õÕ÷gúûúaûCþ]œÖ~{à w ~é c ¯'· u 7 ° Å£d ”ýøNö°÷öøÍù*ø ÷Ó÷¦÷Æø¾û‚þHÿ[É;}bcã ¬Âøéú»:μºþûóû*ýÃþOü&ù&ö7÷ÓþR˜QüÕú´ú6üý?ü0ýÿAR^Qšì¨O™Úõ § ¸ YÚb®35Œ—þãÿþ(ýãûÅù¿û‹ûÚû•ü1ü!ü,üVý>þÃÿ‚4úx¸¯!ˆhÿSòÍ÷0 BoývüGøÒ÷Ëùkø1ôøó ÷]þ Í]ûJ÷Èù…ü`ýBúÊü;)žØ™ýÀZxÙ:Ò# ± -wÿ#" ÿÎЀ`ýÙù‹÷^ø²úÆü üçüâüÿý…ÿ®–˜Ìnw  NÄ ÍöÎùk nYþúúìü$ù)õ’óµõöûoøÍûy÷âúºý~üœùCú¯ÿï `ÿåý™ÿóg1 ºÙþp³eýÂþýeþ?>þø¤õâ÷ÕúÅûYú†ùYúÿüðÿ$Ý' [ÙŒ²4ÃØÜ÷‡ûx¦•<þÐþrýþœúïõ¿÷&ü\$Cœüû:=Wþúýº‹¾9ÿZÿ\ 3¯L­šiß‹ÿÊþâÿøÿü¹û{üLþ¢üíøˆöuøûêûÚú-øóúDýþ#ÿjÿsÿ6÷¬HB© 9÷¸ôüX‹9ÿüœúÚû£þ™þxö¢óºù$Ð*ü©úÆÿ/ãÿ0û+ü Ž i Rúu7Æ®ÕfÄ ØÔä:‘gÿ×ý¢ü~þm"_÷æôI÷núzú‡ø•øÅû‰þ•ÿ–þ\üÂþ²ù ?’;ú‡÷Q²¸ü«úý~4‰ÿtõÕôóû Ìþœú~û”®üüÕùBúºL ƒª±üžÿØèÀ ãs\àºmVú}ûšÿ•Ûÿùúwþ‚þïûCø)ùìþ{ÿýãþ~à¦þjü~ü$õú“ý‡ùó÷äùEûÃÿ‡ûì÷‹û²nF@üþ:h8þþž¦…̼ÿÏý|LOÿE+mÿüYþ&Aÿ.üÃù@û’aÿ–ùûø{ý3(ýiý™ÿï±´<[ò“‡›[üëõãýj6ýäùðø_ùÏûü÷#òˆöðýèŒþüüÿ AýúAüöŠ É Tp°4mËökY.ÿÖQ Yýõø‰þqîÿnü÷!øÏû™ûÈûXú›ûü:ü¦üzýIþt”2<5­þ]÷5ü&¿Á“ÿœý<þååqÿnûýlýq}[`ýðùúHÞýÆüšüJþÓýûÂüNÿ÷ÿÿwü{ûÔÿKýÜúþ  Í{üæý9Eòú¡Š\+ï¹>T̘2ú öšá‡ý³ü”ú8øtù'ü ý"ú3ùý˜dmã§ZõÿNÿ…ˆ ‡ ïMŠfT›Œl_OŽþZûõûòýûåø)÷Nùoú¢ûùü'ùâøxø4÷³ø²û9ý†d^K¦I±NRXô²ûå‰ ªp þKüüòþøÿæýEüLþ£”ÿÄýÇþGKÓbþóý9ð•ò_ËŒv’)Á0þ›ÿûÎÿ#ü<üžþþýVýrû¼úâûðúßú6úåý9ÿ*þpþÿ ¼<þÿ5Fþ¾÷ÙALš±ýXüMþŒ„þý–þ¥.?ÿ«'Ü$þöþY¥,ò„+ ÿä“ÖƒìÿËc´þ¹û”üZýÎüý2ý‘üvûÆúøšø¿úÈüCý'û ûKþKËÿ:ühþ:Hû"úÖn£mþ©ýSðaÿ¦N}—%D¯¬=þ(ýðÊu² ÕMþaýÐýÿ”ÖÿßþÆÿ…eQýÊû•þêþªý˜ÿ-ÿ âÿ5üvûßûöý€ÿ^þþbÿ‰ íûèú~ý ü€öØù·Ø“þôþüsú‘üäþ“þ;(~Á¢è§ê› C 2‰49(С96ŽuÿÞÑ£¡üùü~ÿuý°üÄý•þfüºüDýúüúüDýÍý ý þTnñþ˜ýëþÝÿŠüiú÷ÿÕNÿÅþoý‚ÿ5›þøþVþÄÿíÝÿ¶ÝÜnÿòþÚÿ³B4sŒ=úoË„çÆÑTÜn3&–iŒÖ1§lÿ"ÿ—"ÿDþ”ÿÿ7ÿO ÿvþ|þ¢þUýØþcþ¾þ]þ‡þÇþËþÑÿÿNÿZÿšÿ£ÿ…þ³þNþæÿkÿÒÂç\ÿºÿ“ÿ½ÿ/ÿÿvÿ>ÿ{d–ÿüÿlÿAþ­þÕÿßxl „Tjåî_wSónÑ•ü3, fÿˆÿZ<º‹™¶h<ÿ“ÿÿMÿËÿÄÿ¨+ÿ²ÿbÿþÿÿNÿRÿjÿeþûÿ0ÿ#þÆþÞÿÈVˆoÿúIÿÏš\—2ãd˜i‹·„{‘@,+"ÛxT.ÿí ÿµÿÙ_ëÖV5Ó”ÿÁÿøj=ZÌÿÍÿHþÇþ…þžþjþ©þÍþóÿ ÿqþ|þ8þBþ'þRÿ-ÿدmRvú2–¦‰o6Ø€ÿ¯ÿªI‚\‰`ÿ%þÍÿþsþ†ÿt1&EÿÔÿPÿTþàþÇþçÿ’IZžÿNÿþµþ\þzÿ,ÿ¦ÿwÿ[ÿfÿaÿCÿ;ÿmÿÊCÈ$áqx zí  ÒÒâ×ýBæU­ÜcÙZ䣃ÿóÿ=ÿfÿúÿ¥ÿ}þÀýíý­ý¸ý‚ýtýîþ<þ<þ"ýÐý9üÆüÊý]ýÓþOþîÿPÿ_ÿ•ÿýJè"rð6>Œ=Z3(,!-Bkbb±¾E ÿâÿÂÿbÿ4ÿ;ÿIÿ+ÿÿLÿlÿ¨ÿµÿ±ÿkÿqÿÿÿ¸ÿ_ÿKÿPÿ8ÿ+ÿVÿoÿqÿ<þÿþ‹þ+ýÞýåþýðýÜþýñþ'þ¥þRýíþLþÑÿÿ1ÿ}ÿèB ˆ1°SÚ2Ú“’«~VwFOŒkHhêÿÿþµþþxþŸþwþfþHýîý›ýVýüâý}ýþþaÿÿþ£þýÖýºýlýuýŸý÷þþøþÿþ†þÑÿUÿƒÿœÿtÿÙ^ ÿ ÏpFœ]Îd'ÿÀÿÇÿñÿ.þåÿÿþêþ¥þ¥þ‘þ@þ>ýóýÊýåþ#þ„þÛÿÿSÿÿÿzÿ¹ "ÿù§Ìyrÿùÿ“ÿ¼ÿ®ÿ‡ÿuÿaÿ þ©þ»þþþÖþ{þJþ‚þ¯þÉÿwÿOþŸÿÿxÿ<þ¿þßÿIÿwÿ}ÿþïÿ ÿÿHÿ€ÿaÿ(ÿþÇþáÿ–ÿ™ÿDÿ%þ¶þxþžþýÿþ¸þ„þ$þþLþ1ýûþ>þYþ:þýÔýÍýêþ4ýìýÃþ;þ€þžþþ3þþŸÿ ÿWÿŒÿãCH/ÿíSK:lˆiÿñÿÀÿ¥ÿDþÛþ›þ7þ»ÿþŠþýïýËýPý½þUýðýúþ.ýòýÑþþTþ–þþÿÿÿ þ¹þ¬þºÿÿKÿsÿ‰ÿpÿ6þòþ”þ:ýÝý¤ý´þþ ýìýÇýMýeýÊýîþ0þ’þÈþýþàþ×ÿ1ÿ†ÿ™ÿ¬‰ñöæùYÿãÿðA•…aÿ¾ÿ þVþqþÃþñÿ%ÿ#þêþvþÌþéþÉþ˜þ^þ¦ÿÿ<ÿþÕþÑþ®þ¿þ¨þÀÿ>ÿAÿþÚþ¾þ•þƒþ»þkþJþ®þ—þFý¬ýDýRý‘þþ*ýÐýûþiþ¥þŸþnþVþzþÁþéÿÿ_ÿ“ÿ°ÿŽ}A :< V­tKwÿ«ÿÇÿïÿ§ÿVÿ-ÿ'ÿþÉþ­þ~þdþ¶þ·þ|þOþpþ}þ€þ|þfþ=þXþrþ’þrþzþnþ(þ6þ;þþþLþ8þ%þ-þ9þ3þ8þ,þ@þ.þþ2þkþqþQþQþ0ýûþ`þ³þ½þŒþ·ÿÿ)ÿ,ÿDÿ;ÿœ$o#"FS5hèíªŸÏÌg0ÿûÿÊÿdÿAÿþåþwþRþKþBþ1þþþþþKþ[þ>þ`þ¡þ˜þþìþßþpþÈÿ9ÿ^ÿ·8/,Wk‘ò úBy>ùîµmi”¶ƒ-ÿ¾ÿ‘ÿ‡ÿ~ÿaÿ/þÿþúÿÿgÿ·ÿÏÿ°ÿ‡ÿ¸ÿçe„“‹žÊìüó‹ž¾µS':2ÿøÿ°ÿ„ÿvÿHþùþƒþaþlþaþQþCþ\þ~þÄÿ6ÿQÿbÿ– Ï .5TºÆµÅä·P=x^aTú  ½w<>ÿó-% :ÿåÿ J†ž™…ÿý!Q†ŸŒaNtXÿü\>VŒà×Áh/W¦€!"?n€\1EÀþìwlÖHŽÇ³±ÎØ•…ŸÀ©hZW&ªtQ.ÿòÿæÿäÿûÿý.\™ó ,I<8ˆ˜™­¡½ß ×¥j^¥9ÿÝÿ×ÿðÿÀÿºÿö ÿÚN’ðÛ$_S™¤€±Î¢¨™l?ﵑ¤’„cE9B#ÿÿÿúNkb˜œ|¼ 1-íèÚ•ÌQfq[E6zas–v2ÿÀ}¤É°ÊΆm”‚Bÿúÿ¢ÿ·3u…VJž¸¡‘®Æé(HÁžÔÎiJKÿÿ ÿ¿ÿ‹ÿŽÿ©ÿÄ $MnU_ž˜Àú)m™¹—bØÕ³§¡ˆ„a,I|NÞ ¥mÿüÿÞÿÚÿìÿîÿ¹ÿ[ÿ2ÿ:ÿ/ÿNÿbÿRÿTÿwÿÎÿÜÿìÿÞRS…ÎÑ¥Óå›JhÅò´oÿ×ÿ‡ÿnÿoÿ…ÿcÿSÿGÿ?ÿ^ÿ§ÿçÿë-u¸ÈÕ8iŸÎâÉ4" ø»}5ÿúÿ÷ÿçÿ™ÿeÿaÿTÿkÿ¥ÿÔÿ‡ÿIÿXÿgÿqÿUÿaÿ‹ÿˆÿ€ÿˆÿ ÿ™ÿ»ÿô4P{}€zDdÉ⾟¬|xw?Q“is‰y& -Oo‚n;*ÿíÿÿ‰ÿÆÿãÿÖÿÈÿœÿœÿ’ÿ>þùÿ*ÿ'ÿ>ÿpÿÞFÿõÿÿÿòB|q»è›‚[.ÿùÿ÷ÿåÿíÿçÿÌÿ¡ÿqÿ*þõþ·þ¡þÓþûÿÿ/ÿCÿEÿ“ÿ›ÿ’ÿŸÿ«ÿÃÿéB=6@1ÿýÿ÷8uR_grzMKF?CE ÿ®ÿ™ÿ»ÿ˜ÿsÿSþùÿÿÿKÿ}ÿYÿiÿjÿLÿ.þëþèþäþÐþ¨þmþfþ«þäþþÿ?ÿ?ÿ.ÿƒÿšÿ‚ÿÆ9tÀÍ´–dF2 ÿÝÿÿ€ÿ—ÿfÿ&þíþ þiþkþuþcþ,þ þNþÏÿÿ1ÿXÿ‹ÿÉÿï G`—Å®h?ÿºÿ´ÿ®ÿ¡ÿ„ÿqÿŠÿ|ÿ^ÿþªþ‹þˆþ¨þËþàÿ ÿ þöþìþýþöþÞþÝþíþåþþþâþ¢þÀþñþïþßÿ(ÿ{ÿ¡ÿåÿæÿÈÿ͉£f%ÿºÿ«ÿ‹ÿpÿdÿƒÿÿ+ÿþñþÑþ¥þŠþ¨þ»þ§þ§þŸþ~þbþDþýÇýëþ*þIþ/þþLþgþ‘þÄþ«þ§þ”þœþ¿ÿÿoÿ¦ÿÈÿ´ÿøAi[ÿïÿðÿ÷ÿÂÿtÿ5ÿ(þçþwþý‹ýwýšýýœý‹ý~ýmýGýDýUýý~ýoýuý“ý¸þ"þlþuþ¡þýÿ-þüÿ ÿyÿ¤ÿbÿþïþøÿ þÖþ½þqþ!þýÌý’ýŠý»ýíý¡ý¶ýÐýÞþþMþ~þÎÿÿ@ÿwÿºyŠZO ÿÙÿØÿ¿ÿÿAþÀþwþaþ`þ=þ7þýîþþIþ-ýøýËý´ýåþ'þSþ‰þÆþºþ²þöÿÿ9ÿzÿ¦ÿhÿ5ÿ^ÿoÿ-þÜþÔþÎþcþþ+þWþ0ýóýôþý¹ý–ý ý–ýÚþþ6þ/þsþÚÿÿ0ÿ6ÿ1ÿ!ÿrÿÔ$X~³§}V8ÿÞÿ²ÿtÿeÿPÿþÙþšþžþ“þ]þFþ1þ.þhþ«þÏþÝþàþþÿ"ÿDÿkÿfÿWÿmÿÓÿõÿïÿ©ÿpÿNÿ5ÿ2ÿNÿ^ÿDÿHÿ[ÿ`ÿdÿ6ÿ þÐþÚÿÿ ÿÿþãþËþ¥þ²þØþìþ÷ÿÿ\ÿžÿßÿäÿÐÿÝ,?KQ€„IE4,(,8\†‹qy›ƒT)9ÿéÿüÿÖÿ¹ÿÙALO3&!Lƒlg£¨†„|qniNdާÀ[ÿøÿõÿûÿèÿíÿöÿöÿ¶ÿoÿPÿ8ÿ#ÿþ«þ„þØþøÿ#ÿQÿ8ÿtÿ¡ÿÀGf„­ç@¢¶™qw™t> Ývÿéÿ¾ÿÕÿû/<60["AnÞ:A%ø@*õÁáëúÛÓ™d\OÿýÿîÿïÿòÿÛÿÓÿ¬ÿ›ÿ§ÿ ÿtÿyÿ ÿEÿáÿeÿ†ÿÃÿIÿZÿ…ÿ¯ÿèÿýÿâJÿì+ž#?r8$W}“œ²Ãˆ-97ÿ»ÿ¯ÿÃÿÃÿ~ÿ#ÿPÿzÿƒÿ¤ÿ ÿƒÿyÿ®ÿÁÿÉÿ©ÿÀ:šÙ¶••xc^jj=ÿÙÿ‘ÿPÿþ×þ§þ|þxþiþYþxþ‚þˆþ·þ´þäÿ2ÿÿÓ/dn£Û-E0ñÖÌÕüꚆ‘‹E/ÿìÿ¼ÿÕÿ·ÿ+ÿ þõþÖþ¥þ’þ³þáÿþñþøÿMÿ¡ÿì /„ȶ©µ³ÔÌ¿®—ˆ€˜”U/ÿêÿðÿêÿëÿÀÿ¤ÿ}ÿOÿ]ÿ\ÿÿjÿKÿKÿSÿ`ÿfÿhÿfÿaÿ`ÿvÿ•ÿ·ÿÍÿÆÿÎÿêVsUl…Qc`=1ÿ÷ÿÂÿƒÿˆÿÿšÿ‘ÿ‚ÿRÿcÿYÿNÿ@ÿIÿ€ÿxÿxÿ‡ÿœÿÄÿÝÿîÿô ^€£‘€…¯Óûû 6*Ѥ]Hÿýÿ¼ÿ—ÿ‡ÿfÿcÿJÿþ¸þÆþéþþÿÿÿ<ÿgÿ‰ÿ©ÿÆÿåÿçÿéÿü-goyƒxelZ<ÿüÿÚÿÞÿÆÿÈÿœÿXÿ6ÿÿ$ÿÿÿ)ÿOÿLÿ<ÿ@ÿdÿ ÿÁÿ³ÿºbtsu°µ±š‡µ¿™}qkbL@4Nm:ÿýÿùÿÔÿªÿ¾ÿ²ÿ§ÿžÿ€ÿ~ÿÿkÿcÿ°ÿé=o_Lyµ¦p6+4PLQ@<=&<&ÿËÿÕ+>B%ÿÐÿ¼ÿ–ÿrÿ®ÿ·ÿ°ÿÃÿ¿ÿÏÿ¿ÿ±ÿ¹ÿ—ÿ‡ÿ‚ÿxÿÿjÿwÿˆÿ”ÿ ÿžÿ°ÿ²ÿµÿÓÿÛÿã06 ÿÆÿªÿvÿMÿ#ÿ þýÿÿÿÿÿþüÿ ÿÿ ÿÿ/ÿsÿ–ÿœÿØÿ×ÿÓÿß =k‰Ž‰{kP *9Gi`RP* ÿßÿ”ÿ^ÿBÿ@ÿ0þñþÈþ·þþŸþ×þ þbþŠþöÿAÿqÿ¼ÿå (19ÿêÿßÿÏÿÒÿÒstk-4.5.0/projects/ragamatic/rawwaves/din1.raw0000644000076600007660000000710612327014024017125 0ustar gary_ÿŒÿAþúþßþuýöÿ þuþþ›þhþˆþ,þýðþkÿ‰ÿqÿµp.p™s5C<‡Np–¬21[+Ñý[¼aZrÑÜåú›å/ÿïyOÿpÿ%þlþþüêü9ü‹ü«ûñû×üØü×üµühüBü—ýüžüÉüïüšülýEýÚýü¨ý:ýäý“ýý8ý#ü'û¾üûðü,üü!üXüuû¹üü•ü±ýýPý€þ;þ‘þpþªÿ,ÿ2ÿ ÿ4ÿ0ÿ¹c–ÿ™"(ÿ–ÿžÿÿ,ÿxÿþÿþðþ4þ…þ3þqþïþ1ý™ý}ýÖþ<ýü²üñýÚýÈýHþ“Žfÿ§ÿWÿíOú–rm·wEüþK,çÃÈý TÄ]D¢’´"ÇÍ&bÿjý¬üÂûªú)ùdù1øöøZø÷÷çø÷*÷øøó÷Ô÷ßù6ùÛú´ûÌü6ü¦ýü‘üèýÒýÓýÆþdþ”ÿÿÈÿÂÿ]þâÿPÿ7þlýèýýþ™þßþjþþVþ”þsþ8þý•ýaüzüZüVûÜü"ûÔúåú“úrú2ùØúúHùdø·ù²úù?ø¢ùù¼ùòùBùƒúœû“û€ú³ûÕý\ýqŠ TCg‘ . H ³ ° `z/( ÿu¶‹Zï臽 §  Ë ††Þ“ÎÓýËû2ú«ù+øCöÿöõ‘ôøõô ódóÍóÒôõ3õŽöÑøWúRú¾üýšýcþ®ÿï Ó«À•ìú†c¿²‡ Ûÿõÿýõü;û‚ú®ùgøÕ÷`õ®õõô¼ôÈôïôBó÷ôŽóÚóáô¤õ1õ¿ö‚öoöd÷°ø„ø ù<ú[ûû²ü©þ2þÀÿàËg3 N OftNµƒ];¯êK–o–¥ ~ µ î  +ì)æþþþðþ!úé÷kõõö¸õöôò¯ó¸ó²óó$ó9ôÓõ¨ö÷ øû*ûêýkÿ¾Pò ýÊ6ãÖva¦(Т0wÿ:ÿ6þýýmúÜøØøŽø·øöÓõjô1ôÿõšõ©öõkôpôóÌó^óÕôËõ*ö÷÷|÷œøƒúúÇú‹ûFûÖüìþ‚¯„ nê~¯ Å [¼1¡6E„³^}ø^”%”.‹¯ 3å©Ð}\þþŠÿ×üûùÅ÷Aö¦øìøÜøöTô2ôöp÷õŽö#÷¹÷”ù}ú‘û#ýJþŽAù乞Œ0º8¬=WAþ üûújû+û(øéø-øÌù)ø€÷¡önõ‘÷ø.ø÷ùö®÷ ÷GöŽööÖöÃ÷÷á÷”÷)ø ø†øOø*÷ìø•ùàúDþ¥¡GüÒÿÜê &`Š:tGö:¦™oÏ(®ñȨ· R@ й¹àþaú[ýçþùbõjô÷"øêöaõ\óhñ\ò°ö}õ×ô€öÀ÷÷Oú#ùÃøÊú£ü¼þ‘ÿšÿ9ÿ J¡t6Ù3\ÏOâþ«þíþÉûÁû—únù†û'ùöÜ÷R÷]õÞödö9ó/ó½õõª÷öæõDõ©õÑôæõ­öÏõæ÷.ø¨÷§÷Ûøb÷gøùfùø$ù û¾ÕûMýÿ„ 6 oG™»P</ w~.¾@ŸÕ NIœ c O LþGûRý‹ü¦øPö`÷¹ù¼ú^ø]õòöòüôü÷Jößõ<öWøcùÍûùqøƒùû4ûçü'ý©þ¿ÿóÿæýþü»û`ûáþ-\uÿqþsý<ýüùðúEú±ùìújú2øîø”ø,÷=ö¡õPó7ôö5öË÷#ö±õ;õEõkô„ô¡õ³õãöé÷À÷¬÷­÷É÷m÷“ø„ùTúú¿û¬üÑÔîµü ¾Nš #e4ûþ F9^tºarÞæ( Ÿ š æ Îó™ÿNþbþÛúþ÷œ÷…øyúsú¢öÌóÌò`ò½ô‹÷öùöuøPùöúØû ùXùÕûÔýü¿üýhþkÿšÿ/ýHülúýûzüôý ü]üûèû“úÁøö‡øq÷ì÷{ùøp÷xø%øM÷tö‹õkô×öâøtø[ø,÷t÷™÷°ölõžõªõÂö÷¾÷—÷xø÷²öþ÷™÷ôøËúû±üsýú5ú '° ƒ Åù456Ç}ÐqÑp„³^ØÐ = Z 0 B1ÓêÿŒüôüúõû@û™øaõ†õ ô{ôEõ-ô€ó°õB÷C÷jöÎõyõú÷òø}øËú,û-ü üËüÝüjü!ûUûÈþþ+ý°þýõý÷ý û>údúñùøù*úgù?÷løøg÷êöÕõóõ–ö¢÷öVö°öÍöÅ÷D÷öÓ÷ö´÷øøÓø&÷À÷Õ÷ûøøøçû ûyúþü ý}ÿÜY‡ÊC v …;™SË+¥Wâs!Öȯly Ó Ì \ 7s¶J©@˜ÿþ‰þ üöûÿú3ø>÷ö¢÷.÷—÷õÃõ´öåöçõÿöö öï÷“÷“÷°øø^øAøÀù:ø£ø£ùIú¨û[úÊúæúúû@ûÿüJû~ûûlûmûÖü°û¥úçûû÷û½úÿú$ú%ûxü üúýú{ú•úõúíúùÕû'üNüSû÷û=ú¾úxú@úú#ú5úPúyúVúzû#û¨ü¯þ“ÿ,ÿU ð .-± < ¤ sƒ„"ÄY­ËºK£V h ì  ˆ ¬µWÄš·ÿXþ{ý üyû’úíúgùÁø¬ø7ø:÷¤öãö`õôõßöZöMöFöÎöJõbõ»ö€ö»öÞöì÷"÷èøNøÑù²úoû$ûåüüûýZýéþ˜þåþäÿÿ’ÿÝ2uãò~ÿûÿuÿYþáþ«ÿÿ0ÿcÿ$þãþ_ýÖýFüÐýýý!ý ü«üŒü¯üôý-ýgýFýýþPþ–ÿÿíݾZF//-è Õ , h OCÂÇ% ™–y Œ! ý é } @  'ìÓ Òê×ÿ¬þÅþvý‹ü^ûëû›ûúAùBøÅøv÷è÷b÷2÷}øøøIø ø¡ù(ùú1ú÷û‰ü0üðýý ý\ýôþaþ×ÿ‹-¦ä<!°”ø¹ '/ÿÆþúþªþ©þÎþŽþlþ7þ,þnþ“þ§þºÿÿJÿRÿŠ"uhÙgÅ\¿!Î\Ø91PöŸ2$œFxOhÂÍ–8D¼Î6Ó—<Õ;õ1b3Á2ÊZâ<‚ãU¶ÿùÿvþžýÂý`ý üsûÐûAú»úOú8ùöùÕùîú*ú(úVúÕû-û—ûÆü4üœüõýŠþ1þÿÿìXn¸íäסÎà±=ÿðÿÆÿÅÿ-þ2ý»ýnýOýRýüþýý(ý)ýý+ý5ý9ýfýÌþŽÿÿÿ1ÿ»ÿú _‰œ˜’Ä— SŽ‚Â`_R/аt÷´º±±®io”´§|l·¾OBy¾ª1°}¦…$ëÆ~ÿ«ÿtÿˆÿ’ÿþ‚þlþþnþ0ýçþþîÿdÿ@ÿ,ÿx-”³°Î>¥¹ž›‘s3Þ”™pÿ÷ÿ|þñþ8ý›ýü¹ü‚ü8ûôûÈûÙûÂûºû…úèúØûjûíûùü üQüÜý…ý|ý´þ"þ’þ÷ÿ(ÿÿ¾zÐÐï÷o°K8†ŠŒ$ýIž0k„xg>x™UÿßÿÃÿ¸ÿ„þàþŒþ‘þYþ/ýãý†ý'ýüÈüÌüñýý9ý#ýý?ý»þþ+þ´ÿ/ÿ–²<Œ˜ÁýAhzèITØûÒ:ºt@GHªÔu.8ZÿÏÿÄWGÿÖÿ´ÿ¬ÿbÿÿÿ™ÿÔÿnþúþÁþ¯þþýwýFý|ýæþ*þþ[þ•þuþ/ýôýçýùýåýåýíþ!þaþJþ"þþý²ý…ýýÖþþ0þzþ–þ¿þÚþäÿÿBÿPÿIÿlÿ‚ÿoÿ†ÿtÿOþ×þ)ýÄý^ýü¸üqü3üGügüû«û‚ûAúæú~úAúMú©ûûstk-4.5.0/projects/ragamatic/rawwaves/Drdak2.raw0000644000076600007660000000460612327014024017403 0ustar garyùœûkü~üêü-ù8øßû–üLûîüTþ$ÿdÿÿLüõøNô‚öÊù[ø@ùjû5ýZüWúeû‚þDvþíûeýÃ)ÿº0 }+ ¡°{ûïþRÿù<û×m Ø ÷€þ®ù‰ö²üe3üôQôæýƒvüŽöÙùÝn¹û9÷ìø<ü²³FGôŸM÷føS B^"6¯¿ q³÷—^5ýÿøcû™Lpþýöoø…þQîªÞ÷ …}÷–ò)ôšú¬ eèßþ_÷ãóV÷IÁ  ™tñÍþ‰ýÉ/ü[÷@ü¹ ûk<‡üÏü Í ]à «Wûמüù0ÿAê ñOÿõÿ~õ"ì^ìíæì­ê®ë@í‚ï(ñKðšîÕìTè“ç¢éòíð–özÿ#YùÐòkð óUó›ò¦ö¨þÉÍ ¼å ú2 ÿ@\03ârMEý¹üPûmý/2x ‹ vCü¿úõú ø­÷;ø¡üBþ›ÿžü.÷ÑôûðîñïdíIé˜ì¼õ®üDþùÿÿÿ ý úÇüK &ÔÜh" ‰Üttw K ö x[²5 2ÌÌŽx¡’üÔüú^øšøqù˜ýƒ”ðú›õ¶òüóCô/óOôÉùGþº¹²ûˆö‹ôó—óñÎñ·ô¹ú1WV¥Y¡ ë † ( g „ê :Ó 7 ˜ Õ   Ôµ L0¹0þˆýéü×ú]õ}óô(ööÞõWôÑö–÷ÀúHü¥üøþƒÿ~ý2÷õð¶í„ñéüÿôï(ýíûoùåú û`û3úùý0\ª§#™ÿq è € % ù‡  —Wx.Aâ›jN|¶`û³û®þýÊýNüéýŸ/ÿ`ú"òÏïçòTôeòð@òBøþÿwúeóòNöù"úÿû®ûú³ûýóþ5ýUþœ}à)×þ(ü‚ÿSГ`¢ÆÓŽÿÂþ~ýøüíû‡ú¼úäú»ûqüpýÿ®Òÿþdú&÷?øaùQù-øÒùBù§ûüçü&øöö/øú›üXü]ý ÿ›,¬¨ð'wÉTŠÔ‡ša„ º £ ¿ ¹Å©!Þ§éçN~Wõ‚°ü-G Ϲ5Dþ‰ükû…ü8ýÊýôü ü(üèþðÿ*ÿþ ý´þ'ž¸¸‚%\Ëpe 0 .„ZZ¶pû!gB >ðGtû÷úðúÁù|ø0ù^ûúS÷ÔõþõŒöô5óqôbö.÷ŽùùÂú˜ýƒÿhý–úøÑùøÔú+ûvûÄý’ÿ?¥ÿ¼þSÿ_ßï'˜²ýÈþÿ ÿ8þÿ6yËêöÝýlûjúéùÑùÞû)ýÀÿóÜ…÷Aü©ùÞúSýÿ,y•¯‰:¡ÿ–ÿË EIE‰c[;×ÔéÑ/•5‚hcJd§uý$ûVúpøZöÎöG÷qøÊû¬ÿF†Ôÿ3ýwüoû´ý¯ÿ¾ÇÑ^  ¢ ç1  ¸‡§  ø=XÇ|QAýX¨ÿ[þ‹þLÿ ÿöÿýûËú7úþûªùnöDôBõÈùBûûhú¿ø„öbö÷[øÑø ø“úèû5úxû0û¬ú·ûýQþý¿ü™ýgþ§ÿìö»1 ÅË?þ•ý>ýˆÿih´ÿ™ÿ‡ÿçÿ þÿ¤Îÿ±ü·úrøÅø÷B÷êù_ûû`ú¶úWøJöàõbôôð÷¹ùÕü•M§<쫳r©>fW‚¹ ) Y 1x‹ÓõG‰ªw|·5¿—‹ÿQþ\þGýOùÂööùFýJþƒýåþbÿ.ý.ûˆú;úü‰þµoˆé 8_Cÿx˜4Õ (pN t m ¸ T X ® 7 / G;/‡ÿøÿ•þÝýÖüeûëû÷ûgú:ù‚ùøqøs÷fö³÷R÷ˆötõñõ ôõ(÷ÔûœýJýÆýÒý<ûÅú˜ú‹û=ý²÷{þÁÉþêýÁýÈýúþ}þ¡1 C‰…ÿÙ@ ÿØþ–û±úçú]úeùÓù€÷ñ÷ö­ö0÷pú°û£ûDù²ùøù‡ù¢úKûúúûü½ÿÿìpýxúcùTùøý<ÿ!Ç0fô‹·¾`æ±Ãx 9,u!è[¿:¨Ub6*ÿŸþçïn¾­/1ýÍþ¨ÿ‘ýðýþ@ÿþWþÃDÿ¯ÿê+¹"ÿøÿ›þµþ‘þËÿù‘ íÙÔó›taΨRÁYIŠþ4þ þDýHþg+ý@ú7÷ ö•÷¾øòøÆøùeúÍýë ûÿ~þØþpý9þ˜þ…ûÄü þl·ÿùþgýŠûGúEûGüRþ G—h{¯ p­Âˆ3¿‰ýþ!ý¹üêüþu´þÄúðùüú•û÷ý ý'û²ùxùúûâýƒýÂþvý¼üñý]þ¢eY»ß2 )2IãDqùïßNjKýyB•I´†phÒ†åV0…e¼ þëˆyE÷uÿþr´v ¡ÿÀýÃý‡ÿLA ÿ>«ÿ{ûÏúµý¡oÄIÿXüÕýÿýõûÈú¨ûAû…ûÃü°þƒÿ ÿ?ÿ?stk-4.5.0/projects/ragamatic/rawwaves/Drdak3.raw0000644000076600007660000001114212327014024017375 0ustar garyÿÿíKá3ãNbiQBCæÿ’ýükþ“Ýÿüåûjû üfý{þ¥j+îÜþ±û½ùøû:ÿŸ[Éjÿ þÅùþøEùŠüNf0Æÿb™ÜvÌ‹YCÿõ0?Nº¢  •eÕÁÿ¼cSvôÿûðûþ‰«ûŒ†ÿîæ=K  ˆmÓåÒa¸ýa÷:ö0ôuõnøõ™ösùüªþÙùð“ï{õûûø9úƳ5GgâAtÙ…ýiü§»üoj X` ~©ÿéÿJÿSûBøŽþJ]{ÉÕ ß \¡€½œÓüöö{óÊù_±™ˆü—ø~ó=ñYò›ó€ñkî«í îÉò ï&êHèáì ïéñzõ„úÔý}ûlú øW÷gùÚý¨ÿXýµþeÚ¶üUÈÿGM `Cû]1 “ ½†¡aÓPÙ©@O.û7÷Ëö9óòföSú¯ûùüýJýùþNÿýËûlúÖû-úuùÑøôVñ4ò6ôó}ð@ì#ìëð\ñ¦ñ ìê.ï3ô÷÷¹ùÞþ±Dùñ k / ÃÀâ « … T Lø”þn²mÿrþVú7 õ ] Â[FIÿìþ'þþü­îšÿ#ü÷uô™ò¼òò•ó$õ`÷ú‰ú„øøkúEÿ¾‘”@eF$à  E) ÅY]T2pz Ãà70¸ ë%« â • +-ÿéÿ]ýëý;ý#þëý{öûñÞñïóVõ:ö?÷!øÆûDþ¯ÙeþFüüXý?Qȃu›þ#þ~±Ö Q Ð p · ¼» · »~™¶97Á z ! ÀÒ„½ fýûéøô¶óWô#óóñêðÚñwòŽòÖôËõAóð!ì êIê¸ìÝîqï¦ðŒññÂóMóùò­ó\ö=úJÿ»-F$ õwtÄûÔ†ÿˆúBøßø|ú§þ¬ÿÈ(¶“þÉüˆúœøÑúÐþÙ˜§ÅþüúÛ÷Êô™ó~òáñxñŠð ïïpî[îïqñóÉôˆóÍòGð¯ð®óùQÿÅÐU§ó•W ß Þ ò ¹ë ñ ! &>피|ŸuýËúƒü2Vvaø‹ø•eP[Íÿ£ z®9   ZM€’ß•iQ¶ç!ÿ»Wÿáÿ[Rï¼ÿRþiÿ]W¾ÈykŠò*WÿöþþNþÏÿzþÇýZýIý¤ý û$üþÝ£ÐÿSÿ¶ÇFËFщv™ßÖþ(ûfûbþHþfýýjþ™ C }LA¦de eÄömÿ2ûÒù§öÛõ»÷úú`ùO÷ð÷£ø«û üHüWû²úïüþÈ¥F{ÿöÿ\ÿ}rÙÿíBøŽ!‡]ÿÄÅ2?\géÔø æE‚ŸïÈþ§þR ûÂ\4þDþ÷ýßý1ý?û¿úÔøÛ÷å÷”ù·ýxÿÿýïýèÿöTüÍùøUø‘øtùÈûCþÏþÐýÊÿÿD ïnÑÌ@QóqíBÿEüªý1þû™ùEõò6ï½ìWìÛî”ð¾òWóó¨óDõ‹ùü ü¾úT÷;öuöÕ÷»÷€öàõ òò!ó]òöóó5óeóëõGö½ù¡üÓþVþ™þgüêüöüMûsýªL a‡—²Öh = õ z  Ÿ•]ÿ¾ýiüêþÕÿÆÿëÿ ýŒüý&cÚ ~Äÿ«æ&AºâÂ2 ÿ tsÕoäb/ûé܆A a * ‰ ç  ½ þ д'Êq©H½­Wn,äíÉU 51púŸúøºöófï"êåÝã.áßÐámæÌèòçXäÔâ¶åßèOéìðƒóvòÿñï­ïðCñºô|ømü ý´þk þ$¡ ¦kP  róáÿý¤ü©ù)óØïNíé¨ç=çlæå ä“ã?ãìäCäCå#åa䆿Gë^ðûôlôJó£ô«÷½ü§ïXÆ Û ‚@›A # ¬ ¨ Ø<Zu6Ñ _Ü9äÇR½… ²’ ë Ú  YˆÔ ¤ nÿ³þbÿXƒ˜%öé)•û = N÷¨ã@M§²þ8¥ 8 ¡ e ÿ Ó SÔÂ)$þï&ö «ÿ^ühù¢õ›ò:ï÷ïæï"í>êöånâdâ*åézëŸíë“éØècçè@è¾é±ëëÁì¨í…ì‚ë'êeêë[íâï«òuó¶ó¯ó ñ¨ñ£ñ÷ôƒø_ûÙÿvÿðÿý[þADeKü¸þdú^øöKö‘ùFûKü’ûþúÏùšö¨óíðûïòï?ð:ñìñßðaîðóÓöTùFüí€jhÿÊ*B¼ û \A!Ý ª R [ W=@¤|  ° æ˜ö´Ze#³¸žíáŽÝpsgªB™vC ¨ 8² ! ˜¨rý ûýdÿåÿéýûÊ÷W÷·ø¤øšø•ù[û]û ú(ø'õxò§ïäðó®öÕø†õ¤ó ñ\ï‡ïÜðñYòGõõúéÿé‘Zþý¤ÿâs;ƒýîüÛüJüüëýµþÜýèúµõ2ð$ë¶èwçÃévëäìaêÂèöç5äÚ䑿“è§ì}ï¢ðÜïRîÂðËñŸó÷÷Sù¸û«üÌÿ.þÂý´üùþ®: þ ž .ÿý½ÿbŘhl[ýŒùáøøKú÷þQýyûäûýúÓùùúšû—ý/ ÿÎüDú%ù«úÑûïûñýŽÿç˜þÍüû8úúpýÿ'“úß© œ°KiÎ p -Ýú+3ï¦é þ Þ/qÒ ë ȧûEŸjƒýþüÏükúÎû<üãþ›}´Uý ùøù_úSýÀý  @ µ¾cÕjfÀ  É ñ Ö à 0 Y ¹ ³ GÂMüûý}¾qÅýeúfù¼ù¦ù}úLü)þl›âÿIûVùÉ÷÷øñûGýöÿ‡þüEù„øZø|ø¸ù•úÑúÿú%ù'õOòðñÐòJôÓ÷Úü"þýÑþ6üüý3ûûûèûSý=þÙÿýPù÷1÷døùdùïúŠú,÷ØóàñÛò¤ôö?øEú:ù÷ß÷ü÷°ø_ù5ý%öýqF¿ÃÛ¤L_vh>†Ó^`Irÿ-ú°ø=öÆ÷ÂùQúÍúbù:ølõÛó‹òFòkó›ôWô³õ4õÛ÷™ù8û<þª©A´ûïKñ“‚ T ¦ ê n ˜ÅFª¸ þ ò A ±å—¾  P ‚ fʼnغqT&Õ¥ý¥ùböböö¸øûùkùeø!õ€ôô$õß÷÷éùú’ýtý©ý›ÿßAê‡0w=åã_¦ ‘ q  cdxé^ H ¦ ò/Í»(ý6úßùƒùù ø>ø+ùùGù›ù„÷ï÷›øfú”ýKÿƒÿÌý§þëO X^„0 „ P © i V = œ Q ©•l"O¬Œ & ` 9×&þÓûÏú#ú1üþ¸þòþû&÷†ôåô¾öŠöˆ÷6ö|óñï£îðñLð!ðNó#ôÈõöuö–öÖõºõRôIõø(ú™ý¥þÄþÅÿrÿQÿ¯ÿíÿÿþÊþïÿAÿÓlî–8šþ3ü*ü™ü3üý`þaþ&üAù+öïõæöö)÷2õìôôiôgöÂøäú¬ú¤øÆø=÷øöÞõ£ôuõä÷børùùù€øöhöDö¤õüôÞöùû‘ýWÿ9ÛíÕ>¯Ìø g ø š K 6 Þ Ü » ò µwi1 ì ¯ íP ‘ [h˜ öÂGßYsÖóH¿]÷êaz-âzÜ=tÞëêô ² ‚“¸!p¡ #d„~Ù:Ïk[5ñ©žêƒz­œ˜€ÿËþÜü´üýýæþ ürúøùøYø=ùÄý˜þ}ý~üBúÈûKûÌû†ú÷Õ÷N÷öñôeñ”òóSôøõœõ<ôDòŒðiïÌñGñ¸ó<ô_õ@õÞ÷ùVøùö®ô_óïô}ôôõü÷’÷[õÍô©ôŠõôøVúÜünü&üîþrþ/ûÝüIýù>´OŠ'ÿOý‹ýhý×þ&ÊÆ̳ÿÅØ™£ µÅáKÿ ”öÅ'Iaú~ a³¿ „ š×2®†ÒB ± õ Vl¸ÿ 9 — … ù¹m§*h ¡ - /.LDàc ŸeÑ3 }ö¸ <vhÿþ‘ú cßþiý(ü¸þSþ}ÿ½]ä?‘þwþzýûýúçùÅúBúüý#û¬÷Üöö¦øúüiýGü¬ûú'ùâù²øæ÷þùLýó)fÿóûäødöIô2òûóèöæùˆû£üaûû˜ûšû[úàü¹ÿ[8 lÈëb2ýòíôþúÆú}û+üfý;ýÞÿlþÿþþýü¦ýÜÂW¬4!ÞÞÓ"ÇèîÌAüüúþüfüÐý°ÿòaÿNþYýEý.ý¢ý´ÿDÊùÿÜêܼ9Wþ™þ߯Ý7«rj^ Œÿäÿ}þ–ý¢ýñÿiCëR´½þ„úmøJøâùÛúxûúÔúùæúøï÷ëú®ýnþÉÿXýòü‹ûÈûSú†ùµü<|ÏÛÿïþÕý}üiühü]ýþOÿÿ­åaë^aýMû½ûú•úÓúF÷Fõ¹õç÷Yø¨÷³ø úúßû®úýúSúUüûÕIqàÿAþ·þÓÿI¶+ ¨(D½•æÕRΡ$î=©ÿÕo(©ÿáÿ›þ ývþÈÿn]œ»´ÔbÚ“ÿèÿVýÉý¶ý[ý+þmÿà£ÿEþBýÂüÅþÉÿµÿƒOÔª³ú‡dÿˤ;©Ÿ{,cö%í 0w]gBˆhÚA¡+„¢DJþ‰üÙûŽú'ü7m±þ—úÆúxüÇýµüü}þ‚ý~ý~stk-4.5.0/projects/ragamatic/rawwaves/Drdak4.raw0000644000076600007660000000730612327014024017405 0ustar garyïãò^ô²õú÷‡ùøü}û¥ùù™ýjRÿ´ÿr   À¨Ë*[¾ ” Þ t À u–‘§+zùÞ›âPÿ+SÂÿËð€÷Ž÷f_  ¶áÿaûÈž 03ú0 Å uòÚšÔ‰äj“$Ô7ô:Ó!ÛªóóŒÜÞß& c&‘ÿðÕ×6ïÑÿ<ðAêjt% žñ‘ï‰Kžý}ú˜ˆ1ýÐcäCÇYÌ êhö•ðæþn¤"Ó öüõ’ëqà¸ØÆÛ'äTäcÞLí( 0“["¦(ø‡Ëÿáï0æhä#á¾ÞÉå ö·G:p ç"G³ ² ­ ^ ‡ á^¹0Z='6a%ølÓú FøÀððÆï*æàà¸Úßѣ΃؜èóó&ö]ù{ Y‚K U rVùÉýQœR¹Ø6õ€qñ¨ã…ç1ëçMä ïT_1Ù îñ % ÑíƒúÿZøüÉç&) s .nøUêçnì îÇì×ë<èVç^èóëwðò²õXùËÿ$‹ý{î@T#Ý(€±Î # HxÚœ+þB ”!Y!]­ HüçkØêÕ¿ÙJÜàá6érñCö?øZõBî‡æ¶åGñÒü ñ ¥ Ð03„*ßùµøÄû¤÷mî3ãóÝiÛ×vÔbÖ±Þ˜èì¥ìíö(ÇëÎE²h!I%$ˤíÿ­ ·Ó¥X_²¶tà û¤ï×çXå^äîæ6ëÒð^ñMð½ïëä¬áòáæá/ÚNÔ ÜªéñïòøîRì÷î¼íˆéhêÓíËíððõðkêÕåáßä>ê>óû‡&« ìäC"û%°)‘%æ ^DµH 8ª(¤Œ8 «húfõ/ö·÷ô*ï~ê‘æ+á Ü­Û¿ßœìBø[ÿ%¿EB[ð(‰ºuOo ~„û«õ$ñ¹ø_¨'3^þÕûýSÿãþ&üqþ´ À Ž#ûéú/ùÊùcûLÿ cÿ7õó!õíúVÿìúN+½u ¸ [ ?¯¶ý«øùò¡ð8î îÐô‰ý[Ÿ1îýcýiŽP è 5%k ÑÿýøEõõÝ÷Íÿ uo# Ö1æ ›HfÞnö(À † ¯ “ ÷þÕô ò\òRðÚë5äšãúé®îÀñô&ö%ø)÷^ô‘ô[òÄï}ñ{ò±ïËð«ôìù!þÛ”K^¹‘ ? ¯ ¶ š Á ô‡¥sMêÎè—"[¤ýFücùêú)þîÏbÿÖø¨ó¥ñÂõŒ÷Tõ•÷÷Îö)÷©û…ýtc øu , óždhØz ª½û€õ%ô"õÉôPðoðXðkíýêæÖëôö„óôPøfþDÿáøÄôâòÈð5ì¹çïæ"çèHæˆæðèïëqïCîâêÎë‘ð~ø¾ýQÈ “P±-zÏã Ð Œ ð ƒ è # ú á¬J Ñ#r"…÷») Á ' ò b ½T³¸þ ÷ô}öIò‚ìwì"íuîiîçì ìàï2ò8÷lùôBð¾òyõQøØûÚþTU ä×ñÄ Œ º’µž‰ "Ç€1 j VZÉÅzEzç…Iÿ#ûÚúUúžý…üÚücüÄú1õXñUó#úÀý½ü³ÿxÜ…áÿñþì¥Á ­ b Õ 3 É  Y- v Ü m ¦Š¸? Ë qÿ›ü&ôòðí´ñWñ¾ìÇì9ìžë|êÙë>ëöêEèSêJì…î>ì0é'æ£çëÅõ˜û†ûÿ÷TötúÅýjÿ›8ß , ¢¹^îäéZ)… u ö O 9 ö ‘ £x´L å | = Y ˆ å±þ~ø2ùdúaùòì=éËçTå‰ã‚àæâÚä¶åÂåsãläïêïZñéñ„ïäîïGïÀõÂøÜ¼ýá÷£ööo÷—ù2ùJüŠr³¥dþ» ñ  z ¶Œÿkýû&øØù5øjúßûDùÈø0ñué3èï÷ÅøXóÑö­û@üEùÃø=ü’è•Nxä ÉLÅ Ý /› ` ΣŠÅúò‘Y; Âmã(Æ!þtøwôOõWö™÷üùÊù©÷çõÒóåôô‚ðíkì[í§ï!ïŸï½ò6óPöy÷ðîÐò´öîý 8yž Ë Øe¿ˆ/°[ù2ý4¨=/P × d¿¾] Ú dÿ ûA÷¼öù]üi÷#ð«î©ò'ó"ò‡óUñÉòªöù³ú÷à÷eü6@ùÓþÄüõüöÿÙæ)˜ÿ€þ(9Q…oý,ú•úûþ£Íÿ6ùzöqøùbûIþorþAú(õÏ÷ýcüïûšûIûýnþÎþ®úùøÇüõ!ÉŠl®m3¡Õ ‚E 4 ª™ýbãà ±  Ç ª ²ÕÆù[øûáýBüÿüúõûöôðÇïåò¼ñLê‹åÆåã[ásàTàÐãmæÃé™éäóáSÞÀàÕè6îŽò]õÞ÷`÷‰û¦é¦ êZ ôáªfx]~J Bæ^Š 4ö²ÿáÿoþ|wôûô¯ôžö:ù{4þ¤ýAû"÷Aõ÷}úÓûÃû^÷ó©ôÀóºôáüÄ]ää%‡ÿwþÂ}h~  ~ ¦ —lѰÿ£ÿ_þŠ®þÈýmý>ÿ? ÿî”ÿãþ@þÔýý²ü@üpü5üÔÿ$?üUøKôñ©õüùlç  z °¬½@£Î?§a>1w@ƒh·L +0 ³ ² ë fåh8ûžù õöô¤õ¡öªöŒõ?óQò×òUñ*ð¼ò‚ô“ù3ûÐøZöVöfõ›÷*ú9ûùqúáüùË÷wôðõ'øèû=ü';   Æ §/© 3 r vvøþ«úýüæ»7L@/–v1ý÷üä|ý¥ýüÿ üöØòfóyö õ—öuùú÷gôö™úßüºùî÷Åú.þ!†™€›F…V›ÿ Ï ^“Jþ\=Tüùùë÷÷&úýÌý¹ú!ù>ú2úÏûÁý#üGù©øIöôôEô“÷§÷|õVòï0ïXðvîùî©îYí­ð³óÁöÞøÁú£ÿÁð ýÅ } y ° !X/‚ölÑÿ" nÿê>F¦ñýHøDõžó ñï9ïîŸðFòÞõÙõnógõ^÷Ñú}ø´õøP¬Ä™±ÿoýQþ)©*ûqùºü?ÿœ7¯UA   o é W Ù 0 ÷ e _¼ï‡ð먊ÿFd­`cm î !É‹ÿüÓø×÷Vý¦6 - H Q š þ÷ž ­ U |  O  ´&J= q © Û Ò • 8J9i“Z« « û÷&ö@ø§üEþýü^ÿÕÖ]ÿÍýûÇû{úéü;ý üÌýŒýìûy÷ÿóÔôbøöüüBû]ùŠø¬ü½µŒ Eý2ÿ  =û{÷eó½ò_öùó÷QñáïMìãìíˆöuþ¨þ¥ùiô=ó õøÅù¨öãô’õòfïxñwôùø¿õ‡òuõ:ûjý®ø]õÉøûýÂû–øgù!ûÆûòûHÿzg ) 0úØø,ù ý‚©¾‡õbIuÁ¥4%+ÿ>û­ûûVútùn÷5õÆôÀñžð:ñÞö÷ùöPöpöôªö ú\ýCÿ§ÀâÚþþûhûþ»r×'}~‰»Ï 0YNuÚ ½ ëÍ^ þ`‚þcøøBÿðJ ©¢šp ÿ»ÿ«sýYøµöø5úPøèõ<ö©üõþ/úböY÷ëÿ1ù Ò Q J¬å¬ } ë [Û‡\÷òõ¿ž ¶òw9í¤6Šy ‰Q7/ýÎüîüÐü üPÛ ¦ mÀzK/¥ ¤›É© Àr›ÌËhÖå±y)EɉXV ` ó Biíÿúôû ü_ûÌù\ùù¹ø†öâõ¿÷ÐûíüïøTò·ï@ñI÷€ú=ûXýYþÌþÕýkþÞ5¬ýzùõ§ö#ûlaÿàüõûÕþƒÿÊý:ü*ý9ÿÿìÿûàøþù¦þ',AÿbþàûÓùtúäžÎ›üŒù‡úû5ü%ýOüúùÿúƒþBþBstk-4.5.0/projects/ragamatic/rawwaves/Drddak1.raw0000644000076600007660000001225612327014024017546 0ustar garyõ ö‚ø@û~CÍxçÿôÿ×ÿ÷ÿjþ£þ9ýûþ ÿµãX¢UÄ3ý²ûñü‰þ<ÿ ÿ@þ¯ÿEÿ¿þüþtÿÿÅýúÀùúû:ýäÿ´ðï²'вBlÜ»© í : Å È æ •  6ÕÒšÿëÿžj•,  Ê  >N  Ï ³ ¬ ] ` s¬ßâ 5 Ù4÷¦ gJƒÿͪÿÓü®ùæúOýCÿÀæ!6åQ ú = šx/3ÞýK2Õ¬Ø&³6pM$ôåXñ§ÍÝéÿê²…Ñ“{€[\õöý­øõöªô£òîózòwñvñæñtðÒð”íwìWðõúœl%ü9ü ÿóºdM=)ö³ð_õœû…þq¾ÿóËæÂá”éù…þEó÷ð‘öÒüÙùþöyñÛô›õñcí¶ù´ý!õ£ò+ì…ì³ðýÑùµó'ù*þ’üÂüÊù¿÷gúrýžÿHüÕùø{þ– ý!÷Šóxó[ösüXÿbìû © ¼ Vî†öÖüÕöó'ø«²lþ‹÷œôTóêò&õêö¹óñõêû‰û#ûúü úÒø×ýëýÂïó¥÷óô†öPúAOºQmóêW[ ;_M…bÅi ˜™û øhýA "  à † ` €  µ ÿ-ÿ#÷NïÄò‚øhû_øÐó4îî³ôßü¦½Ò°×a " ‡ u a¤2þþ0þý™ýNË* 8_e±i&PøYû Ÿê¥3›lÕšÿ,÷jòÖñ}ô©ù;ÿÊ= ¥ ›¾þja£ÿÕÿÉþFü÷øPó‡ïÆî´îÿïð—ò!ó8òŒòÂõÚú—ÿ¡ŸAÿZü•ûVûËþî…zgD ì Ã?ºØ@  #—ÏýÍüqûúø¢øEù0÷êõ‹ñ‹ëwçüæˆæéoìíníûì¢íàðiñçó/óAñŒïCîëïò÷5ú—ú•÷)óËö%þUU T „ WkL ‚V±cÐÔ‡ þÔŠ0†u;l¯ª þ±ú3öoó<ò¾ôÖõOò³ð îÊï?ñ«ò•ñ¶ópõ^ô†òÃñkðçô*úþ®™þ†ûœû¸þøajsÿÎÿz%·¥0úÛÄ'þü$ùëùWùö„ö?÷<ô¨ñeðî×î$í9ëþïñÍòîô3ó*õÉú”Z€ÿÇþ˜³D#T„žá˜]Žözæ ëmûß ‡ Ë Â d  #П1ê5  K % ³ºr ýÑ¢ Ž\“Îýz ( $ g ™" i ä  p0‰7ê5¶Àå@â+¡ÖY ‰ R QÇ' ° \ á  wbë ŸÿFzøRÍýWü?ú±ù®ö-ó}ñéïQïÅðïí"êåè›èPê—ë…ëõíâï|ò9öcúÊÕ>¤VAŠÇ²]áÒ„ÿ“þÿnÿ[ý¾û}÷áõŠõLôÆö õÜó‚ñ1îÜì?êêdê}é éétë!í8ïˆò9ótòçòàôòöM÷ø£úTüÕýéþ<Ûùá˜|ÝË ; ý r 1 R Þ Ù p g Hª©².ý«û”ø´ö2ôgòèò¨ñSðð¶ñ6òÉõ ôDóóáõ°øú/ûýfÿÍþQü"û]ú<øëùmü<ýçöúa»ü|\RxNpÿ¥þü¢üû½ûòûaùÃùø¬øµøñù+úzüÐþžÿwÿÑþú~ù6ù³úµýÞÿ¶çóìXC¤2} Hƒ  G ê w ‘ëemd[f Ò µä)þo± Ü ž@ # ø ß ÅZºâ «,ÇW¹Ýþ’ýüþÿlnÛÖü›øÏ÷ ÷Øù¶ú°ûèýþþFý{ü²ùä÷úùmüŽT?[.·2 Å Ã ¨ Ú ÛðíˆùýýDû†ûGû®úúû û×úoö³ôsô’öíù9úæÿäb/´üa÷ßõõöQüLyø_"êDoÿýõÿ*>{鳟à—õÿnÿ¹éýH÷,ó!óHõöÈø¬úOûPú³úŠøôØó6ó¦÷ÔüÿêÛ¹ÿëÿVþNþþ=ýïýÐýû“ú§û÷ýÜÿo5ç–³/ýöÿ« Î X 4~ l 8 KþÈþü2û‘û„úO÷uøœø£ùMûAýA"‹þ|ôê;å´ðjø‡ôËÿ? üðü¬ù«ðÒæ}èóýþÞ¥E wµc|±ìÔ­ ™¸öTöüû}'¨%ó!f õŽÿëžØeÞKòö] Yÿìðzò›ýtžÿÕøAòòöúIÿ%Ä?h d 0ýöõ’ôÂóTòþøy™4")¯K €‹ûX 0°‰ už`Y á÷·÷ÕýQý1õ6ímïyüÞ$“‡ý0ýpøQðyï]òæû¬šP6ù­óÀð?òäöWö!ñôèNã+åEé’íêîï òŽöúí2ÿ³ù¯÷õýdÄ Û ä 1÷”G¢ú Çõüi÷üX (Ž Våè„5û.ðjê’í_öýSAþ0úÄüüüÈùQùröëô’õÞõöøHøYúÄú?øiúNú©ýÿ4ÿÿÐaÞØ RdÍTÙ4ï.ùÅË:èõAvþ¨ï:Ö²  ÅçžÉ†ýÜúSúÿÇÌê–þÍoû\ø’ýWÄ€k¨ýëûÔýÁþ>üÝúÕù‹ü°.³ÜpFþ}û•û„û3÷ùóÝóöeø8÷Ê÷Üùú7û<ûr÷èñ¶ð©ôÚõëô~ó;ðúññÈñðÇò‡öoùûú8÷vôŽó&ó õÌõò.ðƒíÜê©èùèñæ˜äÌæ¬éÞëêëÒïïôõèõÓõ¤÷Ûø÷UøŠú”ûûâÿ×þêücúÒúÙüBûçûøýQüiûuû(úôú ù£ù)úýþµ|ËÃôÿ$ÀÿxÿF{Hs‘\NE4I Ì S ‡ Ó   ä bQÚ"; Kñ—ˆ§Ij’XMô—VcìÕx·“ð‚ “ Ç ƒ ‹(ñþ?ý×ÿÿˆÿ¾þÏüžû1úžú–ûüŠþ”0 ž«ÿ¤ûìúŒü 0͘X‚êÄ·/ýDøÔõòöxø]øÀùuøpõEò1ðªï´î¤êêæ3åçõëzîxñðõï×ïîeíoïLðTï¾í;ê1é=éèTéÏìí=ð)ñåò3ò2óQô¦õÝø“ûªûœú‹û¾üü(ùá÷oöMöéøûþÇþpüðúâø`õKôbö¿øÄ÷Ûôðñ‚î¡ï2ò2õŸ÷ñ÷ëöNõJöA÷,øìû ùäøøŠø×ùsü3¤lä`rûjâ ð ‰1Æ ÚqÄTjP@ZEg Â0ľTc·$ < P ß² —  ª ` k Û  Ø ú # 1{ =ÛRÂÔ~…Ÿl2 „ > Ô  ?Vµ{öþÐþÅzB‹ÔϾû½ö8óó9óÚô#ôôöcøGù¢ùÅö“òçñÅñóáøûú¿ùqú"üñN)í†Ç=Ò–†®§:¼ è ‚ ˆvýýýÚýzüùéøºùøMöË÷Hø™÷‹ó¨ïÆíÇì·ëgêóêwê<ìdðùõt÷©ö†óØôjö!öíùIüPýÄþïbÿñÿiÿŒÿÛæ ÎðmàÆ‡»ËÎFèœÿ¡þŠû;ù{ù–ú ùBöròQî»ì{ëÏì¾í–í÷ïïìñêóøó¡òŠñï~ïï®íØìëÒïñ€ó÷Fû*ÿ¯Ë{±”,Ö» |Õ£a„½Ü¯·°‹ ÐÛ ‹ Q  ‹ ½ Ç )ÿ_ýýÙÿ·Mò_»þBýHýnþ‰˜¾E> à £ ˜ Ô  ò à fcÃ~ÖÒ¼QÐRnª “ Z‰ž Ð /4Iÿ¦ÿþ$üûPù'øvøûøÅúü_ýüxûøÆö¦õôxóãóïõÅ÷ôú;úêú%ú€û•ü‹ýUý¬ýòÿ–!À½ÿºpð:xYþvüpûóú1ø1÷oøùÔûNú–ùy÷tô0ò$ðzðñ‹ôõêôïêûèOè ë´ïñïŒíFëéì¥î×ð˜ó;öø ùiø[÷§øyù°ú©ûxûèü®ýÖÿ±:¼þ>ûÚûÃýgÿ6l®’3Iþáÿy÷ëÍ ýŒýjþñÿ»ÿ•ÿ.ÿ’®ÿÃýÕÿ7=P³wÝæ 3  ¦ ’ N ( ½ ” ‰ ¸8 ð « ž ñ † _' ©   z wô X ” é óx“ÖþŠý)ý±ÿŽ©$ÿFû§÷cöíúnütþÂhýŽû_ûpü<ýrÿ†eþ=ý\ýûSû™üóo×XÛÿàkÈ D ¦½h‘± 'Bs Õ¤,ÿtÿïÝ!ï(ÿƒüÅû‰û:ý0¤<@‰ÿ³ýEý$ýæþû2öÒóÒô¬øúÓþ3ÿXýÀý2üýýçýßþ’ÿúŠ×ü³û¿ÿ -]dýbûÆûÛürûúù¨ù›ù•ø6õxôÑ÷ø ùfù†øöõ{õ8ö½øèùzö¡ò¶ðÕð&ððEñÔòmñ¦ñìôö¢õËóòô˜õRôõ ö¦÷JúaþÿfÿMþÛþ7|λ¡w9V€ ÜOõzyºèfueXc=Šÿœþ(ÿ‹ÄÿíÿzÿòxM‹H ’æà öïÖ|0ÜíAå6¢ã‡¥ )›Å|¶Ä9^bX¦ÁýãýÊ‚WjÿÇýžüÇýçyYþŸþùÿ†ÿVþ–ýíýøý‰ýýþ”ÿK}Å´ñêd¢!þºþ¸#Ï©´l8*ÖgwÛ_qÿòþåþ¹þ#üyúÏùŠødøƒø²öŒõ@õo÷)ùãúøÁ÷öËù;û„ûîû^û—üéþ¼þ“üûû?úåûvúVú_ú÷ûÑýMþö%µÿýÿ‹ÿó©ñqb¢7 1Yùé+5ÿDý üÈý}ýÛýÊý`üuüý þÿˆÿjþòÿºÀ0 ‘¡Zó¦Ä¡–ôÏnÕ›um³¼9/•M~ž5ÂN=ýwû“û~üû­û'úBú^ú÷Úö™ö ÷ø<ø™øT÷ õ÷öyøPù»ûü+û1ú>û;ýYÿþœý²ü&újúXüJþþý,û®üÆÿ²ÆìôtMþŠüÀÿDIQýŽú%ø¦ù²üXüèúòøvúOÿPlmQüïúDúû]ü­ýpþüãù¹÷-öôø0úGüüRûÒülþŠ?†`¢ q²3L/m M P ¹ tè w ÆiÑÓ˜ š Ë nW1þ{Ï ýŽú/ø¡÷Âø§únûÌûQúû&üÎýpú"ôÉò’ôgö•øÕû6üêþ†þÓý°ü¹ûÎüNÿLr¦KÿNþÉù á Š d² ‰ @ò¶,¼üÎü8ÿTšâÿ‚£˜Ý `eV¯ÉïÛ:þøröŽú&ýüþÚþrÿá1Åq•þ>ýׯ͹ÌYå¸Û™_³ÚæÛLý[ü;ÿ*pþq¯×ýù®÷™öÿ÷sù¡ûíûístk-4.5.0/projects/ragamatic/rawwaves/Drdee1.raw0000644000076600007660000002203212327014024017371 0ustar garyü…ûDûüþyýü:ûZú1ødõªõ ôô9÷¯üòþfùÚö±÷)øûüêüÑüSúÇý#…H#þhþFýéümû%úvüü4üØúJô†ò®÷}ÿvòr° žìïZüðïªõ ò-¬ÈüÝBêô ñJò|î+îj÷Æÿý:“ÉÊÅ Å{ô«ëÈåÄíðýÆò *@ô‰õtý¤ú!ýý!òÃôGýŸGú÷ü™ûþó\õºô’ðåñrï)ìíÔø[Ê# 6ñ»ægë¹õÒ wôóšùHœ ÂìÎ XþiþüJï§åoã£èô&ý«ûØøWù„Ù „1ü øFÿô ­%¸ (D<El Ï ºÃÿ&ú†ýi.òÿÎýCú½öƒó¡ñ"éPìöB ©¨ ·.‡Æmƒz´µû£ÿXÅ —0"¶3ÏþÛõ îðòüùj§ « ±¡û Ü Ëÿéüÿ„ _C#!| ·B7M¶û~ôöõåù£ÿ¡d âný¿÷úùû2þLýAúoü©|þD÷õqó“îFëŽêRìçð…ó=ïsìíyøV aqÓkûvôAð îóñÔô)ùBA`€ »?gB ûöÿ>¬â· ÞïûÐúpü6ûUóWê—äˆäŸæÊç&ärádß%Û#×Â×ÀØïàØñ4f  F 1 Ô'}û¡ ˆ tEžÌhsÑÓÜúö@åŸÚ€ÔœÔÓãÓ£ÕHÛ™à¥â™åØéøî ò¬öˆø£ùÉùØûo! ¤ _ )µ Éê ky ÿÇö¬Dú´óæð¿õ—ûMûÌý\ ÿ—þ/üñúŠûéþ üûtøàõRôOóáõ°ú#/âÚþ\öÍî4éqé¥ëèð×ø§ ¡·é]ÄJÈ b =*®¿Å¨ óÿ _ýôûlö¾ò)í.ëîQòðæ}ÛqÑÉÍÐÃÙá—è}í!îßòŽùÌï±áü˜N8ânžê ý!ž#wÈþ’ó\ëÌèçöì;ðÄóÞóògñÉòöSûVQÓÛ/åþ h ®¬äžk ^ ž Ž œt0M? ­ ø,óÉóÞøUüiþIAïcÿEý’ÿO·ÃýÂøò¼ñãòíô/õöŸ÷Ýøzö­óðcí ìêÌë í1òújí†! J — ˆ­£s"‚%/h 4£ þ!øÖõ«ðmêÃê“í3ìêêÌæ8Þ÷וÕGÕ×úÞwåHì:óoø$ü˜-k 9\¼‰…! M  m‘_«¯ äõþ ö]ïmì=í2ïZí”îsò‡ð‹íGë;çäåêê1î¬ðõöúûòüýe¹e Ù>¬#vÇnZ LüIúÈùM÷ý÷y÷wøÆü¿ÔÀž`oÎ!þÎúš÷VõþôÐóïô¿õ\ôrò®îfê•é®ëvï1õ ûwб#ÃLÑ V šØÜj!°<Ý=s· žæÿgøXóLñ°ò"ò'ò¦ðÎêâXÜÑÚ¾ÜÞkߨâGåùêõò úqL'5 ȃh‡éÀŸ H²¯€’ æú‹õIóÚó(ó—ö.÷,ö÷÷¶÷ì÷eöƒõÍ÷Ãûìþ¹a®!âøáñ‡ ##øe±ÅnJ•sŽàP“X³o ‘þðL,' n Þ æÔLJ„ÄýÀ÷òwðKïÁòZ÷ø$òŽëÂæIâ~áwå[éïîðÐó#ôÜõ:õÍ÷ùßý ž hmggéz»ê? 7÷Žþ2ø#ñ ìÿîÊñßóÈòXíå—ߌÜúÝiàâÎåcæÜè´î†ö¶üˆÄ SÑþ Ôi=ñ s Š:½é Ä•Cýø·ö…öSø‹ûtýúÿü ù@ù-øõù7ú–ýœ´—ø-=š ³ ­ F ” Z ú q R Z¨Î s - 0 óýiûnûoüIüëýÿa4(¦ Ü Â ô 'á«ÿ³ýÄø©ò(ìèûë`ðŸó1ñ­í’èóæìçé“íñÓö4ù;û¾þlGƾ§ È‹ÔÙÂ<g` Ü h¡Ëû÷÷õÁô/ñ±ðwï²îØì#ç1áýààÚãå³çIêïïö›ýLé îC¢uÿùc‚ÿ×_rÉ w ÊãwüÚùvøHùñþ˜åŠÿkþ)þi Õ§]Ï#Nò†Ó° = A$!n?΋$› µ  Œ d“&}ïd{|d ’ Ä ó ö E™1Ï|ùÿó îÂìTîï¬ð_ï°êÂå^â{àß\áTääé·ëÖñøyûÍüŽû«AÈ ó` +ðr : $ i ëDØýÙù¤÷bôêó0òçôCó’òÀñ©íÙë1é(æ‡ãÙã èFïôSù3û•ûfþÕÉw)zeh± v « Ác§;ð ©÷ÿ.ûƒûjüAýôÿ-ÿ'ýúíúíúE÷õ‰÷œþ°œÂÏ9ƒœÙ `BžÐþ-þÿ„ÿôƒÿ‰þឆÒ7ûþøÓù¼ýûË <ò , ¹æQUþ§úäõMïuî6ðXóéö/ôðàíÒêªê\ëeì}îð^óZö–úoýàèùR{c ’cFGACÿ%éϬ ê#ÿ,û÷ºôòñZñÖòæðkì–ëåëJé9æTæ†èâíÄõ³üã}i<ÔÔ –½—Ï G ¯ * \ Ê w >å=ÿT*ü 5 þ·ýõÑøŒ » <WŒu$ZÅÿçŠÿÿ]\6#"ªPÿ0ü’úìùÞûПÅ1  î è { ›è¸yº´ü÷ÈõJõJõâõ$ò»ðÆîrëæá¡áÈçeí½ð¢ò*ôrøáýýÓý’þgÀ ¶ ¥é8°ç ÷  G §ü÷øú÷§öÇököóøbùÙûÂýcúùôÃï ëšëïôáûªÿ½ÿÙu r ) Œ v ü"÷« UàÊk ° Œóþ\ú-÷Êöýø„ûáþÃÿÍÜZþ|ýÝý?üªýý¨þ}X—ߋ٠&üÖûhùÿøµ÷?õ«õMømý2Šus&Rÿ'úø=ú.ü¨>© T c ž Ç8ãŸFû?÷Sö=õüö¨÷§ö¯ô0òêñÃïŽê€åÿãêãåå&è€ï ö$ýV!þ‡ü§ýaÿ€²V " ©ã¶™w;_ çÀªþ.ü-ùëøbùAû£þ(Eý®öGïˆìÂîsòèøìýþzÿ–ä:•Ê š ËWç…U ® Ä ‰ ƒ ;ÄŸÿŠÿx…ão þ  ¼=Ãÿƒÿ¯ÿ‹ÿ”¾¬:E{·Pÿ6ýÞý6ûƒø¡ö8õBõšõÍöµø‘ü N²þnû.ùeú$ÿ:, Ë6# 3 –nsÉýýúåù§ö,õ3ù<ú<÷ŠõUósðÚí餿Šçõì×õýÚÄñÿõüÝüýÔ$§¯ : ; † § ܰX Õ 7ç8üüö²öú>ÿ3áMþÜü]øyòtí2ìfñøuü`þrþDû±ÿ“ yf—üô ƒ¶„à - _D ŸVÿÌúXùfüNu3 õÿ@3þ´þ¨ÿMÿ7æ‚·®ÿHü?ùÅùzû4ú˜ø¯õöó ñEñGòÃôiö–û…ÜS3ÿYù%öÇøyýÂe   v «ÔƒZ~Šnÿ×úÂ÷"õ’õ‹õûö0öÈöûôdíûå^áâ0èuð÷÷ù!÷™õ¨õ¶÷'úe" ã ‚õ®È t i!ÿŽ e L,þßú·ùøûÃÿ¶ÓhÍP0úôÎô*÷Çüëÿò béÿ'ÿ‘{£ê~þºÿŠ{RxbbÚ« í yâ¹ýÃùéùÚþøi4  )þäúùYü|+Nñïÿ!þÇSeÿVþ†þ&üÿùô>óöeý¤8³…ü6ø6úã|¢  e !ÂpއÿÞüù…öàõ·÷A÷¸øKùðú'øGô7î étéæï ö‘üÉÿwÿ_ü‘ø®ø‚úOýëq ´ ¢ E w1Ÿ  ¤ M7 ER%þçÿ Î¥‘ ­Êdù‘ôôYø ü^ÿ…ôÿäþ‹ýMûûühÿE^¯À•l¤åö½Œ"D‘@üýùëúüuþÿ½ýïåÿáÿØ'8`ÃÅØý²øÄôPòô–øù¡ú”ú7÷€ò¶íììî‡ó±øªû¡þÿþƒû¥øžøSû'ÿª ÛÁ½óR{t.úéþaú ø|úXüýüÿú”öúó¡ðÄïî†îPïdó±øhýKÿþÉþ ý;þis }X5* ×ï¼â ¹ Œ &²ÉüûBý*j 7†ÜüñúùÓûdûàüûÿãýèiúö¿öïùxþ£áüÖýeÿÁ€ãI"C÷š ŒWû:j¤œGèÆË – ã ½tŽýúúçüoü‘ûúûúM÷‰ôñóðõñÅôéù(ü‘þˆýîüû³ýWÿÊ`Ý2Š íFgÿ0ÿ·Œ«g(ÄÿûÏúxûaûzü.ûõú÷xôŽòzññ®òïôðørûûù'÷ö`øxü¦ð~ © m ¼c C•Á Éê¶7¯\?þgú÷µ÷¯ù¹þA¯:7ÿ ýSüªûwùŽø˜øŠû,ÿfþ1ú°ùmûþJþjüpú–úÛýÍÿÖÿ üÌû’û±ý(ÿ‘pKqˆjÿþ›·µw”ÂýMû‘ûúRøùùšû>ü0ù^õ*ò¿ññsóHôÒôTôÑ÷ðù~øÂøÓùÑúéû·ÿèZC_ªÖ|êKÍÊä‹wüýK‚¬ÿ“úN÷*õ_õö¨õìõtõ‡öÜù­ûÂüÌý”ÿð†© l $™ý['c[ï Û Ö  S\°/è_¹”›ÿ‰@æíà¦Úü(áÿŒý³ýý¤ûÒùHùlüÿ^®\þãüHû†üŽÿ ¹u¤H™9-þèþz†ñï8‰ÏÀÁ ,‚ÿ·ÿ¦ÿìÿ4ýþû¥ù÷Á÷’úüzüúnù*ø&õ–ö¢ùòúYû4ýüÙþ¸îiÌ  FK#ñK'c4>h¯ÿ¯ú¨ú[ý¯þü"øOö÷Ýùêù~ù ÷Ä÷ùåýþh/õaä” Á úÙ•2Ï—·ýuŒÓÔKt¾D§vÓ7ÿõýØúTùùÿøBø!úQû™ý÷ÒXþGùØø’ù–úèý3þlüœøßöôõÒöØùPûþ1Ô£EÖ ÃÎÚ8ÇrNûý$øñ÷EùùåøvöËô9òeòjóPóðôÎö ô­óeô2ô•öùüŠ"ø† †¿d÷¯ a½mkyºû¥öì÷ÏûöÿhýæùûöuõæøNú{ûÒüCüPû‘ûFþø×žu<“­ > w ®Wðþ3ÿÆf eI-ýãûûIýá$÷…rÿkþhÿ>Q’ûšþWütù‰ýØþÿY‘úxúÆ\±ü’ø“øqüèáÑüÕðÑì¼ñé÷£ü¢hi»jÝàv GüÿiùËü¢½“Œþrù(ùvþòÙþ5üü3iì¹üÑø:úëÿ0 ;d¾s × Pû¢ËDJÇ圔þ3ÿi†ÏÂü¿÷Êõ^õìùTýC#ýà÷òõ„õøõCóšôõö÷ù1únüBýü0üµþHyŠî ³ ì Ô+¼²¸€3rN ×àÿÈ2  s ê -Þ÷')ÿìý!üíþþ3úÊ÷Hô“ôAöo÷îù¸ù ôÍòšñ°ððŽññ?ðÉð¶òóõCölø ø÷¸ù¢ü»ÿ7ˆvÛ‚ÿ§þÿµAQî¨ZÛ¦ƒ•d•üÉ÷¹ö÷Vûƒ7ñÉ“ª–‚C¥DÄ‘„þ¯ýÊýü³ü ý£uÿ¼üùæú øâö¾öðøHù¾û«ýØþKü¢û ú1üÿLQC Þ)¦Àó‘ g ¬ ¥Pô àÊârÂ(ÿžþÕÿ\¯î23ý ù…÷eøšúÌüŽû˜úÌû“ûúXù`øiøzù?ùhüx)¬/ÉþŒüæüWþxÿëqÒÿàþ‘EêÞõ©Î¢ÐþÍýÀÿîNæ +þ.üÓûeû°ý/!¸üßúøRõÐòêô÷”ü;ÿ_ÿŒÿdýÞýïþÿØ>¾º)MØYøÓsxBûÍþ¸ý\ü#üßÿX2a…_âüvù“ú]üVþkï¼eÿqþfýêÿ íøžãÿjüÌýþ'ÿMc4 c *4n}ýþ9TëØ%‚ÿ¤ÿ¶ÿûÿIýÖüý=[ÿBýßý¶ü ü†þ)þÿ”Ÿÿ û*öLñ‹îùðÄó.öqúNû~ú.ù÷ë÷¯øþûýá XÉ–Zþ§üUû¶þ_ëXvßþ'üPüèýØÿ6Ö¯†üÚøõ@õ›ùeþ1ÿïÿÛþÇÿr[JÄœ¸Ê©Óÿ×höcý+ü û ú¾ûªý¸Ï×`ÿòüúcúÉûœü7ýQÿ3lRÙÿ”ÿ¯’Þh.\ýÏÿû– Y ` lµÍœlOC • ß•ýŽX]9ýÁþ>ý¯ûIùÁùÒúJüÍÿ þÑûN÷môîòåóaôqõñøüû»ýþóÿlþçÿÕßhâBX£õÀ2 z|Ä™ÿ`û¶ú)ûåý!ƒ¯býûSúúÕüêýéýÌü‡ýoÿxÿ÷*¤3ÿ6¬â\L=kp18f/ÿÿ;ÿ þôþ›ÿ?å<ÿ"ýyýWüœýÕ}þrXÿïþ&þÃft`¥´c†{üáúuü¬µ2^>&þ«þ#þàþFüxúÒú¤ûsýþ¸ý[ý{ÿaß‘þ/úÀøáø’ú-ûðûCûœü1ü›þ]þåü‹ø¾ö×õóMôEõù÷äù½üoý¬þ•ÿýêd·ÿiþ¤ÿuÿÐÿ…ÿ×IVëfîþæýXü”üCü-üaûúêùÝùùÇû¡úÕøõÿö§úšÿ£Ï…Rý"ü(þà¸f‘;jÍšñ  ¿ õšh3;#gÿ™-´ÚÆ> à/þ’ýˆûªû$ü¥ý_þgþü²ùb÷WøCøÀú÷üþ#O]x³®¸‰ˆûb„-b¤ïÿøþ9ÿŒ‚ÿÙü•ùù™üeÿ(þ.üÎû£û+û£ûlú,÷@õÏõÚ÷Dørùú®ýŽÝü>þÇúGúŒýŸcB ÿþý*ý£ÿ’? Ú&]²ÿä–cï Éÿøÿ ÿ~(þïýYüËþó¬fÛœ­^ånךխÿWý‰þ=ÜO€š¦ëÿÏÿ*éþëý¬ý ýýŽþo< [Ú]þxþIÿÓÞÿuþøí—»Tÿ‡ý"ûFý g_{bJQÿfýšý£ý›ü|üûBýƒ p•|þæüûÊý×ÿŸ×úÿ1ýÿüUûØø§öö§øsù‚øå÷môñ ïÎñHóðø û#ý‰þãþ]ýúÿÿ’ÿí¶KÖOY”ÿe:Þ * \DàûÜû‰üÏýtþèÿ~ÿåÿ:ýÎûôùJø"÷+ú¾þâ!~nT1¬\òªËÍÕýâúáùyû£ýu ï)[xPD´²­áù ÷ø®þ9ÿ{$ªâþvüÁýG·}ÿ@ÿ„¥Þɺ¯¿80ÙýûpüÈÿO?®½ \|G>ÿ±ÿmEÿDû'ø õ|ô\öcúÒþÿþ¦üøFõlôBôTô÷+ûý¹þAý;üÂûmúÍûJü4ý“þZþôÿ¯þ$üÆýZþ©“{l@\Nÿ~½õ©h2zþöýü¢þcÿÿï©Ì=6p\þ_û÷üÆýýLý!ûüùZ÷¹ü&Aqˆê,þ1üêýIþ¢ÿ¸ƒÚìwýþ˜ý™üxüÈþÛ?I†FÛý6ûpüAÿá ð —Eü$ûVüûÿ¯þÿœüûû:ü.ÿ‘¹bæë·Ð–]Jÿ_þ\üÄûºøÕõyôô‚öøùOúðü û†ø8ô®òÝó÷üoÿ–ýûûdûäûûóþomõ_ÿÒÿEÿæ ª B1; û—u/+ÿ™þþeÿ þ2üæû4û.ûhüzýÚÿ £ÿÚˆ„Âq„ÿÀýûFù¤úûèþ?ýxûÞûjûþþÏþ7bߨÿéœT êLD âLàq‚Aó u9YÿËüçûý0ÿ/|¤,ûÌø~÷Åû`uÉYý úäùsúLýÿ¼è#}ÿ}ÿƒt!Sþ5û¹ûý€ÿeþPü­úÀûé;±Ó™@sÿ}þ>ý?ýmÿŽJ‹ÿ*ÿdý~þ‚íkþ#ýƒÿ—{É“t1À”¦ÿ9þúÿÿ¤ÿ2þ@ý"þÚÈÂaý›ûdû‘ÿp·²§þ˜ÿV"þý)ýÒýzû´ü ñÌ/ý‚ûåýlå ¡ „ ¥¸4þàþ þúÒ À ™þhø©øû›ÿõâ“ý¡øò÷äøvøkútûÇý¿ÿ›ÿ=þ;üMùÍöuõ§ø1ú5üÃÿ-È þfû‘÷÷úñZ‘GÐì ÕØ)wfÆûõ0òô6÷Dù€ûîýNüèù`ôDñ{ó0õ%øBýPÿgÿþ´ýüVýII AþâýCþמÄý˜û8úWý,ÿyytÿ—ûSúøý[.èz  S WŽuy¢ò6ÐÿšþÚüûü>ý°9Qÿnü¼ýþ¨þµÿ‡ÿ¢Óðv‰ÿåüütÿ}Lò m3šüÁúÄý+Ül YAý‚øV÷aûÿ VnIõáÔãþ°üHû ûÞÿ| y Mü®û=þ » E'þüCþ§<‡rrýúìú¢úëù\ùðûý±ÿ+ÿ Xòý‚ùŸ÷øæüƒý@üNû½ú¥úøËøºúÍûðýCþÁÿ°2þÀþ‰ý¾ÿ|#uä…/0¾óÉR±zMzþüíÿd¯F)þgýºÿ¹Úìˆû˜øŽ÷7÷®ùÀÿ¥—ˆÿ£&"N˜¶Ð… Z 3Áÿyÿ?÷(#Œþ‚üºù'ø/ùúšüàýÄÿ8ýúIøˆõÌóoó\öúþ@ð‡†›üºûÄü÷ñn b“킾Z}‘þ"ú&÷£÷bùŠù¹ûûîüvþ_ýýý"ü¸üCùŸùü‡Ìßýñúºø¿ùýCÿ׈…y>ºþ9üóýHý¹>c¨þÛû²ú&úûúØû¯ý@ü:ûNü8ýœýúýû?ùÏúZüþz’.Ùûöåb¥þíûrùøýüý—ÿLÿ£þuýXý—í5 Ä…„ Ÿ o 2S4Õ[$žúþKÿêÛ¤E°°þ¯üûüLüÛþFÿ8±ã¨ÄÑŸÙ<×’ÐÔþ­ýüû‘ûIüþ)ÿÓü¤úºøÞø+øû‚ÿ ; ¤ ˆo¯ýQüÍüÏüÚûtù÷Xöõ!ôUôŽõÄ÷Gù3ûžücûÎü¾ÿ39·<¤º-0f›ýèýýËÿóv½ôíílÿzÿÐ×÷ÿSÿþ ýŒü³ü:üYúãø[÷bøBúaþXÆ+á¾Ý\ ïQ®ìQ‰¡"ÿ—¿L ÿ¬ýújúkûxýÕ´JHRÿåýéüvüþ®2[ÿþ]3[2E]ŽVÆ9ÿïb•& W•¬ývû‘û—ûûNüÌÿšÈ¥òÿ¤ýšüXüý¾ÿ¯ýxü/úœø†øÛü ?'6þ¼þ²Osÿ*þgü ûoúâùÛù²ùÜù¹ûhþÆ¿Þ@ÿ¿Z“.ËUÄÆÆstk-4.5.0/projects/ragamatic/rawwaves/Drdee2.raw0000644000076600007660000002215612327014024017401 0ustar garyù|VÿÐJõÿ—ý²ûAùeùkùÝþ%T4ÿÑÿ3Þ‚}»€Œ™Íÿ&ý þÄÁ,þ'ú¢ûMü'ü1þ78 T .?ú„&u #ý^qþÎóGÿˆötWÕ!_Ññ\éÁêåíÞùþ,=èZˆ ÄýfýÕÿù'úáÞãÂíä j%!­ uùëø(óZóMøX žpãà KW < üûÕù¬íoáãøÁ =µÎ6íá6ç-òú2 R$ rüÖÙrAÃ^ø(ëVåRéüôÕÿ{ Ëâõ ÷ [É{ iõ|æÿáíé®÷'JÐú> Rûõ4øX&Ÿ å A ãp×ÉÖ ž`ýí0å>äDî²üÊ š*2þù÷óÅõ¾ü]ý¦ý û§÷Âû lùZõ ´ëö=æÌÞAá®êúø+ÓÂþÉú™ý{ësüœò²ò¯ý å !´Ë˜øêóªõaû«‹r…¨üê÷æù=ú¯û®ü øÓòêã¨ßãÓí±÷(ûVøõôAð_í‰ï?ôIúÐþøyý¢ùíûg3Òõ²üvø úô  Á >’• ó   ã Svö^ð¾ñ°øþÓ # ÿïÓäáŸçGðGöøjùÆ÷_õÑ÷(úxÿm×þ‰ùÑõÍó:ôPû¾\ ²Œéb Þ à7R¬ p š ;ò…õù½òIììóð+ó¬õcô1óäô%õ¿÷¿øWöò¾ïéípðõÎüq“ ˜ • 9‹pÿµã 7“òáa3ê¼ «4þ«÷ZîDéñé¶ìpðÓõøpùr÷‡öLö÷5øõ÷ó ó@ô]÷vþ¬¸ Ó … ÿÝøUñŠí…î5ñõ©üÎÇ þd;B>Õ ©G½ý ƒ”h Jîùñmì„éºçéêúëaëGêÝæÜéÛðÝ÷ ÿÒÿN÷™òï8ïmô£ûX‹ ¯E¾¡Ú H ˜  … Ð OC Ò Jõû~ö ñkí‰ë9ê4ìñsö]ù ÷bõòoðDï·ïÎò÷ýÿ½€Öþn½Ë 6O÷-Ò Á½íuünã xÌûÏôï?îëðíôÆøßúÛúéúÒù@÷Pöôfò:ò¯õ0ø-üª— ý  Ð@…3„ÿTzØ ¯‡M ˜V¹ÿˆþ ®¡ ¸z}ûsù÷e÷ëù‚ø²ösòÊï¶ííYï ñÚõ ÷OöàõVóÍó]ó¢ôÁöãùûüõ| “Ã( ‰JÃ;ï}åÁ)V;ÿJûHõ¡ñçïYïÚò¾õñ÷w÷Ö÷Ðôlï3ê£èœê2î-ójù>ûTû¤úú6ü†ÿH}øü B Æ (Ö  zlLó ððý#øÖõ[ô,õùö©ù²ù¼øÈ÷üö¬ôüóñ¶ð3îýï6ðFòõ‡÷Ýûûnû1ýŸ¹­‰e ° &µçcö(û Â ê ž 7Ú6Ú }LÈÿ8û¶ùrø›ùRù\÷¹õÚóÕô,õºø»üÿEÿ6üPø õÛõƒöløûûòÿá3 kËDÊT?H ûŠòàl “ øý>ú#÷Ø÷OøJúëýëýòû³øXô3ñ,ïîïBïšñ<óÔ÷4ø7÷'õúõ¢÷–ú)ý(¿³jŽ`dp  ¼¨Ç èÀþ+ü›ü„üçüsüEüŒüQü!ûYùzö×óËòøñóð¹ððWò>ôœõð÷ëùúLúñú ù øŸø÷€ù<ýÖk š mÅÙ’;Òa^Ça&ýûüWûûoû±û?ø‚ôBð†îyîðñ9ójö=øsùNø(õ©òÝðòîêîîðºóÛú ÿôŸ = — 6Ä2 H # Ú! c câÞm ÿÜ«ý©ü ûþý+ÿzÿ;üîû@ùö#ó¥ñ0ñóÒ÷_ú÷þÿkÿçj ¹Î°¹ºÇ € ï ô v4X® × 7<üæûTúyûšüRü.ýtüºúT÷ÐôüóîóEòØóçó¶òÉòŸô ÷XúšüÏýÓþÄþýýŒûáü.þâ¾ñ ~ m _ ¯ A†Jøb E ªWÏbCþåÿsÓöÿ‰ü±ù ÷öŽ÷RùÙü.ü_ûcø~ô¶ò1ñ¨ñnòœôÌø,û—þÙÄ_Š<æ S Öh Ä JŠ ¦   µ †ý®û ûÃüªüúJ÷õìõ°ôªò ðÙï%î¤ïzðñ¥ô/õ ôzõQ÷]úHü€þÉ TUÿ£ÿ5CuÛ  ƒ í%Jý/'Pê¦ÿþjüðü/üšüƒýJÿú^¿ÿ2üÍù¯úÓþ[A¹ [ i T ¥ ^ 0 ;,l|$¢ÿúýžüûgúrøóLñaðšðßñóòôÖù û‰ûh÷ÑóïTëLë5íœñ–ôÏ÷¶ùÒû™üäþ&S"Iñ  ] ¶  l 7 2 ë ² ƒÃÍþ‘ýû¹üý‡þ]ý'úJö`óšñtð¼ñBò­ôý÷»ú8úIúåüÖþØ ÿÕþýEü|þcÿ£·y _ ô W @ ?_I’‚éz³¶ ›Ðÿöúpúoü¡ý9üÂûbø1õ-ô¬öÇ÷,ö¹÷žø÷,õ¬ôÓõ6÷sûºÿ¡÷ºÚ×Aç AãN'ü¯o & Î  ¶ P‘,1‚ý¸ýeþÉÿXþ2üÂýüû1ûûû¿ø¹õòjð£óõùñÿô¦vцt³Vª Ä ^ p “ h Š r X ¸‘s’ våþ þ÷ü¨ù‰õó+òÁòñ9ñtóô2÷ûLþcþbûÌú˜úû©ýtý¡ÿ²õ { @ · ª \ dUÈÿÿó•U¿²»ñM(ý^üñþ)ýøükúnø÷¶ö¾öòøÃúEû+ù¾÷ôÇô¢÷ûåÿ\ÖŒcs"&OÿÙ…ÿæ%/ÿ¶©ºÿýü‚ùÚ÷‚÷Øø£ú úKùíúKûüû–ø õòyï\îHì¢í_ðÐôËù—ý>ýËÿÿRÿrÿþÎÂÓšGư¹–VÕÿNÿR6S˜â\6ý;úVøÙ÷°ö’õiõŸ÷ùÍûËüÊü@ú…ú½û<ü*ÿ[Õæ ã ü óˆ ï Õ' : | U < øjSì žþ£üKûdúÂù©ùŽùÙúOûú÷âö‰ôZôcöqùû}üÎþÛ T !KÞY—7ô t  Q ¡:êbšboÞ B6÷þsúBôëóôÍøÞýcÿÛ³M–¶6™„V}µÍW88:ÏX¦v.E+ÿøþrýôý¯ÿ þÆübøô_ñÎðÀðuïùð^òÐ÷@ûû¶û\ù“÷åöÁõèöþøßú{ûÒý…þ–Âýo Òõ.Á¸Ú_ Ç Æ Tù‘ø4ÿxý ûöúÙùjø‡ø(ùúùføú÷õ}õ8õö÷¡ø÷øõù%ú+üäÿkÿŸþÙýDú÷Ð÷÷¿úzþzÁ°.^î®gXùÑþ™üïüâü@ûKû$ù9öûôëò‚ñkóLö_÷©÷Jø˜û>þ‡fÊH9nX¯Ïîò Ø Ú H Ü º ! ï x1ç»<ÍFØ£Xþ!û‚ûùÍùTú•üþ¸NþzúâùsùêümþŒHÿÁÿñAþ ÷ ù Š 0 ç þ ˜ ‹ Öt‹ã!ÿxý´þ#þýLû„úø¶øðúEùÜø¬øáù¸úcù÷õôÙöÒù&ùÎù¼úìüþ˜ï þûÏü†ÿ,zIš·Ùô þûþ+þcþ½ÿ=ýòüGû ûOü½þRÿ.þüWú^ùqùïûûúßúáúpú5ú–únù÷Æ÷Æøzú"üƒýrþP:t¡’Gžðžÿ‰þ£>ÆåÂø-gþôý”ûÑûú=ü ýwýÑýÕý˜üsúÕùÔùùxúû úôúCúFüÊÿ¼†j < ð á ËàSݳ u Á ¾ –œQÿT þÓþ[ýýü5üDüý]ýÕýPû’øÇõúó¢óDôp÷cù—ûØþ¢,ÿ€ýòý[ý5ýÙÿñóÓÆáSqë‚ïWõúÿ!þ•þ-þ$ýÅü‡û ú¸ùq÷¼öU÷øa÷à÷ ÷õùùûÓýÚý±üIûÈû\üýªÿWÿÎÿåí‚Jížj¶ Ê þ˜þüÉÌÈýEÃyþ„ýQýÆÿ}š®þËüBûü!ü*ûÜüYý¾þcý-ûÈûáý‹o鳄ö"_ÛºÝyçùõÑÜ £ómˆ0Šv(ü€ÿ¡þÎþ«þ'ýýtþ(þ0ü÷ü¬üQý‡[éÿuý7ýÔâ!N>=_´bub?Ȱ–V«MÿÉünûfüþ‹ÿ£ÿtþýûïúú;ú úñù¹ö«ó¼òÉôLöøùù¾úsúëûÛübýÇ"Ybß'Ga"-ø|®Ka¯¬ÚáþCý ý þÿ?þ¸üuúAø‹÷N÷OöÎ÷%÷Õø¤úIújú³ûû úøùàúaý[ÿ‰[J¡’z;¢Õ'ÿFþ]þáItÎiÿßþuüzútùø•÷möè÷bùâûìüûüáü²ü"ûùá÷Sô§óöö2ùkü2ÿ.×0 Ëc+_Ê3|š¶³ïtU{€(ýîý-ý§þ©Ÿæ•ò¢øùpÙ_þ½ýwþC9Uþ¶ü9û‘ý\ugAþ²þ¤ÿvÿÿöÔ^`Ç r pÛ}fž&Ë'Jð·,ÿxûù¹ù¬ùgùùiùLú1ûXýþ{ÿ&ÿÿá'u6Çÿ½ÿ|ÿ³Aã³RÖ‹Ù¾¼ïýTõ¯ýC®‹W,þQû}ùÁùÕù¼ø@öÕö¿÷Çø™øÎù ùóûûsûOûüBü"û«üüjüªýeþÄÄ”©ë_õ¸cD1ŸëäTÔõ¡„ÿ–þùÿÿ3þ¨þýRýVüñüwü•ýŽþìÿVþSýtþn¹+ã9}GÿƹLi±Ÿ :À’Žñ„.þý>ý›ý”ýüjüjü¯û·úìû;üüpýoþtþ“ý6û¸ûâüÑýàþoþ[ýÏÿ1L>ÿˆÿ iàH×»'ãnCKM%ó­ÿLý„ü)ûáûiú{ú—úøó÷ûøúRü}ýúä÷ õ“öyö¯÷øøªùEù`úûÝü û-ûLü”ÿGGøýRëCnülsŸŸ|öHâÿ^ÿÿsþÏýÞý’ûuù—ùéú¿û3û&úÅù–ù'ùÖùùúÝüuýOþø…Öî { ­ RÀ‡,t–n’h$ÿËýÏüÇý|þ½‘ªtþýñÿ%5!ÿAÿ þPþ´T4õ™LëÆ\¾Rð¶—h3wÙAÿýú·ù‹øëøòùÿúÏùù_û8þëþ”þ’ýlü‘üØý£ý¦üµü«þ41åãWJ|KìnæßþúÿíxMŸÿ‘þÔþ|ÿÿÁþ©ýãý‚üûü©ûÇûûgûöû©úKø¹ö–ô³ôÅö÷ø»ù ùNú'û?ûûnü¨ýÈþUÿÔÌéÍŽA¢Ì«–ë p‹¤†ÿDYWÿ¥ÿ9þ3ý.û—ùe÷öÖø ù?ú\ùø)÷qø`ù)øþú!üþzõ¯) ©ôd$œaþ¡þhÿùý ÿZ£ÿžÿIþ½ý‡ü]ü¦þ†O¿ÿýÉüåýýÀþVþpþ´ÿÐÿõ~yz!(é Ã0ŒùFltÿ"ÿ2ÿàæ&y, þªýéþØÿ.¹¸´ÿÛþÍü³ú–ù’úúÔûlü üŒþÐ6²(Y[à-YU3«žhñ"ýyÿ >ö¬Š˜ÿÄüþû…ú‡úeû`ú]÷Dõö÷ùú„üMüêýhüuúÈü?þ$ý®þi”ÇÿPæÊÿÃ"Q6ÿ<ÿj‚Sÿ9ÿlÿ²ÿÿLþGþöœþ ú'ù÷|ö²÷Eö)ôèõÊöCös÷ìúAýÿ&ÿ’ÿ§*•ÞL ÿaþÃÿ%ëì*£Ç[îÉŸÆ8.⌠þÂþaþ¾ÿÚÿJü|úùšû¨þ¬ÿèÿíÿ$þ¼þýÇç !c¦r ±Å1,yŒJÎÿKþ[þµ’%(¨K5ÿsþNûóùŸ÷ñ÷øùcúùßúyûMünýÃþ×ÿ#ÿÿOÓò¨å3U›©ÿpþÑþ›ýéüßüéýüÕü§üÄüíû¾û_üÞý²ý=üûØû[ú_ù÷âø0ùzúû€û€úÿú¬û9üÒþ€O¥WYß^µ­þ¼þóÿ¼ŽÖ¤¬Q]šÎ€„÷ÿ#þYüÊûHúdøzøTùÔùµø¨ùOûDþÿ”þùþ’ÿ¶œZ6êUûæn×B – ‹ 7æs¦³ƒ  JZ“ÿKý·üÉû0ùEøEø)øNúüÆþqÿûÿàÿsþúþµþéÿ—$©†Vb~ÚBʧ(ÿ/þ=þÿ©ÿfÿ&â}­OæÿüÈûŽúzúAûRüýýëý¾ü¢üXü+ü[ýmþ4þàÿƒ€•OHJÿüŸûÿý$ýÛþxÿ/JhYÌMRø¬ÿÉþ"ûŠùúù«ú3üýçýXûBù¥ù<û_ýâþ(ý…üÉûCû•ý{ÿÑ¥ÿ¹ÿ*þ:þȳ÷ÿ•ý,úxù·úúüÊþ>ÿWþÊýåý“ÿGÿƒÎãØEÿàýøû"øÿöøõîö<öÖöõõzöîù¨üúþÄÿ‚þîþ¤(±ŠXÿ…ñþ`!x®e/r°ã—ˆlr¯çSÿÆþãÑ®úÿnýÇýòýÐý°þ+þ#ûñú>ùlù­ûüÆþ­þ¸ý ýTþnÿ¯Gþáüþû<û‚ýÏ'¶Þ¿Þ Ñ ì · Ž  Ò•—áþýÿEÿûCYÿ|ÿYÅhƒþSýkýÿen‚®¯µNÓ¸ªò)þ ý}ý¹ÿà””îÌtàtþ¨ýû¢úªùöòõªõÀ÷øŽøïù øùrûaý_ÿÿ`ÿúþZýþåg²èÿ$þnÿ5ÿcþâÿU†ÿþ,þƒÿh¶UL·üBùZùUûºþnÿ<ý’üü”ý¸ý¬ý•ûÜûˆü·ý¶ÿ"ÿ4ÿgÿþQþ«ÿ1‚ÿýòýÅþR1¤™}Ì%Òh¹ÿñþ ümûÜû¸ú?ù˜ù#ùKú›ûôþ“†µþûù›ø©ø›ù‰ùÇùcùúü>þWþ¿ý\ûåû¤ü\þ ÿ<ÿ4þìþ–þÿüÑou—çrÿÿþhýÝýüúIørùû:ýµD„ÿæÈMlÉWtäAÿ­þkýÆýlþœÿO2´§Ûÿ™ÿ‡ÿœ–Q´%IÿÕÿTÿÞ@2%)ÿ?ýû7ú*úûÈþ!ÿ?ÿ"þPýÌýXýVýýIþÆ%ƒú 蜒­& W QŽ‚Ô8‰þµþ¨þ"ýtü©ü£þ oyŸûÁiR=>*UÎ\Ü H’oÄœ žÿÅÿçÖLÑ@3ÿ‰ýfúªø“øùÜûÍü ûËüJüÒýrý—ý¢ý­ýdÿ>ÿ9ý‹ü³ý G3>s'íþ9üúÊùUøûù£úÁûÑþ $þÿHÿfý?ûòý þák™d‰¼ÿ›þ>üú ÷ªö´÷¯øPùúiûƒûúóûûãûßûºúØú²ûýxþÆþŽþ ýòÿDw§ø§Îé'§Ä­ Bñÿ@ýLü}ü{ü·ý¨þŸÿ…ÿNýqûµû%ú£ú©ûoúøŠöÛõá÷¦úvü¯þÿu7ÿóÿàˆÿ­þýoý8þ(ÿÞ ­ÿšÿÿIÿsþ²üúOù¸ùãúù—úüÿ3ˆ°Š+?¹%û&Öó‘š!]³ðbÒˆ:à5£Ùº¶Cÿlaá1 ëý ¨pÃÿ§ý|ü—þHõ¨.Ë#!wk§5þÿä±µ_V¯ µ ¡Ã3žžð<f?‹ÿÎi‡*ÿmÿˆþ“þ”ÿ3þ–ýCüwü‡üãýêÿ ÿUþäþ«ýôýtþ‰ÿÝÿûÈt …Ý-:~.Ñ÷ã3;ÿ*üúüÉý·ÿLlöÿµý—ü¥üýeþßÿbþ¼ü°úÛû5ý€þ¿ÿ§/Úøÿhüìú÷ç÷·÷¯öã÷@ùCú¯û×ýý–ýÀþýküAü ûÿû/ù÷vöµ÷_øiúmý?ý¸ýMýÆüEùÅ÷Òö*õ¿ö÷¼ùÐû·ý¨þÕÿÿ þcý\üÑý‰ÿÿ矊ôŸ¸¯;…mi–į}2äöœë!þÏþˆþÔÿ.þeýõý¬ÿ+O ÿ™ü­úâùyùkùÌùzø@ö ÷ù©úûYý¾ÿþ®ýÔýûúêü7ýTþ[þšÿDÿ´ÿþ[þ1úÿúüKþfý—ýüxüÂþÔÂÁS*:àK3ÿa±×åѺ|9ì\þ ý#ýþþmþóÿ*ÿŸ5œ™S™”Åý¯üQý6þ­;L,6¦þEüúøúëû­þy³ÝÿÒþ=ýÈýü,üü~ü´ûíûOü‚b à   (ò®Î Âs¥Œ…–©þ4û@û5ýþ«þ•üøúPùÎü)BeÏr,F«ÿ¼üJúøú$ùçûEýBZñeÛ1¿—ž*/ˆë—Ô2/Šò/º¬ÀÇòÇ)=…†à ùÂ\? ƒþbúÜø%öµö÷1ø4ù¦ûüôý×þÎzàÍŠÿîÿ¸þÕþ±ÿ±ÿÈÿ”1G92þüþŸýWü0û[ûÞþ<õ²%s#ÿ*ýªûŒú[ùÇùûþñ1ÿ‘ý\ûõüíþk<1ýÓüGûßüìýæþ¬þLýwü¢ù™÷V÷ºøÞùm÷Êö‚÷$ùû™üûIú\ùbøÃø¢øÜ÷ùöÂöm÷ºùøüèþèþ<ýSýWþ³ÿ¹ÿœÿ'ÿóÿÿ(ÿ z«ÿ%ýŠýýoýÿÿLÿ®×”¨æ*äBb5íÿÎO #Ë7ÕUÿ#üPý,ÿþFþü\ýö!4‘èæ7„Äj£ŸãÒƒîHªxýçÿþõñ##Uþûú»ûûíýŸÿÃÒFÁ£ < Å ? « oÈ)(<Cú6zŽgþdüúüÐý<þÕµ¼‹NEJþúûèúöúCú¿û€û!ûòþ´Í^þVüÕý/ýÓü!úMùÌúúý„LGˆÿRüúeüýÔý§ûùùQøCùXú…ûÅýÿ@"=®{þ‰ý“þ<ÿjDþúý]úªù<øÐö»ôÆõ:ö:÷™øTøçø·øœùßú0úÙüQýýºüµû3úú‚ûýýqþ<þ5þGþÐîJÿüüü¹þ—ÿÇôn„0ÊþYý+ü)ýXþ ýý8ýüÞýyþþÿ>^”ÿ\ÿÿ¾ÿ-þ¾ÿÍ·¨$‰ÿúþQü€û'ûZûrûHû¼û}ûZûpû9üþÿ;ýêúkø÷Ëù´ûúý`þÿªXR–vE~2а¾n=˜§¬!ˆ¶™³íæhœÖóÚ%«¨l>ÕL“èÎÞuÿ²þ…ý ûŒûûký þáÿúe½Ÿ¡)U)Ý4¤œ¶k/qé×'‘¹­ù?‚wÿ#þ9ýû ùÀøÁø¸ûþìN5 0»š¦ÿ%ÿ,ÿmÿûWîUÊ¥mþ¯þ«ÿ¼?KòäSyj¾ç³´‰fY!I6 V)Ф,ÿw|Ó*¬Zß'ƒÿþIýýþþAþÈþÛþ™‘{ÿÍ#ÿuþ›ýíüòû¢úíùqùuúÂù­÷¤ö½ö¸ö÷øÌùšùø÷öõ÷¬øÀújûKûûoüœý$û™úËûµûìüü9ü3übü`ý‘þþÿÿaýEûVú”úëúëstk-4.5.0/projects/ragamatic/rawwaves/DrDoi1.raw0000644000076600007660000004645012327014024017361 0ustar gary0ÿqÿpY±÷{ÏÀƒ2ÿ]ø^cJÓåI`ÿýÿlÿ¤ÿvÿ‚ÿÚÿÔÿÅÿŽþþþØþ·þ¼þùþÑþâÿ¥ÿ¦ÿ‰ÿ ÿþèþ´þaýùþþXþFþ-þ^þoýàý}ý­ý–ý¬þþ2þ~þçÿ+ÿç³Yÿâÿìÿÿkÿãÿ§ÿGÿuÿþxþ—þÌþxþ”ÿ=ÿiÿ«ÿ…ÿïÿµÿBÿ¬ÿè‚Ñ…ACŸô«4ÐW½ÉÞµ¤™FÿâTsÿÁ7qÿñ@(ÿ~Pÿ~ÿ|ÿ©JÿÛþ[ÿÀYÿ‹þÿ†þÎþcþÅþÏÿPþÐþßýìÿ%ÿþMFÿþþ÷ÿwÿµÿVÿ¿YzTÿŽÿ‰Xÿþ›ÿJÿÿíþ‰ü ÿ"ÿòýþÿýgÿ´ÿÓþŒÿ%ÿ€ÿ©~þ©®T³Ú$[+u¿ÿòуê9U5$"B? \KC¡þ±ÿkÿát‡PBÐÿYwùÿ¼9kTÊÿ‰Jÿ½Ãÿðþàÿþeþ›®ÿüÿ±ÞÌþüÿþüFÿŠÿnÿlþ¢þýûþ­ÿm;ýäü”þ­ý¼ýþ0ÿFýgýþý]ýµÿyüsüªþ·Ïûü†ø³ÿ‚ ë÷` |ìÐÿXüãýþóëôjñsI —áQ Rå÷ÿé× Ý©ï"åÈônGç¾î9ðë2èÿ×ùFþ-þ@ÿô×eêæ ÚõÏ‚öR ¸ \ýþ ÷ú$ÿ ®ž„«ÖY%ÖÌvÕ‹ðž çõ#-ÇCy‰y Ù#êG 2€?Ñ ýŸõÀêðc °âçìoÜò‰ÞáÏô(í+ÕшÿáÑv÷ýrà{âþàLÝÜÚµØÖØpØÖÝ×®×üÙÍÝùßÕã,å“èíÑðÿóâô»÷¥ûýûIùûûìîKüʵŒl*&3!&/&+.‡4w02Ë4T4]4}4x404–4·4$3w2t1A0'.8,Ü*”&|Ò ³%A*¯O’ V’ÍO§u Nb j ¸ ¦sùÿAýúT÷XõÕôqñ@îÈêÀçæIä±Ü—ÝMÞÐÊ}Ä‘Ì}Ô<ÖÓ¼ÊãÎUÚàä"Ý’Þ¦æ¦é ê á]çÏò¹éÉê%ò8ìà2æTë/åßDÖHÖÙÙÕ0Ô¶Ô÷Î-ÎÐÔ5ÐÅÉ)ÕÑÜQÛÉÞå߃åcêÄðÄùûüRöHôÖû„ÿÉÛ  | Wk AÄ tcéá÷µôõúüúóû•­ƒþgŒ&Î “ ½ • É ƒ¯œ¶!0F**j/;!÷%H*A-ü~$èüþÙ³ * 0 Õ Ð¢cøiqFågG ð F¿ª qñ† !« ó¾ü.ÚAr$ g( ö MýmsCûôûEü>û8ýöGÚÿôÇûòªûdú5üËýyúvøxùÚøÈ÷AöÏönö:óÓð>îþòØïãîMîûévæ4ä›éEéºèëRëÑïðyñ®ô¯óËô9ô(õó÷dûyÿ}þþsÝŸ¹ÿ»cvÿž” rÇÔz³ŽwÄ€[µ0R جÑMS u&.;Áì3BÒO¨; ©+Tû¬B& º $ÞÚ É › žý Q‹ ÀÌ D Ç ÷ J ” AÎ ×_j` = ™àª•é Tý‘ýkHz™^ÿMüÑýÃüèþYþoý»þáûãýAÿûýZú¬ùvöáö¹÷ðø¿örø€õíDíÙïAíçè+æœè“èæçåå*â°ßøàŠàÝàMÞwÞ.ßïáfßhÜ:Ü0Û·Û¾Þ‰ßÜÇÜ6ÜÝ?ÜÃÛÛþÚPÚ?Ù½ØhÙ ×1ÕRÖŽ×ÖíÕÈÔaÕ.ÙÛ€ÙU×—ØõÚåÞèÛ«Ù5ÜÜòßÝ{ß«ãmÞÛfßmâ\ßpßêáàތ߮ãþä©ã@ãà䔿açñëãíôí íMñÍó/ójñÄó*÷D÷ öÝóýô÷ìû÷hóP÷¼úˆø´ùŽùösö‚øˆûzûÅøïúÿ2’Ñà2†  " ß«+DzEåErZßû”‘±„`‡[-!Y$#%Ã%Ý&m&|&¾&(ß,­)ü,f1e0”/‹/v2K3ƒ1í0Í.:.ü0û-â-È-‰+|+¸)ˆ*)à(ì&`#Ï%,$r&*#e"Ó$ï$ù(Ž$"û*-(ê&Y(”)Ý&%-&±%Â&€$¦ ¨ Ò#È ¥Ÿ`¨¶ûq†‘ ü  ¦ ž R Ú 7  ! ”É ¶ óÃòÛ evÖðç°ÙíI“ü÷ú„ùæýöþ¢û¿ú«úþù×ûùÐõâø[ö‰ôà÷nõºõêöòøø­øCö®÷H÷>ù³û»÷¼÷}ù-÷M÷7óèñóìöòöí ð¸óïWíìí.ë(é"êíëÎèhçòììCéóêéîæÐèwìyëàíXë0éIëˆéZçªé æ×äGåŸå–åúæsácává‹ßíÞÝZÝÀÝÃàÝÜWàçáúß+àÞÝà?ââãæåä‚ççlæÔæâæŽå ç¢æ2æ"æ¸æmè6åäÖ倿±åÝæèê_æ›å`éšì@ë¿ë ì!ï…óKóbõrø‘û]ý»ýìÿ'šòô 6 S : K + ÙçŽÎ# Ó¥ å ã»5x³dÍ/¶»D]å“ cç!4#S%"×$Ò%h#‰!’!¬#8!!¯o)'\q—êL¸£œ9c÷Š}¸#à\l 7m‘y6>4XåW 9 ; ïøm9 /´ùv#‚ëjK.µò^«§1=Œ<JÞ»#ÄÿrÿþÒýéý!û"ù0øQ÷ôÁõaô¹ñ¼ô9õ¿ò×òzò¨òCñYð$îÇð­ðRðfñÀðð×ñSð‰îÓï™ï?ìmëVêÜê{éCènçlå…ã ä1äâsá¦Þ1Ýøß@ÞÝ‚ÛýÛÛÛQÛ¼ÚÊÜ ÜÛ0Ý›ßÞ5Þ ß=àSß=ݪޜàŠßðÞHߥßûÞRßoà™àßîßÞ|ÞÓß¹ÞBßâàââ5ãAã®ånææhæÍè@è½êëòí…íQífïJð_ðæï|ï€ñòló'ô.õ‡ôÒööMöwöÂöÉø úòýÓý þ2wýŸ¸æC … i@¨ ¨y§2A·;¦«2Æf# 'û !†!_ö w"ê""w$%­'3'&í(7)ù(Š'€)#)Y'ø&à)[(ö&u'…'&‡#ü!ç# "o F› …nvåC?‘äj´mä™rŽçÆUI…UçOhë 4 ó Ø ø  FP³gÜ ÊL`,¹Êš+RþWýüIüHüùçø›ø÷1ö%ôAò®ðŸï ï†ìòëëIèiæÝç$æüå‘ã³ä?ä:â‹ánâ’áÌá’ádß«ààãÞÞÞ§Û.ÛˆÜÇÚ#ÙÿÙ䨭Ù0׈×4×òÖÔÕ¾ÔIÔ¹Õ×ÔFÕùÖbÖ£Ø‰×æ×ÙÙ°ÛÚÒÚ3Ü/ÝBݳÞÅàÄáá½ã1ã¸ããìä—ä×äùä¦å äÈ夿áææŽæýèèòé`éàìí8îFïeðèò“óbõ“÷„øSúŸüþÿß}nå2þj  » Ì  Ú¶T~á·¤L/p¤^3ê1ñÆ!X"ì#±#Á#§#Z%n%¯&o'‹&&¤&’&P&%¹$ó$V#š#!$…#ÿ"-"å#O#%#ˆ#¬#V#"8"’#"ñ"j$#™"#$$$´#ª""H""3!!Û!0ú·%rÂ6±™:+–G˜:º'–ß{p5çýV Ý É §  Ú o/á¥GgÿIýü¿üù‚÷Óö•ô:òŽñðOï‘îˆìYííjêÈêyê^è°è è©è§ç™æªæ å&ä/ãöâãâiáaà˜Þ‚ÝtݰÛÄÙ­Ú¨Ù¶Ö–ÔîÕì×!ÖÔ?Ô›ÕFÔ;ÕÕÖ=×iÖ”ÖÀØdÙœÚvÛ Ú’ÚÝܬÝ<ÜKÜÝBÜ­ÜËÝÉÞÞ€Þ@Þ[ßzàMàbá‰âáhâOã‰ääÃåwæ¼è¥é:ê1ëcìtìÛîðñ¿òZó¿õhõÙö\÷ø›ù°û+ýüÏþ޼lM¡lmð~ t ‡ À ŠoO=Nïfµ(²â!`¡ÿ3 F!Ð r ¬ ' ˜!"E"!z"¿#T"Å"ì#¥$$$B$&%±&&&å&²&i%m&A'M&%Û&l%~&%™##‚"«!¾!ý!‘¸Ã†ýÔt$Q†½†Œr™U,lÜ2g­=V û ñ |ðh‘DÿÂÿXýGûaûmù8öŸö‘÷,ö<ópñøò9ð{ïFïsî3ícíëÏêxê!é0ç¤çšç–æ%ä¿å7äwâààßÝWÜmÛÇÚ£Ú'ÚVÙ$ØËØÆ×ÛÖÑÖ×”×§ÖòÖ•ÖkÖ××׀دØyØ/Ù9ÚBÚÙwØ©×ÿØLÙÙ.ÙiÙùÚàÛ|ÛÛÜAÝ/ÝÆÞ?à0ßãàþâxâŽä4åßç çãèèòëë†ìJííËïïcïÉð¤ñ¨òGò®óÒõöH÷øøNú‹ý9ýhþFÿ¬Ã¹`èŠ » K ªÅ«b^¸'1 Å£Ëú®ŸQ«{#”·ÒÎýß!l!º" "z#ƒ$0#ë$z%Ê%$Ÿ&Y&Â&%à&f&·&'&'s&ï&0%}& &ˆ$å#Û#Ž#ü# "“#!#•#"I!Ô!!¡!b W‡,Vc`N³ÞB—FƒEW*üxª}D C B ѵwvËÿþÓýûrú^ú ùˆöÛõhõô¶ò ð5ïRï„ìáë%ë~êWçÆæOæÍäÿâñã‡áëà/à8ßÝÊÜxÜ¿Ü ÚúÚcÙ@ØØ“×¢×*Ö©ÖŒ×$ÖiÖ¨Ö{ÕëÖÖ—ÕáÕúÖÖáÖg×BÖèÖ׫ÖðÕ¶Öæ×v×3غØÚØ›ÙâÚkÛ†ÝÜ\ݘßà¶áâ*ä"å‰å;å|è¼éÙê6êäëÃììRíîwïÍðÛðàò>ó…õöö:÷{ùrûžû‚ühÿ‡tö÷ _ž   ›T¢¢£? ¹)tºc~x·y#É¥§Cœlª!_ Ì! #î$G#e#·$ô%#á$ü%ñ$ã$m$#%u&’$\$,%(#¢#$$+#V#P##Þ#)"]##e#L"s!ü!Ë!äJà7ýMCçö¤T÷mÃìZn‹yG/ R † 0 bâ1ŒmXþÆýÙü[ûIû2ùLø5ø öÛöœô×òìñÃðpîííBì¢ë7é¬éèëæÚæ çäÆâ÷â®á¸àƒàuÞÑÝÝÝ|Ü'Ú½ÛnÚýÙ5Ù(ÙfØtØØÈØO××ö׃Öö×ÃØR׌׻Ù^ÙÒÙÙÙiÙÙÂÙÓÚ†ÛmÛÜÝ!ÝÝ ÞHß/Þìà%áƒàààòââÞä7å®åbçèôê"ë)ë7ì¦îïïäð7ñlóÈóñõ÷¶øhùòû|ü•þdþîjœÎ23 ^ Â Ñ ›-|B”z ÿz¼®C»¡[î½,nê ‚Ó!P!í"O"Í"q$$Ï$”%¬''‹'í'2&»&¼'5&”%Ì&5&R%°%P%ð%D$X$ó$ˆ#8#d#–#Ï"]!á!Ñ!!!` ò # eÁæÉ$N<v%¨Ö|"÷ùñ: × –  îLù²T÷‡ÿáÿ"ýáû¹úàùø÷öôúòÒòñ‹ð4îñíìÓëÜêézèSçaæIåä†ãKáãâ-áUßzß2ÞèÝæÛýÛAÛÙÒØû×øØ ×ñ××× ÖìÕîÖ1ÖÕxÖV×_ÖŽÖÖÚ×ÖÐÖàÖþÖñÖõ×ÜØÇÙ6ÚgÚùÚåÚýÛËÜûÝ1ÜðÞyߕ߬áã‰åä±åvç_è%çÿéÜê÷ëhìCíàïÿð´òIô%ôÏöø>ùúûüýíÿ*ƒ[¦$Eq ì € Ä -P/ɲ‘K—tfL‘Dp Ó!] /!‰"q!±"º""Ø#v##/#¤% %$]$¡$­$î%G%†%¿&˜%ì%…%é%¯%q$]$Å$‰$ $~#"ß#”"º!¾!— !2ö=oiÔ–¤£•N´sŽî”ñ}Hú — ` Ê } KŠ&¤ö„'þ‰ý‚üûú-øÐöUõÏõzóœñÁðºïìïí0ëYêÜé½çèæ—æaå¸ã±âøâÆàÙà|߸ݛÜÐÜ1Ü ÛNÙ•ØëØ’ØQÖçÖ(ÖˆÖ2ÕÔ¼ÔñÔ±ÔQÓºÔÔØÔ°Ô€ÕÖcÖ¸ÖA×QØQ׆צؾÙÙÆÛÜ ÜmÝ­Þ Þ'Þf߉߯ßxàÆá³âããUäŠææºçÙé’ëIëáîMððìò†óŸô™÷^ù[ùãû`ýþÿÇé«5bçÊ~À Ò Ê É ³>3ƒ]ăŸi˜¡©Z_]Dõ O!e!¶"*"o#W#¨#’$œ$¾%$ê$%o&!&¡','s'9'v&ù&ô'h&ƒ&ž&á&G&–'q'-' '%&4%‹%z%4$A$#Y"f! ß v +yM†uKŸìb>¤Ã3¸¡®÷  ñ Ã͹?ñ÷ýþüËü ù¡÷µöŸõVóÆòðôïºî:ìyë>éééŸè$æøæšå ä¨ãRášàbß°Þ¦Þ!ÝÏÝ)ÜÚùÚ¦Ù¿ÙRØî×fÖ·Ö¨ÕÊÔÅÔéÔñÔÕ'Õ-Ô÷Õ;ÕÐÕÔúÕ‚ÖˆÖ ÕyÖ?ÕÐÖDÖâ××âØ¤ÙKÙ¾ÚÕÛ–ÜOÝ ÝÎÞ<à8ájáÛãääãå©çTéùëië“ìXîî©ï±ðÅñómô¤õì÷ÛøÚú^ûâüßþe¸…ãfJ ½ ø  Z@8@ðâ|FúHT/æ°Ÿ8í Š!D é!œ"Î##a$P%&%±&R']'r'_'|'ˆ'ë'´'·'t'?'''&Ü&?&&x&&'%†%N%J$~$i$[#¯#`# "Ï"Ÿ"t!C | ™®ÁUß Ijñ½ÐQj¨ · ™  , ´€[ƒú1eþêý<ûÒûúÔù{÷‚öõbó­ñÊñ>ïÞîí`ì™ëê é†è’çDæ=åRã.á”á¥àŠÞrÞ*Þ-ÜÛÛïÛŒÚ!ÙHØÚØÅ×ñÖå×ÖfÕÎÕÍÕöÖwÕšÕ"ÕˆÕjÕ¤ÖUÖÖ%Ö˜ÖkÖè×'×±Ø&Ø.Ù Ù×ÚOÛ+Û¿ÜHÝAÝfÝóÞíßåàÉáÁâëãååælçdèoé°éêëìœíÖïðÅò*óÂôôõ·÷…ù¾úüþDÿM>A-†¢E ¡ 5 ^9z­¶ÝÝò=êc †‘[åž» $!&!x!ð"§"´##"#7#O#Ó%!$Ÿ$é%ó&T&—&&±'' '+'°'€'š'Ù(H(Ö(( 'n&ô&\%á%$Ä#»#$"˜!0! ‡ù© Âì'(R®7–ÛÚ½ËÑ — æ Ïâ|Ï.ÈÿeýµüSûÍúâøÓ÷fö=ôÈó©ñÂð¢ðîÔîí ëÕêVé-ç»ælä ãîã(ádà“ßÙß/ÝêÝpÛøÚÇÚðÙwØÞØד×4ÖžÖjÖ^ÖÖGÖlÕÏÕñÖUÖ‡Ö“ÖÕãÕÆÕ}ÔæÕÕÖî×1׌ØØ?ÙÙàÙ¹Ú+ÛÛ·Ü=ÜóÝÛÞ“ß`ßòá?ââ@ãþäßæièwéAêÖíî"î,ïŸñEò}óþö÷øûû•ýSþÍÿ×µž{‡®TÇ 2 œ ºÝ©Z'˜¥¿Dºf yÙØó :!&!ô!õ#L#ç#˜$°%­%z&X&Â&§'M'q('Ó'Ï'Ö'¼'Á'¯'c' 'á('(';&Î&.&%l$Ï$[#µ##9"µ!¦!o!*”'LT8¨¡0þ_¢4Ü#ÜT± á = »ýèðÕ“f ÿWþ2ýuûÖú$øŠ÷ õüôÃò»ñ¼ðîíäìêIéŠèiæ¥æåä=ã}â§â!áß^ßgÞgÝ|ÝÛÛÜÜ<Ú¿ÚÙîØdØ`×ã׉ÖÌÖMÖ*Õ›ÖÕ§Õ×Ö½Õ¿Õ‘ÕùÖ/ÖJÖ»Öõ×~×åÙÙ²ÙÙ·ÚøÛŽÜÝÝFÞß6ßß»àöâ^â:ä.æzæ{èÅébêÚíkíåïdð¨ñšó7õöøùòû¨ýlþlH¹Dö/( g ’ Z ‚5d{GnCÝ5°Gv;æE«ü e Ë!b!‡!È""P"y#˜$O$©$ñ%k%[%½&:&|&’&Œ'&¬'0'Ž&é&·&%î&K&+%($v$¾%¹$÷$J#í"ÿ"v!| Þ Vµ¬7ë 4 sjG¬çÍT0lQ&X] õ Ð –a9«ʾÿþ@ü™û[ùˆøÅ÷_õ’õ óŒòcð±îÊî>ì8ë&êèéèÚçÃæ‹åÆä,âÑâ¦ášßìßFÞÚÝãÜ„Ü1Û-ÚNÚØ}Ø/×ü×*Ö­ÖMÕªÕeÕrÕÔ°Õ×ÕÕ¤ÕWÕ±ÖzÖ’ÖIÖƒÖâÖÐ×,×l×ÙØCØïÙXÚ­ÛPÜÝ)Ý!ÝÄÞÞWß×à•áñã äØæ?è>éãëzìqî!ïÄðSñòòáô$öö‡ø#ùÈúòüðþ=ÿoºúµÅ * ½ D4d1YÐä ›:hv˰‹Å* ™!Z"r"œ"¸#ô$$~% %"&"&=%õ&£'t'µ'('î(L(O(µ'ú'Ð'R'&È&&U&p%%­%e%Š%¹$‘$#¾"€!ß"L!‰ Ò Ž¢ôµX/¬ëƒê=óÌ Ð  aÈî  =<=þÚþüÚû`ù!øH÷†õ‰ô§óšñœðgî[ìwêêéíé>è<ç6åãäüäJãâàßßÞßÞ-Ý)Ü=Û·Û:ÙöØÚØ*×…× ÖxÖ2Ö8ÖÖÕ†Õ6ÕBÕÔìÔÜÔ‡Ô—ÔóÕŒÖךØwÙØòØîÙTÙ[ÙìÚ‘ÛbÛµÜcÝsÞ»ßR߯á"á(âHãþäRä÷åÜç3èé2ëì±íÎîÇðmòóæô–õØø3ù~ûüýgÿ™Htv•9 Æ C £ q«¾Ç}’ÖÑ.õ|F™æ^ñ@ê à!/"$"õ#\#Ü$3$ $Ô%$ã%!%I%´&U&2&3&ò&È&k'c(&&¹& &H%|%¾%Ž$ã%–&%à%Œ%!$´$C#é"ý!è ¦þ7 &í-;^0À·š¶¯¾v ò ­ Ú › F¸— áÏs®þºýûpùõøqöOõHôò"ñï½îyí$ë¯êÌé•èfæÎæåhã¨âxâáCà{ßìÞãÞIÝE܃ÛZÚ‚ÙôØÕØ ×Ô×XÖôÖuÖkÖ­Ö€ÖYÖ¥Ö†ÖuÖHÕÍ֓־֓בØ7دٕÚPÚWÚ•ÚéÛÛ!ÛqÛñÜHÜ݃ÞTß&àTáââßäkåGæCç«èÄêJëïíoîyïÌñšó3ôkõË÷yùzúyúñüŽý•þ®ÿÈ ‹MïØÙ Õ ; õ ÂÿlyÈÃíÒ6‹×\_ºÞÊ|‡Ä /!""P"2#.$$Œ%/&','Æ'~'˜'0''S'W'ë('û'Î'â(.( &þ' 'I&d%Ô%9$ß#ò"õ#?#^"X""!V •‹"N8ˆmµ¿;ª¸à_Eû  a † sÎZäælÿõÿý?û’úbøŒö¸õ“ôwóñ˜ð‘ïBíYìFëÝêfèÃçèæéåoã¹âÁâ!àÆÞõÞÚÞbÜÇÛûÛ}Û$ÚNÙÌÙGØ-×€ÖÄÖ„ÖlÖDÖ¬ÖÆ×Z×ê×Ê×i×H×ÖâÖÛ×P×Ñ×Ç×òØØ'Ø]Ø«Ø÷ÙÚ)ÚwÛ}Ü_ÝÞyßlà,áããœä‹æAæýè ê3ì>íînðñ"ñîóôNõLõý÷xøíùþû ü<ý‰þ« k—Eà  T Î $ sÈÛå/ëw~»`ŸOwóc‹¯ O Õ!˜"H"¦##L#å$l$à&o'2&À'/'­&ý'&ñ&c&†&x&‡&Ž&\&?&&/&%%C%$‡#û#„#"˜"!c!( ÷¼ñ•²Êó{JòœêCa ž P 9¤Iä³þÆü¨ûùàøö¢õ^ôNòøñâð‰î¥íJìëéÏèjçpæƒäýäDãÞãuãDâwádà¦ß”Þ)Ý;ÜšÛñÛ9Û`ÚáÚSÚ+Ù1ØVØ×ó×Y××'ÖØÖÜÖ¾Ö¬ÖÂ×%×ª×Æ×ÝØVØåØûÙ…ÙöÚ%Û:ÛµÛùÝ ÝÒÞŠß²à4àòâ'ãä ä[å'æçèé ê€ëÂí îÌððúòCó>ôGõÌ÷Aø¨ù±úìü”ýþÿU¯ð}pÇ· Z  M t ©)b…¥ÝmU êD, ò  a!‘"9##j#…#©$J$–$ã%‘%e%ƒ%ï%º%¾&%Ã%’%ù&+&&D&A%ë&9&|%é&%ç%D$ï$Ø$O$Ÿ%$$D#§"t!V ù-å9‰µæ…8 Æý x  pö²—–—7ðÿPý#ûù²øm÷õ‰ôóNñËðnïàî9ì³ìTêíéÇèÎçvæ+åRäžãäãvâ­âáXàß)ÞÝLÜ-ÛZÚÃÚ"Ù¤ØïششØdØØYØ6×ö×è×à×ä×ÐØØØQØÃÙJÙæÚÚlÚòÛ‡ÛÆÜÜ3Ü>ÜÛÝhÝþÞäß´à§áÏâãäÊ壿‡çžèjéŒêéìíHîïØð½ñËó>ôtö(ø&ù[ú†ûÊý þuÿ¢qÝøb‚  . FAÇŸxÌà¦03ÙÌz„‘¸p m » ­!c"l"h"¾#°$e$f$õ%½%ª%–%Ñ&'&C&~&™&–&ø&ø&¡&a&’&s%Û%Þ%Ë%U$Ð#æ#O"!Þ!š!B ìïÜ‚øì0†¯ƒººð}Ýo Ü _ xË'R þ¢ý'üúíùhøöuô¹òßñ‘ðïˆîÉí¶ìÐìaë‡êCé3èæ`åä~ã$â áœàùà ßÞ#ÝIÜ›ÜÛJÚêÚ£ÚÙÑÙ†Ù ØùØþ٠ضؽÙ'ØöØËÙ5ÚHÚ~Ú"ÚÍÚÏÚÚCÚºÚ¸Ú²Û(Û³ÜWÜÖÝUÝìÞ[ßßµàðá±â—ãÓäÔåcæÞè/éFê'ë¬í(îˆïÈðÇñ»ò~óôôæõø÷Æù2ú¡ü'ýTþÅ@®ê9Õ%5 B ¿ 5 ¬CœšrN Èb¿£•{ŠGöÕ£ ' ™!C!¶"/"—# #v$%$¶$ê%N&&o&:&K&c%æ%<%?%$œ$¯$“$¹$‰$c#é#˜#•#7"{!Œ! å 3h)¦C`by—Òneî°EZY Ø ) Û á 2ÌayŸÿý€ûðúŽù1ø÷6õÎôÉó™ò1ð»îìíáìjêÝêGéçÚçˆæ5åBäàã{â¥âUáÆáàߎÞÑÝËÝ?ÜÅÜPÛçÛèÛ¶ÛLÛÚºÚLÚ4ÚÚ•ÚØ*ÚÙØªÚŒÙæÚMÜ.ÚåÚ’Û¼ÚçÛžÛåÛºÝ ÝãÞ°ßÞëà^àÍáµâÇâ°ç(åãäTè‘æ×çïéÑëîíñíóî‹ñµòáó'ôêöN÷ø1ú ûCü þ™6ûx¼¿±® J I © {¿eIœ±ô§ì÷ÉŒæT„!HýW#=®"²$Ö#f$|&z&˜%n&'%F$$œ%­&l%¡%t&Ì&0$•%å$¢"©#"¬$ß%÷!>"Ù$`!Ñ ¡S!$ g’ލI^ß Ehõ·Û>Ô + Ž ,4õ¼gâôþ®ü¨úFúgø²ööàöôð&î î¸îÎìÙìzë”ê;鑿Àä©älåNã@á§ãäAãßçÞÄßLÞmÝÝsÝŠÝÚùÛÛ©ÚÙÖÙËÚ Ù$ØÿÙ)Ù®Û@Ú-ة؋ÙzØ/×õÙgÚTÛ-ÚµÚ¸ÛŒÛÛ8ÛÛÜöÞ)ÝÞ¥áá„á~âûäLã‡ä*æ”èäéªëníHîõð¸ðÓñ]ò#óŽõVõhö”úJüèý»þ#ýûÿ ¤Gåë Æ ‡ N & [ $ŸéV¯ÆMuæ¼Úcõq×uG  Ò !E"Z#("Þ"ù$b$D#ö$ÿ%‡%â%¬$%%é%»&t%¼%P%W% $$¼$Ó$$3$@#¦"‡!¥!J ȲüFüXžïú*X㔊·¬»z²Ó - ¹ ¦ b æûç˜_OÿEýŽûùŸ÷löNõôóRòØò1ðÅï`îOìŸêÿê±éøééèYç!æ¬æäµã€ãâ"á àuàß_ÞSÞGÜôÛçÛ‘Û€Û8ÚòÚHÚÚêÛÚiÙ}ÙØòÚÚkÚ ÚòÛTÛ}ÛžÛÆÚôÛ'ÛïÜÅܽÜÀݤÞËߦßÊàŽááÐã–ä„凿HçgèBèãêNë»íŠï ñòó)óìôaõ`öÊ÷ƒøÓúMûü’þxÿà3Jt®âT G X /iR”ZµçÉ“f¤ruÆÇP¡ b !9!ï"•"Í"—"œ"³#t#Þ$$Ç$X$F$v#V#{$K$ #¼#p#©#h"ê"¢"x"–" !{!4 ¡ c È ë !ÀiààìfŽC>©Ï"ºéÇÉ  / o O¿? —]þÿžþØýÓü)úñùÛø†÷Röõ$ô òþñ–ð ïíõíìOëêdé[ç˜æJå¦ärãÎãÃãâ€á¶àÆßüßÞnÞÝUÝÜÛÖÜÛÛŸÛ!ÚÎÛÚ¸ÚÙîÙûÙÐÚÙ¬ÙåÚCÚÚcÚòÛÆÜdÜLÜ©ÝEÜÃÜÎݺÞ<ß2à®â.ãäUåªæçmè èŒé‡êXë¿í6îï+ð*ðòñÑó#ôVõ£öÒø‹úûPüºýÑÿIœÈf%ˆî - ` È AVÑs=·uiS¬§³=T?,±«ºø é!¶""6"Ö"Ú###7"Õ#@#‰#Ç#z#“$#l"Ü#;#"ä##!#f#B"º"£"+!{ Ñ ³ƒI_ÙøµÝsrAjtSú„ `  A  #E½ôÊÿýãý:üPúêù«÷ÂönôËòÓñ¸ðcï‡î­íƒìzë]ê‹é¯èvç‹æfåqäÇäããMâwá_àVߥßTßÞµÝØÝFÝÜØÜÛÉÛÑÛ©Û2ÛOÛNÛÛ)Û Û¢ÛÏÜxÝ!ÝëÞÞÞÞ,ÞÞ[ß&ß}à<áá×âHâ­ã"ãØä“åååüçCèJé`ê`ë¦ìÎí¦îÌð4ñ2òMóÖôüõþ÷|øúúIûü­ýâÿ @®4Úþ A 7   ßA¦©ª¯Ãfö›;{Y‘6äŽ1ýÃØ  J ·!!W!o!x!ø"¯"z"r"¢!ø!`!!!…!‘!!x"!§!‚ ý ?{ýdLµãú›O6‹´yȺÓU2i ö õ R ÃÆ ÍA4ÿÄþQüÝûLù¿ø¡÷zöõ_óòò:ñJðîÁíþíaì¹ëêTéÆè¶ç’æÑæ#åxä·ãÈâÿâ„á¦áàß§ß%ÞkÞGÝßݨݾÝ~ÝÜÍÝ Ü¶Ü‚ÜïÜôÝ$ÝJÝ¢ÞÞbÞØßCߚ߬߯ßÐà+àsà`àÍáEátáúâ˜ãã{äGå[æpç˜è°é£ê³ë“ìñîî¨ð%ñòÜôwõŽ÷øù.ú9úšû&üýkþÇb–¸H|Ö œ Q 3 F ÊÙ½4ë5.ÏÃÌ£p ·°qþµL3¬r1Ó p!G!["'" !&!G!}!§!?!y!Õ!µ!·!Ë!d È ”éµH10 4ûØÿê|çPZ²çžähGLWî ’ š H þ ^J€R1äPÿþ6ý üú›ùqøB÷Iõ•ô`óJñÛðØïÓî£í´ìÔëÄê‚é·èÚç½æ¨å±äÉäãÓãáéá×á¾áAàŠà6ßZÞhÞKÝ¥ÝWÝžÝhÝoݪÝéÞÝºÞ ÞÞ$Ý›ÝÝcÝ€ÝÙÞÞ´ÞÂÞ•Þ´ßߥßÎàKáSââæä4äÏå åâæóçÞé1êRë9ìÀíÉîùð~ñ…ò÷ó¿ô…õ¬ö÷løøÒúûQü%ýþ#ÿ¯õè9#S¼Z ®  R B*Ìò"Q,‘<éé×\ÿ É [<¬#”§[é H ‘!*!!l!ê!}!I!= ƒ  ãÝŸã‡þÚÉdD–üˆ¦ÿŽ$ ªÆWà#~óü µ ž ¿ ¿ W<m>Önnÿ…þtý1ûÔúhù5ø@öëöõóµò¢ñªðÈïÅîÝí¾ì¾ëºëêXé_èÇèiè.çæéæ•æ#å‡äãäã«âìâá½á?á!áà°à_àßß[ßAÞ}ÞÞdÞšß:ß@ßQßWßoßžß÷à3àÜáÛââÍãã¤ãÍä§å3åÖæûçÁèzéJéÀê²ëŒìJíeî*ïFðAñ ò$òÙóÙõöX÷føaù­úû1üPýyþ0ÿ’å‘ß´þþ—Î æ ( < Ó É‚R$.'!f1¾Jd5!“wv] NcŒÆÃÐDXƒZåtެf–¬€˜O©ç”´â¨Cô~ãnw‹¢ö°~V3]@1 p v L £Ä†"cl‘pÿ þü‚ûTú+ù8øn÷Uö1õóÃòcñ·ð¹ïýïfî~í«ìëëøë1êféÔé-èç¦çOæŸæåƒåDä•ãÉãSâqáÊá,à:ßÝßšß2ßEßfßGß%ß ß$ßMßU߆ßÒàIàÀàËàááá|ââRã ãŸãîäyää`äAäuååÖæâçªè½éïêŠë>ì@íîîßïúñ,òDó†ô¯õ„ö¯÷ø ùXú…û§ü’ý þ¸ÿªÇÛ۔л  . & ˆ ÿ ï3—‹)Ù‘ML3÷×CÉÐd9õfº£×ô$.jÆë X*”j ôÁ"ÏXGÜ‘÷PºAm„À«#¬¯‘ŒvbUK â w ÂP§4`z;WHÿHþJüßûìúÜù´øÁø÷…öµõxôòåñrïÐï î¡íííEí)ì»ë´ëWê}ézè…ç±çæSåÒåPäìä4ãûãâ½âiáïá‘áIáàýáááHádátáqádá á§á¡áÛâzâ©ããðä^äÖå1åPåNåŒå׿dæÎæèç^çØè=é êPëTëÂìÞí{î ïïÂðÇñïòäôô÷õ™öŒ÷„øoùkúiûMü_ý[þ$ÿ!ÿñ\´³` R j ; … |ƒçźòâž4º5¨¿ ©Û¾5}u4§ç`IŠ ;C]¦¶Ã(?§÷ìÐíâu[þ†ˆ¸ôi⨠x †V…‚€ ò ô Ê × ´½ëÂy’àÿÌþøþ+ýTý5ü‘û–ú¤ù:÷÷öÛöõ<ô£óÕò‘ñ¶ð¶ï»îÖîíaì»ë¶êÄéùé`è¡è0ç×çDæ«æ#åñåoäêäÄäËä“ãàäãÌãVãeãuãqãJã7ãoãjãŸã¤ã¡ãÀãŸãðä ä#äbäïååtæ.æzæ«çç´èYè¼ééIéêCêèë±ìší‘î¡ï)ï±ð_ñòòáóÎô’õföu÷HøuùžúØü'ýIþþŠÿÿ·µé½;¦ÿ è æ N Ò  õ ÙÛ¡glS±ûm1¿S%Mùмód²2Š¥òRí=ZéVžj7þž)ö‘, á}×}ô(€ú•ЫÅ&å[t  H ] ú OŸ¸Ò&Šrd¸±Êþúþý¦ý:üOû^úvù0÷õ÷õ¸ôwóÝòxñFð…ï‰î¨í¹íì·ëüë_ëêqéÒénèàèAçåç¤çFæüæÃæ{æ}æPå”åTåä$ãÛãcâÞããŒã~ã|ãÌää>ä0äNäkärä ä÷åxåûægæÿç4ç#çhçäèéBé›éúê›ëfì&ìüíîïï´ð^ñVò¦ócô^õù÷øzùËúÓûŠûåüœý—þ¶ÿÛûÞ[4èªc(Ç ¯ A ü Ö R YEèùâœkqð¨?¡`"}-{|ñ{Éú\»Ìžs†¡ëþ ›Š†(ž5ظ©d8°çb¼É h”é‘€ Ö  a 4 üÌÔíVæy;îZtƒX*ÿýþüòü'û‡úØùßøž÷ÃöýõäôãóçóTòÆñàñƒñXðzï¿ïmîªíîíÀíœíì¤ìvëàë‚ë—ëeë>êÏéÕéqéèjè3çäç›çBç æÍæ¹æ·æìæôæÜæøçSçLç8çiçUççÜè:ècè¬èéé/é¡éðêjêÏëCëÓìYí í¸îFîêï¦ðtñ)òòàóÇôîõÉö^÷CøVù8úúöû¥ü•ý”þMþ™þèÿŒ&œpÕØ•xy >  ò ö ý ¬gÃg-ó¢V{/-ªæQÓ Âf¢ô% È}½Q›] •U Ùé¿së‘û.’jÉ”R2ä´ƒ?™× à ) ¢ 8 Ÿ € âÿ()`V\seÔÿ@þýuüÄüûzú©ú#ùÇøØø÷_ö¼öõCôÇô]óÌóPò½ñôñ ð{ïùïhï*îžîípìúì…ë÷ëlë'êßêiêéÁétéè¹è˜èrçèç³çÏçç·çÀç»ç¼ç}ç”çÆçÿè}è¦è›èòé{é›ê+êÊêûë­ì$ìDìeì°í5í¸îoïkðbñ­ò‚ó2óñôƒõõhõÍöq÷Pø_ùBúú—û-û§üüðýåþÿÒ¢”žB °aF31ù Ô ¢ K  îÍsØM¿-]ÛG¸/”÷M†Àñ J“ÂÔÄÐ価¡WÂ~rSåÈ›yW ݃Òt*.æ6ž! . ¦ ° Ï + Y;r­¬ËW˜Ž2¼ÿæÿ7þÕþý1ü¡üû‚ûú¼úùø÷õéô ôó™óò~ñÜñiðœð0ïéïkîóîuîí€ìñìñìÑì§ìYëkê¿ê[êGêHêOê,éÕéÎéréMé\é&é5é>épéké]éÊéòêEêÁëì~íízíšípírí¯îdîõïˆïéð$ðÊñSñýò†ò™òíóó­ôzõ-ööÅ÷J÷êøùXúúÕûæüzý5þ?þÍÿh%Ë¥iJìd"  a Ä ´ $ ¶ I § J ˜ àlºëyì2Î×ò \ˆ»ÿùa±¶¸³û7.Úü}hXVž¼½–8ΠKÂ Ú ‡ à _ Ý / ' (~&ÛŠ‰=ljÙ:¼`ÙWÃ<ÿ×ÿ_ÿþÇþ;ýSüûIú{ùxøÏ÷´÷Gö©õóõÍõôvóøóVò¹ò(ñçñiñ2ðßðEð ï…ïî­î?íúí°í:ìùì®ì\ì)ìWì*ì ëøëììì ì8ìQìbì‰ìÓí"í>íÐî{îÈîøïUïïsïzï—ïºïÕð1ð]ð€ðµðíñWñÔòMò¶ó5óëô‰õRõúö¥÷÷ýøéùÒúûdüüÙýáþxÿÿÿŒÿ½¿lú¹Ü€R_Ö‚%Jø w × x ¢ k ‘ þ : ê y ¿-}Ê0]­¤ w«þb¾ªmȹû‡¾ìäøØZ½ ¯e /Ñ” ¬ c @ ð s ü è © ì s Ç Âa!H Þ=l®+‹ì«~ÿ8þ7ý¯ýü´ü)ûZúÑú#ùkøËøQ÷«÷"ö“õßõ^ôÆôóyòÃòHñâñBðùðØðuð4ïÑïuï(î×îrî]î2íàíðíäìýìÉì¤ìØí"ííÓîQîŽîCîîzîxî“î‰îŠî£ïï]ïÓðJðïÒï¼ïäðXðÇñ\òòŽóó“ô,ô–ôòõˆöNöò÷¬øUøóù¬úú°ûõýý‰þ/þ‡þ€þÿÿwÿ´gÿYøðr×\ÀŸ_퀦  f Õ  V É  ` Œ É ÷ n f Õ üO½Øí*¢ôuÛª‰r*É{[ÛÙ ½—* · ¼ “ Q   Ñ ~ a  Á µ Y  Ý Œ H Ö cÚöÍΉ+Öj§A Ð%ÿ˜ÿþ{ýÛý6üçü´ü}ûÌú×úùøYø÷¬÷Vöôövö6õüõzôÅô6óÏó`óGó òÜò¶ò›òÃò òÿóFó>ó9òwñßñ¦ñ…ñ¸ñ†ñEð÷ðÅñðððÜðÃðŒð ðïøðGð‘ð¤ññ5ñGñ›ñÑò7ò§ò÷ó`ó™óÄôô~ôðõvö%ö»÷C÷^÷‘÷Îø&ørøßùyúúœúÙûPû¥ûëüaüÞýýäþ+þ·ÿÿ˜[°…ëmÁ Fžð^ñ*£DŒ5¼T¶ 6 ‘ Ô  !  \ à  Ý ˜ å l ² › Ô é0:5 [’¤Y ê z ÿ  & I ` d ° O / M ¾ ˜ · – k T ; Ê ” À ¨ . ³ ¯ CJ¶)õÂ_ÅnÒ‘´Fÿ«ÿ>þ½þý¬üÿüqûöûQû úyù¨ùø¥ø1÷Ù÷t÷u÷+öûö¥öõ¨õ,ôµô©ô¤ôYô¦ôÒôÇô›ô;óÃóVó"òÌò‚òSòñÉñañðõðÄðÚñðèñññ+ñbñvñ¢ñúò)ò{òÉó9ósó¤óôômôÎõõAõ ôûôëôúôðõ,õÎö%özö×÷5÷Ÿø-ø¹ù9ùŸú)ú]úªû^üü»ý9ýÁý¢ýÅþþeþÓÿGÿ™>½RÚNŽÃ Ž’ëœm÷› ( ì  á 7 Å  # J   W Ì & e D   ó ' Z w ¿ Ï & 7 ÿ ( r š § ¼ œ l u f _ m A é ” ! à Ÿ E   ³ X ü QÜâaÖÁS¦£7¬^æ¯,¯‹ÿ:þ©þbþý¶ý$ü—ü'ûÇûlû/úèúúmùûùOøé÷Ü÷÷ö¹öÎöÞ÷.÷öÒö€õéõÒõZôæôyôBô+ôóºóýóØó#òŠòJòMòFòLòeò¯ò¯òñóó8óòïó¾óÍô3ô8ô€ôÚô‚õ õ$õ™öŒöí÷÷öàöÕöÓöŽöâö×ö÷÷‘÷¿øeøÝøúùCùJù–ùÚú úÃû…û¹üAü\üLüŠü×ýDý³þþ—þÑÿÿ¯ÿ÷wÏ~ÌBé*Î~š+}½Úïd °›7ïú    < T & + ˜ ° ò 3 @ ° Ñ E | £  . L u [ z ê C \ ! ð ½ , | Ì h , 3 ƒ I   Ä ’ q é¡G ïj—íD倘 ¸?Þ˜’+ÿ¾ÿ³ÿUþØþÄþ­þfþ!þ*þþ þýzüçü…ü*û¾û,ú¹ùÿù]ù+øáø»øm÷ò÷döÖögööõæõ§õ­õnõôíôõõõõôÀô¬ô§ô°ôÕô¿ôô¡ôºôô‚ô”ôzô‰ô¼ôÃôæõõõ-õ\õ…õÓõçöö)öbö¡öÓöö÷÷A÷v÷‚÷˜÷Óø"øVøuø˜ø²ùù{ùÀúú…ú×û(û^û¬üü´ý@ýÝþxþÙÿ4ÿIÿÿÿrÿᮯsPÌ×ñA¤Íå SÚo´Ÿƒz£Û–ñ3tÖ k µ à A € À ë   " [ ª ; ‹ g  Ç H á J ô ¶ ˜ ¡ « ´ ° e ˜…w=2éU&Õ°nôŽ »™U ¢Cµ>å«Qÿþÿ¿ÿ*þˆþýý*üÆügûÞûCú¼úù±ùWùøìø‘øVøB÷ò÷Ë÷³÷t÷r÷m÷I÷öúößöµöÅöÍöóöØö¸ösö õpôºôhô;ôôaô´ôàôòôýôöôÛôÙôàô÷õõQõ©õðöDö~ö;õìõßõéööbö³öÝ÷ ÷i÷¹÷çø ø]ø­ùù›ú0úœûûü"üµý`þþÖÿ‚ÿÂÿÆ …Ó B#/†ÙEžÎÒ¿rã\—éY¼nQ¥Ö&x¯  S … ² ã + > * L p u z n – ‹ { † ‰ ž § ¬ ¥ œ ¥  1 ã W ] $ù«_õrÌ’hM*Ñ^'Õ»§IÒ®gW•ÅÖÓmÞˆƒÿ£ÿ2þ´þ£þ¤þUýºýü|ûÜûZûûúëúÍú×úÈú®ú‹úeú/ùãù»ùùŸù·ùxù<ù2ù3ùzù‹ùUù#ø»ø2÷Ë÷÷9öÑööRö7öeö~öŒöödö.ö$ö6ö öö;ö6öAö!öö/önö–ö£ö‹öVöGööÛ÷2÷š÷È÷ýøQøŽøÑù*ùKù«ú újû&ûÝüBü¢üêýýýý…ýÜýþþ;þ?þ^þvþ™þÞÿIÿ©S˜ BhÒKÁ=¢päLž´ÂüEE¸»­îH}µQ¡º¼íøôö#¡ØÅoÐS íîù(M- Þ›]NyŸÂú3|‘›Vî®y2•ô–>û¨PùZè¡m7êÂ¥y[JÿÅÿ‡ÿþÞþ´þjþTþFþFþýÚý²ý#ü©üyü,ûÒûiû.ûú¾ú’újú!ùèù°ùkùZù2øÿøÃø}ø:ø÷Í÷“÷R÷-÷ ÷ öóö¢öIöõÜõÒõßõÌõÔõÙö9öXöIö|öö¨öÊöù÷öñö§ö©öÍ÷)÷ôø½ù"ùzù­ù–ù—ùÁùÊùÝùÙùñú/ú´ûjûêü'ü ûÓûÂûéü"ü€üëýaýÜþVÿÿ†ÿêO³Fµ*tÙ<¢+ýšËÄ€Qlf‚¥œìP²ô ÷T€ƒŽž¸ÖÉßêÛ”l’‘Ããë-6 õþóïñÞ¿îQmIÏiܼXÉDÔ®_ûÄ¥nD©Uè§Ÿ‘uX9FG"ÐQÿÈÿ#þ?ý‚ýüÚüåüØüšüwü)ûÚûºûvû#ú·ú¥ú‹úOú#ú4úAúùžøïøx÷ÿ÷Ê÷·÷z÷K÷4÷÷8÷\÷y÷^÷5÷ ÷&÷(÷H÷y÷‘÷Îø!ø‡øöù2ùšùùhùXùXù^ù3ù øÙøÅøÃøâùù'ùZù:ù-ùTùƒùßú1ú9úiûjýHú‡ùêüÈü^ýý|ýÎý!ýPþÇþÅýYþ:ÿ<ÿNšWÜ4ÿ}ÿ™˜qu„Ï d[zKeÔC‹÷c,PqrŠ=ê Vjƒ?!åŸêåjc˜†¯ùŸ¾½ž6’ KÚ %­rUÉú`*"ÕÌù^\èr«.®åWjõg$_‡jçˆiJ² ÿ9” þˆþÐÿ®ÿþ«ÿäýÃûVýýªü–ü~ü7ýü#ûüüû7øàùDú”ù,ù—ú?ù¼÷îø_úIù,ø«øÍù%øÕø¶ù„ú:ùPø økúÑúøÚù£øøùKø®ùb÷Ë÷Wùƒø¥÷vöÈøÂøÂstk-4.5.0/projects/ragamatic/rawwaves/DrDoi2.raw0000644000076600007660000004645012327014024017362 0ustar gary;{þ›û$ý‰ÑýØÿ€>Ýü(ÿSý€ƒCHúÂþ¦ ±ÿþÜ ÿ$~—ÿ²&›‘¾þ û¬ü(ùÿRÿdûèŒþ‚ý“ÿÂþ+ý!U7úáÿÏ5ìûïüNÿ\ýé*û\þ!ÿªüxýæþÚþ³ÿº^ÿ¯þ°þmQÿ¡þGÿÑÿÿDç|iÂüôý2ÿR,BÓêÞÿ¯qxû¸ýXþáú°üZþÖþu+ ýÿþ¯úâÿWSþÒ_þ)û“¬$œ‡ÿ0þuý;ÿÊÏþ ûd—ÿùûþvûŒúøûâú\ý°À±þRþCüŒýþÿnýnüZý«*þ˜{lÒ^šäÊa}Üs´·&gÿø€ôþIþàÿôzÿoþÿÑ'ÇòþÿjÿJþxÿv^úÿ”Š0Fü=ÿÈü‘ý5ÿýËþþ:ÙdfbJÿøÿYþ…þ$þjÿó%–ÿéYþ/ÿ ý ýðÿØ£á圅¨[ÿ¡ýù¥òˆï 9z<*ù«Ðçɬü&e1F?Ô^”B û…ìý¿YÊyûJ÷å-Dí»ü¦ÁÝ/·[ÛDô=ê¢÷%5¹Eu ÝÂÝåÇ@ s2tÞSÖ¸ >ê/ú:æW¿3åŠþyýP$|3'ÿá6ÊäþÐKÇ8-9vÉ gÞ¦¶¼ãÎúnú0©>} ¬¦ùÀÌÆöÑò€ø§wAÙÅëºÌG¿³ñéðbö!\Cå‡}Uçø¸uÒiø‡ð%)š? †ypßh¹Jåeûö@ :+pþ.ã⢾¬æoûÔñüþ ?-7 ÜbÁ“ö«úŸôV‡ @D:.úÛèÈÀ™ï^ÿžó{þO¬Ï?^UÑEè§ö ÷¦àÿ¡˜l<~;„ûMÎZÛ:ÙøcMz?0Ò ó¨åm½Üè}–Ž2÷1&•°Aç@½ŠâÔø1òÀó”üãðæÏ"Åtô¿þ:õÉð®ê²å[â½ß$ÙTÁwõ\(¬éãçÝØˆÆDçh„ëúíô´í)ûÜôåí]õæéÏíò’) 'z1¨ ˆ÷3õ+%NL:Ùœ*D(â#¿Xû6:ŽQõL÷%l'±$-#áïþá#Ó]CC:6ˆÜëaܪóÚ Í ~,Ü. à ààòÔ}ÿµÑÕ ýýö¼ÑUÏÓý¯ñ½ûÜ zümñÃòí³Þ¸;Ñ”ë‘Þµì¯J÷.äBçWÞ'µ ½ÔçûÞçcÙèæèîçÆ2µ®á9æ[â*úÊ~÷,æêcËš¶ á5çðå{ôNV ‡èPålÁÓÍiïÕë`èÀìà@ Ye÷_òÄÚƤèÃóÃð‚øcö Šöâä±Ú:ñ›ýJù’þµì&N*­ÿù»ç"ä”üòõ÷0‘7zÝ ïúÉáKç.S’/€ ʇŲ¾ùßåZë´ì Ê<´9žxê.üèëút¢®<×BpÇ[l ÷‰È Á$1j-¨ šõªÚïƒÿ7©Ó, &«Òº sùòs fÿ)5Ê%Á öÜ‘q ''Œøõò ð5è?öN#Œÿý÷ïoÚxÓ`ï5ã¼êOÞáævÌVåçäØâÛX÷ ]¢óåóÊA÷¨ð:àÜç£ü - ½‘ý‰ó"îÔòóB ‰´;>õûô ù…¼y 'J¥ ¿ýôtÿw p !gæ#±&v´ 4û~ëRû{ ¬?(%0y+òRïdU žjn=ç…xò/ð– #d%¥ ýhkÆ Å „ùrfDúZðbìñÑýÉð»8kôcíLð õ'ôñöÎþ’ F^ ñ%ëâìíÿ ÛËþ’CÝõÑáƒ×eçôj˜õîíûðbè§âbàKØôânìÐïËõêöSîêåçÜËÕ$ÝëâôÿöþëŸäbä¡ë:ìêßÑ}Ø2Þæç(óëƒÙÖàíäRÛ‹ËÖÄÒÏäEñ]ñà¥ÖÎÔÊÛ½äÓæßáuØŒ× ê÷—óKíÂèÍç4è‹äáצÖå¥òœ÷eøeíráHà®æèüìAâ…ЀÝ1øJ ܹüØßêÍÕªòèêV÷ªû4É2óìd÷Š w «ùñ÷oé´ ÷”âaÙj÷%$X"ûg÷]ø´t ¯ {ý@ó¨ù@“)‘( DÓ Ù{Á£•%1 &âõçÕ £?Å#ÅÞ!¶!—H£¹(¸*Ò% !s©)ý3¢13&ÛA/*ª<Õ4ºÙ—#h,ù,_ÂÏø %Ò"¦ÚçGÃ"(9æ *O•ú'ÔŠ$#Rbu¥§#@$yØ mê(Ì#ñ&£Ú|õ€úüÿ«G œs„;ÿŒijq”ëòð ê"UFü™ô$ü1^=ÿïû—Æ¹Ç â÷7í«ëÈîæúþøæúpûñù´úïÆâ£å*ðíö¢ûÿµ{ú÷ðøí9ð$ñ‡ï;íïóUþ÷ ùþ•óë›ácÝiä@ï¡ûïõ+ô¯î2ßׯà†áQájéYñuý²ýmîëäIÜ@âîdí¿åÔëQóôúœûÿó¹êxâQßè.ô)ó5é%áaá+ë„ñ“êQÙ«ÖVæ‰óåòêþäÞß{è ì娿ÂðòÇñ»ï`îþòoôõ­ó™êãëªúúPþ(ö¶îÏîÑðJîíí”ñHòëõŸûÒüøƒònî`ô¼û…üøÿë~i† ȱ TÀz O ‚ Ç Y ª K ^ ÿU½´ƒÅŒ]ÿIÌë«Ù Òn¼Q]É!?)½'× _qøšeCaÎ"E%é"¢þZ ¯ Ù%háYq0(8¶y÷ Œu!KŸÈÿs˯’b"M ˆ=ùôKùî¶ $ óL÷yðåó…ù~ý©nÞÞ ô£ùÍñdôîþX¥ (ÅÿÿÃû‘üe$>ýõûPöÛù4ý÷ûócï‘óâù¥øãñQñ›øoøÐð­ë*ï¬ó{ñKñfòð¤ï¿ï9ó‰õõßòÍèZãšë"ò¯óõðåï¹ñî“î'îæ4âå^é7ë¿æHâ±ããúåêì£æmá¸àÝÜZܾäré+êõé¢é%ëªê á‡ßß¹ábè$çièíî¡ìäiÞ5ä#çwã9ákâÿæwéæíë:çfæå»è‹ífî¦éÖèêýïkñLîñîbôÄù-õèócñ+ïïñzóûõÌø¡þBÿDùŠóJñ€ò¨ö§ýrÕþä’›!–ru B • è – ¼ è 3 uI:ÄðÚ:Ð ^ —„ù ûŸu"[;B¬Rª·%é) !Âh÷Ì|2ª¬õº $ñ#Þ&ç"î¿¢n³[ "3!ÃÞ¼ÎËÛ~Ú³šßV×í‚\`™Ù±N Ö m æù ôOàª÷ Q ® 9¸Iù8öPúümýÚþ¸m ˆ ·BøAìïìÉôÄùæþí$)búñÇëÈéfê(ï²÷ö¨ö%øµ÷7îråàtáäêdñ/ñî.êëçz娿æ¿å†æ çsåfæ“è æ&åFácÚ™Ûääˆê®è¤âãâEâªã8ãÄÞ‡Õ¡ÕÀÝÇáÐ坿}âoß Þ¯ÝdÛúÝLàTãâ|áÃäÇè1è§çÖäOà>àEåFìXìóæáæŠì?ïjíèEæ¾ésíMîµî‘î±ìFêUëËï¾òQóøõ«õóxñ„ïðß÷•ûbû®ýVýâýH‘ývûtþoæ¹\ðY> ]=é– µ~Ô sd†Ó…ÑKÒ ô(ª)¹Õ#$Vһϖy&Ç*!&î!éñ„èµ²!Ÿ%3&r&7!·U¦- "ä*É-F%ßéæ”é?!M'o)÷'Î! 'âšÞf¯ !šAÍkõ*lÏ€ïÒ1b‘x Å g Û ¬ WNZ ÷é”, C ”9 ¯[þxùÒø¾û­ÿ-þ@ýsÂÿ÷óïêEí8ód÷óù¾øc÷Ç÷Gô°ðeêÑè,ê×íSíºíÀì»ìµëÎæ™âýâ0á0ášâ1ãRâºáCàsßòÞ(ݦÞàá¥ß Ü^Únڪ߲âôߦ܃Ý+ÞõÞýÞÞýÝïݰßìßÜçÚ¯Û,ÛîÜÚßä«ç1ã¥ß0Ý&Ü!Ù¸ÜáâæèäéƒëìéAå•ãÅãsæÊìcñó4ò‡ò1ï°ì´ëÁëíñoôXóýó“öIù\ø+ôŽò}ò õû{ýõý"ý÷ÿ%þ~þíÿ‘þ¸@nÁ¢ ?    ˆ ueóyEÍêjQ ~}5d (µ éïóTawø!\"‰ ß)?~=%'Ó&õ"+á»pÄÀ' h!ò$s#+®ùªTcáÛ ˜$ÄMè7Âî ¾èÉÔ™ ¼´¬¬¬ª‹w ‚ì@ T ï{g / à ¹zÐ4³° ’ ,ÿö÷ö\ùùÚûêýSýú¹öÜô4òwð¨í±ê ëaîóñóôñêÁçmçAçêéjé\èjèÎê"êæç]âùâ0ãVâÔãfææpä/àýß¼á<ãLá[Û†Ù‡ÜÞßnßüßYÞ¡ßBàëÞ7Ú^ÙؽÛAàaä9ææ]á±Ý_ܢܟÝáß8ã‚è|é@æôäÙâ/ßEá_â>á¥ã0ç³ëÞìqê9æ/ãOä1çÅé‹éaêZíêð²ñ¥ónòêïîíxïÄö|úÊûªû†ú°ùeújü†û£÷ýøžýUp»œrý ý°€Ý¨ u )°` 2 “ C 1JN\#ÎöR:5Î=þÉ!Þ$: D—n¶ !¨!xœfˆH¸ƒ ©!ó!Ë$W$C›/YÉH ±%ƒ#„Ë ç#욬8ЖY!ñ!ÑàAÜ™”lßú¯s,OÌ2M kÑûAØhësô¹¤(£ º  _fýlú‚ú¶ü‰ÿ#ÿXþŒýKüúû¥÷Õô™ñøó„ø9úÝùé÷šõ-ñHï#ïóïìèÕèŸë÷îrîùé½ã@áàá‘ã…ã$äæéç„ç›çâkÜŸÙ¥ÙÀÞ•ããçäÏå€ä»â»ÞËÚ–ÙÎܬÝÃÞRàáäáÍßÿÞÛmÚÏÛ·Ý.Þ²ßÌâLãÆàܾܼÞQávãðæŸçÄèÝë0éåÿãJã!å‹ê.íÎï\ï>íQëöëê$êë íwóöôñò¯ññsòëôõõÂôI÷ÆýýÎü©üNûçü¼þ+ÿC…Ï÷½!Rm j d À  ã à c'EsËœÀ\ÊN+•®¼ÿ —1Ch * Wb/à +"K!àŠk û«„í!â"Ö%þ'Í"Hé  aFÙ‰!Q"# ÄËÉ`×o™X;x Ý&xñj®÷Ý  á X Õ¶, xîkŠ4t; ‡ D³ÿ¿ü@ûNúøúÊûÈýUýsû[úuùyô!ï„îÔî°ïHñ]ó¬ò‹ï[í¦íkêóéÍê¦ê8éçöç°ççcå[ã£äjåÊå·äòãßâñá ßpàSß¾Þ-ßÁà‘àYàäá:à~ÞôÝ#Ý Þ’á âôã?ážÝüÝ Þ—àºâ<áPáIàºßÜáAáÇààýá¼ãåeæŸç+æqäÀãpããæ2ékíFð(î¡éoçTéuìšíëeì»îÕîkï ò‘óéò»òIò"òfôRö³÷ ÷'ùú½ý†ÿ:þ`û3û{ÿÎ I €½ z ´ Ó ã2ÔI™¦5Ÿ^±ÊÕÃBú"|mœÚöñ¯Ð†#!!¦¹åÙH : ¦¸ ׿3®Ÿ@ Å!+!’æ¶öÉ-×ji:DÃÚcYDP>[Šï¦JÞf”  á õ §BE Û Æ q èG^½übÖñý®ü@ú·ù3ùmùÿù€ù:øQ÷wõˆñfïØñ=óòDð.íí§ï¡îÒìåé‘èäê°ëRëºêOçåœä'ãÿäýæ*æ®åýåáä[â9â*àmÞËÞ²ÞûßVß!àVââXáÑáƒßUÝÛHÛ©Þcß±áNâ,àþàná’â:áçàJà-â8ãNå9äá>à¥äØå\â­â…åƒè×éeç›åªæ$ç§èÞê´ëŒëUëRë‰ëùììríZïUïàñgôf÷÷Âø(÷¿÷Žø¥úOûöüýüÞþpoÀ<nué^÷°Ž p À}:#@ÅŽðèVûp õ¨aê#ÞX`!„ÌŸâª}ôMrG)·<5­"O"Ÿ!Ú\…ø “!"ñ!Ù_Ï/væ‹T.DV‚³àR_* ¡åwæ0¸x; ~  € Ï  ¡ ÿ '<<*jÞ°7.ýÓü¤üýEý;û¡ú+øÑ÷ö<ôêôõWõèôœó#ó[ôpõ ñ“î íÕíëQéòê¦êêêßêç¥çPçÎæ€ã×áß²ßnáã_äÕåãgäbå áqßßßݤßáâKäãXàµßaÞµÞƒÞùá(ãã3á%à5áËáZßÉà¥àäá§ä×ä‘á¢ßÃà áRãëæ7çzèÈéMé°éèèºé—éQé‰ë_î3ñpôóTð–ð-ï£ï^ñjóàó¼ô÷^ùùòúú8ú"úsû—ýýpÿ3饌= œ cã´ð ‹;»­HÒ¹^Én,ˆ®æ‹$7côÚ duãÃâ!z!á!¨„¯£ÉL9ì÷PHnŽt¿Z ukíWµÄË&šEÒ}Ç Ú+õï•~=i¯¹ á » Ì é  .)$´™mšJÇz„ÿîüÓû¦ü„þýÛýyý1ýJûÜ÷µôó—óôÔõŽò§ð­ñðÒïî5í‡ì~ípî‹ìæèùæ"åàæ³è¬éùèæ¦ç-èåêâ±á€â3ájáÉã=ääBãÝã£âkà¡àKßÓÞÍÞßsàcàßáOâá€áãIã ââáÅâªã½ãTã¼äRå`ç¡èbç½æhåÚåÙ弿gçîè«ê^í-íÜíêKé$ëãíÀì¾ígï–òö ÷Ò÷uõsôrõ õÚö?÷_ùYú¸ûÕýZþÆÿÑ3zÉ<„yc–¨× ¦ ì  à ú  T u ‡Î¯kÌÙXA¦ÁI“£êDœ´úzúcÐÿ=ŽLÐs•XMt5ëŠÍ$jÚšM$À°äò„5 }.E§²BÅñ@w˜(Øßñ7 ˆ ™ ã  ¢ Æ ÷ .=JФóÛBxþÈüCújø¼÷!öØ÷ÀøHù]ù+÷—õ™ôLòÀñÞò•òï™íuìÅíÝî"íKì×ë¼ëë™ëêßéBæ¦äñäMäãªãçä|åâæææ‹æKåGã.áÒàºà¡áÙãúæŠçcæ´äòãâ;â‚âƒâá¯á9á«ãLäwä…ãôãâpâðähäÿäçääNå,æ¶è(é-è›è,éœëë\êéê&ëJì(íûïƒðpñDñ·ñðRïjð&òWôÚöæø„ùLùåú6ùø–ùúü/ý!þÃq&—G.ÅAçŸß² ¸ ù K þÛðt=Õ‘Þ[KâRd~7CÏ,¢GãžßËM©„&ûfŠ.ÆZ‘~$|,—DLYgÈÙk#®S´íi ÄOKzÇÇþ)³¶YM÷ ª  º å ¡ a9±ç?p/Ç[’þØýMüÚþ ÿþûmùmøw÷Í÷hö0ôyó«ó^òøò•ò:ñïTíÂí@ìÏíì±ëUêEéÿê$éìé÷êâëAê†éØéè8èWçïåÌäHä«å¶å¶ææ+åÃåBå&åQäÑãÓã/â¦â™ãƒä‘åQå9ã/â§ååªå7äëãúã‡ä•æ:æÑæßç*çFçrèèxègé.éØêdëëÐìôí¡íÈì½ë£ë—ë¬í…ðHñ¬ò³ô<õðöDöIö>õÞ÷ŒøÉù~úõûÅüŠýjþþñ2PoÆÌ¹™_X^# : > Á ~ X Û ƒÿ¸¬±@‚O +þç‰rbG^JëÜUÍur]å¹tÜG@ˆ±@±¼x±š§OHå *x‹¯¤!e}ÃSºõà ’ ³ M U Ü c Ô ´ œ «T„è…Â#äû$ÿþJüÕû¡úYøëø¿ùEø¿÷Ù÷¦öÔõ²ôöôÊô«óÎòoñ•ðÿðHï°ï&îÑîhí¢ì·ì¨ì?ë“ëwê…é]ètè[è×ééŸéáé]è|ç³æååyäãxãÇå5æ›çŒçYåúå?ä®ä2äQåFæåäåÒåžå󿕿Hæ æGæææuæ æ¸æ>æyç¦çäèé~ê„ê”ê÷ëëJìNí}î˜ïâñ@òJò¸óóŠóEòúó‰ôjõÖ÷jøOøõù_ùÚúÁûWû¥üªý½ý¯ýôþæÿª¥âhv‰33º< ( 7 f ¸›vêÐ ƒ:+ev{{Îá4«YêŠ ?ñ„®©?G•tN<B èxyÀ} ¸’N‰ÙÉz†p ]µöanfg›-ƒŽÌ1 ìŽQ{Ø Ò - ¢ € ¤.ZÙŽ?Çáœ'ÒŒÿ|þ0ý%üüûžúçù^÷þ÷öôúõõ–õôŽôSóüó²òûñðZïîàíþìYëNêªêÒìRíNì¾ëzê%éYé`èçç²æÔæ3æ¤èŽêêzéÇè™ç åìåŽäèäÏåääå,ææGåZä‚änä²åeåÏæ¢çÐè€èÃèªè˜è8çòè]é#é}éÏê°ëSëDëë)ëMëÔíîîhîdîíÄî ïÖñ}ò_ó=óöô§õ_õ¬õ5ôÛõBõÛ÷.øØúqü:þ?ÿÉ4ÿµÿsÿ¬ÿÆ®0ô€¬Í¾“ c 7 ¼ | ± r \ d Ñ%°Ie‘Žù \ñ1õ/[øZÉ'K$Š)|éõ†"9ë˜ì,ÖóiOÖgÀ¬x&ºd>›Ð5À¡.žÀïé¯ ¯   “ k ! = ö ;N&¸Q­›nïÿàþiýdüGûúHùùù‘øöøÐù%ø®ø$öµõ=ô)òÖòRò…òÿò“òò ñ}ð¸ï5íšì6ì*ì¹ìßì¸ë=é³èýèSçÎçèRèŽè³è$ç^æøæÌççIçˆè1élé§èùè çgæ¯æTçç³ç™çÛè$è”é–éÿé©éJé{é:éÔë"ìì±ìëÑëxë²ìeìáí@í¼î“ïZï¤ï†ïîð•ñò4òòó5ô“õõø÷KøCùIú5ú‘úoúuú~ú£ûðýÃþÿPÿ܉slÊä÷7 »! 5 ¬  { Á Ä Ñ ™‡+ üy‹11>}b‡"ö€eg¸ŸP£ŠùãÁyJ¡ÓÑe®Ð dŠî¶\ðõÀϨ3bâ…‰Žf «lh:¿›ÂQ÷uz  7 j ; * õ (bEnxNr×&¦ŠþÒý)ü™üßüïýý:ü+úÐúú,ù¬øæ÷Rõæõ•õãõôŸó ðñïêï{ïKï_ððÀñð_ï*í½íNí—í#ìrìëÄììNë•ê«éèüè£é_ééê(éçéQè"çç<çÖèÓé¡éäêcêôê­êKéÑéIèèÒénéîê¨êÿêÚêäëêsê<êDêžë„ì±í+ígîîHîŠî†îkîïîõïvðRð¹ñIò˜ó¥ó¼ôuô­ô~ô´õo÷8øpøÞøÿùNú;ûŽüÝý ýÖýÿýyýˆþ¤^ q$;÷ëäp!,¸¬ x  ‡ ‹ C Þ w j  ø +©ü£4ƒ¯§Å¤±ÄEAobJ½ECoùÈlåT³~~” ÜENFH»^¼xÐF†oVG±CÀÜüã²æä  p ÿ Ô ï å * k ± l €5'ýÜaZMËùΑ–q±2þèýþýûóûgûPú}úúúSú8ù_ø[÷¯÷zö¼õ_ô“ôxô“ôÊô”óùó+òð´ïzîÊîÔïjðèñÉñBðîÐí¯ì¯ë´ëAë~ì*ì9ëµëÌë«ëqëŒêµé³éoê ê¤êHê)êië?ììwìµì¼íní™ìÅìDëÆëëëëì‚î¹ï–ïÄïKí÷í(íÞïJðeñ`ñÑñGñPòósô‹õCôêõ_ö`öÔö õÅömö‘÷œùGú ûü+üûlûPûÚüåþƒÿ¬ÿù±êøýtqVµÙpÍŽ‡ G + ¡ Z û Á  ˜ t — / ¥‘ ÃÄ|IÀ¬Å.ôÕ€%Š'6ÜòAO7ç¼ûí3ªzPÿ̺ŒD¤ˆ|ÿ–‚ruÕƒ¼ " þ ¹$7}Žˆ   ¡Ãا"Ü»!\BÃÑÌáˆÿîÿ1þQýÜýºý\üzûôû’ûOû^úüú¸ú~úzú2ù„ùaùpø”öxõbõPô£óÖó“óCòÛòXñŸðÈðNïÒïïÊððð¦ïßîêîiîFî“îèî½îóî í™íìÕìöìàì¢ìvìBìªì¶ëÎêîêÁëIë’ììî|ïUï·îîíñíŸí?í/í§ï.ð9ðÔñùòSò…ò òòËò’òòó¶ô?ômô†ôQôBôÅõ õ™öŒ÷÷÷ÑøHù ùù0ù)ùú)ûñýIýÄþ<þþÿ"ÿŒÿ¬=ômPŽ2¯i$ |Š]—¤–Ä  ¦ “ ~ Ü p Á Ï A ¯ ¯ Z m G þ] Ï vmyÍ ávŽã—xåi‚â³VÙc ÄH"œè7Cà¬Ð@! Æq À  “ } Ë ® á f Ü · ê 5 ß t B(…dPò@fñ´…1~>ÿxþCýìþLþvþ6ý·ýüµü›üú¼ùdø6öìö©ö·÷)÷úøpøZ÷Xö{õµõ4õCõ õIõ\ô¤ô<ó¥óNò¤ñÚñ„ññVñð#ðŒðçðÎðÓñBðÁïJî²íÿí]í¿îvî¥îöïÖïÑð ïåîÑîíõî¤îûï|ðÂñò˜óyónòûò'ñgð·ð2ðýñ…ñìòìódóýó®ó"óPóÈôƒôüõFôÊôÂõ’õËö6÷,ø“ùFú=úõúúùøTøwùú}ûüýzþ9þAþ–þ1ýËþSþÿ¯ñJ²Ëév/_CF=cX Ï ö ž í ‘ê 1 g & c > § -    ^ Y è f ¯ £  7 ø ¡ ¿®ý[‰ùóaöZ, ž ôäÓl¹ž µ ] aO(ns+‰ y " r ‹ + Ñ † @ Ú y  \ = ½ £ 0 Ð 0 5 ü WXK_ß¾ìå~‰6©ŠC-hþküÏüFû™ûŽûuû™ûóûÁûßûxúòúRùøG÷Ò÷1öû÷fø6øgø÷Èöüöõ—ôÃô<ó­ó?ó3òŠòsò‡òøó2ò½óòBñéòUòñûòWó(òçòjò±òõò³ñ—ðSïNîñïññ)òAò¿òºòsòñ‚ð7ïïð;ñØó~ôœôüõ ô›ô-óóóióYó­ô ôŽõ{õ¸õÝöXö©ö³öç÷:÷E÷K÷Å÷¹÷’÷çøUøø›ù­úðûÛü&ûßûÅûŒû üü²þ/ÿQÿÞÀØdág=À Õ¨Œ„¼ÛDHO/åCT  Q / ; G š M Ó ,   £ Ö û ¤ Ò Ý 0 º)Žð\ ® ‹ Œ ç ß H é Ñ “ h ° å ; q L «7 µ 6 ¹ J s Ž ²  n z F ú L ¹ Ÿ|É—ƒ§›¬a _‚@Ê%…£³˜ÓÝ«<Á‡Ñÿîÿ9þçþ7ý—ýMü²û·ûeü2üuüªüûjúù¡ø­ø÷ùø÷äø–ù%øúø øVø…ø>÷ó÷Ø÷IöÙöaõµõOõôÆôÑô‘ôQóŠò\òòÇòöóòCñññÃòsówó¯óåó!ò0ñDðþñûòqòÛóìôÍôÖô—ô6ópò¿òòôóDóºôÜõ^õÒöõRôJóÁóäócòúó³õö÷øKøÁøÁøÝùùTú.ûúÛúµûû¹üÕý£ý®ü´üSýý³ýªý5ý‰þ=þIþÏÿ’S7ÿïYJ]›J£ŽÞî.¥tQ”†^|Ú ; Z g |Éç(à Ž ¹  [ e § ‹ ¨ ¡ æ 2 $ ° ¡W3 ° . ‚ s - [ Ü ¡ ¤ C Ñ q ß š ö  é ½¦O" ú Œ ß Ô Š/ìŽø7`>ä’­—¥7r®9¼hÜ3<&Íy_| G‘ã':™gy!ÿýûü¢û¸ûoû“üKüýý ü6ûDú:ùRøÁø®ø¿ø–ø¡ø°ø;ø#ø”ø'ø÷‹öÅöÈö9õ®õ ôæõRõAööã÷-÷/öOõæõÀõÒöõíõ¹öOöxõºõFô¡ô5ô ó¸ô!ôôÂõ?ôyô–ô£ô|ôkôIô|ôÉõ¥öµ÷Xø†ùùZù¨øÜø¡øÂ÷à÷n÷™÷Ñø%øBùIú®ú¥ú§úêúlùÿùnùaùaù—úÑû ü˜ü­üÇý:üêýFý’ýZýêþ¨þþþ|ÿoÿâjH¤¦e‰šÀ Dß@ ù— ºW}ê  € $hÉ^Æ©'+Î º O éÁ¤†x.‘  ,  ( ç à Œ ¬ , ¥ Œ ¯ÊÜ / ' â Ä  ¯ m  #]§±Ú b ¥ tK€Ú ho àúòûBµõz³Ð‰Ë¤ „=Ätn—ƒÕPRíœ>ÿÏÿPÿlÿHý_ü¾üÜüsü:ü[üºûÐûžü û`ûhûDúàúgù°ùbùLù©ú´úùú»ú]ù¡ø÷øéù>ù ø÷„÷Ä÷m÷º÷ßøøª÷þ÷q÷>ö³öù÷s÷Ê÷Ë÷áøÊø¢÷ìökô³ôó‰óÇôHô«öA÷GöÙöPöõ×õåõíöö>öÃ÷¨÷øødø\øYøÌøZøø*øøLøK÷Ï÷_øù±ú²û?ûvû´üüAûéûtûbúêû$üüÀüòýýnýüÙýGýýšýŠýjþþgþ—þ³þ骵Ætà cc²†Ž:º×ÌLu•İŠ)œœÞâ¬W"“gPÀ6'Ø Ö  "»Ï½O®wÙÉ}p¤j €P×®» nè±&PCµŒṪyÊ.r+ÿwÑ‚!«âa_m„!ÎÔj Äš,Ÿ\ÿýÀüÊûùü„ýlþ2þYýðýÃüöü3ü_û¿ûÑüBü:ü˜ü˜üÎübû©ünüùýPü»ûïû£ú?ùóù¨øñùø~øhøBøkøØø­øÑø¢ønøÝøßøÉø=ö…öOöEõŠö öž÷¢øøø>÷{÷ö®ö8÷÷[÷¢øøø¨øÍùø«÷öø¥øiøðùþù”ù*÷ù÷÷ø÷ýø¼øÞø¥ùú8û:ûàûÎûÆû$ûKûìûêüOüû¡û“ûsûêü0ü«ýAý8ýÒþVþ_þTýÉý¯ý†ýôþˆþxÿ”IJpSÿÊÿ›Qü¦ýŒe8˜¾A¿”.¹Ïùeÿ®³ÃBº--SBÍ–Ø£DÐ2?……õ)áni¿hiS@î¹@ ¬LÅse¬¢}Ö"ÿªÒ`n¢ÿqè‰ýug’™8\–ÁFÃ1©cÿõÉÙeæn\ÅÊHÙ^I?•ÿbþ¯þòþdþVÿ ÿ$ÿDÿVþ¿þlýÒüõüŽü[üvü<üý û¼û6û úuúÅú›û0û‰û”ûßûû úæû+ûçûÚüMûÁûÓüpûú–úø¾ø˜øýù+ùˆù|ùÃùø.ø!÷¦ø¼ùWøù%ùÀúˆúçú¯ú¤ú>ûû úÕû;úÍúuùåù&ùø×ùkùîú7ûû#û|ûrúÏú‰ú)úPú?ùóúiúÏû0ûÄûÀû‰ûãüü^üÇý üñü~ü“ûæûêü¼ý‚þ:þaþÏþ©þ'þþþ3þÍÿ ÿUÿÿÃg+qî¬!Kwñ7¸ ÔZ2ò «åQ¹ä† ÿ0æ Ðc¶ÃúZeÄ_ ¾ó *6=¬„Þ Þfnõ4”º ½‰'?çÌ[zåÜÄ;4©:N­pòq¥)AzA98úÑóIñ7á^êOäQÿ£ÿmÿ²ÿºÿ•ÿ^ÿ%ÿÿpÿñÿçÿìÿHþPþþªÿ#þŒþjþÖþàþÑþœþ ü·ûÊüJû¼ûëüÌüÈü‡üüfüdûõüüýþJþ,ýêýšý7ü÷ûÒúÎúÓúµúñû9úîúDù(ùKù¥ù¬ùëùÚúùÁù¶ù²ùˆùàù¿úfúöúwú$ú@úúùíùÃùËùÛúdúÜúôúÄú…úúû+úïú×ú­úéúÑúóûlûZûbûnúãúŠúóû²üYü@ûùû¯ûžüŠürüüüÒüáüóýÒþhþ*þËþáþ;þÆþcþþhý¹ýÓþsÿ:ˆ"àÀúòQ(ÿÄþÒÿ þôÿpΩ‹ÿUÿbÿPİ7'ø'd‚"Ð/V°e8Þ±_;VK.|~²W¿Eï9æàï¤:~IXì«h¸Ç‹øDŒØôëτ׎³åÊMêÚmŒd±æ9~˜YžOÖæD¼WNûò_3½+H¹s/û>ÿaÿIÿÈÿiÿRþÉþ¢ÿ¬ÿPÿ#ÿþ}þŸþ>þ þüßü;ûŽúõû9úçû®ûÀûOû©ûú÷ûƒû4ûú–úÁû,úãû§üSüü ûìûõüŒüûfú–ùjùiùæúîûˆúõû0ûú`úúùìúÏûrûÕü*üœü¹ûÕû%úÖú>ú’úúû`ûæü‹ýGü¢üxýü ûÍüwûµûŽûŒûêü-û¸ü2üƒýý­ýpý³ýŽýýŽý†ýJý©þ™ÿ¾ÿÄÿöÿ¨ÿzÿþ!ý»þþ]þàÿNÿÿ ÿ ÿ„ÿcÿdR”´Êø. ušÀ ?{0¯ªtÎ÷޶x3CSc€»§CÞÙðEòžS…ò˜€×­<™¦åÍŽý Óa °³T3~e5¥x)Tégo<"¹újܪi¬2[ß5 b/"^v¦ìPÓ£4ZÿÇÿÚÿ˜ÿdÿÒÿ?þ“þ¸ÿNÿåU¸âå4à$.ÿŒÿwþóþ^þAþ™þuýËýöý¨ý8ýeüºü[üˆûöüIý>ýýÎþ þŠþÅýåýÙý©üðýcý5üòüíü²ý ýMýü˜ûâûÈüüü¦üÇü ûÂûMúhúAú]ú,úxû]ûìûÅû–ûûúêû?û‚ûßû™ûûBúùúçû2û û2û=ûšü9ütü1ûTúÿúåúdú•ûêý%þþÛÿTÿþ?þþ ý²ýàþ)þ&þ\ýåý ýŽüóüºüÆýýìÿ)ÿŒþëÿ#ÿ3þÿÿ*ÿFÿAÿÜ}œKÿÒÿoÿÃÿâ3¦ZÿµÿµTïŠÈ6:ŽüKñQÞ+™óPÈ IW ææ2g¡^²/Q'm)‰DÙÛa›æbŸeämãÕ¥9EON½ÛäþÉè(ûK·ïÙ#ìå üÈû¥,%]ƒãþ/Ï=_(¸ÿþ5YÿîÿþŠþ ýÝý…þDÿ—M¨¤ÿwþŽþhýûýéþƒÿ5ÿmÿÿnÿíþÔþýsý=ý™ýóþ)þ0ýæýhýýPýœýéþ!ýçý“ý»ýêý—ýbüäüüãý4ýØýìýŸýiü«ü4üyüsü³üéüÂü¬ümüûºû‘ûÝü]ý(ýÙþþý¯ýcýü”ü†üÚýNý³þ(þ>þAþÍþ­þý¦ý4ü¨ûûû¸û˜ûŠû¥û¡ûiûiû/úÎûûÂüüüEüãýhý^ý±ýØýµþ þgþßÿ þÞþýþþbþñþ¥þþýÞþÿÿrÿ¬ÿgÿS&Kܰ¯¯Iÿôÿ±ÿ‚ÿeÿ-ÿ‡ÿù`¬6û´}PJº…ö=™ñ6ì¢K7ŸÂÕ ‹W3ç굋bÂ:Yþg¡’FN(•tË3YOäw,#ZÐN‘`ÓÖ&ô©nÂ…8~㛃Ë8 â°¡X§ŽÅ;ÿÞ1ºÇPÿÕÿ=ÿ)ÿ£ÿㆮ*°­3׃ÿöÿÞ#ÿæÿöÿ÷ÿéÿ÷ÿ»þáþZþ-þþ™ÿ þ¨þcýæýUýüþüÓü‚ümü‡üªýGþIþßþüþüþÉþMýëý–ý-ýüÒüûý?ýZýÆý«ý5üîüDû“ûŠûçü.ü¶ý/ýCýºýûýýZýüÊýü¾üüvü3ûÞü#ügüüü•ü»ü‘üiügüüÏü÷üùý[ý±ý¿þþÒÿ$ÿþþþÞþWþ)þ[þdþJþ[þ”þÍþ­þ)ýºý¼ý£ýký¨ýðþ(þ¡þŽýÐý6ü¿üüü±ý+ý§þHþ½þíÿ6ÿFþ÷þýõýáýþþ›ÿlŽŸÊàdÿû_±ã¥Ä÷~ •yKm‰;3B0FùË:zIàÓ1Òæû ¹›Ò6_„fM@ÝCèº\‰K1³ñø’Ái> šDVî§'…|C&ïéå ÿ:ÎÝþì> k}·êJ°|̉d:uˆ~}&ÿ¤ÿÿ0ÿÑ(ÿÏÿœÿÈÿÿ€ÿgÿaÿOÿþwþbþ¸þÊÿÿþ—þFþNþýêþGþ¤þ—þjþŽþ+ý¤ýüþýîþ?þbþ§þÙþïþÅþýšý)ýüþü¹üWûÐû•ûCûû˜ü€üñý0ýŽþþ{þÎþþ\þ#ýøýþþþUþ&ýûýÁý2üËü¶üüû¶ûµü$ü£ýý_üòü›ü×üÜüºý?ý¤ý¾ýèþDþ‡þkýéýåþHþþ@þÇþ½þÔþÆþˆþMý¿ý|ýøþ”þþÿ ÿ7ÿ§ÿÞÿ½ÿ±ÿ“ÿ,ÿÿÿ3 ŒÎ8½ÔK ÿ¼ÿpÿhþçþeþgþWþÃÿ™ÿËÿ¥ÿ¤ÿ[ÿiÿÚÿø*]WlÎE1úrYºÊüžxÄt<nƒÉ0·lƒÉí‹y?/'­£Q7J´{[ÀM49[m˜Š… eI°8tîÏÊÓq@v铼°Ô£E$X_}uv»¥Ä–¬¹º~ú¾¯aéqÿ®£ÿõÿqÿGÿGÿ'þ¦þvþÉÿl2Sÿ¶ÿÿ¨ÿú¦+ó~YÿGþ,ýÿý§ý}ý”þ!þ_ýßþýßüôü€üü”üµý&ý6ýFý®ýÖþ'þýý‡ý®þ þFþ~þsþýÂý¬ý™ýfý®þýæýÉý·ý³ýÿþþýîýý3ý4üËüuüiüüü;üüVý_þþ%ýÏýØþý¡ý‰ý¡ý~ý·þkþsþJþÏþ™ýÅýhýšýÆýýôþcþŸþŸþ¯þÓþîÿþ›þKþ`þxþ|þ9þþFþþ7þÃþ…þVþeþhþ}þNþkþËÿÿh= |J<Ðáèýw?Ò¢‹³–ÄàµÃ}"òþµņÿ½ÿ•;\´,µ™®TH; a­Œãúl4€‰ª£3Ñ^áhÅy,¶1G#»©¿¨-HLÿ³ÿÁ"zì³ágßùI—|è×NŒ(lvᾈa98Š‹;ÿÿÿhÿ”ÿ‹ÿ¥ÿqÿ_ ^ÿÔÿ‡ÿbÿJÿ¡9M J†>ÌUcÿïÿ~þúÿþ¨þnþŠþˆþûÿ:ÿLÿ§ÿµÿEÿþµþRþuýÞüÇüÐý_ýÆþ$ýÜý+üÅüÎý ýtýºý²ýbü©üfü´ý<ý¶ýØýÖý|ýáþjþXþQþ*þþþsþ®þ¤þÅþŠþ,ýüýþþ[þjþCþýðýþýØýyýGýü‡üûîûªûXûgüü®ý<þ7þ€þ‚ÿÿ_ÿ{ÿ~ÿGÿˆÿÆÿ:ÿVÿÃÿkÿ-þöþ‡þwþvýüýýÕþMþ”þvþWþ‹þïÿ*ÿoÿLþØþßÿeÿÿ„ÿÞÿÑÿÈ ÿåÿŸÿÆM‡c²çoq]]•éVìI^•>ØÃ¤§`Ç-ŸH¯¢Ó ˜Wdÿúÿõn‡OMÉQ²ÑÖi½ÿñƒB”,Á…&™ó£ O‰ü Ûtrd‚”„N;ÿuÿÿùÿâÿé.Ž_¾¬}M9Y“³Ö,RT"¶hì«{z‘0uuÿâÿæ ÿÑÿ‰ÿþþÿ=ÿkÿ4ÿRÿÎÿÿrÿjÿUÿ‘ ;~ÿŸÿ´ÿ¯ÿrÿ&ÿjÿÀÿªÿ ÿ»ÿ$þý¸ýgý?ý‘ý©þþ®þ¢þ]þ\þþˆþ*þCþÈÿ7ÿsÿþ#ýü­ü«üÉüöýrý³ýÈýêý™ý>ýYýÂýÁý;üÝýýný¿þþKþ\þ ýný‰ýõþþBþýìþþ1þPþnþ„þ‹þÿ9ÿ}þðÿÿkþþÿ ÿAÿþÐþlýÃýGýý$ýhý­þzÿhÿbÿ}ÿóÿÚÿÌÿÿþôþ»ÿ4hIÿÍÿZÿþåþ¢þšþˆþÇÿ)ÿÊIÿùÿÅÿºÿºÿøÿÛÿ¡ÿüÿñr`1˜pNŒÄ0OxÈ})USG®€s¢X„Û¹=öADEQë‘Ó`RJoMëÁÝ<5|Ìù G3µŒŒ˜‚®°‰ÌÛyjBÍÕ½ÌÎÔ8¡A[E ®M"o•y@â¢yÿõÿEÿ!ÿ3ÿ*ÿVÿŠÿ£ÿØÿòÿÀÿÂEƒp'ÿöÿ°ÿãy]|-UŒ\2ÿðÿÊÿßÿ±ÿµÿÁÿ{ÿØÿßÿdÿ¢ÿUþ¶þ“þZþ)þyþýïþ3ýÊýêþ‘ÿÿþÍþøþíþ•þþOþ*þ‘þxþþÈÿþ­þÐþOý°ýmýý:ý`ýdýþ þ‰þÆþ¡þªÿ(ÿFÿBÿ"þÏþÅþgý|ýwý‚ýýÁþ^þþý´ýKýnüûü½ý"ýCýOý¥ýÐýýŠýÁþ&þþþ3þQþäÿdþìþYþyþþyÿÿÏJq4ÿÎÿDþôþúÿþöÿ?ÿMÿ6ÿbÿþ2ýÐýküÉüÍýfþ¸ÿ¹ÿô1ÿ¥ÿœÿÞÿáÿ]ÿÇ<ÿêÿÅÿqÿ@ÿGÿ°ÿü%X…žôÔdx*ÿŸÿÀ)šð¾`Klò£³­É¡½Âîÿô÷G%b.­ã»sã+ûûè, ’·]<ÿ×ÿÀÿ®ÿ•ÿûLÿøÿöuEÿð@xäXŽzê&/­iïÝ­Ý‚£4™{1ÿßÿlÿHÿþ‚þhþsþ$þþÈÿ~ÿ–ÿúKÿªÿómuOuÒ¢otÿÿŸÿÙÿŽÿÿ½ÿ}ÿkÿ±ÿÖÿéÿ¬ÿþÜþýçýïý~ý•þUþ¢þ±þëþÆþŠþ§þoþ\þðÿQÿgÿsÿ^ÿ"þÞþìþúÿÿ?þàþ›ÿþõþFþ@þ3ýlýýlýŠþ þëÿ"þæÿ1ÿšÿ/þØþðÿþãþÂþžþ:þþ6þ ýÍýêýîþ(þOþþFþ‡þ6þþ;þ ýòþUþmþvþÔþùþùþæÿÿ+ÿ!ÿ‡ÿù/ÿö2†<DsÿÔÿ¹ÿ§ÿ‘ÿtÿJþñþ£þÖÿ$þõþºþâþzýØý¾ýþþvÿ22Ùþa—G:M?'±v}ÿôÿíÿí-{K¡ ÂTÿàÿÌÿézܦ±öW«“g­°¿_ŽmKÓpt>¶Ne´~û]={™æÊo:ë‰IÿæÿkÿÿÿP9ÿä¥gZ#ÿ³ÿÎÿðÿ”ÿß,9k Kÿ”ÿ&þÝþÎþöÿÿ>ÿ¦bÈ*vºÿêÿ†ÿKÿÿuÿ:ÿ[ÿ`ÿ‘ÿÚÿtþ¢þ@þ/þþþ)þwÿ'ÿÜÿïÿçÿòÿÒÿvÿfÿ ÿÈÿñý½ÿÿçþÃÿa)ÿCþ¯þ÷þTþfþ«þNþIÿEÿ\þ3þ|þ8ýãüõýtý_ýþøþ“þ…ÿ½ÿ¦ÿ<þþgÿÊÿþ?þóÿ¦ÿþÀþÞþý’ýRþ\þ•þšþ¦þþ;ý¾ýý¼ýÂþþíþèÿ!ÿ‚ÿñÿ¿ÿÿOýÏþœÿFÿ.þýÜþWþcýÍý“þÝÿþºþîþþþÒþ—þ¦ÿ1þýûýìþ;þˆþ÷ÿ_ÿ¬ÿ}ÿMþâþÃÿ’-ÿë¢ð^ïàC ÿLÿsÿÄÿËÿ‹ÿTÿãA)ÿ@þ•þ±þõþ/ÿ$÷–"“ ¨ÿ¹€œÿd)bw9ê®×*þ³GȸÿÝßÿãÿõܶj ÃhØ©Âp\ ;W¥!˜ïBy‘Iñ–¢PÿyŠ‹ˆÿcWXÉAHò%–»š-•ÿÏê&þÛÿÅ]ýûÿ¬Jÿ<býêÿ:Iþ¶ÿÄõ»þþ27þ·þÿK?qÿ;þüJþ»ýgÿr›þ›þŸ[â;ÿòÿÿÔÿ—ýáýî$ÿƒþzÿÿBÿßþ?ý¹þ~þþ üšýïÿþ¯þÔýÉþŸþÔý–þ@ÿ94ÿ)ÿ3þ‘þžNþþ=,ÿÿ‚kÿýBþ•—þ ýñþ˜þ÷ÿ2þÃýwüÕý—üÎüBýÝÿÜþü¼¥Xþ0ÿoýìüÒþýÿÁþ°ÿêàþ?ýÿºÿ¤üæý7ÿuÿÁþcþ+þÃÿŒþGýßÿÿÁÿmÿÿÕÎ,?ÿŠÿ¦ÿíÿŒþÿ-ÿ¬þPýûþþ ý¨þÉÿýƒþtnþ`þ¹ÿÎþ?þÿ0ÿþˆ˜ÿ3=õ,Oxd.»wF®ÿÌ)aþàÿ\ýàþ¤lïÌÿ!ÿqÿÿþøýƒþYtj‰zDæ†(\ÿ¢ŸqqŽ”ÿë¶5ÿ’þÁÆÇñEúìsÿNbÿúÿ¼?ªÿâq‰XÿÓ3 ÿã]v¹ÿûE2²«þ¥þ¥stk-4.5.0/projects/ragamatic/rawwaves/Drdoo1.raw0000644000076600007660000000374212327014024017424 0ustar garyü~ þ*½æ=úwç˜ñ’íÛî²ÿXüG/ñïaî^ÙÜ,çnëkóÿHÜ­Ü ¨ GË•°ß æõbáÚæäçíHÏAŽ*æÑ3Lô7NT §ä >î í¶­=÷\ò¯ñuäùÓÁÊÀÑlë² îÂìiç~÷|ý~î'â™òüú ,ôS ¡ü.éô¬h÷SèÊçÅèyå5í$ú•ü†óÑéÝï` @bõU÷h ¯Ë%s-Ú>XB¦5x Úrzòà…úéñoû•ÿ×õÇé Ý÷Ý«ìø­ùÎñòâ ÚÙî)™ b Mñð òådaøšû›ÏîM&‚&S,{ýk~ÿ{ó»åmÛŽäAíeðiïÎíÝóÉý7Ô:n4Ì“c$·2Y3ú+oœþGñ;ñÇöíö ñÑíIé7ë9ì‘íËì–ç˜âÔä«åæë_ìò¬õJñköN0ýLþ ÿuüƒûwúŒúš¤Õˆ75a$!,Ð)j$ä ¸MúÖðÁç³á8ä´ìßîÐí.í·íuè°é®ò‹ûçüôõçïéó”üþ ùy ÛÌóÈí íEñ°õ{õSî+å2â¯çìî°ñêñÆð™ñ"ðDö&ÿ~ i5Òð´ÚÀ?yVìNßÑ —ýûiïaçååçTçjâ¦ãáëò~ö|üuM] *S t×|Ë@áÜ;øPù]üFüÙþ°úEölóñßùó<ÇûrôÃò•óHø7ùëýMüáû†ý5þ’ú±ó' Ä À}T q =þ¾øýùšóåò?ó!ï‚íùì/ñeü´“ Eih­M©Kµÿ¥ þHþN^þ4ú5û+ü‰úÊú û¹ýLû öÌ÷®þ2H“Ýù)òæñ(øÉVØQÏ 0‚ßq©»ê ˆêƒÇk×7¶þ§úçõ“ñµñâòåòŠððóì÷4úû~ù¬öM÷Ký¼ÿQÿü,üh·ý"€ } æ ¦…üÁÿÕ'ÿhý°úRõ„óÕö½÷_ó/ï¤îpì²ïÔôö_üîÖÿ³ü7øžù¥‡n@ÿÿFü€ú`ùø‰ù8ú°ûËùõû(þÂV ý‰úÏùuøxø½úN÷•ðßíí¶òõÊ÷WøJýÁéxþÜû½úú®… H´ÿeøÿöøNöXôqó1ó2õTùjýÏz°b e ß ˜þÿ¨ ¡ ¿ ¸Œ\ÿ9þ’F–ÈÐ í Ï ŽK7Ô‘¿ÿü}úÐù¾û­þ„ƒŒþÿþÿ>6TÇ P ó H w×°ï ºdþ øtö§øûß?æ3ÿiÍÆSêþlýºÿlÇ— l­Þç+ÿ¤þ×l»k ` ê  ìEn† ÿ‡ûø¤øÉú¥ÿ‘+ó’ÿ|þWý:0ô  a à š19Ó / Ó ûáö²õBøØý~Ôo•/ = H'K Å{E\¨ÿÜýfþJÿüþúxõ|î×ë#èÂè‡î ó!óùôàôØðÐíÕï%ðpñ&ð ìÂéçƒéìGð<ñ@ðZñ;ñ‰òóËôíõ{õ÷ÕúfûÔþº1Ù „ ã âuΰ ¶ûíÿþ"ýØüŸþþ’þ„ý‰ü0ú£ûeüxü0ýÆý\û-ùV÷Qõ™ô×óðýîQí¢ïÆòö÷ø`øÂù½ýÿ±eË&Ÿ6ö F O + /´—´ ç /KyâAxÂ.‚z ¡ - Z0-Ý × ™ à › ¤ 1 Ø©HOÇQV±tÿáûåøG÷É÷À÷åù7ü?ÿ1c0Wù׺uýû!üÿ’ǰ{é¹Ö·pB@ÿ{þòþ„ý8ü¸üÇûôú”ù†øôñãñ7ñ ò¼óeò˜ó±ö­ùiü ûdøõ%õ ö6÷÷ø¢÷sõ4ó¡õ÷êú\ú€øÏ÷øù4úüÈqÎ9L ( ô EÍýÉþ.Š*V/º?þ;ûšü>ÿ©Vý/þÈý‡þ!üÍùyöÄõ:õFô·óŸôõ÷6ødø+ù\ü<ÿ.¸§ÿ;þé°&Aü¼ú°ûÔýdþ®ÿ/þüqùËø øÆùÚûÞýþ¤Ø;æÌÕþoþ\/gvú¬ÿ¢ÿ˜ÿiÁIn„‹ÄºRYÿö=N”ókþEú¢ø2ùxúpû ýaý)úƒúsüûòýUÿ)ÿdþÄáÉCstk-4.5.0/projects/ragamatic/rawwaves/Drdoo2.raw0000644000076600007660000000532612327014024017425 0ustar garyù§ýßÄþÆ}ò.à· ‰Ò ?Ôܺ·áÞ$H/yùÚõ·"/ \ôÂÌ÷Î â%ñòúî¡çãuê°úd’ø ßÓßJùƒ¯á¯Îiä’ÿ?þsúíø‰ÝÆÜú.c]ö§úÏ1 ¢÷1í“ö¼ÿVþûõyç[ÝÚ}Ý{ë=ýŒDq ¼ýüëë§W Úúánãbö¢ÿ©ù­îHâ‰Ü‘à¤ì~ó+ï`çÜç§ò ö“ùéê5ë½3L·ùöõÿY|"V#ºD”˜ ›|’Î"š CT³ ±%ò#åå@ììÞä'àûóh/$Ó ~Ü ¼ÿ÷ýêÿºß • ÄûFû8ÿ»þ³óKéé‹ú G à,Ó> ÃfnùM Ÿ$™-å#h ÿ&è%Hì.%w'û%7"6^  pnêz×nÐyÑêÕÛ/çø± w¬ ÈþLô®ñ¡õ¬þFþ¯÷oøŠüüû§ùüD)ù#è%áëçµñ4úΗ¹ ¨kÝ•¦lƒÌÚ `À Ø •*|)f"®šâ A “ f ùÙdì1zö©éÛ'Ï Æ,ÁiÇIØ™î^°Œ GDûó(êCé«ðß÷”ûEú Ô ¬ø ûÃíâ×ìäþ@¤þI – »ùµøõíýñ{ö\ïÑâ8à‘ì¶òÖô†û(Ë_ô„ùÃíêéë\ï€ïWîEîÖêpêÄî§í0âŠÔøÎÓÇÞ–ãééœò»ýN¦˜ ð ŠŠžý!öñ¶ñ¿õ”ûÒÉ´d¶ JþúÚ ØÉ„ wœCû <Fû7ï³æäãë óvûš~ É ’ /‰üˆð§ëéëlërìßòúøkú±ýHÝXõ3ëªåjäùé$î¶ôæû^ põ 2! Ûqüù;pŽö ¯¶Dé ç ¨   "9(š‰  ? C˺þCôìUë·ï>ó_ùÐÒÔ qñx¥4P¯ óßÂ5Wþ¨£ÿWX“ñ n‰€ á%G&¤#ž¸Ó 7ôüe÷3ôÜô†ô’÷ðû|û±ù•öô ò!ìñì*ñ=÷§ûÿ_ óJùíêèxåäèî~õwû‰] å C T Aÿuúû!ýåþÿ¶¦3i vÿjù»ö­÷—ø0ú‹ü‘üþšŠ 4EùGökòKæ×ßÐà7àWÝ|á¶ì¼õ>÷Jö)õ±ôñ‚ñ·ò ñïóôñûÐ[uOdüÕü.úöŽõþ÷.üeôp‘ëµþ?  ‘ôÿsö)ïì¿íûð_òoõ=÷xóÉíêúëgì§íì2êŸéÏë+íØïÎîÇìïëæËâ¡ßÕÛ²ÚªÞæ|ïŸõÊúZÿyñ®þÌýÙÿPm$+¬  —? §;Ž ’âöÈÐ + € ™ ' ‰LÑþ/ùóð¶ñûõE÷B÷L÷„ùÔüÜýúJù8ø÷vøöýˆ » šÓ µAé=û— 5æ?E!&&É!ôŸ”…ß%ô€*˜ö ™Ò}ÿü÷ÿm8þEùÉø\úÍûÆöûòËñiò–ò¾óÎô÷ôîôõ®÷ºø’ùNúŠûùžö ö—ùûûÏÿ h b¨ŠÌß I W » CÚ·’9z (×ÝÿâþpÿÓ>%ü|ø’øú‚ûÄúnø öûöóÂólõˆ÷®ø4øpû`ýkýWþ!ÿdd‹Üá  64ïÝ{ñ}´ 0 š é B i- § Ë\¦üÞû)û‚úQõñ”ñßñ¤íýè7ã?àxÞAÝfÞöànàÞÍßeàïàÜáËäóêØð|ñ©ðOîJí=íìíŸï»íõéìé…ï´ö=ø’ú<û'ú|öÚôeôóšò¾òŸôäùÀÿ»iýÇûàûmû<úbøößù;ýkÿãÿÈÿâÿÞÿ×ÿÞjˆ•Êrþzûíû|þÿÞ2ýºüQû«ûQûuý+ÿþÑÄÉsüžø/øQúúù¥úzþÊðj: ! ’¢î ^ð" ƒ—s1B ï p\j-/â¡8_ :‰Ì¾XýXþuÿ=ÿ±†ÊéÎ “¬–-›•‰#t%i&%È%‡%å%ü$~ ü¯ß>Ó H5,i Yxü…öàïßêèréçÅä:ßÕÜáÜ/Û˜ÛÏÝájæÈéêºëÆí íÃïªñ6ô·ù’ûÙü)ý{‹1ýíþâ~ðÑ w±±Ý;‚ ‡ ÙHþÿ ÿFüûÿþš÷ öàù’ö‹ñ»óÉö‘õ<ó7óõöúéøŽýúñûés)ÿ\ý‰~ ªN ‚O=û J = dýxÑ Â ”  Néÿ@üû÷ÏõðõÎñ®íßðÆõ÷Íøeö òèðùí@ç`çôî[ñ ï¥ë¤ééêqì$ë.é¥é´é£çmæHé#íîºñõ÷`õcí‚êïëºëzë+ìDíììïWóvöæøcùÕý°}ÿ¾þ¾C8 Gž“*vnxW°=jŸ¤&ÄûlJ p É ŸÉ‹ ÿúm÷¥ö„ôñýñuðìmépëcîÕð£ójóóRó©÷ˆûùòù¥ýû –b)æà 1h ×Âo%>çeˆÓù¦ ª ¢†¢)—ÿ'ÿ±ÿ«ÿÃ(ÓÿäýoýŸDDï7b™ .a{ŽÔœ„G7‹ x U[,ûIøõ7óVïáîCñKõyôœïÅëué¸éUéûîó¤õPñ‡îçð‘ò·ñ’ïîïäðøóïö¾øøZùŒü›þmý9ü±ÿûûýõü²ý•þHý«úÔú†þþâþ<[}/Œú õh÷¸þM*þGîü¯ŠþŠý)üDþjÿ ]` Ÿÿ¯þEýQý€þíÿ›üžùmù„ø õ‚ò“ðÇðøñ¢ñFðçñAðKñEò¼ô:õ„õô ôNôÎöù«ûuûúÜüû¯ø¹÷ ÷wúRþ?.ü·ü;ýhýûUø¶ø]÷~÷Z÷9õšô¡ô±öáù"÷¾ô‘ô‘stk-4.5.0/projects/ragamatic/rawwaves/Drdoo3.raw0000644000076600007660000001621612327014024017426 0ustar gary¤G®þ,þ üÈú9ù=úÇúoúÙü˜üJüUýªÕ*ÎDOþÁüõüýÿéD ‚ / »]¼Ø«4‡ÿÖþ‰ÿ3þnú·ø³ú$û¶ûú.úoú©û´ýŸÿçþÔùøHÓ ŠøÐùÐíY÷nü*óüÄ‘":‚ûÃõí@î:÷Hù& *kÑïJ.A á ^‚ì¢ôŒ 4N?ˆ.ˆ’ vÝ îoðM÷4§÷Ð1Âþ:on ¦ûúñÏòaë.ä…å­òGèñcïFî0óƒû¤ôì?÷g { gi 2 l4 Àýßç Õ²×€àŒå ê8úLBMåøÿCï7èNðÀãÕ¼,/]*¢²¼íÖèYð þ¹÷ÿûÃùAó ï©ì,í9õ‡öñìeÚeÌÎÔã;ù‡„ûžû2þ±ÿƒùíuçÒîŽü¯´  9Û7XþRï˜êÚæá-Ú%Þñé!ø¸ ô‰¹Œ# 2 üöá¾êÊô~ “Ï$• “zíó—êÌêcíõð«õü÷÷ñ´ðŽìnè?ìNñjõïû;÷4ëæäÇæY𥵠ÿ `åTÄî {rý#úˆû!æ R(ë,,mÿ÷—çæá1ÛÁÚæ»ñ…üä Tó­¼~óý“øóñ=ì®ûÀ v·)×+'œ Ndùºýþ'ËÒ¿tu âôÜïEðï0êŽç´å6çêxø/˜°ú_ï TcÿyùBö¡ü›îk/pá 4¹û‹òðò¾ùçJ±ž¤Ã\õX½ü5öóôÁõtøv¢£  Yû/×ÿêûÐùÎûSÿkþùˆù'øùõöòÁñ&ë âÉÜŸÛÞâRé½ù% ð£!õîJ/ à 4.é¼ ^ž ÍXðœá²Õ̓ʢÌÑÝ´ì úg_ápϦýÛøÆôˆñ¬ð²÷nr• p k«³×þ7ü^ûâùøø³úœúu÷è÷Røûú øîóÞëÃçäíã—äçžì§ôwý† Js Âÿ:ýü’ýVÿ“¨' ž ý%úðèräßçÚïöub Ó¨¸ö> £ˆù£ôœó­ö¨ýÒô 4 Ô Æbýïø¯õõ­ô®ò8îÒëÐìóùŠúqù,÷!õýó¸ñzïŸð¦óÿ÷°þu£Ÿ’!%$ $Q"8JÏár…óßX2n…¸øZéÛàÝúàÿæÄì_ðüô7÷²úÞü¾ûLûbý ü’ûåþÑ=—Wʳ:l© Ö7×öÿje×å6ÿhýðúË÷àù+üJ# ð S—p* àP¨þñýþ• — {-L ïØLúòKïþð}öþvû Ãæ ¿g¦ùØó§ð‰ñ›øÌ¢ãö¢úföYòáò,õˆô¢ðvë¤çMåçjé§ìSï­ïÍëhç?çåhäç†íÞôÏû”=JµÚ É8 ' àÜÑMBxƒ J}ýzöMë!áœÜ>Ú‰Úàß$åFëZîVímî‹ï¶î5êêéEéÑì¶ó˜ûCØ t » “ ݸŸy |ñ˜Îþ´m ŽÈýü¥þÚÆÊŽæ†÷&æ 0Å®–% i% ÿ =xûEù öÝïÎéKæ7çBì>ó‡ú£™ÎCÞÍ­\ÿÿykvŸ ü ‹ Í(üûÚüý“üú÷¸ñèï§òf÷Åûîþ$ü÷ÅôïôeõR÷{ùúŒüÂïù>sX7( o#Pm  Z äòý*öÔò>îÈëÁéææòë˜ñŠ÷‹úIúùÚùJ÷~ôzò7ò…ögúÔÉ ªN¶ÿ3` ÀT&Nÿè`cN±¼ìûÐöõõÑ÷ù üÞÉ ‰@W‹ ú,ÿfüÆýÞÿñ ÿ­üØû;ù¿öóðŸð„îµîðmõxýB$ƒ§šÿÑÿï±ó½¼ø d^Ê b [É ùÔôï°ï)òwö?÷ðöô$ïìíGíËíúíÅî¤òZø¦þÆw ƒ›QG¦bý–ù#÷löûø½ûtýgþgþ‡ýbúŒödóñÏðtïªîåï¸ó‹ø’û°ý­ý²û„ûÀý¡þQÿ-ÿér;¨ »¬åþ(: Ë ¬€…¼¤l 9 T ˜Ò‡ìþúæù±ýÄxa  KÀçœšÈ ÃÞÿ:þýº„b®9ÿšýÇû{÷7òLñäõDø«ûõýsþæ+ÿƒýÏü®ýkþ÷üþùßø–ù üòîöÖÎÿµû§øEô+ï[ë»éèéˆëûïñ;ò¼ðùíˆë¸ëÙí}ï–õ5üÀ* »›SkÅÒ Kî…þSý\ý¤ÿ »%ýÊüø8ôâóMñ²ògí¾îÏõ™õÁùZþcÿÐþsþ†ÿIÿu.èÇb‰  Ÿ Šf¦ó šÇÆzÿ‹ÿßÿ Áì^ ø||œ eoðë— ¦  R ¶—dÏûŒ÷+÷Oú ÿuÿþ1úÏö_óBðÉîî÷ó õœ÷øúRügþòIþ¨äDnɘC!ÚSÁ¬û1LþÂù†ô¿ñï#íKê[é3êFëÒì‚ëôíµî•î`ðnñ ó‰ú+ÿ¥9êR‡ f GÎËJ†üçü§þ‡+wýøèøH÷øözø7ú%ýï|‰PÜèö` ÆÄA F— û Ï Ø /ÜÀþ'þiûbù!ú¢ÿŽ:ýuú©÷>õ­øîýa¿²Kb¢ ‹ p %t}þ]ø½õò ðøñ~ó¢ö¡öÌóoòó£óèòæòòeòêô)õ¬ösù6ûÙü*ýtÿ´ÿýEüÈýtÿ)Ëõ^ÿ´þ†û÷òð©î¢ëtê–éÜë í îXíAíðoòªö-ùgùÁÿ0`Jÿ ~ “¥ªûPº ÄN¹‰pmãDü~þGdý8ùèû*ý<þ³ÿ•ÿï'Á] ™ c n ® k b £Úƒ íЋˆ ˜ †ýÉñ· / Ž Ü J D ¹ óBq5åge…ægFw ÌLxý‰ûŠú øûúcúúø¥õVðžíòìøí$î0ípìì#îñƒôm÷èúÐûyúøúÒûü¶ý”þo ^ÏÿûýúšùzöÑðçêXèMçªèqë®í¢íÈíÙíñíõîÕð©ô(øƒûˆü9ú#÷÷ßüœn<–°Œ Xÿ#û²û"ú®øØúBúìú;ú¼ù.ö[õõ5õ•ôôõ(õú÷øÃûÚÿ;É« n Y w · ñ ‘Ücréì F èááÑ·ÚäÜs4h0 =n2w‹P¾e( V µ@¤ò¾ý`ùÓ÷µõ5óÌóóµó\ñîð\í2éßçšèë†ð$òñgóìù=üVþ’ÍZ ú ­ ¿Ù6H¥/ÿšþ û£ùiøGôÃñ1îµîZîžîxíNì/î@óªø«üŠýsU¶_ß  Ñ îV e˜ u P dè¸Ø(»G67éèTÿTÿ þÌþ7)@„¦ â žv8¹ > ß Ï À jTôJ ‘ª“ŠWA¨þÎü£þäùJ âèsa Á  * š¾Aþú•úFû•û¥ùôï•ìRëfë0ê´ê<ê5ì¹ï»ðŸððïóêöÕúðÿ®p$QãØSgÿ ÿþRú¡õÒõg÷fõÕôóOó:òÎòôó$ñ¾ðÇðSðZñAôæøùvûnûøöÛø—ûîþ2ÿ­’vÛéu»\ Í¢ÿÐü¡û°øâõó›ôê÷cü¨ÿ°ft¼ÀÖ îäíYX µ_U)ÀlèèþùýúÇù\úsþe^YhýÈû>úÿý†’ú‘(U ƒÿ>þ¦bçå„CÑ.šÿýzüü_üùÃõïÔìüììíìÌîýñ¨öûëþ ý;ü†ÿˆ& Û b ã Ïÿ½mÿþlÿ”ÿ0ý_ùžõòÏòUó!õ6ö‚ùpüÝýúû÷µõöùä>åy8/š‰4&A­ô ›é]˜œ B ö <²ªÿxþ´þ„ÿlE6KSŒªÛ A!÷ ˜ ,ðÞý·ÿäô÷ûÎû‚ÿ)ež¨ÞP!_R_ÑâI ! ‹ ; ˜ ! | z Ü  > j ü Z ãþ—ügûëúƒ÷Bô6òÁñî£ì,ê.ê ëtìsìäîÑñZó>ö×ùùßû`ý \®b†ü7Gþrþ þ%ý(û;ùj÷ç÷gø•ø¢÷£÷ú´ü/úùöpôôyôÒöA÷ÑøáùÜùA÷ýùdüÇÿ 5å s TeÍãÿ²þnýóü^û2øÃöõöHùÎý¸qüÐŽ ãÐ [ 冟Nƒ0°þ¼û„ùT÷©÷’øêúmû‹ú»ù™ùšú·ü¾ÿÆÊsÎ M}ÿƒý/ü€ü–þÛöõ /hÍüûû]ú³úõøžôhðBìmê®ë»î#î·îYìêìÇðôôøüûwü4ý 2ž D5Wá ÿ V_ÛòçP†0qêwQÿµÿdþSþ=þ"ýFüìý“þýs5 û MWºŸgg ¦ L p d¬<¥óGÿþzÿ+ÿ¦þòÿú¬Dà ?»çmÅ& ; ˜¢9"g˜ , u7ÿ—ÿxÿiýöý°ÿ^Òÿ•ûù÷lójòDóò¾ó:ózôÀù=ý†\…‰à›ÿÆÿ1ø>þšû¸ø‘ôìð!ë®èYæÐçýè«ê ëQìÁï!ðîóÌ÷ ùkùùøúÀúùü¬üsüÙîh } D 3ùʸ÷èHÿõZv£÷°ýlû|ù’ö-óÃóIôPöÑúƒþr.òÅ…Ì0bå þ ª ¡ Ä™ÿ|üœûúñøâö6õ ÷ðþXÔÉÃ?‡þRþYÂR‹x™—p5ܤømýÊý=ü«ú÷;ôô÷ ùgø{õ®ó„ñîøî¬ïZðìòäôð÷£úÛýê£j Èw¡ÿ …ïì?Yýcûú=øôõñÿññSðùðaðpò‡ö2ûaþ^eëdÿ³ÿÿoµV¸–E4ÔV1Æÿôÿ2þ,ýýþìÿxP@þ!üíúÖøvørú‹þ@+CÎ s™øO Ð`1L/ ‡vÿ”T¦J 0 +  É ó Õ)í b œ]®:Ö|ãûÿ è ¸ [›6ûã÷~ô©ôÅõõÎøGöö÷ûù³ø÷ôèðµíäë…ëí§ïoó÷ìûŠE H‚|  ¶³‡ j«Dÿ@þâüxùdóßñ%ðZî ìÆì|íßðëõ×øâûˆþþ|ýúùTø‘øÍù©ù¶û_ýKÿ9s÷Oÿ\þÈþƒÿ´rÿúS÷÷¬ùhü)ÿ¹ÿ–þúQôÏñ ðóö&üúÏ ›¦â“  5 £ 6 w b à ÿ§YhÓÿûÛø1õyóxô…õçú–&ÖYVWqyŸ™˜TýÝÿLÿˆÁý÷¯ôòõ¶÷ú$ûUúGúøÃøøÎùÔùôøªöWò«ï9î[ð­õ2ø·ü;þ†/<{ ¡ ’iI®)6uü«û ø&öîø÷¨öæõ#ó<ñFñóŠõäûªç ;Í Ä 8C„ 5 , p|¿Ôë WR±`ûd>—áW¹f‹Í €ÿRûFùˆû˜ëê n°Ceâ#É(Ë ¦ ,ãmÃÿÿüQù™øãøF÷öEô&òGò!ó¡÷ûMÿSìÖÿ‹ü¡ûDûü0ýFþþ‹ÿÞ8þ/ýûtø>õ3ò¢ñ|óKõÙøKø¨öÞö}ø…ü$lœeü2÷ô6òô÷pû£\C ÿ P¡Ï2 ÿñ$Ò,þ…ÿQ3þ^üYú3øù)ùˆûwÿužŒ| õò@ÔCÙZ7ÿPþÉvÁÛ«Xþ€ûxø©ögöÏ÷ôù[ù÷«õ°öZù%ü}ýpü ù€öÊõÓö¦úÉÿK5OÌ ­ Wz ‡ …Øêÿüúùâú¥üý†þlþúûõ­ò!ñtóö„ú§ÿ“C¢ûÿ’ýÕýTþ0ÿë[ÞÄÿØÿAþÁ©»tþÄúM÷9õÈóªñƒò óô’÷*ùàûYýŒ½VþÿR,  J š Ö— ˜4 · :µýÅø«ööø°úûûƒùcø6öøözööm÷øæýše'!þEýtûÏ_ÿþQþ¼þsþýðþ-ÿ¤º«8_þFú²ù©ù›øõ^ò]òŸô¨÷Xû€ýbÿŽs³Â[G ô ä • " ¡ãO{ » Åtw›ÍTí  ô ©f‡ÿëÿ8ÿ‰ÿÌ>,}NÆMZKyÿ2e¢¡þæB.*ü3ø¹õ6óPñóñ~ò›ô@öÛøíû½üŒý%þ'þÿù¢Tˆ÷ 3 # ÏõmvþtùšõHô-ó±ô‘õõ·÷RøÑúúgûíýŽþ÷ÿ1þ þ!ÿ¤Ñ­”½ùP¢ 7—C !´ª§0É(ÿPü™ùvörôôôªõö÷øuúÒûùªùø¶ú)ûåü8þ(ÿ·ì*émþ™ýEúŸö¸õõñõºõoö ÷J÷‹öô•ómôAöjù™üÈþþ>üõý>ýÛþ÷ifÊLå´xR°ö € `Dþ­û}ú|úù}ú)ú#údûþxŠ•„o>bRƒDñ ×  ; 8 pv®½ÿGýTý&ý ûÇùLöoõö^÷>øù9úû•þaÿýÛüùü­üÁþõ[0è”û^ø!øù0ûný=ü ûû ü—þ€þEû8ööóÝñ;ï/ïmðÇòÙõP÷ øø’ùúÕþ2z‡õí3?Ý ) [  „ ëIHñDˆ2Ü(Â: s?M ' ý ¸cô J«˜ È ‘ ÒñOò¿:xÈähG5æü#øWöÊô˜ôµ÷²ù üƒÿÊŠS~ëO‚úc-ü5Ÿº' .°}’ýöý‹þIþUþJþþé_x|X`¯#þüƒü•°¢õ‡* y Ÿ ¹]1ÿ–þqýyü´þR²ˆýbøuóÓòíô`õ¤õ¹óªò)òòö°û·ÿéw_ˆ7a˺Yôeë94¦Êÿübú-÷“ô'ð\ï5ðyô©ùêþuÓâþúUö˜õ7ö‚ùîü­ý¶þ0ýlþ2|ßnü‰÷óõwóÞòçô^÷Øûâý,ûE÷¶òuð¦ñYòMô`ô›òòò¢ö¼û!þyÆcþÁþPû–ù÷õõ öãù€úÔûyú.÷+ô"ñï„ë¦èNçEéì;ð‚õùùÑû¥ûÆüüçû¶úù÷à÷™ùZþ.ŸÔJˆòÊÿ$üuü"ýqÿ׺ý&úKù ø÷äùÒûÏûùýâ–³d¡Pw¬ " ¾ à ’ V ( Ý@í ý ° á ›»õ òmr "), b ² ðA–Þ®å Ð Z uСS¦›n4¦0ÝGþ½üû†ûkû¿ÿ³Õ "H• ˆ[LÿŸþnþþvÿeþÜþgÿ2Ä´þûýú‰ù¿ú—û/ú÷ú^ù?ú´ýÇþ9ü@ú¨ûšûÑùžötô)ôþø+ûÛþ¢@ÅNþ¦üúVùù{÷ÒóæñvðÓó[õ\ô;òð§ïöïGîeí²íçï²ôªûiË ð ÿíkÛ¦ÿGÿÿˆ×÷KgkTýæüRúørøù+ú^ú»úêûðüáý*ýžýìþ?ü‰ù õuóõøù™ûùþœ?Ÿúåõñôõ"öð÷hõ’òZïPíTíÖï)ðiòCóðóFòxóNô÷äú¤ýgÃÝ£oz«ÿ]ýxüQýgÿ?ÿŸýÛûjúŸû‚ü¶ü¶stk-4.5.0/projects/ragamatic/rawwaves/Drjun1.raw0000644000076600007660000001067212327014024017437 0ustar garyß·]ÿLÿþÍþ×ýîý›û,ù;þ¯¦—ßXÿáýxû×úóüXÿ­U)ÿ‹ÿƒ\ÚÛÇ“%ܲ~ÿÓþ‰üBü§þü£‹‚à ’ WQœ«„ÿéÚàýçüÔý»ýÚü‘üý¸üìúÄú2üiþþKþ*ÿéÆÿµuíþçþ ÿT.äKÿÄý‚üµ'nþÞü{ýwþ·†-Khý§û!i5yÉÜ ëý¯î#è/êóÛû‚÷Æõ¹ý´å þëî¹ë&÷·àÿç¸ÿtþ– /•óP‚vµß Ñ åø4ó&î{í€÷„žÆ±  C7qúõvó®óƒõ#ó'öIøóúEÚú¯ù¶ù¼õåólø³þÀùÖôtï±ìÀñ÷äýÌ¢éÿëõcðò$õ}ùðû™ý…fbû¤ùúÙþ‘\ Äl ã²(ƒyVŽßí ˜ 1áÈIŠþËÿâ8êöÿXþ¥þäÿV,s<|ÿ³ý€ûƒüýÆþæþ2ù€õ`ô:öý$9ôìþßÿ® ËúÌQ-Juy˜èhl—;ýúÁù+÷Eø¥üa¯ÛØ—·ÿXùüöõHùÿ–ÿù~õ<ôÁõ1ókòòVðŸí8ìŠïŽñÐñòVõŒùÚû"ù@ù£û"û¨üþVê û : ÛÞ,ÏZØÌ q g žïˆ÷Ѓ ©uÿ­½Jºý¼ûµû£üþþÇÿ«üž÷ð÷tø»ùÒù ø ùlúÖùørûôÿ#ÿzÿs&3@ó ŸnC©Šö½G  Ô L ¥ : ó û ‚ Q n 2Åb j Óú«Óò kA öÐÿ ü›øŽôÆôåö£ø†ûý¤ûsø€õ×õ>õ¯õ\ó:ò5ñïÈïEðMôø;ûýBýüˆüéþ¢ª'Ô˜w[Á'¥Ã!E1Ƹ?{ÿÉüÛûú©û»ù}öºöõÀô!ñ¿îéïÍñDò_òÞð‚ð@ïí”í›ðcó@ô òßñ½òZóÛôAòðVòSõ¥ø'øöÑøÓþýëù ûgoÿTz Ä 7 eœ t ._;® 3 ÞN©ÿý³þDÿqÍÜÍpüÑ÷¹ú8ÿ;²¨ÿdþ§Hö%3…/ýþþWû×Ó¯ ì çî³9œ2¨^¤n$ÿ¥ÿZÿ:·>5Éþ¡üVû•þÄ ’þúôü ÿöÍÉí°rþúýhý¢ýþü³ú÷eóúòDòKô€øžûèü­ûxúºü6þ—ÆÿÌ y « ¹ ‡ S Ÿöx tÑ‹ïüáþûCþ`kQð€w™t — ¨O½Z=è\¹ƒ«• 6 r p < f¹Ÿý7üÊþý—ûUùú‡û·üLÿcnP+—¸ ÅFªùE"ÁãûþÂù÷÷hùøÃóèïíÔëBëììRëkî¾ðÝîhìµï1ï·í'î¶ð–ïíCìýíÒïnñlóðôÅòŒóôöEó¨ïâðæïíìÛëŒé è/é…ìþíoí‰ï‡ò"ó%ôqö¨ö õ+ôÿõ’ø ûœüõûûûŸþ ý@ý”ÿH)ÿŒÿhýŠûƒýdýx÷Š÷eûŽüWú.ûÏþ¢þiþóQü L y|\›ádÓÝîçZz` µd ®5lœ(<uö©}Ö<Ia†? 0‡ó:vXrè¤%Ö5, Uáqjfßÿˆý-úÄøˆöÖö^õ…ò×îÑì¢ê夿ÕëÂðÿðÛïrðîníÉñóÌòóòéñSî|ê2ë6ïî™ëâè‹åÓã|àÅßiÛ²Øb×0ÖãÕïÕÜÕêÓîÒ½ÒëÔ¦ÕG×?ÛßáŽãíæ:çÖèié¯î0ðaðïð¸ðâñ0ófõ/ö÷›÷N÷hø~ù3øvöaõÝöšø÷hø«û‘S9S<! î Ú¢ðMÀ}û=ëInVɱÈ}¼J†sýÉ ©/e§Ü ¶ ¾Íç ¦!¾"¶"í" Ñ Ú Ÿþt«•Ô5  9 :&ÝsA}ÿÍÀ&aP<¼MòR“MYÜÿ²ÿ“ýeú!ö{ósïXê“è»çVåä‡ã(ßñß ß´àÄâxãà°ßµá¥äVäâRâ—ãCäRã¿äæãè—æBäœå ä©äŽä1âá³àúß•ß3݃ÜTÝ߆âZäÀç.è÷ê£ìîzð‡óqôõ<ùýýmü}þà6.Õ²ã&^ 2ÿEþaýÍü†û³ü^ýÿ#þ‚ÿk!Ñf€ª¾ì= \ËùcÅKê®ïÜ~5xÞ¡Ýž™FfHmÂÆ>¬ "("d#£%&&>%]$Ñ#è"¼"¥ ®•èˆ“ßÆ ¹žÙý¿øEõXóõòÚñ@ò6óÚñÏðYñtð©î½ï{ñõ²ùtüZûõý3þƒÿ¬þnÊ ð | ' { € ¬ ï V ß‘ ÿµüÍýeüÿûçöò’òAñ¶ñaòðQìµé—ç[æNçÖèŒå­ãßã¶ååþæeçáêêDéè æRãËâŸã^ãhãŽâéãââKäcåËæFç¿éOéâêÚíýñ0òôcötùæý1ÿÄ;q-Œ ¬ NïFq — Ë Ô 3H%%„ñ|+mÿûù™ù'÷ŠõÕôóõtöy÷IöØöî÷¬÷Ç÷ƒùµü&þh(¸¼ ÉÛ–_³±`ý Hã 0 Ë  ¥ ¹›O¶ñÈÇ:(#¡ˆ:­˜6bl ¯â¸Ÿþ©ý*üNû¹ùøÁúçûØútùhøîø´ùBúæûû!þ7t³ýðNŠ Ï Î¯ 8 À ¢ [Uý ¾ Ó É ‘ €'‚ ûÀ¦ +´•6*—Úæ×ÿ·ûÁøØöLóòò ò¢ñõï°ì¾éžæ"ä"æç¹åØåÄæüåâåTåŒå`ä–ää弿+ç èìÑñtóHówõJø–û~ü³´9‹»ð„Á£Òm&ÜÕ§ŸKþôýñüû‘û ù~ö=óŒóòó9ñåï÷ï<î@ïï¥ïÊï¨ðÊñRòÏõ;ôdòîßîmï¤ðDïoðDóöÛû4þ5ý…ýtÿµ<aÿÕþøÿ¯‹ä_ 2 B W}Ã37\ñÒ¨»ƒòÁX<y¸­·_7U > ë µ8q‡?« ¡÷­Nz*ÿBfÍö Ý î 9o½HÃ ì ØG A £  Ì  ” £ GXI Q„¸œŽ cx¬ÎÿŒý…üüû‡ù×ù-õÍò«ñdðÍñ)ñ îâìgèšåPå‘çCçCåqä¤ä¯â®áXâÛåIç€è\èCénëí[î×ï\ðnñûòùô¦õœööøµøøöˆ÷Žù¸ù¶ø'ö ÷²ú~ûxú›úÁùeø±úWûcü)ûpúYú:úVù­øÓ÷¢÷ø*ù ûú–ù”úîû>ûôüüûçü ü½ûYû¬ý-üÖú­ø²ùù3ø ù&ùoù°ùÂúbú‰ûˆü<üóÿ=6ìÜ=ì £ | Ä MîÉ…iû\  ¹ Z  { Ð ë γW¾*·—\.·5€‘ͯªÿ`nd#96ü¢"»ôT½è‹Â}Å W † ! u š h # _   ‘ Œ 1 ‚ à ¹ · + ÿ¢Íú»¹ùÿýNüªûù6ù—øEøL÷²ô8ó^óðóòÎðŒíÅî™ïŠì`éúëÞïOï÷îTî¨ïòôaô@óòôPöõËôÉôó(òåôÎõÿõuõ–öoøûIûÉûûŠü|û*û†üùýýÄüõü%üµýûý¦üäþˆ˜þÿ{ðlþZþþ~ü¶üXûöúXøÜ÷þ÷gö÷-ù@ù˜øú÷ûöoöBõâöò÷rõ·õqõEöm÷¬øàûýŒÿ²0Å%1‹”¡ì > é  I } å Ž a f ¦f H ž4¦ x 4 ø Š Ç   œ ¼ ª 6 °~Ycßó#ÿÏÿQÿ1þNþ‹ÿWþOü'û1û1û¹û³ûûÛü¿ýý¤þîÿWäâ•ÿš?¹Î¥X…Š‘C–q‹' ]ñ+Êlý›ýkûˆúøÆö2õ˜ø øÇ÷¢öóöà÷‰ø–ùƒú@úGú¹úW÷âõ¼ó¶ôÊøŠù©÷¡öõ×õ¶øÁ÷îøJúwú–øyö öyöÈ÷ž÷ãù½ùÞø»øxøõù¯úúý/þ½ÿŸ”ÌP%È–Æñ²ø áïUÅÈ Bg¬ž¹þÍÿãK¯SþLýÂþ¸Î|* ÜæÓ5Õ Î¥þÎþŒ"¹ÿiþïýõþ]ÿÿÿÑ6ÑŸ¼qþÑûÒüþ þÖþ§ýöþrüÜý'þÜÿ¢ÀñøÐÀ—°ð°XÿýþìpÞÿHþbý[üòûWùøOøt÷ëö}ô)ôuóÅóWô‰óúõOõë÷!ùhúùFùõû¿üàþ:ÿCÿ6ý2ý(ýÕþÉ;R´§zððÞ•É"Þ˜Ü%ºCiaàôÿ4ÿ•]Å.rÖ…N ^¨`É65­ØÿVýÊþBþ»ÕÃþßþyþ†þ5þ„ÿ–Ý{ @æ8K}% c6·: ò – ˜ ]  # lÖ[£fÓ ÿœýoüÐü…ù£ùÌùå÷jö÷÷ïù†÷YóeñºòZõmùûOùG÷»÷/÷‡÷¡øªøåøaùºú&÷óRóþôçö¾ö¥ö¥øzù€ù°øœú€üZýFýxü[ýR+ýü1ýâ ‘Îî{‡5‚stk-4.5.0/projects/ragamatic/rawwaves/Drjun2.raw0000644000076600007660000001126612327014024017440 0ustar garyû(üšýüŸûìý‡ÿİØ•ÿùþøýÍýkþrø¶Toþ½þðÓ:Wè@œÿÿûÆúMüÿ0Øì»ý¬÷cùŽýø”ñäò/üZÿ‘þ²û¤í_ßÙÝ®íoúªùõÌ÷«ô9ïhòWý7ÿ)ú.ø4ýIÝþ°# "§ ê  ¸†ÿ†ÿ`` ¯y× ¿<€iü¨þoÚE ¶žå оÌþLøWýtQ o q|¡` ýxúœúøüûEúB÷sòQðsòpðëéï÷¤ûsùgöÜô=óõŠø½ùcùãû}ýA#+ÍÓ Â , Y ª*šž~—¤yî¹A“… Í“ö§  Ѧ¢úß‘ßOjsbGhº ê ­Qÿ.øzõCïóðßî­ìTéå{èÐæÝ’×gÕ×ÞÜoÝ¢Ýýâ¸êíuîàïì-îï[ñÈöÃôÐòæô÷ÞüŠþ/ü™û–ýdMº ÿ´þ†ÿÿ¬µÿ“ýcû<ú3÷È÷¿øOú‰ú¨ùïúaø·øÞùøýþþŽþšú¨øéùcù«ú¤ûoø}ô’ò–óˆötø'ù²ûÇýž)h6B½ é¹{&$,.Ä/:/{.š.Y-C)Ô'I&$Ÿ!  Îf “Áoÿäý¿þBÿiNþœý„þ½<š¿G`z # ¯ ÿ»é€œ #ò¥•O jb\ 4Ù¬Fü$ûÝûŽøPõLó~ñî›éVæëäãåèMì5íÒðóeóäòºð÷ìéËëUìgëélèÓçmå8á‹Ý´ØxÕ-Ó4ÑVÐûÑÑýÒaÔrÖ/ØwÛÛñÝßÿâÁçZìHïrò±ö‰ú ûkûûšúßù¬øò÷öõ‡ò…ïöï1ïùï÷ðHñˆðUñ¸óÊöÐùÈúÐýp„ ÄCžŠ q¹»›÷ ‹k“š!ï.€u& ¼” ‘Ú€ ˆ‡§ †q³Y¢"¢$¥)..X+ã)])b(X"ÛK8 uHøŒ $ Êoþ3ÿó«þVýÂÿã ¤Ö“Ä,³×“c7t Ð Ç j ù•ÿvü³øVñ¼êÔæJäñå-ã¹àÕÞ-ÜÛ¶ÛžÚ“Ú8Ù]×+ÙÉß;âßÝß>ã‰æ¢æÂåÀæŸéWë½ëÈíð ðSîIë å-ß@ÛüÛÿÞáQáàKà(à›áVââDãdæ›êƒí€î²ð›ô³ùü*þ¥‹é¿ ý J 6 Ô  ? ´ Í Š  !MWýœýüºúÿù…øŒø€ù2ú5ùø×úõý4ÿH¿ê Q \YŒV‚? 5 Ù0„¤×ö3Äx- ?Ñ A &Wö‡€ ’ï%™K “"ü"Æ c}_âX*Ƽ•œi !ê#ú”ûïõ1îÄê`é¿ê+évéè(æªæšéIëèíªðò¾õ ÷,øêû ü¨ý¢þ¹ÿ¾ÿµ+%æ ¶ýèú÷Ì÷­÷rö'ô~óñEï«îìÖìTí·ï“ðJðŠï ízíëïðñIòîô.ó®òÅñÏðÂñ3òƒõ¨÷¸ööõGòiðÒñ6ó³ôšõ‘ö£÷›øFù.ûÅüOü™ÿ]HæÑÓ × tžˆÉàn/'ϲ¿ *E ÿ»þLþ”ý”úRöÆóšòÞótô’õ_ô¤òï´î¯ïñÍómóÂôqôvôöø‘û¼þvßãó*fqç C 9 ü – oºÒð ã ™ õ ›  ` 6 Þ é F p ’ t p s « s  ¾HK`ÿiýëýÈýƒý5úu÷õ¬õcô¼óËóçô‰ö÷»øÀùgùoú¶ýwÿǸ}6„ª Ü &, y ý µ þ“F Å yÞâq ® 7 úö8¯'„Çð‘<m#&!÷¥«_ÿÊþ¶üçúaøÊ÷ÔöòøÃúÑûÊúLöØô•ò|ñŽò‚óIñ_ïpìâëNêâêºë.ëIêèëQìOìéí¬îXïtñógõ_ö°ö»öH÷8÷ñø-ú)ûwücÿ ØÓÿrý’ý›þnÿ(ÿNýïü_û¶ûíúXùˆúºüëÿ&ÿ|þŽü²úéûŒýüÿ{ÿ«/%ÿÒÄê}¿ô,Š?ÿ¦ýû/úBù»ùú û_ûLûÇüSþÿ·u§óÈÐÍÄ p t * :ZÓ ˜E® _@u ê ¢ + ~ á ” : .§ ì˘ôþ.ûèúÜýs]ê/øþühýÆ,@KC³ÿÃúÈSÿdþ—þŽÿ¾ÿ‚ÿÿ#þ-üßü„ûÚûkü‘ý°ýèþ ýìþÿÊâSx³ÄŠCÿ¿ÿ¯ýÄýrý þ4þ»ýÇû#ù›ølö}ô!ò¦ñ,ïèð¸ñJñåó“ó±ñøñ‰ñ¢óq÷×ûý/þgýÁýÍý@ýÚÿWïrW}lù¥;úV´ à}Š>þÓþÓõ ¹”[úèV»7ÿ¦ÿ© SuÿüÞû‡ûÔý'þhüø&õòäñÊòyó˜ôWôsôÒö.ôøóˆó*ó\õføÞúmúªúÝú6ùcù¿ûˆü1ü]ýýuþ1ÿJÿÑ"€0ƒR’ÿ”l1gÜÁ³Ý·ùãÖ–ÿÀþÏþþÿÚ]Õÿ‹tþÜý¼þþýºÿ0>þ¦ü÷üü–Äåˆÿäÿ"ÿô. ÷#v:N*ZQô š ƒ e c  y ôXßxîcñþ1 < ñ ÈÑ­bB½ÏFl,áÿâþ¢þÃþdÿ ÿŒÿàÿ¯ý¹ü;üîþþúÿ¢ý†ú¹ø×ø<ø?ø ÷„÷õ4òËò±óóýô'ôRóÍó.óFôôîõ‡÷#øýû9üRüpûlû"ü¯ý¢üÿýüQü{üÊüaýiýQý"ýüÄüú8ø¹øàø³ùûôüBûúEø öðö!÷v÷cõNôÔõ"õŸõòôÎó<óXôíöí÷«öyö¶÷þøù‡ûýÿñÓ7&ÿµemugSÏÕ}ÿ‘ÿHÿ !<±,ÖÄS ] F j À ù  6ÑŒ â ? †  'Îÿrý(ý<þ-þ—þRýKü]ü¯üŒýøM/~q ?¢åøã % Ï % ‹ v / È Ë Ðª6µÔt¢‰ÀM³ˆSÿaÿùÿòþüâû¶úÀû1ûú.ù¤úúÐûÅþ0Ú•^¡þÉþÙý·ügýý¸ýÍÿHÿ«ÿHþZüuý0þÿÆYï6þWýGþ-çYÜRønõwÜ7úÿëþéþ ÿ#ÿþþ¢ý¨ÿ5ÿcþgý7ü4ùdõÃó¶ô)ô ôBóãòÕñèðÚñMóä÷Vû þqÿ!ýêýaü û=ûëü¶ýüü•ü’üñýþj‡Yÿøÿ¶ÿ ÿ¿@Ⱥÿôo5ÏuHŒÿ=7ÑéL<œýŸá¬ m;ÞØ•4ÿjÿkÿHýšüÞý$ûÝø[öšö{öÈøø<÷Ç÷~÷äøAútûHûúNúžü€ýNý‚ýšþBÿÉÿÎÿa÷À\eÉ $÷ZF 2fÅ qÿþMþÈÿÿŠÈxXþ€ý8ü¿ý5þ…þmý¢ý”ý"ÿIã‹’dzZÃZÿ þÿ=`t ýÕùö÷÷¬ù£ûÄüù¢õôNõy÷øâû7ýýžüÞû:úËûòý®ÿ³ç 4ÿ<…ïZÀÃ7ë0í‹ÚCð´#€¢è`CÈÔÅžÿ¹ šî‹÷ÅjíëÈŸþKûsùÅúXúzødökö5öÉ÷Üù#ùñùüúµúÛûüüiûñý¸ÿ¡`˜y£ó*𨊠› / ¾ Ñ ÷ ý C  ½ ý ‹úÛ|mWMFÿ·üùûú¢ýVÿ®>•ÿØý’ú×ùxúÖüXü­ûVùÖ÷èöCõVöøîúxü¶ý†û†øìöˆöS÷Ïø•ûEý¢þ;ýUûpø÷eùïü þÿsþÜþiþÐÊ¥îŠÿCýÒûžùd÷êøeúŽû,ùÖø÷CöWõ˜ôÀöøñú„ú8öó8ó ô€ö]øüù–ùåû›ý4ýÚü½üü5ü€ýéþØÿÿÿÿ¨þçÿý#Kpç=vÿ^dJ” ~þdý¨þÜЂôµ¯h±Ï}páÐùäU r  ¯ Ç W  áÌ Š U j  Í Å†„"èYWü5uœ Œ , n > « :ðê +  ìIœ?2b(–J(®¯™ˆË2Τ0êþ)üNýUÿÿÇþ…üAúù øJ÷ìøÈúùÅ÷Âô\ðùðˆñ¨ójõÞ÷ø]øEõIò òµôõÒö÷øÎúcùóø¦÷w÷øù•ú¶ûaúðù[öóõvö)øÍú–ùãù[úú½üýžþü¾û#ùÒùOøÝø÷ëöÚõžôùôÉôÅö÷ãøt÷ ö"÷I÷÷"÷öÓö«ö ÷Gø\÷Iö]øú­ùíù<ù>ù†üÀ"ÙÿÛÿdÿ'Ò‡  ÷   ó ã … à “ \ Ý - > ”½o–ßÒ: ­ ª t»ü6 å á ô«(¦^ô•ß1ÿþýôÿøEÒÜ­^P&`Ú§eœ <j‡ ]§Xß|LoþóÿRYÅ}ý€úòûý‡[£9ý,÷×ôËó¼óªõ•õXõßõ¬óÊñ ðÎñäó‘õ<ö¡óµðùòô¤øú½ûHúâùÊöØö÷ðûýRü‡ûaürþ£ÿ‘æ}l¦ªÒþöþ†ÿ¿|\xÿ‹þký{ûQúïü+ý ü"ú’úÜúˆúiûüþý8úªøÇø=öú÷¦ú û¹ aþtýÜýœþyýüwýÔÈÎî»z%öxöñ NЭ ³8x ‡ Î Õ’§½ J ¾u{÷û¸ü±Tðcý€ü–úé÷ú[ý´ýÁú÷Çöôð÷ú’û*ú‹úúqù½úšþžiô™£¾Œ‘ØÆ†¨Û‰Ú/ïŒþ¼ÿq¼|ý¼üCþŒ?ÿ-äìõ›üåúûùeþûÁ÷ùÅù'øNüoýªºÿÛøªòÛò$õóíñ®üû¼÷bù«ÿaýyôúôÀúûLùc÷Úø!øÔöö8ûåÙ&… VþnŠ}î  ë\ì"¬ÞküÈ" 7 ï ¸ + ݾtîûùùstk-4.5.0/projects/ragamatic/rawwaves/DrTak1.raw0000644000076600007660000002310012327014024017350 0ustar garyøØøŒùùéùOùŒùÔùnøøúÙúfùLügýtûiûXýFüuûküùûãû”ü7ûÁûªü_ýcü©ü°ýþ‚ÿÛþ’ýÓþŽÿÕÿpþóÿ°2ÿÕ¥*[ÿʆ›ÿ¼ÿÙžó–)ITJ—¿ª3Z£ûàH×dèXÏŸ :åȵµùž Ý )±ñÁF¸ßÖ-%üoþ–Jï8ÇºÉÆ›ßlŸ6¹ðëä] ˆ=è.÷ #ùëò¸"ÑÀòˆñ—+@Æ%ýÊkHÍ×8Ð+Ýàô’úg*«A¾ `<êêºìÞŠ“&Æ1½ÝÄ%iIÀ%öú¬ùç&ÂóeÈ•sýðÜ0ôì1CuõÓ1îô,нû¿ûê‹BY> »å/ÌläÌÖïæùIg2%5¡åþ_îy¸ÁÙ±6ú×4o.ìü ¥.ð|ÇMµ&ðô¹è;ŒoûZÜøºDå¿øpî}]'Õ7ø ú6èÎ`Æúù£>Š%{ÿÁ ™ýlÝtºúâböïñà‘5º.týó¿ë˜¿Ëãýù)¾@) yY %øÆÑ_É ó”þ‡ Œƒì3µAG ñøÖÇÔq÷3EÓCÉvîÙϓ׋‘&£rå\òd0#¡0³Îñ)î ç$å(Š:‚*3lû»ÏYÑRþås•4 Vóåîü™câ˜Ñ ó: v!àCzœˆúiÊ€ÏÜûüø]Š*ïA°j K æΔ՞îñù`ˆ$‹3Ì( ¿öh×´ÆŠå)ü‚ã-¿*OsþólÜâ¾úyã _ôä÷^"³0&ïìŒØ¥Óâò÷C)Mähú)þø½ÙÆÓ^óïµ µ$­Á÷óØ,Ó¨ý7rêÁïþ ” — ¶#gaï$ø•áÌàgú‹ëÛ0¦ÿùGêRÛà˜îtø1Ž!yÊòSò¢FäÜÏÜÝRò  "<%ýãõÚå!Ó•âóò÷’+ ¼SâþÏé7ÍÙÖËóª— ¦:2³ùú¬ë×à™â|Ü‚ü= p*D54/\=ç¸ÐÜ•öÒ“Ù5h4' ¾®öÙ Þ%òûB’-6Û1Ààíç‚ËÇë=@ G²,Ì"0í¦ñx8õ)ë;þ• ®$É2ÿÿíoß®î÷æ JIþév7Ký÷‹KgôúEò7A_ùŸö™ aý¦÷ÐêXêØü]%/2b«ïSÏSÙ1YH ø žVMå÷NÞeÎyãZü/U-• Ž8öàâÍÂÙÁðµü¦ç˜KbúëßTÖ‘ãWþÍ‘!è#œÝú]êdÏàØ îkS&³éðÃØ}ÓòížúN'š ]rÒìUßçÛkà{÷S ,¶ôþã÷zÞÓuèOþ~- Ô  'ÿýíHâKÝ¢çú H!05 -ë~ã·íÁöÉúæª$ùCãíOáùçõãV'É#ûì@íÅÛ'àC÷3 3ê&#'.û}ù)ìIì8üÌü]†&û X ¤ø…çÒÞê( ±"à ;øö¸è\õç×ýFþ…|…WÄÎüàè{êœýÆ –2cÕ-øÝïMórôžõWQc¦ ÊùwöÅíé2ü>å è”pó²áþæûóûÿô»À SÎ÷«ã’Þ{ñþÍ >0ã×Òòt÷7ówíÞòµù¹× (ü *ü\éÝæÉó.ù ÿ@ _ ¾þBû_ô›ðËó×óUö-^›Žkü±õ‡ð8ñpùZùAû’ `äø÷<ôèîííVñtûaŸ Úü’ø´ýWúñ"ésï¥ü26hM `ùBðHóº÷•ùAø(ö§jÏ 5þÁ÷-ëøî>õNýçÊÒo$ êÿ˜ÿLóNëñáý9 µù ù™sô±òEÿˆú½RE` V[ü÷õïþòšüløƒ«?8ö4÷ëó§ì˜ø‡ä 9 HýpñQìØò”ý”ÌN ­ƒxÑêíäæ/óù\‰U^ ðû1û ýLüüI,‚ ò Xíÿ˜óõï÷õÿ#"ÏÔ­ôêðŸú†þÎÅ…ö x  ßÿ)í ë¬ôüÈê ÚˆúÀðúë ìR÷°DÌ[ TüZú:öwô+úŽùEù& ¹ø*ùîò ò^óGùe Z³ù¹óÀû6ûPø»ú]ôìÔõ;èELý§ñ}ë ð†üIå—½ú)÷äö>ö«øóõ¡ù@ý± Ë¢Nô@æwðíö ÷[ÿ5XáùûhùÍ÷Ûù¥óØùîo€˜ú[üEþ¤ûtû¢ÿ>ÿqûoþcr—úVþþÿÿÚêü­ùýDßþKÖ ®úiÿúþªúîþ{ Zß&L2ý›ÿ_‹)ûè7<ò ÛÐööóý" ñ èþ‹·Ay^ 0„†ÿ{Ћ F™€ãurÿ€üŠú¸ÿXÊA îþ‹ÿþúü´üN74¶X ýŒÿ ü2>C þrP"ü“ø‘÷\ÿ·CøÚôrô ü ¢ ~|/ôÙò¸öøù=÷ûú•ÿ9 5bþÏ÷0óíõÁøôÿáfþåùNúýù‚öÿùàý#ÿåwCùžöDøúùúØøëý|ÿ¡ÿ-üËö9ôô®ô#út†’Öÿ!úªöôbôýÿ#þºüü¹\%þ5ø`ñæö¼ YæÙû¤ö@úü¶ÿ­üzûŠÿP*ï‚û‡þ5Í¥Xÿ¼üpþþüsü$þöôçÓ£üÓûšûúXû›d¦ 1±þõø õ"þðç eßÛ4JIÿWšpüFÝþ°£.Ù þ¸ý„ÿ6}‘äþ“ÿ¤¸cRµ²PxïÅödKÌô  ç½Ë“ÿÖþEãOùˆƒù$j–úö‰ú‡ÿ„½ÿzþ->ð û=÷ºú¯ü@ÿ¥Ùq¿þ¼üýrþ#ýPú‚÷êú2ü}ÿçÀ°þOÿ#úŽôÄ÷DýýPýƒ6ïûàøªùXùŒûWýmýû'ü>*ýlý¢ýÉû]ü¼ùC÷æüB Cû@ø1ùøŒøÖûJþ°þÚýœýûãûùù/ùâù ù¯ûésQÿexþ¡ú¦üOþfü×úÈû‡þÿ‘ÿ[7ýýþ÷âø±û¦ù$÷¤ý–¿=YýíûwúRý8ÿIýü¾ÿ<Z U 6çªý¾ü<!ùdðÿùþðÿHLß»ÿÿªé†0ZÿÄzþkÖÔ·ÐúûÀΗÄî/Œ ó œ®þ;ÿÒ'V8 à ý œüýüÚÖ!8âHu0 ÉýXýAíÿþÿ8ÿ?×–µþ…ýyý-þòjÿÞ¾ý~þüYû¶ý?ÿIh‘ÿ=ýPýî Yÿ½ýþ3útüàþÖý§ýäýŽüAþgæþ>ú/ú<ù®ûÝþòÿ:ÿþ! ÿ¥û~ùeøÈù“ü(þŸþ¥þÔÿ–ì¹´ý×øÉõÖ÷¯ü ¸¶ÿ=ü«üüPýBÿÐþ–ûÕùøÝü`ý üSûúø5öûüáRÿÆý¢úOø€ù»ü¦ýtþ®>ÿxÿü£û7üºÿ»‚2Ÿ@‡MdSý#ø3øçýpÿûûrÚÿ’ü×ýóôÚÿ{ÿáþÇünu±žÿéþdÿ‹é|â0þpüÎÿÂ=«¿5Ššk¯ýçûÃþ‘9ߢèˆñý›üUþëé×è¾g¼Œy›ý0ÿ0åW"{̸ÎfÄ•³¬àôû”ÿòïH”¢Cµ«cÿDÿ¦&gªü.ùOú2þmÒ\¶e¥ü&úCù›ûîe¥Y‚þæýÉýëüfýAý:û·þ7Zþfúîú û©üÚýüÿYýÈýþžýgüfú’ø+÷ªúþÜÿOü°ú†ø÷÷ûdûOúðýþ´þ?ÿ*þŸûdøÐöñöwúªýÏÿš¯~þ™þþ/úKø¥ùIùãü‡ý*þyÿfþ¶þþübúø§÷üúLþľæ¼ýYûLýªÿD²ÿiýûôþߦ[Kÿ‰ü ûÍþ©J,}ÕþÿþW5ÍéÿÇÿÿƒÿ¦d·ÿþtn›W•.¡®tþDþôØâcc-Íþþþœÿ^þÓÿø= , œêµþ¦ý­=À£ó£ Ðˆ£ýèÿ¨}˜ÁÿTÿ(ܳÄ3¡0<Âôð³Oc™£[ÿ1ü`üïÿÓsÜÐ& ÿ¨þAýžý7ýWþtþðjZTqAý…ú—ù0ú×ýÿ xý¸üàýþHýûéý þšÿ^tÿ,þcþÑþƒþ4ÿè•ÿþµþÁþðþ+ûöûÎüýþpÿ‚þòý`ý_ý”ý û×ú²ú$üVx_ ·þ_û„ûûàü7ý ÿÅ;£@ºþÃü"ùùÙûçüÚþûÀŸê4þ¯üPú^ùÛüþ¬ÿœ—elÿaýLÿ·þÓüçÿÿDþŸÿ²þ”ýWýæý7ûtüOÿÍèÿúÿiþ ü üüýüÔýß@¹4ÿéý¾üÈü}ýý¥þïN#R¾¥pýÊüÝüâÿ ¼Tľk¼)¤þYþþÅ"@ßëæDè} +˰V—·‹“p@Ô Y*¡TÿFÿbÛ¯Á|£ÿÈý‡ý\ÿšW¨«v5Òš þvüÛüðÿYÀOW†ðw]{ýÇýüýýœÿÌ`¤Õ¯ÿ<þý ýöÿظ';þØþÐÿ\ýEþXÿˆþíÿ5ýNû¨üÜþÿÁqëÿÌ þèüû›û±üNþ㥽ÿýügüsûéú'ú5ûÑýtþ¤ÿ”þáý¾ýùý¦üpüÕüÞûdûˆüêýÓþ=ÿþ®ýOû—úáü}üYúÿú÷û¹ü]ý7þ}ýÉýlüáüý1þÚÿþWþý€ü(üÏþÅn”È¿þ¯þ-ý–ü4ýÿY`•(ÿbþÅý¸ýý¤þýý•k<WñþÃþƒ*ú€ÿÖ˜Ÿ,B¥—ÿ•ÿ,þ‚þÃíñçç‰Ð;ˆh;‘ò¦Rÿæž ¼Sÿãþ¥ÿEsÙ)¾Pv2‡ÿ‰ÿÖÿÜÿ0ÿläŠ Ó¸]þÿwÂîë©Oæg3ÿÓþ×þþ»JXÂý£–²Šÿÿÿ…ÿ&þ³ÿ^\B(ë@ÿ…ÿ¾ÿïâѱû¸‹þŽý´þuþNþ±þÑÿp³"þ(ü®ûúèûüýJþá7÷ÿEÿCýÐûßülüöüxüåþÿ(Gÿ¼þÃü¦ûƒü@ýcþÝÿAþùþ¸ý×ýÁþßþáþýbý—þ¤þqýÒýQüãüüáýüþñþõþ“þÆþýëý"ý9ýRý(ýÜþÿ>áàÛýóûû±ýýq5™ÿ[þWÿOþÏý”ýüÖüüºþØ{{ \ÿ þ{þúþìý¢ýÄÿ‡˜UÿNþ}þ6þÜþçÿ$ÿœþ¢þþMþ¡ÿ?ÿçÿrÿ• ÉÏÿ²XŽ¢6žkÉ7åYðÿ0ý´þrÿ1Ð3&'Qãÿþ4þQÿ…¶ˆx4rÉ¡ÆÞ]2´Ü[¡ˆå¡Œs ûêÿÀÿ_×ÒÖå kˆ*þ$ýŒþb.`ˆ”ÐÿÆÚÿ*üÞüfþÿGõ¬ÿ‘ÿœÿ^þÎþ‡ýÀüúþÿ þ÷ÿ”ÿ[ÿMÿ¹ÿ’ÿCþ^þcþúÿÿ¼þyýäþFþñÿö¥ÿÁþ‰þÿþÕý¢ýÊýüýˆþoÿ$ÿwþøþÂþóýÝüzüèý~þ_!=~ÿfþzþŒþ±ýYþÿuÿ!%ŸŠÿvýÕý|ýƒü©üÐþiÿÿùþ@üÑýIýÅý–ýý5ü”ûüpþìÿCÿx þˆý€ýáþ1þ‡ÿ*þÒýUý<þŸ%!ÿ…þõÿÿQþEþÿ#þáÿcƒÑÿpþÎþÄþ_ý¸ý²ýßþùcÒÖ2ÿÿÅÿÐ(ÿÝ ÖækÓ ¯qÿ¨þDý¦ý‘þ‘M_žÞá§ÿþ^ÿeÿìq]™¿ §†ŽTÿ×ÿeÿ¸&ÿÖ˜ŠïI/¥ÿ–ÿþ¾þ×ÿt”ÅÊxgcV­ËW&¿5å åKÿwÿ¿¢RygpO£dÿöÿ³ÿ´ÿ©ÝÐ*ìâ«©Ë@n}L *¾Èòæï›>ÿèþÀþbÿTÿk àÝlÿnþ¹þ-ýlýƒýÓý°þ”,´ÿðÿUÿþü˜üÈþþý¾ÿ Š8ÿþ üáü ûÑüüqý²þêÿ2ÿKýúü–üýþWþ×þˆý­ü¾ýbÿÿÁÿâÿãÿ,þý±þý±ýý"ý®þ6þÚ{0Iÿþý;üÜý1þÿ<D]M©ÏHÿ þˆÿ^vD0´}EÿéÿÎÿþ©þËþëþºÿ€cÿÀþêþàÿFþ¤ýhþþŒþEÿ^ÿíÿþœþô6»uþxýhþ»QêcRwtf²Ä ÿìÿ#þ•þ¯ÿ›/Î;Õbÿúÿ÷Éyþ`ý‚þøºÖ¡qfÙ±bk‰|% §Î;|kÿþAþEþ›þáÿl¢äÿùÿ½–ê[ÿÜÿ9þ³þùÿÀ©Ü«)B—V–ÿPþþhÿ/ÿY$ñCªNVÿ€ÿÿþêÿC«úO×(Ößì?ilžSÿžÿrN^ȱ5þhýaýhÿB¿* 96 ÿ¶ÿýùýŠþ9Z° iþÚý×þÎÿˆÿÁ ÿÝo1 þÏþ³ÿZÿ­ÿ ÿ¿þbþ(þÌþ¥þÿCÿ¦ÿEþ“ýèýƒýü—ü¹ýFþþ«ÿȳÿÿþ·ýÏüÛüØýlþþÕÿ\ÿ“þ‰ýîýËý®üþü)üÜýÍþþ¯ÿrþ¼ýüþ#ýÿýèýrü°üÅýKþgÿWÿÿžþÿþyþåÿKÿcÿƒþ‡ý2ýýšþ­¡ð-ÿÎþëÿ§ÿ«þ„þþCþ,ÿe“¶H“ö8`aÿ”þïÿ~Hµ ­qï ÿ\þ†þþŸÿqÿiÿÚÒÙÇÂÿ2þ)þ|þýÿ·C¼Œ|…ÿó6I&Õ,­“o³`Uÿó[ÿ÷ÿ60.©Ù4ûwÿdþ²þ׬]ÁìÀ͇ØYR†Ò'Úÿãþ¹ÿSÿþÿ[ÿ ÿ"ÿ5;’U!ÿÈþöÿPÿKÿGÿÈÿÏÿâSņ*ÿŒþ¿þVþ\þþ7¼½åœ%ÿ½ÿŒÿnÿ9ÿ¤„Ÿ«û(ò? þçþÍÿ0ÿ¤`Rr+`ÛÿÆþ€þþ%þ¶ÿ¹Sp…©€ÿíÿÿDÿ-ÿ?ÿÿ>ÿ&ÿvGrg6ÿºÿþðÿ(ÿÿÿSÿ”Û#ÿþýäý¬ý„ýœþšÿ”ÿÁþÒþýhüÁüœü»ý+ýõþ]ÿ(ÿpþ‹þoþ!ýòþ{þ”þýjý*þþˆþ[þ÷ÿ¢ÿŒÿcÿàÿþýµýlýWýÖþ¿ÿ–ÿûÿ£ÿ—ÿˆþÛýïýÖþƒÿŸÏÞVÿ¤ÿÿFÿqÿ2ÿTÿÿáb«5Þÿ°ÿ-þýÿU•6_úaí|™lZ@µÿªÿ\ÿÁÿwÿ~ždˆŒ]Åÿ9ýôýàþrþîÿêŠ}¨sþ­þþ“ÿÿ;ÿËHÿÿz¶†‰8 É‹NWŸö÷geø|ÿžÿþÆþãÿz±„ îÿàÿïÿ‘¹:)XÛ €ÿÖþøþ~þÂþäÿIWÿùÿ²ÿEþñÿ ÿcÿÿþLþLþÈÿ ÿŒ‹ßÿiþrýÄþQþÚÿ<þÄþNÿÿoÿœ·²ÿdþ—þ/þmÿ*ÿÉJ ]‘s›Þ]2n¡%'ÿ2þøÿ,ÿ5ÿ;ÿ€ÿµÿÒ‘`ÿŸÿhÿÿÿ9ÿŠÿ¦ÿLÿ°|ßÞQÿ˜ÿQÿI †ÿ³ÿÿSÿ‹ÿÃ#z´yoÿ[þÔþºþáÿ@ÿÖ›úÀVÿ²þ0ýý¬þ‚þ‚þfþ»þ¥þQþÐþùþ_ýªý+ýþÿ”cbþþýãýÆþ0þBþœþúþ¢þnþNþ“þ¯þ³ÿ2ÿÉÿ&þþÕþ¯þºþ¡ý¾ü–üýÂÿÜ:§ ÿ¶þ3ýÃýœýêþtþqÿWw §Qÿöÿoÿ‘ÿÏSyeÿì óÒí~;³ŽBÿ˜ÿ­®‚wÄÿïÿŸÿ†ÿÃqwÿþÿ›ÿPÿ—ÿ©ÿ˜ÿ×ÿeÿ"ÿ¦ÿºÿ´ÿùÿ÷ÿÓÿíÿ®ÿÓpRaؤŸ™}îÆQÿáÿ›ÿ¡AÊN"`ÿeÿ>ÿÝÿç7^ÿøÇrDÍKR¢ÿúÿÄQBÿKþvþ®þçÿƒI¸«YÿëÿÁÿ‰þôþ³þÐÿ>ÿ®RØÿÛÿ'ÿ þãþ€þ?þ£ÿ8ÿô×—(ÿqÿÿ&Kÿùÿqÿž` Ò+ó²cÿ±ÿMÿ~ÿˆÿƒ™`]ÿšÿWÿ=ÿÿ(ÿŽÿŸÿÞÿû1[ÿÇÿ¾ÿéÿ©ÿˆÿÿªÿþÿáÿòÿóÿUþ×þýÿAÿ¼ sƒ<ÿûÿøÿ7þ¬þAþUÿÿÉ™¸ÿ×þ³ýÔýKýCýºþþqþ¹þüþµþ]þyþØþ©þ?þ"þUÿ"ÿdþÈþ&ý…ý%ý ýÞþÛÿ·ÿÔÿ]ÿþjþ#þ<ýüþ*þÆÿeÿ<þ\þ3ýóýêþ¾ÿÿ ÿ ÿ#ÿ¹ÿrÿ$þíþIýÙþÿAÿò@p‹hÿáÿÛÿÆÿ”ÿ¾ÿïÿ®ÿÍÿñ$Æ4’©%(ÿúÿòÿÿ(ÿÌI`˜ÙÂ&ÿÎÿ?þtþ|þÕÿ#ÿ‡8ÿÿ"ÿfÿŠÿxÿ9þàþÖÿz#ÿÏD˜|C›Ï†“[<ÿ­Sÿÿÿ{ÿrÿºÿÆÿõ&uiÿüÿø ÿuþÄÿOœŽUÿê‚ [(ׯnÿƒÿ,þÐþƒþî VÿâÿlÿþÖþõÿÿUÿ¾ÿ™ÿ6ÿ*ÿhÿÿšÿwÿþßÿÿœÿ·ÿnÿ3þ×þŒþËÿ%ÿ×{ÿîÿ#ÿ2ÿ£ÿþDÿýÿ¸ÿ¿ÿ¯{øË¤’Á4ô,ÿ´ÿ{ÿ ÿ»ÿÌÿ÷~Ì@‹)ÿƒÿGÿPÿáobToŠ5~;-ÿ¼ÿæFy=ÿáÿýdÊÕz*ÿÓÿĆ•o&”kÿšÿ$ÿÿÿ:ÿ}ÿ]ÿ1þõþŒþ ýÛþ>þˆþ“þWþhþ¸þûÿVÿdÿ|ÿÿ"ÿ%ÿ^ÿþ¶þoþRþþ=ÿ®£ÂnÿˆÿþÂþÍþ¸þ6ýëýýþ~þïÿ;ÿÜQÿüÿ)þ±þ‚þÅÿÿ7ÿÉÿÌÿdÿ‰ ;ÿìÿÌ*¦ noÿöÿõ2ÿöÿPÿ)ÿ»Ÿü¤ IÿÕÿÜÿô7 ÿãÿ½=52ÿØÿÞÿnÿ_ÿXÿYÿEþÿþžþÛÿ”7KÿÃÿ£ÿ&þ“þ°þàþøÿ/ÿŸ{Yz17ÿ`ÿ™'uÒ¹~V>iAÿÐÿIÿÿy¡¨"ÿuþõþôÿ=ÿÚH‡Ã»«y_nU©û©ÿþÔþ!þ/þ§ÿ9ÿزºbÿÎþøþLý«ýáþuþþÿtÿÈÿÉÿyÿ9þ«ýËý×þŽþøÿÿÿÌÿ.þ¹ÿÿlÿ¸'Q ÿäÿÅÿÿÿ¯Ê/t§”´h5ÿñÿÓu¥œgÿmÿÿ:ÿ;ÿ×Î ¬ž‚ÿñÿÕÿ÷ÿûÿÞÿ³QôA*â†*ÿôÿéÿ–ÿ‘ÿ ÿ²ݧ˜Á[ÿÄÿ¸ÿíÿ¸ÿêRÑ’ÿÝÿ†þùþºþwþ6þTþ¦ÿþšþþ~þ«þ þˆþÃþ¯þÍþ²þØÿ&þíÿAÿ±ÿþKþþ(þtþ÷ÿÿuÿÇ ÿ˜ÿ,ÿVÿ þžþýÛý½ý¾þ_ÿÿ‡ÿ¿ÿ½ÿ=þñþæÿLÿ6þ®þzþ€þÀÿ:ÿ+žŠ¥Ñ£ÿ¶ÿ(þáÿ'ÿ±Ï.?'ʺl9ÿÞ0ÊÎÑÿ°þÃþpþóÿÅÿþГÿ¸ÿvÿKþÎþëþôþÕÿÿ¼CÿßÿFÿþåþýÿSÿþñÿpÿ£ÿ*þÕÿ7ÿkÿXÐ2 žÿ­ÿ7ÿÿAÿpÿ“yÚq`&ÿÕÿUþºÿÿZÿ–ÿÝG(ÿ…ÿ“ÿß^:f¸Yÿàÿêÿà4ñÿcÿoÿ=ÿqÿ­ÿ_þ“þ“þªÿ|e®ƒÿqþéþlýèýÔþPÿIY~RÿóÿBþÖþ,ýýþ.þxþõÿˆ*ŠbÿÐÿ×ÿ¹ÿÿÇz›Šÿø_”šÈæÛ}ÿêÿvÿlÿ‡ÿ¢ÿ¡¶¥Zÿàÿ¢ÿiÿ+Jæï9aʸÕÊaX¨±™“syÿÓ6Mlž [[·U?L¥ðºœ‚="ÿû%.ÿµþùþ²þ\þdþÞþzþ×ÿ ÿ”+qÿCþÛþ&þJÿ-ÿ¡ÿÅÿRþøÿCÿÿYÿyÿ‘ÿEÿ>ÿ•ÿôÿ‰ÿgÿþ¾þBýçþ4þ¡þyÿ8~ÿ±ÿþÂþªþ°ÿ*ÿ¬ÿ’ÿÿhÿ‡ÿ5¶N•~¿±,ÿÿ8þÈþðÿæoQÿÿ áGÿpÿØÿIÿ²Nÿ‘ÿžSÿóÿìÿãÿÿ•þ¾þ#þäÿþÄÿÊÿôÿdÿ˜ÿÿyþ£þDÿÿ,þÑþÜÿêÿúÿÀÿmÿÛ'ÿ9ÿ xÀðlÿÒÿŠÿmÿ ÿ8ÿÿ>ÿÀ/ÿËÿâÿÏÿKþÿÿÿÿÿ”þöÿBÿçÿ~ÿ®`Œ5ƒÿêeÿ×ÿÿ†þ+þeÿAÿ þúÿCÿþ¡þõþÙþ€þ¡þÓþóÿ^ÿOÿ$ÿ&þäþästk-4.5.0/projects/ragamatic/rawwaves/DrTak2.raw0000644000076600007660000002310012327014024017351 0ustar garyúÄ[ö€jÛ`ÊÏÈ×u)RÓÒ¦Ë1:ÖŠ{ ÿÝÿÉÿ¤ÿiÿQÿ5ÿþËþýÿzÿß "ÿªÿxÿ_þëþZýÄý)üùý+ýiýý¥ý³ýšýkýGývýÇþ ýëý`ý~ýºýÈþþþýâýýLý/ý&ýüÍüü-ûíüüDüIüGüVü/ü;ü®ýý/ýü«üEüAüjüFüLü¥ü÷ýýØþWÿÿ¬ÿÐÿ”ÿ7þçþ¿þ°ÿ7ÿ™ÿ„ÿvÿnÿTÿ/ÿdÿiÿ6þíþ™þþÆþôÿÿ?ÿ—¯z@¢›Žmð%Z¬’ÿ°üËüÒ1& #äq 0íÝÿ ªñå) ãûS Ó =êdìÞù¾ïçÁˆô&ùOíÑé““üžÈûnÈ eùM÷þñ<ëóõ—ý½ùä ­ÖþÄóÔþ¢ ×ñÙÿKêöt'ððþ,ñþÙ±õù2pE< æöí'óÆFc †ùÑúÕ•‰ü½úhúZóoø‰øõIØ&€êãä7ú9®õó4’éÈÝãEð8?3—úµÔȵ2*ôDæ—µcÕ¦ªq*õã‘þË0^ ùöþøèÍa¶dëûøA8Ö#qùBÿîïe½dÔYH'>õ Sÿü ïÿÆÄ ù4ù6ÿ?½'ÿ3ÕãLºwãâü7õª =Œ*bÿŠ O¦å¤½á” øSKAŒ&­ úöôÇ)ÒÞ™úå;CU D¶ ‰ú7ÇzÑôþvöÿ˜,¿>· Dwã×ÿ¿aò:øŒößÖAˆ"ýºô熾ïæüº÷w <.2ã ¼lÞ,¿Qïºýÿûg"—?~5þ[㢽bèšû$ðÙŽ0 7WÜúô^ÁÚ˜ýyñþ±!4C“âÐ}Ú[Âó¯ÿfý&yE&Y=ӮŸ?úVùU m1•>?{þ¼ÎYÂ×óÄø\ø Ú5[:¼“íÓ¾¡×_ -)ÿA&Eéÿ²Øˆ½î1| A4.+ ’1æÆ¼‡×‚ûôôä0Å*ëô^ÚyÏV×+ìz÷º „;ã5M kSóE¿1ÔÉý\T*™6û\ÁÚ¤Äà‘ñ]ðôã+9•­öË ÆXí8õŽÓ.Ø7»].ýçÐ¸Æ ûV°1c1ðã ~¿è Ø’ÎÝàoý^ &9v#éiììÊ’ÊÖé ñ ò» 4–5Ó4·ñxÂîÐDùûä?=+û ®vç[¾éÝŽXÿa")=(¹½¶íéÅlÍ„ó{÷Tü8í@(o/ÿÞ¹¿zãCý þC'E2 [éAÁÄÜ1ùN)Cþ â ‰ûÖ¾÷ë'üìþ å>»+ —þ¬âE¾áÞÜú‡÷a æ6R9ì °ù³ÌËÅÈ÷ ¤929ó¨ræzëÙkþ$þyV8Þ1x¢:磼ÜÜÙÿ¾ý #?ï@û¡êÖÈ5Ø“ú,Ó+6+ sü­ðkéçÈüA½gKb÷·áÁØóÞIò¢ê%ÿøù5ê°×TÕ.ñÉý&-› ȵkøÂÝ.ÕÒä/ý“W-•* ôäàèÃsç­ë*6"C>M ïrήÎêâùTüC \4ŸbüÍÿ á‡ÄBäÓAQ'È9 fd wö“ÒÍЈõv$I4ΫËsîÌRÓöö‡þÎ*ü ÿÂôsÕúÈóíÑë1ë!æø¬åfå5íÿ¸ ʸ’% ‡wþ åïÕSÖæêï¸w'¶B ‚þÑçLÓüÔ¦ì,ý—/ù-  Vgî²Ñܽþ3¨b'e9 D ‚ûÒâ¢ÖzäÙþKá.D*; ²þ{éOÎÌÚÍò£ýäƒ*Á(Þ´ÑîIÙ‹ÔˆïþX á$i2#Þ ÀËô@×±Ô¤ìËC.!.ž½“õå×<ÒÝê,ú³<Û.Iý ßù…ã¶Øðá®öß‘)ø%¼þ;ç©Òá*ú¥…!,Þ†‡ý>é6Ý åóoË/1YûóHææØ”Þþñ¶÷è ì« âìÔõ”á:Ø Þ½øø¾!‡"î˜%ý¾æ‚ÚRåÇôÚ_pìñ ýëŽß³ßæè¦ø…륖 N¿÷Îì<å˜íK÷Ã&©8ÿäû[ô;öÓõ|ô%üQ5ªXŠð9á|ØCã`úÆ O_‹¨Sô÷ã%ß’è“þ æn û–òÝòÔõÂûE/¾”w=ôGà—ܽë  ¢_¡ùô>ë2é*ôÝýw×VìXgú´ì€ë–ïpûks ô'¹Oæîðáƒãžîöþ 'Â$Ð`ÿ½îåBÞ1é[ý©¤$s× óú¢ñê´é*òõ h”"¡ IþzîGç íùù¿3ZŸ‚ïøê‰ðêô_ûh2 ?É@ùõEð¡ð#ò™þt ñ* ZûYîAéÌï¹ûús"wd Mû æøÜÅãCðnÿÄèê#ÅôÂéÊäþæ î®Â Õ CúÖðEë‹òüŠÕl ø ï$ëèïWû$? c ?üOïcãâìëú’ÁñÑ ìù€íöéYéXî&ùí;Xh<*§öçï¤î õðÙ°—> hÿ©ñ í ïÚó]ûó í OýÃùÐôGî¾ö œfY N Ê6%úNöžüâ/  1Ç ýõùsþ¦ýÇÚëÿ ? «þ¸øãõ1óVô¥ü¨Q âÏ ýòœîXù¢  &‡¥æüÿó¢õ­ýhÇ× qólý@ôßùÐúÍøú‰ Y ÷ ñpó^ûBå ÿ ñ¥êŸîõAá­"É 7ù«é#ã3æÿôcà ÔëKkôXë2åPì{õ!úÖª ilô4îïÁòçþ2 u®9 -þ9ô¯ëýì»õ ýW.‚½„ý©ø­ðàéOæ3éuõ§zO@tþbîÛätçì–÷L0V;ö‡ì½èÊñ˜ýb yø2 °ÿ0øú´ûŠøáùgúœû2ýåþîþûâþþ^øÙôëô‡öéÿ0 v  ÜùöõóÚý‰œ Üo öÙþÅü‘øÓþüuüiúËü‘ Ï Óÿ’ø`ñ÷û^þY@„cü˜üJúÿøÅ+ë õ  Z Êð³á÷Ëóóýž ©"ÿ³þqùˆù6úrüSOqƒ…ÀþlÿZ-ºÀÍ÷ Ó ^›þ½û²úûLó\T 3™þ÷äöªø4ùÀýßE¼oÿÍ6)½üÇóÚï?õëþ ýa<пöLìýí€÷A“·®ù¸òíMð˜ùMþIf0“ôüX÷ìö’õMøGûjýÿÛÁ´.ÿcýcõ„ôû{¹ L  =ÿµöçòvöú úþƒÙýiMÿ_÷ið3íOðRöôÿ> ŽŸ­ù½ò)îþóEùC´ 2Å ÄjûÞ÷6ôÓö úðÓüEb%ÿîüžú¢ú¶úHùûûõýß¹ÞÛþŽøßõšõ[úâa¹ &[ýKø.ú~úñýɆ‰ ¯ c!ÿ×ö±óöó„ú5 ?-–ùhóºî{ïF÷ …[ HàûHó™ô}úYÿ§@ ¢ä ýó(òú*w ¸f ÉM6÷óõ:ôËõÏû× $§ S~ýçõ»ô÷˜ýkØ Ù^ xSø•óYð¦÷’: zŠ‹Iö+ë~ê òúÏQ ¿= 5Ðû»õòrôÊú…×á D lobäþËú#÷ù˜ýðÆ# »îÃ¥ü˜öÝôyôSúb }Æþ×÷”òÐõ^úÍþľYðþÌùÀö›öÛú_üùÿÖz¥ LàþÖûhööõ7ø”ùÞüÍ‘¤¸Èý}öñAïçó ø¬ýxó¬Iïþ/ù¡õåó·õ”ûä úÈGzûRõÐõý÷TüÔ¯L'vû>÷ öö‰üLWcüàöyô~öiûV» 7j Ðöüã÷ËøSûF>C Ô UÔüåû†üÿئp¥çÁÓ*ü¿úVúWý<½>©b¬üÅúÀû5# U JM þpû/û{ÿ[ü # 14þÿúáø¢ùôý/x<gÐü%øŒôéö—þT_ P ; Äsqü%ûÄüéÿ8³² »aþ*ûúúü…ýäýÝÿì7í8ÿkû¤øiö÷ù2£3e… þâû8ú;ú£ý«ŠäàÒÈcü}ø'öôø™ü7ÿù2ëp[¡ùšò ïðýù‡›õÑý£õ›ôšøîüƒÿje±¡×,ýÂú»ú øJù1ý <¦û÷ùøó]òõiûõ 0ø¹ùiôñsóìú‹m zë£ÆøVò]òª÷\ÿ/ö À ¨M@üÔø?õöPüEÄØ ûëJüšõ×óÎöCøÑý > f·þ9ù†öÇ÷ïüØàŒg•JüösöüOÈ · 2+ÿóú‘øìúý4ùÇ\!™­ÿø­øNú»ýÛ«4 ¦nþ4ý³ýMþâ7¥âØHþŸÿ4üâüÅüúÿgq<zÇýùùàÿ6£ JÿFüiú­ûÌÿ€¼ æJûÃùE÷Áú"ýœNÂ4ˆø´ó)òÚö2þ9 JœLù9öõÐùœ$ð wýÿÇùöö#õøLÿÆ0X‚ú6ô8ñqóøŽÿþåGnþqø™ôóôø)þ ïIîúžõ¸÷#üž×•‚Dÿ÷ýâûäúù]ú­þ?'¥KkþSú ÷höÃ÷ÝûYþôA&ôÿ†ú‰÷²øúàþàÔ{<!üÅøÐõãøýÏÁa)ä¨ú_ö÷Tú|ÿ‰ &RýñøÅõôùËÿ@·  õÞ\üÉù·ú#ü ÿ¾>c »$þ3ù‘÷_øêýð] Ñ _ “¾þøŽ÷ñú ýPã Ñ ~ ÓŽþTùÃ÷¢øý&ý  oVþ(øÎõÓö¹ý§IEk†ÿÒûÁúÓûxý¬a|ÙM/Ë*vÛ÷ÿRþvÿÒµ¢à0þ8üûxü}ÿ1‚`êÿ¤ýºûÈúùpúWüQÿGóf>ZfþPüHûúüªÿ¬ÂoÕdÚü™úTûIýÿˆ>ÕïGÿƒþœü¶û­û*ü*þppŸÿ¢ý:û­úÏû=ýòqâÿ‚ýÆýÀýü¦üÒýäÿÖgþtþ{þTü…úœùúþ©ü©nƒüÅùú÷›÷áúÉÆmq%þôúKøRøüù÷üTÿØåLþEü™ýþÁÿ‚"¡ÚJÿ0ýºýûþÿ ¬Õ˜jÿÝÿDý•ü6ý ÿA"à´(ýžÿÆÿˈ׋w-ö¡ÿQý…ýAýËþ þþ¾(º>¶ë=Óÿ}þÿÿ“jÇ®˜ªÿ³þZþþ”…ƒ€Q~;$þ{ý‚ý²þ¿ÿͪ9 þÿþ§þÜA„wìh jÿî9“¼´‡ýÊûIûŠüëþ è6=OþÜûÖúdúuüÚ´zk6ãÿiüGûjûüýÊÿ“ß6øÒÿ·ÿ^þUýÜþþ2­ ÿýöü$û)û[ü‚þׇ½þuü2ùóùúkýZ~€˜YâþXü$ú¾ú~ûeþ ½±:(þqü·ý!ý0ü4ü°ýýáÿ®ÿz_ÿþþý›ý$üCûuýÿÊQõ“ÿ”þ„ý”þFàø_ä¢ ¢‰"ÿëÿ\ÿ"þUý›ý?ý$ýèÿe•ö°ÿëý;úFúüþÿ¬uæ‚ÿ×ýûÙûµý@ÿ¶f´Ìóú¦ÿ¤üúêû>ýXÁZ0ãýú‚û|þnf­¿ÃwXÿ¯þ”þõË`¥0[þýüRüDþ8ê}î7aü®ùhùüC¯ÿ k ÌQýöü@ýUÿ¤¥—~¿Ó©mÿ"ý§ý$þd1ÿîÿðÿîÿOþ”þÜþÙþoÿ&ÿ1þþ¨ÿ.JYá3‹ÿøÿ;ÿ~¦5âºÿ¹þÿ-í>ÿŠü†úsú·üLþJÿæn¡êÿ¿ýþûäúÖú”û¤ÿBbÓÿªýôûãúÀûåþ裚bŸÿJýRü–üü¡ýïÿ•,ÿ™þ„ýŸý5ýý%üŠý'ÿ;2”ýÚûmúíûýüÙ —Xþ û‘ùéù@úÅü³þG¦J+ ÿLû÷ùXùhú®üªÿµÙ€sëÿüÕüýZþMþýç½§ÿïþëýÚþþøÿ콫ÿ›þ|þwþáÿ ÿ‘ƒ°Ÿ*ÜÿÂÿ_þëý|ýwÿ.¡ÐñáVèÿsô‘ýÞ²•Xš~ÿÍþFýxüÂüðþ,ÿ„ $KÚþíý~üûýtþ8ÿçxgËØ]lj–=§×Ρÿöÿñvšÿ>ýìüÍüüOýäÿÿx7'vÔÔÃÿçÿ þDÿšÍ®¿0K—Yþòü~ûuü‡ÿGÝçW< þüþ™ýåýLþÿ(]øþ²O²ÿ÷þ þ?ÿvR™ÿ’þüßüÙþ_‡LL ÿ¨ýÞü¸ü|üaýúÿšÿÙNÿñÿSþyý,üÁý·þ¨ÿ{¹Fˆ«ÏPÿ þÈþ™þ ýtý–ýÿý˜ýžÿ6’X ÿ™ýVúãùÑúÄýŸ4XBBÿ$ýÁüçüÜý±ÿBm–odEÿÿÿ]ÿï¡åí2ÿØþ®þ,þ5þfþÞþîþ9üÈû)úûÿþ´×’0Ãÿ£þÌý¶üúýtÿFUtöÎgˆý£ü)û¯üßÿÀk@=ñþÏüîü^üŸýýÍÿ2ÌÿüþÕþgÿÿYÿ‰aHlËþ„#ÑÔ¨ ÿnþXýÿþ­.‰Î³{ÿÙÿhÿ·;*‘–4aÀŽ?`ÿŒþýþð €/ÍjHÿ.ýLüüý0þêµV‘uÿöþ©ýæýþÿÉöÌjüA¼QÿÝÿ Iÿëþ’ý€üìüñüþý{ÿ;ÿ¦þ±ýûüú½ú˜ü7þ“ŸcÚâÿýüûòüõÿ`¦Ázþ‰ýü¨ü3ýþ¡ÿÿËÿËÿñÿÄþúýÏüÍüýþþöÿþÀþFþþ¬ÿÿÿKÿAþçþ„ý¨ü¡üŒý™ÿ½ë¶S¡ÿÝýŒû¢úHú{ü7þbfä*ÿ¼ÿxþÅýëýªýÒý÷þ6þçÿÔ¥ Xÿ³ÿ@ÿþ¸ý…ý(þaÿ½‹Æ¼JÿsþvýoüÚýVþ^ÿXÌüã7ÿüþ¼þ–ÿÿè­BÿÇCñ'ÿÈ9ç¦ÿEþ“þâ\Oÿ‚ý‹ü¬ý4þ8ÿElªFvYþáþKþþRÿ:’ ¬úÛÅÿ…þ¾þþþáÿÉrÄ¢ÿèÿ²ÿ§ÿ“ÿÿþÿÿ=þóþñÿʯ©-Æ\£ÿ¼ÿ[ÿƒ3xåǺïáêÿßÿ+þ¾þ¢ÿ)ÿ‘ÿ‹iD=(!É8ÿßaÖµO£,R¦Zÿðÿþ°þ¨þÊÿräNuwÿ«ýuû¬ûû¶ýlþçÿ´>DÿÃÿ‘ÿyþøþ¦þÁÿÿÌ[ÔU°Ä·2ÿ†þü´ûñüý=þrþüÿÿKÿ¾ÿÞÿJþEý.ügüìþ‚A€( $ÿ þý#ýýþ<ÿÿç@z‚ þÝþýâýÐþyÿ’cR] ÿ‹ÿ`ÿYÿ«ÿ´ÿyþµýòýáþ2þXþïÿÿzþóþ—þ“þVþkþ’þ®ÿ<ÿ|ÿ,Xÿ›þ­þ ýÏþeÿ ²ËC¾ yjÿpÿÿÿa™„’½³`ÿºþõþsþyÿœB#Rt„ÿÝþýôýÕþmÿij_9ì{3Yÿ¥»®_ñgŒ "0—FZ@ÿýÇýŒýØþÄÿôѸ¤ÿmþý’ýÞþvÿÍÑÀÔ4Xþ«þ ýðþÊÿ>vünéÿþË3˜®“Óÿ¸ÿþ~þþuÿÿÅø4íÿüþµýíý[ýÓþ{ÿÕª€`´Xÿ|þÜþPþâ%¹#›óÿÈÿƒÿgú&²¡ím€²yJ:ÿrþÌÿ3[(ÿÒÿ›þÜþaýøýžþ@ÿÿ4þÿþÂþìþbþýßþžþÑþfþuþŽÿHK²OÂJåðÿêþäÿ(ÿþÐÿ*ÿ˜ÿÏÿ®ÿ¨ÿý™ü°û¿ûFû¿üíþfÿpP-ÿ„þBý¿ýÖýúþÿIÿê1ƒÿ‰ÿ=þáþýÿ/ÿÿ²ÿôÿ—þæþäþæÿ”W"ÿ¼ÿ,þœþLþþ þcþ÷ÿõ¸zŠLÿþBý¼ýeýuýçþþ¿ÿ²yͶÿìþ÷þRþþÞÿà5hgÿì ”´¾˜ÿªÿt ÂÞ81¤ÿ½þðþoýºý®þRþèÿhCFjÆÿ5þuþ0ÿ#@ßS¿Dbÿÿ†1ïW,ìýº0CØ~¡íÍæ ÿ‹þºþ˜ÿµøÄú|Jþ£ývý ýgþjÿÎ{ÈA‚ÿWþAýòþþŒÿXs0=Áÿèÿaÿ^ÿ°ÿù ÿ ÿcÿœÿçÿÚÿžÿ;þöÿÿ3ÿrÿŠÿþ:þ:þtþ§ÿuÿïa˜:4ÿãÿ¾ÿ‹ÿpÿ£6g3‚‹ÿÎÿ˜ÿ ÿÿaÿeÿõ€i0ÿÚÿ(þ^þþ<þQþàÛÞÀSÿþSþoþ¶ÿjI6ÿôÿRþ¶þfþfþ¤þâþÝþzþ‰þÃþ¯þ8ýÕý¯þ ÿA…YwÿXþ‡þXþéÿóÖIKþüýzü¥üÙýÊþ®ÿÿ0ÿþÝþ>ý³ý˜ýÔþÿ &Ð %—ÿiþ·þœþÜÿÆß)¯ÿÆÿµÿVþãþ÷ÿ-ÿYÿbÿ3þäþêþÌþ¼þòÿVÿâsãBÿïÿ§ÿ¾véáê ¾UÿÒÿþŠÿ >bÑÒªKivÿÐÿ¡ÿßL\K“w[s‘zÿÃÿDÿkÿœÍÃÿiþîþÞÿ+ÿÛ”L³‰”mlHG”Ž·­L&K#•<?K¹i*õBdÿÓÿØT¦ƒCvÿˆþ¨þþþ˜ÿ:ŸTÿ¼ÿJþÝýæýpýÝþWÿ9ÿâO<ÿeþþ'þ!þdÿ<ÿÄ ÿÑÿ]þæþ1ýØþ2þÂÿÿKÿ4ÿBÿdÿþ þ­ÿ.ÿó¿èµ'ÿcÿÿ,ÿÎvd¼V&ÿÿ ÿÿ+ÿ(ÿª2ÿêÿë&ÿ©ÿÿFÿ‹ÿ«ÿÊhã´Zÿ¿ÿ>ÿÿht´“ÿÛÿ>þöÿÿXÿ¥ÿÍÿPþ²þþýõþ[þ_þZþþþoþ§ÿ#ÿGÿ[ÿôulÿ÷ÿÖÿãzÀ´‰Qÿæÿþ¦þýßþHþ›ÿD_ÿyþÙþTþ‹ÿDÿ•ÿÖÿ‰ÿoÿ¿ÿXÿþþXþÕÿ%ÿJÿáqIÿ´ÿ.ÿþòÿÿ¶Oi¹ëŒÿ‹ÿÿUÿ~[¹Õ¦ÿýÿÐÿ³ÿ¼ÿ¨ÿ©ÿÀÿ¨ÿRþúÿ7ÿ¬ÿÊÿÿØÿôÿ›ÿüŽ;ÿ¼ÿ›ÿ›ÿ¯/ì!s<h}¢ì%‘Hÿ·ÿgÿNÿ–ÿjÿpÿÛÿ®ÿ‰ÿ‹ÿýÿýÿ¬ÿþ*O©x,ÿËÿÉÿ^ÿxÿRÿ²£U!v¡œ=%çañø_ª<Ûz¢B&+#þñÿÿ ÿtþûrþ¤ýÙþ¿þQý\þþÑþþºþ[þŠÿÿÿHÿ&ÿ{:ÿ2M[Kÿøÿæÿ@ÿ¯þÑÿ þ¯ÿ2ÿÿ(ÿPþðþ²ÿ‹ÿ±ÿàÿRÿ`ÿ²ÿÄ!ÿ»ÿ‰þ—ÿÖMó‚ŽÿÛÿÿþÿþÿ<ÿ£ÿ¬ÿ[ªèmÿ¨ÿyÿNþ½ÿÏÿÚ‹ÿ×ÿ–ÿqÿ†þ]ÿ&ÿ‘ÿË ŠÿÙÿýÇþþIþbÿ+ÿÿÔÿ ÿý¤þZþþ~ÿà£×~+ÿõÿ|ÿnÿ°ø]?\"þçþ ý™ýý¥þ‹ÿ¨ÿ0ÿþèþ;ý{ý¦ý“þhÿe9°s;ÿ=ý¹ý:ýEþŠÿ÷¦Q.ÿzþ¼þìÿôÿ¨ $ÿäÿýÿ¿ÿÕÿ’ÿÌ n3ÿý8ÿ„ÿwDŸ/C¬ÿ‘þçþåýøýýrýÂþ¡ÿðÓcs5þqþbÿ_ÿÿ—†p÷cB?ÿÿkÿGÿ+ÿºÿµÿþ§þzÿÿþ•þþlþDþ[þÖÿ9ÿÂ%àÿß8ž~ÿèÿn¬j±˜€™NÏsÍ•ýé|ÿQÐÿä …ôœxÿ×ÿ{þ?ý³ýçÿ°eÜ ´ÿØþEýüðýÈþjÿ0k€ÿÞÿiþ÷ÿ›ÿí ÿÙÿ—O´r2þ´þ7þöþ¾ÿ…ÿÿüÿƒþžþý¸ýÓþ•ÿ-QüºŠlÿCþOýýdÿ(þO±…5ÿmÿ?ÿ|ÿŸ<žô•ÿûÿÿÿ•ÿDÿ£ÿƒÿèÿ‹þØþ­þšþÉÿÿ0ÿ©ÿûZÿ-þ±þ–þBþ”ÿ=ÿ©ikÿìÿ*þ¨þ,þþþ[þýÿÃ@—¿g§™ÇÔµh x€X}Ï~ÿ–ÿ6þžþ ýýÝþ#ÿ$¹èš6ÿYþqþbþƒþÿ0Áf5ÿkÿþÑþaþ°ÿÔÁÉ4ÿ­ÿqÿXÿe±\[!"ÿ¶ÿÿ¦l_¸ïgÿ±ÿ/ÿ3ÿÈÿEÿ„ÿxÿV)ÿ;ÿ-ÿ"þM·ÿòÿ\ÿfÅVOR!ÿòÿÿ¦ÿKþþÿ±.UÇÆÿ–ýÑü¼ý ý÷þíÿMGÿ¹ÿÆÿXÿ¢ÿþÔþ =†ÎF`Áÿ´ÿÔ!Tv¹t]I Mµ>¨pæ iÿŸAþïw£¦a­ÌÐÿòþ÷þ÷stk-4.5.0/projects/ragamatic/rawwaves/gun1.raw0000644000076600007660000001007012327014024017136 0ustar garyýKþ\*Y»/ð0ÿ9þÎÿù ÞqÑ÷¯øÂðþÅì­„zt¿·Ì­Åe&à‡?ûY3ªç–¡\°DŸè6T‹¶ÿVþŠþšþ·þþJþ#þºÿ4þ¹ýçý—þ þÿ ÿ,ÿzÿ¼ÿïÿÉÿþÏÿHÿÿVÿWÿ¸ÿÎÿiþÎþ"ýçýûþýxü”ümüôý0üÝülý<þ¤ÿ®ZK4Ôžÿù €Þjög¥Núï¤(+»&W¯D½¿ $+Þk…iÇ+Êóÿyÿ?ÿaÿ^þâþßÿ­Dÿ¸ÿ§ÿÕqÌC±UÿƒÿÇ!¶‘ÿÊ?ÿ•þkýÀýyýéþ.ý¥ü»üfükü'û¢û%û}üÃý²üåüü^ü’üíýýEþÂ#µæff­û: e £ ¿ × - â ¬Ú¤à _ÊcÐL;ýü%üÙþ\þóþbý¥ýVý ûtùÉù¶ûýŸÿ,ÿ>ÿÛ0ËÀ&fV¤ÚŽjÉD©Ä–bfL‘ÿªýñü#ûEúšúžú³ùÊù4øßøøj÷ò÷>÷sø3ø:÷y÷–øLú'û–ú›ùÅúâýmÿ, MC ã )©N A ‰<‡ Þµy è (¦;õþ¼ýWÿHa™ÿ$ýƒûŒøžöõŠ÷ úôübü¡ýeþýÁütûwüþÓK² Ñeè\†-‚Ý´æ6*ÌyÿËÿ}þZüÍûrùýøPöhóØóBô¡õDôLôÃö‘ö˜öõíõ¯öú÷‹÷÷oú-ûÆüõýÍýçþ'ÿ9#Èœ¶ & j µ “ E ¸ g%€q + á %^µübù~ù…úúéüýbþ-üúúmø÷¾øÿúÐüÿ!‡Òî¼ tõdíŠI¹Q›V`^oŒRÿ?ýXý)ûúùøøsöùöyöŽõ ò¾òqòòòÜóóóõjö÷n÷>öë÷€øøOø:ùdý f 1Ûñ·¸áM ñÚñ( 0 ÕötxZ…[/Cúõ†ókôLöÃù¢üDýÝþ]ýmûzùÊúü¯ÿ‘+R ³ ‡ÊÇAh"…6E¬þ]ý)ý˜ü’û¦û£ü=ý%ûjöúô»õì÷3õÎôåö¥÷÷÷ÿölôôIöwöõt÷+ø“øæøñ÷ù÷Z÷šö0õê÷ÏýåìýØR¤ÚHµ öŽx— º ½ Mã‰~ÝvÒü_üÄûôÇï¶ómúYû6úùˆûzý#ürú„üsòV n Ì Ú½ „ ¡ ¦ ²žOüöýûÑù4÷¡øôú³ùÀ÷Ðöööõ ô ôv÷øÔù;ùBùÿø¯÷–÷¯÷W÷‚÷ ÷/øˆúºúÕø õŠö+÷Ÿûd¶ ü þûãAOm 5® f : ÒÍÑ0_ Nzlü\ü‡ûïõøï¥ólû—û‹øœø¶ûUü®üúÃüù¢7Ç Ð qe Þ 3 &[0ŒDûäúûúÉøÑ÷Ÿù®ú2ú ÷Öõ:õæ÷iöÌõ“÷.ù«ú\ùhù­úø2÷Ø÷úöa÷¥ùÃ÷ÜöYøØù™öéõeô5ô ö,ümoÿªþ pM ;<Ê » æ ­)ûN?óÿbü³ûñøòó‘ïró1ø•ø•øàø¤úýüþûØþ ¹z Ñ › µ  i ¯ ‹  ç …rýìú…üù†÷tù]ùøúú ù#õÛöCö™ö¢÷AøùªüYüŠûQúõú·úBù©øúøEù¥úêúAùÃùûø©÷g÷ôôóó©õºû,'ÿÐü–ÿ èG6b¹Ñù$ þ (ø! ‘åÿjŸüyôÂñÇôsùPø¿óñôû»ÿüÍûxÿ2Å ®äQV zý ï ¬ WX §`–ØMüãø–ùýÈÿjû‰ù3ùÐùþùDöˆóÍö ûåü øýúýØþ§ýŽûšûfýýSúQù¤ü4üóûdú÷û,ûìü9ù0õ2ôóÐòÖó«ùuÿVþ¹ýúþÙXëEiÂCÍ]ý  Å³ > Ϥ.ØÿÎúõmöèø¬øø‚ùKúƒûªûVû£þ33ì s 0 n ±)­ bÙþMýÈýÁÿð¶>ÿÁþšÿü}÷óö~ù.ûÐûþû'ýÿöÿöþ}û¢û ü~û3÷û÷Öû®üçû@ûµü4ûÞü<ùÿöGõ€öô‰ò›óöú›ÿbÿbühüÿÇ&ª”| ¾ƒÌ¸ €N­ P zŒ­û(ÿvû¤ùŒûýú÷¶ú®ý\ý8ü8üü¥H þß¼d¥¬I Œ J 79[úº,ê—?ÿç{¬ÿÞúÆúdýzþGü¹û™ûÐüªùñô»ô(ö#õmôÓôö©újúÙø÷ùAúøWö¦ø)ûœü‡ûbú5ú ú–ú-ùÍûýuüüûIþlºÊM2Ø >Y— » 1 „f f û ÉG¸ /“&‰eüê(e |þÃýýWyÁGšÙ”›š:1)a¶9ŠŸ9ÖȯðºWÂGüÿ‡þyýEü¯ü£ûƒù›ù-ø©÷öröí÷@ø/ùø¿ù3ù©øÅùúKû-ûtû„û¨ü/ýuýãýŠýšýÔý2ýü†ûÂû¿ûµúœù»ù_ùù¾ú³ú0ùyù˜úúú“üDý®ÿ5þhž-¬¯?è i ç  Ž  R S m á ²<°þ]3½in’QŸÂ?ÄÉñS_\§.?ÿgþÍÿZÿhÿ1þøýxû¼û9ûùKø+ø×ø¼øø½øšø«ùZùÑù§úû9ü/ügü«ýUý6ýýFýüäý,ýwüÓüûÒûFúfúú¦ú+úaúÐú•úúÜú‡úoû§ü£üÒý·þÜÿMÿ¼”UávæR’Æã°¥¼»xp­4ÍZš‘Ym°ºN©öÀŒò©zI¸Ä:ÅD¬’ÿ¦þêþ)ý ü6ûÞûÓüû¨û:ûGû£ûuûûCû²ûøûÝûûoûÃûìûJúÊû‡ü“ýýkýdý“þýøýóþÿ7ÿ¥ÿ¦ÿgÿÿ;ÿ_ÿÿМÑiÿÅÿ¨ÿ–ÿBÿqÿ—ÿXþâÿþ¼þ@þýkü—üüÇüücüšü`üUü€ü û²üûõû¡ûBûûOû;ûcü.üÍýQýåýòýÞþ´ÿuÿ¼2¢.ôûÉË庆\½ð™áZ„ÿàÿPÿ+þÅþþåÿØ´…¹ô”+*²£=Ѐñ!Þ£åc¹Š˜ÿ…þýþÕþ3ýü}ü¸ýFýüiüûøü`üDüüü~üôý$ý(ý+üûüÒükûû]û;ú¥úúVù‘ùø¢øUø)÷Î÷¤÷öøyøàøèù6ùôûûJû6ûƒüyýbý¾ýðþ8þÅÿHþËþ þþ°þÀþ2ý¡üÙü©ü«ü;û¹ü`ýƒýÃýýþKþYÿ@ [Ò ÕÀ®¿Ž5h€€Ì(W.jï˜y¹ˆ°.Í€+$Õ§ê±ÿ÷ÿ®ÿ.þŒþPþý{üÿüRûÖûeúŽù®ù†ùsùNùZùbù‰ùâú2ú-ú6úÁû¨ü,ü+üDünüwüaüHü=ü[üÝýLýü­ü¼ü´üpü)üOü¶ýQýyý#ýý[ýàý¡ýƒþþÝÿÃIf­Hd\B§ž­¿ºþ Ê)ÿÞÿõ:—½gøl~-ÞPÀ‰DÝÝ¢¬¦ÿ¸ÿXÿOÿ:þÜþiþ­ÿ#ÿ*þŠþþ'þ)ýøýÉýùþ_þüÿcÿwÿ~ÿƒÿ*þ‹þDþaþ™þ´ÿÿ¾ÿÞÿpÿOÿ5ÿJÿyÿIÿ)ÿØ 3ú<ûb%ìQQ»%i`ü¯ÄKµÜJOÿdÿrÿ§ÿþµÿÿxÿ˜ÿ>þÃþ½ÿ ÿþÊþ¯ÿÿÔÿéÿ¯ÿKÿ]ÿ¾ÿ þûÿÿ}ÿ~ÿ“ÿbÿCÿÿåÿ­ÿYÿKÿÿÿ‡ÿlÿÉn¯š¡ˆ„¡ƒºÌ€%?kR@ªìú¾^…ãÝ·ŠS<bªµá@¦ÏŠB(É£otŠe øè_­<†œ¯Ú#ÛÈ3à3#fz;ä>ž“ÑÚó=Oõ¢lkj£ý^E Зe"Ïý9mlpd1ÇoÌþù=½ÜŽÍÝ[Dgæ|[㨦ÜÕ™hna½{UA'ÿéÿï%ÿ¶ÿ¦ÿ–ÿhÿ@þØþýóþýåýžýêþDþ®þþþðþÏþÌþëþõþïÿQÿúqÖ 7tÿ°ÿQÿvÿ«ÿ~ÿ1ÿJÿ[ÿsÿþsþ2þ,þQþ6þþCþÚÿ[ÿ‡ÿ‹ÿÛjаËDÒ¹hÍOpü„¥ú’  ªS¾i3žu€n­^¼ê‘×ýÍÄÀÚ  stk-4.5.0/projects/ragamatic/rawwaves/jun1.raw0000644000076600007660000003467012327014024017155 0ustar garyÿ`þÊþÙþxþÌYÿ¶þ`Œ5ÿáÿóšÿGþU=—ÿ]> þ¨WYÚÿËþf4q?ÿIÿ¦ÿâa“lÿƒþýÿºViÿÌÿcÝh û§ÁJ³ß„?½%vÚáEì<FõôÉÎ¾Ýø |ëå¸-þøýsþrƒ üôü1þÅJý“üýGþ¶ÿ–ýÕýJýæþ“²ÿÿ1þþýÒý¨ÿ$þãüÐü°üíüêþ—þúÁü)ü«üÃü×üû´þuýúÐýóþ¡üˆý¼þ9ýQýÓÿ©þ´ýaüiþÉþ\ú ÿÃþåúöþ˃ÿIÿ[ý”ýÕ†üÜÿ¿\ÿSþ¬ÿâÿë¹fÿÆ'upO¯°Ñ!í9õ¾D g46yì#$ªmòšc(9 ÿº„‡§ÿÎÿRþðÿ þJü`ü£ûîù§ú‚û¬û©úÑøªù1úáú´újû˜úiøøÒûgû-úRù„ùªùèû-úÀúhúÏû ú"ûèûèùÃù¼üªþ&üùÇûcüÌý3ýûãüaý?ûüþbüpúiü³üZü@þü ûOü^ürü…ü»ýýµû1üÅÿ–þ£ý ü—ü.üžþlþúÀû ÿåo­†™¹6Ó÷é| + GR y é G r ß m +  M (k à  á K K ý ì­Çþ´üùùžúFøðõÓó©óeôGõòüñ9ò>ó˜ó—óŽóÙõ“öÙö‹ö2÷=ø¹ù ùløôú_ýüœûcüdý ü‰üÃüÓûõûõüGüüœú øéú°úÇù-÷Ñ÷ýöâõˆö4öÑööJõYóúôÓöô;óuó­ô‹õôóójó{ö§ú4úôû±üëÿí.ÿ¡=þ p | ɨizÆH¯/d… Ùô´Â" t ö Ï î¡™—þ‹üdùž÷4õ|ôióþò¢ðÙï{îí¼íIí<í©í¾ïðãñîòÒôÃö½÷Xøïúbû[üÇý­þ)ÿ^‡î©ÿÿPþÂýÙüú¨ú$ú9øë÷;ö ö?ôióºóQòð­ï<îvîïîÌíì/í#í[î*ïîµð:ôÆø±øYúþ@ÉeS K mæ(S‚ ŠB†¹m’Ñô V % Ù¶= víþ›ûëùœø%÷˜õ«óöó–ó€ò÷ñãòšó£ó’òÔóð÷ùZú úkûžý…ÿÿÿ‘jéÏxb ¼º<ÿÏý5û^ú‚ùðø¥öCô$ó›ò©ðíï€ïÂï×îí]íbíyíàî îsïÚòHó_ôwö´úüAüãþUž4b 3  ƒ:“¨«)WošÚ]£ ® } Œ?f—ªáÿ$ý2ûþûxúöúù¼ùfø™÷Ú÷«÷óø)÷ëøùHú“ûÁüžýOþÄÿØ3¸cá°ì»KËÂ\£ZH~Þÿ\ý^üûQúHø¥÷&öyö¢öbõ¦õ õHõ¿ôáôôuôµö÷G÷÷ù{ûúÿúxû|üØüû÷þÉ ?Í9  G ¾ / J ƒ Ó ÷ © ÕH§šÏÆsyWÿöÿhþCýÎþ4þgþcþ>ýÁý_ýýÃü‰û¯üYüâürüYý†ÿÿAÿ/T­ße8Ÿ˜ ”r&_¶Àÿßÿ6þ#üÿü•ü=ûíûûü/ýýÞýíýRü¨üüLý4ýŒýƒþEÿ\ýƒú;ø\ø:ø÷‘øÐüÿ·(¹<CÓr1qEGbšW±g"Í‚¸êœÝK¨ÿâþ«þDþÑÿÿ_þaýürüúÈùrø´ø²ùnùÝúiü(ý©þÈDX•ÍeloÒÄ?Èn¦D„þkZþìþjþý¾þÿ"ÿñÿ«þçÿaÿ†þ ýý¶ÿkÿUú‚öqõ7õAõ£öÁùiý*”8U TBmxF¢«±VÄ FyNê#Ï`4ð¨ÿ$ÿ)þ!û¾úÝý&m×$¬ÿ)üÈûúwúÂûKûaü ü¾üîýdÿ7ÖÌqMu ï›ÿW%u¡¯uá ÿˆÿþzþþþm %F‚·´³áv‹ÿ;ø5õÀõóóòdõùÆütÿm¶²¿ÃGÑ2ÿê²ú?iÿ¿K`æ &ÈYÖ Yÿôý“ý—¿_Ø¿òc¸!ÿFþüîü¢üúSúÖþN 3Ȩ¹ÿÆÿÉÿtÿ¾ÿ ÿIý÷ûªú©ûKü"ûÌû'üÍþ ýYü¹ü)üÞÿˆpQ¤ 9øý$ø_öDõ†ôyô½ù#û¹ým¼)¸pÿze ÆåYÑú—þ]ýžP7 aÇRüšûkütüLúëûý`{|ÿðÿì˜4{½iaÿýäüõûyú¾ý‘50´d¾C,ê  ظÿMüºúEùœû@üÈü[üÊýzü™ûùµú°ýçlsP1û ö³öÿø‰ø[ùÝüÿ.&Ëò3üŽýò*1 •ÿýûëýžýú#ûùÿ“ OQùûùžûíÿïÿ­ýGû˜üÞÿ‡þìýýðÿ´<ã0×þŽý—þÕÿMýüg/¯S¨þµüÍþÙCéÀ‡þ ýÚý2ü_û}ùøÌû…þfþüü¤ûiü6ükýKý•ýÝMøñ FêûÏø•ø\ûûýNü™ü¡üìÿ[Ùâ þvý2xÐ z.ÿ‚ü%ûˆü\ÿBýOú½ü=þÉ[6ÿhúNú4û¯ÿ?dþÃûœú4ú®ýHý°þ,BøÛ‹þ&þéûøýŸÿ4ÿRþ±þfÿácÿ}üáüzýÁþÑ|ÿÔýüüGü@üìûìú+ùòúüü ûñûû*û¯ýþíÂXê´Ïýú û]þ2þ^ý˜ý³ÿO‡ÅÿÀ]vYþúÌùúúýäþ}ú’ùü!þ³X$ú8ùáûºý Óýêû¹ú½þ3øÐÒÊ W‚ÿ¡ÿ ÿRþËþHýõþwþ³ÿJÿýû¹ü-üËý¿þ(üFûûüü]ü¤ýû#ùCù­úìüBüÙürûîü-þz–ÅÖµÂbýÐùÚû·þ±þ‹þÈÿsÿíw¶ýôÿtõ&`þÞû9ùCø˜ýgþßû”ùTùþü´_ûˆùùúŽþÜüõúÕþEþ]ÔŸIúþìÿÿ“òYô?ÿêý›ûâúØùÄûoývü[ûÌûÍûüŠýü)û,ú»ü`ý¦þzþèüõü.þÿ ÿ¾óô¥&ýKú üÔoþ®þqç{ÛÁýâ\ÁÊ1&ú£÷ øÿþùU÷‡úEÿ¤ÿnûºù÷eú)ÿÁyü¡øŠúãþe’€Så(€‘ÉÿÂþ«»±%›UkÿOý¨þZÿ¦ÿþtýwüKüßý(ýŠý_üeýýÕþ5þ¶ýŒü‡ýÌýþ`i„ ŽÿRý!ûÐþ߀³U`†.Ã/ÿ‚GŒ²ÿIú½÷uùÿU¢ý{ù´÷6ù4þ'þAü˜úvø>ú0ÿ2ÇEþªúÉüÿ±gÐ'Õl”¹þ ÿcÀ3eÝÿçÿ–ÿ9ÿ¬ÿæþKý•ýýLþýòý ýŠýªþ®ÿþ¹þœþxþ­ÿGÿÿ.ÿ¬ÿ:0Ôo¶ý2û¥þCñQÿYÿ§‹ì`OÆ||è :ËþJù@÷Èüø´ý<øN÷@úÐþ§þú“ø¤ûÿüÿ÷þûDûËÿá–0ÜÕj ”cʶ@äܺÃlÿJßYÿòþPþ¹ÿ÷ŵÿýîý†ývþ\þ¸ýüZûúüaþWÿÇÿ)ýâþUÿ“cûýóúû!ÿë¸'þ×ÿÊg§´Ëÿ’ªÔðoûÕöf÷ýÇbûá÷W÷üý6Æhþ|ùûøòü¬jwÿ6ûðûØDô8õÿD篯õ¤¨’´1ÿ~ýÞÿÅ;£îeþÏþïÈo”Ìÿ]ÿœ»ì×ÿÎþ0þþøVBÿýTýTÿ™€¾‡ûv÷tøUûãýÅþ¼ÿ:þjÿëo†Ó†ÿÊÿN7\ÝüÙ÷¥÷Áû#ÿâéÿû™ûuüëÿÿÎübú¢û%þß"jÿ{ü]ûkþÊÛ£HÐNÿJRû<]R\‚°ÑTäš¡i~Itÿ]N§}šþßþAÿ¼Ä” þ8üèýþ]þAý ûÑûsþ¾ÿ°ÿJú{óÆôsùjüÒÿëÙþöþÏËŽk;fþ.”`¢ë8úú(û›ÿï¨2þ#ü?ýÉFþGýúëý4äDRþúû˜üÿ¡´¾×þîÿ«%V5Ø%†tÅmÔ/íÂ~c£ò¾ðú"oÿXÿ(ÿþwþâþäýülýü¯üiûtù9÷ïøQúüpþüª÷£óýõ÷ÁùýþKÿ]¦cO¯ÃÀýa4Äÿ[ýÅÿI?û;þýïýÜüœüúüEú$ûþ`ÿ*ÿšþŠû^ú¥ü¥þò¶»·#½ÃŸ$_I¥b¸Í=*%)˜ àÿùkÿ·þ˜ýõüPû›ü9ü#ûåû®ú‹ù9øÆøÐùù”ù=÷á÷g÷H÷ÞúCûïû¹úô÷ûô¤õ”÷íú?ý“ÿm¾ ;« 4IKW ÏQhþÞÿ<ÏË—ÿ“ý—ývý¶ýIýaüMú†ú¿û„ü+ý7ýŸþcÿg>!ö^¥åJ#ŽEö4gSðE}wÿh¤cšÿhþÅþIý÷ýcüFûPú¬úùÑùöù®øüøŸø°ø®ùù*øB÷/öžöÌ÷\÷Ùø)øªùø÷ø0÷1øû@üÐþdÖ…>Q±V Tü6q¶[Pó wÔfÿ¨ÿt¯P”šÿñŽ•r²‰§ú½TÜ9³þ‹>…ÿuþÁÿ"  GÛ_8UÿÃþÜþýüqü‡ü–ü„ûêúöú£úKúaûûnúÂùÈùfù¬úúFúiú/ùÒùùÓú…û:ûuûúÀúëû0ûôüíü0ú¥úúæûaü’þå”ß.¥u¹i _óék¶ÝþñúäÌQŒ¡4ÇG ÍM0ç ÜÜzÿ§þXýaý(ýAý7üëüáüßýýÀýÖý–üåü¡ýüÒü…ü$û|û4ûúîúÁú‡ùÿù‹ùVùPù0ùøÂø¿ùùgù€úûûûûªûÚû@û û"ûú£ùYø`øWøšøÚùÔúQúÇú‚ù"ø¿úû»üCýºÿàôWÝÌÆóö „ Ç Û è ì å Ã í ¬ ô o _ ¬ ~Àk#2eˆ5Á«GE´öü°ÿ£þ–ýCü‡üÆýÜþ˜þØþâþZýáüìüŠüÒüêüdûJú¥ú?ùªùGùaù_ù¥ù~øüùùHùýúHùµøïøøøåùêú2ú'úú8úÈû#û#ûGú·ú6úuúÓûqûÈûú¢ú/ú@ûû½üÛý°þJÿTÿHþ—þY⧑슗ôÿ K 5 ä › ¢ ˜ò  ¡ ÷[•ñĸK7BdöÀœ]p냪C‘åiÿÞÿ‹ÿHÿÓ‰ÿãþ¿ý£ü{üûãûëûHú¨ú+ù“ùù4ùöúùžøñøµøÐù ù×ùèùÉùÐùÁú@ûEû¸ûªû…û‘üüôýèþãÿ‘ÿÕisk¾¿íµ„„ÿœÿ_þ±þzþNþ7þvÿ/ÿýNûôýþÜþ´GZtP´$ˆ@Mb˜¿+ø;°…¿ÀûZáè )Þ.W‘ú¢³VMTž[ß}yÈSÿ9ýyüSû®ûXûTû—ûù£ø¼ø‹øùùFùÏúùhùKùÄú^û:ûìüGü¨üýþnÿÇRÿø p¶ ®›ùFÿÍÿ›ÿdÿpÿ@þQý}ýUýSý€ý,üBû—û%úåúÕúÞúšú0ù½ùÃú%ûKû÷úÊùžúHü2üÜþ‹ä‰Ó‘¨¼àÍ×÷§ Ä ß Â ç Å Q S  ½º3„ñGÊæß„-î;~ÿðÿÖþÒý¢üëüäý›þIþ2ýNüùü§ü ý$ýÔýŒü„ûÞû¨û¥û–û«û@úGú#ú¯ûû˜ûÌû“û{ûSûVû·ü@ü¯üZüüjüÔýý/ýgýËýÖýÐýÏýªý§ý!ü]ü`ü‚ü[üoü‚üTû¥ûúÜú€ú€ú’ú®ú¿úÐú£úkú/úú{ûYüfý®þFýkýgþêlŠ…Š>¼lý m U á þ  Ø ­ m L w k 1 Í  ?ËId8£Cn‡õ3}ÿ½ÿþèþ«þ(ýdüaûòü1ükü,ûìûÓûÙûžûˆû¾ûÒûhú…úRúŸúÚú—ú‚úvúZúVúbú~ú¥újúiúaúú úuû$ûnû:úùúÞú×úßúÞúÿû#û+ûYû•üüTü[ücüWüYü¼ýCý‰ý÷þjþ†þ±þüÿCÿ¯6EGK<ÿ¥ÿhÿ«N}bñrœ2:‰1Ì<üŠb‚@ | c Õ Í Ù ¸ ï ù 7‹‘;û´p²eº—ë€& GÿSþÙþµþ@ý¾ýüû"ú¾ú¹ú¶ú¤ú<ù~øãøcøiø¥ùùLøw÷ÿ÷á÷ç÷Ð÷Ùø ø"÷Ý÷Õ÷ïø øwøºùùÙú¦ûnûðüËýæþZþ“þùÿ.ÿ«Z„ÿû ¸:Q –G.6*ÿÓÿYÿ˜:ph*ÿüz”mM&hv'ÿ¶ÿxÿÿÇŽӓб\ñ2±ÈÙ?¢?ø¢Z»wWƒ„¯Ú~#„ ŒÿÞÿ@þ›ýðý}ýü‹üü:üŒûñûAú÷û8ûpû’û_úàú:ùöú9únúéû(ú¶ùðùµùñùüúú ùù\ùçúûû%ûEû¥ûîüpýý´þ ýÛý‘ýÚþþ@þHþNþÌþ©þ£þýþõþåÿÿŒÿÓÿÃÿÔÿÂÿ¬ÿ‡ÿ…ÿ…ÿ4þ•þQþ]þ*þþ þ#þ€þºÿÿgÿÃÿÚÿæÿì 8¯¹c+IˆjgÜ"*ué]ÐÍu5$âªe ¤îgs'ÿžÿúaKUs ÿÏÿ¼!©Žÿìj‘aÿñÿƒÿbÿfÿ¾ÿ×ÿþEýÔý‹ý‡ý{ýü£üáüÚüÁüåüÐü´ü—üˆüæýXýüxûýûlûRûšû³ûuû#úêû)û«üüü ûþüü.üTü;üûøü üWüxüñýZý„ýÉþ0þuþ˜þ¬ÿ6ÿç\Øü!Rr£/®î.^e4çö?GsNþÌ3´¹²±PþÎvÿíÿLþŸýêý!üü]ü5û¥úýú]ùÝùµùñúSúšú›úAú:ú¤úáûû9û+ûWû¸ü<ü”üäý#ýýýý•ý²ý2üàý2ýTý4ýƒýÄþMþ¼þ²þþÏÿ¬k ¾K˜¶ãŽb^YÃ@¹›§¤ÁÅè‹"ÂxKûb×Hã¾~FóÚ>|blfhH)ÿÃÿtÿtÿiÿUÿ&ÿ(ÿSÿEþÞþsþPþý¶ý-ü˜ütü+ûÐûgû>û%ú÷ûû9û}ûBúÔúHùïùøúú$úú6úrûû²üNýýŽýÕþþ|ÿÿ­ÿ÷&Xº eÅô  )mÈÍ‚h†®´Šr€¥Œ*߯§™Sâ©~ÿ¿ÿµÿ¿ÿ™ÿÿŠÿ»ÿÙFe¬CÁßΆ…›¾»XÿÖÀ™‚Hÿçÿ½ÿ¹ÿÔ2²Š ûd]„àOÝqß úó ûóÄ¿”n4¤1óëmÚÿ¹ÿƒÿ5ÿþÅþmþý}ýiý­ýÚýÀý{ýwýyý‡ý€ý6ý2ýýýLýlý‘ý®ý°ý×þ?þ‘þðÿÿ)ÿ{ÿ×zÝI•Ü#ú»}I ºpN A~z9)k˜©¾­h&,k…to›«‚U/F=[|ƒˆy ¡“9ÿÐÿÿ}ÿ£ÿªÿkÿ.ÿþêþ¸þ¦þšþ†þþƒþÌÿÿNÿZÿ_ÿ€ÿ¡ÿ»ÿ¢ÿ¦ÿºÿ­ÿ¦ÿÉÿõ +*Mb}u12%% ÿÐÿŠÿZÿþ¥þYþTþGþ(ýþýÁý¹ýÌýµý­ýÐýÿþ<þºÿÿƒÿç$W£’Úeš Õ%C^y¢£Å  ùóÜŸW#ÜpÓš“eZD*öÂvb‘¯ØúíÉ´ÇíùêâÇ×ǪƼŠ<ÿûÿÄÿŽÿ&þ¦þ;ýãýÎýìýîýÃý¾ýÙýîþþþþ>þQþFþ~þšþ¹þâþöÿ)ÿRÿhÿZÿ6ÿÿ*ÿ?ÿ2ÿTÿ`ÿtÿÏÿöÿ­ÿ~ÿ·ÿ¾ÿ†ÿNÿ1þûþœþUþýìý·ýý„ý¶ýÜýºý ý©ý¸þ-þdþwþ~þ¢þðÿ9ÿÅÿÏÿö@|Ñ&›éPˆ ›ÄÄäòÁ¶²Ž4Û~7ÿÅ=¸“8ÿÞÿËÿËÿÆÿá;Va!ÿÓÿÉ$WaÿåÿõÿìÿÞÿÏÿé ÿÉÿ{ÿmÿrÿ}ÿnÿTÿþ²þQþý¾ýmýü¿üü|ü`üPüoü¾ýLýëþDþ£þöÿ2ÿ¶7¢çZÄhÞfÜo¦Ô4b¿ìñõ¼eê_ð[öqµ.’ÿŸÿ)þÜþvþ7þþ ýÉý|ýgýtý®ýìýÜýËý·ý´ýÔýÖýÈý©ýxý?ýMýPý5ý üÿýý8ýaý8ýüÓüˆüNüûýûäû¸ûŽûwûSû+ûú÷û=û~û€û›ûÐü$üŒý&ý®þþNþ‡þÜþüþûþùÿÿ\ÿqÿ€ÿlÿ?ÿQÿ>ÿþÝþÐþÚþÙþúÿ&ÿAÿIÿDÿ+ÿYÿ–ÿ­ÿ¯ÿ’ÿhÿoÿgÿÿþûþþÿþßþÀþµþ©þ§þ¦þþþ’þ–þ’þ{þIþýÜýÎýëýÇýýDýý!ý.ýEý\ý€ýÅþþ;þoþŽþ„þrþvþ€þþhþ ý°ýaýFý,üèü³üœüÅýý?ýýÜþ9þrþ³þðÿ;ÿŠÿ›ÿ·ÿÐÿ÷3#ÿîÿÑÿÙÿêÿØÿÄÿÇÿèÿ÷ÿ±ÿuÿdÿCÿ/ÿþâþ¹þþwþ+ýîýÉý«ý¤ý¥ý–ý•ýýZýký§þþ‘þËþýÿvÿøUy×-‡ÓÞÚâæÃ«¾¹¦|18RDåÇ̱dÿòÿÓÿjÿ þôÿÿþòþÇþØÿÿXÿcÿjÿxÿ ÿÖÿû3(ÿüÿÇÿ´ÿêÿªÿþ§þŸþŸþ~þ7ý÷ýéýØýôýçýÃýµýÈý°ýŒý´ýÐýíýÞý”ý;üøü±ü=ûËû¨û«û¡ûœûûÁüü_ü‹üÂýEý¹ýñþþ+þ@þ‚þ¼þÒþåþÃþÅþÊþÝþ×þÇþ«þ‚þ¢þÚÿÿAÿbÿ~ÿ™ÿ±ÿºÿ±ÿ¯ÿ“ÿ’ÿ¸ÿò$ÿûÿäÿý ÿúÿó"F 8q‰‰€Ç#1 ³U%ÿðÿ¡ÿ}ÿTÿ?ÿþêþ¼þÚþøÿ#ÿbÿ¦ÿÒÿ»ÿ°ÿÿ~ÿÿ€ÿAþúþÅþßþÙþ¢þTþ8þmþªþ÷þãþâÿ+ÿgÿ¨ÿÊÿÝÿâÿÛÿÄÿ´ÿ«ÿÁÿœÿxÿ•ÿÂÿçÿÑÿÓÿú<V@!7˜ûY° 6Po^ax}RV‡â'lŠ«©ƒ„yzvGñmÄb>IDUm:2IR¦ŸˆvYE ñ .71ß´³«–]XI,ÿßÿcÿþíþÐþ¦þ`þ1þ þþþþ!þ%þpþÆþéÿÿvÿÆÿó=‚ßèÎìè¿pÿôÿÀÿyÿIÿþþþàþÄþâþÏþäþóþÿÿÿ ÿÿþ÷þçþöÿÿDÿJÿ8ÿFÿdÿ‰ÿ‡ÿYÿkÿ•ÿå1YRs͹ÏÀÙÖ¯£pŠ¥¸¬»û $!,7ø-'ýÀ©\ÿÙÿ¡ÿeÿÿÿ#ÿ5ÿ=ÿ'ÿ.ÿnÿµÿðUh„ƒSFÿðÿþ ÿñÿ½ÿ{ÿ“ÿ³ÿÿeÿNÿfÿ¤ÿ—ÿuÿ ÿÎ 4|znw•Ø ).€Ñúê+5119UB!ñë¶k^yŠp=Fenv†ÀóÏÓ5’*Ѿ²–iRˆ¯¿ÚÛËtŠ­°…a1,ÿÓÿ”ÿkÿDÿ*ÿþæþçþôþºþ‚þRþKþYþ\þIþIþUþžÿÿXÿ~ÿyÿxÿ™ÿ×ÿðÿìÿÑÿ¼ÿàÿìÿÿ)?‡³oÓî´EÿóÿôÿöÿîÿÚÿ²ÿŒÿžÿŸÿ•ÿÿpÿdÿiÿ…ÿÿÿ€ÿ}ÿÿpÿdÿbÿgÿ‘ÿ§ÿÇÿÄÿì2Yl™Ò!ã׳¿±žwPI ÿàÿ¯ÿ}ÿFÿSÿÿ—ÿ‹ÿˆÿªÿç!B<@@Mey“\M7,+ÿòÿ®ÿ¸ÿ×ÿùÿðÿì&-"-:A"ÿïÿÅÿ·ÿÉÿ¯ÿ¬ÿ¦ÿ¹ÿÆÿÅÿ¿ÿÃÿÀÿ£ÿ”ÿ¸ÿ×ÿÊÿìÿæÿò%(ÿâÿðÿþ 1l¾ò,8#Øy1ÿõÿ¸ÿÿgÿ+ÿ!þäþ¹þ“þWþGþZþAþGþMþYþ—þÊþ»þ¿þÓþ¨þ}þ{þ‡þsþOþýíþ þAþ<þ%þ þMþ©þÏþ×þÐþåþÿÿÿ"ÿþ·þ‹þgþ[þhþBýûýÁýŽýhý3ýüÙüÆü«ü˜ü¬üÁüàüÌü®üqüdü~üTü üüüLüIü?üLü‰üÜýüøýBýºþ þhþŒþÀÿ7ÿÇÿãÿÊÿÄÿ¾ÿ¡ÿ}ÿKÿþÙþ£þ\þ?þ&þ<þKþ5þRþ¡ÿÿ@ÿoÿ†ÿ’ÿ¼ÿÇÿÎÿÖÿÇÿ¾ÿ|ÿJÿJÿ{ÿ•ÿZÿBÿXÿ‰ÿµÿ¨ÿtÿ}ÿ©ÿÕÿÑÿªÿ¢ÿÇÿæÿÇÿ›ÿ¤ÿÆÿëÿ½ÿzÿTÿ=ÿþàþ³þ’þþ…þþƒþþ¥þµþtþMþaþEýçýoý6üêüÅü¹üü—ü²üÐüúý@ý«þþKþtþÒÿ5ÿ’ÿØÿÁÿzÿÿ`ÿ-ÿþõþçþÄþ±þ¨þ®þ³þ¨þÀþÏþçþèþÛþÅþ³þ¸þ±þÀþ¾þ©þ²þ»þ´þ¯þ±þÈþâÿÿ3ÿNÿGÿgÿ±ÿÖÿîCz…Vÿáÿ‹ÿ5þöþÔþ¾þªþsþ^þ^þ‹þÎþÁþ³þÄÿÿNÿBÿ/ÿDÿLÿTÿ>ÿÿþôþÍþzþ9þ6þiþšþ›þªþÔÿþûþùþôÿ ÿ+ÿþùÿ#ÿlÿ–ÿŒÿeÿ,ÿÿÿ(ÿ+ÿ'ÿÿ+ÿAÿRÿ‰ÿ¢ÿºÿæV›Šg@$ÿÒÿÿsÿ[ÿ+ÿ<ÿ8ÿÿÿ*ÿxÿÈ.h¬Ùÿ&YŽ´¯³²¶©¸¡fOq¢–ƒQTy‚p/þä´¥œn|y”®Âç *-),3o€K.20¢ĻÌÌÙðcƒ¶Î×ÚØÍ­˜x{†8ì˜pG ÿãÿØÿëÿø B[KASw‚__o{um^Nglu~v”»³®ˆ{…}jFÿåÿÆÿÿhÿLÿþñþæÿÿ8ÿWÿLÿBÿiÿšÿí 9ˆ±Ïà'2]}GJaƒ“Œž¥¹Ê«s!é¦z1ÿ«ÿ\ÿ.ÿþßþÀþšþœþÑþêÿÿ'ÿ?ÿ}ÿÌ 5c‹¾ÿ29G^9-Foˆ‹s8 Îp@*;)ÿûÿßÿ¤ÿƒÿ€ÿtÿ]ÿ"ÿþýþþþôÿ ÿIÿ}ÿ´ÿì!*GašÚ@}¨ÍÞ×ìõùç϶j-êÁ‡(ÿúÿÌÿ†ÿ5ÿþáþÆþÄþ«þŸþ²þÌþçÿÿEÿdÿŸÿËz›®·Òó4 ëÈ¢g: ÿØÿ‚ÿEÿþëþÅþqþ#þþþýûýîýÚýâþþ þ)þOþuþ¬þÖÿÿ4ÿOÿpÿ§ÿì4X|¥Ôíï×Öä 236ºaQÿ¿ÿ}ÿZÿNÿ&þáþ±þ˜þ‡þ`þBþ#þýýýöýúþ ýõþ4þMþ{þåÿ0ÿLÿjÿqÿ¥ÿëÿ÷ÿü5F>,BO^XS'ÿñÿÞÿÒÿ¬ÿxÿCÿ'ÿ!ÿþÛþ”þhþWþWþtþmþ`þhþ‚þŽþ’þ¥þ®þÕþôÿÿ8ÿSÿÿµÿêCm‘ÅäïíÑÌÓãïÞ¼³°¨Š[[g9B'#%>~~‚ƒœÏÔÒ¨¥™–„R?3b“Š`I@A*ÿÿÿÜÿâÿò  !ÿÛÿÖÿÍÿ´ÿ›ÿŒÿ€ÿ]ÿ&þôþÑþ¿þ¢þ_þþ,þBþGþ$þþþVþ‰þ¨þ¤þìÿAÿ‹ÿ°ÿ¹ÿÁÿÖÿî)ˆªŽULYR ÿ½ÿŒÿkÿcÿZÿ>ÿþäþÜþíþÝþáþÊþ£þ•þ±þÌþÖþÓþÐþóÿ%ÿMÿYÿ`ÿlÿÿŽÿ‘ÿzÿuÿgÿÿ†ÿmÿÿwÿxÿyÿ}ÿmÿ8ÿ$ÿ.ÿ<ÿ@ÿ8ÿ"ÿÿÿ4ÿMÿJÿ(ÿ ÿ2ÿXÿkÿ<ÿþïþüÿþõþÊþþŒþ”þŽþtþ?þ6þ?þ2þ7þJþeþgþnþjþ½ÿ,ÿ?ÿ"þðÿÿ:ÿ.ÿ2ÿÿ ÿHÿ?ÿNÿ:ÿ þÓþ²þ–þ£þÊþÝþÃþÇþÌþàþÞþÓþ×þíÿ ÿ!ÿ"ÿIÿkÿ£ÿÊÿ¤ÿ¸ÿæÿþÿðÿßÿÄÿ™ÿ›ÿŠÿÿÿ‚ÿhÿjÿeÿKÿ@ÿ(þøþÚþÏþÆþ©þžþŽþWþvþ–þ{þpþ7þ=þMþ]þsþ\þgþšþ®þ«þ‰þ^þJþ0þ9þ=þ&þþ-þVþhþ\þ:þþ þ+þ2þ?þLþNþ^þuþŠþ—þ†þ}þnþbþuþzþlþZþ:þ<þFþ?þ'þ;þ^þtþ‰þ„þrþlþ˜þ¬þÂþ¨þ¨þÚþïþÞþ¼þÉþ±þ¿þÍþÉþÓþÔþ£þƒþ“þ|þ|þUþcþâÿ,ÿTÿ~ÿ\ÿaÿvÿQÿVÿGÿAÿ4ÿ þõÿÿþìþ¤þeþ„þËþæþÌþ¯þ»þïÿÿÿÿÿ8ÿ<ÿMÿIÿXÿZÿOÿ_ÿxÿÿjÿ]ÿiÿ^ÿ*ÿÿ ÿþþþÛþ¿þ¬þ§þ þ†þ’þ™þµþÇþÁþãÿÿþåþØþâÿ ÿKÿrÿnÿ²Iy™¬ž¢«¡nP+ ÿñÿÏÿÌ6% HyiV‘Ù ÷ð⧤²šhX*ÿøÿëÿï '30a¥ë ,]˜vTI_vrA ÿøíÕÆÁ‰,ÿæÿÇÿÌÿÁÿªÿ¸ÿ›ÿ¢ÿ—ÿžÿÿªÿºÿ©ÿÊ")5;ÂËßðåÆŠpP&ÿøÿêÿæÿ÷"ÿãÿ¦ÿßÿÿÿ÷ÿüÿÉÿâÿàÿØÿÅÿÊÿÑÿ´ÿ®ÿ¥ÿ¿ÿÒÿý0O¢Ö4=Gg{rV!óÙÌœ”¯Ë´†…ˆqz„µÔô=FtxsŒ¢žyr@?eZc‘“ÂåÀÌ«•°‰D¯’“Zs|~pwŒ‰usz—©~…OÿÓÿÄÿèÿÚ #]©Ðí©ÎGEqD$ûëþþج™‘NHKJ6i~p¬¹ªôËõòô¾º«§¦TZ]_0ÿö3'/<ÿþK«w©³ƒæþ ÖÙ›ÌݾöéàóÚ«•D ÿäÿÿUÿxÿþîþšþ¤þÚþèþÌþØþÚÿ)ÿÿGÿvÿÿÈÿõ*W»Â¿¢raa]:TCP. & ÿåÿúÿó ÿÒÿÐÿÇÿëÿÆÿ¿ÿÇÿ¿ÿÀÿ¨ÿ©ÿNÿ/ÿWÿ.ÿ þòÿ,ÿ-ÿSÿ<ÿfÿ“ÿÿÿ{ÿ°ÿ¥ÿ±ÿÝÿ½ÿè8DOf…Vh‰•‘~_>ÿþÿ»ÿÿPÿ†ÿYÿ$ÿÿÿ ÿBÿ"ÿ9ÿpÿÿ¿/2EÂàç&L 6,I?/öîéµ³ËàüêÝœN*%ÿòÿÉÿöÿ¡ÿmÿmÿ<ÿ&ÿÿÿÿ9ÿTÿuÿ¢ÿ»ÿîÿ¾ -7ÿøÿò$ÿúÿÓÿÜÿýÿËÿªÿžÿ\ÿÿuÿQÿXÿ5ÿ ÿþîþÎþÄþäþ¤þiþmþdþ%þJþýüþþ=þŸþ„þ¡þºÿÿ|ÿ–ÿ–ÿÈÿáÿñ783?29\wjH#Pb:-.T"'.+ ÿâÿÀÿËÿ«ÿkÿcÿÿÿþþ”þœþþ¶þØþßÿ,ÿtÿ€ÿŒÿœÿ£ÿ¶ÿý65XsˆWrxkc5'3L ÿâÿËÿŽÿ•ÿÿ7ÿþòþÂþ­þ³þ<þþýÎýÂý‰ý}ýýtýEýUý’ýÀýõþ*þþþþÆÿÿÿ"ÿjÿ¬ÿÿÕÿëÿöÿþÿúCiaz|€lDZ>ÿÞÿ¸ÿ}ÿPÿ2þÆþDþGþ,ýýýÌý«ý±þþþ4þJþbþÇþóÿ%ÿjÿ›ÿËR©ÅìÔÜéèÕ‰fÿÿÿÞÿ¢ÿ]ÿ0þûþîþêþâþ¿þ‚þYþNþRþ0ýñý¼ý«ýˆýŒý€ýZýUý`ýqý`ý^ýkýqý‰ý©ýÙýøþþþ!þ)þ;þ3þýûþ"þVþRþLþCþIþsþuþ3þþþþýêý¾ý™ýuýuýfýgýUý0ý üþüðüöüÔüÙüÊüÒýý/ýeý¿ýúþþmþœþéÿ9ÿQÿOÿÿ³ÿÖÿÑÿ‡ÿyÿOÿ,ÿþÙþ³þþ|þMþ?þDþ;þ%ýþýäýÈýôþþJþ\þkþ`þeþgþ€þ‡þ¡þ¯þÆþìÿ"ÿfÿnÿ\ÿ:ÿ?ÿaÿeÿŠÿOÿ4ÿKÿDÿXÿiÿ,ÿ1ÿ,ÿ'ÿþáþ þuþ<þþýèýÑý³ý°ý ýÄýÜýæýÙýÜýêýòþAþ"þBþKþ=þwþþ‡þ¤þ½þ÷ÿÿÿ$ÿ6ÿ]ÿwÿrÿ`ÿTÿSÿsÿlÿXÿNÿ/ÿ,ÿ>ÿEÿGÿ@ÿ0ÿ1ÿ6ÿIÿbÿ\ÿ>ÿIÿIÿ|ÿ”ÿžÿ°ÿ“ÿ“ÿµÿÀÿ«ÿ™ÿ„ÿÿwÿaÿnÿVÿSÿOÿmÿ†ÿ¬ÿÀÿÒÿ÷#=:Odlp99!ÿçÿ¶ÿ«ÿ¡ÿŠÿŒÿ~ÿ}ÿyÿrÿpÿxÿ~ÿ ÿÿÿ”ÿ—ÿ¦ÿ°ÿ¥ÿÿwÿnÿoÿmÿeÿJÿ9ÿ*ÿ3ÿ,ÿ-ÿ1ÿ7ÿÿ!ÿ5ÿ.ÿ%ÿÿÿÿÿ/ÿÿ)ÿ7ÿ(ÿ/ÿ:ÿ<ÿEÿ8ÿJÿ}ÿ–ÿ‡ÿ^ÿaÿjÿ€ÿ ÿ³ÿÒÿò 4cmx…Áì09GijB:+ θ‰~L*ÿÊÿ·ÿ’ÿ‚ÿÿ‹ÿ¢ÿ ÿà'c˜¡ÄQ—›†ºàèéÛÞÛ¼´zWH#Ûª…‹ŠshgVG3ÿ÷ÿÏÿË =[IMkpeOD3CQEZa~‹°à (2SP)0," ãÄ·­‘~……W78fš°ž•±ßñ ÿïåÜÄž~7(CK6ÿÑÿÚÿõ :2#.* AlRBL|ˆ¢ž–·Ä¸«ŒƒJAA+ ÿßÿÛÿÖÿíÿÿ4F;JAK6)?JQÿòÿñÿëÿäÿÖÿÕÿËÿÖEx…¤»ö?JUEGLNß¾€O3!ÿêÿìÿô 0HNfx¨ ›°­µ²£’ŽŠ{‰œ²·ÒÊé  ô驪‰Ž–¤­—¦¬Û6i„¡·¯ŒaH ЙoN3+/3,CZб³Çêòõýöãϵž{mg]_Q? >GHFPr’“ŒxQG>8$ÿïÿ¿ÿ¾ÿ¾ÿÆÿÒÿ¸ÿÖÿÖstk-4.5.0/projects/ragamatic/rawwaves/jun2.raw0000644000076600007660000001301612327014024017145 0ustar gary Oʱ,Þ&¢[Í 7S÷ÛÀPÓ]5‚yÙjÇžº3ÿÍÿwÿòÿÿ‚ÿ{ÿTÿ½ÿò>ÿÕÿÆãpÈì=Fø,\Û3ÿ¹ÿ ÿ•ÿþþƒý—þCþþMþkýîþˆþÀþšÿ ÿPKÿôÿy©ÿ§«ÿ¼ÿ–þÞÿ‘aÿ|ÿ€ÿÙÿµ~Òk*ÛþéFÔ÷iµi×`Šq»Nê k!ÒÂða‡¹|xÑÿ£e¥ ¾N˜ƒG‰„¶ÿw9ÿôþ¼þDÿþÙý­þý{ýkþ`ÿ ýeüÊþüüú}þšüßü4þžrü«ýÚý:ýÂÿ“þëýÃüiýÂýîÇþŠø»ýóþzü­ÿÖü×ý ýmþcÿµüØ@ÒþÖ­ÿCu ÿTþ§Ù‡læq^WýYþŒÿÁÿïTÿâþ¨-þÅþOoý”ÿXÿŒÿ³ÿ^þ,ýùþ3þäþñÞþÌý–‡ÿáÿ‹Œvÿ£þÚÚí²„¿u;ÙM½¸psMpEù ñæCìLš¾ë[üÿVþÜéÿªÿñò=þ«þ¨ÿ„àVþýDÿv[é¿üLÿVü«ÿý"ûüÂýFýËûÓýrýÍúsü3û”øîùRû)ø>ö¼üôù‹ûûúSø~øMøZýØ÷+ø÷õ÷®ÿõ”ûrûåôÅûùù÷á÷ýýõ®ùìõ°û5û ø/³øúÿû€ú—úhûeÆ1ûwþPÂÿœÿgÿ~œÿÿtlîþ}¹v~oT8S-¤ÿEðú)…_¥ó+È«â ڰ苺ºtÃÿ0{=Ü_ÿNÿ[ü®ú½û‹ýªúLø†û÷Vöšø™öPóˆõ?öfóÆó´õEõIònô‡ø)óÃòÁõôO÷"õ-ô£ùÛ÷Äøù3÷Åúªù"üùýMø2üíRý¿¼m; - Cýi XPü+®þè› ik=þ×Eþø»­þˆüøý1BGü¾üú]ûdêú ýn>üUÿôaþeûÕû¡ÿ‚STàÿ…CÑüYeÿçõ]¬±ðLÞnâðE5`uHÖÆW :ÿðü¦ÿ+ÿÿxôü4øü‡ýùbú˜úøÙù‡ü/ü ûÁúÈúÆúÛöØõ!ü~ø?ôzÿ'þ¢ùùýoþ¶ùóüâýmõþû’ý¢û~ÿ™ú³ýÒ.ûñüNûØû²û'ù2ô¼ù*ú†ôiù¤øÐõh÷’ó¯óUð³ðõhñ>ï”÷ˆô±òUö•õçö/ù÷oúBÿ:ý§¸?&•Õ n £ÎÝMJ–GúO½UuäÍá"ž k ¿õ’ÿ”ÿ8ýÍþTû“÷>òîñÃóñiðïÊðgó…öö÷ªõ—ô3ôµõôõõ5óúö‡úùõøŒùíø‹ö˜ø öbôˆóGóÕöJöŠöìõSò ðUïµðØîgì–êþëEñï;ëâìŒížðñyñ”òõÝøûòÿü5¶³Œ < ÷T¶³T¯šq/i4|00TÔ±tVg ðñ #©ÜÃþdü¸úê÷¨÷¹ö³ö³÷˜÷Øö`õTö°÷ˆ÷öpô’õ÷“ùhúçúùÈúˆúúúäù¶ùVø ø¬ùø9ù2ö:ôcö¨öÁöõóÖò¸ð3ð³óAñññ ñîGñqô»ôsõbõÍö_÷Kýa`ÏüÇ I ~ R ¼3…üDŽ ©å=„læPìðÕ 7ÒÒ /7²ÿÒþ ÿ?üóùUö£õáöM÷k÷õòØòôëöýùLùXø ùyûýžýðþ}ÿ±¤—¬ 6€Ë¦üƒýÌý|þ/ý3øõ'õjöfôªò«ñºðBðúõö«õÈø9ùùäþÿþ9þ>ü à ;4’>}ª£É;Só] Æ Î  ù.Õÿ ÿÿœþ£ýÀû÷n÷i÷’öšô™òYòòúö}ùYú÷û«û¼þ¤M ¯ÁØ£ … © b  l—ézj#.×ÿ2üLûÂúøè÷ óçò‰ñ9òöö}õQôqö“ø6ú¡ü½þ­ÿøÿçs© ] m 0 ª pDë¦CF90¥× 7 #‚ÌIÌÿœÿ"þ™ÿ1ýâýÉüÔùœú¨úBø¶÷?ôËóyómô ö¤øŸúÙüZýüaüdþþfþ¸þÂÿL÷³j²à33÷$ži#ÿíý_ýGþ·ýJøˆõôxõÅöÒööG÷S÷:úpýCýjþüáÿ+;uà‘t i &  ¿g™›Ž Õ ; 9  Ó’7cSjý÷Ÿõõ÷Îö ó+îGéÌêÀíð1ò¤ñÚó±÷GúŠüæü7ûëüÄÿb×(âõ úâ¶ ü  ! ¿ > Ÿ²C¿fýÍ÷úòoñ]ð!ïOï$ëlë]îöð ôˆö^ô³÷Mù¡ü/‰¼K¯ ÖF ô{õ7çµÄPv Ð ÚuGý¹þ•ýíýL÷¶ò¯ñïðïFìËæ­ã±ã¿æAêvëãíïøôKú,þbþ9ý)ý˜m¬,ü­ « ³¶«Å ô ^ú± ¦ ~œÿûäö‚ïëqéöì@îyïÔðÎòôõäø úûû³üãÿÎ8~¢ª° wÁ½Û¨–ÞÓ  Ú +1þßþÊýAùÆöŒñ·î/ë&éVç(ãFàfà«ãLç#ë¼ðGôwøÎülþæþœýÐýÀþ~˜Ìà ê) t d“ýÉ÷ópîÄêÍêèìÿí”í¿ð3ó-öKùtü‡ýÓübý1ÿ^"øk*š Z>Fê`Û+à ­ ÿ ÙõTMþyþ4üø¾ôîžë£éÓæïäjã‹å&èÚí ð^òô¯ø ûtþdÿâý ü(ü×þúÕ:«¤  ÂàW p ¥-!þ¤ö8îôêTä$åçéèîó{ô¶øÀúùiý¥ü¥ûæþ¼þvK) Z gûkÏÎÜÉ&s Ï ãM@TÔ£¨oýŒøÔöò¨ïÔíµêÄé{èXé"ì´ðEô‹÷^ù üýïÿ¦SÿuýÁýtýDÿb•þ ½ ü ¯ ° Ì “e}¸ûÄô¡ìaèAä½âÈç@ê>îuöPùµûIþwüý—ÿý=Wz°} | Ò¾wÖi¹;Á s9~ Á\Ù_ÿûû˜ølöñÎî¯ëÿéOéùëºî„òöhû:þÃw3ÿþý×þbÿA_H9†Û³£é®»ý8øÔòÌíiçná‡â–åÎézñ3÷lù—ý”ÿh'?>ÿµ—˜$ E @ êÛä·VoÆ+S'û þ¤ü€ü¼ÿÌÕŠúœþ¶ûöxñÂïÍî‹íÏðEóa÷ýÂ\7QŽ£U[ÿQüUû–üÕþxƒË2Ú … 5lþšú¸÷…õ?ðûêæå·â±ã¡éªì¿òNù ùŠüØØþßÿSÿvüŒÿ\çÀ ‹ ҞȭðÐGà ˆªœ£Y9˲°ÈÓ—®þkûš÷ëô®òZðeðüóú÷¹úgý$ÿ…SC­…þ—üžüðþa’òm0ä ? [Zþ)ú‡÷[ô:ñî¨ê ècéÁì%îÑó‹õëõþ÷÷Æø:ùhùø¡ü ó# b ö”\_¡5=rÊ 9 ß dÑw¡s¬ûúþ{ü¼ú^÷œõÆóÉñôñóôTöæùUüzþþòÿœÿïØ¬×#Õü ð º Ÿ p Ý H ¨TõýìüGû¨ù;õÃðŽéÞç#çDèìQïHð ñ©ó#õ1ø-úªü)ýÿ·V( Î ¾ ltUmböÞw ÿ 1 ÁWG…ÀþÖýCû_ú øê÷«÷Å÷‚ö¼öeõ±÷ù¶ü ÿlPn£4iäKX i ² @  _ # 9D½DþÌü˜û¡úÉ÷½ò5ìè)çÔêÕî²ò8ô»õ'õ}öéùûÉþÿÂs·Ø ™ ! @ óÔBAz Ù 5íÓ™'4²ÝICÿöýŒûýúùúkúyùÑøO÷‚önöŸùû"ýÿÿ”UÀû¨µ§²ç™ ì 0 ÔïnUùHð þLüºúúøÄô‡ð.îídï¡óZõMö0ö8õlöéùØü=þÓÿ¡ÿ<rCSƒ ð  s – M¤Ÿ • Þ AŸ$ú¶‘Oæ3ÿÀþ›üáû1ù9÷÷öØöÚ÷„÷ƒ÷`ø+øµúYüýþÿH”[+O›Ë®® <  þ Ò¢øLTž¥þ!û{ú¢ù¼÷jôÎðäì¢ëeígïCò`õõ&ö ø$ú•ý‰ÿ›<­‡7J ê  q Z L ò¿– P +øÃ¥Ki™ÿ,þ^ýFûVùö•õ ôÝô¬õö¥ö¤ö¦ö{ö#÷lø«úüýØm5Ò*& w + z «`ÒœþFüÝûú·ú´ùé÷õwñÖîí•ìúî>ðjòwôî÷ù^ü?ýlþÿsÿ¯ÿÿÊPïñ 2 î Š " Ý Ú ¬ $  ¾Cc¬ÓÐdþFüœü·ý<ýdüÒúþùF÷òø ù\ùªùÐùhøÅùìûiü¹þ’ÿ‚ÿŽpI“™O3X‡µk‡}ÀþjûÒú#ø™÷±÷aöøö‡õXó¢ñœð9ïPï%ðòjóðö8ù3ûýÿšaÿ˜þýSþØ.[¶  î · xÏá1RocIe’Š}ÿóÿ þîþ’þÏþ‹ýxýmüéüöýDüðýPýÒþiþkþþ–þþ%þxÿKÿ©þâþýýKýÐþýõücûùöøÃø÷¿÷Uøù ù¡ùýù÷È÷\÷Å÷3÷.ø*øÆù úûaü{ýüùý#ý¬ý.ýMþµ‰{ûúþ^yöTÈ݈•þ   H ª MkàUæÿ»/ÿõþŽüóü¼ûØùðù1øoøŠùSú1úÃúäú?ø~ø1ø‚ø+ù!ù«úZúÞúúûµûÓûëû¢ûÙüiüûßû³û¡ü²ý4ýýüxûcûÉûû ü üüÜý¸ÿwÿPÿk2M?‰D:Üݳ­ûe;Uº„{òH±åÃ[$¤ÿ°þ½ýÃý<üÅü,û·û`ûÌüùýSüoû×ûÀúÊùáúú ùÜùdúúÐûÁýMýäÿ=ÿêÿ’ s´›Õ´«;…º;uÿÑÿ’þÏÿ þÔýÆüoûúYù–øÎø—ø™øUù@úéý†ÿ¡ÿ—ÿdÿ²ÿPÿöT@¥ºÐ8E޽\zæ­Kc A¢¡wÿ¿ÿ§ÿ.@´ÿóþ4ý~ý.ý2ü—úœù¦ùqúJû&ûþü¢ýHý‘ýþþýMüVûü¸ý·ýÞýÂþ-ÿR<¯3ÓÿVþKþþ‡þäþýQýhý­ýÎüåûsú3ùù[ûÉý…üÝüuýÿEe~öçœoìÊ | =r?Ìâ4¶À–½mhÚ¶aÛBñ`PÿŽÿžKÿ•þýüÌüiüû¨ûÇû˜úzúgúðûlûÓû›ûYü5üü|ý±þÍ+ÿ`ÿ:þòýeý÷ÿ †ÿ¥þÿÿzÿuÿhÿþrýÓü`ûiûØûàüþnÿ>ÿ´¯DþÅþ:ÿL«ÌÛ ÚAbÚ–$Æ/Ñ-v¤ãP˺РAÏ&þÜþýœþ¤þeþ*ýùÿúëütüžüßûÿüœýgþeÿ¹þ‹ýNüDû´üký:ýÝþþ]þýÿúÿÅÿþ–þÞý÷þ*þ‚þÛÿ©‹j°X«q­ÂÖf…ÎTΟê@ênÿ”ÿÿ¡=þ²þéÿlÿqT˜LàC±@d¢Y ÀÏÏ6ûÿ½ÿOþýñþŒþðþ¯ÿ!þwý%ýmüYü‚ý¼þkþ‘þœÿ¯‚Có»<ŸÖw\.±Õ²¦¤ÿñÿþú)ê]ÿ7þ}þäÿçN+ÿ{ý´þ@'lýKo°žÿùÿË8Anµ'þçþýþ]ý6ü~ü+üûÔûÂüüÃýàÿ(ÿ¤ÿ‰ÿþÙþµÿ7ÿÜÿ¥þÃþçÿ}ÿûì³FÿîÿðÛF»;ÜnE§_0½»±88stk-4.5.0/projects/ragamatic/rawwaves/tak1.raw0000644000076600007660000001132012327014024017123 0ustar garyÁ^±ÖaN¥¥F_ÍÿzÿVÿþñýöýÇþ}þäþsþ þûÿþ¨þxþcÿ5ÿåLâ[²khuÿËÿ¾ÿ`ÿ#ÿjÿ þMýyüDü[ûÒû{ütü©üPüZüìüåýÈþÈÿ4ÿÑ=ˆ¨šJü#ž9é|Uf«ŽÚÊft<ˆèÿ¦þ¯ýÁý…ýûðû üiüóý%ý¦ýºýnýÃýðýý}üÌüûíû›û ú×úIùSøöùÚúUùoøªú^üü¡ýfÿn§%­5 é©„à¾"ªC«KÏDaÿ€ÿþ…ý“ý~ü»ü³ýáþoýÃü™ýŠýÊüÁüÅýýpþ9ÿ‰V_˜“„]ö»±éPþÄþGûÊù{ù÷tö3ö"ó¢ñóßöš÷%ùûÚýSH+¤÷  Ɖ ¢ 9þŽçÿÌû×ùWúcøéöBõ:õ’÷ø:ø¬÷_÷°ú˜úùëûüýŠ£Š=Ï˨÷ÁŽ“ÖD'ÿ!üŠùúöÙó—ò_ñzñìñ„îpîæóðø¬úû¹ÿõ„~ ¿ Ãf¤ d Ð ~ ü~ÊþÏúëôÿñdïsïîwìÂíÃïçó:õÞ÷Âùñür^§'E¾PØé× ¬ÏÄC«{üÔûÕù ö õbóšñîïøîÎì8ë]ïjóÙöcôò*ù3>^ ºÉí÷#vãý g~ ¯ûGö*÷!õvôì­êaîñ¬ó½ñpó«ø¿þa†ÙL { á ´tzPÌŸ1ÿhÿÿý¨÷³õËõ_õIó:óôLõU÷iö=öÎöAöïøøùpûéþ¢ÿVü\ü¤Òƒ…<E ƒ` õ>[³±ùû(ýýºû’õ®úêú»ùÿ÷„òÇ÷Bú£ûµùføþ‰¬æ« " ( ÿ‹Ösþ²ú°üÿ'úÔùÔýKýÀûGúFüPû“ûú±ùû^ùÞùHùaøµû™÷—óöùJûtü+üß6¸ JÛ4ĺLÀtŽ­û‰þ¿ÿý2û£ó²õûùùl÷“õ²û?ÿ¤J§´à”Çaÿ¦üëüËÿGþÅÿbüóû¹ýcý¹üôûüý+ýŒýoþgýý‘ü–ú¦ùøŒûlü´ø)ôsù®iÿRþôêJ€% x É Æ ?ÿ©šo·û„ùYýrúX÷àñ|ïÈõCõ®ôsóÄøDþÀÁHw? ¢ ×Ovà2„ý;ûíýÈþ¢þ‚ýŸý†ÿaoœ*ñGÙ#ÿû0ù"öàö ÷ÖúA÷ùòœ÷ ý¦ý/ü½ÿ­1ì¼ù—¦¥ ÷Y®  ŒyüÛþwûlûñóðõ7÷ö¿óöÿþ1Ž} µ ² Ý*0ÇZþû¾üðþ þÛýXüþ]ÿþl €%þ„ýü.ùËõ¿ôMõšù“ûÙó¼ñmü4þÒÿ„' ÿäá °Œ€å…R JøÂù×øÍùBöîsóõøjù<øl÷øþüÒ H \ ï•Á} Õ»ÈLÿ›ühüêýÜýlýÐürþ(Àïì‰<¢ZúZþõýLûÃ÷Ëô#õQ÷ûø”ñs÷ò"ÄZ õg@–æ  X •Lø~ò¾òÞðïò7ìyêÜò—õ÷nøû­Ä# ! ©Èüƒÿ X ªÂ<úëøúû û‚ú@ø²ø²ý–þ(ü¼ý¦ÿ®Éº»qÞ¸þ(ýùt÷¡øöøªüåúÿôÞúPS(ô " ußWEß þ èqOý¼þyý€þ˜õøðBð½ñôÖì»ì¹ö6ømúÚú0ÿIE w*µ‰…?¹Ý´û*öÑ÷{údùˆ÷f÷\ù=ü ü“ü5ü"ÿ)Ñï¡mÿÌý*û„ùõ€ó¶òS÷‹ûYô“ôÿÍ-¬+:è9a ¼ ^/ Ýüùû'ü¤ÿ‰úAîÚîMðÇóî;égñjømú}ûÅÿzõPÈ+U5 ~N§»üöÀö»ùLù¾ö7õ°÷bùoú—ùùÒýÈÈQ4D§èýKûø(õ#óAöuýqû¢õMý3TE*{ FP¢” À Õ ÌþÇ÷húLüEûiðÑëñïêò+ò_ëïîAøïüZþ1tÍÛmáˆiÑFØÿñøòõ9õö›õRòòðõ`öšöa÷›úµþ³m\"Xº/ÿtýÍû]÷yôäôöòþ¬þôþû›~#C@÷]é n… P /ÿ3õø˜ûhûóPîðdòYótî‹í¸öüü°ÿ7~ 5µ Õ © 7'ºËË:­ü»÷+õ»÷õ<òÊò¥ôöÊöÍ÷Žü& tìí.xþnû–øõôG÷ü¿ýó÷ õ]!ÿƒý­x ýt  Ÿ   Ònü·û¤þ ý£ù©ó(óªõÿôZñÀî¥ò‘÷®öÄøuüº¥Ïs´ |  Q£áE¼ürøøø6öøõNôkôÅöö/öóù>üEÿ_Zÿÿ@Røÿ»üìûýûwúø*÷=÷Çú|üŸ÷¿ó¢øÂÿ7ÿ[ýîn IÔ[ Ð Æž “AýùÑü’ÿþ˜ù£÷˜÷ÇøGõ\ï%ïaônö¦÷ úØc«& ‘ â õ [ fòÛþ1ü0û¬ú õçôÌõÀöwø ö­özúeþÿkýʾHýÕüÿü²û·øõGöû÷ÜùOù+ô"ó—ú&ý7úîü k 05 žã _ ê_û'ÿ¶“1þ‰û`üöúöÌî´ê ð4óÚõžö›ûzó¦Ìª e?õ@h¦þNý´ÿOüäø÷ø ùþûÃúuøŽùÀýM½ÿÍþ’Æ‹\[þþý—ûÿøWõé÷“ù›úwú1öbõïú«ûFú ü¹E ƒ C ™® T ýIþjãëÿ“ú1øŒø}ö­ðúëwî®õ4÷µøú^-žŸ¼ .Oâ¡Ùß%­Æ[ýÃüOû£ýAÿýäûYüˆÿù"ýûýÃÿ þªýúÁú@úØùM÷’÷døÂùüùù#÷Åù¨ý3ÿ€^'¼ ’] ñ …© 4K(€üaýDûjüâýŽù±õÀö7ø¾ûúú`ý€¤cSùÆÿþ)Cß„“$kãã;’Æ¡HÉVA·•kþhü{ûú¼ùžøn÷ì÷Äø+÷öË÷§úGûÈü&þ6‹ÉõBõÙg8 }>’Û DGEž®‹ýáüéýký3ú¤øÊúGü‚þ û¿ùüúÜü–ý6û"ú£ýøÀíÑ›Æ "º/­.1ÏTÿÖÁî÷þ‘ûDû¸ýôþôþsüõü©ýyü¶ù½÷~÷çúûsú7ú×ýŠÛaþæØe»îÚÁ9þñB¼[šWþXL„Ëûêr& ïôàT8ý}ü•ýóÿÖÿý—ý¾ÿí0ÿ<ý¦ýQþ€‰×0(ºèñiŠ€G`Y6…ÿþýý8ü.ûú§úÙü ü‰ýzýøýÚþ©þ¨þ+þSþ'þ“ÿ­l{Jb@Õ}ÕKZ×x‹Xaà¥%„…ªpñÿïÿ þ¥þ’ý˜übü4ýýïþþ:þ‹þûÿ†ÿ!ýÑý›þÊÿ´ÿÒ[‰– m¸ÓÊ;q¤D›:U|Íÿ“þ!þ#þý³üÆý!þÝÿ ýüWü’ûõúMøëúÖýFþéÿÓ$[à›Gÿß70ú“—Fži&JÁRèûm-&þØþ“ÿ,þìýrüýý·ýæþý½þ,ÿÿ|þêþqþ×ÿFþÑþiþÈÿMÿ—ÿ²ÿ°† "B£ß„2~,”ð½îÍÈÿÚþÿÿ þþþýËý}ýxýü{ûëüüŸüÔü¥ü¹ý"ý¥ýÙýÚþVþ½ÿUcÔë!z5ºZ¥ÈÉí*ÈLzz ÿªþÍþ¬þþ ýžý­ý®üðüƒûõüJüêý@ýëþ!ÿx9ÿÝÿ¨ÿÿõÿ«ÿDÿe'  k\뵂9ÿ¾¦­E ©Ó2ÿáÿ¦ÿˆþ¯ýôýæý¸ýUüèü<ûçü ûsú­úúQûû(ûUûÝü[üâý]ý/üÌý®þqþ´þëÿVR>†@%S©~X‹¦¼ hi3‡ÿÀÿ¨þñþ1þ6þkþÖÿ‚ÿ¦ÿýúzј,g—†;5 ÿ—ÿþÜþ·þÒþký±ýÄýmü¿ü/ûzûüü ü§üûý0ý“ý™ý`üñüœüÕý*ý*ý³þ þÿ0ÿ-þûþÇþûÿ7ÿ7þÛþRþþpþ»þýÝýŽý?ýüeûsûlûºüAýþÿZ„M¶ûáµ²„zx§_¸ˆÿ¦þcý€ý^ýÜþþ ýèþ:þÖþíþ[ýæþ?þ¥þZýÙþþ–ÿ,ÿ7ÿÿ?%dÿÙÿ/þðÿÅœ± ð2“Ч ÿQþ"ý0ý>ýNý,üæüªü÷üøü¼üªüqü}üáý]ýÄþþnþ‹þnþ4ýÈý4üÇü—ü¶üçüâýüéüÝü¹ü9üülüÄü¶ý,þLÿr7.| Bÿë*¤˜ ÿÿÿºþãþ­ÿwNƒÎŠoÚ¯ŸOƒÿ ÿÿþËýæý§ýšýØþeþ´þ®þÜÿ`ÿ½ÿ‡ÿvÿ[ÿJÿQÿQÿ›ÿ¨ÿ±ÿäÿ¿ÿ ÿrÿ0þùþþ\þ þ™þ¼þçþüÿTÿÿ›ÿÆÿ’ÿ¤ÿÃÿeÿ þ¢þYýÅüñüUû½ûú9ù­ù\ù$ùù/ù¤ú)úäû©üXüÜýRýåþRþ×ÿ€ÿžÿÀPÞc§» “ ïÙ&d@ð•wœÉÍ´åÕD•uÿùÿŽÿÿ"ÿ-þðþëþ»þêÿ<þöþèÿIÿá6kÀʪdÿäÿgþãþ…ýÉýbýjý,üðüÖüÜüáüÜüÅüðýgý¦ýõþ,þ€þÿÿ"ÿLÿIÿ:ÿˆÿdÿ7þûÿþþþÜþkýÒýjüäü–ü(û¸ûƒû“ü ü5üü=ümüÃýIý.ý#ý2ýÝþþ¹ÿ ÿÊÇ­5’(=¡îVÞô¿:`• æ "‰k—, bŸ²¤n² DMéâ~ÿõÿ…ÿmþüþ9ýÃý\ý üü ûðûÌüü1ü7üýýbýƒý»þ1þEþsþÉÿÿXÿŠÿ× ˆ%tUé·ÿÿÿ¹ÿ­ÿdÿ—ÿÓÿ›ÿ>þåýëüÅüYüûæû³ûÅü>üëýü™üüÁýýâþ—ÿLQB¹9o‰é¨Ïæ¼òÆ5 0€W÷ú8DE>ÃÃstk-4.5.0/projects/ragamatic/rawwaves/tak2.raw0000644000076600007660000000762212327014024017136 0ustar garyþ¶ÿù¬…ë§< à c R  Ó eˆ2üµN§bEþæý’ü²ûœûúmùÎúJú¤ûcüü–üÀüèýÐþdþÍÿ”ÿñÃåí8Îo•âµ»<›À) ÿ<þÃýõü¿ûêû6ú øÅ÷”ö õOõQômó€ófó"òòpò>òÄóÞõa÷°ü¦ë:PèN d  d L¯¢J¡] ‡ œ R°£6þüCú¦øIöfôÄó„óAóŠó·ô/õê÷|ù¨ü@þÿòð¶ä / Æ ç  3h %“ÿGÿeýûWù<÷Þø‘ø ÷öÂø:ù´û&ýsþ´ÿåшZ´ê(Œ9éOürûŠù„õžó…ò?ñ*ðJïí÷î—ð„ô0û þïý“ÿ%K V^xù&@õ!´ ƒŠ#þˆüfùô¾ó4ó±òßññyó[ôeôÊöøXüA¯áì _цV ‰ îß õ‘ýõüœü\úÇø‰ö'ôpó—óôD÷¢úJû]ý›–îI›X¢ r‡âÆýèü.úOø‚öNóÆó€óEñªð–ðÑð¾ñóÞø¥ýøü | Î â¿’¼óT¹ª@È qûäúŸö#ò‰ðËí]ëkí—ïÉòô%ö øküoÿœ!/ J:îÇÞF3ÿ‡¯)ý8ú}ö”òÃð¹ðƒñbóæõ$ôÉõÒ÷ùÐýŸFŸH # … Û á ÊŸàAýcúÂ÷Ôô$ò¨ñáñVòò­òÙõö öºøœùúEûÁýr†   "¢ 1 s  G † j $&ûµøöÓôšó’ó§òßòÃõ ø¥üýÒýÚÿ½k»"² Ç — F ¼ Ú ” K Obü^ùŸö–órð-ïTñyómôàøÍû¶ûü/þfÑÖ ÷ 2ZÆ l X xÆüœþCû(ö ô<òÙñÔóóªóöõ^÷.øéúÙû2úZû®ý^üÙûŠü[õ^ÓÎVšN·ª, û öËÔ¢þ¾û ÷ƒøVûùûi÷4ôû÷¼ýmÿ®ü6ùü\ö3à,  / e Ø ÓÿDü«þLûÝ÷{õôEö¼ú)úzú ûýýûìýNkŒ³mP ÄNJMùØþ$ü7ú:ø…öîõ õÒ÷<öAô›õÌ÷ø)ùù}ùùñú³ùÐ÷ïø·þ–1 Z‡þÞ£ N7« ¦ &ã …ü^ñïßù^ýêø~ñ«ôìþ^Øû³öšü²·í$w1 8 l<Ž ‘iü÷šú~ùNô ð\ðäöû†û×ûô<83Üà ß8 åG‰ÖU¥þ7ù‰ø!öò ñ/óÄô õŠöÝõFø¾ýKü+ü9ý¢ü¥ýÃþúc÷ù–Þ YøàþA·”H bv `mãÖû1îZñÐüåÿmø‹òÖøf÷þ÷)ö9i‹áXþ5­ * A˜ ™ Ö„û‚øÀú›÷Ëó™òYô@ùýåýäüøý¸œ¬1ú Å ŠÈ›–ÿ;ûpøèø(ôêðêðëð§ñ£õ>ôÑõ›úÙûùšû²ý8þ3ýøÌõøÖ!pR÷EJ –Œ+°ª„ ý€ÿŸ#øÞí¢ñúòþÑø'ñ:÷ޏþ„õ=÷B§ß¤ÿ{y Ê ‹jv ü kÌþlúóøD÷!õó?ô ø>üÚþÿ.Ú¨!çšS W ØãÚÇÀÿèüVúAùCö«ô­ó(ñŠðÀóçömõÇùýüéüJü§üü|ûÖùzøÜ> ¹¿øûC† 錪 wÄÃóüÃV ŽÄðíÃøQòððüÎuúËôËû%ZÉeK  <Þõ è 1Êû%øÏø ÷ÌôiònõÍû/þ.ÿmÿ-O¦§ H  šì^ܦoìþÙûýùÁ÷&õróñ•ï~ñhöÈ÷}øüNüÚûïý‚ý"úøTúCÀ  8ýŽû  ®vÿÒ „]µý¨. /—ïðë’÷‘œ ôOñ¯ýx=û§óÄ÷çV‡¥a, ª;Ò· : .BýŽüû&÷üó¬ô øüü‹ûxÒõi’` š – N ¤ wãðCüÿû¿ùˆù¦÷Íòøï¹ï î+ò”ö,ö úìÿý‹ýýû¢úTûíÃÌØü¦­ j ɬþÖÿ¾Ó Ûýà8­sõPèÛò7-¤ÿôüž\Èòðîü,,=hþ1Ï C¥x5Ü ´ßÿpþÑþ¨ùÕö%õuøªþ­üþÆ•ýÝý|aÞd; ¤  €ÎÿWkþgú5ù¦øõ€ójðÁí<îó‡ôú÷þüoüÒýIýcûùÝý ñx!þ£ ÔK ÒVh³Xüþ… ÿhìPê©øýRöìö×ï†ø§íòæüQ7Îý ñ Õ + G ¾ ‡iÿsnüÂøbõÍùüþ-üÒüÿ×ôþìþ¬þ¾&Ã×a á ¸ŽºÇ#þ®ÿHýúü¤úãø'ôÌñîÿï,íÙï¶öäø÷¡ûÛý"ûÿR Ø °ñ †À ÞªßLò¶x÷ jýrê³èæö´.þßóö‚ì)öÎêÉñÏûƒü'ú–úo. ë ðœM VD€‚â2û ùŠþ%ý4ù]úªüæýœûlùŒüƒnF·¿ TçŠPÎþ7þQb'ÿ‘ü`ú¦÷Åó ñYíëŽò§ô€ò&õšúk2átÿÓ4© 1 Ï Ru ÖƒÿZéGï Oâôµèöš gßð²é—ôÀÿû5îZðcV Œ½2ã £D]þe•Æ·#þE‚Yÿ<ý7þ“–þ›úyúýüýý!ÿ¿>õgã¤ýŸýÏ€pý2úôû ú9ø‹óÓðÑôÙ÷¸ö4ö«ú¹‰â÷üø} Q Nçú Vö Ê "Nq Vý÷áX$ÿàö÷œûñ¢õ ü$ýP÷Pñ“÷ðèý•ûMÿ ¨rülúKþ„Gÿ‡L|MÿèþÞ f2ßoÛ¢aÿÓ­ýüûþ)þ©üþùÚùÛûúüµú˜ø…øâúú øø ú†üåþ3JÜýÿýÓ@srÌ 7` @m/ Š ˜Ò3> T ¶üNÿýt4úõÑú^þáüSóØðŒ÷“þúÂöb÷Õý—×ý¨ö÷šý&ÿÀþ\ü©ÿ»8Eõ¡dö)ÿÅ Ò¡§,¼³RÿZþ¹/òý¨úÜûæüûŠúHúsûpülý?üXû˜þ3ÿ-ü–üþHÿÿÿ¯üÐû1ýà@@ÿyZ )x“íä–þø=Òm]˜Å¶ü6û+üûUøDõ'õgøÒú¥ùÓøöø¯ú™ûšø±÷`ùÊûrü¾þžÿKØaÑþ[þSþ/ý þ4ÿ³ÙïW±°ÿäÿKW¹þtþþýUû³ú˜ûˆýžþKýJýQþiÿWþKüGû³üøý½üú„üNÿÿàÿ‰|eÚÖÑÓŠ}®¤¿¦Q>þþvü“üú²ùîúúdûèý£ýjü%ûjúÀú:ú~úÆûüþÄ *#þØýÃüÞûÉüyþSþÏýðýãþcþmÿÿÅÿšÿ2:q¸qƒÌÿSýûÿ"Žÿ~ý…þ%'ùÿxýŠý£þ–þòýcû­ý™&ÿºý¥ý&þÿ²ÿýÉýâÿ‚Èúÿÿ*€l¨ÿÿÙûÁÿô]“ÿLýaý6þÿ!þhü‡üCýäþGýû•üUþþáþrþ"þ»ÿêÿìþoþþéÿkÿÀþòþ þ”ÿuþ‘üÅüÔýRýMýŸýõþXÿätj`3þÜþsþþøÝã_‹ÞÿÐÿ¤ÿ˜ÿ¾ÿØÿÒÿê>ÿUþ?þ þÍþüqû×ü[ü{üŸûŽú`üþ8þHýlýýÁþGþ@ýbýSþªÆ2EþlüÔü#ü—ýÛþ³ÿWÉ!jùÿUþpþgþýcýöþ›ÿb•:ÿVÿ¿ÿÒþOýFüÀü¸ý üÜüÒý|þ©3î ‚zëâÿÿm^ŠI7xVÿ+þðLâÿrdí¬ÿ^þïÿhþ—ý@ü´ýüýý8üÙû±úÎûúJø“÷®øaù?úúû3ü±ýÕýŸûÝû'üü üXüyþ '\‚n`Eá&ƒÆ,K¶gŠÿãþóÿÿ<þàþNý›üÂü\ýþ4þoþÛ]xåÇ‘•£–X‹´—+ÿŽÿß,ÿïÿYÿ¤ehÿ“þñÿF@j5f­îÂÿ¦þ‘þcþSýÚý/üWûâûúâúù7øÐù,ù ø·ùùZùmù·ù‰ùnú9ûLü<ýsþ)ÿ‚4Ý¥44stk-4.5.0/projects/ragamatic/rawwaves/tak3.raw0000644000076600007660000001646012327014024017137 0ustar garyöGþWþ$þïýÖýÄþlýçþýXý#þýEý)ýÑýëþÕÿ ÿ”þÒ=X>³ˆUïêÈ+˜ƒ‡ÿ¹ÿÝÿÿÿŠþrþ)þºþÜþWþ~þ¹þàþqþ>þ„þªÿ;ÿʬÿܧˆ ˆE:$^F-:Zþòþ?ýüýÒý%üþýfýýýýNüèûËû®üÑý|ýý0þeÿbÿÿ^ÿÙ”EÿVÿÎ}s~þà3ÿ®ÿ…ÿ—ÿ,ÿYÿžþ˜þþßþ¡þnþ‡þøþcýQýµþ¸ÿ——+ßWoÚçûÐò 0 M 2 ½ O  ¯e–DÂÓ#Çi/Hý<üßýˆýÀüóû8úÈûúäú¢ùÞùúÊúŒùùqúpúéû¶ûüüžý=ýkýîþUþÃÿ¬buÿý=4Í€ënÿ¬ÿ’þFý3üËü>ûÄû üüGüüãýý#ýýþ ýÉýÞþ˜&YvåÒ‹Àõƒq°}+g¿ K 8 œ†î#³¦ ºáµ"\Sõø " æ r P‰Q±­Û ­Õ±…"¾Q ¸ß+ÇÿÔÿ—þDü`ûúÞù¶øoøVø¶ø·øÝùú ûnûºü[ýüèý$ýIü;ü>üü û`û/ú øvøˆø‰ø÷qö¹öö·öÀ÷>÷ì÷ÐøùùPù2ù‡úïùV÷öùùFö»÷öü.üóü(«jþ vÂøe߈}[tšuÔ¬ º ÄËž¢ýûâûUùfø øÐùùÍû¥üÂý¿ÿÄg+¼º Î ˜Q” Êm¢þ×ù÷Óö<ó£óúòðò>ôNôHõñù>úwüjþÿC´ÿÜÿ¡þƒü6úêùPöGôÞôJñ(ï°ð)îÊí ïSðçîóð‹ó|òôóÃõgôôöªôÌòvôðø8ø©úÒþi3Þì Ÿ¤0Zf„#¡á< ý Ý~þ{úÎø-öô|ô'ôô|ôJõ_÷ŸùñýGA·  ñúO&mæ £ 9 "¸wýŽûTùKõ³óëóéôaôÿ÷ ù˜úÓýgÿŸXøÉ9 —SÿäýÔú—øèöMò.ñïõì¶íî?ìwí1ðïèðßó2óþóüòqóýõFò¡òžþÚí÷Æô² ðg&á3–9³am ™ðÿOøôñŠíWìžî\ð|ô6öøfúŽù¨ý¸Ú  ú š ìg‚Žq s ¼zï!üøŽö›õ©õ¼÷àù`÷ßøüÿ¨ö¥¸Ïœ $ A 4fiÿýmúl÷ÄöòÉïXíÆî¥ððbðÒò9ò²ôZö»ø]øw÷;ú+ýaz úcë L-#"àRÎà G‡ÿùØù«îç˜íèê¿òóŸùÎüåþýl» È ì y w 6L µc çA…œûFò¹ïþî;ëÒìQñ¤ôÉ÷ƒüˆÿׯ‡ q þ  ¿ž ï]ÓÚ‰\7þœûZú}ú–÷ôóóëò˜óÌó‘ó÷Õùýù8ü<ýôýÁýEý@š&õw-½MNè4 Z ³3úBüªõë„íxíê¡ïóÒ÷û?þ¥`• € ’ âf´ ø>ºù ’ Ňÿëþ[úØó/î”ëÇé êMììïŠòw÷‰ûFý ÿ‡ p ÚßË0ñ^Ïýxü2þûiü»ÿºý,üSü-ù›ù›ùö¾öOôÿó®õbö„÷“ø©ùúG÷ñõ¸÷(ùtü•ôîñÚ©ýº {† ž£Íz ˜ ˆçþºûnðëôî{êé_ï²óGõÎùrÿŠm« ¢  þö ˜ &†´ / o¼ýÿþ öÀîÑíïë`ç¡éÒìÌì#ð…ößùxþWúL&µ¶deŒLÿÖýçþÿüÛü·ÿŠýúÈû‰ùJ÷/öåó¶ðœð|ïÖï•ñÞòÙòÀõÂø®öôhIÿ]ï¯úW ?÷þé‹\ ‘¸†Ñ L¨ÿÑûîÆëëuçåºëØñ(ñË÷oÿË… Åœ • (¥ ™ ¼âSˆ;L%þsüïóßíÓí>êgè„ëƒìøî¹ôÓøžüŠ Ä øä ¹  Wuýáý^úÔøpùÁùõãôõõxõZõtõ|ôFò×óTôÕõFöñöSôÛö'÷Qû¤ø—óÌÿ´Ýÿ´Ó2˜ ²ÕÔ¹ î $þ±ý…ùÌòÏð§ð%í–ì³ðÎó‘òËöÓýþýò† áâ ¸Þ̇2÷ 0 ¢¶ÿÀûaôùñ'î¹ìQëhïòdõcûxd¢B“ C8 ­ƒa©^ÁþíýWüNúžøª÷Ùöõwörö¸öŽöƒ÷3ùùGùøæ÷"ùíþªõçô9i>þ=á. e\ZXÄ ªJ«þKøiôôñlîOï«õ,÷9ö|ú‰þÚþ-ÿÃtUm n   ¹†Å ½ w˜2þ®ú$ñïîÉî-ë“ìïÓóæ÷üÉ æamyP ý  ßÒNŽþwý~üuû+øÕ÷±ø÷þø'÷¬õ›ö1÷Ûù=ú(ù÷ø>öùú‹þÊùöü Ç 0Ø“N“s\Ö¥ üaìýF÷Ü÷±öçòˆò/öä÷®÷ûûÿ}þ$‡ò  µ =U   Á Hsæý4öÓòÍñƒðìïæñZõNú ýdE ³_Ò÷<P „ À é»Û(7ýÞüòüäúHùuúùËúù®øîúXû|ûÞûÏû‘û ùAù9ûjúä÷8ûA@i ²:›­º!6 ÅûvüTùMøzõ=óïö˜ø5øøÔü ü ü[ÿù_z  X Ñ°Ó  … °°ú×ô¾òïñÜñXó:õßøü"c‰ u°Žöƒ- m Œ °‚göÿ2üÑû¸øÄ÷ÜøÌ÷ø÷x÷ì÷’øÔûû*üLþOýÒú3ù®ý\üúü0Ækûñ W a ³Š] * ¸ ·°CJý.ùzùF÷Éôî÷ÑùÞúNûUýþýÕÿ0¨½< d Ø ° ° o “’y‚üIöWóFñåð¡ñô£÷âú"þeV€à iu[ X ‘ T\<ëÿTþ¯ü–ûù¾÷<÷øÌø£÷ªø¢úûüý]ýÝÿ8ÿnþŒý6üZü”úóýBü.þùw’Ý h { Òs æ ãúþQýˆü^ø²÷¦÷±ö÷Íùëû/ûÒügþþèÿ…Õz5 ç × ‡ ó ùqÓÿ\û†öûóâòºò5òMôø#ú|üôkqŒð 3á & í ½EùÂÿjþžû ùÞùøö>÷YùVöIöFùÌû›ü)üÏþÿQþ„þ!úNùÔüRú@ú‘úÇýµí j n +M5 üû\ú÷ öûözõVø?ú[û1ûÄúµû=ýRýþ³aÀÝéP €  x e6ìÿÚý_û öºóSòîòÃóºö¥øÙû5þîü'<X Ò · •ø†´ÆÏ¸Èþ}üûQøöõÔöõ–ó´ôêø>úûÛüìý½nÿµþšü}ûûgùú1ùeúSÍ<–7Ø#(ûBù8ú¤÷võQöFõí÷‰ùÓúbøÚ÷ùù‡ûDûŠý­™óºay ? @¼©‚þ®ü¹üøüõcõö‹÷^øPúåý“YšýéÝýxê<þvýFúÕø|öØõ6ôóÌóÕó…ôö÷Ãù¢úØûøþW½Zÿö§þ–ùï÷Äø÷ ÷‚ö÷ÚÿJüæûhø ô©€envýuûoüíú÷’ø¤÷Šø@ø¢÷ÇöÑõ£÷·ù"÷òù¹þÿÙÖ,!ÃÕjnÿoýÆý‰ûùvù ù[ùWù±ûñýˆþÖZ8{Ñ–„çsÏÑVˉþËüÑüú-øE÷T÷ÿø-öÔôÚô¹÷øúüJþþÿ-õØÿºýsùÉö¡õEöeö˜óóŒûµüEøÏÿ` áÚ æ¥1ŽÿPÿgý–úWù¯ø±÷0øùøgõëöiø±øF÷çú­û€ûDÿ_òÿ–  ñÈ –0$ ýüÇûûûaüýlý<ü~ýüú¼ýÿþØÿ]þ#ý»ØÐßöF­þÙÿŒ›ÿýïý"ýý™ýIüÞýóþüŠûïû’úÑû—ú£ø*ù‘ùõöË÷qù¦öêôÇ÷ªù¦øúù:þŠ_¥/aåÊÞn®Êÿðý­ÿ4üûùƒúPú¤ù½ú5ûúôù©úNüsü·ýë ÿμ_ Ý 5 û  p{EŠÿMûçüüwúµúú÷úTøÏù ûWû:ý(þ|ýjŸBÐ8-Ïs¶/?á•èÿÒÿŠýÂü³üÇû ø»ø£øö“õÅ÷¦ø•÷±øwú¯ûCûâþ€þèþ(ÿ6þØüqûù‹÷ôúû÷ú‘_ÿýþ%w l[Õ üAæ¡D L:>+; Zÿ3ûúûÇûüû2ûLüDü°ýPÿ¾à¸°uõÀL{Ïýñ§Pûé¦ÿVÿrÿFý§ýlý!ûú,û’üüÁþÐÿqþëÿYÿùÿþÆ:¥TœŠ¦¥[cbþ£ÿ,þZû[úAúbú ú[úZúTûGüµý üü¼þØþÓþ þàÿþÈÿ_ÿ“þóþdìå:‚þÿ'ºXÇEh|»ö{u„’”Ð:¦¸;€#ÿ™ç>•ÿËÿìmÿý†ýÙý«üáü¯üû´üÿý˜ü*üuþ«ÿiÿm7~Ù÷Z†NÞp¹yÓ¡}·ÿÑÿÿÐ8ÿœÿQÿöÓ¿r: T±Ìæçšû— ðÁ¥Oä{H›{eoáÿöþÿÿ*ÿ$þ~þ¯þÆþþhÿjÿ‡ÿI#ݽ¨×¿ÛpÉ-§`ÆÙöä ]îmá1|ÿ¢ƒ•àµbI8ÿÖÿ„ÿyÿ‘ÿkÿNÿ¥ÿìÿÄÿç]‰ìÌÿôÿ|ÿ`þþÿ ÿÿ)ûJK ‰Õ¾ )Ó Me±Áj¥ <ÅÉ'ÿÊþÚþ;ýýþ)þqþþÿÿïz~b¿í»¯³Öj€ÔºŠŸd{šÿùÿŒþþþþ þçþÑþdþËÿ6þ=ý—þ\þÄÿ ‘~÷ÝxX¯Û£]ÈÒ)M $­[ZgµDiœÛ‡ãÑ‘Œ”"à?ÿÂÿpÿ þ·þ¼ÿ=ÿ«ÿèb¯'#œIÿþóþ²þÿÿEÿ8ÿHç°Ü\Ùq0ÿÊÿYÿSÿãAÿÔÿýW=ÿ½þóþ>ýïýúþEþ·þÜþ¼ÿ6ÿçbAÿå‹™ ÿçŽ i!e[>æø¦¿vx6Ú×Ñ¥éï;ÿ~þëþZþ&ýóýTýý¾þ?þÿ¡ tlò Yñ¸nÿüÿÀÿÔÿè"‹ž2ÿþÿóÿáÿyþsý†ýxýèýÛý¢ý£ý}ý‰þ!þjþ.ýÖýžýý¸ýÊýÀýÊþ(þ€þŽþÐÿŽÿëÿîÿéÿäÿõfƒFÿùbŽJ3gEÿ§ÿþ¥þšþJýºýOý-ýhýªýÈý£ýUýJý«ý€üòüÎýýŸþ!þƒþ¨þïÿËå[ “w…%tÿûÿ³ÿkÿÿÿþŽþ ýŽýƒý˜ýŒý]ý8ývýóþý¶ýrýLý ý%ý!üçý'ý!üzü0üQüBü.ü'ü2ü)ûûûÉûšû(ú¾úxúLúûû™ü-üÄý:ýÓþÕÿ«)~æÍq_AÿðÿÆÿ±ÿ´ÿ«ÿ¤ÿhþÅýçý ü®ü›ü•ü¯ü¾üúýþ£ÿ¶µ2N‹û(á;›™—‚ÿòÿiÿ=þÊýÉýü¸üƒüsü ûºûsû>û;û†ûâüüJü­ý7ýIýGýVý¡þþ[þ~þ—þùÿIÿŠÿ—ÿ\ÿÿ6ÿ þzþþýxüªü„übûû©ücü˜üÅý/ý[ýŠýóþ þþ-þ¨þûþøþðþ®þ^þ¦þÔþ·þÇþsþ3ýÄý%üïý ü×ügü_üwü§ý.ý­þ‚ÿs{ì6X˜µ[ÿÒÿDþÁþzþýÆýübü"ü[ü|üCü2ü4üký,ýý¸ýïý÷þþ«ÿhÿ \œ! 1ÃÖϺ…s- ÿ‰þ¼þ9þþGþ²þÖÿH Rß…¦¨²×öç«›q^ÿ‘ª¤*ÿãÿœÿþ þ5ý­ý9üõüîü¦ütüµýýpþ!þ þòÿHÿ_ÿ[ÿË9ÿÙÿ ÿÐÿvþüþÀþqþ<þGþ)ý³ýaýRýOýªýÿý×ý•ý½ýÄýÃþþ?þ‘þ¯ÿ ÿSÿoÿ©ÿÓÿÚÿå_oPN ÿŸÿmÿOÿ3þ­þŠþ­þÒÿVÿ·ÿ²ÿ¨%Ñ/Ú%jw—f±E*“'ÿñÿöÿÖÿkÿUÿoÿ~ÿ³ÿ±ÿ“ÿÊ6tiº:vªyN«¸Uÿ×ÿËÿ þòþ‚þ2ýÃý£ýšý^ý@ýJý<ýý ý‚ýÝþHþvþþæÿ:ÿ“ÿÃÿæ^æüߨžkzÿdÿÿ(ÿ#ÿ ÿÿ2ÿDÿKÿPÿ0ÿ,ÿ³M‚À…¥ø ¿U  /ÿÖÿ†ÿlÿ+þÉþøÿþÜþÜþ¤þYþûÿ¦ÿ¸ŸÎÐHßG=+¥¿ éhg eÅ¥ÿrÿ3þ½þBþ þýÜýˆý±þ=þŠÿ"ÿÁÿ½ÿ–ÿ ÿë*%O<~|ÿõs?ÿÓÿŠÿGÿÿþùþ¼þØÿÿ$ÿ þµþ×ÿ.ÿ[ÿ ÿþÿ»ÿÝ9C(.<X)ÿ¸ÿVÿ:ÿ3ÿÿÿQÿ‡ÿóal‘ïɉ_iªÍÜÀ¾wØ Qj*õœ‹ ÿ{ÿþÙþ¢þÃÿ ÿÿÿIÿh“}i¬/•Úí)X˜'¥ÒÉlXŠr„,ÿ^ÿÿIÿIÿ8ÿHÿ?ÿƒÿ¸ÿÄÿˆÿ…ÿò^¶Òüö³¼ˆ ÿæÿÄÿeÿþËþÐÿ"ÿˆÿ¼ÿ—ÿHÿaÿ7þêþéþÂþÊÿ/ÿzÿ’ÿÖWð¿Y¥ž[8F•‚äEÎm0ÿ§ÿEÿþÝþËþ´þþšþÒÿMÿ…ÿ¤ÿÈÿðGŸø`¸¤>-A»x5ÿÁÿÌÿÚÿåNÒR—§üYÉ6[H^iI¿E Âm-ýǧÍέz—ÉIZB6MeWW C`„dr‹iNþ‚.ÿÊÿaþÕþ]þJþýÔýåýÓýãþþþ8þaþhþmþwþœþØÿ$ÿ_ÿ~ÿ—ÿß[ršÕì ÿyþÑþ·þÃþrþ•þùÿ/ÿÀG„ä¨rÏwÓÎݲ#º…:ÑTIJ¡s™Ç’Ny—{’“xš´·ÿ<eš­µåúü0»tCÝ[Yxÿ™ÿ‚ÿ~ÿ>þÜþ€þ$ýèýõþ2þ5þPþ‚þ›þÆþõþšþVþ¹ÿ;ÿ3ÿ-ÿþÒþ¹þ•þeþýÊý¯ý°ý¼ý¨ý“ýÉþ/þfþ›þäÿ4ÿmÿ®ÿÛÿÿ ÿÅÿ‘ÿ{ÿ6ÿ/ÿ‡ÿ¼ÿÒÿµÿrÿUÿRÿkÿ¦ÿ·ÿ¶ÿßÿÚÿæÿçÿóÿèÿÁÿÒÿðÿçElIÿç 7ÿÖÿ±ÿoÿ þüþüþÐþ¨þ³ÿÿ\ÿxÿÿ­ÿ‘ÿ²ÿö KH0\Tÿüÿóÿüÿ‘ÿBÿDÿOÿþÕþsþ ýÍýàýÞýÐýßýëýÙþþ?þ0þlþ½þãþîþÊþ¢þÅþçþìþ³þgþ]þtþ\þ-þRþƒþ„þbþ@þ.þþ~þºþ˜þ˜þfþrþÆÿÿ þÜþ»þ³þÆþÉþ¡þ@þOþ†þ†þ¤þ·þ¼þàÿÿEÿ™ÿæÿÑÿ´ÿ¶ÿ¦ÿÿ’ÿ~ÿ¦ÿ“ÿbÿVÿWÿ}ÿuÿ=þøÿÿ|ÿ“ÿ¥ÿäÿïÿøÿú ÿäÿ…ÿVÿFÿIÿjÿWÿeÿ”ÿ‹ÿvÿ]ÿ7ÿ ÿÿ;ÿZÿtÿ–ÿÞÿçÿ©ÿ–ÿSþáþÌþÐþËþöÿ;ÿ<ÿÿþÿþÿÿ ÿþ®þ¬þþÿÿ&ÿjÿ•ÿ´ÿ°ÿ­ÿ”ÿEþüþöþÄþHþýçýíýŽýüÓüsü„üÂüéýýMý‹þþ_þ%ýþþSþºþÙÿÿWÿnÿÿÞÿçÿËÿ©ÿÿ¾ÿŸÿ?ÿÿþýÿÿ†ÿŸÿ†ÿrÿÿ‰ÿdÿÿlÿhÿPÿGÿAÿÿstk-4.5.0/projects/ragamatic/rawwaves/tak4.raw0000644000076600007660000001672612327014024017145 0ustar garyfyEùÓšIB*ÿÜÿì.<¢É-þû-á˜ÿìÿtÿJÿzÿÎÿõPÉ+V8ýá`§¦µÎœ•‡@!ÕÚÿ”ÿ1c,HÿØÿtwž²iuz*Ž"»U^þRþ¦ÿ¸bÿÏÿ-ÿ:þŽr,ÿ!¬Š°„ ·s00¤ÿÌû ÿúÈȧ]ÿ\…Kÿepør<çþ"þE6þ þÿÞÿZcÿaÿ·!ÿÈÿzý7ýô¬½Ÿ—LPÿ‘Eºý¬ÿ—XÇ®°Ý¤ß´®æ²ÿm¬Ç,þ9Ëù.ýÃÿžnôqæcþð¡þ±ýŸÿêþ+ü´û²þFýÅú˜û¬ýqþêþoþ[ÿÂÿ×ÿÑÿÛB¥óÒ‘[n“4ªÚº‹_nÿÛ ÿø} 5tv†»©Ù3GÓ<†#«ò‘IjÿÁ ÿ'ýãýü×ü-ûÛú‘úAú4øÚøOø]÷Ùö½õõõÂöÙ÷ßö>õ¬÷÷-÷ öLöW÷õÉö©÷áö~õ„õ_ðíð6îäìZêÜñAõÈïòùýý}½‚Î ÞëI“xƒ˜³Ô ÕsÿÛøƒ÷;ófì½ìì†ërëAìØîvíåñíöPû€þØþD¹I A lb ¦ «´  ˜({3þ¥ýuýrüòûïù¦÷2óîò‘ò ðºð‰íëPç«æŠægãÓâàénêãÜòø$ × ]%‰'ì)¯'&ƒ%¾$i#; å¹ ˆñú{÷˜öÚñré¼åâœÞßá1çâéuè±ë,ïIôŽþà ¬ZdqßQ´ _. ®‚§?üN÷†ó’ññ7óýö+÷Rø4øèùâûòÿ¯š.¬ÿ§ù9ô ñºêdè¯í_èèb÷¬þ%ýñåœl&î ” J D î ò ßþ(øÓôòˆí èfé|éïë°òtùtýå߬ ƒ Ê7Ïo¬ , ‹ & š¢û)ö×ðèíµí¤ë$è`éˆëAìºð[õú!ÿŸŠ a @" ªB ç¹oýõ×éä¿êAáàÜíò{í®õ?v që¨ N ¤( ¢  ô Ȫ×ÿûÑù%óèíÜë9ëííñ9õDù¡ÿ=ø ÿ†ó·x Й}ŠFûtøöõ©ï½ìJìÃîaì…ëŒîYïBðÄ÷þ2Zø °8‡z 7‚úë›à+ßàÕcÕåiëëU÷oê¹öEtq ©ì Å ¢ü®û¾øìñàëÅçã›â3ä_çGèËî±÷$H –u÷»£úE€² îQßøPòñ(ë¥çCé˜ê{é¾îó õßú˜‘8 3)¥¼yÀV ȸþuôWå!ÔyÖGޡΚÍOäpè-èÓøk ô^"ñ&™þ U)"‘ŸÚñþøŒò3ìçâ:Ý`ÛÚÝ–Þ–âßæ„î+ø?9ó %™&û"; _ñÐ Y üèñÿí†ê†ãÆáŠäVårèeï,öú ¯žØ!= É! Ç÷ ì„øˆã=ÕÚqØJÉýÖvåoß6é–þH —Uñ"/\!F%Éšžh9 £EþFózïhè%à5ÝêÝþßGßqçPïmöݲ·GÉ%*¸&ª!#n¤ — ÷õ"ìÖè¯áCÝqálâöå&ì?ô€ùïê+.î ‰#2!KÞíð ÁÒòjàŒà¾à}ÌŽÓîá€ÞSå ò²ƒr Y“Sº!Œ'®vŸz %½þVóªîüèxã]ßÝúÞ à´çší=÷Oª õ2$›&å&O$ô!!ƒ™Ìÿô´ìzåÚá/àà äÌêrî}÷4ò åG0!À#ß!O0$ Þºíãä‹èòÜ6ÒüçcçãÍðWý‚!6î¶"TO¶“H -ù“órñé+ågãˆâ³á˜åýìÔñoú‚S ùfö! x’r iÿÍõŸíÛèâààã6æ„éÑñù*7xO¢Ÿ,Hüüî¦åÍë€ßÖQèÕì©íOôiÿ¦÷™˜$! ò—[h§¢øÙòŒñ0êÅäFâ-æGå8è}ï+öþ‘¢ÔY!ž#øÎ£Ö X—÷†îoèBäIáâIæèïñÌüõR Ï@]oèù²ûPìÞâ1çZå-ÕwâóVðØöª6"uÊòÕ„T° Ñ ÏlýIø÷ïEëè¤ä}à—áÐæÅëHñÛù)Œ ê „$‹'Q © uÿñöÄíŽæcà,ÝÂá=ä=ç¸ð!ú`Š ÅÀeYŒ Rú¥ï~åêã„䙨Ý|ïNï§ò¦ýT¦ ^PÃr‡÷H† eJ ÿ‹õ3í¥èÂäfÞêàâšã3éÐñˆû–Í, ‹$Î ã D «~úbò÷ëö傿zéÍêÑïÆø£—¬ ZCÁ)H :ïÿ‚ñ²æÅä&é=ÝÀÞ^òÕò¬ð¾øåM§8)Y ƒ) Ñ Ú ¬¨»ü·ô¼ï´ëæâúæ åÓéOñ\ú$ áÑ Ÿò€Ë{Vû õÕîËëkí í"íxô2úŒÿZ,j ¼R‹ 8]ÿô¾ê=å‡èYã=à9ñ)ú(øý~ ¦,MDÏ Þ5+º ³ ø6Äükö£ó(ðLê´çéêÎìËñ¾úàÿ¦¡ŒËïjRé¼ ±÷ýôÀòþòµò7ðÈõ1ül›ð© §¢Õ ri²ù¢îýåvæ`åøàXêiùïûNüâs…n©}o Â@ N}ùæIýõWò†îàétç+æãæˆé¸ðžö›ûÏÄ []î  °Fû÷øéøKó1ôó¶òÚ÷Oüý¬ Ÿ Ú Ó ýd¡û"ñCêéíƒê:ä2ñ ýûËþý¬.ËB„ -zG ‚ 7"=ûDøÄõ;ïµì\ì…ëGëÌðìó^õ¿þq³ ¨l †Ž f ƒ'ÿ+þmüšú ûÑû”ümfù‹0 L $ þ2ùœòvéwèÎëCé¤êiùטÿ’×Áƒ³#Q.× ¬§Cðãþnü|øñø5õßò}ñ©ó]óêõèú§û¯RH •  T ˆ Svþ/ø2õù÷Fö¨÷#ø!û7þÇ„û˜@ î Zy½ýJõÉëïçuêÚéíç]óüAùõþJœ ² ͸ AlÊ `ž•û>G{ÿIüzùš÷õˆóýõõ‰÷úfý@¤|  N Q è  Xsø4ö ùË÷^öwù˜ú°üU\€§€˜~Œüø¨õ[î¸èìZñíyøÆ.ÿe ¨£ н Ь8üDÿPý™übùøõøaö‹öQùÖú÷ü/ÿ;,˜ ¸W À Ã/§ûËö ÷˜÷ôíö(øÝûýž!ºÑÕ?ü»ùøöñ2ëQî.óµñ<òwþdþÏ] Ù  ôÛÔ@¯k¿^GþCüúÄøÚöA÷Æøöù'üþì‹- ¼³ ¹ ½³Ò¢ÿœü‹ý€üú–ùõú'ü ûœù¾øôûú÷g÷Xôð•ìÜîèü°ú öP BÉ Y æ8 ¡ Š ½ùýKúëòêóøÌü4ø_øÛûúPü³ÿúh”›Uk² m C  ^ ì¯ý¯ú´øDõ¹õ$öÙöÆø úúÊû½ü•`/ÿFý‘üLó¯î"ù^ûÃñ£ÿ– NhÚ Ñ|[ aiÿ}ý\þ+÷Aõøµû'økøŸù)ôÂ÷Fûûûœþûê‹x ] ; _ Ù óÄŽb‘ýlý”ÿú´ù>ù‚÷Iõº÷+õñ«ô4ñºìSé%ôßú}ð.× ´ àÄ ïòÛ)Äìú£øŸúûjõ6ñññÁïeïñ¾ó‡öøþUþoF Ô Y‘°  ‚p˜üÓûžûn÷sõïõ©ôÃõÀõ}÷/øÃ÷ò÷ËøÏõŸñJøœý¯ú:°mÙP€r Æ µ õjÿýNöùôùFþ ú<ù‘ü#ùEöQù9úù›ýðþÿÿ}Ýíà _c ‰]n…þ§ûÖü;ü™üüäþ«þ!æþ~þ\ûóùÎø„ñÀíÖð¸öçñƒòãSù–ì î Ñ … € I¾Z9ýõÿëÿü±üþú×ø‡ûýÁý+þ ÿÖ$"{.% ? •ó Ù ú ÑÎ`ŒþQüdú"ø´õðóóèô~òÔðï}ïåîtñý÷Ù÷|ÿ³ * > d逎ØÖ Ílüÿêüzý6ü­ùHø7øËöõøÆúœüÂùix ž m ƒ ƒ S7T5þ~Úÿ´û@ùŽú¨úJø½÷—÷`öyõ|öõ¥ó…ò§ólõ´øøú^µ +  ~üö V ë  w)ìý«ü*ü‡ú©÷¥öþö~ôºôxöˆ÷Šø(ûÈü…ÿÙ $ nÆxß \ä׉üÿ¤ýÃûÕùÇ÷Ÿõ“ô ó¬ò‘ñðÿïëîÆñàôúöþ÷¯ùû¬Îo 4v ÷ « ¹ OÄÕÿ üøúO÷ùõÞô›ò"ñÂó;ó¸ô‘öÎø'ú+ÿïS_  kEaê.åJ- µÙ&ýûú„ö]ó‘ñ«ïRí]ìóì*ì!î¼ðEòù÷wù†ý\L » ‰šÞ» ÷ Ú cÁÿðÿ(ý)ú]ø‘÷õåöö5õÈö¼ùùŠù´ü–ÿÂ×8þLÛ Ú “ à X å Ù R^æxÿLû,øLö!óÆð§îHî_íÎìæïÜòñÅö:ûÚþµ!° ‘ åÈ LSî sî¯×ÿ±ý·úføq÷$õxôXô‹ôbô9õ”÷Ìù½üZÿXŸðI(¡ Œ f a  ± FÎËÐ þ û˜÷¨ô¿ó…òðqð“ñÙñÆñmóTöªøPúnþ=7· Ž F    b · » lÁÿ_GþÕüµú÷úrú>ù’÷Í÷…ø÷ùTø¥øýúYúïûÙýþ ¹+û’7ÿÖ¼âÆ¸¶ÿëþqümú™ù øBöûõåõóö£öÏ÷•ù¼ú¼ûóþ$ÿ®q&•=ò¥Pí•QJ³·š¢Žñ¸ØÿÚÿUÿOþý üÏü7úèú?ú{ùùpùºù=ùBú£üCüéþÿ”€{ÐÛÍêRH/¿ý/ÿdþsý×ý„ý_ý ünüŽýFý²ýý–ÿ ENf °=þ…ÕD¢œkm*Nÿþ©ÿ–þˆýžüŽüCüNûþûZûŠü`ýRýÇý¹þÿg Mîö&c>vƒr(qÔý±¬ÿ­þ”þ^ýžüŒü™üûÎûŽüû¶úïûVüü1üÏýÛþÿ ÿ¡7Û½À‘%0SGv„¶‹ÿCý…üfûèû½ûnûoüüDüüŠý?þ*þÿÿŽÂrÚ’q“;jbîÑŠ~TDnY!·ÿ®þ¼ýÜüÔühüRûÃúðúøû”ü"üwüÎþ?ÿ=ÿÜYp쨜ÿ”óéê†â*EÿŽþVý°ýFü­ü’ýýFü¼ýƒþô_€Ã§ÓNIòœ²xÀþ[ü¨ühü¨üúÍúUú3ùÏùÔúùéùÐúQûüý3ýÅÿ !zÿõ 0²º®zß§ fÿqþ\ý¥ü­ûôûöû£û>ûûÒüýþ4ÿ@ÿç:jgÃ£Š­ÂÚa ½k^ÿêÿeþûþ&ý@üöüŸû¯ûÅü†üºürümýý–þ þsÿ'C鎨®û]ÏÛÜ[öôèÿ§þüåü_üü ûÙûMûÖýrÿYL1.gÍtÔ7c'Í5·UL[Lÿãÿåÿ±ÿ~þåþýÀþ…þ þýWüáüòýþ›þü¬ü³ýÃþ7þjþõÿ1ÿkTAòˆùI? ØÀI"¥Gÿ“þÔýÚýü‘üûÁüü™ý;ýsýAýðÿ*ÿÍÿ›ÿ×,kÅ:kn¤t]sO-ÿ’ÿþÿþÄþ±ÿ@ÿ’ÿœÿ¤ÿŽÿ¢ÿËÿºÿ…ÿà~ůÀ¬îf” Š{Pý Ñ¡gÿÓþ¯þMþÀÿÿ(ÿ¯ÿ¾ÿÿ&ÿŒÿÿ›ÿ죵}¨®“´ø|iä ¢•Ç%E+âÿáþÂýaýkýáþýæý0ü³ü¨ý#ýˆýæþ8þ/þçÿµÿÑÿ®ÿ`ÿTÿv_ï2ÿšÿVÿÿ8ÿýïüVü üGü*übüMüUüîý×þŒÿÿˆÿç†P|LÜ¥Ù§ ‰=PEÿ±ÿ#þwþEþNþýÃýÏþþhþ¿ÿUdÙ dàãÞè™v2‰ÿäÿû•—ÿÚÿ%ÿ7ÿœÿ}þôþyþ)þþþpþ[ýÝýdý{þ,ÿÿÎ6Òž¤A¬ö½Ä=¼ÃÿÑý×üeü‰ý´þ¯þŽþ"ýûþ¬ÿÿ%þ¢þ>þÆ6Ê-§')‰¬#ÿùÿBÿjÿçÿ`þ%üÓübüÀýüþü:û“ûèüÊýü¤ûûûéüGýý|ý–þDÿ%&wfGƒ<FZJÿ×ÿ=þæþ¶þ‘þgþgþý‹ý)ýjý—üÕüGü]ü%üSý7þþ›ÿvP®0”·Á#žº¾•VëŽÝMÿpþ¦ýñüÈüûóüüKüÙý\ýíþï,¼×=v˜»v˜Ðc}ÈÛ-ÞÿNþÄþ”þÀÿÿ¯†,›9ÿÃÿÁÿáþ¸ýŒýý]ýÑýþþýàþ(þóÿ þ¼þ½þîþúÿ8ÿ]ÿ-þìþóÿ>V2ÿöÿþÿØÿ¨ÿŒÿnÿ¸F´ 3“ ÎAÿYþÚþ±þþLþpþçþúþ¿þdþkþ…þ•þˆþ~þxþ¥þýÿFÿÔQX3ÿæQË®ž²½º·„ÿñÿ¬ÿÌÿ±ÿžÿåÿËÿ{ÿ•ÿåm¦w7ò‘O †"ý„½ÿîÿÿÿeÿKþ™þcþÈÿÿþäÿÿœ<–GÖ!~¿ \nÒ06¤¬Gvÿ«þùþEýÅýùþ/ýíý†ý„þþ£þöþïþÅþêÿpÿúf°UÿÕÿZþÑþ5þþþþ+þ:þCþ\þ¹þÏþ£þ¶ÿ*ÿYÿþùÿ\ÿî©(@vL™88ÿËÿwÿþ`ý„ýBý üäüÜüõýaþ.þÌÿ+ÿ›ÿýy¯MâBe;ÚľfÞ~ÞÕEÿ½ÿÿ±ÿ“ÿ3þ€ýÅýÕþ`þ°þ`þýùþ0þÔþæþpþ5þÔÿÖÕdÜnÝSúLò ü5.¶š‘+ÿ“ÿ(ÿ;ÿPÿ3ÿÿÿg"Êý á¯1ÿØÿþ‰þfýØý-üÕü¶üyüTüùý{ý/üÚýhþBþ¾þÊÿ"ÿwÿ–ÿÛ.VH ÿòÿ¼ÿNþ¼þSþMþlþ¬þÏþøþèþÊÿOÿæ Mƽ~ÿøÿ›ÿÿ~ÿlÿWÿÿTÿí>¨L d½/=*÷°±¸œ‰î ÿsþÂýÓý|ýÊþ0þ“þÃþïÿÒÊ#K´Öïö¢¡qÿ½ÿ·™þÿQ¯¾ÙûcaT;"Z‡Ðö'èNÈ(†ÿÇþÊþ1þýÂý~ý?üÞü—ü¿ý!ý=ýPýÜþoþðÿeÿ¹ÿð9¼@vŸ… yGš8ÿÖÿ{ÿšÿàÿÄÿ¡ÿÀ,N%IŒš)ÿÚÿ ÿ^ÿÿÿ5ÿŒ,‚ÊC}JWçMw€½ „§‡k4 œ -dÿÙÿ´ÿÁÿfÿ ÿÿvÿîE5bó€ðù)‡¡^*T\9Jsr>#G=ÏÄ"ý×êö§J/HÿÂÿvÿkÿNÿ:ÿSÿ}ÿbÿZÿ”ÿ§ÿìÿýfÐòÜÐß Wr1 óŽ9ÿìÿªÿŽÿ¸ÿÊÿ˜ÿtÿŒÿ‡ÿcÿkÿ™ÿþG¢Õÿ-ƒ«ŠŒ’$§œŒ1ÿªÿNÿ6ÿ;ÿdÿÿ–ÿªŠ†±)y‹–ÄÆ´¹jõ…D&vPõÔ ošâ´)ÿòKˆƒÿ¬ÿülš[ÿÄÿ€ÿÇÿÚwšàÊÁ¶`h” P<ÿüÿ¤ÿwþïþYýÍý&ü‡ü\üiü¶ü¼ü”ü´ý-ý»þeÿ#ÿeÿû…¦©•™™bÿ÷ÿwÿ þÚþžþþdþMþhþ€þÓÿþëþäÿÿÿstk-4.5.0/projects/ragamatic/README-raga.txt0000644000076600007660000000161512327014024016325 0ustar garyThis is RagaMatic (tm) by Perry Cook. It was written for Ken Steiglitz's birthday in 1999. Sitar and Drones are physical models. Vocalize drums and Tabla drums are samples. In the RagaMatic directory, type: > make to compile and then > Raga.bat to have fun and achieve inner peace. If you ask me, I think this band needs a flute player too. If you like, team up and see if you can add the flute model to the project. This requires adding a few files to the Makefile, a few lines to the ragamat.cpp file (including how the flute player should play, etc.), and another slider to the TCL script to control the flute's contributions. This might only run on the fastest machines once you've added the flute. Since latency isn't much of an issue in raga-land, you might bump up the RT_BUFFER_SIZE in Stk.h to something around 1024, depending on the speed of your machine. All is Bliss... All is Bliss... stk-4.5.0/projects/ragamatic/Tabla.cpp0000644000076600007660000000664412327014024015455 0ustar gary/***************************************************/ /*! \class Tabla \brief STK tabla drum class. This class implements a drum sampling synthesizer using FileWvIn objects and one-pole filters. The drum rawwave files are sampled at 22050 Hz, but will be appropriately interpolated for other sample rates. You can specify the maximum polyphony (maximum number of simultaneous voices) in Tabla.h. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Tabla.h" #include #include namespace stk { Tabla :: Tabla( void ) : Instrmnt() { // This counts the number of sounding voices. nSounding_ = 0; soundOrder_ = std::vector (TABLA_POLYPHONY, -1); soundNumber_ = std::vector (TABLA_POLYPHONY, -1); } Tabla :: ~Tabla( void ) { } static char tablaWaves[TABLA_NUMWAVES][16] = { "Drdak2.raw", "Drdak3.raw", "Drdak4.raw", "Drddak1.raw", "Drdee1.raw", "Drdee2.raw", "Drdoo1.raw", "Drdoo2.raw", "Drdoo3.raw", "Drjun1.raw", "Drjun2.raw", "DrDoi1.raw", "DrDoi2.raw", "DrTak1.raw", "DrTak2.raw" }; void Tabla :: noteOn( StkFloat instrument, StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "Tabla::noteOn: amplitude parameter is out of bounds!"; handleError( StkError::WARNING ); return; } int noteNumber = ( (int) instrument ) % 16; // If we already have a wave of this note number loaded, just reset // it. Otherwise, look first for an unused wave or preempt the // oldest if already at maximum polyphony. int iWave; for ( iWave=0; iWave soundOrder_[iWave] ) soundOrder_[j] -= 1; } } soundOrder_[iWave] = nSounding_ - 1; soundNumber_[iWave] = noteNumber; // Concatenate the rawwave path to the rawwave file waves_[iWave].openFile( (std::string("rawwaves/") + tablaWaves[ noteNumber ]).c_str(), true ); if ( Stk::sampleRate() != 22050.0 ) waves_[iWave].setRate( 22050.0 / Stk::sampleRate() ); filters_[iWave].setPole( 0.999 - (amplitude * 0.6) ); filters_[iWave].setGain( amplitude ); } /* #if defined(_STK_DEBUG_) oStream; errorStream << "Tabla::noteOn: number sounding = " << nSounding_ << '\n'; for (int i=0; i soundOrder_; std::vector soundNumber_; int nSounding_; }; inline StkFloat Tabla :: tick( unsigned int ) { lastFrame_[0] = 0.0; if ( nSounding_ == 0 ) return lastFrame_[0]; for ( int i=0; i= 0 ) { if ( waves_[i].isFinished() ) { // Re-order the list. for ( int j=0; j soundOrder_[i] ) soundOrder_[j] -= 1; } soundOrder_[i] = -1; nSounding_--; } else lastFrame_[0] += filters_[i].tick( waves_[i].tick() ); } } return lastFrame_[0]; } inline StkFrames& Tabla :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "Tabla::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; ixº™£Ð£}ø·¨                           '˜˜Ò˜&˜Ä ”ˆ~’°9…™¦SÛ¬¹ý¨úÄ                           ·ýãq©±gœ‰‘6ý™ÉûßwãÀå¡ú‡Ž6ýý›                            ý¹‹ý‘©ÿý²‹É‹·›•˜É£ƒh™’îÈ•                       Б±ì}îš­/0î$ëšòôµý–°Ñ‹¨ýøø                    –©–´u¹u‡$•*1_h›å•Ž…ëØ                         Ÿý³Ä©œœì·…•œŒ·Äœ•œÄĪɕ·îý                    ý©}ÄŠ©}â…·£·³Ú6À•*þ•¨™Ó·›€ÉýS                 …Ÿý©ýÄÐýŠÄîýÐuÐÒÿ•ªÈ™å©ÉÒ·É                   ý“……©Ä}©uý}Ä£Ä"ý€¹ÉÒ—ýØ                           uýýýýÄÄýÄý}­‹ØÀ³ÚÀÄîüÄ                          ý£uý··©ý©­}±Ä¹û`É0|É‘¦•                             îÉîý„|„¹þë‘©ý“ýÈ©“hÚœšØ                               g}uîýƒÄG|‘ý…Ä©¦}É‘ëu°É                            ˜Pˆu9î……·ÄîÐ}“ÄÈ“Ä_·Š›                         ’qOþ}ì··}©u}ý­ý€î¶g}É                      g˜7Ä}}'ˆ·„Äî·Ä·¨â<…ë                   _8…Äýü·…Äýýý¬©Àœ|…                 ¡’@ÿÀgåâ©u'„ýÄüuŸ…“…5€}Ø                       ÿggg@˜}}………Ä}°•î…ýÉu±ÿÙ@                     gg6tÉî…|þuu·„©ÄëuuëîsüÉ                      wý¶…Éý‘uÄkÁs}­ýý…¹Xîî‹                  ·ÄÄýý…·Éûœ}·ýý…Ñÿ|h                ý·…£Ä©‘……·u£ºÄ·›X´*é©Ðª• ßÓÀéÚéÚé•ééÚÚéÀ´Î*´*¡µÓR†À•åôÅgÙ$ÒÅÙÙÙXžÐÐкѺѱÎѬ®é¼»º¼¾     ëªÓ†ÚØ&³ÒÉ…uî&_uÉý·ýÄÄu_°ØÙ&Ú&ëhÄßÞ’Úé•ÚéÚéÀÎéÚÚ)éÒé@ÚÀ• ÙÀÚâïå˜ÚÍôÇÙ5ÙÓ™°Á™¦›É—™£—°”ë°Ø—›…       ·¡6Ú·éÒûýûýu·ýý…Ä…û@*´•šës1Óâ˜é*¾ÀéÚé–Úé´ÚÚéÙ´â&¾ÚÚÅÒïåÒµÙÒÇ5µÙÓÙ—°›™°°™›­™é›™›Ø     Ε£Ùÿ©‹  •œÅûŽ8ûøÇ*œé‘ßå³Àé•*Ú¾éÚéÚ¾Ú´éÚ鵜•ÀÅÙÙÓµÙ¡*ÒÒÍÍÒÙÅ“¹›¨™°››“›°Ë›°        š·0Ù¶î ª›"ÚœÎâ$å*Àµãýª¾éÀ¾*éҜҲÍÇ8´Ù*ÚÒÒÒÙªÍÚÍÚÍÙ5å Øø°›Ø›°£›ë””     ¨ÙÄýÀ˜éœ³ôßÀ˜ëàagÀš&é•Ú×@…øÆÎÚéÒÚÒÙÒÒÒÍÒÇÍÙÙÙø”Ø›¦›“”ñ     ©ì´©¨›'î°<ÚëåÚ’é&¡ªÍßߘééÀÇý¨u)¡ÒÒÒÇ8ÒÇÙÒß<ß¡ôô‡Ø°ØØ™´™ë”      µ›ýýɰ'¾@Û–ééÚ¾õŒÚ¾ÚÚáŽÀÙÅÙŵµÚ0ÀØ›°8Óô¡”Øž¹ ”ë      ug·î·å˜ÛéÚ¾&ïgé*¾ééÎå‚›Sýœ'›É±Ð‡Äî›Äßô†Ø°›­”—ž    ’üķéÀÞÀ˜•ÚÚ•ÎéÎÒ8ߢҶâ|Ø8ÁÒÄ˰ў5ͲÁ¬ìÔéÍôšåÆÅÍ        ¨9}ØÚÍÓ'¡éé&Ú¾*ÎÚ´}ɶ"UÄù¹º Ñ™8ÍÅÅß徚Ó×–ÙÍ–µÇÇ&        î·ÄÒÒßÙýª¾&Ú¾éÚÚÇÙô‰•_)V¶³‡ËÒµ5Åï$ëå¾ßÙ&ÍéÒÅÙ*é´ÚÒš´Ù•Ù&ªµ<ÍÙôµ5Å5ÞôÙôô$µÅÓôôÙÅÙÙ5ÞÙÙÙÙ5ÇÎÒ@ôÉÉû    ø'ýÚß霘Û&´ÚéÚÒÚéÚÇÙ˜ÞåÅ7†ÚÍÙÙ$ô&åÎåÅ–ÇÚÍÚÎÀé•ÒÍ&ÚÞ&Ç•ôÇÓ5ÞÅ$µÅÓÙÅ5ÓµôôôÅÙÅ$ÅÙÅÙÅ5ÍÒÙÒÎ@ٟȶûض"¡å0’Àé&Úéé´ÚÎÎ*Î*ÒÚÞôÒÍÙÅôôâïéåôÚÇ&µÇÙÎÀÇÀÙ‘˜Í•Í•5ÒÅÓÙÅÓÅ5ÅÙÅÅÙÓôÙô5Å5µ5¡Ù5ÙÙµÍ*ÍgÅŽÉ‹û¢Úî·ɶ¶îš©¶ûØýëåÇ•˜´•*ÀéÚÚÎÚÎÒÒÒÇÙÒÙÙ$ǜߕïÙšÒšÇ*Î&œÇÚÇâ˜ÙâÍšÇÙÙ¡5Ù5ÅÒ×ÙÙÙôÓÅô´ÒÍ´´µ5ÇÚÒÙÒÙégã¨Ø‘…³ý­ý¬­ýý£·î·ÉÉÉØ…¦Èì¶ÉÉ£¶­©›auåÄgÎéÚÎÚÒÚÚÒÒÙÙ:ÙÙÙ5ÎÀÞ&Ùµ&Ç&ÒÚÚ&•ÎÚÙâªÍ&ÙÚÎÚÚÓÙÅ$µ$ÅÙÙÍÙ5$ÙÙÇÎÒÙÅÙµÅÍÙ&q5ª›Ó´ý­ýýý“ý·ý£î·££ÉÉ£ÉɶɈ¦ÈÉɶ‹É·¡©Þ$ªœ¡éÚéÚÚÇÙ8ÒÅÙµÙÅ)–ô•ÙÙÚ´šÇéé•ÎÚÚ*šÒÙ&–š$ôÙÓµÞµÓÅÅÙªÙÙÍÙ$Ù$Å$ÙÅ5Åô&˜Ù婲­ÄÄý­uý····“îýɬ££É·É¹É¶É¦¶ÉØ™u­ü¦É¶ÉÈÉ£îÚãÙ@•ªéÎéÚÙªÙ$Ù$Ù&•Í&µÇÚÍÚÇÚé&•ÚÒ)•µÒéÚ¾ÍÚÙÓµ¡$µ¡×Ù5ÙÙÙµÓÅÍÙÇÙÍÙÚژŒåâû·Äý Ä}Ä£ýî·£îý­·ý­·ý··îÉɶɦɶ¦¶É¶ÉÈ췰ȶÉɶ¶ÚuŽÙãåÍÀ*˜éÙÇ*ÅÙÙµé˜ÎšÙÙ–ÎéÚéÀ&•ÚÀΕªÙšÚ´Óßô¡5Þµ5ÓÙÙÒÍÙÙ5ÙÒÙÙ+ÙÙÚÙÒÍég–ýý ýýģ·ý···î“ýýÄ·­·É·¶ÈÉȶ¶Èɶɦ¶‹3¶Èȶ¶¶¹¨œ8ïß$À˜*éÚÙÓµ$&¡ÍâÙÙ•ÙœÒÚéœÚ¾Ò&Àµ8Ù˜Œ¨$åß6µ$Å5ÞÙÙÚÒÙÒÎÎéÀÒåÓâcâÐýÄÄ·­ýÄÄÄu­····­ý··ý£îý­îÉȶøÉ°¶¶È¹Ø¶ÈØ€¶ì¨¶Ž¶È¦üÈÈ ÎïßÙÀ˜&ÙÒ$ŸÓÚÚÒÎÚÎÚÍ&š&šÒ*¾–ãÒý¨Øc°î6ÚÒ´$Å$ÞÙÅÍÙ*¡5åußÄÄÄÄ­ýýý±­ý£±····Ä…­·îîÄ·ÄÉØ¶·ȶÈÉȶÈÈ‹¶¶ÈȶøxØÈ°¶¶È°Ž°·ýáß6š*ÙÅ‘Óé•ÍéÚ•Úé•&ŸÀ´À5–››ìà/ØØ›¨*ÓÚÙÒÙÙÙÙÒÙ1–ÅÆìýSîÄÄıý“­ý­Äîý“îý·£ýî··…ý±··ýȶÉȶÈȶÈÈÈȶø¶ÈÈȨȦÉȦ¶¶ÉMâ$Ú*&åǪ1ÙµÚéÙâ••ÒµÓûÉ…œüɦÁÁ#™Ž¨/Šý0ôôÒÙÒÙ’Ó†õŽÄ© ÄÄ}ý­ý£·ýu¬ý·£·É···ÉÉ·£ý­··¶ÉØ¶ÉØ‹ÈȋȎ—ȶ¶¶È¦¶¶™Èû‰™°¨È¶™È™°·ªýãâ$ôĵÀ´ªÒªÚ˜Ç•ÙâýøŽýÈý¹Àýìîî'@Ø'p¨°$ÍÙ*ÙÚ$˜çû‘ЩĄ±ÄÄ£­Ä­ýÄ·ý·ý··îuÉÉ·ÉɱÄɶ¶È¶ØŽ¶øÈ°¶™È€È”°¶È¶È™™¶È€/ÉØ¶î¨™°¶™¨     ¾œŸ³Ä³ÐŸ©ýÐÄ·ÄýÄ···­…·­·É£É··ý©È·ØŽø¶ÉÈ™ÈÈȰ¶™ÈøÈÈ™™°ûəȰ™™‚™°Øø¶°É¶š    ¡©ÄÄ© ©³ŸÄ³£Ð·­ýÄÄý ··­··£ÉÉÉ£·ý¶·¶¶È¶¶É¦°û™È°¨È¨ûÈÈ›ü™™¶°û™¨¨È¨°È›™ø™€È¶       âÄŸÄŸÄ©©Ä©ÐÄ} ýý­Äý·····î·ÉÉÉÉ··£ÉøÉ¶¶¶ÈÉɦÉÈÈÈû¨¶›È¨°™Ž°Ž›¶¨™È™™¨¨™È¶¨™°Èø°¶ÉÈ ijŸ³©šŸÄÄ©³}ÄÄ…ý¬ýÄ î­…ýý±…î£É¶ÉÉ­·È£¶ØɦضɶØÉ¶°™¶ø™¨È¶È¶Èɨ¶Èް™›È°È¨°¨È¦Žø°·™ Å‘³}ĩ⩳}ЩĩýÄý­}ÄÄ­£ýî·ýÉ···ÉÉ·ÄîÉ·î‹·£¶·ü¶·ÉÉ…ÈÈÉ™øÈȶ¶È¦¶¶È°¶™°°û¨ÈÈÈ™ÈÈȦɨÄû   ijŸ'³Ÿ©©³Ä©³ÄÄ“ÄÄýîý³Ä·îÉ­£­·î£É··Ÿý£îîî··Éî£î·£Ø£¶Èɶ¶ŽÈÉÈÉȦÈÉÉ™°ûȨÈÈ™™È™™ÈȨ¶¦‹ ³âŸþ³}ЩĩŸýÄýÄý·Äý­ Äý ý£ýî…­ý·­îýÐ}±±·îý±Äî·Ä·¶£¶Éɶ¶É¶È£·¶¶È¶¶ÈȰû™È™™¨°°¨¦ÈذŽ0—Ø”ýøÉ9øÉéø©âVØGÀøØøì›/o}뛀ýŽ9™—ûÓ©³Ÿ‘ÄŸ©â©Ÿ©Ä³ÄÄ­ý£ý±Ä©³±Ä­±ýÄijÐÄî©©©_îâ±ýŸÄÐ'³'â©ÄЩı·ú¹ÿâÈ­î·£îÉî·¹·É¹¶¦È¶™È™¨È™È¶™°™°|¦Ä°ØÉ¹øø ·éø'}ÄÉüîîØØ¨ ëù››0”°œ©©‘³©³©â³‘â}Ä©ÄÄÄÄÄÄÄ ©Äâ}'Ÿ³©‘Ÿâœ¾‘ľ©••'Àâ✟&œš&š&‘©ÄÒ­âijâ‘É“·Éu¦­É¶ÉɶȦ¨”Èø¨™ÈûÈ™›€ ø™ÄøØøøâëÈéɼý·¶îø¨¨·/ê…|É9°™—©³©³Ÿ|ЄĜâ}âÄâ©} Ä}ÐýšÄ⩟âŸâĺœÚš&œ•š•Úå&ÿÿÚ•Ùš×–_éœâÙ•œ}©©¾©œúþÉÉ‹ýØÉ£Ø¶¶È°¶ø°È¨¶È™È™°É؛İ·øÉ·î³î·¹GýøîýîU¨¨­·ü›·¶¨›ë™™™â©©©Ÿ‘©Ÿ‘©Ä&© ÀÒÀ ÙÿªÚ墇œ©Ÿâšâšý•‡$‡³–ÿÇÿŸÄij·×`‘úÉ·£ÉɰÉÉØ¶¨¦È™È™¦‹¨Ø›©øØøuØÉÄ9Ø@}ì›üØý›*‘û¨÷·ØíÁ¨0™°—©œšâ‘â©©©Ÿ©‘â  Ò µ$ ÓßÚ–&é&•••œ‡–&‡Ù…åÀ•8–éþÄsîÄ}·îÉÉÉÉøØ¶¶È¨¶°Èø›Žî¹™šøØøØÉìýÄ•·SØî/Áøù¨°@ûÑØøq¶›ø0°›”þš³œŸ‘Ÿ©œâ‘š&  ˜ Ó¢O¡¡‡ÚÒÍÍï+ï%ßë„Û¡œœ å©Äºëгîý­¨¦â·È¶ÈȰșuȶ™ÁØ”³°¶øuøÉ‘âu·©ÄÈâ€#(Ë›?Ø[Ø›ý›¨5™”˜â•‘â⟑œšââ¾ Ò  ã XÆp‘ý³‘˜†?Ÿ©‚Woîì}Ù~ú~?ß•Ùh˜’â³±Ÿã¶­­ÉئØÈ€ß¨Ž™È¨™°ëŽØøÒÎÉîì¹8ýÉîû…&ØøØ·ø\0ع5øÙ°”°Òœ‘╜âþâ✕œ  N 7X† øœú„â_å“ÄÄ­G‰*¡³©ÉŒ•'†ãÙŠRÓšœ•â‘…ÄÉ£¶¶ÉØî™°¨É›°°ì·S¨Žøì­ îÉîšø·¨Øø¨¨V¶U¼Øøê·;ǧµš&Ÿ•&ÿΕœ•&ÿ  Ù к  ¡îÄÀÉý“ÄT*ÒÿhÉÉ ]áÑŠX~Úì„ÒÀ&‘ºï­ì}î­…£¶Øû­È¶¨™È›ëXâuuœüÉ"îpÄîìîø9oûüý'G¹9Àà8Ó¹¼øô´_â&•–Àÿ–Ú•  ²å>  Uîî·îºG†°·“·_îgUýåÈ·ìÄÚÒø£W&ؘÚ)©³š·£îÉɹüɨșș³Ä¾©øÙζ·øâî¶9ýîýÄÉ·ÀÀÀ‡ÉG·95Þ$Í¡0Oއœš&•••ÿÚ•ÚÚ   ²  ŸÓ ¡˜  •œÄœýº}’¹ýÄ™\SGÀ–†‘ýu­[„Æœø­ oè+˜ªª•ý­ýî·€(øÉÈ™›…¨œn¹¨ßÙÀÙãœc’ÉîìÄøÄp›Øï$ÙÅÍÒͪUýýÚ╜š&&–´ÚÚÚ  å  Ä  ˜ µ˜ÿŠ8ÙÄFX°Á&Óu'œšâÄ뎹ÄuL–Û‹¹±K`ØqÅijâ©Ä©î³ÈÉ™™¨ûȶ¨_Ä9ßÒÀšÚÎÙºý¶üØì·ìøØ›&ß+ÙôßèÒµ5˜zø›ÄÚÀ•š’–•ÒÚ’–– Æ)–ÿœ Ÿ•Ÿ‘Ù‰ ¦ýɹ…c–UgÚ&Ž T•œqÁ¶Ø‹ÿŸoî‚ÒÍU îüȶ™°û›È¦›É'îîÒÀ´ÚÒÚÙ$µÅµœøúÓßãåÞÅ$ßÅÚÍÒÙ)‚/û’•Úÿ–ÚÒÚ–Ò–˜ ² o˜‰– }ªªØý©XØ··­–'U5œ‰ÞgÚ·SL&©™Éîî&‘k¦}0Äý­ø“ø¨¶°”ÈÈŽûø‘·ý¹5’Ú´ÒÚÍÚÒÚ–5µÅÙÍßôß$ÒÍÒµÒ٪ńìûÚ••Úš– Ò˜µ  ÿ–©˜œ•œ¾VØ·É £©‚•‡ÙïŒ~¹Ç|}ŠXúÉ„•œ&ÙÁ”ýî¶ÉɶȨ‹°¨‹·¨'Ø@²ÚÚÚ´ÒÙÀÒÒ´À×ÚÒÚÒÒÎÍÒÎÀÚÇÒÚå…™ ¨¡À•Ú’ª µÓ¡ ±_œ•þé©ýÿ±Q°··“Ä &•œ‘‘œŸŠÚ£€î|©œµ™ÉȺ•â­îP6ëýÁ·Ø¶¶¶¦ûÈÉبâØW¨ÞgÚÚÚÚÒÒ–´ÀÇéÒÚ´ÚÒÚÚÍÒôôÇÙÙßýÙ˜¢&–•–Ú  ªÓ¡  …é©•œšµ³ÄîWŽÉ£Éu–‘‘â©ÿÄ··“>„ý‰Ø·¬‹³©ÿÿU„(„Øu£È°û™°‘&Ø©0ªÇÚÒ˜Ú–ÇÚÚÒÚµÅß$ÅÍÙÙÙÙÍÚ)´å–Ž•ÀÚ–Ú  Ó¡² ýœ•œš}ÄþÄU­±ý¹ý¢–©‘©œ‘‘„O…ÉÉYý³#™É°ÿG©„©*|~¼…ɶ—™ûÒßŽÚØ°NÚÒÚÚÒÒÚÒ¾ÒÚÚéÚÇÚßÅ5ôôô×ý”›ý•Ú˜ 6ÓÓ  ë œ••À ì•ýýœ‘™­îØ©Gœœ©Ÿ'‘‘•'¹u…³SŠ…~·“¶Ä}â©î‰Ž—|£bɨÈÉŸ˜¡â²Ò–ÚÚÇÚÒÚÚ´Ú´ÚÒÍÒÚ´š×6XØŒø¨€ÀÚÀ  ß¡  ýÀ•Àÿ…³Šý³W£î·±ýýœ•â‘‘â‘‘­·¶£ý€ëLÓÉ–£©‘©‘³"Øø‹uœîX¨™°ý²¨¨îÉâåÓµ´šÚ´Ú´Ú&Ú´Ò–é¾ÚÙ7?ĦÉãµÓب À’˜ ²ŒÒ  ì  Àœœ&Ø}îì„_Éý“³ü||&©©©œ©„•ª££·Ä}©h¦¦·þ0ĵ²ÆÒ›°ÿ¶oØÄ¡7ª¡g¡Æ¨7~Æh„€9¶œ¶ÄÀ•?ƆÓÒÙÚ–ÙªÙӲƘ©£­ôåÙÙ´˜&〕‰ tR _…ÉÒ @ âÀÿýÄÉ©þØî·±WýÄÿœ*|‘œ©©sØ··ÉuÄýµø°…·˜©‘ª¡Œ‰Ø°oü"QS¹ªgg¡¡666†ÓN‡ÓRŸg&ÈÄaî&é•âÀÚªª¡˜µÚÀ’Ú••ÍôÅÙÒ´ÒÙÒãš¹ªœYŒ@–±}a•œÀ–ëu|‘&ý­ý±]âÿœ‘³}œ‘ýŠ`/Éзɩý’­°Èý`✜˜†ÿ‡¶ØGG·‚››†¡¡7†R¡<¡†Óa¡<•À‡™îÜ…ÅÒÒÒÒÚ×¾&´šÇÚÇÇÙÚÎÇÒÍÇ5·ØÈþ•&˜˜ ÿý ÿ˜Àšÿ©Ø©ŸV¹Ä­±‚œþ•â©©³œÄQì­ÉÄ‹ýÄ|ęȬS|©ÿªŒªûÈo·Gîø=?ª<7g*‡åã}î²~°©&µÚÒÒÒÙÒ•ÒÒÇÒÒÙÒÙÒ)Ù?‚°Ñ*kصÿ’•ÿÄ}gÚ•ÿ–â}ɾ©W­£É­ø9œ‘©Š‘‘©Šýý¡É¶·¦¨Ä¹ØøÈ¤Lý©©}g¡a­™›É©}©ýɨÓ7N*GScØØ©Ù;²µšÇ&Ú´Ú¾ÚÎ&´éǵ6g¹îÛåßâû/²•ÿ–À’îÐPÿ’ÀÀ –š"„©ÿ‘Ø££P·œ©‘âþÄ©ýÄG¡£É¶ì©ýþ”Ÿû¹F„©©©À¡ÓÚ„GýÄ} ì û²ýŽ›|øúý…ÉâÒÓÆ¢²ÓÓg¢7ãRg& ±âåÓÒÍßG쾘 ˜••ªý³A  •À–’ ©ý•É|VŸ·É©•u©ŠâÄđĊ‘ý†É¶îuý™™ŠS}©ŠÚNNa¹¨·}ŸÄýa°‹î;›Uø9©îªgÀМڡ¡µ’²ª˜À•ÒÒµÓÒÒÍÒÙÀ$Š‘&•ÿÚœ ÿÄŠp  ÿ •ÿ•œºuœý‰·¦É}}Ÿ©’_©Ä‘ÄÄ}Œ°ÈÉÄSKÄ£¹È°·}Ä}³‘À¡†Ú“>ý‘©¶•î=†µ¡û†ýýu·ýÄa9⇶ë1£&Òµ˜ÒÚÒÚÍÙÒÇÙÙÒªÍÀÙÚÙÍé$²~Ýœ•â ÿ•ÿ– Ä©Ä ÿÀÒ˜œ}îÉ•˜‹·¹Òý€©©©©Ä©‘©ÄĆȣÄuý­›Ÿ¶°Ÿu}Ð}ý–ª¡;ØøuÉ}Ÿ¨– Ƙœªµ¶›Á'С˜ÚÙÚÒšÒÒÚÙÚ˜ÚÒÚÙÀÚš$†¹™¹•¾ Úÿ–ÿ ©  ÿ À_ÿ´‘ý¶|&··¶‚Sý©©©©©©©©}˜¹ÉÉÄ_ý…Ø™­¨©…©©©Ÿ}ª¡¢u¨¶‹©ýîZ°¹M† g¡ýîô¢~â"ÄÉåÚÚÒÚÒéÒÚÚÚÒÚ´Ú¾¾ôý—Ù©ì}XŠ: ÿÿÚ’·Ÿ© ˜’ œ‰uÛ삾·¶£}©â©©©À©‘ÄÄÄÄg·ÈÄ·Y©…°Á¶Ä©‘}г©•¡†6Ï·}œ‹Ž?Èîý  åÀøÄš¾~auéÚÚÇÒÙ–µÙÒÒÇÒ$¢À¹±ÍÓ²<ã£оo–Ú˜ ˜Äu –}ÚgÀÀÀ•ÚgÚ_&î0dî?ÉÄÉcÄ•©Ÿ}©©ý©©©‡¶É¶Éc}ÄîÈ“¦‘Äþ©œœ©gÓX°™€ÄÄý€°uÄÒ  û¢&Ù¡øâÛŒ¢Ó¡ÓÒ²7åãÆ†Òš±ì´åªãÀ›&èé† Àµ’ –ÄŠ­Ÿ©Ä‚³’Ò’˜’À•˜ÿÒ•£ýˆ·Ä­£·©âÿâ‘©œÄ©©³ý}ÿØÈ­Éü©ýýë¶î©þ©©}œ|¡g™™°Ä‘©¶”ÿ}Ó ØÚ–†å¨Àœ·ÉÀÚ˜¡ªÀªš•À•ÚÚµÙÀÍ£”­üØ9š~â ÿ–˜˜â ·ý­‘âډĪ˜<–ª–ÚgÀÚ’ ±ÐÀÞÈî…£G©‘©þ‘Ÿœ‘©©}_*¶“™…}u±Ø£›œ…Ä}&U}Ęg†™°”îuķȰý…}µ   X‰¹¨ì}­åÆqì°6ÚÙÚÇéÚÙÙÙÒÍÒ寳™ÁãÓœå?¡ÒÒ<Ú â’ÿ’˜©îý¬ÄÄ–‘–©*ÿ‡ÀÒg˜˜˜‰ÿŒØpS°ÉÉ•G©‘©ŸW©‘‘©©‘ÄX—ÉÈý©‘u/€¹|É©Ä}|Ä©•ª˜¨È™©“uîn™É¦¶Su  &ýÓÙ‘³³¡†Œ¡Ó²Ú†¢77㘳·âµôµ0åÇâ~†–a„  ÿ–Úg˜± …¾îŠŸº7}Ú•À’˜˜•ÿÿ ˜–Ú˜îýŠv¨ã‹‹ÉL©•š&}‘š}_ÄÄ}Ähý­™‹þ‘¹ø”0ÐuÄþ³|Ä•ª5­È|îºk¨Ø°u…ý?²†6~}7pªӘ͡¹ø¹'ªÓӪ㒡ªÚÚ–šÚÒÓÇéÓ~­¹î˜Ú –ÀÚ’ÿÿ˜8ºuîý³œš–`☘ÿÿšÚ‰ÿ– •˜˜’î·ÄÄØã­ÉÉÿ_&ÿÿÿ•ÿœÿœ•_œ¥¶·£‘éø­ø—ÄÄ}Ä}þ©œ©˜`'™ý©³©c°È”©Éî–†7Ng/ت¡²6ø8‹·ÒÇÀ´œÚ´Ú´ÚÙÙÙ$•­±Ø*ÈÚ‘ šqÚÚ•À ’˜³³Ÿ¦îœ•œ˜p’g&ÒÀÀÿÿ•8˜ ˜¡ŠÉ·É¹†ÉÉÉÿÿ‡ÿ•ÿÿ•ÿ•_•âû¹·¦_vGɰ}}ÄýÄý³ý©’µåÈü©_Žî”™™ý…„”²ÚªªÚû¡Ò¶·Ù³Ú~ÚÀýµÚ´Úâ×ÚÚÍ¡ãRÚıôãÙåâÙŠ ²ºœªÿ  ÿ˜œ@Ú’–’šÛ„É}œš–‰}˜˜’‡–Ò´Àªªµ gªÈ·}¹ã€‹·_}ÿÀÿ–ÿÿÿÀ•À_›…¬·‘ý€Ø“È•©ýÄý„·©âÿg¡›€©}ý‘™›™ÄýýûšÖÆ6R¡6†7²²²67ªã˜ôÄÒ´ÇÚšåå¢6¢;aÆ¢7µªâ©¾ßÙÍÒÙ;•Ø 6Ð Š`– À˜•ÚÀ˜À–Úĩɷš©•À‘Àÿ˜˜ª˜@’˜ÿ@ª˜g˜ª£ý³ÄÉh¹MGGÀ‰ÿÿÿp_•þ¦‹ÉØ_Ä›ØøØ‘©þÄÄý }œÀÇ™ýÄ}œ™¨™©}ýý™Ú¶ÓÓ6gŒ²6O²R²¡ÆŒ&†²ºôÁ°ì͘ژšÀ´ÀÍǵÍÒÇ×åa™Áýø ŒŸ šÿ˜ÿ–ªÀ˜ÿÿ˜ÿý­Ä­©š•ÿ‘–‰ÚÚg¡’˜˜‰@µgÒª˜­ý£¶­g¶¹·ÿ‘g•ÿ••ÿâ©‘‘©›£Ø”©uް£©‘©‘‘_‘©‘˜²™“u'€ýø°©ýćÀ7<ª¡¡<Òå$6µÒ$µ°øµÒ†;GİýµÚÇ&Ú´&šéÙ$Æ~ÉØÎôÈØ  Nº ³g••˜Òÿ•Úª–q©ý„­ÄœÛ‰‘@ég˜˜À˜ÿ@˜ª¡g@gª±îu­ìo¶ýɪª–ÀÚ@À•œ‘•ÿœ‘©Ø·ýØþýް¬ý©ý©}©þý©©˜µÈ¶©ŸŽu”°™œ‘Äý‚ì¾â7µÓgÓ²²O²†åg㢣—™ôÒéÚÒ¡²¡å˜¢²¢7²˜Ÿ‘ëÐÅÓµÒ¨øû ¡– ©KÚÿ–Ò•Úšÿ’Ú‰Ú@©­Ÿ£'þ&|}–ÿ••À‘•ÿ‰¡’gªÓgªø É··‰É¦©É‡’’g–*‘‘©‘©©©}ø£·°Äý”¦¶…ýýu¾©©ýÄ'gͰ}Ä‘°™‘©þœ­ûø¹*<µg²;†²R冡6¤ìÙÒ–×–üĪ˜†µ†ÀÚ–é–&˜ÙŵÙÙÙªÙh·*MŽ Nâ  Ú‰–ÒÀâ˜@˜–’ª&Úq©…ý·Ÿ©¡©–ÿ•••ÿÿÿµÿÿ¡ª@ª¡™‹Éý¾}¶·£_¡g˜@Àpÿ©‘œþ‘Äýø“™'ę؎î}ý±}ý©ýÄý}•Ú›”°}Äý·È°œŸÄý©¡˜6’'5Æãý”ÅýÚÚ´ÚßÉЊ¹úÒÙÚµÙÙµµÍÒÙÒÒÙÙª¾‰5º ¡š–œ•˜ÿ˜•’ÒÿÚ’˜Àª©î “©©œ‡ÉÀÿ’ÿ*–ªÿÿÀÚg˜ªª¡ØÄî·Ú·“ÉÄ•ª˜g–’œ•‘‘_þ©þ›¶É°ýÙ™¨±ý­ýÄÄÄ}ýý©ÀÍ›}Ä}M™™‘©‘|Äý·¨*66Ó•)˜´ÒÎ$Øu0ÛÀÒÙÚµÙÚÒÒÚÒÚÇ5˜±Øš ¡º âg’ÿ•ÿ˜À˜–ÿ–Àÿ’Ä·ý£ÄŠ•h¶_ÿœÿ•’œÿÿ–ÿ•ÿªª†·š··hØÉý£ýªg’Àgÿ•}‘©•Gý›È°°ý¢¹ÈØ·ýýÄ}ý©Ä·}ý•¾ŸýÄû™©©©‘ý‡­¡ÓŒ6R㢊—Á³¡67é´}Á&îø¡ÍÀǵÚÚÚÚÇÚÍßýØÉØ– †³ Ú˜•ª•˜ÿ–ÙÿÚÚ•ÿÀýÄ}©“ª¾a·ÿ•â•ÿÿ•ÿ•ÀÚ¡Úª¡¡™É¶ý¡¦É­œâ@ªª’••Àÿ©©}þÄ™Èý—ýø°ÈÉýýýý·Ä©•Äý•űœ}…”›UŸ‘‘Ä–‹g¡ª˜Ó†Ó†$²†6XžuÈÉÍÚ–7ŒŒÀ©ÉŽÛ´&´ÒéÍÙå?Æ¡³î¾´åî† â ÓÄÓÀ•Ç@•˜Ò’ÚÚpš‡’–•ÚÄÉ·Ÿ âŸ@É•ÿÄ&ÿ••ÀÀœ’ªgNÓÓ¼·ü‹îýgµ˜’gÿÀÿÿ‘þ©Gu›Ž¦Ø©ø°¦îýÄu±ý'…ý©ý˜“&©ÄŽ›|ÐÄý©°ÉÈŵgÀ$®”òµ€ÎÇÚÛÀÒÓÆh¡;¢Æ†¡˜¾¾éµå;崰´¡²˜¡–âaš¾hþ˜˜*–gš¡gÿ’ÀÚ­Äu±ÚŠ•ŒÉ•p š_Ä’ÿ•œÿÚgª¡†¨¹·ý𱷹ġ¡g@ª*‘©œp‘©}Gýø™°ý¡É°û··ýu·ýý­ýÄĈ„›”ýÄ}³›™}Ä©ýâ·îŽ›*ªßª¡ŽÐÓ†Ò´ÚÒ$™ýµ'•†ÙÀµÚÒÙÙµÒÚǵRÄÁ°Ò¡¡¡¡¾œašœa‘À˜Úÿ˜ÚÚ–ÿÿ_‡îý –Б•hý&‘•U&œ•ÿ&_ÿ–À¡ª²°Éý…ýug†µ˜˜‡•__V‘©˜'}©¹›¶œ”°¨u·…É‹ý··uýýM·›¹…Ä„ûÈ™”‘©©ýŠ'ý°™–îÙ6XµšÇÄ©ÈÉɵÀÚÚÚ´éÒÙßÚ™ëø•ÿÇÓª¡Ó’©˜•&Šÿ˜’ÿÿµÚÿ–ÀÀ¾&·uŸëŸ©µŒ·‘Š&œ•_•pÿ•Àÿ–NÓ¡¶³ýáâ€î…­¡¡ÚªåOÿÛб©‘îGý°™¶ýX°™uü…·uÉý“ýý“}¶ü›¶‹ýý0™™°©©‘©©ýë™û“…üÍÚ³ÀãXƪľ°ÇéÇÙÓ??;}°ÛåÓÚîpÒš¡ªª¢š¡À³â©V˜˜•À’Í••ÿ&_±„ë& þÀ¡}_Š‘â‘••œ_•ÿ˜NåÓ›É}7£Ø·£…h|±³ºÛ¯ÐÑdÄ„ýý”°·›6İ™°¶É‹ýý·Äý··¶”™¾­X°”…ýÄÿ©}ı¶ýüR„áÚÙ´ÚÚ–åX7hag˜À´ÙÞ$ÍÒÇÅ•Êþ–Òª¡µªÚœqۜЌgÀÿÿ–’â•ÿÿœ–ýÄÄ–±Ä¡ÓÄ}Ä’U&œ„þ&•ÿÚ˜¡a†£·Áµ¶…··™ŸÐ¯â˺ ë¬¸ÐG©ýý›™ý›Ž™û›¶……¶·‹}·ý………››u€u‹™ë©ýÄ‘îUŠÉý¡6¡6¡ýšR6Úé–ÚÍ…™··•ÚÒÚ´ÙÒÒÚ´´Ó7ý¬ÄGýÄ–Ú¡Ó¡¡†Š‰&š•ªÀµ˜–ÿÿ•_À•ÿ•‘ý©‡Äš²¡}ÿ‘•–œ‘'–œœœgªÓ††›ý¶Óȶ…ØÉ Ä븭­­±­î»ý·Mý”¶Ø°¨››…ɶ޷üÉ…·ý¶››û…Äî…™˜©©„©ýšÉ°ýÓgN¡<²6h6²†7¡ãý©…Í•¡†ÙÚ´_¹©ÉýÙÚšÎÚǵ6Æ;œÐ±åv³š–Ó¡†ª¢ì–Ú´–ª’˜˜–•À•ÿÚ’••• ÄœÐœ˜‡ÄâÀ‘Àÿ¡•œÿÿÚª˜††Óض·‡ÉÈÉÉɸ¸ ±ì­î­­£±}}©É·“È™›¶…Éý·€ü¶……·Ž”›q·©…Š™a©}³©Äâ¶£ª²†Ó†˜6Ʋ•uŽÙÙ•Òg6Æ7Ùªâ66å?X;g¾Ä¾$µÙÙ©µ}Í••´¡Œµ˜Ó©‡•–âaÚ‰@ÿš’©š••&À±ýÚÄ–¡‚´Ä&‘&v&¾ÿœ•gª¡ånüɶœâ”ü…£±®·£­Øìì¹ý­»}·uø¹™û…™…ýýɶü¶·ý·››u·Ò¦g©©þýÐý™ œ67††ãå| ÀÒÚÇ–šÙ +myExit proc myExit {} { puts [format "NoteOff 0.0 1 60 127"] flush stdout puts [format "ExitProgram"] flush stdout close stdout exit } proc mellow {} { global cont1 cont2 cont4 cont7 cont11 set cont1 10.0 set cont2 7.0 set cont4 0.0 set cont11 10.0 set cont7 3.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 7 $cont7 printWhatz "ControlChange 0.0 1 " 11 $cont11 } proc nicevibe {} { global cont1 cont2 cont4 cont7 cont11 set cont1 6.0 set cont2 72.0 set cont4 21.0 set cont11 50.0 set cont7 60.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 7 $cont7 printWhatz "ControlChange 0.0 1 " 11 $cont11 } proc voicSolo {} { global cont1 cont2 cont4 cont7 cont11 set cont1 2.0 set cont2 37.0 set cont4 90.0 set cont11 10.0 set cont7 120.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 7 $cont7 printWhatz "ControlChange 0.0 1 " 11 $cont11 } proc drumSolo {} { global cont1 cont2 cont4 cont7 cont11 set cont1 3.0 set cont2 37.0 set cont4 0.0 set cont11 100.0 set cont7 120.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 7 $cont7 printWhatz "ControlChange 0.0 1 " 11 $cont11 } proc rockOut {} { global cont1 cont2 cont4 cont7 cont11 set cont1 1.0 set cont2 97.0 set cont4 52.0 set cont11 120.0 set cont7 123.0 printWhatz "ControlChange 0.0 1 " 1 $cont1 printWhatz "ControlChange 0.0 1 " 2 $cont2 printWhatz "ControlChange 0.0 1 " 4 $cont4 printWhatz "ControlChange 0.0 1 " 7 $cont7 printWhatz "ControlChange 0.0 1 " 11 $cont11 } proc raga {scale} { puts [format "ControlChange 0.0 1 64 %f" $scale] flush stdout } proc noteOn {pitchVal pressVal} { puts [format "NoteOn 0.0 1 %f %f" $pitchVal $pressVal] flush stdout } proc noteOff {pitchVal pressVal} { puts [format "NoteOff 0.0 1 %f %f" $pitchVal $pressVal] flush stdout } proc printWhatz {tag value1 value2 } { puts [format "%s %i %f" $tag $value1 $value2] flush stdout } frame .banner.butts -bg black frame .banner.butts.ragas -bg black button .banner.butts.ragas.raga0 -text "Raga1" \ -bg grey66 -command {raga 0} button .banner.butts.ragas.raga1 -text "Raga2" \ -bg grey66 -command {raga 1} frame .banner.butts.presets1 -bg black button .banner.butts.presets1.warmup -text "Warmup" \ -bg grey66 -command mellow button .banner.butts.presets1.nicevibe -text "NiceVibe" \ -bg grey66 -command nicevibe frame .banner.butts.presets2 -bg black button .banner.butts.presets2.voicsolo -text "VoiceSolo" \ -bg grey66 -command voicSolo button .banner.butts.presets2.drumsolo -text "DrumSolo" \ -bg grey66 -command drumSolo button .banner.butts.rockout -text "RockOut" \ -bg grey66 -command rockOut button .banner.butts.noteOn -text "Cease Meditations and Exit" \ -bg grey66 -command myExit frame .controls -bg black scale .controls.cont1 -from 0 -to 128 -length 300 \ -command {printWhatz "ControlChange 0.0 1 " 1} \ -orient horizontal -label "Drone Probability" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont1 scale .controls.cont2 -from 0 -to 128 -length 300 \ -command {printWhatz "ControlChange 0.0 1 " 2} \ -orient horizontal -label "Sitar Probability" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont2 scale .controls.cont4 -from 0 -to 128 -length 300 \ -command {printWhatz "ControlChange 0.0 1 " 4} \ -orient horizontal -label "Voice Drum Probability" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont4 scale .controls.cont11 -from 0 -to 128 -length 300 \ -command {printWhatz "ControlChange 0.0 1 " 11} \ -orient horizontal -label "Tabla Probability" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont11 scale .controls.cont7 -from 0 -to 128 -length 300 \ -command {printWhatz "ControlChange 0.0 1 " 7} \ -orient horizontal -label "Tempo" \ -tickinterval 32 -showvalue true -bg grey66 \ -variable cont7 pack .banner.top -pady 10 -padx 10 pack .banner.bottom.ragamat -padx 5 -pady 5 pack .banner.bottom -pady 10 pack .banner.butts.ragas.raga0 -side left pack .banner.butts.ragas.raga1 -side left pack .banner.butts.ragas pack .banner.butts.presets1.warmup -side left pack .banner.butts.presets1.nicevibe -side left pack .banner.butts.presets1 pack .banner.butts.presets2.voicsolo -side left pack .banner.butts.presets2.drumsolo -side left pack .banner.butts.presets2 pack .banner.butts.rockout pack .banner.butts.noteOn pack .banner.butts -side left -padx 5 -pady 10 pack .banner -side left pack .controls.cont1 -padx 10 -pady 10 pack .controls.cont2 -padx 10 -pady 10 pack .controls.cont4 -padx 10 -pady 10 pack .controls.cont11 -padx 10 -pady 10 pack .controls.cont7 -padx 10 -pady 10 pack .controls -side left -padx 10 -pady 10 bind . {+ center_the_toplevel %W } proc center_the_toplevel { w } { # Callback on the event for a toplevel # that should be centered on the screen # Make sure that we aren't configuring a child window if { [string equal $w [winfo toplevel $w]] } { # Calculate the desired geometry set width [winfo reqwidth $w] set height [winfo reqheight $w] set x [expr { ( [winfo vrootwidth $w] - $width ) / 2 }] set y [expr { ( [winfo vrootheight $w] - $height ) / 2 }] #set y 0 # Hand the geometry off to the window manager wm geometry $w ${width}x${height}+${x}+${y} # Unbind so that this procedure is # not called again when the window manager finishes # centering the window. Also, revert geometry management # to internal default for subsequent size changes. bind $w {} wm geometry $w "" } return }stk-4.5.0/projects/ragamatic/VoicDrum.cpp0000644000076600007660000000644712327014024016163 0ustar gary/***************************************************/ /*! \class VoicDrum \brief STK vocal drum sample player class. This class implements a drum sampling synthesizer using FileWvIn objects and one-pole filters. The drum rawwave files are sampled at 22050 Hz, but will be appropriately interpolated for other sample rates. You can specify the maximum polyphony (maximum number of simultaneous voices) in VoicDrum.h. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "VoicDrum.h" #include namespace stk { VoicDrum :: VoicDrum( void ) : Instrmnt() { // This counts the number of sounding voices. nSounding_ = 0; soundOrder_ = std::vector (VOICE_POLYPHONY, -1); soundNumber_ = std::vector (VOICE_POLYPHONY, -1); } VoicDrum :: ~VoicDrum( void ) { } char voiceNames[VOICE_NUMWAVES][11] = { "tak2.raw", "tak1.raw", "bee1.raw", "dee1.raw", "dee2.raw", "din1.raw", "gun1.raw", "jun1.raw", "jun2.raw", "tak3.raw", "tak4.raw" }; void VoicDrum :: noteOn( StkFloat instrument, StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "VoicDrum::noteOn: amplitude parameter is out of bounds!"; handleError( StkError::WARNING ); return; } int noteNumber = ( (int) instrument ) % 11; // If we already have a wave of this note number loaded, just reset // it. Otherwise, look first for an unused wave or preempt the // oldest if already at maximum polyphony. int iWave; for ( iWave=0; iWave soundOrder_[iWave] ) soundOrder_[j] -= 1; } } soundOrder_[iWave] = nSounding_ - 1; soundNumber_[iWave] = noteNumber; // Concatenate the rawwave path to the rawwave file waves_[iWave].openFile( (std::string("rawwaves/") + voiceNames[ noteNumber ]).c_str(), true ); if ( Stk::sampleRate() != 22050.0 ) waves_[iWave].setRate( 22050.0 / Stk::sampleRate() ); filters_[iWave].setPole( 0.999 - (amplitude * 0.6) ); filters_[iWave].setGain( amplitude ); } /* #if defined(_STK_DEBUG_) oStream << "VoicDrum::noteOn: number sounding = " << nSounding_ << '\n'; for (int i=0; i soundOrder_; std::vector soundNumber_; int nSounding_; }; inline StkFloat VoicDrum :: tick( unsigned int ) { lastFrame_[0] = 0.0; if ( nSounding_ == 0 ) return lastFrame_[0]; for ( int i=0; i= 0 ) { if ( waves_[i].isFinished() ) { // Re-order the list. for ( int j=0; j soundOrder_[i] ) soundOrder_[j] -= 1; } soundOrder_[i] = -1; nSounding_--; } else lastFrame_[0] += filters_[i].tick( waves_[i].tick() ); } } return lastFrame_[0]; } inline StkFrames& VoicDrum :: tick( StkFrames& frames, unsigned int channel ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( channel > frames.channels() - nChannels ) { oStream_ << "VoicDrum::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int j, hop = frames.channels() - nChannels; if ( nChannels == 1 ) { for ( unsigned int i=0; i 4%ƒ“\ÿI÷þòBñ ñÃðäîãíúñøâü ¨ý#.k= óýKð'ç£â`ânè¢ðCö­üTÿOÿн»ý¸ ° ü]0 ÿ0óCííóhü[‹$–=РжŒú= Î^“ýúû%ûPùš M B kÿ…(stk-4.5.0/rawwaves/bassdrum.raw0000644000076600007660000001030012327014024014317 0ustar gary(P×Ããù¿3Éæ’  ¹ õ)Tò£•UðþÎÏÓ#S-ƒ1^1„/±-À,Ñ. 3”:}AZBÎA\F€IF^F¯G6G$FüEEGàNTòR{QÄU¼VSSNÉNïL¥H˜A15ò/:.H1;fG~LÈP¬N—A=3&‘ ÁûÆüû¯ÿ\Ï£ )7@EE@9ƒ9¶6,Ÿ"öûaì¤àìÛÀמϹÉÄÑÀ ¼mµ®i¢X–‹†„º€€€€€€€€€€€€•K¨™¯¥"“I€€€€€€€€€€€€€€€€€€˜—«¡=§Z©Y«Z«n®­„–e¼€[耀užI”—•™K“˜’¦Ø»ÖÁ„ÕíGú¦ìN©}§®7!ì'‚/ÿ34@:;:¬4m/&61:e1Ä.Y7N=¨EªMQOLS'W¢X*Q¢CŽ6R0ž':á®$~,Ä-Ï'&–(˜*ç3ê=ÀD3A¼9“,M×ÌJF v. $g ÷&z%š!°ÿ*øyíŒéØîòº÷xÁ-¯ú ø=Í bíôèåYÐ:Ã#ÃvÅŠÂüÇ'ÒÖÒ«Ë{ʽÓ6ÚPÝîã­å1êGñ§öC÷Ãìÿæ-ë"ê¦íÕ÷uÿT1&  †ví êJ%?ïíyò„ð#)‹-,-(«+À/D.w-§,‹*Ñ*>-œ.Ü,˜,(W#þ%®*Q0ê5¥9ƒ@DFÓNPPÏJD‚>5^-—%hÚ!$H$%Ó$ñ#Ú%"nª#,(¤&Ñ&®%##S!5§+ðŸÈ à 8 R þ :š_A4oK~þ õ±ñ>ññËóö8ùŠú‰ùÄøõ¢õxõwóòEñ~òyô©øþ[ÿ ýüËüúGú…üìübúyöûò¢ð¬í0ë£ð úUà ÇJT„¶ Á F ç á €× ž/ñ›š•‡#Ó&&C$é"Ö"Æ"]"é!u R ]V9ݵ « Ú®  “ ó ú E ú ¢€/X %› ûñûZúôû¿ûæø?÷´ùJù'ùßýÒDÑþûcú ù÷ùàùõ¿òëÍæ¨æPäxâ®â¹ãQä"ç·îôr÷;ú0ûT÷–ñîï3ìÌêAëÄíûð7ó÷÷øÛûü9oJE+ÿYù‘ô¢ò!óŠ÷êùxúXýÓÔl5üfútùQøeû"\q3H 1 0öÁ !YáHËÏj!í"ïóȰñ&t v ” Þ>cûÌ ê¤aÿëý'”? ʤW„sá¿@U_‡'Á…\Q 4 A¦– © „ { n~*2ûtúùüWD  cÒö}ÌŽýêD^ñý%ùæûù)ö,óîñÕòûòeò‹ô†÷úþ:´¥å:c % ¶ À DŸz]Þ=ïˆ ÿöZïêçÂæ¯ç¨ìðoô÷„ú§û÷û ú»ùÔöæó˜ïàì¤ëòìëé>ê:îVõ¾ÿM. ´ö{S à  ²HCm¾·®Òa\ +ˆ â,WU ê äBé!šì¬ fþúúåø{öKóEð£íÈëDè*ãÌá…àLÞÙÞ®ßà8ãîç*éJê™êEê&ê\éuçùæjçOéõë~ìoíFîXîvï ï ëvæYà ÚAÖ†ÓÇщÏoÎÔÏŠÑ]ÔFׯܬà7áöâ?àÌà ÞißžâƒáâÔæõë)ï_òèö"ö¸ù¸ü ûµûÄùGùŒùŒú8û øÅ÷|ù•ý>9ÿ ÿ0þÆÜÄb Ø _Ïï¤'vƱK & aB Ä -  ÊÒbP¢ & U-¢Ÿþú”øÄú"ûAûuûÑúÐù øVöç÷:ø÷ÆøzùLùrú'ú ùÞúæûtü’þ/ÿ°ã‹ÿBýàùLóŒñTïðÉñüòàõPòzòóýñ(îfëÓèÍèIç.ç¹èêçžèwé)éYëîPðïnîWï)ð>ïî#îIïÇñžôÐ÷øyùcøôúpûpûûÀü}üý£ÿiíB  W oå³éu¸ þ _ :ýD5U ÿ”Ìi&Œz1{ȱ Î W › Ï K d %ù À4 ˜ à  ¯ìôaþžüþûHú:û ü²7þ1N’o þ°ý?ûŒúPøð÷cöXõ!õ õ ôdôpóñOïªî†îoî:íMì_ëTë@ëê#êgìì5ìºîéðÃðEðñïñüñŸñÌòÁóÀôþö^÷?úý;þ6ýàý%þ3ÿþbþýÿ›ÿyþlÿ!•K¾nŸçi ÿÿrÿþ¥ÿÆ6Túa23«Ê+¾1ù Î ° É 8 }q4 ³ º q d Ò Ø D B £  j R öä¡ a  l 3 p  K ž ˆ p [Ï / XðÀ\a!Fû ÿÌÿwþ¬þ’þ¶ÿ:ÿÿ)þ_üÇûúÚúÞûÔýþ?þËý¹ý_ý·ü§ü8ûôúGùqùêùèøà÷åø‡ú û4ü!üGü*üûýîýÅý‰ý,üWûüû.úFù)÷"öjöWö ÷&øSøÈøþùîûsûôühý0ýEýkþSþ\ýÝýÇý¯ýëþ«ÿƒ ‚l‰\·ä¯ý R B×DÀšCgƒú˜²p¿$Ðj óÿýþéýXü_üüÜý´þBþëÿÝ´.í®p‹ôzüê%~ò’þh:¢V7ÿzÿ ÿ7ÿvÿ×ÿ’þÂþ^þkþUþΔ¬ÞhÿPþýü¡ühü,üVý þ{;J×Ók©³)9™ÿký’ü4û§üü“ý-þ0ÿ¢êÉÞãòžº¹¼ó4R`&õàsש&ÐC¤FÏ<ZO+ýö1{ ¿;Lñq ¿É5GIpÃgÌ‘ÌÕÔxÚ?MÙ«ÿûÿ>þ±þQþýòþFþtþ­þóÿzTKâÃ3Å!X`@ÿîÿ§ÿ†þéþýQýý8ý'ýuþþUþ¿ÿ°ŒŸµ‰bBÿêÿ¯ÿ]þŸþý|ü¯üQüûŠûSû%úóúŽùßùoù[ù­ú~ûû†üüÅý•ý¨ý:ý üëü üaü^üÄýxýŒý‘ýòþQÿ4"ãºeÉý¡-c¥Qÿñÿ‰ÿqÿ¦EË1˜Ÿ¤ ;œ%Q¡¹Sm¿{Ä/ ¢Ž`?ÚãóÞÒ] °"©á*+Î˲ü7£jÙȬ­Cup 0ÿ;þ¥ýÙýtý—ý¶þþƒþÉþìþ¿þˆþý_üÐüü:üHü¥üÄü¯ü¼üÅü–üŸüsü±ýRýzý±þþ‰þÒþ¥þ.ý‘ü˜û·úøú"ù³ù>ùùuùáúlúãûû7ûú•úDúú6úwú«û5û¶ü7ü÷þ@ÿgÿÔ7Å8„v 5\õ!ôjÿ±ÿcþøþxþVþøÿö˜ÔIêX÷3l?:€jx1M_wÜ(aÜT¹Ì[P‹ÓƯªJÏ4è½[ù´yµuOײ¨¢íM†’ljt³°A±±µrÉ1xµ¤ˆÿüÿ³ÿˆþšý–üçûÜú¹úù/øŠøkøCøWø¹ùù¬ú0úuú÷ûdûYû8ûXûcû;ûSûdûLû úfùâùŸùqù`ùˆùÒúŸû™üYýQþ þ¿ÿuã}¥…‰»IY,6–þbˆX’ä®d0ÿ›ÿ/þ´þ8þnþÒÿ.ÿ[ÿ_ÿJÿš> X1÷©„Š©ú,7jqVnÿçÿ¤ÿXþáþrþýíþþZþZþLþ-þýÑýŸýlý ü‚ûßûZúàú¼ú–úù‚øÿø‚÷ö÷§÷k÷8÷÷ öÿöíöñ÷0÷t÷°ø øHø‰øåùCù’ùÒú;úüû ü3üˆü:ûÝû“û_û|ûyûeû¤ûÝûÜûþü*ü"ûïû÷ûùûÁûŒûiû3ûúøúÐûûÜüâþ-ÿs˜”q/¥ï õ ¶û3{EUƒ—ç#!‘S¶ãÖÎþRx6Ìe'ö¸h³Z5Ø`Ö‡sx¶ô<£Æ èÂC¡1¼S¼4ÿÙÿ„ÿbÿ0þñþÙþÌþÄþÁþþ ý¥ý:ü×üÔüšünüGû¸û»ûôûßûýûðûŸû”ûÌü:ü˜üÆý.ývý–ý›ýný<üçü¿üåü¬ü—üœülüEûüûÑû ûpû—ûüü˜ý¯þ‘þþºÿEÿƒÿ› éc¿P·wé2„·¨».;”u§ø¶ÀIŒŠj;NCâx#å㩽/hY-Dz¨„6õ?Š6ÚÄ?—ž‡^ÿæÿ]ÿþÚþˆþ5ý£ý6üÔüiü#ûºû8û5ûaû&ûCûKúýûû û ûûnû®ûûBûú§úKù¨øçøø”ùùXùsùÖúhú¸úÝûûû û=ûBûHûMûFúÏúrúÕûúóúòúÓú÷û–ûåûÀû¶ûÅûÕü=üÄý ý+ýFý üÂü¬ü~üDüKügüPü+üCüüÈý^þþuþ¶þíÿ5ÿjstk-4.5.0/rawwaves/britestk.raw0000644000076600007660000001000012327014024014323 0ustar garybô;ÿyÿT÷~¥ýy õûéªô[Íë„ Aý=ùo ŸúYOïmüRL îþ)¤ð ›ú7h6އ/ù%ÉøŽmÿ¾?ÿäô# ùâü)ó —ö~0ü¤D}ü…7°àÿwÿJþ‘ýù3ßþ ý÷ûnõi Nýåûþïùn•þ¸ÁüëkúJûüÔ×ÿV #ÿt6ýõŒÿáÕù…íù‡ ùΞýÏ@>OðÄ ×ïÊ»c àüé=ù/°ø–áÿ7ÿ Yê °ñX<øO÷é ò”ü` ›ŒøæÊò ˜úÙx ^ð çPøÒúJLýÿÆþìS’Íú> áìV öÿT wùÙÓó¼ oûê#ûšçÿøƒ eöæ[ +üô[ûÙa¹uþ¡ý}þ%‹þ‰…úî ó¡Áç«Ïõ&ýWÿËþóþëËûvêú¬êþêðâö\e Rû ÷ÆÆÝ·)ÄêÝÉ Œù<ÿ€ 4ð…=­œúDÿ÷›ó™–Sý™üò Ãø[™ö?bôü‹ðþzì¬ûÀÿ=ü+ùy ;ñ× ø}JI2ÿfþ®úçèûŽõþbý© ù‚…eâ ùù£ùÍól+÷¸¾ûÝ ó3éöF äÿªòû.ýo²úÇ™îýYêK †Nõ AÝù¾ÿ[ûú§Rðÿžùzû5-(?˜ûôÿ×½ùŒ´ùxkþHvíŸãí—õåõüYÖ~NùÿDý}”öÊ ´ù[þ¡_þŒ <ó›èùÜþî%ýfþ¨ž¤/—úŽþ;?­ýíÂþá›ÿ +óÙüåùɆûMþÞÿš?ø#©ùéÿÊúÁ‹ÿþýÕ¬ö÷ùøF}ûàÌý/þ“ÿDÿcÿÈýýŒ„ýÿøû2'úà)þ„±BdÓkû$¨ù« $þYê+ú5üéªþðü"ú  ?ñj «õÌpþýü¤´ê‰ñö$×ñü&‡øÕ Úønaü?ÿÐ õ ÷Q_ˆübê÷Øøúì:[ÿJßJý“üœòüï TíU]àâ˜ö”ýSãútûƒû"þœ0û¬oüz<ùP ò½‹ï‚›ü»ý9¦ûjú4 —õæúñV4þü½!9@Jþ×ÿ ýÁÄÙ þš!äù »ú³älùa8îS,ú Zý¦ûSò÷…ùüÕ æø`qØ”‹òfp ýxö‹øÔÀü-Dõu îóÄGý7þšêìÚÛðB ûWü~Eú¿õü¦ý3 ê»ãåª÷ýÿ±ø™ ü¸uÿúýãÆõ¨ ¥ôI®÷Œ…ðù© âíM¦øµüþ}+ö& ”ôÑ ,ù/«ûúú[ ãñ¿ù5sÿVùVõÿÄÿeBù +ôÊü’ý¹ê­ú\9üÆ93ûÑpÿÿË{Mülsû¬ÿádýЂþ•~ÿ{ûò;GþÝìý›ü5ùõtÿ²ÿÞŸ;ÿFùñ|÷ì «<öF pú(þ9ýûùµ«ûËÿªû˜Uùènýqþû°-`‡ú‰‹vûùdþ’;KøiÕø’ø!ýˆ ûÍÝù7ê å÷. ¬öj÷ú~ pù©[ü†ø;uýe%ôÿÃûûÿõç #ü-dÿRîÿ«ö÷8þ]øüz ¥ø ÝúhþÜõøeÔü¹¾ô_ “ýü) Œõø)üÈþÈ$2¬_üÿƒ÷îÅáhÿLúsÞû§ û…˜î ÉûšÿÏø†øÌý@hÿßÿºþ¨Äý8ÔvþBY÷p µúaÿþÓÿþÑVýÞÂ4øÒÿ„ÿæcþy¾KüseûÙЛü?ÿàûµZ[ÿ&þ«þ˜nw5!þÒ«üÿœþ韧ëö^¸öRÚúÈør³ô«2í ôŽ8ÃüÖç÷g3~ü»`÷¸/ö [÷Ç Zó6 çûqþˆÇÿ$út aù"ÅóB ùNƼÿ›þøö“ù ‚ö±Y4÷ ‘ùîŸáùÎÿ¿ýYöø|ûùOzÿ $þ6¹öó;÷„)¿¼þ þ4ÿç5þ¯,þœ ~ù¨lü”üÏiÊúŒ­ô#ì÷qÿÄ=ÿ³vúÉcûàÈ)ýéþ@ÈŠé¹þÎþB Šó þûMwúÊÛöV ’ú÷Sújàýý@&ý/qÿÒWÛøe ~øëýµüXA´÷­úâ¶Ãþ]4üŠ%ýõLúç~Õ÷<wõlàû‹ ™ü“wýcâ4ýÉ„~_ÿÊ­üªÙÿÇ ü'3øÞ¸ý"ÿwþàºÿ^ÿgÿýN ûW ­ûrÿæÿý¢«ýiUû®Êúþ1µý£ÿ~\ü*ÿBùyŠÃûö+üÊýg û µîŒ¥ý[þgû–<†úý_aök +óÊ9÷…"ûÍdü‡Àûn—ö·ƒþEþQpý÷þÅÿ?qýó½þp#ýšZþ9þ±¶úߢÿÿz€ü<®ëûäãý*ç1ý=êþß$¼ýÉ’û¾‘üÝgý§ºgý÷ ÿ#ñý9Hû'ÿVýU·þJ›ÿLþ‹þi¢ý,çòÿ›Kÿ²ý¿©þÜLü} ý¹úÌ>úôNú;õ! Nú¿ÝPyüÞþç,» ¥þŒÂûö5ü’ùÿÃpäþýÇþò½yAÿ}âþ9xiøØ ëõ (ø>aýrãÐåû•†õP 'ùº@Ôúd6ý`üªIö ‰ø ¹Ãû•ÿð™ú&?ù8ÿÃ{ÿfŠýþDÿµÄ×*ÿU ÷Õÿ4ù•·üuÎûËý`Óøûžjû¬ $ø.’úÄÿÿ£þèVüq`ù€ûµùÑ$ýz<ÿqpô7Æþ ÁÔ3úÞKþÞ"þµöþ|ºÿÿ±´ÿŽæ¸ùå »÷¢}5þYfÈùÿtøÅ¢úéšÿ¼©™ýýZý7ýÕ¼÷nÈúÍXü/Tþ‹3þo¼Íû/•þþŠðüj7üÌ‚þØÿÏûÐþyüýïþœëþFdeý©(ÿBŽûYêø~-ÿ³i™ÿ‘RE(QàמÿúéýøÔ!ü@ýŒÿ15ŸÿÀ–ÿ{®ÿuÿ©üªdüpµûÚÿ7ùBæüÚÔþ"ìùS ÷ö_`ýÿá SþÏüh¤û§ @ýüûæùÄÙNýÃÖú‹á¬ ÀAþnäöç Tôï û@zúÜêýwü;¥ÿ•´ùïYÿÂsývC£ú³AøÙøêÃýÍÿ]ÿ,8»÷+ Ñ÷®5½þýýÃÁúcdÿiýÚ^ýãÖþ×ÿqÿPüPÖ÷âýüåM/ýSÇþærÈÁý…AüXU#’þ)öxù ø´@cþ‰ ÷¯!/ÿ•ùéü/aþ~ýþýô°mÿ·ýdzûµíÞüX—xùR Fù¿ú¨…÷\Cÿ§ÿ Á,ü]5ûÐ!˜ýôÆÿ><ö Ïú-.¦ý×ý£þoúPÑøÎZü ü±ý62ý¶n÷— #ô‹ °üÖnÿ¤ÿ¡i?ýYCÿµý¸lýbD ÿ•ûÄÃù¸ûüMû¥%û¡£ÿ3ÿâçÉÿMj²V"'ùÐ}úÆ–û¡ûÁÑú²¡üIÁ$üh=©þ4³üá{ø¶¢úz)üºýÿÈu*ÿå_ýT ëþ}$nÿüHÕú• ýÌûã‚÷ÿþ]?¬ûHþý5OÓDÁ…ýƒõÑ*ùûÃFÿű_ý<ìÒû 3ý‡ ïõ p÷à Hö •ó ýnÿªþzàúi$ýÞþWùü¬ôüeôÅ™¶úë ‹úQëý=ÿ¬žü âƒú­EŠ÷ƒ ûö6 ïø!íþlŒ}9úüÔÿøÿ@³Œ(êùqÿÖý|gHúzOûâèý¤ñÿïÿ¼™þ½ÿW¬üh{ûà¨ÿk7ÎþÓÿkxó^ Žú^Î4Iþÿ|Z þŽþs»™ú)›ü¥ô€ÿJý÷ÌöÑŒøÇcû=îÿý ýýüâÍúèÿgOÌ÷Ðÿœû ºõx»þÕ÷9ûõ{ø¿ëýJÿÐN«ø ûø{š$ùYñ­ ú%¸ö|ðù cüÿ"Îû}œþGü…ˆû¾°ßúÚ ºô› ªù+ WûŸfÀ÷ßZû…ý) ¸òõ ’÷ìîûÇ+ü9~KKþ|0¹þ1ü: ñç •û¶wýw1ûß”Òþ˜`ú8 éôŸ ¥ûŠAú»@±ûÒ}þ¼n¶ä÷‰ xû§»¤þËÿkÊÿ-Dþþÿstk-4.5.0/rawwaves/cowbell1.raw0000644000076600007660000001444612327014024014226 0ustar garyu íJÿÉÿ#ý­˜ùöýwäxø/üÙúå ÝþÕÅïWõ`GÖè~òÒAÚ„à‹#Ga5¡Ì.d<Þ Ü—ÎJ²¨z¬PÖÓè÷ÉÌɲûÜ'³DJWÖHå;;/ÓJñJþSö6j4ù¨ýDÛ„Ë¡¿|ÓléÖ"çó}kqõŽíG³ˆ‘S•ú£®¶œ·º¶æ‡®/€'%%R=ÂW¢Uvl€i–E§'B!Õ0“)†ú™þ„ü‚É   Ú?|˜®4T/¾òë}ééՙ΂¢^ý§º³;±Z´X·ñÏ`Ð1ãuþÚúÉ!Z ½-&x ¯­à®z((;>‰j*c¨_¬i1{iD5'šü{ò(Ü仾—¹“0-šIšê«Û¼œ¹5¹yÊXÝ[â=ï ðúññ ‰ÔíšçûØÇÓÒ5ÉRÜñÅý -VHazÖ}m}m}m}my gTAS.ô¹ñxëÜ!Ö4ÓÒÎÕÃ8LjÜóêvëRêóuõiÕôôÓ0ÌÂ˃¶k¥˜¤¯ž{š³šð¨dÖZƒ/Fâ?å:JŠJº:ü1{"ý>%B+Þ$l&¨± .b=aA•6;-r.‡0¸4-‘‡á jæ¼(¦6“ƒÇ‚„"“—­¹µV¬¼¾ÿÑ:é÷øiþ%  þ ˜˜&(:(/¿/Q67À&Ý t *BÂ.©4rA°EÀGúJDAR0,#Q ñôâKÕ½ÐpÃA´±Ö¾óÓûÓÎ<ÔÏØÝ[ë–ú¤#ØŽÂýö¾êHբÇÉ}ÒÏu×+æ¬þˆ"q;L²d&n‚_’S÷KÊHG>×&&~Q°1ûñí¡ã¬àuéŒó^ýÕæø=öõòñ®úQíÏqº%´Ý¶Q¹~¶z¸ÅÙÜÚô’v.&À61>2ÏBtCÞ4‡äP .^ ˜…<ýúzûý«§3xôÊyËø€ó¬÷‚ó‰í"ã؛ӒÐ&ÒJÚâWèýîCò;ü 8 N d ¾–ÿ`ý:ú^÷cüÔDZù*íï¬ú­ýüeº*g3ö1þ(–+"u ãüòùäËÖBÐTդܺçÖí™óŽûIM@â• !…{zö–ç¥à°âðé§èïêûÿPÌ(J,Ü0ˆ7´?½6§&ôóÇà­Ï—ÉŒËÓÙ¶Üá½ð%ÿéÄ. W¯"0'·.Â,) ZýúóÕîoãªÞ,ä®õ\6ì›`$$ö á÷ßëOàœÙéÜmßñß´ß^ÞÜæð?õô€ù ò5Mï$R#¦i‹ß= ªö‹ãhàxë]ôö¶ü9w@”Ý }`¶ Š÷!» E0 ¦€Iù"í¦â\ÚÄ×ÀØŽà­åúëTñcó’øÊÎÍþzò™ðS÷nýÖý÷ óóùýüû÷ÿ+¥ Gˆ'4r76Y2.‚/ %[þÖñÁãžÚøÙûݪâµåÕëOõÅŽüúPü›û€õ]éZÝØÆÚfØ9Õ*ØëÞÎäï ýÑ â(ó/G5Â:Ž9:0ò"9¹ ÜQùúøUö ö ÷£üX)#݉„ˆUÏßûÖôîKçߨ’ÓÉÑÓÌÚDàã·äøêòþ³Ô…´r‚Qîw $F u úÞõA!ç*Å*c$Ú˜lë”Î fýjõ ï èPßÕÅÑѽ֓Ú~ÙPÚÂà•è<ï ø‚_B¾6ò°ýYü°%:J nÊ.$Ò(=(º&á*[ÿú@òèï›ë2ä6â¥éóûÿ² }zn¥ à>þúßðšáÐÕ>ÑFИÏyÐÔtÝkéõ$ÿ{eÀ$+É221,F"·Ö& EÿkùÛû躰‰ ûšÕ¦þ‡ é ðãç¥å0åñä‡ßeÝ‚ßEã2æDè|ë>î®ðööiô Àq^ F ˆ ÷ ¡Àú»ø-úûsÿ ¶ ªÜ|%h} g õ¡ « 6lHü¨ôë×äÜàëã!ìó¾õ«÷SýÁÞËýÄûû‚ùgöuôvõ ô£ñ}ï.ò¦øú#ù‹ú£å D]/"ì'š)ñ'9}`õùðâíÎîð;ðßðÜõ¡þùp . a  `  ÿ ú^ö ï`鿥åNäâ ásèœô2– Π PŤ8¹ßûõiòíïëFéíø2MyU n•S£³¸Ý +®äÿUûõ&ñ»óø-ýB  6jÕïÿýTùÂôÒñ˜ñ×ð°íBê¾íó^ù{úzù$ý%X ¯ ðV­Á2 ?!çÆþ©øÇõ¡õôôcö[øÈû¹ÿ´ § K à  ¤Oø4ò2ðRðOðCî–ï~ñQò¥õVøPýírÿ j% þ Nûwø£õåóµò÷óõwúŠS\E%Ö&Löõý2ùQóŒí®éjçŸèjêî¯ó·ø‘ýv¬®  Š ÇïKûwõþñì¡êëeîâõvÿÒ ‹ 7 ç£ú ß¶aÙrþ[ü–ýüû0ûÙü¿ýEÿ˜© n þ (ª¼ÿ_úÑöuó³ñBð-ðþóÜø;ùbøùÀýƒÿžþ§ûøîûMÑ “¨Î‡_ÿmþ7ü¹ýxÿáÍëYW ™5þ¢b Q §ûU9ù(ó,ïëæéãÈä¿é^ñ ùþ¢ÛX 3“ O åûvö òÏòò‰õ*øÙýWW•Ë > æÄð 3(þûÂúéøGôœòLõfú’þÒ« ä1<¬í ±Îöžï²ìÔé¢åßãäÍçrë5ð5õûü„dV V  Æ ­ )ìÆÿÌúæù~ür%Å7 ‰@ý²I {xÐÿŽüí÷,ò3ñ,óÓö¹÷ƒø²ù.øûø9ø.úØþ]ké¬ÿ÷ýrüøþÂþ¶ýÚû‚ùpù'ùèû/üŠýKýÍÿ~ˆ hMÁÔ“ Ô Yÿûöú ù~ø+õ*óõYø­ûÂügüôê•ýÅúš÷aô#ñJïmí9ìî?ôGüT• æ ßE "Ujÿ²üŒúù˜øÎù­ýlCõäÞ $ Þƒ$ ;WZú ò´ì-çëåå'é¦ð‰öêû:ÿ c T ñ E ú¼ÿÁü”ûûoûkúÓú©ûüVüŒü üßÁê én† X ¢¹Ò/ÿ®ü´ûìþ¬¼ôL‹þïúPö·ó’ó¯ôÝ÷?úàýYýïþ ÿ-ÿünûû2ü þ ÿÿÙ˳y“í>aQøz " *ø}ý&ùZõeòœòöô|÷ýüéóÙ ô @uÓ }Iÿ ûÀùG÷4õYõ9õ0ö-ø’û‹ýáþ†¡è›ÿÛýú÷ó+ðÔð‚òªöŸûßSŽ tRíJÎ ÖPû÷%ô‡óCòãôzöØùÊü¡þøÂñ ùbíú&ûÿø+öõ²ö?ø…úøýþþtÿË©aÿÒþòÿÿþŽþMþÛÿ¯C–œÀü´Ye”ÏN ˆN,%ò{öIYþ\üëüCúåøFöõyöˆø‰úWûàþjP­ a?ý7ûUûSûPû0ú2ùÆüÿ§fJõ  E ¸ <†°QþÁûW÷dõôýöÅùÁüÖ_w_ò þ éœ"ýŠúd÷róíð¬ïIðIóCöRù5üÿ`3ty h P=Ãaþ1û©ùYù<ûgþ 11 Ó  ·x ª V×žŽ„ýôú’÷ÖöÉö¿÷h÷Ž÷e÷»ù'úôüiýÉþ ý+übûÛûßû»úéúÝüþppÛ×eGŒÞ²öá^ƒÙÑÚ{C+t Dï6 Óyÿ>þBþ%ýðüÁû¨úÁûhýþ¯ÿÑÿþûïùðøö>ô÷ôÓö#øÍüìC«Õ O<þ µ 0|˜=` þ”ýÜýãþTþÏÿ *›´­"tMÿ¯ü†ù+õÍòð^ð*ò7õÏúþsó\çNLhmÏÆÿÈþýýÒüúüÔýäÿ½7³Ð±S#\ù.w…ÿÁýú†ø”øaú#ü¼þåÿÿ´­l4Uÿ´ýÿüˆû/úcùëùÌúcûýþ¨ÿídˆ=€½«£!†å ˆjÒ{É>ÀºC“CIKþü?ûŽû‡ü"ý þ!þýÿJÿ˜ ÿþQýÄþý¸üóûÜúìú±ûüBýÛÿ¶ãø œ f “žs†ÿbü,ùf÷åø?ù|û üéþ¢3¸8·-:ao5ÿqýzü&û¯ûuûûtûíüÅþdwó8:z¸þ û™ùãù?ùâûºýú5þd­^zB¡EÿAþŽýü‚üûÆû±ûÉü¢ýÜÿ@¤)ª~zÂÿ¿þ(üäü˜ýýþÿGô.Ó7DäþÜýÒý¢ý×ýÙý£ý³þÿÿÔ`Óï®C,ÿ„þøþÒÿ&ÿÿ™ÿPÿƒT¬A•6êˆ"ÿRýDû³úôúâûmüKýLþæåÌ«ïŸ^å‘ÿ[þ-üàûÀûQû€û¦üüìþ1ÿüø‡¡ùßtþ}ü–ûNûûîý7þ£r12”iÚÿÒÿ þ:ýCüuüEü¿ý“þhÿF%çűe¸qÿ²ýèüúuù¥úûÛý=þÈr+ 7_rË áÿÓÿ"þÏþüÿ} ‡;ÿ¢ÿ6ÿEÿ¹Fަwÿ¾ÿzÿþŽþ#þCÿ4Gùjç'º´ þlü¿ûû(û¬üÅþÿQ˜«-PÐÉ:¤ÿÉÿ)þÓþœþÐÿ`ÿÁ‚•Ϫ+QµÊÂþFü6úÆùúúúäûâý þHÿÊTpÜøµ'W_ÿ³ÿþ^ýòýéþ>þßÿmÿš%·öxI¹Ì]ÿ¨ýéü˜ûñûÑüSýJþÿªéDføi±õøÿôþþþDýÆý üƒüqüqü£ý<þÿH´Í;¹pó2ÿþïþ‹þ±ÿJVNæhöã ×ÿÛÿTÿYÿcÿxÿÍÿ÷ÿÌÿï1cI.ÿ¤ÿþXýÞýlýü˜ü\üÓýÜÿJÌ# br>Œ^ÿ,þÎþÒÿÿeÿßy>ü’à¤äo-ÿòÿ=þ‰þ ý¤ýqýXýxýÛþƒÿ•Ïä¥Þ¤_fÿýüqûÍû¬ûúüÝþ0ÿ¾<^@ÌÃgÔE¸eÿ•þÑþ~þjþ†þ×ÿPÿúšFÜíœTè þíýŒüŽü?ühüÔý~þUÿWT(½%¿OÞUÿ¼ÿZÿNÿnÿ \ˆ®ÃÎçëµ;ÿÆÿqÿþœþLþJþ¶ÿ{Mý~è21þ‰Üÿ/þ…þ"ýËý¡ý¼þ+þæÿ›g€¨î+ö€ÿåÿrÿBÿ'ÿÿ ÿCÿãÇ„å"N.Â<uÿtþ^ý€ý ýý–þFþìÿª‘kMG¤>¹ÿaþ¥þ,ýþýþýûþ!þƒÿ9ôÁJ’s²ÿ þýæý•ý²þþ…ÿÿÄTÇØ«Fç•Hÿøÿ¢ÿRÿ(ÿ8ÿeÿxÿ]ÿrÿÜ_ÄM9ú˜!ÿ™ÿþžþLþ9þ‰ÿÿ¦4ÈGs–ÿœÿQÿKÿKÿHÿaÿ›ÿûOp‰¥¿ïÇy6ÿòÿ¨ÿSþýþ¿þ£þ®ÿÿ´w„Êݦ*rÿžÿþªþ…þŠþ¶þéÿ+ÿ•-ÂýüðÒ£v4ÿÓÿ|ÿ/þíþ³þ”þ›þäÿn0óžÝÀtÓöÿ(þaýãýý‡ýËþ8þÑÿnçðßàùï¬^ÿÇÿrÿ.ÿþðÿÿ\ÿæ}s’}AàYÿ³ÿþ¡þdþzþÕÿZÿãS°1&÷¬d5 ÿÈÿ„ÿYÿGÿ:ÿ*ÿ1ÿUÿ~ÿ¬ÿïBº¿±Fÿâÿ~ÿ<ÿÿ,ÿwÿçfÖ;XFÿˆÿ©ÿaÿ3ÿ#ÿ+ÿHÿpÿ©ÿô*@GTdi_.ÿßÿ“ÿUÿ(ÿþíÿÿAÿÿÿxóZ‹‡a#½/ÿžÿ1þòþÜþßÿ ÿeÿÄ~Þ.&ߊ&ÿ¯ÿ>þïþ¹þ˜þ“þ¤þØÿ9ÿ¹>®ü!Íoÿ÷ÿÿIÿ>ÿ\ÿ|ÿ–ÿà \šÑùõÚ·„Bÿúÿ¨ÿeÿFÿ9ÿ:ÿNÿzÿµÿ÷>ÇÖÍPÿýÿ§ÿTÿþùÿÿ2ÿiÿ¦ÿè-q§¾´ŒW4'ÿ÷ÿãÿÓÿÙÿòÿýÿÿ!C]s€i.ÿëÿ²ÿŒÿmÿMÿ8ÿJÿ}ÿÀg¦ÕìàªXÿÿÿ¦ÿ\ÿ>ÿ?ÿKÿfÿ‹ÿ¹ÿí'Z’ž™…lEÿÙÿ³ÿ›ÿ†ÿnÿbÿxÿ¸ [¥ÞúïÅ~ÿºÿgÿ1ÿÿ%ÿ8ÿYÿŽÿÝ3u™¢˜„lK$ÿÛÿ²ÿ–ÿˆÿ…ÿÿžÿ¼ÿó6q™­¬˜n5ÿóÿ¦ÿdÿ;ÿ4ÿKÿvÿ´K‰©©˜€cF$ÿþÿÙÿµÿ™ÿÿ•ÿÿ¨ÿºÿ×.TdfbX@ÿæÿµÿÿŒÿ§ÿÑ+G[ieN)ÿÿÿÙÿ½ÿ¨ÿ˜ÿ’ÿœÿ²ÿÏÿð #5CUhqlZ=ÿîÿÇÿ§ÿ‘ÿÿ¦ÿËÿõ:SfmaCÿçÿÁÿ§ÿœÿÿ¬ÿÅÿáÿû&')061ÿçÿÏÿ¿ÿ¶ÿ¶ÿ¾ÿÍÿè 3Xp~sV*ÿüÿÓÿ·ÿ«ÿ«ÿ¹ÿÍÿâÿ÷ %*+( ÿÿÿêÿØÿËÿÃÿ¿ÿ¾ÿÀÿÈÿØÿñ*BNOI:$ ÿóÿàÿØÿÙÿáÿìÿü ,6:3%ÿûÿîÿãÿÞÿÝÿÚÿÚÿßÿåÿíÿù ÿ÷ÿëÿáÿÚÿ×ÿÛÿæÿô%1772& ÿúÿòÿìÿèÿèÿìÿñÿø  ÿùÿóÿîÿêÿèÿéÿîÿöÿÿ  ÿþÿùÿõÿóÿóÿôÿ÷ÿü ÿýÿûÿúÿúÿúÿüstk-4.5.0/rawwaves/crashcym.raw0000644000076600007660000011751012327014024014323 0ustar gary@<<>;;99;85655355233320/,-+-*-***+-/03JÒ[‘ÖAX +©Žû0Ð ê@[jìÁ­fÃÑ(Æüßš9K`µš9X]û[‡GŒï†[*Ô1éJiév¯ Gÿ ÏAë1ÞÂ×ó“É éÞó/˜’ó›&øx_w-}°ìþË&n ¡†Ï¬+Ø¥ öØ&q! >Sêc,CVVñß £\ÔY ½#ñ iܧð˜9Ô‡º%¡Np§dȲR©ÈÞß\“öÙä[å #˜Ñ“Äî²í´†ÐÇ ó9ùöVì)mÞÕ ‹—ð€ Ílä¼öæÁûPÿÊìÿÜ\QéÂ"ýƒ ·÷¶ïºÖV4–êèÔ×'P&ÃÑËõ‹4 ê{ÍRz+o·î÷þ&TÚã)ØO2¸VneØÕà£-T4‘óûûú|Z 8ךpïÀ7N¨ MÜÀ-yÿÈÀ» qêûá±ã,2êÜî(*Ö ÁD´èžÖÒAûÏq' fÖZ.‰ë¥ÔX¾6·¾ áìáô¬uÿb÷ÙÒ.uÉR¾èùýÆÙNÖqê ÷$ÓÐãn•Њû²™Áö^ü`Ïl‰-ÕŽ/'ùæ}ãE±ð÷¸K^ñþÙÞ ~?kÑä„'¤ÿHüñWW 'zòôì5õ<ý©²Šä63àJfì ǶãàtáÓ9Íåïƒü|RÅ™w©ù“ÝE&õÈ '/Òùl : …òáÕùÈôàÚùFéJß 6ÿ~¿¬²ØC×× =æDâÛü¾(*þ÷í²4|å|2IQ5—ñ©=>êfJ4aîB&§â3бJ ã»TËøÜõýtýëÑ}Úuøç€Ôtùõ$ùÁäÈO÷AÏ|! Ññ5]òç1Ž4Ñõ^åÄù&+†Ù«æà/²è«éÐßëò¦¯@ÿÙÙ¹ùAÞMÈ_¸þl¸ß`Oþ²ú['µ$*ó5רéK#ç…/1¼2 ¼-ŒæÅÛ¯þÙ)&.•àþ5ö<þös¸Ek$ô\YOê¼.¼&ÁÚ eù<õðïÒßꈥŒÚÌ ²Èê̓ڱïgÉ6ëîÆJõPñŠÛßßÄÕe!’«ñ$Öâê@›j9™863 9‹Sê)x9«PÂ@™Þ˜I7üDw0ôÙåÜæ”ܼòtáÎ˰³Vàwò"—ÞÀ³ÞÙþÌ“Ç÷qãö¼ªãÿðn¦ïSÜþýúRôBÜ,,<@Ô×?Ê=%;ÍmøG¢*\ªj(”å¯ÿ¶žêVPÝðÿVó ÷F'ì Ý7³ñÿ âæý"&æmÉ´)Ñ­öëú á æAä ¶çòÙ+£ý¬ØGýãÏÕ# ¨þ%õ¨Ì5'¶á¨0ÿ[1;æ÷~zwGIîààã%ˆ è‡ö±ÉQÁ êÞõ˜·ÞÕ¯NòôÛüU~YEXé"l=Ž+T+ï9—-C&µè2s Üû/íÞÛ»æ*ËÝ Êánê„°ë¾ïݶÎË! Ì´ÝRÛœÅXåuÔÓãøËéêñýóÈo)jñì )kׯ)œ$K¥÷ó¥MôËÓ' jê¹ÞÍíAøªûøeÚD¥øâêSûr—óý÷r×)ø¢(Åéü\¾ÐÔQ.# p#…#3-4@"ž ßä&'æ÷qäIý¿é‘÷Fù?ôzÕßÒ®ù>ñt0Ú쬾ûL ߯ù,Šñ µ úâ ö)—ë™æ Úëxîe¦ÀÊá÷ú—O A õ :Î|'7D—O s'~"ãê?)ý÷¤ôØüüÆØWý¸ý÷ªáؼ‘£$Ü~éÒ±¯±˜ÍMàùãÆÊfÑ×ü$ý­“ï‰b,›& %íñh!‰N¼ ëÉ.zB-!T 7€Õ9ü/ôž/zA@^-%?ìå×çªù óeö÷ϼ€ú:øðÙÊÙüÝêg4ñ6è÷ Tí­öÖþöÝLçø‰ ßÿe >ùâŠ*äpϾéâ"ðæ¿ñðVÄÿšçrßUu>ÙCô='¯üf9!­ -õùIBÀ Ž—7J'¾,þq$É -€ Ïò<ñª›Û>î$Öâ½X×PÛŠ7äá÷Æ}ÊÔԧżÏ$OÓF»u~ýAÿ{àÄ„0 Ñ+3!M#%C2&Ï‹!0s/¯0Bøha=Þ8µôWæpüAê•ôŠ ÷•ÃËBÿøí²Èên &óÿwåYðû¶ïëÈ×{)¿áêøúSÝnT-NÏîí’qôUÒÿaÿÓùx,÷¥6ã- Jøõþÿ=1cþò%î2jÅö-"ù;K9Jè›ÄOÛÎlÅñ+á°ÎÙæ<Æ»Ë ™ D† ˆø30]Ý#7.<‹ %X +ï$oñÝ9ãðzæbdòÁß0Ë÷½3í'¹4¸Z³çÁ]àçÌ:»hÙ\ÑâqÛR%3R|'³9-B}ðÓË•E¤ô4µ3·ÿAëµçé ¶‡ôEØÈ¾Íù*ã–úéMÔµØôÌï«úWýS$Whô]î"k?“L]|ï”!ÓöÅbÜÝ,ÛOáÍÙù: ,8µÖ¥èÌþ‚Ùôòó=³æ­ë7ßÜäÝ&Ï`àOÙ„ÙÎYî*þEÿR¯­îPõº X!à WÙq´ê*Ú3â Y)ïdEÌ×à.Q ø 2íãGä¯gÉyíÔæÌýëƒÜ;·Î;Å]ÄÜæÐæWá¶óÊ’ÕñìQó»÷ž oý-ïÆ Ò<«-‹ê` ®®3#FX‚Pf2&m0;U ûðHù=RòÏì¢îÜ`’Àâ°üËÌeæø5ìqÕÉ .¥Ýø0+Iýª˜åÿlñr*«eä¼ûµg :Ë­yø±ÞÀWø-ó”& ªù kó"öaõ!U=1 }õH*u"ˆì™,!ïªxjüÐÏìçájådä%ÈoãùçWèSîYëÜ Š #ê ´(†M&/«ÿµxô-$êáãx_ãðú¼á8ü_î«ç!ôÙîÜó¢áIÙ‘à† Šó¸ÖÞEoÁý:·ôÜ!Žô‚<",7ðLx pçÀk8³’ù ¦ P@Þ¢ü„û‰ó9­Þn,¡îìR6ré—ö²Ì UIýlTöëþ°Àùø QúìÈ ãÆ*üð}eÇôYðÕå‰Û ä2Ö×ì‚äïóñ ªøëu³{Æ$ 5š"*!½pèˆ œP6X iÅ-"tºÿ~ µÛ éÜÛ.Dܧ÷Ëoâùí&çeÙMçùäxò˜é<ò|ý|öÎOÕföÍÕÃî ]õ¶òÇ æãÛåE „þþý‡Œ '*7F4Ì!¥5ôp|Ò½+8ö—ðùÛøö™òhõçäŧØiÉÝêüÛ Æ0иéjÜmæ]ê›Ñ=ì3ÐØSà– Š ³qü¬ôN+Ó”úÆ(8ã ƒ Î.Ä“ ò¯±ÈïKì6Tí)ùQÿDù¬ôýëcð3¯’Ðìv-ó¾ žîëOþA ´aícÓ J~æÏþ ãÕØP ÆøÇŽ5Ò4ïK ûƒõ‘â— È›ÍI }æßâ/ø¦×Hõ¶ôáæ×9ê§æfäîàrÌÊìx€þ÷Îô™ü~E1j"1-­C_HX(,%®6’JÆC! M!ƒPù´ÞÔŒèLü/ߘë'óÊÞÚÆäòåsê+ÈÓÍÌÉ÷`Üwû|1C›êO3‹= h>w ‹'* ŸÝéècÿõ•ë  /þçàøávô "êð\ìæû ÷i ¹Ìâ[©­û‚îõXX$v pý ¹|î@·:—â”kžýèWåÉèé°õ‰ceÔ í8ÿcÜÅÝQÖ„âeÈñâzßÏ®ë)ï.êÁÅÞ]èÄï ÷>_ù±î !¡" ¿%WK¾I:V­;'åC)1¶4»òñÿ.—Ãó†þýýö®Ã¢òeÜSÑZÐòڹݟ»þâ?äsí½ÛþÉáéî=ÛŸÚü!›èV$p´> ïDK7D 44²}ß,£ñz“ôÿÿDý`åÄ/»Ùþ‘ü¢žõ*RíY ýW Ùü'ôkî7ø íl5íÍñß ôúŸ¸ý÷»öý›þH ÓðTéõðýáÜò¢óS{7ò¨Áõz*užû¯îVr÷ÛÞì&’é4:õ=ôWþ€Û¬ûØò‰ÿi]ËU ¡)ºëÓø›*Ã÷kãñýY$ ý<÷ãÒ gëXé…ê –ÿ`ÔYô(ãlÎFðúnþy=é‰ûÐ&§"¿ýÃ!ˆFò>Ñ/ˆÏü%×ÞP *{ä"±þ` œû¦ÍŠ÷¡Â ³ëkÕßÔìÆûÅÍkÒM ô>ÀÚÿ  í0FOB#’ýç]& ƒù9õ í2ø ümÿžÞ)Üøû2úÏñSÙŽí·Xñ‹çÈ«Ùãñ²ñ= —êóÌXï ú²öúÇ¿úMújðÁäFÐÊCâØåKòtê7Úß79Ø2×ê ,DzC p6ÕA¹96¡'. ´‰#º'ªä<ñ]ÿ¥bàßû;ößÚ ¿PÞiý²òE ¾ÁçÆâ2çIƒ‡þœýÜ)ÿ4 õ ô(ðÈìÂîì*çÅî'ùã6øÆôö™éôÜ,ØýÙãÜ 5ÿy„*׸!N#¦!'™ Ø9ne_}ÎõÛ¬î[YëªÂÁÓ°Ùúßõª½ä– ˆÎóæ +>Œ3" L`ø7"®ßêçi>ø~ð… °õØ=õïäæa Ê -óSïÿ_ñÇà=üâñÓó ÿò÷¸`— (ê Zö†ÖW«îð·ùnçÍ8* SWåkàw ûÜÖ ž Ô± >ùÇÉ,ùPòRõ\x Kü^Þ}hîêÔü³þ «÷Ûë£A í;øèØìô>Ñh®UðjìðôÂùôïpPàì›Wæ úô* < ­1‡ ÷è:Ÿ¥ /!ý, R Eè‡ÿÒáŠÿUþÀÞ ëþÏlÜ8ïòùÍàì4úëþ†ä— ‰ûé¡ÙäÚïî6á>ûòüØé¯Ì `ãr¬~ì*.ÿµ qóB áw‘ “R/Œ&2îR,@&Ÿ'Ž&±*û¹!üWëþçé.À áè ÂÌ*¡•Öçý̉úLê\èÅBŒú – ÷ð½ç$#qÚ­ ÄüêõHã îsæî2ýdììÔ@ ýÛžó>ý[ü!»£ .ž+/rjó:+K)‰ãéRèŒòëð ÿ³Ú¼Êz¡éUÊÏêáŽç±çüýrê^ô] ‚Ûq²!#–ù\> ùÿÌç.è* Dôàïmú:íñìð÷ÕÀáéïgé«âé-óððéý‚9ˆÌ /ü…ö`iôü^ôàöÜåú?¿ûêÿÔÿÅ u=%*¤ °+rè×NÀÛì…MóÌ“åûö”ùbêÙáqóN/Yë=ôx1@ëò!ý@)?E0™‚æ0,à‰Ä „ÎÛ“áç%õKuíàߨ*Þp ÷üîýçëwžñõ[„ÿ…ýØÿÍÿÇ Y±,ûP6ˆT åþ] Q{úKò3Ššÿ6å“Ù;ý«Ò!ÙîëÚ áï?Öמûöéäéø­è ïÅü(õ¶‡ÿ "Ê Ð'œ"$\îè!N$Ðs Ÿ){Ûáñœ³ið¯íÝ÷| Vû ú§… õõYB _ò7 ²å¢Ï3ëòìDüOôØóQw ×,ÏFtsäüûêSKËú Ú;Mñ¥%Í#è" Ô Ö-Ÿ\ô&xÛÜÝÙHóÈôœíÜÓì´îÍï@ àó”ä1é…ê ‡íïøÉñÈøbúLõóëû%†ð í"¦Ð÷¼ÿ&µ‰(ºÌðÓI©ý£&îªõg°òšî>«ð×ê±rïN£è]ѯä_ò÷,í²÷ ó¢á'þÚyï˜êûü¬ñ%s-šeð´ö™Åœ” ©ù Ù÷äŠ “hóÕ8ü‹òŒðÎêÖÓâñéé5ìÜÞ)òœJþ4øýÆ Ó +÷Rû5#$Ý À#†§õµí¿ýQð6åîÄófø9ä%ÕšååöÞ-åÓÒ]à¤ßÐÖò޲ÿá 0u)(®l4Ò%ÝûŒá9 7ðúX®#7î€õÃöÌóÇ·ä^î&ùü ÌÙð ÷>ÝÑÙLÞÐî"êÞ¢å·Ú׎óÓå ìãpðÇô›è‹ÙûHæäê¸æ] ?áÞúê O> 5H%Ã"p+*Ø{&é/ýû|êBä}ûËåVíŠèÂî\ÛþæJÓä÷Jäöì}ÜÓçÂÿºîûòâ 9µóã(úôÁ‰~©]ë,Â$¼ Œ¾ ÒúÚ¿þ¬  šù¬ò<ßJôT Âó—Þ½ãèãëýFäÖ6çQøŒêÉðÎõ±ÿ ügpåø "KÌ&9 [0,ˆ,NšËÞé¾®&'ó@ë#éþýõö¡ä Ñ$Þøì[áÏæŽÐÂÊÕèæûuÖõð}þqþo¶}f"F 1ø%¾×ø ½öåÐ8} ë Z÷é.ð(¡öéöýSê -íšìü÷õ&Fõì˜ò8 ù>àùªxôŽ œýÀ>Fh÷‰ K‹ÿ9C l &Á ÿ+ùÝ oðÅÿ­î¹ZøýáÞSÞØ ß‹ëÙð^äŠ 5$ò‡÷J¡0ú(¸%£ Íç%ä"+QY!ß ¶ºømû Hô Âï¾ô#ü“â2ÔBå•íiÙ>çÉÒ,Ø@ê§ï®ÖlÒ}=ßRálüðæ5íRñÎS”$z2kù€îýŒèç ‹ ÷~ßúöÆ6¸úL òvð-"àzã”õÊÿ÷SòxþµúçìÎõ6óÿû$íÁöðêÿøªž°ê…[*ä}üï"¿ ú&a ì ‚ñ¿÷ëù¯€›ófåÍøÚwýâî…û%ñ|û¤àpò8Rü[èôBv÷KªýKOËø$ö*ï xàÿ¡ t+ÓpŒþú ìúÒÉ4å¶óœè%ׯÎtéw÷„Þøçgî,ð6ÞQþ•^ÿ‘ ‹ß4 g§ ^åŸâZŒBÞüôæ,ô\"EŸíïäú¢™öÄÐSé‘*ª+Øî[ïÙ5æïgøï }ÿÞÿ}N ql9 Fù×úý¦ •ÿŠX"úœê÷ü ï!ù°âÍáÞ…õÕûèÚ¦Á׆×#á}äiéRÉô½òâØWQæüÀô· ê óö7‰e Ü £¥,; jªž »C3³é>-Pú"*ý5Ð<î5ÿdñ8ç¥ÞÌIâgàÛÖ1ÐKêHíŒÒöUôÍæfûöû4ÿ,I•À?º™óË'}!”ç´ í Þ­ñ$úÞ´TÑDåóXþ;ÃåÝîWýº÷¢Ë þ Ö Ú‰!…"þÑ)#Xó_##Òõ·øò¨áxõ›ô¨ã’ë§ù4·ñÅàœìŒ½†èTÖôP `äl©üð úü ë#  r%7%D3 7È ˆ $%‰ÔX üífÓW÷ývöDÕêøìßñMáøÒÉÞ¢ÊÄÌÏß\îHîÜò%™xUùgGÎkà&Â& ‚{ûï¯ bEëƲû ûuþpü1ÿAáÄÏ\áî§ÌÀÛpÓ.Üäõà2ÖŸã95í;ðšêâ2*Ü 3 . ÷#"W €4ë,ëÎ_„"X¶ wFè¦éyö€òrõ-̶»¨ç{éeݤébÛÖæ˜õñgÝ‘õȱúÐÎêk L$¿~§ý`56aÛɬ œþô÷ÍòŸëÃï^õ í ãýçÎé·ÑÏó^ò‹öGõ÷ö÷Õäb• ± jy­ü(XZú dýs iþ¶êFý{õØè+çxèŸê!ðoгÓ%ü׬×Yøò×dç6í ä{þá†úMýù älq'2MÏŸ$ÿ#O#Ö$±JøTÂ#D ø)ò=îBô ˜ß%âþÒöÞõºñàìÜ9ÈÓàÅû‚í¹ØÜÖãŠtí‘äôñ•þMSäG)áéÈò™#$ü<Âÿ)nùòÖõ¹$X ûÑï‹ê¶÷vÛéÝvë„ΪáÚÜ¥¾K·òëûç¬çl Åû¬ ݱ²-·×hþf«ë+ŠúGïÂýqäì>ÿ¢ñö÷›ï&ß,àˆòóïGɒׇï÷ëïÊ/óièñüŽ€£ïÊ[ ­2c-ŒÂû$­*+üáû“%›#«ll ™#©ü©é˜ÝóâgÍ}Ø.öà–Ïšðà‡äüüöøípË÷ð ¤' ô ®…`!ï'·øuWF^ ÇáA3¯gðÉGþ3Õ8æ-çCéù®áØð·ü6ååöà[ø ö ß®•'/ê S0\ý#Ýï"“o&9Ñ ` 4ü>ùú#ÿêï`Ú²ëÜîÉ>Çvë>î$Ù¢åýÓíÌ-å?þëüõr “~þë(àç 3 ƒ<µ¨gõ ˜3Kóêà Ãæø. ± ê<œ·óðîåìàXô$ë‹î÷ìMñ¤×ê<Ý÷dû£ëŽó>ïO9/çé?= < Õ ¥ú| ̶Z_ù¢ ô &jfûx ±ú|íQ·:ùÉûKîÔó”ýîèò¾ Öêˆ÷þôJ(–õæú` „9Œ ëû{ˆùGû! ­&ÉÙúé (4 qé~êhÕù¾Ûaæ†ù;ñÔEÞ’é8ïÒÝÎÏVó‹øaõ edÁ ÿ% a å%Øv 9$èÄ®#ÿê¢JHØ÷WüüƒúÒÛ¾ë*2õëðñìí¯íë#`ü›öï_ú"ùüàü*à“Á•òÔùcöóE 7æ¼Â5ǽþ>A±q¨ëq÷tÄýðø”ËîYÔñ^êµñSã¥âþkÕüÎ÷¾ÿÞþôˆûóúÏ@øò  Uø›!¬™þ?ðZ¦¬ü`ëaòëõyó&ÚbÖç/ßXåéêMÜjç$üØEïø ~ø"åÕù [ ½üüÇÿF÷¥ ò†óÙóÅIf÷|sj÷äã>à¡Jï„ý¨è°âïá@ô'îrðqñ˜  õÜëFØû“é0ùõüàí¬ôõõ_üØþ¬÷®\ý¡þß ò³ ÿP Ô«ÿñï c•ögïü1©8äHù2e ¿îîõ¹#·"éýž€CªêžüYíúÝûËïGö‚îøy¿ Yýó (.3fSüÔðšï_ hö—Üžü`>ø0öÍõzæŽùq‰è¡û©Œö£Ê ¡ú±í‰  Z þ÷ÿwýb:ƒÌÁúð› çþLý”ø–øýóƒõµ—ûvòåë‹¿ ã&ühò»÷ä÷…õåö3îîýÂæø†ôAôXÿ¹ ®þŒ ¯ ZpÃ'_.þ÷žSEüQú†ùê!Œë¼×}üê ¼ôEâYä\êaò§œÛ?àÐÿ)úÆí;çËÃPïo¦ ëA –=·+ ÝŽÌ 3¨‹ ®ªì¯å‰õMïÉû}ä°àÁ[úMØòâãùûUö2Ù ä”ù óäïé:5bù©Ø–*Nœ¨MUãô # wóKò^Çuê×è‘í þz;ø%ãƒð Ãÿ5ô¥ù}…úÿÿ¤ì}çüCÿdŽ è ¢"zèùvüø Ô¶æ © àëšðuðÃìðCëŠîˆÿ¶íQÑ’ò{ö¾å"û·–ì Üôüïhüóþ4à½øC †û?ÿi–&É$3¦fêè {eäÞˆ%ì…úséçäìôøæâ–ÒyåèßIã“ôýã6Ñ£ë™ýbö™öò  ¬é.ö´J(&ÿKÚ ûÛ $ðZ òû1î]zêþ à»ü÷ ô†mÿ­øÏ÷ÄÚù#±óñïKå®í5ùöûƒ¤çÏê‰çzç®ïû$ýˆýÊþªö^×â!õüÈö˜ß\< „ß_Wð@:ÿæó4öë—ç@íÒáýÙ÷jï¡ÿXýõýéìøTúö õ1 ‹$üQÏM X鿨y(/MùÑùíü* Þ Ï nYýŽ ñ øèñkÿSÿ/õôó(ŽûEèøòMÿžËÚ4Ò iùê¿öŠ–÷9žåó¿ HZ ‚ÿ Ö{ A ö’²T"@üž îýÂóåíIû5 ckßXã¨ìŸxëBÐí~ÌîëûÎ.„DÕ h<-¶üa-°2òbãl °ÿÝónôóbøðe Mêlõ*ý%õ´êaåõIèaï÷— -ü#ù°üA +DåË”ý“ ùòú…Èá ö;¯¸øJînôœNýh¸ñº ¯æÞ¾ô‹æ^û-SåÌèû'ÆîÆÜÿìÉE'ý. þ[ í¹öÞK$Îú|ô ‡Å÷ÆþHò1úrõì´ú#÷íùÉ&/èì»ÿbgÒÿòîpÿ¸ûø\µ /Tþ¦ôsî$º¶H °¼œÞ~ õݧÞB÷!õdð¾âû Îî!ïx÷ý þ€çúßï£ .ÿx÷î©îƒù‰ Pøñá?ò½e&úÎêÁ22øŠéÁý£*O%Üô¾û=-Úüàóüô I°ê\ò ’ÿ2ñ‹Ÿ*ö‰ þóë-òäòxóèGóÄý|š _û(/÷è{èéøâ <øñ ÄÿÝ©Ïôaò} ¿ý@þSÁ€ íýÛãL‚öâÔñö©ú°ð1ðëãéðÙÛß¶ãùYúOðxþ?©¡ypÀz!L ¾ãyÿ(ýg÷à<èçÛ¢ôSîkßIõ×Þóè@ùëßGçžò*ð÷ ýÿŒ÷§ÎS/ÖŸO þÕ Ó¨ ø·÷së Võuç¯÷ýô­ÒFðÎïm"ôgë‘üWýþûŸ Íû(òOÞEÝOðpþy ‚ñèèŽ&÷èéúõO9¹ `ÉšÆv‹ Ï݇ ¨ñmö–DÏû¥ò¼òÅèú,ûç÷ÙÎôžîõöè/ð¸aPøLxþ“5thEˆ!Sw"° ø÷í öÿžðü­’püLùCå~óã ×óäðEùŠç»ù“Lïúõ½F„îf"þXÿàé 21ÔƒóÄåûø  ø >Ëý(V Ê.ü:î¼ôJt ñ7ôÝü×õ0ù ç/ìRÍþfò›û¤ ó ýÔøÅ ¦Ï ”íƒè Ò ³v0… ÉæìÈî&™b˜þwñÉåÛû.ìÊ÷-ì#ó©îÅìäösíáŒíÑîL÷BœøóûgéMõe ïû]ó AÂ(€Ú‡I!C!} Þ !x^û¢ìÑþÏÂãéâ}Þå4ô ÜÛøî¦î^ácì*ñkÿ€lVúu QŒ¡<~Ù‰ø$lvŸþ û¢’’å2èƒ÷NæXçåë’è×Ümí‹ý±ýmó>éÛ ç þëý†ÀˆŒb!±ÿÎõB¨æøqëNM +îIæ)ö`îÌó×èJÑ«ñ9ññ¨åèðÎá í6ù ù¡ïÞäùý‡¼¸ìý Z'$þ+[4—ô ¬ü¿÷m§Âõpî}#ö~ýaDmïé^ú$òþRø›óKø«ù#ù¼ôBé«Üèjý<áÝé¿òbè’ÿ=üb§R^Ñ#i .ù]  Ðÿ+þdûø|íõàmç|×;õ¯îgý/°ïF꾘ó™>üJ šœèþõ“Ø(ý¼ùnò‹xEûæöhî&ä²ü/ñÏîëñˆüí!êUô<æ þ£ÿµ÷NÏ yÿPût [ôEæáú²i Óñƒï ù¨ ‚ÿ¢îø‰ Èóøíe„ž~,Â%ý“ÿ‹úî ÍéŽñý Ô "ô~öMÿZÝ~ü†Û·üøBþ‰ó¼ô<ý»‚üëôIì©þÕôX ð4 -Œ¦{#ò |Ce®Hk¹ó~ ÐõFà$òø×ê ÷ñ÷Ùî'÷>ìã0÷r Fù]óóùÒó,„ D ¨E"cƒÚ˜+W|Š Z ËG¯góüÅÿþ.ðBè×øüûãæþäúKüx÷÷åfü:ù¹Fúƒé×ïûV©Líýðî—Oúwô‹ÿ#ŽA÷Ì4%êóIî­Yó ¿äZúäûÑÿ$¨÷3êãìòý ´ø5òtÞ^ä þ$ñ¬ãßïÍ<ðÚëú‘A`þ4-üà h¶ý¡ ß Ð÷v $îý]âëôPÔ{ñ•þMõ@î€þdúJïŒôéý$ô5[ýþûŠû/`4 Ú ” ½$ ØöYþÛÙE™òÑ  êöCñ.6ÿùõ1éää9èQù÷ýàyîEþhññýªúÒð¤ö-r÷õüŠî(ûÇùø¸ d ü $ú³ñ5ÿâS tÿœýÚPõ!j%ü€ tI€Ãû/ìõÅþwó¸ýüóßä+÷~ì`Ñìu¡õáàkýéö­€ gòTüø)óÛ ]Ó ü‹¢Añ‹4 v÷¡ízôOù”Sûügô ç6øÖ«ÿÃçâZíÎÝúï, øø@Xü¯ý‘ý× ¶Føéþa0aíÈë%œLøÑö ïû¢°íSñ÷ûŸÿ:øÆòãüÿîƒÿáýÅèròhÙíÎçaöT÷¢/üÈó;ðü÷ú÷üüZ ;øøïUý¸ ­ûßöaäLûŽÔþíóÕû1íX<¾ýçþNÿ¯¡Pû´úÏ&Ûô5 ö Û± x̵Ì(6» iËý(ú=éˆû|@û éoó] cFþaûe÷pðˆ¬mý J«• øØkWÿÀû?¼òèœþøüó%û?ûo ^ó–àñÅü¯ó…Ó1ý3-½î3þhúÂjÿù ü÷àù&ÿzYé é¦ùîïæ §ßûGøþeþ’óeúÍûIî¥òYçØöv°öÞ$ðe¡ô±öþúfÏ ×þª o#}¾EbþP, ¢§,Õþøþ¦ˆyû1—ó3þ™‡ü!÷Eÿ9ò@óô1>ùïµèóü C®?ïwôÃýFôïñTG *ýaõ’èp–‚ï¥ûõgød’ ¿üùAøó} Ù 8lýnúÿ_ûñî Î ± Þú;€:¼?þƒøôásþŒã÷Cb¨ñ/êèþB ø‘çNùÅõ—÷VøçøsüSõ_ø~îÔìfö2ÏøØï[ù!Š0 × ~y˜þâ#œC¹ É\Üëþ˜ÿÕh ÷vóZ wþë­çÁÿöÿøŸùÊã38õëz ŠóâåÄ—!ÿLü¿ñè÷{îšé¹ûTƒýøqæséDÇ^êácþo\ ˜ _«Hû‚ ãÝôpuÿtׂý “SúÈï[ü$÷Jþõ[õôïû«MøÜùø[é!îìõ÷õK¹ðsóý÷ 6Áöõ÷sôîÿYŽûòì²ísúÕø?þ6ë“öK®±Òûó0 Ö ™ ù, * þüN ç[ÛÙõˆ†ì5ÑÂàûÖáŸìêúûýö EîEé"U¥/êñ8Â'"ƒ÷“C ql@ ûªýǼûÓ‰ðpì&û±äðä#üWÿãìŽðrñF¾ üîªüÅ1 Äðjû¤{C ýöÇëä{ Ç .3íÆ‰^ú²b ü vúaF˜ ûø"þ‰ùë“xðšêÀ ÔäHâêü–öÈÌ sþ(GvòVû$þ _|û/ôôº|ÿ™ ; ¡þjÙøtö~ð.ç{ð¥:ôï@ìêï=ÿZý$õ”íùðäQù¦q-ßþÄê h ìÁ õ î¨ßå%Ã> Í ¯O›¶èýiþ%1úPóù½øÿñÑï3ðcöœÝRçñåÇé ô‰ë¬ù`öšø ösöHРãPi[›G9(÷~j ˜þ [÷Rð[‹ X@ëVáãîéú æóÝ#ölõ¾ô¸úUûSÌ ”þ#ÏÞÙ4Çúºóˆy÷Â÷wþiþÕñ-äÅó׌üývñ™ë5µìù7䂸J§ú®êdýºø™øYùªëÈõ7­ÿ´ ^o"·xøŠ2mÀ> û#ý–H ³®Á@Zøgÿ|ðÜÛvàdþ–û‹ò]î$ïzçÔóÑü û¢3ÿaöõTô:øÀþ² Æ®õ ©n1ÿó‰#8 ›˜ùÿ:óÆ Ìò° %í–óæü Ëþ  iIûsþ,÷ýýü·þ?ê^ûƒ¸D¿òçñ|û-ì2æ ¥@øEûû#ž Üõ(ùÆÿuûñïøù¬22óÙó¯ GÄ} Ÿôäú£}¤ø#ôyü¥^ÿJíÄûhùaýröÛýåò+ñê º "öþ DúX ÷èüþàÛ Ðþ(ˆü¦øî½ÿ³ú“æåáqðÇìÏömüúvènñõçÔÜ› ø \ýófønÿ–õìzú(÷G¥I ýøQÿ´÷¤IûôýKû·øþ”’þ0qû—úOùߪˆ àóÞò®û‰~û ó‹Ùûýq÷)õ}üÊõ¹óc Z= *=þ%ÞøÚ ÄïÿhìŒôGøfö§„÷•çQïù+ôôöVóÃð‹CõçáKèš)—þ’ùKüZ ý$í!‹æ%…Ü ,&|$ãDÿÒ Ô úñË\ù_Åü\ö óÏòÒú_ï»óÛëMð÷ø‘ø´óö üâøù¼ø]±ø öë¾ò‘1Øê¡˜ šôÌÞŸÒý úýAJì ù º ?ÜEÝ0 ” #ÿŒ[IÄ —ö÷Xe Cû êšî3òRïÖþ)îèù;ûút òø*Fú˜çÑï{úÇ÷.ñîÑüJþˆü öšïõÖñ*&0HŒþ//þ{Úrþ°üú•øìýXú(×ðÔ0ô ÈúyðÙù±®sì+ý-ý»÷£ôœöý­ýöùõ@ò ÿuòÄíSú4”Îûjò»ónÿŒú„óéðÝøû|ÇÛýy÷»3Zžþ< è Fù#Ùü±v½õ\íùÿ*ú´øÄùrñ¢òƒÑØõDÇ ÛüDD¬îè÷m §ÈÂøé÷þùùýµûZñÄëmôZvý¢eò”ðýú>Ìý7÷ÔøÄÿóØû‚ ¬Âÿ¥Vÿ ú…KÍúðþ”ùoù¹þ”‚û¯ûýõâüKI ¾÷hð ó”¢6ð¡õ{-ôLô|çýdë„úk O@ðxô, nÓ÷Ïë<çû¤û5ùw ê”ýAðdb4÷A› …ú:þA…÷(üiø‡ôË ørìwòóú  f÷"øÜó`÷^¯ÿ¦ä¿ùõýÁîú"í¢÷¡ ÷žê[ ‰• Òü>†ŽŸ"°xõùð_÷ñŒí›úç¯ë<ê+ò©û¢ô$ó»ôŸö÷óuûly4 „ø6GÏ¿/tò4â £Ïÿý= Å ²õ ö# ãøTö÷zêõ°vñü÷ÐüÜÁ[hkËù9ø; [DÏhóµËù!÷Ãõ)ñ”üºý„ë;ò•½ ý+døÈä´¸? ùø O’Vóîî3õ û ûcð?ïªñ3è ó6? ¨`Ñ íö:, Ð̓UãÏ +‰ ÷ jþìSî“ óÝãë7‘û÷Øý2òdíqðØþ xæå\Äÿ'‡= >ùÑýòù‰ 6 °3 ¦õä j_…Óþ®ò¾ û#ʆþ›T¶ñÊû ÂüÛá6ð2ùÔ´þèî5øËöU*ý»÷Äâ÷U ,ó„û›Áÿ¡tƒ p¼D=1ªÄûüÞ÷Fýxûëì€õµ8ó(ñÙüi‹ô3à´ìjú™ í óí¦ïýmí à þóîþüD 9oòÇ®& êÿç ·aü+õ8Ÿú\ùÐúíïpñöäó ó\øjéÆõCûEæ÷ë¯õ8ûGúÞö¸üèo—'Ÿo´ÿOË ÀJ Q†A,¤)ç”÷‡ûÀBúëˆò¨ûPúåþ?êÀòW`’šørñ¤ôþô±þåü(i ÑRf Ñ VüIÝ dÅ` ‘e$rö]ú þHîíìïøBñ±êkõºæôó-ê)÷õMòóóúÿ]]ËH¥Z %]¿% 2þ÷ q | Õ.ªíµî ümõ8ãcêçjðDñ®ïªöðˆîêóé­ïHÿø øÇõíþ ýL©:ù×÷1è  /ú¦÷µäûçöNQüjûC¼ëm÷wþÁ¨ ¹ÿqBf^ r ¸,çZûªOõ ëõóO ]ùÓïŒ÷ÙFâ ¨ Òøùø &ºþâÿ9múïóôðFDýXú"öúr U§ô›ôôô;écþ µç±Þ1÷ âû˜òÛv iÎ ¸b 7#MJ ùêþFÿgµÌûÃù´ø'þõþöî‘ýHü!ýHÆûÙÆÎé±ï½ñýîÐúØö7$öúpùüô›? ûÇâ 9¹©¿í ÷ä-Ùã•™ý òZ î[»ýô-û¬ ¶ÿ¸øbýóoû¢Ò -ùöOþ…„ì\Zþa í êûXöU Œÿ©ïÄøúO ‘ûû¤ýÌüïøâûGØ¡ìNò: ¼ wû/÷ñk ¯òªûÐ÷ìê¤úª¿þe} °øZ %Òëó}фђ™ žë:öËÿ\þ®àêFá±?ÂíáÍì.ù:©øêï0õ‘öû÷m‘ýÿû¸ý1óñø ñ yþ—¸g €öÍóÕó!–ûf4ô|÷ & Ôýýñ"õ˜ØðÇùþЀÍïÿÀ·—âù×û¶õ¯äÿÿ#ü<í5ôbóð4ýöiô„ …°üïù÷” ;i)hî¢;Œz ÿÂÓîõµmþù÷!¾õˆüùúõ=î÷ð…ü²ï£êkôÝïÄöæý]` Wý!öú›Ø)¡ ªÿÖ½7HÜ/ûH [Šø“Ñòø~ï#õ` .Vë¿øí÷&ö ü!óïí}ñÿÀÿ²ôëò\ñŽûÏôû+þÆòà ÝO„‘Îó$ŸXúƒüÍ÷ëë ÷/•ûòí®ônï·öMðÚè¼ôòþPô©ðuð/õ›ü¨5öjþïóüò…š‚Ø Û`s ¡Ò `Íüêó)ø¹þ‘/Nñ‹ú³õðéì÷Ð íuõRù ï±ôEûl¥õ‰ûÚm z)ùñú ®4 ɧPkã8-iúIˆ.øêù»øÑöyûÔ ªë&áÇÇù»ùýüZ²þ6 þ $ Ú Åp Ða â µ Ù ² oöåüp-û÷ú‰­ÿ6ôfüTúbûïñµüÅÿùó$þëøô¾û”þRp Ú|Á 6 S ?nmÑ Ú}äönôDýåþ©ÿ›óµò?/ Ìÿ´úw¬¨ÓýÞ÷ö3`Ñ= ãŠÙöªükÕÛù²ûLîÊûè)‡tð÷ê°ý+ûtÿrú—óÁø¹íÍþsø„ ´Øü¨3úÖþåûBôÂí~úè ¹ò)ùØ? j ©úkJ ÿ¹õúö á Ôù ö3ó÷%J…øïJõþ›û•ðÌãæšçnô˜ýÈöSôWñý² Sö ÷aÿ\u t ´¤doÇ çcüÄ_ Ù÷ðÖú“!ÿý^ŸÆþ~ 4U•õhò–j9]óéñüFùÿEþ-'òž‰“ù‹úŠýaû'ýöáÅ 'ùkéAùà/ ÷»-ÿä,Š@ ­ókêèöúåöwïLþrþöíõ¢ýaþ aýÍõ þ_ÿá i ÜKeÿºJ þú÷xÇ ôödðïø„LTù~ôäúòêúûÕîñýþñXæÉþÕö:Dóšî]ÿ™ ÿ× *ï>ïÂùê1 ÷æúƒòt÷½ Õ ?þFèZün Ï K Ã" Ëûxû´ú"ðŒúŽýî¹öiýØWþö*ûºÿ>ÿõ‚ëðê’Ÿ÷³òYþùý7þÈøyú*ûH¿˜ Ú =û°÷PNýòþ¼ýHü³ññÁùF HûÂì@õöüü¨úJøeúcÖÕòÊó :'þÛÿÿérBø]²øFý|þ«ö´û¶À üSý1« ˜«ãúÆöëó/·ùk} kä÷@ò^ý­ùÚõ–ú{"ûõø®úKûÚÕ SïþôšÿE»Dö2ö¿×¹:…IÅ 4"¦2Æüa ︙Ìû˜u÷ï5gˆ÷žôèæüõú›îÖõ‹ûºôúû\ë‹ãdþRÜüõô¡v &ËéÕ÷s œùmø(M Ñ J)÷©“¹ôíýáŽüùÑæ·õm)®ðÿñ ðˆÀ±ÇöÅÃÞ-ô %Ø”ùŠ » \ôîô½û¬_ÞómæüîûDû.ýFïvëúUþœñÕòbüý›ù ÷™ù—ü}þš oÚúeøjæy j5ñ`þæ -üþýÏü”ª”~ôîûöü íÇëSêpPú­ïeîèû±ûðõ¢ëYø ×ùÀùŽôFú ©çûBùODGÚ î ‘[ý7ö“±õ ;òÃÃ(ø÷ &ü“ñ-ðmù: ª÷bãÃòÜùdí‹ú úêõ«ñhô=. ÿaöåÿº  q’ò +‚ÝùÜ>O„øÚô‹øxÿ¥Dó›ékúúîáñïß/ý±úÍöÃö†  Ë÷ûXøX °ÎðæöÏM @ÿ'èQú¹£]‰ýY gþ. ¬ /Õø€ÿ7tÿõ þcrø+ ý_õgÿ—ü« jÿø õaü9K¨öKìçû$Ðñ¥ùg( ûõŒ÷z ÉÆþ<Æý1 *Où:ý,» gùxúÛ€tûQöoúýFùJúñüîöËú²õÞìôðÿnòbë3ïE| üOõ-ÿà·IÒL ¿ôÂÿ,çL åª à Rý½ý¨øÍñrùFüäþDóò´èÇÜZñþìíçƒù¸ý¿øöþû&† ‚ýOõÎý¬³ý< §;ÿ¥žr ̤ í )p üôÿ؆ oüƒ d &x¬úv^Ûü øðÿñ€2‹ÿ¸C¦ÐóÒú¡²û¤ûmó»ú‘ ñ~ûÛò›¹ 7ÿ[øÌš&6þ—ý­ûëåûÊû©ï>èó,¤÷:ül½‚öJôî…š¹ ï L– ‡'' *Mð ÷÷ŒüŒÿÎhüÙþ ÷òòWü"óHòÑôsú#ö(ýªý¦ýÑÌý7ôgýH‘Móõ†öû¹»ÿûTíý Çû¯ùdÿÿÜÏûþüzNÂŽëþ„ÿhü¢ úãýJñªöš ZúP÷y6öïzôÒóˆúÞùäô÷UÅövn ™÷aüž; wøiüÂöÛø¿ÿrý×ëò*ú[ùöGû üüå÷zúz+ñÖü+gøÛiû?wN ž /þQñàûrñ$ïOö‹ýŸñ»þ³êÿú]ýSc ¦‹z¯þXã yeåü&ùzúiôtï—òžðjö6÷b„ü5öÀøvõ\ÿa÷ù÷ú ^ü b øiå7í´÷“ ˆ^ ø¿ô0÷× ¸çÍìOï‰ë ýÃýýòò`÷ªýòõdödñúþÉ › Äþ° øúäÜB ™9þC» ‰ @÷Íø¢þ^òuù}ñìþJtþ]ôºø'þõÍþõÙû àó;ðí÷:ùø}ø–™  Ï öñþzüjòÅúb ¾-üªsü[ùq @üËø Ü9ûüýÞÿeé‚ùûÿ8cüQëmôVýžÎòëàûÉJþôþIñ9ò&üÿóîŠìÈý'ÿÿñétø'õ¾mÿ$š ÕôýñE?  ,  p—ÿZþc ½ºÿ®fÿŠÿeüù~üy÷+üAû†òHøòùµ½ühºÿ³þÀÞ ·øˆ† ±£úìvù†ø<ÿ"ý¼ÿnú!±Vç‹þzX ìÿÙËÓÔùØ Ó Çe`ý¤ý®;û}ö|ùïîGú~ð`îýG2ùfôTþô‹þo íàüb±ÿˆì²±ò2îOú'ûE?øŠò4û ÿä÷9âøCŽ`ÿ% èËá G! æ²1 ^C ‹ öaáø6ìÄð”òwö[øåíÍîçjê@ð=ûtô¶êÊýãüÛ­',™Ú z\ Ï™ öó—ô"<È ÄöMý.üÿëüÙ-g÷‘þÑlù,ïÜz§ýžûPø\&õ¼ï)÷Xý…ôÜó”õ- )ýníûøÿ×Ñûëï‘þåÄþ÷)ùëÿ ÿrÿ7óoýàý›ûHÿ ý ü:¢tùUCþ')zþ— ˜÷ ù^ü‘ÿ0äóõôõþ4C=þ^þÕzeïöœ¸<úFúÄÿØ(øL; fý‰ð¯ÿ² £¨¬1þ°Õô7úØÇò¼ó¸f€øÕû×{ [øÿiÑ ² wig ¿ F¨þ±þB÷óøñ¹ùMþ±ê•ìoþNõôàõìëÊÐAøŽûÎýÍæŒ ÐîõèP ¬ ÷ è“ u†ÁñvõlÒù"ú¿ùóì*ôÆò!øßòÌó‰ûê <þåÿ”m*üuúÙý2þàú¤ÇFô ÿu™Ù€û«øZøuý¦ë<÷ï÷uþ­þyûJþïðíýû$ÿý,ôàýyúñ”öZÎXúÎöŽûŽþJúOn- 7ýÝ ë“÷")ÿ}úWý%ôqàþ²÷ÃVøôçcë§ë ù øåóËþ9 ­'ø_û¯YVú‘ü—ü0í”õ97ú0 £›ý\ýTôÍ j÷w€w ^á T¯â üþÏÿ;Ð Piú±ÿåýâí•ñ±ÿóùÑó$ïí÷½úH Û]ò׋Øþiµ²’ûó¾ùùü)ÿ¾t]ý ô„ýèøwÿ¹Dø”öVþÄ /þµñ‹„èý‡ Îù„wÍ €.eöÂàIú~TàýÅú— …+|Ïÿ½ Ì ] Ò[²ú¯í¥õ?±ÿ÷øö½7€ú ûyý¾ö|ûòüHŠ üí AÿÛý©¹üÏB¿ ø¦-=üÁ]ùÚô lüŸLßðüÏ­ åøÐ $ùMwÌÑýåëçó9ö-ðê+ò‡ú¬÷dùv:ùòú³ðühè½ùèGý/ Qöá÷mú”ðWêgœcùÇø‰ùöqú>üküüùu 0ÿ-™& úGý“‹zëñŽù[ fú½ðy÷üùáõ0õ6û±ó÷ðÒó ÷ÛT0 >ýPâ !³ŒŒþÂô˜þÞÝý¦ù ýE²úþûÌý?ëÿìnîDú ýöHîlþu†_þQ¨ûÑoÉß ± ûA¯  7öäþ‘ÖûM÷òGò¸üüõÉý¤éãü»ý±ú&' «ÿAõwùvxvþüXøeÿ»èsú :j÷^ü„ò¡õu K²ûíÿî^EþýBΚ÷²üaS,Sûöó¤ù>ù‡ïGõ"ó¬õõ=ñ¹òêu¨óÝYâb* â Õë [ ÆøåÉÎNòûÿ! ™ôæòòggíå]ýöóû÷íùÍóÙú²ý8êÝñùÎü9÷ù ^÷Ží¬*a €÷»ûèü+ ³üâ÷- >×~ƒû_À5òQ!üÇîzçÓþ¨°ì]îTþ)(î÷âúÐ}bVý5¼ L tjýÉ  ø=ûßL‹ ³û–ÿ9îöËôèó>ûÑŠúçÿÿŒýRÀ”ù¾ P I Ækà «þûm2  øþ÷‡Ø óÑbÿ«¯ýr® )Bù(ø•õªð»ý¦ô½úâùö õ þ!÷Õü)þ½ Ã&ýj| ¯ …WÒM÷1 ûþ %vÁ Wÿ_ûü8úÅïÃÿDÉüõ]ó%ÿñ Јõ³üHÕÿ¦ýþùü¶÷'ÿ‹ÿ‘øI Sú›!÷ø(‰Ö¶ÿ(§øòø%úuøDö™üŠñâý“ | üþiüöÝû4Ñÿ4õ ü2÷ÂþÉûeûqøÍì¹ú™üºüûí6óÇOýíý·þðóøJ÷¡üýütÿE £ý9óáÑß÷W³ e]ûÐmd±ùB¿=÷\F÷¥÷ýŠøËöòÏõ«ùü€þõý°þz ýz÷1øvýŸúöj¸ rø³Šÿwòö4<»õ~÷løt„IJu 2þ°ù¢üL– ‘h÷fC**p=ü ý$÷@þÖDúêóñ0úþ¬êþgòÕùtþ¤Ž÷õ’„ ¯0þLõú+ ÿ»_üªñ5øA]ù¸ô¢dðº <vs ý, ø+6æ áöѰVõoí©ÿû¸›µôÆÿœ” 09þ™ÿE91Fø²ùþò`õmþíü¬þôãúüø¯øa vùÍøûïêÀý9zúûýn9 Kû.óà ' ±ôÁ8ýóôùþ¿VöMïÛ7öÎh3þ2õŒ#ûÑüª l ÊÿÛñ^ö%ü‹–ùYð¤÷åüLüzü–ø“üYûñûƒû_ÿ·æÿyi mûÐÿTÅþþDÊ>þ¢ýåR Y±úTóïùAüÏìÿóþŒFš ~Ž;ûþtV *F B èu÷‘núÿGÿÝó÷wõ²üÿXõ ïÓö|ùxüZÿ˜%ø(ø¦ÿ+5 :Åô6þò µx {™vá êïùNþnO¹ñòy ¢äø÷Õýö§öÍúüôúKÝ« Iÿj€Ðûp^Œ¹NÊ‹›Ç 6ÿSõ*dý—ýI÷VõùÑüŒþnýêúúóáý*úûŽþ•ùßú¹eÿû-eÚ´ _ûßû” S -qüÔöN : %"ÿšüà­üâûâ÷üØ0úæü~ùÉþ6þíðøˆù5÷ȈþIùìuýôÕü(úB¨jøc÷—û ±ÆFó[õy8Šþ‚úö}üvˆü`õ—¯‡F9ôóþ‘þÅZhÿdïõ*ù ûƒÁþJüzùVÔýÿáýyú+ö‚ûÿ N þ…è•Ø‹ý¾ùšþ.ÿQýxý¢ÝúDôFôW NŒó§õ]$øáøÎýHûÓùÀ÷}…ùYý\ócÌÈùôý ¿†ÿù·+Âý:…Äùéñ'ú£þÈþ[ùÇñ/”ý'öÓÿ}á/ô ø„™÷¬ûj“ûôýöâþ/>ਃ˜÷Øóïü˜-ÒýîØù•؇¢ö¤ò—ù2mòô7 §ªÔöp ×w ÿ‚û …Îoõ&ô±Ê 5ý%ëŽýÿJOù_ð÷þ 9óúâú2ÿÉõñ7ÿÌ{ÍùïêùÜýÐuù¿üþ÷Oð^ö6ô=üøù éññú÷’¸þ…õý; ©pú%qñ ÂüuöŽš \³ “Í÷Ðöpþä[þð&ñº öòÿPþû"æíÍÿvAœ÷ò  Åþ£ûúŠ “±®øYíúe Í*úŠüí yc8þÿËü… xûß Bªø·OÜÀüÓ䨱ÍYD0ùÑrt{þjµ‰ùyýÑ æú[ù9üº/ù í èOô#U ®,ûs÷`C÷ú}Ç ÿ¦%øáù5øäý¨óCöîþÝ*ÿó—xöòôeþ.ÿØr  8 lü]ÿ‰ ÞŸþÿ ­ ‚ 3D ¡7 « Ýúyôû *ùû¸øBïçúÌøÏòuòŒ#ûÙó{è{úƒ*ý[>ùêó£ûõß Úæþèbþÿ .¨IÿDö{ ¨k&{ú­7ßñyöxgØ÷Pô¦ÿ¿³|ýùÂöÀþáôóCü»þc÷³ùûú»Ðöýëâð ø/–üdí”õB$ú˜õub¨q~v‹¥TSwýÿgùùXýû ðjíPûŽèõ÷ò€ò[ônüèöóøÓúíçø™÷ þoQä‰s‡É{Yèÿf ‰Ù _žÇü„÷œý¥ò=÷4ôøqöÁ÷"­øEõùÿôU÷)þ£H¥û*‰ ›d.+uÂúGøîÜ %ýû Ç q÷ðýr.ÿ²ÿÓ§DoýNíL÷W …³ý¶ôjõ£ûýÒöNî,þgŒûróE Žú‘ö4üÅP!ýIú›” ÿÿà nµï ÙzÿG‰ê' èü³öÃüøñýxüìóƒî–÷Ùý•öÚû ßþSûw°(öêø´C¾ÿñ÷JCûýgú(< ZþxñQaiÏý9ôMþÆúý÷õý¤üOô¤ùÖóËüÿ` þï‘_ 9®ºùò ë ÷þþjŸ€ù˜ü| ¾ ü¾ò¹™U ô=ßò7ÿé÷Ñü?²úüùõ¬ EÒò?ûF ßþçþuÿîz vü²Tû…ÿóûføÆ ª “”‚û˜F¢üI{ ìö–þa  ZÏú ò¼6Öö³?úÐý¤cûÔø7öüµú§ý8 ` (ÒûuB l£¤¹ëþÿËTlú4švú»8 L´Fú»ürýúÝñ*ò´ôû›öE€‹ü¸÷}óüº ký7Wþðÿ›Û Aù—û + ž& O*Ë ;ýÛ íü7õaj;õÝñ‘ôdöôÁü/@þÕûE§ó½&¥ù?ô¬þ¼ yúàò-ü܇ÿâþÏÿÖÿDÿéûØúÿÐtŒ]µ­&þTfý¯úFÿù«EÔ÷eö`ùtôpõ¾÷"êÉùkøJöP’ÿ´ùKJü%¹ò •ËM ÄdúõöúøBZÕùÏýàökôÚí#úö ÷_ôø3ÞÿsÿƱûÆBùÙø3f )þú÷µý ÞN/ `:€øÛr÷ãý> DþîúŒ è†ø¹õÿ_ Êoùÿ˜Nÿ«þGþ† ùÈ÷³ùÔöÓúÜúîùîgýbÛíûLøŸ4 /Nú^d <òþº6ýØo`úöæN ×ûûôÄpt÷°þ ‹Zù1ý•;Éúšöü¸ôýkýâùü–<ø«ü‰ÿÅþƒ–UüÕý„ø‡ö,¢òä÷øÿŸ²ý IÞû°ùÚ Ö³ý³þC ± vƒýY þé÷îÂÒ‹ÿÈ;åƒúMþOÿçÂøÑùQúåò˜û~òáïåðrùeüc÷ö>ïýúÎ Q²õûÿ%Ø ú‡D:nù þþ Qý{ø„3¢ýø³ Túî&üª÷ þÝöWøn)[ÿ¾þ¿õ û:°Œ ª g«ß‰þ)ú¢ù\ý$öù=Tÿœúnðùœ–ëýJ÷­ÿ¾ Ü÷4]üöãÓñõùõ Á –üký *ý >‘›þõ þ …ý±ú×ü6ú¡þ/ÿ›F æüÞ ¹ÿ-+ÿ¶÷èüð &üñgÿ/ú/þÚü¿î}ù¿ý‚ûìù†¡àd &üÙý­ x @ >ô —õ ! ìØ k þêQ$ÿ¯÷*Ýðhô“ù×Ç÷èxó þ çü³û,ø*Ú…ý*ûuÎ Fý¾Ô „~ò; ¾«­ø¿ ݶ½PúÎôôËú‚àþòô¸ús‘ÿæôs÷:ú¡müˆî¤ô·3`üŠô…ôfø*úOý¸ôrù'õ¡ô0ôpø†õÈI ÀõS ¤gøþª #üÚ Yÿøý`Ö ÇJ ý³=Îø=ùËü­ú‹êJûsTú¸þõùžü¦üû÷àüZþšÔûqûq²£•júèf  þýüõwï4ü÷YôËöŠþ#ø+÷ îpóó¿ý3ôžòÊú‚ ÎlþÅ¥¥ üXþ ã€$ Ûÿ¤Eþ_@”þLüf™»þžý§ÿûY7øÐù¨ ØEìñû… ·Wýœü¡ƒóÿ…Â5÷ÿó ó¶ú~ôíîRô1õOø™ð³ôb @ µš •è §êb 5öÝ ýyòØóþ¾§ þlÿƒþIüˆ÷´èbø\ ·ø<ê±èöúö£û[øƒý&ü7í†.¬;ûäßå ñ÷!ÿLÔ ó+ôÄñü@úÏü‡ #úÖ¨núÑOóØô¼ êïõMðñ‘”öŠù, xýsø§ t6õ°£çxÎý~ûûòøBÿ\cøñ•ùSþk÷¢õÄ €þzòqùG°óöäÊôÁ„ŸÿúôšùÌc|Ãö;÷0ö HÿÉ4|òlÎá ‘ Ê| JLíþ:*ü'úíclýø9ÿ„ùjïöý ÿëòïæCÓƒÿýi’G 1i æŽ9œQ ûa\ ¥Ukÿ³ˆ »þKîCûœ«úïdîLôúþ©þ¿ûm÷sõÑ î _öµøUÞwþô üq…oý¦÷ÉRÚ¼ÿšÿ'`º©óýåû IvWó%íVþŽò÷áþ>nì^ûNM¸ú¦÷P÷\öà÷³ñZï(ï©òû6ÿCúóõ}Œðvô  çuþköW ‚§2ýì÷±QüôüÁ÷^óÉã §ñë(aüÖô£öèòùõbþ™ðX÷ñè; Þÿîÿ3þê)ë ö™‘«ÿJ÷óó ¨:òGò—óPÿî±õƒùêÆþ{øL÷¿ý”ýzIh [Cÿ>˜º Å!ý8ýK’ÿYýKû¿Kôóÿyú3ýVúçû$¶üYÿG…úÝõò! %ò5ú£ÿîýßø¿øþ—àûf‹üÿ<F½ôáú¤ ¬÷pýÞE`ü)þšï®Õ  IÔnýûÝÅý×ë©í»²øîß÷ÔúÉôNýÎ -ù¯øäîÊ*(ôû/ŸØ}ûOùfúÞ ,ìA+ÿŠÿ,¦Pÿµü ÏlŠ Hûñ* Xû{C f IÒŒÈM c XüÜîùú·ýðûÃópí=÷ùõ…úO÷áÿËTýeÚø?ñØk×iúšõ<¿†Û˜ýùêý±øèú^Gý¬õåúdÿï3 FAó·%„ò×÷;ÿ#Ìt €ïÿô1øé ÒHÿìO„jýÃþ— -ÅáFñ'õÛôòâV÷}ë²ø¥týÚñ2ïêpÝüEùãe9g  ê t Î Žýÿînÿù¶¡ÑþEŒþ1öªúýâøTúcøònë õÙÓGü£ Ô A:ÿ+Ô]bxÿÿWšýÉÿŸýØüÍø-üü€Iý€!lý¥ùÁ: ŒööØú ð­æIü»ûoýä•þ÷ú4ÿ4ÿî¨XýDýqSbÿ ùñ öUí"ó\ûûÏ ½jùÕ a·þ ©¹Øý›õýÊô÷Š ?Rñ¼ýX ÚAõwöæ ýþUûýà\ýËuŸûOývý5öèúôîñõìû'üŒ÷4úwOýûúYøÍ Áúgý\û—ö_øñý©õNøK ˆm÷Êý§ÿr¤9þÉ: eÿEf Ù Oý§ùJ]]û õ±÷þýVóð.ë\ömùÖöKú¾ø1ò}ïKö,]ù¸ï_ù>ÿW%þ û* ^ü\û®TCHõ€ÿÐ8"ûÒ$ túûžð‚ÿ(ÞúêûËû* A;÷øjþÕÿ~  þ§ü+fGžý]ý@7þú§!ýÆþõ£0­Áù¿È´ýLöZïû8Q(õ#ìN÷?S÷|ò‡À¯þcû¿ørô( 1þâ ;> ÿ:÷Ì. ò ¾üÛ>d Iÿþ=PšüMý=÷®òÔüîòåêòIò9ýNéëº #úró¬öªQ Pøÿ©ÿ¶üó+;O‹ ]h ¾ýàÒ ú|û¬ [ÿëîïÐþ$[ßíäòùýûô ô8ùqýÝ —Yÿ)ÿõ¼ ‹%ôœ ˜lùÀ ÙOö‰ù7ü.YþXí´öFù‚ý-þøðúþôøûÈ]³ý‚_ Àûë̓ žòßõÓ2òö)ÿ† îÁû—þò:Ù‰ÎþÒ ¯— A÷ûuý± N ÷Äýïv¸ú'ûêîþ?ñJÿ¡ü}õ:Bþ·òåüÕVú¸úûAÖ©N• … — DË • Dø@ðìÿÒOsü€îŸúUáû üe|8ÿÌ Љ÷& g UüÏþÈøþ d§ôýû›ùœýSõB1N7ý P îû9öŽ ¸ =ÿµ êý¡îø÷û¥ý’úŠü½þ9õ¨¤ ôÀíGúÛ € ôƒùÖþ‰~7+ûXú­ú6 Fü¯ñþÙÆü@ð$ \úiû|·Þ*˘ _þ®| u Þøùé û¹ýYñ¿îžúù-ù}öì÷÷™óÛñhòÈûØd÷£üG÷~RFüj0U#û|õ²üahö@öš•Uø4ù†ÿ‘¯ü—üQ p«NÿB÷xñ„ÿröL÷ »Äð—þ$Déô<ü›aýÉþ­çüúãuýHPø÷ý„ Ž3øƒÿç Úý]'ÿ{ú"ÃõÛõƒúéôü/úˆü ÷õøÿÓòü6 ˆ æÙ´ ` à R æé¨áüÅüºø‘þJè³*ù!ö«ýtð¹ü^öøñãú¢þ…ïŸû-Êÿ þèñ«÷¶ Ðô’öªÿ§¼žüà –þèêcûùo É€ÿ¶y ZhÉü¦Ý ýö=ú=ÒûÙùúÐþôWùsôºGþ¢øÐø€í\\ €ýùžÆ^?ó.ÿªþÑû Œ ö'ö üû‘ ÌÖù4@'ø–)èö<®Rþ•ÿ±ýsú‹ÿùÑñÎÿ3 ãôýÿØBükX=þ¨ ¼D ù ßþ\ýÜ YúÎîý¬åQüHò^ôŒßý´ö¥mü„ñ&ÿJùóÑýÿ¤Iþoÿª„ÿþò?ýÏ~þ‚ø´¡ü¯ û¯š ¸A Íéû¥ü°qýÔþ ypúþ­äûG÷“û›úÚ#ý"ÿKþ`û—öoýý{€ Ô¬úìúE_ 3û@ r¡úàúqFøgøòýhþ„ø@ýšñæü Ý>ý˲_ÿÁïò /þÐþ9úà÷R8 ý*ú2ýŽ °þ™²æþÀü5jùýï^Íÿþg×ãæô‹ù‡óŒõý&$þΞüØþ˜ÿC»þP÷ü%¦öºý­û÷Óm …@öñEÊó !ÿó9ûÒú3ûþ§ùoò…üW4ö¥÷”ÿ×ýìÿ² ¡ë …õŠý¦ ŽÿÙöûåý­ÿåþÆüahô¼ï»ÿkJþ×óÄù=`Äþ™øLú{ñ‡þ,ñÚúM(þ$g • ‚ÿ›ù±þ0<õÕ'Ó÷œþø¹þhù™ùÃf€ÿÁFkúxUÉwú·4koôî3 · •úaôò¹­ýü¨[üRök‘üüñýû"úÂönþUtúƒõ¹ýóøù`˜EÿÔvY¨ÆaZ ÝÿQùp" Ïx÷Rê"÷žt ‡þ{b4 (‘ɨºoýr ôýÂýkùòùåþ ®ôx÷÷³ö+ýÊܵúÿü(úÁiü ö²› á üÛüýIÿÅ­ `©Äÿ¤ýéô“øØåÿf÷*þqû!ôËÿ¼Úùû@ÉðÇý)ÿWîJøOü‰Š[þ‹÷b÷èÅøúc s÷níÄÖò¼ôøÚþ ^ôü#nü*ú=ÿ¾i÷öÔüL¨ üÉT2ýñù´À%úïw [üîøŒ+ÃþØû* Q ¤úZõýþªËGŠýyüó™?uÖÿüýF‡:ý¬^ü÷èúæ þ|úVÓüð©=( Ù èòúÓù¬þB Û©óÀôl øÜý|ü®¥ úÛùÿ•þ¥úlù¶û õîï2 ù(ùM!a ’  ¬;~xúSþM÷Ùþ^üx þ ñüý! ÿoû´ÿ·Ä(ÿ6ƒâÑþ)ýã"?üùµø¸õiÆ+Æÿîþò ûµüùõîýóCü9CþLì5ýç þlùØ/ý[eÙCŒÙ #| ðôKù™séúØû›nÏßùþ ‚÷ûˆùyúGýëöTþ§ûçö×ùÉùþø[¥–ú…ó!ûqþý‰ù ÷eüjÿLùyúœdž%‡ýh ýý…Lú+ü#ü?žÿ6üzö_ôÍö¸* =RõÃþß´Lþš–cû²üYýÂ6 ‰ú'÷Aï øw¹þ¤õÚú£¤ºþÊþ# ­þϰþ5þ¨È/üåþ)ÿ?þ6ûüAþá¹þ®ýÿ÷új÷=ôíúi÷êöÀÿZWúoÌ ¹h¡û w.C‰ûŸè ‚ýNýþ7õùóÊîßó›ñûùñ†öxþp­úÏõOùèyä7ýÒþŒ Q Í ‡þÚüš Ú ÉüLâÑÿ¤ýºû±øùüÏGù¸óÜ-‰úÿ‰„ÿ‰~ýçþÊ L„þÿÿ°þþ[™÷×ÿb›øïûæwý†ü"÷–þàÿDôù2§ù÷Wa Íÿˆûóþ¯³ÎUÐ çÑ C<A üdövõ#öZý·üËý?üNõéö^ý1ÿ 3†úüY¯ÿËa1%ÿrûÒüËýDûŒûù|:ûÂöÁwõËþ óûûöSù×| ú¬ü·†üq `*Âðÿáf Yüãýìþì÷ýxú–%ÿ¨ìGüE+ÏþÒýrþW©hôcKÅúôû5qø¡ÿL±ú¡þt>„lüüøà7ÿº™óŸùè¡ÐŸ 6íôü{ò . Önõq(£þùþô2úäZzúÀûùúÆ_üù’÷™ÿ¾Šý"ó8P=ý¸ž cý­ôÿã‰ÀøhU¬Ð\ÿúKïûÅý$Dúà× Tv JÌÖüï^¬ Pü¤ûÿøØ¨ Òü•÷ýJÆýV I¥ û©×jò¶ÿŒpûBùˆø·öÐÿ¾ ¼þªøvùú9ýŒ‘ú¯øLþ@ôøøúÞ÷oö}÷¶º 5ûØý_ Œù /ªÿ ¡ oIû%öÔõ ü_3ðÊå‘ú¤.ðPöõö÷õ÷cûÆùzœúþ]*ûþç Ëÿ¤ùe&ç…F·þ…_ûÿÅühûsÜYùLóFô–ü‡÷ùYü ûùLï ”ý)˜¿ 8 ÑŒ Þü'þSü¼éû”üYËý»î# ú÷õ¹¡ÿ´ÿ. “ÿûTTÿø@ªøÆP/ÇÿüõúˆW·þÿ'û¢ <v–túaþ$¨¿ù&þD=ü×? pÿîýÑúýéÓ†Û¨ /èþ•ýÅýˆø^ø³‚%ÿsô|ö«íÿYõûâ^ú¶Züˆfe1úì„bQý±þýúùÿ¶öÓûqÞßû’õ`-*ÿßù–/íÿûÈü…þÕÿ]étùT° 9ö2”þ»ôƒèü¾þoàþ™þòùÃóyùDøÂö–÷w «Œø-ùdüÈZŽ·ºúôþ/œ)Ôó¾þ_  (÷“þôãöJýþPüdúÃ\.ÿQǸµ9ü‹ãŠ{ú ýû4þúPþžý¡²ý&þØ ü¬þÆý“ÿq_÷úõÿ\ª†þ}Óó+²Ïÿ-ÿ„Y‘ý[ýðý!øèùüåùüûGü®ï£þßNÿsüÖþç fþIúl üRÿ$I³²“Š;Æ'û·ýûr¨úûYøÝú–þ«4øÔõìÿkþ”ø‰G 2ÿûä Ã\ù«ÿ(^þ"øÕüÞÚoË‚õ}ô I þøóöÿÄLàòÌ Ûùâùÿê½øúýÓúrqýÆý]8¢þòßý< ÷´÷uX ¸öWúL̹iþ®îåôýü|ú@óòíŒî`÷MõNðû‡û?ñò÷å€û>õ‹ù6 I^ô6ü ¾þÀãÚCÈwâ >ÿòøØþ<póüËöƒù]ÿê±Pû·õfÞþ¡ž×ÿ±úHôIÃuú‰þïýßùÏ Âœúáù4þùøî/þWþçýýÌá Âóþ³ !ýü¼¾ÙÎ ¤ùÕ ë  Žüºý¸.ÿüûî† dÍÿüãþ?úðùæõ“õ`QÙôösÀüæö°ÿù÷«ü‘œY qíöÈÿ£|³ ƒøïØúÝ / Åù§€ =Žù+ÿàþ‡q gý™øÿ ý‹dø—ýí•üY /ü-üUÿþóüü ÿZýüók€ûkùÒúGùmGp šøô @ Æûìõ–ôüôÜù×öfÅ [ÿbûpü¦jýŸüAiüµý»_ü.2ôYÿþß ¹åúÃù€þ\ §\õ³õ®ÿý)úLÒúóÞógÿïþ·÷Øû¯+nÿýØÿî ×J¬íá’Aþ(Q ¥©ÿ3+$ñ¢ø¡¤°÷vóù– ½ÿOðaõüËL{÷2÷«ÜjÀLü˜ÿÔI÷þØüC“gøµÿò2ý¸‹ûÝüo E6ýSþIý6Ûù…–¯[oI ü×÷ûÿ ž40ÿÞ÷aùCh¾÷|óÈ÷Ýr ÿ|ùãþ,`û¸ù…üßüÿ,ú"gÖüýW ÍÔÿ¨ýŽù7% G±Ÿÿ­uÄúoüd÷=ûeÛôqûÝ [‰  øyþª £ þOI–þ§àû}ÚýXïcðñúö¤üˆò øný3ôTú/úpÿ_^ønýºTíù_þIÁüâ Þþèï Ì 3 úú‹T ÷û{ög;’ú±úÏû_ümúéõZûêÿ· múÅ7#øù3]útõëøü9ËÿŠòïû˜²û§úÖJýÞú¯— ›lû’ûÄ ŽÕöùâzþ—ÿ$eùëD üpý^ýéwmü‚ùCþñÿ|øþ£&¨üŽ÷5üüFù†‚`ùïú£ D¸ÿûvGÛùîðòðÊ…²÷V÷žm³ü¨û ÿIûØûE´9š÷†l?ÔþôÿÙü dß»‘÷àŒ ÏªþKÿŽü{ÿ¦ýÿâöz÷„ú"õúø©þ/ý=ûUûÌ÷½ö\ý 1ÿËÿ¿)*} ,©Æ ¿‡ÿ‡~"hÆÍÿûDú¹ùˆý_±øøùøâ.„üoù_ücú¨ G|:ÿÄb„¬=½ Q VÿlúÇü‰<Zÿˆ-ü®ü;ü‹õZö‡üÞù`õºûbÿ]ü¨ù¢÷úíûZBÿûúÁû;Û þ¬ÿ]‰ÿMþ9•@ý(øA ,ÿ.ýlÿÐüEûÝjÿÜfýaÿ ÿ=ÿPý‹ûÝûî(téýdþ4ÿ¤ýãþNf÷ÜýÅ`ùÚýSý¸K¿ÿëó¯ÿ!¾ ÿ1úFú»ò n •ûØúؾÿ?ÿKû·õ*þ‚©³8ý8 iyóTþã·ýjý?€ùâÿñý§ÿ,«+ü#„^üþð3Kõ#m &mñ‚ý¥þ¦û¬áùRñÔþBàÑgî«ù[à¡8_<H“uE÷(òÆÿŒûŸ÷[û„þdöûú¤ÿÄÿð™úOù÷Xªòÿß  Lü-ˆ ýÿ®þzâ ¢ÿˆ”þžüˆüŸûïþ¯þyô«ü‰tô§ìŸúÝþ\ö#÷‹ø’ ûx÷W¡ MÿIúìø1ùM‘5üÐø_ý66 Ãþ-õTÿŸü1÷yü™M ·þàòþ †óú›þûe^{  ¡Áûìýìÿ þ·þ—øgõ¶÷gÛ?ôƒñøÊýòý®ú›ûß›õüåý G û°üs¸Ó–ÿlõ—øÿ¶ÉööÁ[þQüoùøÿí€ûçfVË Cü;òN ” ‰€#{{ üLL ƒ süÛý>¨c?úÖí=ó—ÿÑrù™õû'zÿ1ÿJó|ü›øÀ÷9>ÈûÿvÛÿ§þܪjN  Ź £ †Úÿqé Ëú¸ô‚ùF¦÷úmøÕÞÉü2÷ñú3ÿö‹ýDý…‹¤ÿ®ÿÔû¦ü÷úk ý_ºüÛûAù­ýzùfñOþúôýõü/ûYü?ù³üTü|?À÷üüü-’9ûWþ ä‹ý[ÿz ’¦ûPøsþK–š÷&üúºúÝüw«ýÈýºø~ïÞù/)OÿèüþõYÜ@ÌôçÿðüĆlúÓö¨û^úx»`õãý®ù¥=ý¡ö?ÿ8®ÁdíþŽÿ_Òˆ±ù2ú˜üìÿé ähþ}­ìýœö²ûý^ù•ýïBýRM­úûýnÎô|ýb´ËŠÿÜýî ü}ÿÄSÿ©ùåü³ ‹K¼ÈOüâ̱üÓýßÿüwúÙ܇JþÉÿš1ý<þðúÇýÿä÷0ú¬ý3ÿrý5ø `ö û<yÿyø´Z šüŽû¨™ Áó¢ª _É»Yÿ–çº oÿ²0{Ýüù#þ>ý¤EýVôØúŵú¶úYoÿ×8õ(ü þj‰ýÆüþûÏÿªVüìûþGò}Äÿ  ÿÚþªAü|÷%ý´Eý ûøÿ-þ.ýœÄü8É~Jáäý”þ4ÿ*ùjû¥ø*ú=ýÌø\öû6ú ÿêù‰þ£ÿ÷þý ô–ÿ ÿû‘yúFùÈѸGå#Vú>UúýUüfüÿ<nûMùøwÆù×öÁk™ýÉúÅsÎ'“ýg åðþ(7ýüA«½k úƒø‰þ“Ñ!ôKø/ÿ0þ•ü‚nüüûSý0ý \ Ï ‹}@€¾ d;ù¼ü™cemþÂýUÿø'ùrþ‰û2þÙÿ ÿò¢ø]ú— ûûìùoæ"èRðÿØnBÕÁþÕü`ÿ$ÿzîûñ÷Zúƒúÿ3(ÿËûÆZ̯þù¯ÿhÿåÄÿŒ²÷‡ºø›ÿ6è)š×‚åíþ•úùäõNùJþ0ù×úÑúÚü¦ÿó\ù8{ÿ0/ù®üç„þÛ ~ä—¼—!ƒYÿz cÙþ¤14ýÖú­#pÿúü;@þyúeþ`šMÐþ¤Bõe1vú"ü þ@ù›Åÿÿú?ûþ3×cû8ûµéâ¨ÿåŸÐü+7¿üÄúŸíýûÿIý`µÿÛûôqø±ïA÷¸ÿ °ü§ýöýÀ6Œd 4  ļò®ÿKýÄ|êýÆ÷PýÿºöøhüyøõúÍ—þÿªûâøwüÏÍÿõÿcEÁŒ’µAš á èá`þÊeùÈýßDø¢ú<´÷-õÈýMú þÿ©ý“Xÿˆþ þâû²ý«¤&5ìàüûúõþ0X9CLY7“þG]oúºþ+£ÿ@ú•÷šþù­ü²F8)þµÿV,ý\ÿ{®wû`øÿ þ%ýEŸÿOüíùºù*û(ûÊþyÿµú¢øAüŠÊù‡ùDü/7²þ§Ÿíòÿóú ýDÿJýúãÚˆýúULðü‹ÿ‡-þ¶üý‹tÿSû˜üÿ,þÔ|ÿþ^ÿ<ÿ¤ûÝýØþ0û™˜†øò÷üC¹ û"÷*ÿÿºÌ.þ¡ý G ûýÇ„Ùý[L}þa—þþ]ý`þÉ-þÄôæâ!6ÿÕ_äùÉú¯5PÛî÷îö0ýöýóÿúŒü…üäÿË_ÿúÔÿüy(yðþûûðÇ ]k¢^™·þÀ2ýC ³ßìúú}õÜ¡çUøÚõÉ=·süPù^ûôG¹~üB¡ü²üÿÌW\þ_Liýߋ٠„ûWü)gì_>Cÿ1úkþŽï ÿŸÿýKü!ý»yú×ý¼ÿ"ŽþÎê_Hþ›ýUc•HúÇú’üß@ ùü/éÿ˜þ·ùýøpY4üïûµøœÝ#ýö÷7»,ÿΧ3;Òê8ªþ¾üƒ§ýJûÔÿ‚t§ÀüÿèúÜüFÿ ÿêfÃý¿üuWüd4ûòüûtÿ2¶zÿ=¥ÿRÿöþ²ÑOþ‚ü./ÛQ‚¸þuþàQ 4aWàþ‹©úþý¨Ú hÿ¥ü‚pdùaýéÞhåÜOÿ™ùEò¥ø—™þ~ûP÷‘û©­ü¢ýýýóÔ3-+Y¿è•ü\e­Zýâ"ÿÛ™‚Z˜ýÿ÷ÿ+÷óú¼C\ÿRùHùâ¸þœÿl?ýèþV6QþúÃü~ý¹ú·ýÏþ~ùTþÿfýUýÑþ%„êeÎøøÿHþ]þÊúü…ý–üºòýsø°ýÔjþ©ýoý ý§={ü½ý@Ôp‚üVÿ«}ý ÚÉC+ûZþ¤þ®ûqý½ÿàÿÌü`üÿŸû¥ý.ügP‚ýCþ0ÿõdÁy üEþkþ}ÿ¾ÿû®üÿfïþÑûüÿý†ýl«û¹ÿråþÐÿ6µþö”Ðÿ¢üúÍG°ü×ÿåÿ“ù¢ÐCý‡ü‡'IþˆóM—þŒÿBüI^ù{ûåüܸ2Êý8[`ýüÄ] ¤þ¾ý¤1ÿ–ª‚ý1ú˜ý>ìÿ¶C×þoüþ™ëÿûûÿåþ¸Wþqe{ÿù)œ c Ö—ýÑü^¥mJûüÂÿõ»ÿñýÚÿþ+ü’rÿE³óüàü)ÿd¦üøûÃü“ÿ7Ó4þä9uRDÿëÆüê÷Ö(ÁÿÛ§ýÕþyüñ<Ž0ùôýÿ«ý þpü ÷ÒùÊÿ$ü.ÿAÿüûPW"cF¬C¨ý&þ‹! ýÇý(þßþ ¡þý¶ýsüˆÿàþéú6'ÿNR;ýÚybý]þ9/ü¤üPÿWSl|ý:Rþ¼ ùýõÿªþ$šÐjuþOR¤´ÿ|†#üÖD%!û üÁû«eû`ûÅüöþQþ®ýþþ¨ùÒý®üqlv$ƒfý²ý×þs‰‹þÐú)ž‹ü;ÿœÿÅ"Ýdo’Q¼ýKý›ýûY×ÿ_þT[ÿÏ\¾ýuúÕüþ1þà/œþ–’ªü ãÆÿ–%ýÿqÊþüûšûü nýªû÷ýÜþfü¥þ¼+ùÓûΖ… z€RÿÔéþÉ%IùÉÍ™þðú“øÑø%ø·üHö üZÿû®ý/çIòý[…ÇÆMѸaúløµüÄgÿƒýÈûøû8ÿþŒüLüwþ¿ÿ#þнAþ]?•¾3ÂÞOÿýÿÿ8ÿ‰E{ùŸôùÑü–úûáüþ÷âûÈý:þˆþŒÿy­ÐeY :b‚íþòùÿ¥ÿa/ý×üRþŒ úöøbüæ5þýGþô]!_ýýÏr¾Îù~æä¬þ,û¯úÆÿóû[úäý½ú€øãþíÿÌý“þcüÂûÀÿ(&ÿ—þóÿÅÏ,M'êÃÿ¬~„7fCöƒ®rýËûn$þü'ÿbœÿ±h‘ýPÿQýîÿý\úª¨`ŽüÖýÌýÛÿsxÿä˜-@þmüíþÚiþáÿâþÿû%_"Cý-iÉèdÿàÿ…³­ÿyC\¾ý™ýŠÿ ý²÷ÑüAûqþn¨ÿ'ûŽûßÙÿüc94ý…ÿé)e8ÿgýEÿÁ6ÿsþPù)ûÆ!üƒÿü¿üjý`þ;dÚŸÿ‡îÍ—}à¶ ‚‰MœÿOý»þÓÿ0üiÿ=ÿ×ÿyý»ýMÿ-ý«É¨þZúµûIÿ6%7‘þýùþ0Ó1ÿ…þ< {’ýÿþÉþÊwÿůÿ¥þ°YM%ý5ýnTÿ ý€fYûþý~þ”ÿ­È.ñý™ü|üÞÿw ÞúÒý9zfD|û‘÷œÿª`@ÿa-Ýþgþò·oïý¦úyÛH¼ü÷ýÊï“%þVþÿ‘•mÿûjúËÿQÿ¾û¤ü‡#ý¥ïý,ý˜¹™Tü;þÿêÿïýÃúSýiExü„ýÿm"¹¹ÿqü-ÿNïÿ´¤ÿ&ÿzK—ÿ¦ýaþOxéþíû¡ùúPþœŒüDúvÿû ûûwý¢×aûÛýÞ¤®þÂýÕÿ`Nÿýäþ~鵯ÿ!ý±ÿŒÿ·ÿþÇúéü•ÿéþ´þ,þÿŽj ãUþXhœÕ«þ-ƒZÿ§ÿë9÷üsûêÿ^ýüâÿ|ü?üŸÿÙÿæþÐü­ý“¾ÿ–üÆ섰òè®yFÿÀþGÏÄÿ`ú)øÒûüýþ8ú4û3)3ÿ-þ ¼ ý-þ-)ÊùþðEïDƒTÿÔÀÿqþÿfZüùüXÿ¤ìGû4üÿ»Û‹þòd÷’þÐSÔ½‘ëþ¹ýÙýûÔý2ý˜üãþKþØ¿3þþßÔþnþ§÷èÈ3Ì„TþºÝ—þÆþ¨þ÷üÔû€ý8þüÆü½þÉMOýþ¯8ÿ*RbRÿûK¥ÿgýúýaþÿî‡ÿYüaü€×ÿZýíþTÿÿšûðúþŸ ÿB85þfÿjü’ÿÀÿ õŽÿìþPþ'š<þ™ÿðýš1þÿ'ÿF¡¹ÿÓÿ-ÿÆ)ýöü¸ :ýcþ€8ŸMNÿû\?þ×ÿüîþ ÿ¥ùÖüSÿ¥Äþ¢þæÿ]ý«¹LÒ»šÙÙTÿÿ¿Ÿ »þY"Ùþ·ÿÁ3þ ýŒS`ýÿœGÿ]ýÙý§þM ¢†ÚÿJÿ/ÿªÍ¥-ýqü3M®ýÄûßþ°VÿÎþÔýÅ(+ýíûëZOÿþÛü™ÿ<BªÿjuæEþoÿpÝú6Þ‰"þsoÈþûÍû”ýœþ¡ ýlý!ÿYÿ–þ¯JÿŸþÓÿ.ÿT‡ýÙúŸü“ý…ÿ@‡eÿ»+£ýÊ—€ŸûÏû†ÿŒøÿÀþMû>üêèóýåÿõ yþ¨þ|œ¬ýèýßþë}ÖývûEþ3-þDÿDþ¨þNþýŒüêþÔÿ'þ7þÀýüÿ1ýÿ.½ÿuÙä»b¸hbÏ„ÿ#üèÿþ²þºÿýÇýEüÕüÊÿsVÿZþ«¾Èíý÷ÿ_Gñœÿ†ý¿ÿO®þwüØþº"Ãÿ"úÙý þÙ#ÿ(ÿIõ–íÙ(Z|šy2'tÿ”ýþöÝJþjÿdþiÿmþÖþšÿÒþ%ÿ ÿ£µÿþ„ÿS¶ÿx«Ð½ÿ¦ÿóÿjÖÎþÝ0ˆ½Ó”ÿyþ6ü¢ùôýZÿþûÿÄÿýVûÿ6‡ÿBS  ÿÒ,v ýŒ„ÿMþßþç_xý þÿ¤ý°þ!ÿxýÜúkþÞÿ«þºþý.þ•I¬ýåÿ°ÀI€*!6(ÿ6ÿÄÿÕÿfÿ6ÿPÿ*þÿþÕÿöÿÇßþ°ÿwÿ ÿ8&ÿÑþ_ÿïr"Xÿ¶[þ›þLAkÿÿÿµÿjÿÐþ°ütþYÿƒÿEÿþy¶ßÁ•O—téÿ¶ÿpß[ÿ"ÿÖ2yþ\ýÎÿ ö¥Aýsþ€ÿËDY*þ<þ‰ßœ2þ°bý=»éxþóþhü½ÿNrý-ûžþÿmÿ5ÿÏœ$ÿ·Fgœÿ’ƒÿæ4…¡þ†ÿ/ÿ©ÿÅþðÿƒ@ÿºþUý¨þMýƒþ®‚ÿžŸtþþl· Ù•þT þ$þTtü4û•þrá³JÿÔþpþ¾ÿÉÿ‰ÿ¢HÔ9ÿWÿ˜ÿˆÍýÿÝÿyýàÿ–oþJ×þà äÐßÿÌü5ý’=?ÿ&ÿd#ý÷þX!cþ ü{þ'ÿöcË—ýðýUþ½þ þýþ÷ýÇþG3_ýžýæÿ·PQÿ¢ÃAÍ_\”õ"6PÿZþ+øþzütÿkå‹ÿwûªýc.þ¾ýõÿæ|Qþ´þÚÅÉ1ÿÿXùÙòþ™ÿBòÿ-ÿµKJò:ÿwþ(ÿÐ7ÿÚý'ü ÿ<˜má,þfwµƒ™- ./*ÿ/þiÿ—ÿšÿçýµý¥ÿýôüÎþ.ÔxýÄÿŠ¿Ù•?Åÿ‰þº?`ÿê+ðbÿ©ýÏÿr.~–þÆþÒþ ™fþùýÛÿðþî$ÿúþÿŽüá¥a™Hÿ$þ Û¦ÿ†þ1ý£ÿÒþ»2nþÇý~þ¯‡ÏòîÿÑÿ7þRqêµ!¿þêþî%É<ÿ,üÂþr o9üîþÿ ÿÙ9=ÿŒÿÛ˜W¾ÿgþäÿj@Õÿþ-ÿBÿÌÿ\ÿ,þmv戩ÿÈÿül)„þiþ™ÿ›þžþ+ÿlaÁúÿ†þì?ÔSþÞ²FpÛ§ÿgþkÿ'ÿÓþ¸¿K[Oö̺ÉÿXÿ±6þÛÿ þáþÀþÿÿ`þÒÿýtþ˜ÿÊÿüg\þ«“†ÿ ÿÙ]ÿŒ&~ÿéXÿ\ÿëZeµbEQÿ<ÿây2ÿêxÿ<þµÿþURþàþÿ¯þ‰þPÿÐHÿ`þš 2’ÿÿ—þ±ÿu»‘’‘þ+þÿ±%Lþ<ýÛ=Cô.ÿ/5Ïÿïÿ€ˆ«þ,ýðþ€ÿ;Wÿ9þûLMÿÏ€ñþäÿžä¬ŠZþSþ¾Œòÿ|ýþÿÿÿGÿ¨ÿ%ÿŒa1ý\ÿq?çÿeüàýhþ‹ÿÿé@ÿ½þ¹þÿ}NMc/{ñ …ÿ[ÿQ; ýØþ^ÿ|ý{ýVýÙÿóÿgþÓÿxþ½ýïCþðýæÿ¨ý ý‡ý2”êhÊ€ÿôÊÿ]ýÝ%eÝ€ÿÐýðý[þÔ€ÿ}ÿ7ÿYþÀ"¹‚§þ`ý2ÿºPWý¾\ÿê´ÿeÿ—þ|þSïÿìÿ–þ6ý˜ÿr+ÿýè³o6þíþö5 êÿ^[Fôdo¤Í~£×j¢TÿûÿA>e9ÌþCþVþ¾þgÿkþ¦þtÿrÿº¹ÿa$bT²VÿrÿÙQzþ‰ýüþêþþ%mÿ•þVÿÀcÿ‚šNð€ÿ¦ò‡щzÿ¹ÿÔL$yÿPÿ‚%1ÿgÿªÿ²þ¨þ#ÿ#ýŒýu&Dþ–ýîþ§×¶{þªÿ–ÿøG;·ŠÿÝþ9ÿÖ"ÿ|þÚþ4ÿ( uÿbÿ K¿ázÿÿÝÿñ“0¶ÿïÕÿ'ÿ¦üýöÿÆþ€ýýuþþŠÿîÿçþŠþ]ÿ€ÿ¯y(Þò=ÿjþôh˜}[ÿîydZîÿÿXÿÒþÚþÙÿkyÿ¯ÿ%ÿÇÿë1ÿó1¶°€ët6ÿDÿÆrºþéþ‚ÿ¥Âÿ)þeþ¤ÿ±ÿÝÿBÿÿ½>>þèþÚÿ<ÿ•ŸA$ÿîþˆ¤ Øž M %ô@ÿ"ÿÇpeÿéýÁþýÿŒþpÿ>ÅS^7FÿŸÿíÿàÿöÿ ÿ¨ ÿéþcÿ¯ÿûÿPÿGÿ,ÿ÷ÿýÄÿC}{ÿÿ]R-ÿaþ<"6)Y“=%ºQ'moÿVœ@þÜÿ,ÿçÁÿÓýÄþ=ZšþÃþÖþoþLÿ9Q~ZþrÿÿÙÿ¦þ¶ÿJZÿùÿcþöÿ†Éoÿˆþâÿˆÿ:Ø6X¢ÿmÿ×ìˆxþÕþ6ÿ¥žSÿéÿÔþ¶þ€ÿ_<ÿhÿ1+ÿôÿ/ÿé{Ãÿ¦ÿ<ÿFv¯ˆÿ¢Mÿ¡ÿäÿäÿ’ÿÄ6âÿIh$DSþÞÿžÛ4þ{ÿ]ñÿÀþ0ÿèáïÿÿü¹œx7ÿÓÿÒÿ>2ÿbþêþvÿB×ÿà ÿÿÑÿ7ÿõþãC#ÿÈ•ÿIÿ{ÿ8Xÿwÿ¯ÿáÿ³1ƒJ~.ÿ•þÿ’þíÿ¶,¡ÿÚÿ‹ñ=ÿTdN¬ÿþ_ÿIÿãÿ¤ÿÖÿrþõþÿÿjÿ¬ÿPÿB ÿiÿe€ÿGÿ¨á¨éÿÝÿªfÛºs‡ÿÆÿGÿ{ÿø ÿjþÿˆJ]ÿÏÿ¸ÿÿQ;™ÿï ÿÛÿ´ÿ_Æqÿï1 ÿ­ÿ4~¦HÿÊÿùÿmÿ†›dÿ þfþöÿìÿåÿzÿcÿ¦;hTÿæ)æ·ÿìÿ8ÿÌÃæAÿ¯ÿéaŒÿÇÿWþÓÿ‹zÿ½ÿòrÿ“þ4þøš’ÿþÿWB¼ÿÎÿ´ÿ×wúwÿ¶VrHÿÛiÿõÿ³ÿÔÿéÿ×ÿñ:ÿ²6ÿö"ÿÅktÿÏÿ÷Ç!ÿðþßI&ØkÿIÿ”¡;þÅýýþüÎ¥ÿ_ÿ$7ÿÃÿ¥ÿí’"ÿ6ÿ@µ_ÿ”þ:ÿ¯Pÿ×ÿÿ ÿÂ3cpÿ¿Wÿëÿ^ÿÒ PÿÊÿ…ÿÁbï-ÿá#ÿÓ€Ž â,ÿë2ÿ®ÿVÿ2ÿ#ÿFþåÿB3ÿWþ½ÿg­Ùÿ{pÿöÿ ÿŽuyÿJÿ¿A²þÿ þ¬#ÔeÿqþüÿÆÿ®ÿÀÿŸÿnÿÿÎÿpÿº¹¿Wÿä3ÿÇÿçÿãÿçÿ€ÿ¦ÿø ÿØÿ ÿÑÿnÿ…ÿÐÿõÿºÿµÿ§ÿÂÿúÿÜ&ÿðÿÓ :%›?ÿÉAOÿÔt‹ÿÁÿï_TÿûÿÌÿ¿ÿtÿÔntÿÑÿ”\mÿÌÿ¿ÿýÿÞÿÿÿú@˜4ÿGÿÿåqÿåÿLÿñžvÿëÿÀ4ÿ€ÿ¶Cÿïÿ·ÿá{šÿÿÿ–Ñ÷ÿÂÿ¸|¦‚žÿìÿì3aÿöÿÞÿ“ÿ?ÿôÿ°ÿ–ÿÃÿÊÿûp1ÿ³ÿùÿ ÿÇÿ˜iÿ¦ÿ†<“ ÿÞ"_Æ4]ÿäÿŠÿt³ÿžÿ’ÿÑ ÿå ÿÙÿÀÿà¶½OÿÁ%9ÿÆÿÊÿø<ÿÓÿaÿlÿëu×ÿ°ÿ 8d0ÿŸÿÙ Lÿóÿæÿ¯Nÿîÿ˜ÿv>+!XÿúÿÒÿÌÿòGÿùÿœÿ¿ÿîÿTÿ©9x_3ÿÅÿô|ÿ±ÿË iÿÊÿÊÿÅÿÔÿ¸ÿ‘ÿýP+ÿoÿgG#SÿÞÿpÿÀÿèÿï.ÿçÿÿõƒa3W1ÿ¾ÿí?Y3ÿôÿÄÿ¨ÿ»_ÿ°ÿt9ÿèÿÎ2R!ÿÿ´aÿóÿñÿëÿÃÿöWÿïÿ£ÿ²ÿü_IÿÐÿ³ÿÓ!ÿãÿVÿê€(ÿéÿÕ§–@ÿóÿÐÿë+aÿßÿ¶ÿÌÿÖÿÿÿÇÿæÿñÿÎÿÉ oPÿÜÿÂÿÀ]=ÿôÿ¤ÿÑ6CBÿüÿòÿæÿòÿòSÿ–ÿ»ÿôÿ×ÿÇÿ™ÿçÿú4( 2EBÿõS&ÿÚÿÏ 1ÿôÿÂÿ¸ÿï&ÿ÷ÿ´ÿ¿ÿÍÿÍ >ÿüÿ¹ÿòG/ÿëÿÓÿî<:55ÿÝ ÿàÿòÿÃÿ ?ÿáÿ¤ÿÛ#(ÿüÿÝÿÚ ÿò!80ÿòÿûÿûÿÃÿÈÿÏÿÉÿÙÿþÿþ&A' ÿõÿ¬ÿõ'ÿùÿÅÿ£+ÿôÿÐÿðÿãÿÕ"ÿõÿÿÿíÿõ1T2ÿïÿàÿþ%ÿùÿùÿíÿïÿðÿâÿÞÿíÿþÿÁÿâÿÿÿþÿú=!ÿôÿï ÿüÿÔÿø ÿúÿñ ÿüÿøÿòÿôÿöÿýÿþÿùÿøÿúÿøÿöÿìÿòÿú ÿüÿìÿýÿþÿúÿûÿýÿöÿþ ÿþÿþÿþÿÿÿÿÿÿÿÿstk-4.5.0/rawwaves/dope.raw0000644000076600007660000005000012327014024013427 0ustar gary "'#$!)ÿúÿöÿðÿóÿóÿàÿÍÿÕÿÜÿÖÿÖÿÇÿÂÿ¹ÿ¸ÿÆ&þþýÌý’úîù‚û"ùŸøãøi÷‹÷Åù’ûû:û­ùnùïûtû<ûßûuù‡ùïûõû_ü ü¬üyýÿþ¯þ§þNþòï¨ÿÖýñüñü þ“þtýeþýû‡ýIÿ'þôÿMXÿü|ý•üsû úgù˜úùùÐúú%ûðýÿq»ÿéò\s[ÔRÿïÿ=ýÍþ‰ÿãfþqþÿ­iî„HË|‹ÿíÿ‹08ÿ×i ÿ þ"ežq„îbÿçpª…aÿü¯‚þ*þýõþnaþá%³9yšoü™þaþüCHÃÆ æ]ä`[ÿìY?³4ÀÓÿÂþ™ùâûµýûœÿ“Cûk6³ß5 þ]Ëh®öôÍ ½>SŒÇ æÍ3 Ïv ;[ Žƒ÷Ê›D»•&ÿlýùÿ þýOýšc ýþúÇù2ù¨ùjûÜýËû$ü³ÿSl¯t¤ÿxýFúýw®üîÜÀ¸ŒÉ«?üþÝÿƒ¢&-üÔ>b0  -â ¡ Ð à ] g b ÂæoØ?\˜Süü‰ûïûaúöMúpû õ}õíô–ò4øƒýüFûÔûsù³ù}ÿŒœQ· &Ì:^E‘éš°Z0Ô  ¤ ±  ë § 2 € ‚ ö  ÓÙ $ ð 1 µ°6„ýeùgù_ó„ì»ïDðïIò÷ñ1ïxî€ê-í9ðñ_öþ÷§ûä$šþ"óÁIoÿýÛþþY°Œm † YÓ âÚW F y  ¾ ô ý qÚ{&sÄT‹åü*÷Áóiñoë§æTåãñç8ëVê[ênêQæùé¦ïØòZôÇøFùòûÝ-ÎÖ‹^ë­ëê<ü»ûcüˆ¸í§¦K «M` ÓžÉ # ^1 t ¼‘s µWrþÊû$úûd Öªÿ¦ûÌôOîKë¶åÝÛtÝ^߈áAä<æ-å4äçaí½ðÖõ ù¿ý™;à MY×)“—¹±Øâ  $£ëÌoÏÑ î ¿{ YGƒ Ñ ÿ]ÿ\ú§÷ÄøŽýCþüfù\ñ…êéåzÝŒÖ‘Ô Õ?שÛVÞóârçÚìþð™óÛ÷÷H÷·úJþ†ó˜C!œ٠K ë d ÔÀ$å‡!#ÏŠ ¶ ~ñ{ Ú EŒpw Lürõ]ðÅñ”ñ­îÂíßîêîæ,âÛöÔrÏóÏ„Ð,ÑÍÕ¥ÙLݬãyéšñW÷¡ý©• þîi$+™,(v$¸:x) iåÌ9è°lL€ <ÝÏývûäüäüÊüƒû„ù€õQî´ènãváMáßàÊßPÞòÜÄÚ“Ù>×:ÕbÔ.Ô<ÔÉÖiÚÞãºêXñ¿ùǸk ìï?“"Ÿ*¢/*/¬-¶* %o Å#‡5m=ó™'Ê 4ùŸòçï#íéî@ð¤òïõìçŽâqÞ1Ü°Ý ÝÜõÞ#Þíß/ààTߨÞãÝ—ÝRß4â›ç7íó¸û©Š åŒ4¢E!$'-þ2:2 .}(*!&ä.ÎÊœã óþ¡ùÂòÑéþâyÞ>ÝïáÖçWê¾ë'é)å®â~áMâHäå æ ç]éëïï†òóò™ðIî•ï/ñ–õ¼û²È ËîÌ##Ø#l#g$'ý,Š/ .~*D#hVê ë  ]„hùSñéìêké%æ–ãÞ‹ÚóÚ÷Þ4âÿçãëWì¸ìÈìÒî-ðòô°ø¨ú•úîûiúùúÂûdúêúTû7ûtûÌÿ=qû §…-$¾œ^è!;#æ'ÿ*´)~$_çèþKø2öÈù)û¹ü™úžõ î'èwå ã>á¾àˆÞÓÝXÞ¹ã é#ðh÷vûùþ7ÿ+ÿ"þë À§3 }Wÿ0ü¸ûîü±û¬û‡þÿȯuÜ Ür¼,\„ª×m"˜%#Ý ·? pßö¾îòðNõãû…-ûçôýîéVæxãÒâ:àÞQá æÊî ùE.€ž8Ǫ­,.DÿRýþûD÷ô ô^õÉùÜþ— ö8­Vœzª&U(å''"‚@ Áéõäïñ§ö ùiüfúóÉìŠæ[âöà2ßgàaßháæ÷íõ“ÿ©h ; Ù W  † €À¤K"F·þûùköâô3óô0öÁú=ÿÙã ‘ØÁoÀ âŒ"%Ô% ¼ •ýñkéKè¸ìÅñAõÐõìðÆêÃå¥â~â äæîè²êïîÖó‘ú㯠÷´êkŠb lƒfýIù õ7ó†ò˜ñ!ðTï´ð…òõõÇú£8‹$BЙ“<ƒ( ¢%9%ï#öú‘ñ¬çqäâèLïôó÷ô,ìâæhãâ®æéìíðñãõ#û lÅC%CõÙ Äþ6ù5õÙòHðbîsë¥éöèÛêVî`òSø ÿJà iQœ“ ×1žÉ#ž&$ÿR‘÷òêâBàèäÌêüï¯ðÚínç²ãŒâ_åDêúð€õ`øXùÿýL¬ pÓ"$¨#¢Ÿ lþ.÷›òßî]êºçsä5âØâÅäÊé ï;öý¢~ ^ñƒ|>75á ¼" !‡’Yó&äªÛÄÚ8Þã^èYê½è£å†ã„ãúéðŽøvÿ~s…¸Ø=ï%!ÿ"t $~D Æ\÷iïÝêCå—â.à$Þ÷ßhâ1æ…ì+òòù°¨ I̳¦Xc‚¯Üo?œ÷§è±Ü»ÖûØwÝâRçè¿çÝçéhï-÷Ô ]‡-S‘êtt ö"Û ž˜ ùÌð7èâuÞªÛíÚ6Ú+ÛÂß“å=ëÖóñü* ¤«`å r!váxÈG§”; ÿGñ)äwÚúרèÝá¹åAæìçŠéî÷´æ ã°e›jNÈç·‘F QøÁï)ç%áÌÞIÜÚ¼ÚÜcà9æGíåö@ýÄ{ ê…1Âh Ð!U–—|My> “ Uüÿ,ôGè«ß7ØÈ×vÚ£ß1älé,ìïyôUû4]*V r ÀÿÙMm »2øŽð!é>äá ßµßDß%àâBå”ëwóûCµ s^y™ ž2Záï+ "âÏgœ,þúõ}ê–áeÛÙÛëà‘å[ê2í¯ñEöãþ7Tµ ¦"t!@I-[8 lŒ$÷÷ïSçåâãßÞßñáÄã”åóè ê¦îoóaúÁ ~°»9ÕNá‚û ã §›…®özûdóyëDâ„ÝeÜÝÊâ,ç:ì‡ñdöOüJ rŸ!+"ü!˜hØRŽùñBê5ä~àøß‚àÐãßçyìpñõ¤ú°ÿ¬" ·ÁAá9Ι¹ Ô 7!RÊ ¸ : ½ üýàõJì]ä@àÞß‘â€å‡é¨í¨òXù–ö ¹F( ”!pMÉ] ºæü&õ£ïèë/è@çQçºéÆìRîäò ô£ø ü¶W¿ »j·±ç  ùÂlÑ `ÊUÛf é‡ûñlé~ä-â¢â˜ã~ä­æè¦ì{òûý D âŒb°4þa±Ë ×ýCõ³ïµë¾éëê=ë0ì5ííáï‰ò÷MýzÚ ž¨™š&@{Á  › %0~ ÌtýËô!ëýå;âOâ:ã*å1ç¢ê‚îÙõ9ýìTÅK1µ °ëµ¥ÿ˜ùCñ;êþæ.äS忀émí%ðóÈùþð™ þ½\¶$,K ÕéïbÔ­ žvIg áøóïbæÈâàiàlãZåè…í•òÜû: à\cüÑ©·l Ðþ‰÷Jð êGç$åýç6ê!ìºïDòeõ*ø‰þ UdǾ¯·- á å!5Dt; 2 Œ0@÷ í»åyáqàûâå¿éôíNñÏ÷‰þ™QN9ÓýåB®z ?ûõ)î’èãåãúä…çë$ïóÈø,üß €ÿÄ&>¡­ fÜÿýÕý–ÿ5½/ } ö«ãújñšé¹äsâ·ãüçZëKïrôù ÿ:âÊ›ìûþ ’ŸÿbøñØëèç>äPâžã1æ.ê<ïµömüõ» ~+fßË7 ^žêýùŸø ùÂþ€î Ü_ 1ûJó1í(êÐé…é¨éeç¿è¨ëï¯ù*%™…‘[P2¢ >ŽýôëzåXá†àæã8æœêëïØôÊúZ³va ›gQ2¯ ã£þ-ú­øÓúRýÎØ çr©7Îÿ€øpò5í”ë éæEä ã¬æë·ôÝÿº ÷&ô5ÕÎnZÿ‹õ ì…æ)á°áDãÆçÕì·ñ°÷ßý?T Ç $ 3 þ > ¬ ü^4îÿµþ—ÿ$ƒ3+ û  QžûƒóÐí®çÒäÀ䵿é²î¬óýùí ur-¸ÖF Ž Ó¼û¦÷ò îzêðçDåDåbçQë=ð·÷ªþà ‰:ÁðK…Ã|«cüÁøß÷pöFøü]üúz/ø†ñ­êwåyåhçë«òø9þiV ëA?̬)½á >ÿyö•ïéåbã(â%âräçºì¹òÙúÖl ŒZ”­å5) R‚ýzöýñ·ïðÑõ¦ý`) l _üÍô¢ïÖîCëéè]ç½êÊð£ù_† {#ìØR„„þ•óÙéÃáñÝܸÞÚâ¨ç*ìhò¶úO rÿ³H 䡼» ¹Cþù{÷GøÖü°« ¨ ËÏûpøNöLòøï)ë7ææä¶æ’ëäó5ü2| É% !ï!šgÍáøgíçå‚ß¼Ý0Ý!ßâîèð±ù†ª kÿ ¼o¤ ÿþýŸö³ò!ðPð×ô?ûг ø"S” OýH÷õóûðìUèYå·ä»æxìÊõi ‹þ¢p>' ‚RûRò9êåOâ³âUäÌéï4ôÒûAkß Í%ä°rˆêØý±úù(ù»ûÿ.¬Ž öw ’møêïòêKäPãæ%èŒíÁôøõ} ^¬¼«^Ñ/… ÿöÅï6çðãžáßïâlæèì[ô û· é'ib5J# ]vÿ€øžó¢ðÕðéöÅþý—ò+ Y1öíæ8âÜápàÝànã'è™ïIú,ì5kÔ ‡ð×ùá jþ€ó é"áܻ܆ފã,éDîòõŸý; Á¢ªñäÅH øÿiú"÷>÷µüÄ ˆ¸:Ã~¡üÂö²ðòìuç\âÝæÝoá ç|òUþ ¢bÆê"=!ƧÈû`ðvæÈàXÝ|݄߸ã_éï¢÷Et nsÈ¡öbûÕ Ÿ{þþøÀõÀö¬úâ 4¸€æ ·ù¶õïEêÿéþæ“â§â"äè²ñ%ü¡ µ}£y¾f9 Çøšð/éÜå&ã俉éþî:ó ø=ý>Ë övÇtþô' SìŒû¶ùDøƒùMýw™õ †þs ͯýló ì¯è=äDãjå-æqé&î¦õfýÊÇw³á#1#FÛµ¤ü&ò›é²âðßLÞEàÁåßì ô$üi÷ 9öÚ‚ÿ$2 ¢^àü[öéòñ·ôKúßS \7“ ‚ÿ™õCí çäãäâ@áXàÇäCé²ñªþ* §âŠ!¡!9ú-arÐý óéµâIÞÒÞ©à¶åêKïõyüP T_cQhY³' }ÿýKùøûTæ ʆÞ& ÿÇùôï½ë#åŽà$Ý%Þ>âäëpö˜¬ žã½  ¤Sû„ñ~èsâ‰ß\Þ*ÞùáÛæ9ì‰õþ4Òe²Ê ¨ B¾.l rOý¨ø7ôæôó÷§üÏÒû û ŽgÝþ’þQúÔ÷"ô®î"çƒåßæ•éÉðÐùÛ« “Üâu/€ð(ÔþŽöBñxìÌé4ç»æØæìèYìòÜùш s8ð:2ý{ ëGÿ ûgùsùý.ôõ ©Lñƒÿ|ü©üYùóõïòuîÚëÆê*ì?ñ]öÎýóº øÞ÷¯ô«•W ºVøýò&ëáçÒæ4åèçÅëbïYô°û^¸ l'ƒýM Ç ¦—ÿ:ú‚÷î÷Žúz ŽiÕJ zû~òë å,áÐáÈã"åÔë%ò û"|PøE#k$à"flK Gÿ¿ô÷ëâ»Ý$Û•ÝDáÎèSïõøe« %ç×x—‚ Yüœ÷ ôõ×ûNï fÔ=Ï ?†ø¹ñvéðåÐâ!ß…ßhá»æøîø{pƒ!ê ¥Ì¯Mú2ü­ñjçEßNÜÝøâHèð‡ø¡ÿJ. º×-eóﻪ ^‚ümöBòtðró.úM« 0ªþûoÁñýEø‰ñúê‡ä¶ß5ÜàçïºúµU ä'þ¥òô WPöÜí8æ¨ãáâLâmä æ¥ìxóëúž zЬÉ0†zèú?õ òñÕôÒú¤µ / g € ²PÉý›÷òÌìÿæàåœçPëmòŠùQ!~ ´e‘¦4 eþ×ôUížé2æpæHæåèÐë¦ïõü˜¿ )iœ_$‰& ú —þÑûßû°þðË v" Ô )ºýö˜ñ½ìÑèâç*æ‘æßé+îvõœýoÇner†º vÿ¢óñê!âŽÞvÝÞËâþèVïÆøðß $ßÈŠir\ ‚ ¢ûXóªî`ìÐî›ô›üÍn ‰£ ] ÀîÿûÏøkóSïAí/ê1èÊêÑïTö6þ®“[Ŭôr ðuøÊïÏéãdà×à–âÙè†ï÷] ðQ¡¿§¶J6[þ)öxïfì/î÷õÀþÀ 3𙵠hËûüïõ+ìHáÖÛÛOÝ£ã„íg÷l¬ Sg` H#†"ÇØžžïøîõæ!à¶ÝÌÜÎßçäéì ö< óQdù.ì *cúÉóàðî¼óvü éò¸ ;¾ßÿ¦÷‹îíçaßÛJÞìãÆë·÷ Å BîLŒ ›¯  LúöfìMåà½ÝËÝUàäê(óüâlíæ% A CÆ… †Èùóó¥î†ëøïsõ»ü T nÀ j4©ÿpúiøööðBëÀèoæRè>îWö÷~ ÁBÕqF …Åü×õ\ïÄëké2èÿéÚì ïòŽ÷œýošD „X³#C¿ ‹yÇûó÷ÕöÜø4ûÿ$ ‹ :  Ó Ÿú«ôïðì5éÌé$éÉë^î¾ó×úÙ &«—›$rêêMþ=õGí{çâdà½â<æ9ì·ôöý«1 Ü>ÂõÕ ä \þ_öuï¶ì\ìÙòwü`S,?—s)ü“ôuí­êÍèTåâìãJåÐë-ôÀ ‰ð’ /Ýyñû Ƽù`ðaèµâDßäà¾åLì1ò•úcI Vfmu ôÛpý=øùöÔ÷öýŒvs=ªj‰ýLöÂñíêíâ~ÝÇÜ/Ý÷ã¶ìêöÔ9 H[12  ‡x®eü òþìaç¨ãÄáîáPâCæ‰ìÂôúÿ êU Rq¸¶6Á ²šý¯û“ü0þSÏÀ“–ÿuø›õ€÷AôÉòrñHìèÙé±ì8ñÇ÷ËüŒð„ dØÛnµX ‡ùøñéHãóáÉà’àáÿåùìIô¡ý¡á!0"o駇 WÄù”òHî ê¦ëµòø#ýÎ_í é ¹ Û ¦YÀú¸ôî ë¢ìiîwôEú˜þ—ºúå ýt¾¨¤ š¥ý¯õ:ï7ë=èVèYéfìñ-÷Üÿ˜ÄSKuX¨ 2hÞù òòðuï7ò&ø:ý.þ ÆÒÿ_y ÷†÷[í”äfßTÛåÛBÞ©ãhêµôfÿÖ [#š% #ŽÅ±úüAó.êgã™àß—á‡åõìròCø¶+ 3%ž7cÛÄ Æ Ã§ÿǪ 8ìX$%í èYø]ïoçÈàáÜÙ”ÚhÞtä6ëéõ‘g 1œ "\#?!0D-ˆýÌóèøà+ÛÁÚ3Úìß`äê‚òNúd ÒI Ø!…!PÑE «ÌýÆüvÿù3 z IT‘øŽñ›ì¤éìèIä…áfà·áßæ‘íÙõ›ÿ¶^Ò²v7×ÁõÓì0ããݪÜ<ÝjáKæ´ì^ôûŸ8¼O"ô$Í"UdÂç5þ§÷XñHîóð6ó‘ù{ýü$üjû'õåöøzöõ´óÒíðë@ì!ïî÷z¯Ñj%êYM<§ýýýóeéÅâÝÝÚßyã'éîÙöcÿ¦ E,P G"î!† wUÁ¦¿û¨òyëîé é¥ìáóÿû5ÿµ;’nu¨¼vgüªø¸ôCð$î¦ðŽõ¬ý² 5Ä ©Ì ¥ü"òïê ã¼à‘áåoëùóû=ù UÒ‡à˜J’{@üeö=ñTìèéÁêí ò,ú$ª ¥Ï'¾€” Hüˆô¾í´è,ä¦ä å­èÖîëöëÿ>8…oÀiã ÚüýRõÙðôíëìjî§ð˜ôDøûü´°t Ð ãµ£´ 7†úúõœò¸óÂùc æ¦CÛù P¼þš÷ŽðçwßÒÛòܭߨæ@ï÷§þ”û Ʀ]o!0s× ãÄû¸ô ìœçÛãêà×á3åêSñ‘ûDë ÎaP±¨nãÿ.ýTFtÎI! ´-ÆúØ÷îöñúìIæìâIßËâçmîmõ†ûu-ÊÿF!~"\ˆ±Õ %3ù+ðýè“á Þ]ÝúßÇäÐë`óû. ”ƒ?ÔÂËÎo ˜ÍÏýÈû–ú[ùºú øÉöêöÕô˜õ?øQùiú£ú÷9óáðAïøñZòNöúgüÌ}i¸2ôéÙÏþrõéí÷çFã³âŠáßäénï¢öùÿ¼ •mÅ_E[ ‰ò£ûöÆô”ôøùýÿ\ÊK üEù6ö,ðçësçÉçÝêcî±÷MÍ šÿÁ·Ó,¸æ ¨<üáõQî*èuååãËãŠæeêKïEö¤þòÉÒ;Æ ¡‚Éù ùŠü¤ö7ñDî~ïùôžú¿=Ç Îc ¬ôù¤ôTïŠëMèìè²êCíñô"üå’¶¢-:EÌ Oû×óLêçãÇàީ߯ãèéððûùàT ØO  7 ùæóðqñröŠÿŸ Ë2è‹Ç K^þ{ù9òaëdäðààûäSëõ4&Ý QbC˜W^l4DoýÐôë—å3á†à%áãÖè¦îåö§ÿþ Š€5Ô¸uÙ| j;ú^õò“õû„ý !× Àt´ú˜õÈôÍó®ï0ìéöç[êñ½ù:C Ͳ»³¸/= ´±úóò+êä6àÔÞ¥àNäèýðtø¯Á ‘fë0D æWqúõkó¿õïù™ÿÏi ŒMûfööKö¤øÀú ÷Nôañ_ïð`õWú£ÿc! 6 Ô94R7){Qü7òŒé£ã¯áAáïäDè‰î,ôÏý0Ê ÝhÞ-L²Å YÉü|÷ùõ«÷:øïüXƒ6!þÏ”]ªÿ°ÿ^þêøØò'îîé›å¶èwíòSûæ à%]ç0u5 ®õùûñ·éâØâbâëå„ëTðó÷´þAË *bÍä-+² ~ÿÏú‘ôŠòòóè÷Áü0²\ ZS Ÿ t^ýnöÂîåWàMàGáœå í¿ö¨” u]ïSUx  Âÿ ô¡ì=å™á/àTâ å èiîhöoý… ð芊¼aË Ç±ù“ò—ìÅë¹î×ô¸ýµí Ínå 7 —.õëìäßLÞÅâè¦ï~öËýË£†\Êg‰Ì ZÒüSôqí,è(ã´àZàâËæÉìsôNün' ë8V©ºpŸ¬vøô^õ0÷@üUø‹ÌzT¸uü6ñÝêÁä…á-ämê%ïÆ÷þK¤ n‘ê!!€u©° ’þõšîÆé#ãXßòàTâáæ£í?ôÀüV½ ¢Õ,ñÈ–×j gù2õ=ó«õlü)Oð!Nô&ØvþÁõ)ì­å1á0ãÇè›ï¨ùÿ:} A¼ªnóãZxèùYógí+çAãßáßXâ¨è3îW÷,¹qIöÎ,^¸ þD÷}ôÈö¬û;úQ ‚ ó ´€ÃþÁúHó_í6ç¬áO߃âáçWî‚÷Þk 0õg¾Pî}hî ŸvûÖóœëšåUáÌß9ÞÁáJäËênñÂùLá †5Î Ø8îÈüÙô®ïCî/ð%õìþ†Ë ͱ ÛÆ!ú}ó–î*è+ä¬ä äè·îóJûQí "í[îdGAú£WøÎð=è¼âÞoÝ'ÝÅáYçMíøöþݨŒîËE]f Ìû9ô½ñCò?õùý_ ¬¾›~ ÿUÆü³õ}ïæß,ÞÁáå í8õ€üAêô QŽwù«µÏ )lûQô€ìåüáVÝôÝ·à»åÓëÐôü=; žŸ<œŠ· õ„ùøö$ö?ùtû ÊJ ´@δýËømñ èÏâEß4àÃåïëéò˜ùi|’UL˜ !*P+à Ef3÷ëïöçÅàdÝÜÃßä{ê›ñ}øç" ÄzK l#!!¬ ŠËˆþ—øõÜõ:øpþòÿnÿ'ž&âûÇôþï™è–äwæRë&ñ'÷½üÙÎ Èh˜5\s £Bþ÷ñêäàÐߊá=å³ëvò/ùy ÆÀ¹º®êPuþŠ÷»õ¨ö1øùÿ‘ÓNëÐl Ÿÿd÷.ò3ì'äëãäç]ê†ñ2ùþ & àògw»6o¼îsùsó%í[ç²ã¿áÉáËã»ètî¶õüÔ¬ Ž÷ÿ$Ï…d%\ÿù#ötõøøåýú_€Ñ'zÿ\ú`õð8ënæåVègìNòû°Ø þ|Âz÷Ôz}y û1óí1ç€ã«â¥âOã8æ°ëÄñ‡øÊ å~Íwy¯ƒ[€ÿ\øGôºòEñ;ôêú”ÿŽ_× | „míû3ôDð9ë„çºèë ðÊ÷äþ{ èAŠM §`ù¬ó\í1çXãŸâBá¸âùçxí•ôEü0ö _gtbÀB™ \øòÓðTï—ò†÷ÜûŸþËY õ ) Q ÎøÄòëyç¦èÎì6ð«óðõ—úå[)DW¥|F àyü¿õ°í$æHâzߘޱáççìZòUù† ] àýtE/ÔÏ ¾ÿÐý¶ûÄùÝüÿÿýýð”ÔÛtý›õí·ç{ã{ä}è$ë_ðˆö·úØë "9VéÈC¹¯½ Žøøð»èôã3Þ«ÜZÞ"átåêì»óîúÛÝ [Þ!í$¥$V!"< çü®ùõ>òYóËôZõ¦úüþU ›ñý«öeî­ëøë8ëOîºòÍ÷«þê! *ãÙÔ äŠ] y¡ýö;îçêä+àDß-âåÛê>ðŒ÷Mþ6 £r"» G íÔ³­ ëÚþ~ú÷îø÷?ö9øŠûjýcÿ‹ôHÔýEøÃðXé^çèBë ñ>ø0þYã —âÕ!Æ"® kÔ? `ñûØôÏî÷鬿“åäµåçÃínógùÿT & GÉc‚ö§g~ ã£þ›úêø‡ùÅûõü3ý”ÿÐÿŒýðþ{ýÀù¥÷Tò¼ì%èÆèèäìâó€û§ù_åü '!Ý-ðrÎ÷¡î€çqáÓß–àâ"äJèÛîñôžü¿ 9Ò* S ×¹’7 z¯úôóëïIí<î‡ñzõJùãþôÆú Š›þæýø ðgì0ê-éoì¢òÖú¡ 8šu‚”pñ ÑÊúqð‘éLâ›ÞMÞÛà2âç í¿ôû¢» ªW×M\¡ Rÿöøîó¿ñrðñóÈó1ô·ù6ý—þ =žÓý¢ôììÏé°ëëbí6òöüNv zñ+À Føœñ<êÁãäá#à~àâòè¨ïÌöÝýP‚Ý -DJÛ3ÊI™ =îýøù×õ‰ôéõDñCíñð´ó÷–þ±ˆ¶þùâöxòÅð¥ïãïñò"öú¤ ãK øÉä cîýÿõî}èˆã|âXãåéoî¿õ*û‹g áÊÜ@çá²ñÿ úDøIóOíøîîïôTú‚/‚ä½ü£ýOü–õ‰ó)õjôEõ ú¡ÿû Xs'½: ÓËö÷ï‚éäâëãôç³ìgð#öeýxM ( ß È™ï²ëºu p G˜ü²õ¨ò—ðþïñ‹ôðöôúfüÛûWüþqýbý$þqüûúøËùXû‡Ø}L@qBŠ” Y(ùYñèŸãߟÞÄáÔæŽíGõü. UPVe§&&|þ  g Oe‘XÃûóöÅòïHí5íÖð÷óUõKùfü ú˜úíþ“<ªŠü¸ÿHwkÆ Ü!{Wº ÎMûwô±îªçíãâã~è-îðö¥þ<Ð ñíÛ6ô?É™* k ¦>:^Uÿüü øHóºð í®ìÏî6ðxó2÷]úKú{üQõݤ 8 ] 3 Ô Ö  ñ 2  D 5 – ]þÿøŒñEëæÍâááÔä7éÁñšúJJ §žÒ:[u³çÁ ¬&üû;üüÇþ$þXûŸøÃõúò¦ñÝóuõö´÷•ö…öö…÷Kû@W¥ ì è ïÏE/  žk¦ uc÷*ü£÷šñéOâÕÞ?ÜXßä/ê¨ófü'Å 6¬š§PYaÓ µ…Qÿÿ鎄ü¬ù ö›óEñêó”ðçêÞè¹çäÒé•òfø;üÿy7 , ¬²,nÒ–µ :œ/þù©õ­ïªéäÌàÝÝîàÿåë©òùãí Ðï0"0#¬#!U®þ`ñàýjûAøføøtô´ôNõñôŒõ@öTó…ïœì&êgê;ë„ïuõÆüƒÛ ](ÁÍfCe )Kütõéð¾ëºæ;â»àhßÂá â±æ¦ëìñsù ' 5¢‹"/%;%Ø#Né9 Ü'¦ùwõmòÂïíÆðñòóÛ÷@ù$ødöåöôñ$ðíòFòãõzú²jrÚ!‘!y ó¬ 3 LÚú˜òêGäéàíÞ)ÞPàÖãáç^ìtòçøèÿŠ¢kë!#ô$¦#º ¼¹ga Ö©ý²÷þñ—íìëì^í ò|õõvö?öòæðºððcðíóRõÙøjýP% Iª"&%í#y‰þâ Ø5þ•õVì%ãÑÝÎÛÛ8ÞåäXéÆðýøþ÷εq¯T!¦!‡ ’\K ›¯kû+õïhêXç±çdé.ì2ïnñýógóñ1ðhñ¥óõéùìüšþŠÉ Ñ`"r%9#aš Q³ûêòpéKàäÚâÙÆÜnà;æˆíqó¥ûK ]øŽ  f)c Ðéý8ú{ö¬ò3ï*ëÉèééêàìrï’ó«õSõàöSõööe÷Äúýl^yM R§åKhžšT bäú<ð‹ç·àÚ@Ù.Û¿ßôæíôûÙ[ €äñ¾±¶“ µ~2üøÆö‹óÞïìëèüé‘î1ò€ô¨÷ ø’öòörùeüò$ÏMCA}* )éÀìÜn² YGûàóáéçâ9ÜÙàÜ à«æoí8ó¤úÞU É£Xke’ø DK|íý»û÷Wñßíýì)êdéüìPíìÄíÿðròõXúËÿ°¯¬ n ÿ :äæ˜Î„åÔÚ:ô5ýõGíåß-ÛÖÜ5ßþåë?ò{ùxB )ñRò µ™5Ãûh Ê o þý6ø ô<òî§íOî4ìáëÆì_íhîÃñõ:úþ`ôø œ[œÙOHù¸÷-¶ s#ûý™÷qðé_äkáÛßÌá{åáéõïÈ÷üö ú+JI½œkÄ€ GÏVûqöÑôàòñGñÜð‘ïMíÎì)ì…í#î›òˆö&ùýûö õ…ãRŦXÎe ŠÅÂóûÈõzò6íoç°ä‘ã~â¡ã®è íò×ú;k°ÇD ¤" üGóÙ øDü°÷¶ô$ï¥îÐðrïìˆëÌêêèZèÉìxîÛñKõføâûÀ‡M íÈa¢"}‹¥ KÄqÿ`úÂ÷XópîcìËìHé[ç“è èèÿíšó2ø¨ÿÙð Wc Ü I ã ¬ Ò¡¸þ÷ÏòæîMìÑìRéºç«æ½å{åõè¤ìœð£ôY÷ÏúXýbI†zÁ0Ü[í‡ D+5þ~ùÙôî‹ìßìËêøìOï1îPíâð^òÇõgúÿ¹¡ 1 ©þ¿á‹ährÖ áÁþ8÷¾ñÿï­íÄêQèFè%æ{ä­çYëÓí›ñ%÷1ù—úÿÔBoöV=È ŠºÛüöXïêŽèèæéëê‡îñ©ñûôÎùÎýX™¶ 3 ”pÈY¤ “T æ«ûÏõÖóeðbêªç}åÏâTâ=çêí¼òÁõØ÷1úé&· a$Ü.;5aYíÏùÒñqëçÂå|ãÊåiéBêÄíPó+÷ëü†U 7 3ÿSyËKÄX/ô øæüPøó5ì¶æåãHà'ß)âTçë~ï’ô˜ùüñ„ † ç›Pa”÷(è)h ¿øú+òÃìoènå±å æWçQëðàõ\ü,@ 0 ±õýü­·AVç Ÿãþ4úeôºîÀèpã¡á#à#á¹åNè²ì¡òn÷óý ’ =Á|v¾ü–Z ô €þJú õpñQîmë˜é‡éjê`ì¨ïùôúÈ"! qÌÈ1³¨¡T]¹·ÿBû)÷‹õ5ñ°í¨ê ç1æåîçiê‰ímðvôjùþ3 i7·Ñ#…8  ƒšþËù§öò ï®îXíÁî îÊðò@óèö)úÖÿÍÙ ”Á×dÎ?·æT ±«ùóî¶é}èÚê™êÞëÜí•ï7ðòg÷žú…ü¦Ÿ"BfØ i u Y ë 6â‡øý­ù5ö6óŒïí·î6îæñ`ôûø£üYÿ+ni ¼‰:õ«¶ôŽÈ uVzúJñyêàåràMÞ¸à#áýå¹êÚïnóµù¶N† Øü(Ü7´ ½  ùø(!þ"üPú’ùìù÷ñökõóœòñÇòÌô[ö‡ø½ûüåþª õõ Ÿ {òÓI¯¾ÕÙX+ ½ÿŠøªôí†æ¯â|Ý…ÛkÞÕã;è÷ï ô˜ú6þvå 쪓k×žš ½ ã5þýûŠ÷ò:ï í4ì"ì‹ïWò2ôVøHý¢e úå%Ñ¡,À t õ‡ØüfúÅú”÷"õÖøl÷¶ó›òYñaîzî¸ðÕòCôý÷iùúºýW,  — é O … ž Ù ¡cI8þOü9ûÃüðýBýâýîýFüÙüvüûÕû¿ûmúYùq÷íöxöRõäötøªûEÿ‚éÈÁ:ಠ-v¹†û³ò,ë©æ8áßÅà-ãçœì|óÀúþÌ ü ÁÕX~ ý „ ü5ÿýhúaù;ù’ùfú‘ýX€ôd €  Ò Šçÿêûµ÷hõ,óÈóøôKõ!ùÃû=ûÒÚíl à OYCÿæþ>ü¦ú¯ùvù*øæøùSúÄúàü¤þ´ÿ)÷©ÿ©? ÿ‘þµý¦þ€þ4ýHþ&þÌþ:ý¸þsþIþ@ÿƒ=ô’G ³ © h á š ç $),øÿÌþáýõíðªîõëMçWçÙèÉç³êíÅðrõäý!þ¶ o¬À©é Å Ëm=$üƒûóû¦ü¹ª_ r¾°4… B ÔFü¢ô½íXæÇáÂÞœÝèßTá–ædíKôNüáãmy%·(_'T%L!£‹í gSøzïSæÅÞìÛÚÇÛÙàÌæ²ëäòùUÿFN © Î Ê ¤ æ‡Æ3 àÿ~ÿCÿ0þ÷õäîAÛ%5ØOÞ¤j[ý¤ü=ûùsùàúxûNûùú‹üû½ý‹œÿþôü9û´ûùOùùø-ø?ù†úõüFÿx‹ K* w/Â2t¶ «ûò@êPä¯àgÞ¨ÞNÞSáYåêRñÞùDU +Ñd W!2 t¼ßÉ`F!ýÛù|øö÷ö÷ôùœûºýhÿ™éÿzý«ú·ö{òÛïÊìÃë'ëŽìbíÞñ¤öÅûwLè ZÿÑ?ÇÅÓL¬¬" ‚nöÖ'ÿBüoø¾õò4ïÆîÓïuïð1ò ò¶õbùvü؆ $—&)4ô0ï , vµþNún÷gñÝðLðýðŒò•õR÷|û þ«þ Õ 73ߎýƒûàúuøá÷^ö¢ö¬÷ìú}üÉÿÙ#æ ¹ ë_e  fžQ”ÿþ.ýOûúü€ý]ýýüþ#ý¬þˆþü†ûjúçú?÷äöþ÷kõ¹ôäö8ö=ö÷aøËúûîýÒÿ=Ô Î ß ×SÎ;`d²S  „^kýøÖôúñšíÚì9ë¨éÛê¾î'ïäó øÁü7ÿn±‚ ‘ñ ” K¸j üeúnûÛûµúâýÍ€‘°âQÿýûŽø°õ*ó[ñ ï]ð”ðˆñIõ¯øúàÿú ƒ  Å µ]‘ ðÜ n æðÚ<ùoÿY—ü@ûûq÷äóïó×ò¦îPíîýîí ðQòÅó_÷ üÛÿt^¡ É ( G: W ¬ íSó©ÿÀü×ûzûùÂùþý…ÿu8л5æísÓˆû´÷ ö»õ0ô~öY÷’ùŒü´þ)¨šÈ ðÚHº?ýù&ôßó±òKðqòó¿õZù_ýMES Š ïMiI˜B ÂÁüiõ³ñîaêáéèêÓê~ëþðEóë÷ ý—‡ (¨¸bºÌjËÍ( ‡ ]iÁÞþtû´ù¸÷ˆõ#ó2ðxí”ìªì&ë6ìíxî£ð‹óÎ÷‹úèþ~~™ n T A ØRŒm* EÈx Ö'°Mý”ùcõõòæðØïýîãïð˜ðnòÍ÷Ùú÷þáòó ¸á朠8#ô ª JAþñüÃù‹ó ñÇòŒïëíJï\ï6òjøùüçÿ'Œ i y —é%'ádÕü³üSû÷qõõ óQñ|óõõÊøûqþ10ß F ©bÈþDÍnÝ ? 3 ¢Km$0ýýû‡ú¤úø˜÷*ö¬ö+õ¼ö'õÆôºôQó8ñÀñ­ñ§ññæóJóÛõÍùü[! ІÝO.ñ¸‹Åx°dú|óhí£éoæh哿Jè6ë8ï÷õpú¾U1 鯽T+æ 5 ”ÿúö)ò4ï–îåîƒîÌð_òõ?øŠû¤ÿPXyžªºŸ«þÊü¼ú,÷Þö×õõõvõ°÷ŸúHü6ÿ0Áû¿ R òèÌb ž )u+þsþ´ü#úÝý£ýÆýÿÙȲ™Á­ÿ\ý¼úêøÐ÷€õGó"ñ­ï ìRë‰ê•é;ê&ì+í±ð¿ôÄøˆýwÁH ¤¸½Î¶›y"· ‹<ü/öŽòäï™ìïìIì7ìTîjòFõñùiÿ¨YÍ« à ù 7  þ¾ì(ý¬ûuùµ÷”öµöìö÷úIü×ýç뎻&›5þbü™÷Ãñ³ð2î<éˆèÉê§êgëyðõ$øÒýš öÃ"'!\"#e$? ¥û‘z T¥íúöFó¢î‹ìkî¤î ì³ðnóÕó©ö©üdþ›ÿZðaxÑ¢Ë1üÆú‚øñõoò©òIñï(ðñšðÎñÀõjöõø½ýÚ:‚ JýoÊåÓʉ<cg ú™év<þUþaûNù|úèùöù ùÒùØùgú6úvøù8ù®ölõz÷ õåô#õV÷.÷÷ÅûÃþ{ÿj@ïØ g Œ , Ï ~f±ý’÷aóaðì)é èŽè'ètê$ícñ´öñý ? iÕ‰¹"%%6('Ý%¦#ØñwN•Wÿyúxó^í“êûè å&æçæØé½í ïòrö˜ùHüþrOÕAÚÖÐsÿZþœþNý4üâþ"ý?üÞþgþXýŸÿ)ÿ;ÿ¦lÅm1¹,… ` " ðI1>½û h ¶ ¨ )Šþ`ü¼úö-ô$òßïáîDî"ì¢ììîí˜î}ð˜ñqó)öbøÁúhý8ÿsþÄ Í · ÷ Ÿ 0 W • Vä¿ÿ9û2ù[ö‰òÒñêñzïçð6ò6óïößû+ÿáX >nsØÁÔ"!'uàÄ” ¢²ÿ#ù:òžï*ìçÐåÀæ€å°äÙç•éäê±íÎðåòåôÕöÂø™ù•úêü³ýþÿ§­l Ø ” ‹A‘ 1  8 2ÈSÿýEü%ùYø7ùúRú;ü-%*ç e üØôð ’ ½ \à oû.÷¹öFòmîîï¢ìvì›ð=ïôðóEõoõòöÏù¯ûUü2þ‰NT3ægR†âX' {§I &àÂÆþýTùÕ÷Ñ÷ß÷!ö½øPûýx¢# Á2” bÇ_•BUm |LÉüö…òÑíçèñç–æ›ã‹äçXç~éìêïñRòþö÷þø%úQüiü€þ%Ÿ]5/í Ï:Œ§Ó½Ñ Ø ˆàY@þûJù•ù.ù=ù9ûþ´ÿ憸÷  ƒ … Ï † F Ò­ýþúÁ÷Nôµòªðçï¯ïzðãññWó õLöS÷4ù`ûû‘ü¹þwþ]þþ˜ÿvÿÅ,šA7Œ•É+¤ª³/S%Qþ„ýlü¿üÔýý›ÿ¨«x µÐ‰:³µÕ5܈ êÅü öÀò¡ðì9éšéUèŒçÍé^ëÕíuïØò¤ô³ö÷¡ù•úfû4ü†üƒü†ý"ýÇþ°ÿœxI¨>Ð 9 O p 3 z Ægɹ™¢Ÿ1¼# G F § $ o  ow†ÿíüúR÷ÈôSó ñ´ð}ðˆð‰ñ,ñíòŽôžöµ÷ÄùMûŠüüÛý¯ÿÿ'ÿ #G±ýø}œjVþÑþAýû$ú•úJúZûûý<ÿî å¢ Î M=Ì^P¿± ª W#ÐýÏúûùJ÷çöDõõpõ õõ\õ“õ­õkö öOõúöföðöõöBö1ö‹ö[ö÷ÄøZø×ú(ûzüŽý§þéÿQÿЕžlÖ›|md © Écþ¾E9»n Ð  Zþ˜ÿÖü·ùi÷ƒõXóbòòò=ó¥óØõg÷¸ø<úzü^ýkþÌþð)QÿôÉ&ÿ]ÿÿþæþwþdÿ?þòþ‰ÿáÿ£þ¾þTý½ýû>úñú½ùiùùŒùéú÷üþ$ÿ¹è¦» Ä R M j ™ y N &ʉ‰\¢þÚþvþ‘þNþ´hpj9ë• &ñ÷ï1jZÿ“þKüùú`øJ÷ZöëôÏóaôÛóÿòJòçóòQñ˜òõô[ô!õ¶øcúûxþ­Gë € ª  X…­ñR ‰ - ×.=¤ÿý‰üòü%ûû@ûóûîüwýÕþñÿœ¦­õÜÒ ¸' 6T ÿéÿþ]þîþ£ýýÈý\ü#ü ûzúñûûûfûQüPþiþÒÿð#è6”d¯½×ÁýYû øCõÆô˜ó8ñÝòSóóAõW÷øú¯ü%ý‚ÿú†–ñK / « X Í B m d K   1 0  ë ÂáÅ êþüßûÅùGø'øÚ÷4öBøœøãøPú ü ü†üqýÞÿWþ<þHÿsþTý¥ý‚üpûYúÁúùøIø}÷À÷øXøøãúúOüý]þ1ÿ½”mý¥%T ' G \ðW-W²†£þòü¬û®úrø­÷³øUø÷Öùôû¤üœÿ‚Š{å ³ ø ‹†È Rü L ü zé¨5þzû^øLõýóñ^ð îÙîíÞî î7ïUð¥ñ»òçô´öëø‹úBüÒÿ ÑÏgYh`!Bz<ÿŒ[_ÿ³ëì7  A Ý«î÷eø Ç U;3ýlúöó®ñï íKëÇëcë¤ëfìîïÚñÝóåöÉú\ü@þç%$×"Î ë T W .•Kåïþ=ü%ú÷òöóõ“ô]õ'ö ö­øŸûêþ×ê€ ³ „ 4 Ï ö È º . ¥ªiüý¤ü/ûßú¼ùãúnúëû ûŽüâþÿ€Ü«jþ"T4URî„ÛÑÂþÖýûqù÷,õdóhò)ñ‡ðbïïññ×ñöôC÷€ùŽüÿþŸˆð Z  b ö M o †š—,Óÿÿ§ÿ¨ÿù{æ)þò¸²Ä¶ÓãªßÿÇþ.ü'ù‚÷õ€óPñ}ðbïµîÍîÐðbñ£òïöAù¹ü)þ—î V @ Z º z ¶ V A ·Ê­ÿ§ÿ*þ®ýºýrýücüûðüCüHü ýˆýØþ{ÿvÿ³LÐ÷\Âr¥ÿjþ‘þjýbücû«û'úàúJúKúãû,ûÚüŒþÿòý£ÚY˜Œ ” ¦ Æ ¢ È ‘ Ð÷Bh Ïß}ÌÿæþpüïûüúDø¿÷ú÷õÉôÏô¯ôôô»õÓö£÷ßùbû üÎýíÿ1ZÅ*ÓëytÙÅ\ÿ{þÐÿ þqýÑþ»ÿ;ÿ7çЖâÖ.Þ £ ¿ ß ô n ¨ù¶{gõ‚ÿJý-û™úQùø7÷(õùõoõôTóöôBô±ôòõÌ÷7ø”ú(ûÆýGÿ\>Dæ7G ¥Í8Ÿÿ³þÎþHýãý…ý_ý‹þ.þÊÿoÒ*$;–¶0Yü—Fª–…•öÉÿ¹þáýÞüÇüûzúÌú.ùÄù™ùkù%ù%ù†ùÙúúsû!ü:ýýÚþê ÃQ$ÉVâ¬èà0Àt&³xPéä 5Æ[eª0y)ëȦOø,ÛO"õ‘ÿäÿsÿ#þ{ýßýeüûüãüdû÷üûîûÏû·ûüüVü ýý‹þþ¤ÿÿ^ÿÕeŽ™gboP±^¨ÇP+"Ýòùêõ¯ß>8Gˆ×½xÁOùbYêÊÕƒ ¶/ÿ¯ÿŠÿfþøþÑþ¨þ^þ(ýãý±ýÎýÕý›ý³ýëþþ"þ&þþ0þ4þþþ9þRþIþþHþnþ†þÎÿÿ8ÿ'þüþüþáþ×ÿÿLÿ4ÿ<ÿƒÿµIÉ_Ã$¦Gƒª5=ÿÉÔ¶jìáy'ܾH ûÊ™</ ÿ¶ÿ‚ÿHÿþÑþ“þ8ýÐý’ýhýü×üÊü{ü%ü!ü üü üLüƒü üÖýý=ý‡ýÒþ þyþÄþýÿ6ÿfÿ™ÿæi¸ÎES~›½ç=?6ûì1o„}ÆÐ­¹Î³|Oîˆ?çhÿõÿÿ4ÿþ²þyþSþþýíýËýÑýçýêþþLþþ¤þ¬þÛþæþÚÿÿ3ÿGÿbÿ±ÿßÿ¹ÿ®ÿ¢ÿÿuÿvÿvÿ8ÿÿþóþÈþ¹þ½þˆþ~þtþKþKþ:þ"þþ1þ^þaþ[þ~þ™þþ©þ·þËÿ ÿÿWÿnÿ¦ fÚ/¨I£Í÷$#Ά/ç°q%û¼MÿûÿÝÿ²ÿÿ¬ÿ¤ÿ¥ÿÿ|ÿwÿmÿiÿfÿzÿwÿmÿRÿ/ÿþØþþþmþBþ>þ@þþ þ+þ!þBþrþ”þ®þîÿ.ÿLÿ©ÿðV™Ûéû * Ø»£€ysg@ ÿùÿãÿüÿóÿüÿòstk-4.5.0/rawwaves/eee.raw0000644000076600007660000000027012327014024013242 0ustar garyþ1ê)@&=QÁ#=•M½ ¦ > Ã%ÊÿpúÉú3÷¢ôùôNñÃî‚î$îÎíCê]éìKëÃæ!ë!ôîÃê÷öý‹ôû¾ AØþ¿F ª}LÑcÝPÍ]†ž¶ ­Êiüøüëø2êÖæmëårÜ´áá£ÕÕvâ6Þ£Ô×ÜÚã~Þ£ãçì±ësëÃóÕû/ýƒþwþ1stk-4.5.0/rawwaves/fwavblnk.raw0000644000076600007660000000100012327014024014306 0ustar garyG ‹Çø%'+0û6¹þþ¢üÐý4ÿ±ÿûþ€ÿÞü7ûÁûáú¤üßú-ú„ûûÔýþüÆoòŽÒ/¨Rÿ‚¶üîþ—ÿ ýKújúyûsýÚüýÜê>ÿõþé6üÖýëü2Cÿÿ tþmÿ^ˆ-k!Kÿ<ïÿ»ûÆú÷û¡ö„÷[÷Òüúú×ÿOÿóUÖA¢ý´ü¬ÿ{e|Óþ‡ ýéù ù`üÝû ÿ½ý‡þ@ù¯ùvùöýúµýóþbËþâüEüB¡PrŽr&Oÿ1üáý´ÿ[þ6þ³ùàüü4ÿª¶ó´ÉK.¬p–n+úïøaû’ÿ*ÿ"ü𘶆þ)ú1û’üú>ü-®Å1ý§þgûþˆÿ™þbþqÿÆ"óÍÙÉsïøGýÀùü…ý)ü(H—þâXbøÖø¶ú+þdõ„üüu'ÿ/þíøÒê¸ïCóðüƒúÄûŽÿ ùéñ_¹Å –ü Ë G l Öî .ÿ*ß‘ÄÎ Ì3 ÍïËòPÿ¿ó­<ñ̼óš÷*ðíòß÷eú¤VêôõöûëöQÿõJØ(ð! Ñþ<bù˜L#Öø<@ÔøÅìß%àzèñTÛðK%…Ù¬·û„κùÂáàðh&G¤[ÍX—ºv ¤¼Õ9ê‹C¹–";Ðö["ÍŠgpá2s:¢5×øMIDöuH“ñÈÙ@í¨"  m Vüa…è5ª}å¸èÈî½Úý‰N ´j , V!KÄ$# æAráÍë¹ÏŒº’눠óç`Ý^ ÿ“ÎEô‚“ö/ü%é½ÖŒç¤Òå 4Õ…Õç4_ôç+¾í5½"ñóÔMI i@Ô¬ÕÃè•ë/[/tØ &š²Ä2&zùsõÕ $ûr2#‚Ÿ±‹ÈæõÔ¹ÿh§šÛÐuÊó"ô‡Ñ¸H+þBÙ 5s£Ùí=?$÷Êù~ÞȱûÊ%?@ÑÏF=8ýïá‘5ØóïR)-ò2‘ö¤tHÜ£ï–>£9” µ;×ø´Ò·N‚ "-*#ñÔ¹ùká -^çjÝÄûô⛫Ëáéù%á«æ¤÷®[ôIÝÆþÀþ·Ï×Û1ý¯Ñçˆ àÆDâ±$¿ç‚sê$²ýxiÞ*÷ÒÛ!à¶Bþ­E3ʢëÏE‚Ô]8Ççæ‚ò¶ã0Ð,Ú,'“ί®ÈY8çˆK.ñ;3xõ(ÿ7 •7ò{A»ô) UßöŸ/´m€¬ð„-Áá˜2WéiÈ%¿öyÊùM Gï±ÌNÐÁä>þÿ )?âBïºËû ÀC”ä* QõµmôbMÖå Hㆪ,B!9ôÞÚÛû{¼÷6, ÄàKQûdæM;}æcé–æÕ)ÿUüLDþSOàÞú<Þ=Â: ú`¹é,ÊÊFúuMÖ4°Ø1ɵÿ´ çÿý%è,—*p,üÚ!IûQ0ùÓñΉ,+í_¸÷* ƒêç¦ù úè ~Ï[ ä}ä©ågü»äñß0ºÞô µ2ªð¾Òæ oÓåVóÐ7â$Þ= h åÕþè#¨¥*¶¯.!] ²`Ç.3êåòàõõ»fúä[ã?úûøPcóÇîþ×QõèåÃïöÞÔóæd‡ØGæó0éø;ûUô- ÷c  ñ…àCÀ €yé’xþ¸ Õùhö$°ì %èF?QÈöskúèކ׉¶Ö) ´òL`ëæ@ãÆZ¾( äÁôþéÅ@þÈÓ$9÷}åoÛZ ¨ï¼ døóüÜç…ô¾ÿ ù6çÙû£Ù5ëãqñ ²ÞþXö ÃØÒ')œ êGãwöbòÔ+þÎ ¥óàÿê’é'óûHö ƒô­úUká‚ߣü4ÍÇüßð„ñú½eùõä6؉ù:*ä¶å« Ü÷Aö»ýZóÅ1I×ñI ¯ïe¨ì½øç.z ÷§)¨Óv„Ëy y;üÅyÓâê)ú¯÷AãÆåÖèÝþ ‰»è}Á ½æÉúSÔ-èfÕ 2 ßõBø'#/6 û9;Ðú>õõu$HþEùÿ¦îØê±@å¡ ZÛtÚc Qßßý¸ÿsßWócXúoð1e Õð7+õäåëíîûÿíé &ŠÉÿWûè%zð-Wpø¾æ­ Ü‚ý–ü'ÿ× …î;õ¯ü0ìæùXÿ¹ú¢ç÷Ì9éØó õÂèùô@í*îÞüV(@ `›1üy ú@›°ù ì† ãÕõ@p§ô1ó'ü†ùeQ¬bú‚çõú[î©þ1ðüý4ü0ûwê ë1ó.ÿ¦ý~ñÄûý>õjúyíùQö12ù Hžåþ˜ù: $ÿ±øgüyíª Bûjúkï<ïõ ߎó#õhýtön÷6ô‡ëO)Ää ñãðâçÕIñöD d"ûlî#ðíù\ ’Ï =çÓ\ûÁ 6ðWüûüøö×÷…i %÷Hýåþóöú|ð¹üPtö†ú =ýûˆÿîôq)ÔW§ôtù©ñ—¶&’*ö5óçÓ ÝMü–ìoíŒößñuþ6îÃûîÎëBˆHïG÷yìÿñŽìæöXÿêøÅöÐøR š úV"O§½rîû?ï ¤þ¢ú@ñ€ã_éGé²öåôùO Úý«ñYôµ÷éãwã*콸ð•þ±ïþ2‹î”Ÿ÷Éÿ·üÔ  òþ1ù Ÿ ÕVûFÿÕØû9æ‘M§ùàômúHêö>„÷.ù€ú-éjWµêÑIôÄ÷=ûrýööD¨ ´ g\F†‚5Nî¥ókî¼Zô yø©ú1÷ôóŽý…ßïG ‹ýeüt & øô@ ²û¬÷áñ_µ÷Eó’í võjÿ k ²ñ†iý¶fý ©ÎëèùoÇz Fz Já÷öHú)û»ß‰ghüYÿî¸ü6õ¹|òÒþÈÛõê+ž7ÿÈíÉ ';† 0yÿ[ûÕwúÊôø@ -ñû †ôXõ™{PõQ eð—ìú“ñØ °ñõùèõĤþüy&úÕþ—Dczîú‘¾þ±ÙÊ[ÿ~ÀöqúMú·ý–ü,þ•õ‘íþSú„üå ‘Pûwû®K AŸ ô æ ©Jõw¿Ê -P ª¯äë>ùõï¥þÓ Áåaþ`ö @i w÷Áô\ô¤ ëÿ[õ„eE1õoò*ø£óà“ùú­óþÕ Á¬ûŽý¸Ä6qпûøfÿwÿ ¢ü¸ ü®óƒ@2±÷N˜=Ìë6ñ*p ÀãMï6ÿìºùV£ù_ x_ÿµ tFj \ *ü«üxdÿûüªÝîü”ó>þU òû( ~ºË€úÓöbAý i5=þõ¨ý)þé"ô¢—êÏûû †¼ùØ ~ó˾èûÕíc®ù÷¶ýZèz/A› zNûõóø\û[¹íÔþv¬þíõÙ ¦žK)«t ÚzýÔʨø­ÏU6 ì‘ùÞ¼ 1_Å] Bûôù8–ò5š 3 „…$o «þº P\’ A/ 'Å¢pÿUò¥ý û—ð° J @À&Pê j€û {Ÿz  W[AI‹ø~Ûü´öhù ,ÿ f‹ ‡ % . e™&‚Ö2 ×ýþ$ýÀ ØC G*Ù “úKG& þVnvôñû7¶ø˜ ¡÷ýÖ •'÷›Ÿ ñ&ú û CÀ˜y˜ {Ž«ý)ý£ýƒ 0" výøšý+ ¢ø¼úÿ®ÿ÷üªú$ÿÂý¼ ˜°üVSñðÿÏþ^‡þÀ DÞÓýTýýã “   6ÃèÌ÷cžtááõÑùxŠööß•ø4Zÿ÷gøúøñFø?Ûøxþ·ø,ú[bpŠ2øg÷ú™ ÊùmûÔuù÷üPú,þüiù“ëùªü]ô§üøËû÷ñ·óTúÕû°û¦û$ûûÔø4ùzý6ü7ûh„öŒø!ú¯ûûöüº¼Oü½EÿüHÿ@ùvù×ú¹û×ýr1ùóýú|ø.ÿýó”ÿ1Íò0ú\þö•öDÿÊýòÎ¥ülþ‰Pü.÷´úÙøÚý‹ßŸý~ùÓúWª¨¿ Mý0û;ƨùûLö{øxñоzúäó2ü#ýÿÆþèüý_þ‰ÿ€þ\ý±¥ûÈÿÌÚ_ ž‹ûŠEþ'Àþñþ^ ÿ—ûýžþ˜ä vc¿ÿÏ+þ@ù`¶ÍûøÙû?ho÷¥úb úw¹  ûßûªu1¢ þœýº ˜¾ý€€ þ÷7ÿjýOþ˜¼ü;üßþ)ü}ü6üþ:þEÿ»û1Zþ¾ö¢ùv÷,÷îÿ÷þvbÿ5ÿ›ý#Žÿ*ÿÈü¿j÷¥|ýgýÖúÂûÈùkøÅüþ¢þ\ø£ý0¸ù÷ùÓúhø˜ýÇþàú­ý:ý.ÿM µZXüãüëþƒi6üRüÚÿÙûNøƒþþþ ü}ûÃücûBúoøVûÛÄùºømüëúHúøëüGú(ú:ùòŸü’ù‰úúöQûö/û ûWóëœúÝý:úü¶þ<þúŽú‘ûF)ürýTÿ®ø<ú@ÿqûs÷£÷9ü]ülHûæ÷pù©õ-ôøùgøùQúÕù·õ-ùGüú×úhú™û1ûÃù¤ÿÝùøù^øvùÞü_÷²÷‡üû5þÀö¿ú¬üaø÷Jù`ýƒý€ý«ûù‚õzùúîú¨úÄø˜ûJùSø~÷(ùïüEú‚ú>úFøÀüÅünø û´óøcú€ûy÷›ú»ôºù4ü;÷®÷}úþ¤÷ô«üi÷¹þ3ýüpýú úsú­úWúd÷&ù úÝ÷!õœúY÷öìù­óúø£øý%û(û5ý'ø‹ùMúQúWøñùsûßü6üA÷ðÿü?úÊü!ý_!ÿ\û²ûùø£óÒý%ûUù÷F÷ÁüÁùù€üýø|‡ÿ`ûƒù×âû„ú>ü{ù+úñüîþÞù¤ýœø÷=ø÷VùÞü´ý¸ü‰ø°øñÿýPV$þ/ÿÑÿµú|ùøeú¢ôÑùüù€ú&û$ôtú û;ú¢ýÂüøý˜ü9þfþ×ÿ¬ûj þ@þ1ü§ü’úFûwýëú¯úüpÿ ÿ ý|üŸþ“ÿÛüòû»ü¡÷LüYü6üëùX÷›ù„ùû"ú ûîýÔ÷.üûåúÏúÀúàÿMüÌûû?ýý…ùäÿuý0øú>ÿÊücúÎø£üý©þ€þVûÎþKþ‡þËüxüÁøPøÖýþ/ûlú1ù\øòü4ø¶ü½ücý>û²ü;úó÷ÿýù@ýžü'üÜûáþ‰ü2üðþIýýôúÞü˜üÇû;ü.ÿûþýüªü9ûýÃüûú±öÐý ÿ‚ý%ý>û—ú:ü¥ÿmþàù"ú†úMþûÐüÐþ‘þqûyû„ülü{þ€|þüÛüEüúýKÿ5ÿFÿ×ü©þþýTÿµºþ@þüXþ¨þóÿyüØþäþoý þÀþ©ý«stk-4.5.0/rawwaves/impuls10.raw0000644000076600007660000000100012327014024014146 0ustar garyþ~„z#six]ÖP‘B,3.$#’öû¾ñBèÅâqÞTÜbÜyÞ_áËæcëÉñ™÷qüøÞäÛ § ? ­ ‡Pÿ¨ûÌ÷þô{ñvïí‰ìÏìðíâï‹ñÊôt÷[úLýÿû¿Õ@[þCûëù}÷ ôýó4ñàñðÞñ9òó{õ7÷3ùMûaýNþô8X&vÿWýÛüú=øXöõóÂòëò†ò™ó"ôõcöôø­úqü#ý§þãÿÄ:AÿÙÿýÝülúÎù÷yõúôºóÍóCó$órô'õ8ö’øùÂûcüåþ0ÿ,ÿËÿËÿ,þ0üåûcùÂøö’õ8ô'óró$óCóÍôºõú÷yùúÎülýÝÿÿÙA:ÿÄþãý§ü#úqø­öôõcôó"ò™ò†òëóÂõöøXú=üýÛÿWv&X8þôýNûaùM÷3õ7ó{òñ9ðÞññàó4ôý÷ ù}ûëþC[@Õ¿ûÿýúL÷[ôtñÊï‹íâìðìÏí‰ïñvô{÷þûÌÿ¨P‡ ­ ? §ÛäÞüø÷qñ™ëÉæcáËÞ_ÜyÜbÞTâqèÅñBû¾ö’$#3.B,P‘]Öixsz#~„stk-4.5.0/rawwaves/impuls20.raw0000644000076600007660000000100012327014024014147 0ustar garyþzˆjõS’7À^îôã‘àCãûìŸ÷ï ´ w ãŸúðôõñcðÖó,÷›üïÔ,I ëýÀùšövõõ‰÷Çûþ³§KJ·ÿûäù÷Vöõøú2üðÿhrÿ³ýLúØøñøøQù°ûÉþþBü ú4øõø¯ùlúúüóþÚ6¶>þñý!ûDùÐùùUúfü ýÛÿb@Cÿmýòü4ú ùšù`ùÿûNüøþ”ÿ¼(ÿÀþžý ûmú'ù‹ù¾ú²ü*ýÉÿ'ÿðÿñÿ+ýÐü6úÃùÒùžú4ûoýþ„ÿ›ÿ›þ„ýûoú4ùžùÒúÃü6ýÐÿ+ÿñÿðÿ'ýÉü*ú²ù¾ù‹ú'ûmý þžÿÀ(ÿ¼þ”üøûNùÿù`ùšú ü4ýòÿmC@ÿbýÛü úfùUùùÐûDý!þñ>¶6þÚüóúúùlø¯øõú4ü þBþûÉù°øQøøñúØýLÿ³rhÿüðú2øöõ÷Vùûäÿ·JK§þ³û÷Çõ‰õövùšýÀë I,Ôüï÷›ó,ðÖñcôõúðŸ ã w ´ï÷ìŸãûàCã‘îô^7ÀS’jõzˆstk-4.5.0/rawwaves/impuls40.raw0000644000076600007660000000100012327014024014151 0ustar garyþk¯:Næ>å,÷” ¥÷öò‰÷è臨üÍ÷;øoþ¨  ÿ#úù!üí»Fnûþùõû÷dý„úáû€þªqdþ°ûØûfý¥yXÿüÍû“üêÿŠ&ýµûöütþ­–|þ…üü=ýí–ÿ2ýü?ýTÿZzÿ·ýÈürüåþ²1 þmüÍü¦þÿÇ5ÿýEü•ýŒÿE/ÿ{ýÎü±ý"þ¸ÿÓþ\üóüÞþ-ÿ®þãýTüÁý­ÿ@ ÿYýËüÍýDþÂÿìÿ³þNýüùþ?ÿ¨ÿíþÏýTüÒýÁÿFÿFýÁüÒýTþÏÿíÿ¨þ?üùýþNÿ³ÿìþÂýDüÍýËÿY ÿ@ý­üÁýTþãÿ®þ-üÞüóþ\ÿÓþ¸ý"ü±ýÎÿ{/ÿEýŒü•ýEÿ5ÿÇþü¦üÍþm 1þ²üåürýÈÿ·zÿZýTü?ýÿ2–ýíü=üþ…|–þ­ütûöýµ&ÿŠüêû“üÍÿXyý¥ûfûØþ°dqþªû€úáý„dû÷ùõûþnF»üíù!úÿ#  þ¨øo÷;üͨ‡è÷èò‰÷ö¥ ÷”å,æ>N:k¯stk-4.5.0/rawwaves/makefunc.c0000644000076600007660000000262712327014024013736 0ustar gary/**********************************************/ /** Utility to make various functions **/ /** like exponential and log gain curves. **/ /** **/ /** Included here: **/ /** Yamaha TX81Z curves for master gain, **/ /** Envelope Rates (in normalized units), **/ /** envelope sustain level, and more.... **/ /**********************************************/ #include #include #include void main() { int i,j; double temp; double data[128]; /*************** TX81Z Master Gain *************/ for (i=0;i<100;i++) { data[i] = pow(2.0,-(99-i)/10.0); } data[0] = 0.0; printf("double __FM4Op_gains[99] = {"); for (i=0;i<100;i++) { if (i%8 == 0) printf("\n"); printf("%lf,",data[i]); } printf("};\n"); /*************** TX81Z Sustain Level ***********/ for (i=0;i<16;i++) { data[i] = pow(2.0,-(15-i)/2.0); } data[0] = 0.0; printf("double __FM4Op_susLevels[16] = {"); for (i=0;i<16;i++) { if (i%8 == 0) printf("\n"); printf("%lf,",data[i]); } printf("};\n"); /****************** Attack Rate ***************/ for (i=0;i<32;i++) { data[i] = 6.0 * pow(5.7,-(i-1)/5.0); } printf("double __FM4Op_attTimes[16] = {"); for (i=0;i<32;i++) { if (i%8 == 0) printf("\n"); printf("%lf,",data[i]); } printf("};\n"); exit(1); } stk-4.5.0/rawwaves/makemidi.c0000644000076600007660000000160412327014024013717 0ustar gary/**********************************************/ /** Utility to make various functions **/ /** like exponential and log gain curves. **/ /** Specifically for direct MIDI parameter **/ /** conversions. **/ /** Included here: **/ /** A440 Referenced Equal Tempered Pitches **/ /** as a function of MIDI note number. **/ /** **/ /**********************************************/ #include #include #include void main() { int i,j; double temp; double data[128]; /********* Pitch as fn. of MIDI Note **********/ printf("double __MIDI_To_Pitch[128] = {"); for (i=0;i<128;i++) { if (i%8 == 0) printf("\n"); temp = 220.0 * pow(2.0,((double) i - 57) / 12.0); printf("%.2lf,",temp); } printf("};\n"); exit(1); } stk-4.5.0/rawwaves/makewavs.c0000644000076600007660000000564412327014024013765 0ustar gary/**********************************************/ /** Utility to make various flavors of **/ /** sine wave (rectified, etc), and **/ /** other commonly needed waveforms, like **/ /** triangles, ramps, etc. **/ /** The files generated are all 16 bit **/ /** linear signed integer, of length **/ /** as defined by LENGTH below **/ /**********************************************/ #include #include #include #define LENGTH 256 #define PI 3.14159265358979323846 void main() { int i,j; double temp; short data[LENGTH + 2]; FILE *fd; /////////// Yer Basic TX81Z Waves, Including Sine /////////// fd = fopen("halfwave.raw","wb"); for (i=0;in²øÌ•¥ÁÍÕÕ³‰b$ÿÛÿ²ÿ›ÿƒÿfÿ<ÿþØþ­þ“þœþÆþïþúþÿÿÿ ÿÿÿ#ÿ4ÿAÿZÿsÿ’ÿ²ÿÃÿçWªç;ARjw€‰¢µžqTPg‚Ž]#à¡k: ÿâÿ¨ÿhÿ/þýþÛþÅþÃþËþÁþ›þ`þ8þ#þ%þ2þ=þKþ`þ}þ£þËþæþõÿÿ/ÿdÿ—ÿ¾ÿêK‡¿ê9WklX>(ôص•uXC/ ÿôÿßÿÑÿÄÿªÿ”ÿ‘ÿ–ÿœÿŸÿ§ÿ»ÿØÿô)01159<BINQJDC?>BLNHBFV]N1ÿüÿàÿ½ÿ“ÿhÿKÿ@ÿ@ÿ9ÿ'ÿÿÿ%ÿ/ÿ/ÿ(ÿ%ÿ.ÿDÿ]ÿnÿuÿzÿ†ÿ›ÿºÿß-Nh|¡¼Ûø "# ÿ÷ã˹­£–ŒƒwcRD3ÿöÿÔÿ³ÿŽÿlÿVÿQÿPÿGÿ6ÿ'ÿ#ÿ)ÿ3ÿ<ÿHÿUÿZÿ`ÿgÿlÿtÿ~ÿˆÿŒÿŽÿ™ÿ­ÿ¿ÿÑÿè 0JW]hw~shcir~Š’~k\]SPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPstk-4.5.0/rawwaves/mand11.raw0000644000076600007660000000400012327014024013560 0ustar garyÿKýîý/üpûúûþ:¥øMþßövQ ÚžÜ/Yܤýfü\þÑcþ¤û^ûuÿñVÿ’ú»÷eø›ûóþäÎýwúø÷Nù}ûâþ_þ=ýûçýËHXMÿ‚ÿ{àhnM˜×Î|{~Úè÷ÞY± 6 ­Þþùÿû•þsüxü´ýþþ?ýPûsùW÷‰ø¤û'ý0ýûSú­ûÕýCþ3ÿMþïý<û¤ûÝýãþÅþÀÿhÅ) €þ˜¤³š©Pöè¶#ÑTšÝãÿ’þ“þyÿÿ›þ¹ýûûýýøýAûgú%ü5þöÿ¼þÓþ•áK€¦ÆÍ¿Ü÷ÚÛç6Y2w4ˆÌ¨¼ÿìÿ‡ÿ¬ÿŠþ¦ýWûêû„ü%üRûàûbû–üüÄýoýý ûÍúøûKûëý þþ#þrÿ8# 7¥8_QñØâöû‘øyv¹ïF㳸D5DLLÿãÿ¦ÿuÿOÿ.ÿþ˜þgþ§þÏþÏþ¬þýýÑþUþ´þõþãþÕþ¦þPþkþ’þÍþÌþ¹ÿÿ²:ÿÿÿˆÿkÿï²õÁf4ÿüÿ½ÿ…ÿ¢vx#ÿØÿÒÿ÷ÿ¤ÿMÿCÿ‡ÿžÿiÿ>ÿOÿtÿZÿOÿ–.ÿàÿ¥ÿÐ/P (–üUON\>_Ôôºt}ŸŠX>7G2í´wXu•> ÿýÿ×ÿiþ×þlþ?þ<þýäýÙýÒýÁý½ýÅýÌýéþþ ýôýÑýÎþþuþÆþàÿÿ—GˆoEQãP«æåÐÞïÏvù¥Ö&M< äÛ[ ÿþÿìÿÞÿºÿ•ÿsÿjÿgÿsÿ“ÿ¯ÿÅÿÅÿ°ÿˆÿrÿ|ÿ¡ÿ¶ÿ¾ÿàÿØÿŽÿcÿpÿ’ÿ«ÿ¼ÿÈÿÛÿñÿðÿéÿäÿÐÿÉÿÍÿÏÿÃÿ¥ÿ„ÿlÿmÿvÿÿ­ÿ¸ÿ¶ÿ®ÿªÿŸÿ‰ÿcÿPÿ\ÿtÿŒÿ¢ÿ»ÿÉÿÕÿë5EOh‹£¸Ø"6@@@?GPB% ë»}yub;ÿùÿßÿÎÿ¹ÿ£ÿŒÿoÿKÿ!þùþÛþÒþÕþäþûÿÿ5ÿ=ÿ3ÿ"ÿÿ%ÿ7ÿLÿ^ÿhÿrÿŠÿ¦ÿ»ÿÉÿÚÿõ&#3:G^y‘£ Œyv}€|vx~{zzyyrj`SHABFD8*###!!! ÿëÿÏÿ¹ÿ¨ÿœÿ‘ÿ„ÿyÿsÿrÿtÿmÿaÿUÿPÿSÿXÿaÿjÿxÿÿ¨ÿ¿ÿÔÿçÿù "29;?Oah`RR[dmszˆ—  —ˆ}reZPIB81/( ÿõÿïÿèÿâÿÙÿÎÿÄÿÂÿÅÿÈÿÅÿ¼ÿ²ÿ¬ÿ¨ÿ¦ÿ§ÿªÿ­ÿ¯ÿ³ÿ·ÿºÿºÿ»ÿÄÿËÿÏÿÊÿËÿØÿèÿñÿðÿëÿêÿñÿöÿúÿúÿøÿøÿüÿýÿöÿòÿô &7=DKMRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRstk-4.5.0/rawwaves/mand12.raw0000644000076600007660000000400012327014024013561 0ustar garyæü¹øãúõ¥ó´ûƒ’æ ÂÌÿúÿÞþÅû‚"¯Hü‡ýÉþ³eýÞúûKôýù3ù_ù‡ùÖö˜óîöëùéú8ýXÊýëõïóÆøþi¾;Vdºÿ6þžÿM J  < m ²¯yû — V ìÅfv£¤Æ´²2þ`úÕù›û`ûlýJ@þjüù³ù¦ù4ø´ú^üœü1øi÷iù1û@ûâú£úû9ûLüÿÍcþåûƒû0þ—Y€ Ê k AÿþêСKÿá]ê6 ýŸûŒýLþèþÈÿ¥•S`3Š1àó/¦düéû‡üUýæþ7üÙüÌþ)ÿ"þ­ý¯þá^WÌ8'ÍÇÉt¸?½ÿüÌü·ÿLx ýäüû£üü„üûßýÖÿÔÿËþ†ü¿û®ûÐüšý¬þ!ýÑý%ý?ý¢ýÕý‰üûPüþDÿfZ¡@'¡ôìo6?½žT^Ò²™kâÙœs¤]ìÈØ‰¯ÿ©ýÖüsü0üãýõþbþbþåÿþ‰þþxþºþ)ý¤ý:üûÕûéý&þÙÿÝÿ~þÂÿ:ë.ÿ¦?â×ãÝ,ÿ½ÿÐÿàWƒÿøÿiÿpÿÿ©ÿÚÿØÿ«ÿžÿÿYÿ1ÿCÿøçcPíħ„=ÿøÿøÿíÿ¦ÿ‚ ‹"ÅuÒç¨Z[Ëîl):±r¬Ì›ÿIþˆýÜý‘ý–ýùþ¬ÿþÏþýýUýBý2ý.ý\ýÉþ@þ\þ_þ‚þÉÿÿ'ÿ^ÿ©qÄööü)S ÞÐi rØö¶‡‹t ÿöÿý4mrT'0VzTÿæÿmÿ,ÿÿ9ÿ]ÿÿÅ2š´r/ÿäÿ»ÿ¹ÿ÷CaEÿùQpd4 ÿ÷ÿÁÿxÿZÿQÿ3ÿþûþäþÉþ¨þœþ«þÞÿÿ/ÿ'ÿ ÿÿÿ#ÿ=ÿ`ÿ–ÿÇÿò'W¢±»Õûö×ÏÒÞø _˜wZ[g`@ä°‚pfXV`~”ˆLÿüÿºÿˆÿbÿ7ÿþÿþôþþÿ ÿþñþÙþÅþ¿þÉþØþáþÙþ¿þ¹þÖþúÿÿ3ÿTÿtÿÿyÿƒÿ´ÿõ)Gh—¸ÄÉÝøòìôøêÝéñÖš[7,%&6EOOLJC,ÿðÿàÿàÿñ" !JaZE2,$ ÿïÿìÿòÿéÿèÿèÿëÿêÿäÿÕÿ¼ÿ¤ÿÿ‚ÿxÿqÿhÿ]ÿYÿYÿfÿ{ÿÿpÿXÿVÿjÿƒÿ“ÿÿ«ÿ¹ÿ¿ÿÁÿÑÿî-;M_ltš¾Ùæíõü!'#õÚ¾£kP8.--& ÿêÿÉÿ°ÿŸÿˆÿnÿUÿDÿ=ÿ:ÿ<ÿHÿYÿfÿjÿdÿcÿfÿgÿiÿrÿ|ÿ†ÿ–ÿ¦ÿ¯ÿ±ÿ­ÿµÿÌÿåÿôÿöFdox{zxx|€xuuqg\QH=2*$$'(%#$!stk-4.5.0/rawwaves/mand2.raw0000644000076600007660000000400012327014024013500 0ustar garyÿ¿ü³øeîÔî^õÏúñ¶eýɲ‘¬ÿ÷õþn9e ÿÚ† fûfô[÷Àô•õðjüúÉ÷hóïúôÖôoîÄï?÷\úyýåöÍí`óù‘ûåù†õØùtFfÔ= …Ä ð§c M›ÊŸÏ ð  e Ñ I   3 ßhý°  *ïû>úÏþŸýþÙŠødïûðñönöýñ>íÅó ú´ùÁóWñ òò€õ@öO÷›÷ªù ùUö ÷dùÙþ1–Ÿx4¶Ýbç3£– sQ ‹Å §r TFƒ(p¿ìý&ûÁ\¯¢û×ùjüþü`÷áølýÂ8"ûgútüŒû­ùqú üÄЧÿþíÿ4þ7ýÞþ„PTuþÕþTÿªjÚ*Í Â.ðÿüýýzÿ$¢¥©µþ…þþë!ÿÞþü>ûåüý†ÿ;ÿüxû®þ“ÿNüCúQûeýÛÿáISN ÷ïUX‘¸=žÝ÷V¾1HåÿÔ'½si†ÿ)ý ûöü4üÓý:üúÉüýíý™ûøëù«ûHû¥û-ûû^ü9ü¡ûðüþÿTY䍯:²Ï„[Ãûåõ¦‡âlÎ(Ô·u^}¬Ëì»Û@±ôg+ÿÕ<6ÿ•ÿ þuýÃýYý.ýÒþöÿâÿdýàýÅþ‹þäþþ<þ´ÿiÿªÿ¨ÿ”ÿ˜ÿ˜ÿaÿÀ¯Ka^* ÿù) ÿÒÿÉÿ«ÿ“ÿ—ÿVÿ[ÿ“ÿ£ÿÂÿpþýþ¢þý¶ýžþ!ÿ;ÿõÿ×ÿpÿuÿÞÿáÿaÿDÿÂF(ÿÃÿ½/³ð(·iÄõó«;ÐÏìÀ` ÿ?´î¦6Þç@Bœÿ¨ÿþöþåþÛþéÿ.ÿ,þÞþãþïþ²þ&ýÁýóþPþQþþþKþcþ4þ:þ•ÿÿRÿGÿrÿçY€w}{UOœ½©•¢¹·¬®ËÅ‚ÿ½ÿÅFo¢Þ"axu9Õ¶ëõ˜`‹Ë×™K($0>L<ÿüÿ¸ÿ¸ÿÜÿúÿùÿÍÿ£ÿ„ÿ€ÿ™ÿ±ÿ¹ÿ·ÿ¬ÿ­ÿ³ÿ¦ÿ†ÿ2þ×þ¸þËþîþôþÚþÚÿÿ"ÿÿÿÿÿ#ÿ#ÿAÿ‡ÿÌÿèÿãÿìGfƒ¬ÏÖ¶š•–°Ö$2B]fJÿü û¸„t‹bI3 ÿúÿîÿ×ÿÁÿÃÿÌÿÉÿ´ÿ—ÿ€ÿjÿDÿ!ÿÿ&ÿ,ÿÿÿÿ:ÿYÿOÿ8ÿ<ÿYÿ|ÿŠÿ|ÿcÿXÿpÿŸÿÓ*)#&8B?>FVgr{xmlwzrovŽ¡£¡•ƒol|ƒubaliT5ÿû ÿôÿÚÿÇÿÁÿÂÿÁÿ»ÿ¶ÿ¶ÿ¹ÿ¼ÿ»ÿ¸ÿ¾ÿÏÿÝÿàÿØÿÊÿ»ÿ±ÿ®ÿ°ÿ¶ÿ¶ÿ¬ÿ¤ÿ«ÿ¼ÿÍÿ×ÿÙÿÓÿÈÿÂÿÆÿÞÿûClƒ‡•«»ÃÀº·»Â¾­—Ž…p\LGE=1stk-4.5.0/rawwaves/mand3.raw0000644000076600007660000000400012327014024013501 0ustar garyÿ\ýüþYbÄꌫbþ“öÐíê”íŒçŒ!&0 ðƒóiã èÿXø‚ú‘%OÿËÿ<K9m¯ýJ÷RûNó¤æÂï| Êââùãöèé!ç6ëBæòãæðDþø®ð—÷¢œ ø7÷®,”.x Ì!Ýjý !  ò»B Û8 J9`Ø µÓû’þúGóüóÔü ýtùøû(û¸÷=ðúë¦çƒà‘àã¹ëúñ:íNë#ð¤üÏVú(õŸùNý÷ø T Ñú % Û9*  Ñ0ª D 0ã“ì"í4þ˜úäûýÿ„ÿ~ûÔù¸úGütûfù>üf¥šüµõ¬ôæùþ=ÿXýêý¦¡¬+=úÈúnÿ¬ë «˜¤‰Æ,g ^ùŸ²ÿùkÿ«ý¦ýÒuŒù¥ý_ù²ö•õ$ö ùÿýü‡ù>÷÷I÷/öÌõÝõŠ÷¢úûÙûâúºùøâù³ûzþ:âU/Åìîñr°¾ í X ‹  H ¼ b5H©>ö¼ºp¤ÿËýJúGùOúÞüîýçý¸üÝü<ûºúºù¾ùú*ú—ú²úÏú›ú ùjùwú¿ü®þQÿ ÿ_ÿ€ÿþý}þ[V:&–•¦º£TãÇ%eà Þés„,Qÿ|ý-ûLú·û´ýjÿgôhÕÿwþ*ý¯þ1ÿYNÔDC©ÿÐÿ;ÿÐo×5ì‹{ÎÙn1êÏ÷$ǸgÿOþ«þØÿzÿ¿ÿ~ÿlÿpÿþ~ýþýÖýÁý üû=úÉúýü*ýýÿ!ÿþ7ý„ýQüÙüCü(ü•ýHýÂýüþKþúÿ߸¨ReÀÏê’Q cO:ɦéÃø%Ͷ\ŒÿßÿÀÿî ÿýÿßÿ~þØþGþ3þ„þéþùþzýÈý]ýaý£ýäþ!þ–ÿ<ÿ¯ÿÓÿÂÿšÿgÿþÝþëÿ9ÿ„ÿªÿµÿ®ÿºn’?ÿ¼ÿ’ÿáHqRÿäÿ¥ÿ]ÿ3ÿ.ÿJÿÿ¹@6ÿÝÿ…ÿhÿŸG†ÀÓÍÎæ<6*P•¿»•°é-$ô£R%à‚(ÿøÿÑÿŠÿþµþŽþ¦þÞÿ ÿþÍþaþýÚýÏýÃý·ý¹ý¾ý±ýªýæþ^þÙÿÿ4ÿMÿ†ÿ½ÿ¿ÿÿ_ÿUÿˆÿð]´î휗­éE”¹µ«ª¦œ‘{RÙÌÛæÈ’_B4 ÿÑÿšÿpÿ^ÿcÿuÿˆÿ—ÿšÿŒÿ€ÿƒÿ›ÿÀÿÚÿÚÿÒÿÖÿÙÿÏÿºÿ¥ÿžÿ©ÿ¿ÿÎÿÆÿ±ÿžÿ’ÿŽÿÿmÿ`ÿYÿSÿ^ÿÿ°ÿËÿ³ÿzÿGÿ8ÿMÿgÿnÿeÿWÿSÿcÿ…ÿ¯ÿØÿý6Tu–¶Ñäõ óó6@%뮂ruscI0ÿ÷ÿãÿÎÿ²ÿˆÿ[ÿBÿ>ÿGÿKÿ7ÿþïþÜþÚþÙþÒþÐþÛþøÿÿ!ÿ/ÿGÿiÿ…ÿ™ÿ¥ÿ°ÿ·ÿºÿÍÿ÷1b}xcLL]mm\^q ½à×åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååstk-4.5.0/rawwaves/mand4.raw0000644000076600007660000000400012327014024013502 0ustar garyÿhÿ±û¨ôµôÒ÷³ù7ö³ôwö}.“¦á¿ù\ ¤(f!~AïûŠ<À úòÁë¹ô±ÿxüò4øÜýî”ëpõÜê÷VëðèÒñ¥ü™ú¼÷ƒíïì‹÷þ'þpúCý 2 † ˆ+  Ë 2 õ.Ï y wu ÖïJ wO Ušÿ'1Øsù}ñxó6ú«þ‹ùñ¿í~ðööøÈù$öÔö¯ù,ûýùÖô+ñðóÔùËüû8ùµøuø­úzþõÛÓÓÉ ºc°ÆÿÛ U y‚9ˆ ªo“‹J;!þ¢ú·úýýwýŒüŽùÚø ø†øÆù•üþþûÏù8úiý‘þöý#ûìþWŽÒtÿt-uI˵’¤Àú³àí˜þ­rÿûßüPì¼ý ú§ûëý›ý¶úk÷YøúçüÏûðùªùlüþ9ýVûÙü·þ›ÿdý°ûÛü×þíOnÞ `^Y ‘VÙNZA˜ 3£Ñœ°!ñ–ÿ†ÿþNý…üôý&üùüBû÷ü#üRüTüûŒûÄýþÈÿ!þýèþ™ÿ¼ÿ¬þIüÎý´¾(‘GþæÿŸé—ÿ¡þÊþÕbàþžÿÿÿç¹}¢-Œÿò²¡ÿÚÿîàd Lÿ7þ~þ«ÿNehš=óm)Q‘ŠŠQÿÚÿ‰ÿùóÛþÌž½ÁoÿáÿëÕ…k¤ÿáÿÔEyÿÁþ¥þ#þRþÅÿÿþ‘ýûý¥ý‹ý‹ý¸ýýEýhþ(ÿ6ÿ·ÿ4þþÁÿêêÿwÿÖ­ábÿè¬+ bŽQÀ‘m‹KÙ¶EÙóDQ£E?v¦¾Ôã°9ÿµÿdÿ_ÿOÿ#ÿþóÿÿþøþöÿÿXÿxÿkÿ{ÿ«ÿÕÿ¯ÿRÿ ÿÿ€ÿàÿöÿÕÿÎÿÿ ÿÙÿ‡ÿWÿ]ÿyÿ¢ÿ­ÿ¸ÿËÿìÿÔÿšÿpÿuÿ¨ÿÅÿÈÿÄÿ×h¦<3¶çÔ‡ªJÇ™ËÃU7j´äÛ¤]+ÿýÿåÿÒÿÊÿÀÿ´ÿ±ÿÏÿîÿæÿÑÿÏÿî ÿÉÿ€ÿgÿtÿuÿKÿ þÛþÏþÐþÌþÊþ¼þµþÐÿÿ2ÿ_ÿ~ÿ–ÿ¹ÿÞÿ÷ÿÿÿÿ1j‘Šb_‰¿Ò¿¦…•±ÆÑÒ××ÉªŽŽ‘Œ„ƒ„nB-M…œ‰j^bV#ÿÙÿ ÿˆÿ„ÿ‡ÿŽÿ›ÿ¯ÿ¾ÿÂÿ»ÿ¯ÿ©ÿ£ÿšÿ˜ÿšÿÿ„ÿÿŽÿ¡ÿ®ÿ³ÿ´ÿÀÿÆÿ¼ÿ·ÿÂÿÜÿõÿÿÿÿ  ÿõÿçÿåÿìÿôÿû$,0;JUbt‰Ÿ´ÀÀÀ¶§œ˜Ÿ¤š‡ŽŸ—{febB ÿäÿ×ÿ×ÿÙÿÕÿÈÿ¼ÿ¿ÿÈÿÍÿËÿÃÿÂÿÎÿØÿÖÿÉÿ¼ÿ¶ÿ²ÿ¦ÿ’ÿ†ÿÿ®ÿÄÿÊÿÃÿ¿ÿÌÿÝÿãÿáÿßÿî"4CC=;H\jkhl}ˆ†xqz…|dOCBA@51+1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111stk-4.5.0/rawwaves/mand5.raw0000644000076600007660000000400012327014024013503 0ustar garyø«õ‡õðVóz:û˜ì@þI"ü ²ýñàùÖ úïqQ[} A îx ™´þóº÷1uýõVöâëâ˜ã„ãcîNì­æûëëîß×lämó\ü'ö¿ñ™÷R!=ûûéË T„èŸæ©EAaõoŒR¹ÍdGÝ~’ÉÿÝ ûÜö8ñÉï2ì‘ê íÔóÂöÛñ*é'æÙæ9åçÐï|óï[ç–å™ñù©ùvúGýîÏþ†ü¶ '(  TNM ò }Ž]ô XØ k § s ¬ûÙöÝúµÿÿþµükýý¨úô}ó#ø¤ûÊøÐôÆô×ùýüÛûuüþDÿZ0m7°‡ˆ{¹ ¾ ú 3j8<Àž®š¡(ÿRüUüû Øåÿ.ûö¹òœó[ø2úñùgöøöš÷r÷!ôsðøîæïŸò&ôSõ±÷ÊúPûû?ûîû`üÿž7 òÐ+K j Í N Ìš Õ þ ç H-ÉêÇÕaÿMý_üúžù@÷Òöî÷þú˜ûžúnùvøÄøM÷û÷2öŸ÷jùìü8üˆû¼û‘üôþ¥þýþšþSÿ |DÒÓ±µ“—v[<æ›~;[ÿßYŒþuýþþŸþ'ýPý¬ÿmóäMÿ°þøþºÿÞ³°!øa€'>Xäº,´–¿ê"þÖNÒ¾Y´ÿéÿšÿzÿWþöþþ.ýyý*ýü»ûÐûXü6ýHýNüúÄú·ûsûåûÚüü`üsüû±û¹ü@üÓýGþþ³þÍþuþ‘ÿo‰‹1¸68àêÅßÜÕmœûPèÜù¦&ŠÁÿ³ÿhÿJÿ•ÿŠþŸþþMþúÿrÿ™ÿ}ÿ#þhýý!ýSýïþ·ÿ\ÿÏ?r4ÿ´ÿKÿ"ÿ;ÿOÿ/ÿþÜþïÿ9ÿ–ÿÂÿ‚þòþuþYþŠþ»þ¥þZþþþwÿ(ÿ½ÿúÿÙÿ„ÿ<ÿ ÿÿ.ÿlÿ®è$7–ò!ùÜý]®ÕßÝì@M1 ³<Ò£´«SÔt,ÿÍÿ\ÿÿ þÜþ†þýÎýªý£ý­ý¸ý©ýwýRýZýrý^ý üôüöýý!ý8ýuýæþ[þ»ÿÿVÿwÿÿ¸Ÿ &ó J ÖØÀ»ÅËõ¿èùæÚÈ‘FáßãäàÈ–b:ÿÔÿ¬ÿ´ÿÛÿñÿÌÿ†ÿYÿcÿ€ÿ“ÿŸÿªÿ°ÿ°ÿ¾ÿåOZJ;.ÿþÿäÿËÿ³ÿ™ÿŠÿ‹ÿ•ÿ‹ÿqÿPÿ%þïþ¨þmþZþjþ“þ½þÛþîþÿÿÿÿÿ-ÿFÿeÿtÿkÿjÿŒÿÖ/¼èIpƒ…ƒˆ“£ºÛùðί«»½œoVJ*ç—`SZIÿßÿ«ÿ‚ÿ\ÿ0ÿÿþ÷þãþÍþÁþÃþÌþÅþ¨þŠþ„þ•þ¬þ´þªþžþ©þËþ÷ÿ$ÿBÿ]ÿ{ÿ˜ÿ¤ÿ¢ÿ¹ÿçBe¼×ÕÉÁÉÖÝàäïø øêÒ´œ„qasƒ¤¢´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´stk-4.5.0/rawwaves/mand6.raw0000644000076600007660000000400012327014024013504 0ustar garyø{íÇæüâ4ãGë7 !Õ Ÿ jüÙ íñÔôñ7 4Ì$½ Nøómù‘ ÆBþ”ð,ïòûct÷¤éMäéÞðvævÞÞ(éuô2÷÷5ð”çãåçãñÄü|ùDñ’ó×;|Ÿ ü % TôVP.ë3ˆ[gPeÕçäu £4ýqþŸküóöµïØîäö5ü¹ þÁó`èŠæ…íUñ@ïaîUñT÷bùJò8ë*ìð¸õàõðñ™ñ‘õtøêù ûä‹  é r ™ §–. ÿc«­Q‹ Å?ÿr›&ùÔôñìô¸øMùùƒø÷Öø¾÷Gôaò­ö'ùSûý-C*_þù’ú”þ¢3½2?è z Z _ ° A ?ëã AÈf å r J£¥aÿÀü{ù«÷mõãôóôÁõ(öw÷—öûõýôŒó&òÀòüó§ôoôcôFõ˜÷¯úû6üý0ÿǽW\r]ˆl | ° š _­»ò ‘ Õ Ê Z ž v¢³:kLþyýnû™ù÷©ùAûRûÀû9ú²ú(øõçô7ôõ<÷fùòûóüÎüÐüý¶ÿpÿôÿþLÿÿtþýèþn˜o†OU3Ì/¹¦ÙÎj­¯…?•xmÿ\þÔþZýüÏüüšüÙý üÁü#ûRú‹ú˜û¨ýYÿ§)€¤¥ô2ƒ¹.SPìÂKxþ˜²lu1¡øÉÿsþÏþ-ý’üåûôû'úZùBø¶øØùbúú»ûPû²û™û ú„úŒû`ü[ý&ýÝþŒÿHÿÀhì–(h%†.içR¿—ºoM‘ìÆÞÁ»0F»ÜëB¶'ÿ_þµþ@ý¸ýü}üpüÓüòüæýýBýnýVý$ý6ý þHÿ­ß³|[LMˆç Õ˜ÉуÿÝÿâÿ¥ÿþ‡þhþºÿþûþÁþþmþSþýÉýØþBþ‹þƒþwþ¶ÿ6ÿÿšÿÿœÿÃÿèX¤ÔÖÓ„ûKdaAðç 3OXF+üðàÄ‘Fí… ÿÛÿ¼ÿ¼ÿ°ÿ@þpý¤ý!üØüšü_üHü\ü|ü“ü¼üöý ý,ýýýHý•ýæþ-þuþÁÿÿ<ÿÿènïAS= $6_ åÛ¹¯¤…YІZUi€”œŠ]1ÿúÿËÿŒÿ]ÿVÿlÿ}ÿÿŠÿ’ÿ‘ÿ„ÿqÿnÿyÿˆÿ—ÿœÿ•ÿ•ÿ›ÿ£ÿ°ÿ½ÿÊÿÖÿàÿêÿù %?NI/ÿãÿÄÿ«ÿ’ÿlÿ9þùþ²þzþWþKþZþtþþ„þ†þ‰þ‡þ†þ–þÂÿÿJÿ”ÿÙ=e³×$:Sm€†‡Š‡ƒ„‚sW8 îÒ´‘tcQ3ÿúÿèÿÈÿ¤ÿ|ÿMÿþØþ¬þ‹þ|þtþhþZþPþSþaþqþˆþ¤þºþÍþáþõÿÿÿ,ÿDÿ_ÿƒÿ³ÿæ2Pj€‹” ¯ºÇÔ×̼¶µ®ŸŠtW>0063& ÿùÿçÿÛÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃÿÃstk-4.5.0/rawwaves/mand7.raw0000644000076600007660000000400012327014024013505 0ustar garyÿéþ«ýüÛýþ²ÿós¬…Ìv0$¦ùn²LV'cýÐþ ÿt¬ÿˆý~ý€ý¬üfú¦ú„úèúÛúú'üþ)üùú/øÜùßüþýÿ‘þ%ý5þýÙþÿ]ÀM„0¯K¡xª Kg,¸áÙìßìÈvÿ›ÿþ­þ²þïþ-ýÃüóü7û/úýûªûeúåûüPý}ýüYüüÔý üHûïý@þÃþ|ýaý¾þ£KHÒÓ  @…ÁgøçlÿôÿþÝÿ`ÿ=þaþhþýÏþ.ýÏýOý:þæXÿÐÿþzþŒþÚÿÿ—f£Á¹JïÿÚX:SEÃO‰ Ä}u\ (ˆ/2\ÿOþ8ýoüÞüû;úøúÚúøúØú‹ûû´ünü€ü’ýý\ýèþýñþþbþáÿÿ”8[àÌRª …ÄvÝÖkæÃ¤ ÏÆÊIúåŠ^GŸ"ÿ”þØþQþcÿÿ´ÿ¾ÿRÿþïþ¡þlþ:þnþïÿ<ÿ­;Xÿ©ÿÖÿÆÿqÿ8ÿ8ÿNÿdÿQÿ$ÿcÿ®ÿ´ÿ›ÿ¼ÿûÿíÿ—ÿ>ÿ þúÿ ÿ'ÿZÿ±ÿÌÿ¢ÿRþÜþ„þþÃÿþôþ£þ†þÈÿHÿº.U—ê()ÿ<޵“cJh¼÷ ÷÷ðåÇ’n<!2O" ÿ½ÿ¬ÿ¬ÿ§ÿ‡ÿbÿAÿþÛþœþDþýïþýøýÖý¯ýýŠý–ýÊþ"þrþ³þÛþÚþÍþ¨þŸþÍÿÿ‚ÿØI^eq…«Þ  öÜÌï(Hl–¦}8íÀš…oC ÿôÿõÿþÿèÿÎÿ·ÿŸÿŠÿ‚ÿ‚ÿyÿxÿ~ÿzÿyÿzÿ–ÿÌÿÿ&8+ÿéÿßÿÝÿì ÿúÿÅÿ«ÿ¸ÿÔÿÇÿ¢ÿ†ÿ{ÿtÿ_ÿLÿ@ÿ?ÿJÿXÿfÿ]ÿ9ÿþúþÿÿÿÿ+ÿ<ÿ`ÿŽÿ´ÿÌÿ×ÿñY‚ŽŽš®ÀÖù#E^_M/ #öÚÅ®pfkgKÿùÿ÷ÿíÿÖÿÃÿ»ÿ¬ÿ’ÿhÿ6ÿþÕþ¶þ±þ¹þ¿þ¾þÁþÖþôÿÿ ÿÿ<ÿcÿ~ÿˆÿŠÿ‘ÿœÿ¯ÿÐÿ÷ )@Yr‚‹“——šœš—Š…€€}lS>-$.*"##ÿíÿéÿèÿäÿÛÿÏÿÂÿºÿ·ÿµÿ³ÿ§ÿÿÿŸÿ ÿÿ–ÿ˜ÿ¢ÿ¨ÿ¦ÿ ÿœÿ•ÿˆÿ{ÿuÿuÿtÿrÿ{ÿ‡ÿŽÿ˜ÿ©ÿÀÿ×ÿêÿý%0CWdmv{{|ƒŒ™ž™’…|ywoeZQB* ÿýÿðÿäÿ×ÿÇÿ»ÿ²ÿµÿµÿ¯ÿ¨ÿ¡ÿšÿŽÿ„ÿ}ÿ~ÿƒÿŠÿ”ÿ™ÿœÿÿžÿŸÿ¢ÿ©ÿ²ÿ¸ÿ¹ÿ·ÿ¸ÿ¿ÿÊÿÐÿÒÿÝÿåÿçÿéÿ÷!*1AT\\^a_YWSLLONHEA>7+%&&$!$)/-&stk-4.5.0/rawwaves/mand8.raw0000644000076600007660000000400012327014024013506 0ustar garyÿÜÿþSýÆýRþ7ÿÝí휩(©$ørz™¯ªø›-Ûkÿ»þRüëüJü¦üÕý1ýýûžúWú„û<û“ûfû2û“ü•ýüÊüÙýfþRÿõÒÿíyAÊü‹¼©Ÿé§Ë´úEq{ÿóR©Ów¢ Ë ÿ³þóþüÿZÿÖ­×)ÿFþþ*ýþýòþýÇüòütügü³üžü'üNý9þþþ üòüüüÖýÏþ»ÿÿIÿ·=.³9à‡å¯ÎÂý@ =Z5+þòþ!ý´ýZý üÅüÌüýý ýCýLý\ý°ýÚý¨ý{þ"ÿBD.€3è6ö¾¶¹ãþ.nzF;³eÂ=Aˆ:T¦¯æ61‡ÿ»ÿþ³þýbý ü­üdüSüý ýü¶üûäü>übüRüNü¦ý&ý…ý´þþŸÿÿ`ÿ»Lÿa’ìL´±|òh’¥Ô û³D ¥pÄ;ÿÌÿtÿ0þñþ¬þ$ý…ýMýkýzýˆýŒý°þþCþ5þGþ£þàÿ5ÿÿÚ)B{¾ÇlQ£‹(ÿÒÿÛÿý%ÿáÿÝ;k2ÿÄÿsÿdÿuÿžÿÐÿœÿ/þÜþéÿ7ÿÿyÿþãÿÿ>ÿ(ÿÿ ÿ9ÿ†ÿÑÿïÿó 5bÅ9u‹ž¥¤°¶Ãáü÷쿃d9àªuI%ÿöÿ·ÿÿ_ÿ\ÿ]ÿ'þÊþŒþiþbþnþgþTþ6þ(þ=þ;þ2þDþlþªþÞÿ ÿ5ÿRÿcÿdÿuÿ‘ÿ¼ÿò 9aŠŠ‰ˆztxŸ®Éèÿíо¸¬ŒkN0ÿöÿÜÿÀÿ¨ÿ˜ÿ”ÿœÿšÿÿ”ÿ£ÿ±ÿ½ÿÆÿ×ÿëÿý2MUQIJH<$ÿíÿÔÿ½ÿ¡ÿˆÿqÿ]ÿYÿVÿPÿJÿAÿ9ÿ4ÿ9ÿ:ÿ9ÿ=ÿHÿXÿhÿwÿÿ‹ÿ™ÿ¯ÿÁÿËÿ×ÿèÿø)G^kzŒ¥¦¦¬²µ·ºÄÊÍÕÞáØÅ± ŽtYD7*ÿøÿèÿØÿÃÿ©ÿ—ÿŠÿ|ÿdÿHÿ6ÿ2ÿ3ÿ+ÿÿÿÿÿ&ÿ4ÿDÿWÿjÿzÿÿ¥ÿ³ÿ¾ÿÎÿè&++-,*' !*67/)$(,($&.31,(-:EIKLLKJD@=842/% ÿûÿòÿçÿØÿÅÿ±ÿ£ÿ˜ÿŽÿ‰ÿˆÿ‡ÿƒÿ|ÿsÿmÿkÿhÿdÿfÿmÿuÿ€ÿŠÿ–ÿ¡ÿªÿµÿÃÿÔÿåÿô0DS`lsxyvsqrqoqz€~vk`TG<4,'$  ÿøÿôÿñÿëÿãÿÜÿÓÿÌÿÃÿ¸ÿ±ÿ«ÿ©ÿªÿ©ÿ¤ÿ¡ÿ ÿ ÿžÿšÿšÿŸÿ¨ÿ®ÿ±ÿ¸ÿÁÿÎÿØÿÝÿãÿèÿìÿðÿóÿ÷ÿúÿûÿúÿøÿü  ÿÿ #',88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888stk-4.5.0/rawwaves/mand9.raw0000644000076600007660000000400012327014024013507 0ustar gary(ý®ùëú9þÿ$øÆô?ùÈ Þ ¶ ô ±,Râ¶9P Ô ˜kûúˆü¹þ>ûdøûû üÎúâ÷ÈöXõçöM÷ãø?ôÒògô{ù"ü¡ýþÈ3Ó“'wi #$ÀZœí}  ÷ ÜÎ ¦"„=~zÿ€ýÚüúû8úÅúÜûú@øƒ÷…øÂü­þÓýÜüŽüêþ ýåü½ûBûý“.ÿkþ¤ýÈýVû¸ûüÆÿ«+ÛPIÍÅÙæ[½ÙBmëâÅ=.´šδüÖù—÷ÉøœúÌüFü$ûjüNþ5þàþJýÚþ˜—HLÂ3åºÿòÿ‚²¸¢¸d“]µXÎÝ+”ÿÇÿ¼zÐÙ÷nç[•ÿ¢ÿ:ÿYÿ™ÿý:û¤úÊúxûûÀüàýçþý£ýeþ;ÿbÿôÿ‘þÛþ„þÿÿþÊþÂÿP<B×èÌ@/ÿÏÖ6Žg@C96Iß"‹ wÿìÿ­ÿ|ÿþaýlü­ü%ü üpüßýMýïþÏÿô¦–b2T£ b2¼ÿÚÿþÉþèÿ+ÿþìÿLÿÔÿõÿ¶ÿ+þ­þàÿb |‘q\¬ú µ6H‡Ðûµÿ‹ÿyÿ²ÿÉÿ¸ÿ¡ÿÿ•ÿ»ˣrDÿüÿ»ÿcÿþôþýÿCÿÿ›ÿŸÿàE’¥£zB#ÿþ8® cT1.Kq0°8??ÿ¼ÿXÿþòþØþàþòþíþäþÕþÜÿÿTÿ€ÿŽÿ€ÿqÿtÿÿ›ÿoÿYÿxÿ´ÿêÿ×ÿ¥ÿsÿfÿiÿ†ÿšÿšÿÈ `·HeH+(ų̂ŸÄ Tg±nHÿÚÿ¡ÿxÿ_ÿOÿPÿlÿgÿFÿ1ÿ>ÿbÿlÿ_ÿaÿ{ÿ›ÿ±ÿ¶ÿ½ÿÄÿ¾ÿÂÿãÿøÿÐÿ­ÿ®ÿÖÿîÿàÿò ÿíÿæÿó ÿÿÿéÿ×ÿÕÿÞÿò %'0>@6,0BT`T,ÿûÿÐÿÈÿßÿø 7Vi`?ÿþÿóÿéÿæÿï &446E`x~qW1ÿûÿòÿçÿßÿÔÿµÿ†ÿSÿ.ÿÿÿ,ÿGÿdÿyÿ…ÿ”ÿªÿÀÿÏÿØÿæÿú ÿýÿöÿôÿý-=CLZnzxoged\E/(+6Lerm\QLH:# ÿÿÿøÿôÿêÿÚÿÌÿÍÿÙÿÝÿÝÿâÿåÿäÿßÿÜÿÛÿÖÿÕÿâÿõÿùÿÜÿÃÿ·ÿµÿ¼ÿÊÿÖÿçÿþ()$ÿþÿîÿÝÿÓÿÕÿÝÿèÿó '19G_vu`N=0**.11* ÿðÿâÿßÿâÿáÿàÿàÿåÿíÿø    ÿüÿíÿÝÿÒÿÕÿÜÿåÿîÿôÿû ÿøÿðÿêÿðÿý###%&()& ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿstk-4.5.0/rawwaves/mandpluk.raw0000644000076600007660000002130412327014024014320 0ustar gary eä þ üKýrö Àsó¤ÔÙ¶Þ¦©™¿Ñà7mP6³L«`[nÀt[p-eW?HÛ8!?Þýק Ÿ ¥´®ÇZÖ\ÜÕ¼¬›•›q¯=Ñ0óÌ‹èæŸ*±…Óòõ´ŽQüÙôyû678[äsñ|ßy´q…jâi>k£nlbP_;R)} ú#¯. 8œ<5(&~7 ‹xQ¥ù çœÒ ¼©:›º”‘ ZŽBŽ$•ˆ&¤¿ª[­¿°Œ´õ»„¦ÇÉÊ^ÌìÓìâ«÷× ÐÝ? „Ë"): QdpÝÿуË*ÍÏÕ’ÛjÚÕÕ0Ð0ÑhÚçòÆùßü‹ýUþ ö çÐ ƒŽp'+a)ò$c ä&³58E4PöUÏU³UY_…cø`¸SõAš1<)z,5]?D{D_@`:|3Q*  ÿ&úLöàóXïËîï§ó3ôÐïzà˜Éа͜nŠ™ŠŒ‹R“ë›Q¥P°È¼ÜÉÓØKçlôùÖöSêãܹÑÉÍøÐÖÖêÜžàJâÅæ/ìôgý² MNÆ·+£ Ë"˜"_ eR»'ì5äCƒKåKC 7œ01ó=PLÉXwZxR?D…7â0É/L/Ç.( Üw³ · Ê KD k ÷üúö ðÚí¼ìêˆè$ä¿àÁÜ>Öa͵Á,±J ®“"‹³‹p½˜UŸ(£Þ§ª«°)·¥¿ÂÆ»ËhÎ8Ð´ÔØÛ•äTíõ°û嵓 iaDy ³îìr!)¾6ðFÛ8î4Œ1C-¹) "õWRR 2 er?ý&ùaö ò’îHè´áÄÚOÔÐúѦÕØB×tÐÄT¶­¬³©ó®Z¶2¼M½A¹i´l²è·XÀ’ËÓ&×MØÉÚDÝ·ãdê1ðšõüúbþ7{Ë#S£ Ó]"2'ˆ,*1Ø9ãCéM‰SfS6M7D;Ã7P7j:e=d> ;¦71¡,”(/$ ½3 GÊw·)ÖjþUùóõò'ðîXë{ætß=×WÐÎÍdÍžÐnÓÃÕ°Õ^ÓŽÑâÑyÒKÒëѺÎ;ÉžÆũȬÍÛÓ(ÖóØèÙÁÚ„ÜÞ´ânçìCñ8õ+÷«øìùØûsþ›Z îûoìÖÛ Zls^òfÈô#‡/";CE{LSO©PNFJ‡E%>³8(2.l+Š)&K"Ôäê5¸% Lãÿ²ûª÷ìôŠñ²ï¡îPí^ì‡ëxêèYæãE߻ۢ×qÓ‘ÏßËàÆÚÀ•¹ý´Ú²öµ7ºØÁàÈÌ:ÎRÏÐîÓ2ÖØ¢ÚªÜMÞ/áåéÙîáóx÷ŸûŽÿÏ: m)¢.] q&E,J1ä6ï;Ã@ÓF.K–; 7333/†,›*A'ð$Ì šÈë{} … Vü\÷µó„ïÇìdé*åýâÓß‹ÛðØÓÊÏË9ÇÂù¿L¼Vºˆº2»[½áÁƒÅïÊêÐÔÞÙÜkß&áyã—å}çLé$ë¦ï4óÃù þw«¶ äDû! Bc`Pû#(Î-//.×,–)e& "¬ÊÅÔ ¶ L°,›’ Å ~?„®¥)2 2†¡µû›>ðÿü+ùXö¹ô<ñî³ëNçIã6ßÛÞ Þß ß»ÞTÚ=Ô7ÍìÈßÅœÃuÁG¾­¼^»Ù¾JØÊwÑE× Ûäà‰åtê|ïò õø‘ü ÿà $  Ò/J`$)K.|3Y7u:N;·;ý;¬;C;;;o;á<;9¢5õ0É*ï%J h<8Ó Nyås5þ û÷ÃôñÚïyí êæoâ^Þ‹ÛžÚ Ù¯Ù×ÙÇØé×3Õ'ÓÒØÓOÔxÕÕÓÔÞÓÑ9дÒrÖ‡Ü áŸæé.ëlíþñŒöúiýÈÿÿõÿÖ9Ëç œzÝ× º$X' )h+¯-|.-?+m)×)z*~,,á,p*þ)N'ß&k$# n¢¯°N s ÿ$—ìý"ÿ„üôùì÷ ô’ò/ï;ëWç!ãÑâ“ãå´çFçå:ãáââ$âÛâ{à!Ü^زÖÖ.ÖÿØ ÙÚÛÞâ×èì€ïEðÒògôøøZû{ý<ýrý2ýì¢÷ — E‹Ý³kŒ”¨m‚ ªÚ À4ŠT(”åyŠ-´¡,ù‚‚GE¨¥¸þ ` ª 1žwÿæýµû‘ù*ö‘óìñ€ïZípë¦éÜèæ=ä\â9߫ܰ٣×3Ö Ö~Ø9ÚzÜ‘ÞQàâ|å•èÑëRìƒì”ì€íGïQò@õP÷ñú5ü–ÿvÎâ ë I DÔˆ}ýB1_Cx ê!Ñ"W"ˆ"O!“ h§4ަ¦óØEÕïF Ñ îü,}ÿçýoû!ù,÷¢ö¥öHö™÷|ø‰ùø¡öéô)ñíùëTèôæ˜ä.âàŠà)àòâ‹ä…æxèéGéÃé]èæMä¿ä1åç6êí ï±òô…÷/úüèÿP$¨ðbXh [Š£; ªáúy›¸&¥Š‹…_¨Þžß È £ —°íR \ký•”£Åþiûÿù¬÷2ôAð½ìúéÀçÅçLçþééôêBê-ê êWê´êßê‰é§èçxæÖæºççïéJë.íyïèòóìõYöŽ÷Ãùúü1þPÅ7j F ã ‰h]_}×MÌ2ˆ¿¶i[c¸¾ÅÂ{´pé…| Í 2 eNþ¦gþ û~øDôð¶íyëBêéŠé"è›èç˜ç†çÇè/èèŽè>çæZäúãÂã!ãgäæjèsêoìNî>ðkòÞõs÷ñúûâý:þUÿ`~ÎHÉ?¼ \ @ U\pr8àz#!¾´=…¿ne¦ 1»A=UT!ÑlŒð¥þêýûbúaúúeú¸úyùS÷TôùòÚñKðMï…îsìÛêÂèmæCä–ãšãhãéäøæUçÂéê=ë]ìíÛïð9ñ"ñúóôÖ÷]ú™þ5×- t y=Ð á\ÅeX}uØvz<4M`J < ± æ  é ñ £÷"U¡ù:@úsÿÄþü‹ûQú„ú"úùõùÉùcøÚøC÷®÷ö?õ*óáò‘ñ}ðâðÃññ†ñìòñîñ€ðëðbðïóðð\ð±ññ¦òŠóÒõy÷_ùOûü‰ý‹þþFþIþWþŽþøÿŒ;ü.¤YG q Ó`í— ¿ÎÍ00µwc*j6ªì  ñˆÛÿŠý‚ü.û|û0úëúpù¬ø¦÷€öcõgôóÇòïñåð™ï1íõí@íJîïvðùòFóódóPó0óRóâôÄõ¥ö7öZö@öFö®÷ø´ùÖúØû¿ü¢ýzþ,þŒþªþÑÿl¶…^É•Þ Z ƒ ÄV¬Ë 8 º ä ä { - ˜ „ ú ¨ š » Ñ › ßßC7 ¤† Ĥ»Ö_ÿùÿIþüúØù3÷Àö‘õ¼õJõ!õô“óœò5ð·ï™ïïïYïqïSï3ï^ðñ]óôèö¿økùéû<üqý”þ¡ÿž…[96[ ÞöÖ v Ü Ë .9lG˜ŠkÂæ­ñ²,ÃÐ|°) õ&Hf†—‰E´ÅtÿàþCüìüûäü*üüéüÚüsûêû…ûhûtûYúÄù¤ø:öööKö]öü÷ËøtøÒø÷ùùøòø»ø^÷÷÷›÷T÷ ö±öTö(öz÷uùúÂü=ý)ý}ýŒýÅþ}ÿ½D½ôä¾¾÷ Z º ó û Ôz×ËM y Ð [  Ñ W £Ñ mírÖé”þ§ý\übûÅûnû+úÓúVùÍùjùCùSùrùmùøx÷ öÂö õŸõ…õ³ööNöQõóõEôô*ô\õööæ÷Z÷øù,úáüÖþ{ÿvÿÍÿÖb<ëiÝhÓ‚%Û¹ ´ ’  à / 9J™2þß¡xL/-MžyM„Ýn3×”?Ù^Ëÿ[þ‡ýšü…û<ùÒøg÷.öHõ¿õõkõdõVõ?õ-õ3õ^õ¥õëööõêõêö=öýøù3úDû9ü*ý1þKÿS!Ÿå1K^vÁm}Æüås»ç-"ç‡*ðâìöøühÇ ÙdÙJ°û)C]ˆ¸ÿÛþæýßüâüûjúêúoùãùIøºøOø#ø+øRøƒø¯øÕùù5ùpù©ùÕùðùþúúú8úgú¤úÞûûû úùúîûûTûÔütýý}ý¦ý˜ýŒýÂþhÿs¯ÎªEÑuAÜe³Üþ.ƒ  ¬ ` î  Ñ  G•ã ÝÊèFÿÒÿvÿ þÃþcþýµýlý,üïü´üvü7üûÝûÑûÚûèûÜû¡û+úùíùcøøø¤øUø÷»÷÷ÉøNùúúüûÊühüãýFý¦þþcþ®þÕþØþÇþÀþìÿmJeŽ’[îoóuÐÙuµËôf).FK+î­ƒ|ˆKÄ¥¿¢CÑ"À,ý„ uÿ­þÃýÑüüüVûáû‹ûBúüú¸úvú<úùíùÞùáùùú)úbú™ú¼úËúÖúøûKûÐüvýý•ýåþþ.þ[þ¤ÿ ÿ}ÿð[µÿ>v§ËßâѶ”vYDDaŸ÷S–¼ÑùTì£D¡©u71TU k‹–ªÓÿ-þKýlü¶üCüü7ümüœü´ü©ü…üQü%üü0übü“ü¥üühüQücü¥ýýcý´ýõþ&þHþ[þ^þZþRþOþFþ,þ ýñþþNþÔÿmÿé#ÿÖÿšÿxÿ€ÿ£ÿÏMÂmE3Ì[à /,û ôZÃ9ÅjØŠ3ÿáÿ©ÿÿ‰ÿÿcÿ!þÊþxþCþ>þlþ¸ÿ ÿGÿWÿ0þØþhýúý©ýýtýrýnýcýZýcý‚ý®ýØýîýîýÛý½ýýyýQý)ýüñüôýýYý±þþuþ×ÿ=ÿ°/¯g…eJ605;8'ÿʼnS,ÿìÿ¹ÿ~ÿOÿAÿ]ÿÿÆÿï 0jÁ*”ôGÎ Fƒ½ëøÑiÈ VÄYÿ³ÿJþÎþNýãýŸý†ýŒý ý¥ý‰ýNüôü”üJü%ü-üVüüÂüôý4ý”þþÁÿgÿïB_XA,! ÿòÿÊÿ›ÿuÿfÿ}ÿ¶ b¤Á»¥ŸÁ…}Ý%c¢ß. å}óM›ëLÿÍÿ~ÿZÿXÿdÿgÿPÿþÌþuþ ý×ý—ý]ý&ü÷üÙüÓüîý(ý}ýéþdþíÿsÿïMЍ²³¯¢‡VÿÌÿ‰ÿMÿþÝþ˜þNþýÈýý‚ýkýOý)ýü÷ýýhýæþxÿÿjÿ²ÿäV§ÿN¹Ùö%.'è±mÕ™xu…›ª³¸ÄÛòÿüöòèÒ¥l66OUD!ÿõÿÃÿ‡ÿ@þïþžþUþý×ý•ýOýüæüÓüÓü×üÚüãüüý/ýyýËþþfþ½ÿ-ÿ½YèSŠ”_9ç¶|8ÿìÿ£ÿjÿOÿWÿ€ÿ¾>m•Švgl‰»õ(Sx¢×Mw‹Šy]3ù±[Å™|b9ÿùÿ¦ÿIþìþ‘þ2ýÉýTüÝütü+üüü`üÜý€þ=þ÷ÿÿø)2&ÿþÿéÿÏÿ°ÿÿlÿOÿ8ÿ,ÿ0ÿFÿlÿ›ÿÊÿéÿïÿãÿÏÿÉÿÖÿü/b’¹åS»ÓÚÔÈ·¢ˆkVNUbh[8¼lÿ©ÿ@þáþ”þZþ)ýúýËý¨ýœý«ýÌýõþþ>þoþ·ÿÿiÿ°ÿà&^¨ö0B(ë’-ÿÉÿgÿþÃþ€þAþýÒý¬ý¥ýÃþþZþ¤þÏþÝþÛþäÿ ÿMÿ¦P’Ëÿ0Sd^E'  ä¢\'5j“›p&ÿÖÿÿ‡ÿÿ£ÿ¦ÿ–ÿxÿaÿ`ÿ~ÿ½lÁ%%Õžj8ÿ¶ÿ]ÿþ²þþqþkþTþ%ýßýœýzýƒý·þþLþ‹þ¾þõÿ=ÿž™j‘ŽqN;83èŸY) ÿõÿÐÿ›ÿWÿ þÃþŽþqþhþkþxþ•þÌÿ ÿ†ÿê;u¤Ü"m¥»­™—»ö+:Ó|(Ü’BÿïÿÿUÿþáþ¯þ†þrþ€þ²þýÿLÿ‰ÿªÿ¶ÿ½ÿÆÿÕÿÞÿÙÿÁÿ ÿ„ÿvÿuÿpÿ[ÿ-þïþ¯þþhþ`þ[þLþ2þýñýèýýþ1þwþ½þìÿÿÿ ÿ&ÿ^ÿ­\¥Þ!<b—Þ KN*è¡e5͉>ÿþÿÐÿ²ÿ–ÿsÿGÿþúþñþúÿ ÿ$ÿDÿoÿ² xçN¨ó(B4ÿ¨?Õpÿ¬ÿDþàþ‰þKþ þýéýÒýÀý¿ýÑýîþþ ýýýæý×ýãþþdþ¾ÿÿGÿcÿjÿoÿ~ÿ¡ÿÕM{™ª¶ÅÞùö»mÿÌÿŠÿWÿ-ÿ þúþþÿÿ`ÿÀ3ªs¹êü͇0Ø…>ÿáÿÄÿ¯ÿ’ÿiÿ0þòþºþ”þ„þ~þrþ]þ=þ#þ#þCþƒþÔÿ$ÿjÿ¦ÿØ8d‰¡³Åá3Xj_<Ä„JÿäÿªÿdÿþÌþ•þ}þ„þ þÀþÔþÚþÔþÑþÛþýÿ5ÿ}ÿÊX¶Û0d–¼Ë¾œk0ðª_ÿãÿ½ÿ§ÿ˜ÿ„ÿiÿLÿ:ÿ5ÿAÿSÿjÿÿ›ÿ¸ÿÖÿìÿøÿþ 6GB!ÿêÿ°ÿ„ÿfÿPÿ:ÿþøþàþÔþÑþÏþÉþ»þ®þ¦þ¤þ£þšþ†þlþXþXþoþ þäÿ8ÿ’ÿíBŒÇü0e–¹Âªt.å¨~^?ÿæÿ©ÿjÿ4ÿþäþÎþÀþ½þÄþØþõÿÿOÿŠÿÌSŒ¶ÐÙÕǶ¢’‡‚‡–ª¾Â²ŠPÿÕÿ¤ÿ~ÿUÿ#þæþªþ€þrþ†þ´þéÿÿ>ÿZÿsÿ’ÿ¸ÿæAay‡Œ{_;ÿãÿ»ÿ˜ÿuÿPÿ&þûþÚþÌþÝÿÿAÿvÿ–ÿ–ÿÿcÿRÿ`ÿÿÕ#jž¾Óè"8;'Ù³“uP&ÿøÿÒÿ¶ÿ¦ÿ–ÿ‡ÿuÿdÿWÿPÿRÿXÿcÿrÿ‡ÿ ÿ»ÿÕÿí ,Sy•ž“x[D?FOP>ÿìÿ¹ÿÿiÿFÿ þõþÆþ•þkþKþ5þ)þ,þ>þdþ›þáÿ2ÿ†ÿÙ'mªß%0.$öÕ°Œp\O?'ÿØÿ°ÿ“ÿƒÿ}ÿ}ÿ€ÿ„ÿ‡ÿÿ’ÿ›ÿ¦ÿ¶ÿÌÿáÿö 6Sm~‚{’§³¬ŒU ÿ½ÿjÿþ×þ¡þ~þkþcþ^þaþoþþÃÿ ÿRÿ“ÿÄÿç#//&!06,ÿïÿÇÿ¤ÿ‡ÿpÿ^ÿPÿJÿJÿMÿOÿJÿ>ÿ-ÿÿÿÿ$ÿ8ÿXÿƒÿ¹ÿüD„¸Þü9[qvhJ'ä™i0ÿûÿÊÿ¡ÿ~ÿZÿ4ÿþïþ×þÇþÆþÏþãþýÿÿ5ÿMÿgÿ†ÿ°ÿã?VXJ9//6;6ÿûÿÒÿ©ÿ†ÿgÿIÿ&ÿþòþñÿÿ*ÿRÿrÿŠÿ¡ÿ½ÿà 3VuŸ­µ¶»ÁÍÛâßл¤–ŠyV#ÿçÿ°ÿ†ÿmÿ[ÿGÿ,ÿ þçþÔþÕþíÿÿFÿ{ÿ³ÿéBb|’¤°­˜o<ÿçÿÆÿ¦ÿ€ÿUÿ/ÿþýþéþÒþµþþ’þžþÄþûÿ8ÿoÿšÿ¹ÿÒÿéÿþ!,3ARj‰¥¿ÓáêíêâÒ¸’^ÿÍÿ€ÿ8ÿþØþ¾þ±þ®þºþÕÿÿ5ÿmÿ¤ÿÖ5^„¡³¾¼°™~bMDGLJ<ÿøÿÍÿ§ÿ‡ÿlÿUÿ@ÿ2ÿ-ÿ2ÿ@ÿPÿ^ÿgÿmÿrÿ€ÿ˜ÿ¹ÿá,000232* ÿíÿÐÿ²ÿ“ÿxÿaÿMÿ=ÿ/ÿ)ÿ)ÿ-ÿ4ÿ;ÿFÿWÿmÿŠÿªÿÉÿãÿû5XsŠœª¾ÓçòêЬ~R&ÿùÿÌÿ›ÿ`ÿþÇþqþ ýàý¸ý®ýÀýèþþ[þþÝÿÿWÿÿÄÿö$Ll‰‡~pd[VV[agllia\SF2ÿöÿðÿòÿù '?[u¢²ÁÓêþÙ¨s<ÿÏÿšÿfÿ5ÿþÞþÀþ±þ²þÄþàÿÿ!ÿ>ÿ]ÿ„ÿ¸ÿó*Uig\RMORSSOLD6ÿçÿÊÿªÿÿPÿþêþÌþ¾þ¾þÃþÄþÃþÆþ×þûÿ/ÿiÿÿÊÿðGx¤ÂÒÓÐËż¨rU;!ÿäÿ½ÿ“ÿmÿLÿ4ÿ#ÿÿÿ ÿ-ÿ=ÿLÿZÿiÿÿ¤ÿÕ 6RYUPUi{[;#ÿþÿæÿÆÿÿpÿDÿþúþæþÞþêÿÿ-ÿUÿzÿ›ÿÃÿíJiy~||{uiS>0/9LVUD$ÿþÿÕÿ°ÿŒÿiÿFÿ#ÿþìþãþêþýÿÿ2ÿOÿoÿ–ÿÃÿõ&OrŠ›¨²¹¿¼²–o> ÿÞÿ¹ÿÿ„ÿgÿFÿ#ÿþ÷þúÿÿ0ÿPÿjÿuÿsÿlÿdÿ`ÿcÿoÿ„ÿ ÿÀÿÛÿó 0IasyuoigaO,ÿøÿÃÿ“ÿuÿdÿXÿMÿ@ÿ7ÿ=ÿUÿ}ÿªÿÐÿí!Biª»¿»­™~_A' ÿþÿóÿäÿÌÿ¬ÿƒÿUÿ&þþþæþÝþäþñþþÿ ÿÿ-ÿSÿ‡ÿ¾ÿï-D\vŸ¥¢–„jI!ÿûÿÞÿÍÿÆÿÀÿ²ÿ›ÿƒÿlÿ^ÿ`ÿoÿ†ÿ›ÿªÿµÿ»ÿÃÿÍÿÜÿìÿöÿþ 3Ldx„ŠŒ‡|jP- ÿÜÿ­ÿ{ÿLÿ#ÿþñþçþéþïþûÿ ÿ$ÿDÿoÿžÿÌÿó&29?DIP[gsyviO0ÿüÿíÿÞÿÐÿ½ÿ£ÿ„ÿiÿUÿMÿOÿRÿUÿSÿUÿXÿdÿxÿÿªÿÉÿïFj„“‡ydFÿùÿÓÿªÿÿUÿ2ÿÿ ÿÿÿ#ÿ$ÿ!ÿÿÿ#ÿ8ÿXÿzÿ˜ÿ³ÿÊÿãÿþ;Xp‚–›œ™™œŸžpBÿÜÿ¶ÿ›ÿ†ÿoÿSÿ8ÿ$ÿÿ*ÿDÿgÿÿ¸ÿä ,?B<0))-5;93'ÿçÿÐÿÀÿ¶ÿ¬ÿ›ÿ€ÿ^ÿCÿ>ÿZÿÿÊstk-4.5.0/rawwaves/marmstk1.raw0000644000076600007660000000100012327014024014233 0ustar garyÿ û- –ãýi02œ÷– î¬ô¯T½Üüÿù|oãgÚ1;Ñsd ØÞh'>ÓQ-úØüä÷Û;#ýëøË øò•Ò”(’êë© *êËáehü£ýàúš Oð5 )ýAÿî Cçä‰éòE>ï­/îÐ^ïÛ+üÑóàƒíøÝõ¶û°sç cú“üVóõÑ töPö5úqóC ô÷ áô ûRÿ^Žúdüâúã ’óè ¾ø) Y÷ ö ùÍ<™ûÚÌýFûÀ ô„ÄÿÎöýòªäö}ÿoÚôcCþ þª„ýÈ`ð© €ùmüá ó;žóXàeöÜýÊÿÈüs°ºõE Bøtªõí oôlw÷ öìŸõïRú#Žý˜þžúôûΞš÷V ÿ÷î”ùN †÷ÚfÂúWnùõ¡úç<ü´ýÓìøÔáþ*ý £÷ýßLRúê¶þ«stk-4.5.0/rawwaves/ooo.raw0000644000076600007660000000027012327014024013300 0ustar garyÿaÜÿ.üdýý³üûÌû;úµûÊý;ü[úù/úÿü[ù÷öÕ÷TöÓíèáIÝKä£êBå<åAú«D rÝ,7'Mé=÷!ß ý Íqæü‹óö—îzÛ£ÑÔÑoÓqÕ£Õ…Ø.âÇíCðñöjúÛýÙòÕ: ­ þþSM-ÿ…øtùäý€ùñäò;ö€öòáóÛùÃþ/ý›ý;’stk-4.5.0/rawwaves/peksblnk.raw0000644000076600007660000000100012327014024014305 0ustar gary'buÕ‚{ ¾ I5’0 !(%}* .Ë3¿8â>1C¨IEOTàZ×`ågm7ssy·þy·ssm7g`åZ×TàOIEC¨>18â3¿.Ë* %}!( 0’5 I ¾{‚Õub'ÿÙÿcþžý‹ü+ú~ø…öBó·ðãíËênæÐâóÞØÚƒÕöÑ5ÌAÇÁϼX¶»°ý« ¥)Ÿ˜ú’ÉŒ†I€†IŒ’ɘúŸ¥)« °ý¶»¼XÁÏÇÌAÑ5ÕöÚƒÞØâóæÐêníËðãó·öBø…ú~ü+ý‹þžÿcÿÙstk-4.5.0/rawwaves/ppksblnk.raw0000644000076600007660000000100012327014024014320 0ustar gary'buÕ‚{ ¾ I5’0 !(%}* .Ë3¿8â>1C¨IEOTàZ×`ågm7ssy·þy·ssm7g`åZ×TàOIEC¨>18â3¿.Ë* %}!( 0’5 I ¾{‚Õub''buÕ‚{ ¾ I5’0 !(%}* .Ë3¿8â>1C¨IEOTàZ×`ågm7ssy·þy·ssm7g`åZ×TàOIEC¨>18â3¿.Ë* %}!( 0’5 I ¾{‚Õub'stk-4.5.0/rawwaves/ridecymb.raw0000644000076600007660000007721212327014024014314 0ustar garyÿÿÿPõاPJÌÞg½2þ ã2ûÚ=± ò×Ú4ãæmdb8Dc2!:¤ °Ác° L=4ÅHøÃ'×3t¸ÜÂlõ™Ìuóâ5 }ÃI 9!/D÷}º„é–H˜Ö¦7•>Ÿ³‰Á[+'©¬1ÕC-5:›Ê}ŸBÜ!ñŸ ðÿËú›ðàG+Lá³ä±1ɪÖ-ïZ(?6¹î×ù ä˜9Ó@Î(0û~Ê ÷µ'xiÝÓìDåûc S皈á$Ðß8•ëlÜ“øØ!( ðÝž F¤g#ø¶ò,Ët7ñ ;FêQé“î Jôâdç«)™³äIÒÂúúFûݶ[€ §ò ºã'îêúŠÃÔá<ôÁöüá¡xWþ îä{î= æo ¡ôPþ FàÍúwû§Að!ä½!œÿü²Rø#Oà õ(är&4að  ™íõë æâ/Ñ€· ïuý¬<{ûQÅÀ /©âûàÌ–&oާõ÷‚,åµùsë~àSÿÜûÞD ¿ §È\ï*νրû´%&ÕÚl¯ü½K ‚Éï„)ªø™÷Šø?Y $ôÐ@û±/ØÝ—r'¼änÑœè+öxmõ“ ÞøïÙ÷0áRTVûkÑ„ìEeÏÝÎÈó¢T† œcèQ kNÙ8‰ ýîÎ÷ ä ~ï‡àíú‘Ûu »á 1 9ê‘ç·Jêbï%.ì5ô6hÿËû®Ô)”òëóìÖ.$:ÊŠm mù²Üë¬Â÷äÛù=ö6ØæÈü£tí2ìõ ùþqÚÃ1€æßâ· 8Ž êÝ=. •9 ïû>ú[÷Ð¥uæ‹å!™óÿû×ëo\;Ã÷ŸÑî ³ÙGÖ=8$$ú-îñ2 ùkùÑ ÿÍü½ƒópñHþ©Ù¸ ãNçùÿ 0 ótÛBbCýà3 ¨Žòìðü ® è"ôù·++÷áåÂõ ÿõ³ûɆø‰ýø2úÔê„öX(|è(ôyöÍ"r÷ÖIæåT‹¿ôDó öË Þà'èü7Ò |uö+òó™äc—ÑÑ}ç fø¤æ=î¬eæå‚2£ûˆú,3 êé-g!Ûû‰óã]"™·ßß O Œû»˜úuè áÔ© #dQëžë/ûÆ#y(?Ó‚àu êhîöœô ëîº ;·ÜÀúL`¡ߪÍÈ8GûéÄì*,“"8æ™é ¸›æ`Ø%•%â§éjº$êAãéÕà Jöœ–ÿ¼mù@Òª:³ï½ýŽïîô"åcáÁ 1zôÿã£ú Š ¿íÇâµGàÇp<ì†÷òn &„ ƒñÆímð;"ÆöñUõ¥úoô ¾ 1ø¯þºÿcþ]$2÷çëi ¾ðTø\ 8À¯ïúãn!\Và»”1 ˜·Ó¹Ð&ný™êéâppá§ém?ûrê®ì·ÿ&ðæ ç:èùèåM v Jõâð× ïáööÓk õ™Ñó÷úŠ uù ævüÜòÌøÃï•W%ìÛË1L Øfî#$Z mò6_õøCrC‚Þþõ"áÿýØiöˆÚ eäLõS cí€ðw¢ áAïýþªûë߈ú 5ëÝ3þn"lYæÅãÞ%Ñø6:TÿgÕÄÿ\#x<è€Ý"L7êèŸÓ|b1Øò¨ç@ ²öù̉{ ÀéZΨ5:ð‘âôâýߘåUñ#*ùþ© $ÿbéøñ Á Ó0âô,‡ !â]iþ…ìLþ_ üÑ ðû1ýÒ ¨è(lk4Ûqì[õþWz#äÿ Óm “KîÝ÷¹uþ¹ñtð][— 6éðÍ” %1 íŠßgo&ÚáÊcò ¡ûlöÛ çûhé"üÃøÓW&âÄïÉÿßµñ4ã ÆZõÂð,pñíÃøÕ §%¤òô×Ò4"ôBÙìõn &æå¨ ìámð$;[ñBðà”p÷ÜõBŒøÆë÷¾ ïû¨òeýbâ­fŒøï ýfîúØþlíø{¹öðù·óšòðøÐÿÈ£¦êq‘ûè CüòÄ&û£†qëÐìÁ} ð/ðàùêà ¬å8ëm·ÿ9å_Ëó‚!q fäúêQ#“äîPô ÙÝíÌ!d(yóÉßC©ôîòòß ŸêÙì_±ä/óeküÃú ¦Ô Þôbý¼û= ­óY÷û’¹ ÿHç€ýÆÜí³à|_—þ£ì^ j!øñÎåÝ6ȺøÝjïÝ‚ö˜„êvãi‡ï£ýÌôœûûö²ûZç—ÿÑ÷ó?ýOFö5û¨¦  þ½úó³üÜ X ùê O_é\_6ãIçí Û@þÃÛÂÿô2‹ùòÙØþvWþÿæØùú;¶øväaqW©éøâwƒŽâOî ý¶Hü s -äKæ+báøÀò  ý<윣 ý2ù¯ýÓèŠTúWý?ÝHù)N…é¼õ忞 6ì̆ }ùá 3þÂ)1awí,µôÛàÍï'rûêîÿ ØòÆú óq ³KìrúQ6÷°ä½]úiýéôí×þ'÷•ý’÷œPô’ >ô‡©ø Ùî`æ^ü/áMÇ?tõü÷õñúZ!qñîiõmæøfíÏ’ÝèùU;/öÛÿ×þ–õû¬û[ dûZöðYäëKÿø’ãŽû.ÿ?õnüÒÓqêõBŽ XíÏŽõócè ³üeñÜK²ùä ¤Õð ñn5ù:ñQç, oìóóBc¼Þ3î 6§ò6âÁ` ¸÷~í Lú§Êõ ç%Ýö™éòã'± ?ÅõD%f ²ô'ëh¹6óø&(kìŒîÍ“]ýî} <êûý: Õü¯ë¤ögë> eþËõ­ûAeô‡òî+ €ëUú DùÚ†&òbóc£ ²þ½L úò½ñEõp 5úðtê¥7}ÞõsçÆ²³ø¼ü ô_ —áÕíOš=·/øù)ný…ó)ãöý"ä1þcgôKõ… uþIî}þ3$ñ_î'ö‡ùþ7øÐ÷ÃÖß þ#. $ëý_rù5ãý¦“Âó&ål¼ åõ¥ ù'è"ø)³¸ó÷ 5òKè´úzôæÃü)Öÿ‚ò/ñjéþÈüÝúzîuöжïšèÅU£ ùžôw †ú†÷И ßyúƒ Ï Xý×ßÒ Ã  ÷ÏœôÇç°ûI ¾õsûØ )(ï.Æ¥()ãú¤ô]õ¸Œ òÓq÷çýëϯóÅ b¼9Þ­ì¤7 ö\ú…Và9örƒGüøäÚûå ð÷¢ö| ©þlõý‚ü« V,i ¿ õ^ñ< ÛW "Žò(öS(…ôzx‚jùí÷xåõ;ò dùžœõq½çÿëMb Œý+ûû/göþFû ™ ÌîƒóÝM ‡üïùôW CùèÿœðxîOütíëúrUøóåhFºþëÉï=+1 äÙßï!MKãaØÍcû‘ä  #¬éŠßSÚ+ÔõásDŽÿ®í=ý_9Þð/Û¹ÿ.í–éüÙõʃôçîf vwö!÷? ø¯öª2‰ú ÏòV|"Cúoë!¼ ÇýÜÿŽ•¸íyýEùŠù@`!õžÏq Ò o öön OþîP1UšâÛý™‘ó÷õÑ *‘âÐòˆ ³ -ÿ<üéIúGã²ùÕÂèÑðIÖtùÄ,ëÎÿºúiú!Áðìlö7€÷¤ùêúRþ6û÷bìh Vûiüð®Ïø$ïX þ òüã) %õ¢ñ@  Õ¬øØùOýÝÿÍô:÷äÿäfõ~÷-ûwotÿÿÚó¢øc!·–ð›î7ìa ä¥ýWl “ï½÷[ý¼™÷™õÓdóVô:€Z»Ú—í³†8ú[îÁ_ëÛô-Ï>ñîòÆh Rîãò &CöüÖôˆÿÿ¨ø‡øØ ôâà;) Þ ªílþ—*ä·ûÔK þ:äý Fþþß”›éwë § ÆèßetôkõAŠ! ú¯æ¶ôÁŽ ûQ>úÀösúæ Ðö0èj8 IñŽöH· ÊéäèÙ­ ðô$£†÷JòYüÈü^rñéXþ"Ì û&ý.1ó×ÿ€ þúÆõÇ÷ö¸ý"þ,Fyóñ| s jü=öµ Ü rÿ?íFÝ$}øiêeþ¹ jï>íéÍþ³ì9ü˜ýïþí,_’î†óy², ¤ðRø~ Ä6úoH ƒ»÷-lþ1í^ï`Ž ;ØùjóÑúoz¤ü©tÿEýÜI¢þ— ¤Iñ‹ó‹ ‹òtëþí0ßðõ>ûåŠú ×ýâ< {ò¥é*½èçK ðwÿ…êöL;ÿ|ûÀ({àræ‹ñJøÇÜ úÿ“ßÜô`*Bø<øˆü:úd –vâícù›ü B€óÔüŒ÷í²úçÿ×ô…òýýÉaSþùóïfÔ ÄPïuëùF Ä$ùŒfÿEü/ú§ü ;& öYðÂôbô! ñëñÝŸ‡fþ_Œþ¿DÉû,ýË ¿Îýòyùzüºÿ\  Õîï[ùíéJóQô ÷ûôùÉTù ÷‘ü‘öŽÛ_ñ:åù±kíÿeÖðšè þ=|ú›Ýôý5"öÝZòú(W܋䔧’&ìç' žö•N •þãï‰k­ôåÑT¿à¹õû¨Ýó+êµ½=ýfèåýc4éaü‘†wõmöM·²ìµó ÷ôüéž  Œôñ}(õdîhÊøOòß(ðeì„ é ø 'øàg)ôšüŸÏôêïg üí˜ñc 6cþ¼éÞþååùRÿÜ ©ú×óñ:ûìñ•hXÿ‹ëKúL g ¡ômþåúóƒÿˆ.ãôÓðõJî Äÿ¿õ;ùþlö¸ÿœ 8 ¯ôñôWûë ™þ÷›û÷–k QþpîéûL  ,Òû±ùõùRë¿ ç>ýðËò"›XûŒïì÷©Û ]è§î¯{ FãtèJÎ#ÝòùÚeøYv uîûÆùm㌈$ÀwÝ<ÿmÇãÎí &ŸÝ%èßç±ñ«ð óÛèÂ@öüâòÿQ ²ìAþT¾ï2ùD ý –ð7ÔýyðôB"*óˆÞ¥è[öøÇæÿððzî¡òýñ fû[êßý-æ—ݧ ìÕø‡õ5 Gõ.ò,}+´ðz Õ ±è¹óPxþÅæãû¬Ááö$ ÐôþêŽõ PFSý‰üeý‹óhü¦ß9øXþ·û¾ù½. #ûIòkÂü ùMŽùÚøú!ñgø¬òè÷©*ïÈô‚ þ÷íGÿM UöÅôǬ«Ùþ6þBüñ’ôŠï Í÷õaÿ<÷|þ@I ›ù:óIþÓÑönÿ% ØþÂþNöU Í õÔßícwüãlÆNþ?èmôvŽÿ ðŸ4ùXä,ú Ê]èŸô¥š˜õ¥þN·ö„õ j£ëäúÚ ×ØçF¡êú:äéüÿ ûëö‹,dð±ù˜÷óIðN­‹÷~áíý×3 öòåê›ÒjTûÞ f Uîôò]œ LÔépþÝô!é(ójŸúgîÐ`ö »µåùæ¿ U ßo×þ !dëâñâ Ð÷YïöuÁ xü˜éüì3_ôvÁE÷ÊøÓÿÙ±ÌüÒðÑûåáZ›ó´õYõûI ~ Dó–î”ù*·õˆI5 ?õ÷’A*ýùùPAû÷üý:º Uì&éÇÒ.ûåò þÿ¶ørûìõ7 {öëÅùù$é¨W÷¢ö¥f^ ©îÏÿ  þ~ö{ù D Ü÷eï7þN/ùuþº 9 ñî»þkéS1Òûcíþ&i à¾øŠWîjUgøPè·ôq É÷¢õÎ<ñwúi¾—ó`ô¥ À 6ûÃöʯÉ÷õÇÿŸZêúÒõÄ=÷(ï)þ)þsû„ÿ:ñýzóþl Äò7ø0üÃn ÏÿÊøÐë AÎø–Îàÿöó¹÷ŒÚHHöô¼þK Œÿýï×úA“û‹÷ÿ™}ÿÿ¿ý¨Úc±Wï`ö*e^ö¼ýRÿTúoùÏýq~ õ ä•àù òÆùO >ù½î£ðÌ ñó#ù -=ý¬÷ÆŽøVÖ Œ÷‡ê;ž#†8áÒæÖ vÒù ø UóÐòè Íù­ò+è7ããTô è“ù8اíþüKû˜ìü=òŸñq~nôêãõÿ½… žòÈçû÷+ûýÅfþ%õSúøeŸóMì-7´ûOêÎMúŸèPíÌ ä vùê¿ Pö+æHúL±iç³íÀ• ­ú0÷( §ÿßúÿ%üx ‚ k3î’ù/# ì÷‚ÿýó  :ø–öß[Þû!ü`µNšùfÿú>úX%ÿòÖô ‚­/ó¶: âû õ(ýO—ÓùÍüõ¸þú° øžú-/d¨ùÉÿÓaÿîøãùdÿnùgñ²"wùäýEý ýNÿø ÿh cû†úCþ­ñüãøÕó …ûëïµ T á÷õ‰æëˆø2µ<çSõb ¡Åëåñé ºó‹õž} p÷êó6Y ÙçQ蓯 ÿÊèÙáÉúï£üîFü^ SþïRá †úšèÔøÝ¨ €óðò}?Íû˜ö Uþ‰þý¶ý9üõnüTð/úì¯ Jí&óQ ;Ë÷uýR÷ YÞðŽü^ xýñ »Qõ(ó)üb ðqü#ýù}õñ¥þ÷èˆö¯n î}û›§Oè¼ì¸‘}¬ösýuÔþ ÇËú¯ý¨^tÿeü^ÿjóûqðåü¦¶ L V;öÁ÷Vþ´ ²üqûÆÿüþûØù,â Õú5ò¿`rûŽ÷XÔ]Çèñ2 ÿöŽ=ûîõsýB Ø íù õp 9Sìö ¤Ñ£ë6îŒ]"÷Mòwü’ú@ûÔõ ¾±ùÝì•]ñý)òÿÛGééyð¯%“íð> Û2ðôøæ3 ¸í{çíÊ®ò¿î~ µó"ëâ}[ûòëH vÃô𑼷ìVõ?4nùÁLhû}ðeü±RöYÕ ÙùAöþèߦìÐ÷„_þìû+üq þö¶ ¬ ÷Ìõ<þÂÿ]ô÷ýßÜÿtöôÐj þóãv ¯û!ñ´½»ƒñãþú p†Ïw × Óïô3 âùøò¹ ¯Âî0í~1 ûæøœ;þ`øjý…®kùêó£ÿj®GNLÊû& àýÏw¸?þæñ¥ù¬:ÿÜ£ûOõþý+ /ú^ïµý_ Ò¬÷þ+ã¹úêööçNýúª…÷‚ðÅý. J]óíüúr RúZó C ÿ™û”ú˜ êäù-j ˜Ûögüˆ‡Mòüâyø¼üË/ûXøâGõ9ïXòýfçðüu+éë>ð 0Üþwü5u±ùøá=óÙí³3 šñïT $ öóéÙû‰ VÒï4ý‹  ý êV÷uûYô­ý þËòãÝ Œþfõâá’7_õ{í¾ƒ…-úAëÁûÏFøûi¥ÕøJõÙ ‰þ¿ý¶@þEóåûAóóîÞú5v XöÍþeíùŠô<ù$k¬€öùäö¶”˜Æû¾ú¡ýÅ…ãÿ4÷dýu¸ÿ`T½ýýíÝûÌöøòÿ <óùøð8æBÉù×ÿÈáþ\hèý@ùVw û‘ø b Où6ëgöµ ©ûdù8'ÿ¼÷YZ 9Œõþ½¼dúÔÿn ™þåöâ! ø¶ýIþ%ª‰ð‰ùÉ¥ ;øLôtmüü_Oú¤û7½èöpÿ_þù  5 ƒü÷ñû>wþ=öHüÉ .ôÚú`ü‰øq„÷Ùù û ú„ðž”þ ü—P  úuð÷ùoOîØùÁßý@þ}ùÿùµüßþÿÿ Tþ éÜöïø ø Õ%þ}ÿâý?ü‘ût¡´ùzø9­äQýBþ‘Õü˜öR ¼òùÁšü© †þ,ùOý4 %Í÷öý‘„ò/òÎÎ íþ=ônóÜ $ À\Iûûü÷ú2þ°ÿ°ÿTÀ É÷-ôܽàëðõö¶{üqùUÌú¯ö_ü,ý ûñ—ó]ê Šòëó‘ m&ÿÝîþÿWËÿ‚û'…ö[ñxþKÃrçõ ?ò‘ü/ùðûðo4j÷ß d>íæðÅ„Øû‹ìYÿ·KWúñ2ÿÖý}û2ý†zRc÷Xó×ÿ 0 !üõeüØs3ÿ ü¯EýÃÿ´¤`ûãø>žüƒù§÷¶ú > }ýbõû‹L¦K ÊþŒôœýâ èûO÷Þ ¼_þ”õ ؾótõ|útý²— °ûëéEô¡ ýOõ‚þ¼ü.öâ$…" .²À´*úCöü‚455èý.õýU ¾Àøíý¿îô]öKɳûÌ9öÿ”þW(Hö5ójÌ ^ÿgöd½þbò_öS ¦•ùøaÿñæû£þ u “ù6óªâý‰ôÿ€ ÊîTø WóýïÉPz÷üˆ SöîšMŒøŠî- )€ûQìþä èð.ûc¨ôYl·«ëoò ª¿ñ¥üzåŸí–ì’³ûGõ»å ônó& üøø÷& X¢ùøü¢³–ónú¡w ɺÿNþEÿSýâf-¯ú8õž´ Óý=õùù oA÷ÞôÊ E 'úTõQõ®þ?ý`&ó?úÓ(úQù×ÿ`ˆ¼ùšü÷ ›ýš³]ý¾ú¢ù{òõÊePÚFø{ö­vÚ³ùžü’IZñßúG * ýúLó:÷°´ mIý9íýó¢ m RølîÏQ ›üóÎþ¼ –Tù-÷’/þûnC 5ôâêþl «øòûki÷¶÷Þéþ&ÿsýnúz ‡Ñ÷¥ðÎ/ ;Vÿ‚ú-þ`JùIX EÿPþ·õ3úZ &}ñëîÀþle`ô9øámÿû{Ñ û+ñ múƒîìHÞ–êÈõÓhýó.õ»+ûÞû8 ¬íðú ‡õsïlשøÍðÏþ© ¾(ûý±çGû‘»8öjúáB õô¤ ^Iôeù¿ >ýîöµü¥<þýY ²(÷ü¦X Oâ÷Yã R‰ô‘ù:«zúà÷¹ûéRþ®ÚÆû'ó-ùITù‰ú;Œ:töEýü 3 ý·ùx4l¬ü(úƒþ.,úùXqlüFþ¼ÿ°÷ÐõÓ<[TôEð߯ Ív/ª‰õYÿ3 Ó ööˆ° »ñcõ‡ +üïôè•ñ÷Zýýïô÷ °Cû¾ô< _ Œó¦úÑ| úmózùzõTþ®÷÷Gøu Gü5ö¢^ÿméõ.û+ OÍöðüŒ«V±¡û±õBú'¨ þ ìbúö øò÷¾êŸõð»þ…ý›Oüéõ{ýú_”÷Éîý ~ ªZýrþºûèd#Pþ×1‰ôðÈÿ| °ÊúŒïû— § µ£÷'õ¤‰í×øÃþ‘'rú=øý² · þÐòZöƒ «ÿbõ ü®E¸ü˜®Qúlüwtûú£ÿQ ¹+ûZñüý L ¨îpùãüú0Ñk÷„ôíü¬ŸV÷vû·Hûuøœ DúJõßôÝ@=Ýÿþ÷†lùvú;2 ü]ð—‰zÿ±îcû‹ lÑòýO˜Æòö ðŽö²ý©ß Øô‚í§ ¼múgò£¦ ¬ýNù—¦eû8õîD ÿ×÷™Ý áð´ôšäˆcøÖü†iUû’ÿ‹(ýlõ¢üƒ÷õ $K žú)ïÝýÿŽ£ý¥kÿþK#ÿsýTHïóîó·î ¬óŽô"Ìúß%ýÔùÕýÔþTÿÿg~Àtý%ù3•¬š ßòøf¨ ‡Óò"÷vô@F¿qûÃû±wÿ¥ôdùò …FúzéÿzO ?ùø°Aýý‹M³ôñ´?÷õ‚÷ ÙñÂóc²˜¬ý·ø'ø8Šy4ïnöKw Sü;ó÷»Övï,ò(+ /zü©üføó÷Ó s‹êí}òÑ ÕѬõ?ýl%ñöõŒ 2Ôûqý™|õðEÍr æÎòoupüð—û ûõùC©ÈøA Džñúªµø‡èÓ÷– U„ö°üxü;ø^$ DøS§ Õÿÿñxý—¬ .ø&õ‹ü%š -ÿ“÷Áõ_üÿzùùrX0Xøú- £ôüødPÍü(ýþYx ¿ÚÿÓûÀÌ´öDû»ÜÏûröçúƒÿ7Ñý’üÿbütÿÑûÑqÿêþíf8þ€‹Ãûdý‚ , ç÷ž÷¿×—úõûuÚ ‹ûÕóùÿ| [ü,ô .øuõâE Rýåî^ÿˆTÃ÷%‰ ôAîØöžz×ö[ûZ9òFö+  çøï«Ó—Ëûcü Âþùzfý]¥ ‰÷då£ú^ûñú;ò(üN ÉTö_ú§xþ:õŽnvùéý/þ(õN€a $õ'ìçü˜ßäüÌx¢øAø<{òüôüç øú/ò2/òˆó_8Íõ"…òºðåÚ óÿõ˜- ßiø)ûìG~û×ü4ÿœU è1ú>ñ`öÇ)XüÚÿü® ý’ü»üåÿç}ú0÷ßÿ£Z³èûƒöÞý©1IÒõôÇÐG,÷‰¬üuþ³þ4üceM÷ÒöXüæFåXöõê“ $mø†ù—]üˆý¨¼ @÷ûûù}þ %½î÷ï~ûh ȼøÌñZ´ ›ú0÷°£ 9I÷‡üK‡þcu Ü ø,ï©ÿtñÇömö³Ôÿ}õûýN)ó÷»ŒöêüÅ U ¢õèðuk¹ûéLî8ÿ“Ó-þßÿ‹ÿQ2ôTù{IÀ÷ïwýo Òàøú#4ù,ý}”üýÖ`rûÔÆ ö Zø6ñt0ƒÿnõ!ùþ5Pû·§ þ1õ¥þÈ»÷EŒ­Ãö¥üOp¢þýúioÑnÿüŒþÚúþT¬ý×ÿ³ÁÿkÿCþKú§#WÉýU÷©ýš {ýÃ^+š´þ?þùO÷¥F ØIñò¥ë¾ú2ýLê÷ªú‡ÈÏØ£Gÿ÷ÔŸ ƒôHø–HÝhýüú4øƒÊ )úùòþ€ükúøÿ Yôú‡ ŒÀÿEýÖü>úWì ¢ûlùlŠÉù÷¼´|ÿ½ðÔùp¡€þÿ@Úô±÷?¹‰Pòýù‰ ýøþööÿöGÌÞItŒþ)ñòúÛ m¦ûëõ!üKºìÞÿ(ýB§1QÄýïþºþ™ýþ=uùíúÿüˆü,ú/þùþ gpý)ý+.Úûúýi¼ªô“öùà Òýàãâÿëþ©#ø¼üŸý4þë ‹Qü=ü ù¬þqúvÏýéù3ý%þ/þqÿ±ôûIú¡àÙþúllù øF}ˆópû^_òþ@¬ Wó-ù]ËÇøDýŸ ê…ð‚÷û ù†ñIlãúwù DüRñ‰þ½ ê+ù>Ÿ ýÚòàûú ª±ýø•ËüûùJ/tûò€F Lþˆøý±”úøðû{ ³ (üÑøßE÷Üø¢ ÏúM÷|ýCùsû yûlø  ÖÿëöúoµÿHùÙ!Lø^üß%ÿÝùôŠ ^÷§õ7ûVþ´ûšäýš,Êü ñ©øP¸¾ûÌO íšüÀõ.cœƒuþkýTûañü’ûÛÅ'ÿ™þ“üø¦û ý£áÁíLSü¢ùÐþ-ÎÉþáúõüÐ#D5ñþÒÿy2“L6ÿ2ûÉöÌ÷v A[ûg÷úú~À WÈùšø‡ ¨pôÕæ´þõ7ØKøØúFÎúÉùŸt1ýPëúøÔÑ ôOøZ ˆæ÷ùŽ’$úéö¦X xøcù §ñú?ì²ý–±>ô,ù¶ú)õlþÆÚö~üÛ 1³òõ÷¤ Ööz씄úùüWÿÛús'ùæõ†ú³ =õŽý· ˜ôó9ÝÛlû»ÿ¤÷Rù ÏfòÏûà zrõ'ûê»}ô¶ü¥VÿÁ¥þ6øGÿ¦ };ùUöÁ3ûûÚþ³úêÚ¿ýnß‹ù'ù ±ÿûtü2ÿMýÕ}Nþhrgü½üpÿËNÎüŸû¥,EA¥ÃüsþJüýL—ûüMáÿ\'™Jþ@þÈþµý‘ýú´·úÞücyåù@÷k➘ü‹ûíü<kuõ&öÄï ítóü:Ø“ø¤þy H3õ«økûTöÕù†IL÷ŠüÞ u rúÑõM6²ü¡ü5 QûÀíTý{ ô•ù°” ë’ö'þ,ìúZ÷Ì–øþÆüõ¯ñ|;Á ÔþZôïù J `ûnÿøý„Úí÷ ö¡•ÁïÿYB5õ¢ù‰ tÜoóéø•¿ÿ ÷F_ F\û&üYÿžýÀêŸýð¼ú± W [ø_í—þ¬ ‡ÿi*i…ýˆúïKáüïþ¼ÿZû¥ýËÏpþÖõ–üFÿ¨ž†ûaõÐú3‹˜K‰ÿÿÄÑÿöú°ùÐÿ Œ Úù÷‚ <aõûø Åu¼3ü÷üùþÒüþMüH£ÿ-ôíö²  ö>ýÚp†ßPýBùÎê ¸ùD÷ ‰Sù ÷ Õ $ø—üÿgb} ü®÷œÿî F{øvûå Þºú]øz= µü,õÎü’üÞúÒÿɈ´ôô+ ùÿ`÷]t /=úóþ‡ñùÿÈ€þ¬ÿèÜçýðòMúõ¡÷ÈúÝþ…ýÔù€û,`jþHüý“ûÑÿI±üÔLìJ[ÿKÁaü­ûÕ¢†ü¼ýVþ“úªüàÿ¼÷Éù}ÿÖ¬þ»û-ÂX¨ýMÆH±úèûß¶þfý6÷ný‡C3]ûDûËþÛþ¶ý“û€þð›ÿcþ°ý¶Uphã.ÿ%ü³6 ‚ôÅù=Qÿfûÿfçüqù÷üøWýû÷ÍÎùûûjð Sòùý( ±çüvû †m÷ÚûÍéòû¨ÿglý«ócûÿ+ùõ®íãýýÉüõõþ&ùÌPƒNQû€ö8 ú÷Âó}R o‚öDü$þR÷Pý]°·ûû ‰ü_ú!§ LñõÂô{¹Á)ûSÇ»û4þÈ“áû|÷K0Èú õé̸èöð÷[ÛƒE=ý±ûÿŧÀûÈøŸþLtçúަœ1™ù/ûdý#{¢ÿ†õ ÷A¨S#üšþ{ÿô]0ÿý$ýQf/ûÍþp. -üòöTü×älýSú8ý™ÿ’·óÿ·üa̽ü€ø\ûI9‚ûPö¨üù_Lý¿ÿ¥ÿªüÍÓèø›þ¤àR÷…ú9 U ÇýÅø$’ÿ§ýƒ,‚øÏûè™ ÷èó¢’.ûuñVÚ!òßøÈ3êùü„ »ù]þ¦¤uöðú ö_÷°øI%DûÎúNÁû ýýÂ÷øÌðþüÖw*øÔÿ) ²Òúú.ÕßÿùûKÏþ~Zÿ?ö¥û½! Fÿ.ô˜ý%-û¶óêü±»¯þþhCþ©èÿõ;þ¬ BùÎógÙbüþúšýûøœýkþù§üÒ-zùóòn6 âøØúÃ'oi"ÿÿ²£ýñý„3 /õl÷LzRýÞû öÛúÅIÈù¾ù"ÿB·ý —þûöþ#û0ýÊÕ3«ö†÷' ,àõÓøˆÐ^ûàúÿ‰{¿üdÿ3kƒ×ÿHö1õcQ=Ú÷Ýûˆ:Úý ûèåúú€ Tö¹ú ”Óô5ôÕ`ù7ïAú÷AüU² ÿTø™< ©þ}÷ ¾k^ðœö~ È ¬÷Xó¬f¸ý˜þ”vöø£ – ú#ølú Ùþ4õ • =XúòÿÙfÿíüû•Aÿ5ôý0 ˾ø8ù™ôü•öSÿƒÕùœþ ÿ.ü:þä ¸Œøz †{úìû”ý úÿ†ý V ùýòQ;ö©ðu# @ýÛùfú4„ùwûM·®ÿÀÿ—ÄùÑû³ñÿþÊù“ÿ ­Aüÿ+¿ûûÚþä~l5ú4ù(Þ3ÒýbOþKüã Í©ýóýÇ"]ýöüñ[rüÔ÷¿ú…±´Iýõûîþ:Ú<û&ý»hÿÆüeÿŠÏ›üšøþ¾ žUAþýýåûŽŠïøOýiCŽû7û³”Ûø‡õׯJü’ýÐü}üP±¬ lü?õ›& ÿÿZôåÿ= p¿öpúí¸ 8ÿ&ùþpüùBÿˆ £9ïÆñï3ŽÿûÙ:x ùŽþ»"uþj·ú^û"REï7õ-¤ —ðù¥úRÿÉþü}üTð 8ÿ÷‘ú®îøó­ø•ã ¿×úfþ<XDþ3?búèþŒýeùCúvXuùEùõ/µ¦ûlüáþ­½õÑþåúÃþ\þzþôÈÿEù ÷{üž8MüøöýÃ=™ú_ùýý=²W ÿVýè¯eü_Z 7 ›úŠø$þýÔùûÊýCÿýŒþ^ ðøü›ú"ûˆͽ÷/û½ÙGü|*ý?ûZ~oÿZùÄÿ‘‚û€û,BÿËøÛýÃþ?þÙ ¨yûÐúl$ B(þVü¸únFUÿ§ùýÉÿ»ÿâÿeˆtúCø‘åïþþõñý@?þú÷6þ} V lú‹ùYÀþU«ù»úM¢xÿ:ý[ÞÊùüú ÿî´ÿÕúÒþ0ýåÿ*¯»¬ÿøÒýžà pþ©ÿ/•ý!ûqýí cCüüaÍÿTÿ ü¯úÀþ™Ã‘Púßûê=]þ§þ±Ù ü¥ú1û¦*Ÿ* þ üÕëÊýJùÀúÁ¤Úÿ_üs7üÂûïôyïþÇüIýËþÓÿªÿ> ÿºùrû°xLþ„ú§ÿžãûuú=|øûÿZþ u ­Aõúç WÜû'ùèÏü’û§¡;þHùŠþgÿLûÈþ³±¤ö4îÔÿ NúÕý€ü´þN@û¬û£„üE¬ø@øâ÷‚ì[žû°ûÌþKÿ“üýþÉÞ®þEþÿ²ûAþS#lø¹õü ûúzü¡ÿ™ü$õrýÈùùÿ\žþúª ¥¬ü•ýPd~bþ¿ýüà4rù=ýÝû×ý*0ö^ú@úEþnþn*íþ×ý0Áödýÿ2ºþx¡DPÿ]ÿÕÿýÿu~¹°ù8ü´ŸŒûrÿ‹hÿ ÿZN“úþñ ÷ú®ü£ÓŸýtø­þ˜ Äcßÿ¬ýžü&ÿ³rývû •å¢ü.ÿ ï“û?÷¨§6üÝŠKûËü9þgù’þ‚Áþ±öhüº ˜öžûSŒ?ü þNûö]ú% 'úD÷’šû¨ùN1IþÃöGýnè-úÄSmüëõ"ÿI Ї÷2ùóþ<ü®þÓûôøRôÖm¶aþ1A^ü~ú6 >¼÷ü¶ý ûúµ7ü‘ùTþ6 ÿ3WüÍøèùúÚ þM÷&ÿqˆýý©ÿlÌqøõûkÌUýãþÿÁþ_ü®¡ú>$÷ÝýqÿËÿÂÇæÿ¼ý%ÿÞÞ¾ý¨ú÷ûsµö¾üûü†û+•ì¶ÿpúhüå=Ÿû£þ·üšþxþ E"òý¢ú©·lùýùØýë‹.bûü3éžþåþÀ”°þŠúHýlš÷ü#ýgJ©ÿþþŒíÿ¹û„ý)øÖþý¶ûèý{ù·Kµ úcþr¯ ü1ÿ¬×ú {købùÓ@øúøq> EýøçÕÉþkû=•ûšøy,Eÿ<ú˜ÉÐ[û¦ÿ#Üø@ýVa'ú9þ$š.ø´øÝeÿõü4–üdø5ÿ«»ü'5%$þ؃p-ùOûÀÝ[‹ü_GýàüG$ ûÆýþîþÅüÆÿY©­û£þbüýAý;ƒ–ûpü@½ï<ú‰ûÿŠæÿÄšþ úQýWÿ§¨Øú 3ýÿIlÒ¸ÿZýQü×…ýáûúüÂý“Q'Pþ:üÅÿÈ`þüæÊÿÿYûŠÿÀÿÄÿÇÿêþlý¢YöZö9øÉmõÿ2×lÿôþ‚ITü¨ÿÓ/ÿ¢þÍo¾þzøµþrEKÿcýOÿLþíû~ùÍ.ãþ"ü¿óØ¿ýhÿ´ùYþ€®Ýþ9ýÖâüöþ7ŽúÔøÝþ¯ÿÑûû¦æú‘÷Wt íNûUüSUjü½sÙ8ûéý‘êVÿQ ²ù7ú°Z¨3úµû¿™þìÿéK¦ý¯üåþkÀ°ÿ ÿâEvü,úŸþYm27ü‰ý¾þ³ÿ¾ÿöÿCûÀúsýâý¾üø‡}üºü‚þ¨ð)Hþÿýõ%s«†þ@¸E~ù*ùÎ÷ þúÄûŒyÏcüòûÔý¿t<¢ý=üÍæ/ÿÛ÷§ˆû¸üàÏòýþåÿ¢ýým„5ùóúüìûýù`ÿT{ÿWüÿnœú*ªŠýüÀ‚BølýŽúúÈù›Înþ&üƨ ü©ûͱQû>ý“Â]þ©ø°þ[Á¾ýéüå”_þÅýÂøWûÔýv©ÇþHÕXýö’ûÈFIÿ:ý”þºÿ–ç,ÿKý¥Á¿ÿÁüúôùüÑû‘ê´ü\ùãüÌþªþ ÿ¡wû ügþÖ¤JùSýÿ<f«þnýÙþ’ÌGÿ4ÿ7ÿrýãýœ!~ýhû üÀý{þáY¸þµü÷ÿüƒÑüûýÔ8CþÞÿ‘à®ýºüç-’þr¼äÌûÞø¥þDŽ…þþªÿäà 31û¸ù6þ”}$ý{ÿæ‹ÙûùÀdýòý]þƒþ‹þ1FõþvüRÞÓ×ú™ýŽcùZú)*åþ³ú<ýï¸ÿJýÖ8ûÏùå½<þCùdâRùPþQÝ]ú‚úÍ»ý¿ÿˆ«µúûpã±þbû4:7þoø¢ÿ>ûgýÿŠºcÿƒƒ ù þ?oöý¨úžþ¥ÞÿAú ü×åOeAÿýHþ•ýfù¦¦ýnü›ü%E»ýOþ‚£8¦ÿAý$üþx~ÿ·ùÚþOŠý9û«þÿØbpþŸÿìLã.þ¾ü/ÞßGüøùürC”=ü9ü›)Ì~úsýïÚüÀü¤N8bþ3ýö´iúÕû¾‘ÿØüà`Í ûÉþ¿(ÿ]ÿ„cÁû/÷˜© Q*ømü>Œª¯{ ýCúƒÿg_IÿZ©°ûÝù4…ï2ølú‹ÊMþŸýKhÿÈùïüC%ÝÿµTúÈø¾é \ø:ýz&þþœþ ÜüþÃÿ<ù|ý´þ~÷Âý¸ î û­÷ þe  ûÞþê þWþY‰°þ&þ zÿªü%}øÇúxÙGÿ³eÿµüûÿ~¥"ûçü[@MZýÿœÇ;üý gî›þ†ü’üüX—UÂû¶üîR©ÿ‰úÅþEÛAûÿþ"ªâSÿ<þý„ÿ†`°?ü+ûÀéÎÿ˜ýš+Åÿ|þÞü†,lBüCû¤ÿsÖ“ÿOü.ûhSÍÿœýaÿeÙúüø—ÝÿwýýÚ æ2gþ@û þ¦ <ù)ùšCî|úYý·Í þTþPþ¼ÿþ·¥çÿýûìÿ¡ÑýýnRÿø?ýà)Xþý—þf²^Xþ?øöü}ó5úkü«ÕJý8úÆ…hýÈÿ‰ÿ«üºÏÚþ±ù¾Nõ1ûßú7¡÷ýÑû»Pd!ý¼ÿcÿ×ü›þ*ÔqüÛú­o1©ú7û(Ù~ÿuþnüÿ“þvý£ýÔÿ¥þÅê4wøùD—À[ýüý”ö þøÒŒKÿ·ÿ-,úþ7úQý1 kùÖøGþUcýžýº ÿÁþæ ù@Û'Dÿ{ü`ÿs³_ù™úâ\×ccþ{üÖü‘ýýåþfİÿÍýÿ, ©þåùLüÜò4þ;ý­UÿÝSéZÅûþúãû9’Wÿ®ù‚ü:¾“ÿóûYüî5›E°ûŽý! Äþ¥ü5GÇÿžøŽü_¯oþËûÔýC&Dˆ”ü úÐmoþý;é†ÿ,ú™ý£adýæýöÿÖ€­ ü9ûSþ{„üçù«WÖúgýUkÿäûPû±ÿXØøÿ$ýÊí{Xý û »þMû×þ'Bý“þ7ÿݯüÝû¯þý „ý‡ügñIGýëü ¤œêþü ýÌÿø±ýÿEû~ý:AþËúèþõ­JûÉùQUåþbþvÿ*¼îúêü½ð£ýkùzÿ ìøùóü+e}ÿý­ÿNÿ]þ·K‘Hú¼üÃüoÿéû¦ÿ€ìˆüýE ²ýºý ÿ:þ´ÿ!}¤ÿ‹ùâûÎ"Ýüwø‡þ’ÌSþ%ÿOr±þæþ\Y~iÿ¦þYøŒý4¯ðýAûWÿz»ÿÃþ#úøýVûJÿåuCÿa>}ý.úûT§Üû*ùòý¤‡ãM^üÅþ¢Ÿÿ—óÿ5ü:ü»Ÿ•Ðýœý܆ÖBýËü°ýL[ŸÛ˜þ ûý ò`‰ü…ûþ¤šÔþuþ÷ÿ7ÿº~€tÿ½ýÜüÇþËŒú§úý·Sþü_þúaßýkü…þÂDA®} 8XÕû°ùÍ?±Uýûñÿê ÿåý6ÿÕrÿÙÒ&ûœûEs³ý¤ù´e Toú§ú»2+¸?ÿEü…+êþSùÑýR»üŽøÀÝZþûú:üø8ÃÄýKüðXû—þ•ëú¥øf6œ4ý/þš5ÿO`@ûpúdÁ 3úcýªÛü¦üs6 ÿ²üÞÿ:þôüëÿ–iQüü¤Š°ý‚ùÿ«gÿÄú.ýh×Lßÿ{þàþ£ÿ4­yùŽúþí¬þüõµÀý{þéÿxþ\ý¤ýµÿky}ýƒû4ÿ8?ô_ÿ ÂþôýÑÿgÂ&ÿÚüþ–ÿG+<þJû ýKœ^ûÊý‘»¿ˆ*SFþü¶þà5aýýý/ÿ Øžý§ýZ¯Žþ/ü ÿÿåý½ý\‹—›Pþáþþeéôøû–û“Öõû†þ—oü=ÿöÂdþxýþTþBýÜ]ÉGû”üÖmGÿ´ý'ÿ¡gýÏÿ¡Oþ ý pÿØþ6a‘þ²÷Ñú¯ëÆlýóÿÚËÿLÿ×t{ý±þD¿æþËþ ,Àþ«ùÒÿtzþBý@ÿÂÿýþZSÙþüëňþzþ^¦åûÜû¢$+iüîýÿGÖÿmžaÅüžþ›Ž®û†ýœDïýüÄŠ=ýÿ 8ÿYÿí?nþ-þ\ÿxFsý¡…<ý ýMÿ"Éþ#ý(ÿ`_N¢yÿ=þßÿç_½þ·ý§Ã·þ%ü ?ÿ/ývÿ2 Øûÿ¸ýný þõ}¥ü†þÉj°ÿXü¤ÿÃ%µÿ!üýVnÑ~å£þâþéFPþOvyÿæüþbì–Íýþ ޲'›ÿú§üg<ÿKý+7ÿú ÿ-mþ üBþd< ¤ÿåü½.ÿÍþ„ÿÝãÿý¥=üðý”ÿ÷ÿ{!Òÿ!ü%þ  ÿ%ýï3+ÿ §Wÿêÿÿt:‹$ìÇýGûîÿæ+Tÿý†þüZþ4üÿ "þ¬ýé†pŠ3=þSýÝÍ(çüúßPþ%Ý*wþãþ²ÿW%þÑýýþËþþþ+˜¡$Püý•6,ÿxxÿÃýÝÿ Gÿ²ÿ’þðýwþ7iû9ú¨•§¨ÿ@ý×ÿÑþDPI?ÿÿ]þÈþX{›üIüºûÂÿìübýÙÿrþôþdÇçý¢û¶þ)Bÿ˜îÂüxûÃ!ö'8Mû“+ÿæýÚýÆyÿyü{þ5¸ûMüØLÜ&ÿéÿµýqþSžxþ~ÿñE(jü¯þãô÷üþ¦u3ýæýùÿþ¯þQþýbý˜îñýüG'¤Ô*_qRÿ*ÿyUÁÒXý°ûùþ“1iÿ@ÿÌAÿþ>þcÿ¤þñþU1##\þô£ÑYþêý–þSkÿŠþYEwŽþLþTþ¼þèG\ÿmýXü¹?àÿþN ÿVð!ÿ“ü§ý6‘¦Aÿü”þï*’ýMûnþÂÿaüÛ†bVý}ÿêJJÿ8ÃWþúlÿí]Aý‚üi=ÿˆÿQuýKûSÿ4Nÿ›õßýÃü|ûÍü)ýÜùeþºÜðÆû$ýPY[þêþ5pôüÜü™»¾ÿˆý=þÄ>¨þö;Éþûtctýžÿ<Ä÷ý ýêŨÿ²üw4fÿ[ýÞÊ+ý½ü ¿úƒþÿv²ÿ†ýÿÞ÷*üšüŠHÃþÊ%±üþs†Yþ®ý#ÿ—ÿ×ÿP#ü¥þ?þ&oÁËèþþüMýîà4 ÿÁþÔÿΉ7ÿ†­þÐý_ý¸ÿöy¸ÿÂÿÿ×úù|ÿ®ÿ·ÿÿ€ÿÈÿÑÿ›2ÿªÿ8ÇñÿIýmý„`zPÞµÿøþŒvYÿÏ™ü{ü-ÿkýÿ8óÊØ”ÿéüÙüwÍ‹üKþü.ý þÅãß|þ"ÿ Dþ!þ.´ÿþücýÉTÄý²ùÜÿ6ÿÏû(þi`þ‡þ*Oeþᑃóüþe“Iüüüâÿ[ÿ ²ãÿhþþ¥ÿƒþiþ^–dýÅù©ýT1UÿFþâéÿ£þ-‹Âÿþ;Œœÿþ×úùýgúýÿXåDþ·þ'ÿyþNüUÿ} 'ÿ€ ÷ÿÐüdþ$üÝüåZüpÿsþIþøÿƒú®8þrýøþÓÿ^þ#ýHxOþ©þÿ*çGýþ=ÀaÿŠýlþÛkÑ÷½ÿÄý5üGý½RÿÒý9þ/ïWý§þÿ¸A^KÿÈÿÿÖ úe™1þ‘û…ýVäOÿþcÿ ÿ™ÿ±ìÀºþ#ý­0Žÿ²ÿiºþ­ý—ÿ ÈB6ÿýCý@Î&BüýÊòfþMþxJ\üÌülõªTýþ…ÿsþb|ÿgüþâ¹UüÙÿÍ]–ýý÷Àt ÿZý¤yXÐý û”ÿ³˜ýB šQýGþ Ò}äÿŒ;ÿOý›ÿô†Äý“ýµlÒÿÊü˜ÿ›Zÿnü|ýãëÎ×)‚ˆÿK£ -þKþVþ»ýã‰léÿøÿÁà ÿÿpþùýý,%ÌÅýÓþ:ßPÿXý¥ÿ3;Ñÿyþeÿž ÿ–i¿·ÿ±þsýïØÿþ&%výÿÿ›­?ÿÐÿ!ýûþƒöÑýøüÔ%NKý)ý=¿)ýæÿonpÿçþìþ!ÿ\ÞnÿÛû¥ý)S†]üäü»½ µÿœ¶þ|ÿð ÿÓàÿ„ûíüoš”ùýÞýä_…þüÿ/þÞý`ÿQÓøn“ ´ü ýǹÜKü$ü®ÿ†ârZþ¬þá"Zÿ9ýŠþéÆþÃü=þ«*N*ý1ýìž¿ïÿ¤ýuþ×ÿÙÿ^>/ÔýnþH¹,þñüBüØr{æÿQý£þmÿéÞ—ÿCÿÂþEþ}Üüîþ{.0ýÊüûþÊ",=ý þÿæÿíÿb‘.ýsþOœôžþ2þeݽÿ#ýoý°PVŠý®ÿ}þgûQþ,4òÈýîÿÅÄ`ÿc&ÿ]ý1þ»°Šoýßæ·ÿÁü°ÿ¡—þý-þ€þNþ8õ+ÿêý…ÿïm=üûù#«ÿ¢ýðÂéöÿpÿUÿÊþëÿ’{þ!û*þ€µý/ý» /5ýpþ™ÿÃÿpÿ—ÿCýÓÿöøþü¦û'îpöü¿ý˽~þ´ü}ýžy.ˆÿxý+ÿ÷Ïdý€üÇëÞÐýÉþ—°ÿ¥f˜mYÃÿêýûë6{ÿþ"C>'ÿþ¤þ|ÿzéþZýÁb­,ýÑÿŸêRþ.ý@þÂëóÒþèÿˆøeþimbÿãþÁÿ ÿ”™þmý$ÿ^Ry¥ü³üø¶Aÿ*× þæÿz±ÈÝÓþiýqÿÃß‘ý®û-þ+Yÿ“ÿY½DýÅþ €)ÿsÿ‚`ÿ(ürþ§ô\þmûÂr)£ýÀþÆÿìþ”ÿ ìëþdÛÿWûÆÿá@¸ûÌû+Àÿ±ýÐGÙÿ¹·ýUüiÖ¯þ6üÄÆ}<üý‡“™cÿ„ÿ]ý„ÿ¶ÃÑýFýËæÿëþæ¨ÿüßþ|›ÿbþNý]ÿm>6ÿþûôý‹eûü¬ü^/cÿ²þZ9iÇþÿþ×ÿþdÿç7ÀþMüôÿž&Ýÿ³dì»ÿ´þèþÛÿXÿÓŠÿÌý”ýÙ{yöýhý¥ÿ|{hÿëÿ@ÿE„¯ÿLþì|&,ýäÿþÁþ!ÿ)ÿ [·NÿþÀÙ=þÉýlÿm=þóý\ÿ.•áE5ÿ¿Ê5þþL¢þü]ÿdˆ7þCürþÝY-ÿrýýµ.rÿ†ýNÿ¿šEþ6ü¿ˆðÐýýmÿ&G}ËüñýO(gXû–þ5#ýdüئäþÿÜÒxÿ+ÔªÿXúfüà^tÿòûTÿ6£ý®ÿ]c£þ¾ÿŒÿßþüÞ«ÉÿúûµþÈ!ÿ¼ûùþ6¯m’ù`ÿ þ½*Tÿ¦ ‚ÿÇû`ýÔÂ`þíü$þY¦ýYýÿÉþþ*qËrÿa*gþýk£ÿ=þÿ.ÿŸ^}ÿŽþýåŸWÿ9ÿjþÉþ–ybþ¾üÑþ o©žÿ°ÿqµ)šÿ@þwÿø„ÿKÿ1ÿða$¿þ"ý>ÿš¬y/ýþ1ÿhÿë¦ „IÖþñýßv¹ÿqþG$†Õþ®üÄÿjà•ÌÁÿþJþ±Pþ!þ¤õ¢ÿîþ ÿ¾9Ìÿbþ¸;ÝÿÉþ(ýsÿ<ÔÎÿ—þlþvüžþU˜þ¢þÉ€wÿ×—wÿ ýʳÔütýª ÿ´þO=çýÿXþ£ÿ(þæÿ“šÿ¿þŠÿ)“çÿþ#½þÂþ%ÿ{ˆÿ¸ÿEÿÓÿsH(ÿ\þ ÿõÿ_þ%ÿXúZÿ_ýÛþö>ÿìÿþqÿÜàÿ¨þÖÿœÿ«ÿvͶÿ&þŬ—ÿ<þ›þSÿß¾÷þÃþ‰yËÿ§ý½ýÔ Ú$þêÿ°>5\ÿÑÿá;òÌ•ý§ý,G@þ]ýÖfd^ý„þ‚ó¯þ}ýªÿ\¿·ýÐþ§Yæbýµü<ÿËÿ¦þkQ‚ÿûþî2 Eÿ1Cÿœü‹ü¦p™>üü 'šô¥iÿ®ÿ„*ÿ¢9þ-þì“ÚÿÎü ýQyzB†ÿ<þJÿ'ÇN†ÿìü/ÿþj<„ùýÁþn†1¹ÿšþ¢þ9þ”v3ÿÝýmþ0‡ÿrý˜þá­–þþl.!ÿ‹ÿJÿ€ ÏP þüNHGÿhÿã0'ÿ˜þþ!ÿäžÿ¯þë » ÿ.þ8þNÿDø)ºÿï.sÿ<ÿq-!ýýÎÿÓÿ¼þÂÿCÿ¢éÌýQþ/þéþëÿÀ³)þbÿ;Ëóe“ÿáÿ þä@Ûÿ_ýàÿ4 †ÿnÿ(Â.þóý`ÿP¨Áÿþó·þS/ý/ý½€ÿ0þVÉÒÿÿÉ#Õý*ýNKøÿ|ýâùÿÒýÂÿž¨‹7ÿÈÿþ óíÿ›ýþñ^)þÚý‰Ä/þˆþÁÖþŠþåÿ®ÿ_ÿȪMþjÿ]mþ$þ87þÀÿ-í¢ÍÿSÿÄAÿjÿï8ýÊüÙÿS²ÿì!M§ÿ;ÿÀ4þúþý+ÿ¦6ô2þþÙ ”ˆÿ/þØþ´ÿ-hbó7Dæëÿ¶ÿ‘:ÿþKÿFFÃÿúþ¶þŸ$î@þÒþ¹ÿsÿ±ÿvÿ{âûÿƒþ÷ÿ™]Œÿ4üéþÑÑÿmýÖÿ@6rÞý¦þü¸Dÿ±ÿ¾ýºþÙmÿÛþBÿ€\ÿ†ÿ‰ÿÚÿ„þýÉ Y`1æ’þcü–ÿ£„þŽþ‚+ÅÿÿŠûÿ2ÿºÑþ}ýÐÿÿßýóþ/þ ÿ}0þ•þc‘%ýÒÿŠ"hýþÿÉ1ÿ4ÿ0&þ ýÿK/ÿ["ë‹ÿ ýÿ´¡CþÉ3¯ˆþ+þɾ&ƒ÷8ŒÛÿvýTý· ÿåþ3ÿgÕ*þ*þÎkŸj»Kþ¹þÞOvÿTøóÿJþ¢ÿjþŠÿ`Ï‚0ÿ„ÿþä ô1ÿÿ\ÿ¢þõÿ5Y9ò|Ù&®Jÿþ¢ÿýÊÎ8þ»þ ÿµvþØÿ©)ÿþ ÿ&·ÛÿÓÿ[{årßÿLþTÿ€Aßÿ^ý×ÿ„IŽÿôcß'ÿÿ#ÿ×ÿÿÿt=ªÿ7þdƒþèþ ÆNþÀÿ¤ŸÿÕþ¬ÿDÿ£dÿ#ý–ÿ®]Kýoü–ÿÔqÿdyªÿEÿ | ÿüþÏ.¹þøþ±õH^þ]þÔÕ“ØÿÏÿvþ‚ýÿ0»,þºþ¢g‰ÿlÿ-âÿwýþcT€¼ô—ÿšÿõþªþÑþoÿbÿåÿ¾ŒÿÓþZÿZx{ã¼ÿnýÇþyG¸þ5þÊÅhÞWÈÿDþËÿÃÖlMÿ³ÿÿ’†®ÿ"ÿZ/ÿUþñÿŽÿÀÿpÿ¼kÿÌtÿžÿÿžÿê±ï(þØþ–ÿÁ¾¯‡fÿ›ÿDÿÒfþóþuo4XAÿÎÿ,:¦ÊþìþîÿÔÿ\ÿ8 \ÿíÿ­ªqþéþÓÿ†ÿþÃþë­žþ«ÿ:ÚàÿòÿÌÀŽþæþïÿ’(Øyk’ÿ˜ÿã nÿLþ;ÿ¦fþðÿ2ÿùþÐÿMÿêÿë#•ÿ»ý¾ýÚ;cÿ—¦Ü=ÿZÿ¾úÿžÿøÿ£ÿÿÄÌ.ÿ ý(ÿ š®ÿÍþAþíÿjÿGÿKÿø(ù-ÿæÿÀÿÓàà¼1þ‹þ¿ðÿEþkþ朔tKÿ…þ—þÕÿnÿOÿ‚Jýúþ_0&¹ÿzÿŠ}ÿMÿ~Mÿ–ÿ+ŸÚJþïý¶þ¦Î‡ÿúþJþšcïÇ"\ƒãÿöþªÿc(¦þìÿ=7Dÿ¤ý6þ#†+ÿòÿ1þÛþÂÿ) ©cÿI%Ý“þ¯ÿ£¥²þáý÷Cá¡ÿÛÿgÿ,ÿ£0Íÿ°ý¯ÿYÿqþ(ÿeJTÿbþ»º¥¥ÿÿ†þµþg U"þðýÿ‰Éÿÿ  Ëÿýñÿ-¢S=ÿÿ3ïL$þTýˆÿÿ{ÅÿôÿóÿÒÿ®ÿÎß0¥LþÌýüÿQÖeþÌþSD¥eÿ’þÏ]ÿ±ÿxÿÝÿ⟪ÿ¦þ·ÿZS^Uÿ^þïÿÿqÿãÿþ­ÿr@ŒP,ÿò[ÿðÿUÿDÿÌ_Òcÿqÿ%ÿ3ºQþúdYóÿ9þ¨ÿ(ÿëÿÀÿç®bÿÅBÆÿWþmÿ3![ÿþFÿýÆÿ©þŸÿ¿uJ0*‡ÿ­ÿ‚A°ÿ+þ7ÿ\’ÿ5þÿý§ ÿÒ•;ÿçþêÿ£nÿtÿ€Vãÿãþ,ÿªC¥þ"ý¤1Æÿ=ÿ EHIÿÿ†`n¡ÎþüôÿtD þ`ÿdÿÿAþ]þéþèÿ°ÿ»ÿMPøý¶ýÆg‘þ^þƒÿÕ=ÿåÿåFÿêÿs¬&ÿæÿ,Z;ÿýaþÞñJþÅþßÿ²š%[yÿ.þžOÿÂÿ ¿þºþÇKIþôþÿÄ þÓþþ£ë¸ÿÀÿ5¸<ÿtÿ_Ö¼uþîþ¦ÿ¸¹þÿ>þ–ÿ­ þâþ}þ÷ÿöB ^C”ÿþŒÿôÇ=ÿ þ*þ¡ÿú:ƒÿÿ#ŸÏøÿ\ÿgGÿÊþýú—méþÿÿ"Ю9ÿ0þÓcwþ¼ÿµ\ÿtÿª»ÿäþfþ‰þÄÿ"Y€þþþ”uJÿ°þÿþÛþ²” ÿÏÿ‡.…¢l~ÿÛýØþ„ûâÿVþ1#—ZþZþêeÿõzeÿþ¼ÿyÙÿ¨ýìÿ§NIÿ¤þ^‰@þ™ÿW<LCÿÞþiÿ&ÿÝýîÿÙŒýšý\~ÝÿÒyóž{ÿQþÕÿ½Nÿ\þ ÿ“(vÿ<ÿ\À=yÿVÿBÿQÿÿðµÿõÿfoÇáÿ~ýlþï›öÿÿ^ÿøÿºÿÌÿóJÌSÿ‘ÿÿ2I[þ¬þÿ­ºécþ¾þß#) ¹—?ÿïÿpÿÿÆ—`4ÿ¨þÔÿYÄšÿûý”þÿ× ‚ÿdÿ3ÿ¢ÿÖÿ¼`«–Žþ–ý»ÿ*˜R-þHÿb‡ÜRÿ]ÿ²ÿÇÿDÿÈTÿÞÿ¬_Vÿjÿ*![ÿ~ý¬þwÿý¤Qÿ™ÿ¯[°–ÿ–ÿ3f€ÿ>þnÿ†­Zþ†ý(ÿcçÿsÿYÿeÿÑÑóÿ6þª#jÅÿWÿpOÿþ°l:”ÿrþÔþ¯ÿ‚Îjÿ-þa3_=þ°þèœÈÿjþïø”ÿùÿìÿñÿÒªyþiýÛÿ™[Ýÿ9ÿKüûÿÿÿäÖoÿXþÛÿÿdeAnÿÿ"ñþÓþóÿ¾ ÿrþøÿÒê ÿÖÿýKzÿ¥þšÿÞÿ·þvÿ‚jÒÿ;ÿJ_ý ÿ…ÿÿ{ÿ>³‚ÿžÿÃÿ{ÿàþÿ† ¼ÿ^þïÿdr9ÿ÷ÿhÿÂZtÿ;ÿF ÿÑþ}ÿÛlmÿ®þôÿùÚcÿÞÿþðÿÓ»6þeþ6”Î+þî³?ÿcþäÿƒ‘fjÿºÿÍ&þþÞØ¥þtþñEÿœÿYó)þëþwÿO”ÿæþOþÅ˾ÿ%ÿ[w“#ÿWÿÿRÿäž2SÿÍþþs[IVþþ,ÿé9£ÿÑ[£¸N _gFÿWþÿ`)­þîþœÿôõÿPÿ•ÿ½ÿ ÿmÿ–ÿ÷ÿÚÿƦ­ÿŽÿ±æµmþ^þ,£íÿËÿ¬ÿ¼£mÿ@ÿ#SxþçþO—[þaÿI¥"Gÿÿ;ÿÁF ÁÿÿÖeÿ6ÿiì‰ÿíþÿ(è þçþUÿÿ…m'ÿšþfÿO;ÿÇÿe§ÿ¨þHÿˆhUGÿÇÿÝÿûcµÿóþ3ý®ÿí÷Dÿtÿ>z§ÿOþò'$ÿTÿ™ÿeþìÿ³q‰ÿ`ª˜xþ˜þFÿÃEÿ°ÿ¢3V5qÿúÿ@ÿ,U5ÿYþ]ÿ³ÒHÿŒÿÇMrÿÂÿ–ÿUÿÅ$"ÿ¦ÿ¾Îÿÿ/ÿñi+ÿ¹ÿj8ŒÿTþ©ÿ1DîBÿö Yuÿ×ÿPÿÙœ‰ÿÊÿO Àÿÿ9¡q‹ÿ5þÞÿ!ÿ‡ÿö?ÿÎ/†žÿ‘ÿVF?þæÿ!¢0ÿÿ­Â‘•ºþ·þoÿôrÿHþêB2nÿ7ÿ±ùÿwþõÿ¸#ÿÉ[ÿþéÿòúÝÿ¼þå;ÕÿQÿ­TÿÞÿp(ÿþÿ‘~²ÿ+þ^ÿ¿¹þ©þÿ·«ÿöL‚ÿ°ÿ57‘ÿ•ÿ¦t(ÿ þõ/þþ…_L˜ÿËÿÒÿ™þýÿ<•vÿ¨ÿõÿÚÿ8ÿ£:þþÔmóÿƒÿÍÿÝÿs69|ÿ&ÿ™1ÿÆþÃþãy—‰ÿ)ÿgsø·3ÿÂÿOÿއœÿêÿuÿÙ~ñIÿÿ‡nÿ\þžÿÿ¬R ÿaÿ^ÿÝoãÝ ÿÿQsÂÿýÿAÿ“;l8ÿõˆðZÿÄÿ‡ÿ‰³0ÿpÿ-ÿЂŸÿQÿ{*ÿØÿ­ÿç[ÿgÿ­gº§tAÿ³ÿ¯[ºÿôþÞÿ3’ÿÃÿMº ÿÅÿë?l:ÿÌÿ‘ÿÿ:•?ÿ 4ÄÿFÿ3U¶ÿ‡ÿ§ÿÊÿíÿÞ8gÿ±ÿzµýÿ›þ¬ÿrQGÿQÿ¡ìëÿøq(ÿâÿñ™oÿ#þÆ,¸ÿ´ÿ/­ÿ‚ÿAdVÿlÿÿhÿÿ¨Y”ÿ&ÿ9’-WÿŒßnÿTÿXzªÿéhMÿþ3sÿ¡þgþÎO (ÿ1ÿ«^ÿŸÿÖ?U#ÿæÿ ÿ†ÿr ¤ ÿb.…¥zÿþÿÿìÿÓÿìJ-ÿ£ÿTÿ—'d¹­ÿÔÿ*ÿ|b®ÿ¡þ¤ÿWÞFØzÿÁÿ4ÿ!ÿÀW‚ÿ¬ÿÉiÿÅþýÿ«Ê'ÿQÿ’7PÿÙÿ£ÿ†ÿ}ÿ©{³ÿì \ÿêÿ™¿ÏÿÕþíÿ^$! P ÿþÿßsÿÒþÚÿ(/ ÿë ®—ÿÿ.Ö”.ÿïÿØÿŽÿ~6Áÿëÿ5¦ÿ‰ÿÿÚ'ÿ[ÿ>Äÿ|ÿ’ÿå?ˆé±ÿÖÿœÿÙÿËÿnÿ£zš „”ÿíÿ+ÿkÿÿ. HÿÃþòþÔÿËâ:ÿ0]ÿ²ÿ>ÿ¥akÿñ€_ÿˆÿdÿÕÃŒÿOþÍÿ{ÿòH~½~ÿóÿÎÿ÷ÿÂÿÃ;yÿËÿ«ÓÇÿÇÿ2 ±ÿ¯ÿÂÿüÿ|þùÿEÿø ÿé]Î1ÿ?ÿ%&›ÿ¨ÿ‡T»*ÿ¤%à™ÿÞ!”ÿæÿ•GoÿrþÁÿR¯ÿþÿ½7ÿHÿM`°ÿªÿ`ÿÖÿ¨EÈ,ÿtsÿÿY4ÿýÿoÿs<¢%ÿ¶ÿÞ?ÿÛÿí}ÿ¦ÿÿÝ© ÿ™*³|ÿØÿÃK:ÿ“ÿœÿçÿ´ÿ¡ŒAÿFÿCœM:ÿÿQÿåÿ·fÿøÿ“š˜?7Xÿòÿÿ`fˆÿ´ÿHÿp·¶FÿÓÿ4ÿQAtÿ¶ÿ L%ÿ¬çKjÿPÿÿ¡ƒªÿmÿGÿ¹Ž©]ÿäÿxÿªÿ÷ÿ¬ÿúI0ÿ|ÿÿšóDÿ©ÿqÿ·;{aÿÐÿOÿ]Wÿ¸ÿèo€ÿÔÿaÿܵ”ÿÔÿRÿHÿ áòÿúÿ&ÿòá¼ÿ¯ÿ6jÿžþ÷ÿÌ©@ÿ³ÿÌÿÿÿãÿÿ€šÿ4þuÿa’”ÿ©ÿµ¬åÿåÿ¹ugÿ³ÿ¿S7ÿFÿe¬Ìÿxÿ>ÓNHÿOÿˆÿþýÿ»µnÿ•ÿÍgDÿoÿÏßeÿ0ÿRz‡ÿ¥þîÿƼxµÿœÿÿ°^ÿƒÿÛç’ÿCÿ.¼ÿÑÿs/´ÿÿÊÿÿ~ZÁÿþÿž.Éÿáþèÿe”Í$ÿžÿÁÿÝÿ‹ÿ°j³5A‹ÿýÿÿ ÿñ ÿ£ÿ<ÿÞ¡ÃCÿ»ÿ‹ÿ·vVÿ½ÿ„ÿÑÿþÿÅÿƒÿâëwÿùÿÆÿÎ ÿðÿƒÿoÿäV¡tÿÚÿôÿíÿé=ÿÿ3ÿ4ÿÕ¨¶A ÿüÿ¥ÿ–ÿÉÿËÿÐK`ÿëÿ¸ÿÄdíWÿ_ÿ)ÿ½#H`3ÿÑ t@ÿ’ÿvÿ½ÿˆoîÿñþæÿdi¼-ÿúÿ¤ÿÿ¨“Aÿÿ¨…ÿÐÿƨÿÏþäÿš˜tÿÊÿ·ÿãÿ°ÿ’f?ÿvÿ©aÿÿ@‹©ÿhÿÿՙЎÿÓÿbÿ’Ž ÿÏþòÿ¸†Pÿ¸#Ò’ÿYÿ ÿ´$)ÿÖÿµÿ˜ÿ}ÿ÷¼ãÿêÿfÿÿ­_ÿ¥ÿ»C ÿ–ÿÖ@`UlCÿ˜ÿÿ¢Ë¤ÿWþÍÿ¬dÿ‰ÿ¸`yEÿÝÿã1/ÿ£ÿ_x%«ÿ¼ÿXÿ¨\•ÿåÿsÿ{ÿÓÿÖÿ›ÿÆÿãBV ÿð*a-ÿ¢ÿ'ÿ¹ÒÊÿæÿ{|ÿñ,ÿüÿóÿ ÿ\ÿ¥ÿÎÿ\ÿìÍãÿ½ÿ.ÿ©1ÿßÿõ+F1[~ÿæÿVÿ¶mAÿ‡ÿSÿÑkt3RÿÛÿÿÊÿëÿ®ÿìl~ÿÇÿ%ÿ¿º× ÿ£ @ÿÚÿŠÿÉÿäÿ¥ÿÐ8=ÿï¬ÿ|þãÿ½µ•ÿËÿ|ÿ¼(7&\(ÿàH~ÿýÿHÿok‰ÿ”ÿíØ ÿ„ÿ­ÿ½ÿÒÿúÿ³ÿ³ ÿòÿÃÿß¿áÿÀÿ*ÿôŠÿÿ#ÿ™Kw„Bÿùÿñ$ÿïÿ£ÿ×€Aÿ]ÿ1ÿÝvEÿ·ÿƒ bB/ÿÅÿlÿpÿõyƒ#ÿñlkÿÃÿ†Škÿ­ÿDÿˆ.ÿúÿáÿ¹ÿÓ*ÖŒÿÿMÿÍÿÛÿÄ ’Gÿ†ÿG³u>ÿðÿ‡ÿ–"¬'ÿ>ÿ'ÉNÿÄÿúnÿòÿ*ÿSK<ÿðÿ‹ÿ’Q¯ÿ„ÿq:“ ÿsÿB ÿxÿ㇂-ÿ›ÿ ÿdhßÿúÿ ÿL*rÿÀNÎJÿÁÿß;9ÿÅÿÍÿÞ»òÿþÿ ÿ{Iuÿùÿ‹ÿÈÿëÿ”ÿaÿ–ÿê4[N ÿ£ÿ¯5gÿ™ÿ@ÿó²êQÿÙÿõ@CvAÿéÿêÿûÿÈÿuÿNÿ«ZdÿâÿÄG)ÿ·ÿ^ÿ™ ^9ÿÞÿÇYdÿÝaÿYÿÿ¹ƒHÿ³ÿ»)fÿ˜ÿuÿì;%ÿêÿÆÿôQvÿ‡ÿ²©(ÿ’ÿÿ÷ÿ®ÿ‡ÿß.ÿçÿÏÿ´ÿ¯ÿòS;ÿ”ÿpF¸ÿðÿ@ÿ½m¥F~‘ÿªÿÇÿ»ÿ  ¹4ÿÿMÉ ÿ_ÿËLÿŠÿŽÿÿÿÇÿšŒ@‹ÎÿÿL éÿ÷ÿjÿà"ÿóÿì^€ÿáÿ« ÿ€ÿKÿÙfÿÖÿ%ÿ³Óí ÿ}ÿ˜#MQMÿöÿ\ÿ¼’[ÿ›ÿ®°ÿäÿ@ÿ»yUÿÿNÿ®/ax9ÿ–ÿUÅiÿ—ÿ‘JkÿÀÿPÿïŽpÿôÿÏÿß2ŽHÿ°ÿ/ÿc‹ÿ~ÿ‘ 3ÿêÿ÷Oj*ÿÀÿ|ÿ¦tsÿÓÿvÿòÆä?ÿÿcÿÚ5#ÿßÿ½ÿÐ ÿ·ÿ¾LŸCÿ¡ÿcÿžÿûÿàÿ£ÿ÷„0ÿÅÿâ['ÿ¦ÿ°&2 ÿßÿÂÿë1‡|ÿÚÿ+ÿšjgÿ°ÿHÿÅZ?ÿÀÿåO;ÿøÿêÿñÿñÿä-WÿÑÿ[ÿñ¼Œÿ”ÿ7/ÙFÿ¨ÿÃÿèÿÌ*ÿøÿÆ2sÿçÿjÿö¢ ÿTÿ|Taÿ­ÿ„ÿð*9xVÿÍÿÌA%ÿjÿ\%ªÿyÿ½kiÿËÿ½ÿïÿþÿúÿœÿqÿðhÿÍÿö¯ÿîÿ[ÿ¸#ÿþÿËFÿ×,ÿÏÿ’‰ ÿMÿhÿù'ÿñÿÜODJZÿ§ÿ«"ÿ¸ÿ¼rÊ$ÿGÿ_(‹QÿàÿÊÿÅÿ³ÿÏÿæÿ¶ÿÐ5Y!ÿë deÿÂÿPÿ¢_Å’ÿçÿvÿ†_\ ÿòÿõÿÖÿ¸ÿžÿ¹ÿù ÿÖÿ¾0°nÿœÿWÿÜ|ÿûÿÇÿü ÿÕÿãClpÿÿ‡ÿÜQÿ„ÿlÿähWÿëÿÑÿöÿÿ;VÿÏÿéÿêÿÅ+«]ÿ£ÿ‹e4ÿ¤ÿ„ÿžÿÍ#pÿ~ÿ›GŠ ÿ²QÿñÿnÿºWÿï&8`aÿãÿgÿ¥EYÿÊÿoÿîDÿ¸ÿô[:ÿðÿÂÿµÿ‹ÿ¼[ÿæÿvÿÞ”•ÿÓÿ•+o ÿ±ÿÍ) ÿØÿå ÿõ9™MÿÿMÿ¼CBÿ¿ÿœPÿìÿü-6ÿýÿÚÿç*ÿýÿŸÿƒ °}ÿÓÿ£ÿò$ ÿßÿÉÿßÿÿ ÿôÿµÿ×AU ÿàKÿµÿˆÿÔBp2ÿÝÿÜD9ÿÑÿ™ÿÄIÿ¼ÿÄ+ÿúTDÿôÿÀÿÐÿÜÿ÷ÿõÿËÿöUxÿ™ÿ´$Eÿîÿ§ÿá%ÿ®ÿ¿)8CÿäÿÜ-ÿïÿ¨ÿÝ_rÿãÿöÿßÿþ%ÿòÿÔÿÎÿÔÿê4_ÿ£ÿóeCÿËÿ–ÿÊÿþÿëÿú%2ÿÞÿà2$(*ÿÐÿÿÙE5ÿÐÿ½ÿþE5'ÿõÿÎÿåÿîÿù@1ÿÂÿ©hRÿóÿµÿÆÿûÿýÿýÿ÷ÿÍÿÔF6ÿåÿžÿ± C.ÿÇÿ˜ÿáD[) ÿðÿô +ÿ¿ÿ©ÿå -I(ÿ»ÿ¡ÿýG@ÿÃÿ¨ÿá;`!ÿÅÿÌ$Qÿ¾ÿØÿ´ÿ¶+OÿÝÿ¹ÿë ÿ»ÿ˜ÿè8'ÿÙÿÍ5ÿýÿõ'@ÿÅÿÊÿèÿóO0ÿÍÿ¿/p=ÿÇÿÊ00ÿ×ÿ·ÿù&ÿÞÿì4ÿ ÿÿî8ÿÔÿÞ"+ ÿáÿæÿúÿ»ÿÓ*ÿÓÿûanÿÇÿæ,ÿðÿùÿõÿä'ÿóÿá =ÿÚÿçÿøÿ«ÿ¥P"ÿ×ÿßÿþ  ÿÛÿÚ + ÿäÿö-4ÿ÷+/ÿóÿÚÿÛÿÎÿÑ4ÿÐÿÔ2 ÿæÿðÿýÿÑÿßÿÿÿæCT)ÿîÿÆÿÕ ÿùÿÔÿ× 4ÿÕÿÊ0$ÿòÿíÿûÿàÿÏÿê"3I;ÿËÿì%ÿÁÿ¢ÿó?0ÿïÿóÿüÿóÿø8ÿòÿàÿÔÿ»ÿµ}OÿíÿÕ(ÿí ÿØÿç1ÿþÿÉÿáÿêÿî7Zÿöÿ›ÿžÿõ, ÿÖB,ÿàÿâ#%ÿÛÿÖ(Cÿäÿ¬ÿöGDÿËÿ©ÿî7ÿ¾ÿÚ"ÿËÿóD1ÿßÿÔ,ÿæÿàÿàÿÙÿýRg ÿ¼ÿê0ÿÙÿêÿþÿÖÿÞ+ ÿü ÿñ,ÿ«ÿ™ÿüR@ ÿäÿùÿßÿêÿþÿÞÿÌÿÿ# ÿìÿò9ÿìÿÐÿÏÿë.#ÿúÿç12ÿúÿÛÿÝÿóÿûÿóÿçÿñ.ÿìÿÕÿÝÿóÿýÿù ÿêÿñ B,ÿóÿØÿðÿÈÿæ ÿîÿþÿ÷ÿÜÿÛÿþÿÞÿëÿù'ÿÿÿéÿÐÿé$+ÿî)ÿßÿîÿóÿÐÿñ ÿëÿ÷ ÿþÿ÷<ÿÑÿËÿýÿíÿå&ÿù%2ÿÔÿîÿòÿÝÿïÿÍÿù&ÿñÿÿÿÖÿèÿîÿä+ ÿû*.ÿíÿÁÿñ,ÿàÿÑÿöÿúÿø ÿôÿãÿý ÿïÿâÿþÿÐÿÛ)P+ÿóÿïÿçÿÛÿø ÿãÿä ÿöÿò ÿõÿÐÿËÿîÿèÿï(ÿíÿðÿóÿú # ÿÞÿËÿßÿúÿêÿé ÿõÿîÿõÿöÿù&"ÿñÿÌÿÞ ÿùÿáÿìÿú ÿøÿø ÿøÿáÿè6*ÿêÿúÿ÷ÿýÿñÿÝÿñÿùÿñÿå$ ÿØÿÓ  ÿõ ÿùÿÓÿ×ÿôÿúÿðÿñÿþÿòÿõÿü ÿôÿù$6ÿêÿéÿ÷ÿ÷ÿøÿø ÿòÿßÿðÿêÿàÿøÿúÿø ÿúÿðÿîÿô'#ÿüÿáÿõ ÿýÿõÿñÿîÿòÿøÿøÿñÿøÿúÿçÿÝÿþÿûÿüÿúÿéÿäÿó ÿøÿòÿýÿêÿîÿü ÿý ÿõÿïÿþÿñÿãÿé ÿñÿèÿø ÿÿÿúÿÿÿø ÿôÿäÿèÿûÿñÿûÿøÿúÿûÿïÿóÿþ ÿùÿþÿëÿëÿýÿý ÿÿÿðÿòÿûÿðÿêÿñÿòÿû  ÿõÿûÿóÿîÿýÿùÿäÿóÿùÿòÿø ÿúÿùÿþÿöÿü ÿùÿûÿøÿóÿ÷ÿùÿûÿÿ ÿùÿý ÿöÿúÿÿÿøÿöÿþÿùÿðÿù ÿóÿøÿÿÿûÿùÿýÿþÿøÿüÿúÿòÿúÿýÿûÿ÷ÿû ÿúÿïÿû ÿþÿúÿÿÿýÿÿÿûÿýÿýÿøÿÿÿüÿúÿýÿüÿüÿýÿýÿùÿüÿÿÿÿÿüÿýÿÿÿþÿüÿÿÿþÿþÿýÿþÿÿÿÿÿþÿüÿýÿÿÿýÿýÿþÿÿÿþÿþÿÿÿÿÿÿstk-4.5.0/rawwaves/silence.raw0000644000076600007660000000070012327014024014124 0ustar garystk-4.5.0/rawwaves/sine.c0000644000076600007660000000065612327014024013103 0ustar gary// Utility to make a rawwave sine table (assumes big-endian machine). #include #include #include #define LENGTH 1024 #define PI 3.14159265358979323846 void main() { int i,j; double temp; short data[LENGTH + 2]; FILE *fd; fd = fopen("sinewave.raw","wb"); for (i=0; ig??Å@sA AÍByC%CÐDzE#EÌFtGGÃHiII³JWJúKL?LàM€N N¿O]OúP—Q3QÎRhSSšT2TÉU_UôV‰WW°XBXÓYcYóZ[[œ\(\³]=]Æ^O^Ö_]_â`g`ëanaðbqbñcpcîdkdçebeÝfVfÎgEg¼h1h¥ii‹iüjljÛkJk·l#lŽlømamÉn0n•núo^oÀp"p‚páq@qqùrTr®ss^sµt t^t±uuTu¤uóv@vvØw"wkw³wùx?xƒxÆyyIy‰yÇzzAz|zµzî{%{\{‘{Ä{÷|)|Y|ˆ|¶|â}}8}a}‰}°}Õ}ù~~>~^~~~œ~¹~Ô~ï 7Lat†–¦´ÁÍ×àèïõùüþÿþüùõïèà×ÍÁ´¦–†taL7 ~ï~Ô~¹~œ~~~^~>~}ù}Õ}°}‰}a}8}|â|¶|ˆ|Y|){÷{Ä{‘{\{%zîzµz|zAzyÇy‰yIyxÆxƒx?wùw³wkw"vØvv@uóu¤uTut±t^t sµs^sr®rTqùqq@páp‚p"oÀo^nún•n0mÉmalølŽl#k·kJjÛjliüi‹ih¥h1g¼gEfÎfVeÝebdçdkcîcpbñbqaðan`ë`g_â_]^Ö^O]Æ]=\³\([œ[ZYóYcXÓXBW°WV‰UôU_TÉT2SšSRhQÎQ3P—OúO]N¿N M€LàL?KJúJWI³IHiGÃGFtEÌE#DzCÐC%ByAÍA @s?Å?>g=·=PJ“P§O÷\=häp›s{uÎ{K}…tõc³O?…43*¢&%ˆã ´üÐò¡ç@ØwÊÄÂn¿_½m½»½ÃUÌìÛHäûñ<°’Û¹ Ò-Ú6J9¨8w4`.¬-Â&¸Êoö?òŸò§îÆç¼Ý»Û©Þ ã è0æ‰Þ©ÙãÔ…Ï9ÈÚÈÁ½¼ß¶Û²J¨]¤V¡~›‰“d݈ZƒVH‹å¤9­Ì¬,¼½\ÀrÍOÏsî!ÖaõiàÉLñõQòçÜ‚æˆýÛî‹àòڲܴèëÃó¨ê€$œ,…-M;k:£I 0 +J€_fV&PžO¥b¸u®mBg_J¹%ß%ÿ!w,UXù?òOúŠÑ—½déwN <×4%U€y†~µq±>]#L5º.©0ñO S©[ fÜ`¬>¼DûT}ED=¢( ++@Ð*HR6&£„Ú;ý¶õ>RmϬù-i ³ñþ€‰æ­hÌÐÓÃÏyôûW»€Mâ躤„¶Æ¹šÔ·¸Tã?´ŠÔèßÅ–¬M ¼Ä| %^pÙ8c¯½ùiø¨Àÿ–•A’Ê’y˧û’Í/¨Ѭ©¢Ì„Êp?fO4Å%t@ 9ÐG®M¨¢‡í‹%¶¸ÛÎÙ»ÏÛ‘ÿ†!H‡ “á–Xé6q®ÕÒ€(Uü|ñÕ*µ&B N P n›iJEË8K2w±~fU)iÎ~µu=;‰<¶OžU” 'jôDÁ £¢¼¶ÃÜ=ÏݰÁ¦Ïºñ»JЉú+ sûýÜâê’æÏvçûôZhVøwí6ª4Š/AK~l^mrO!‹À I+‡%(Ž7SD”A¢RÌ:##hýåüöiâŽÕÍÛ¨0º»è2ΦeµÁ«p ¾ºøÖâΞBÝÌ uÃí‹ÿFùú¶ €é/þôB·¾¶«¸¦HÐRôÔçUÃ…¼|±¸ËÑÔ1áϨ^åYíÓÚ‰ï*ëÔÖÏæ"î¹ tàÞ¨ÑÆÌ.ц´—á¥Ò¶]üQIõw2Û%ϯ+ÒúzÑ3ð5$.:QPJÃQõeve“~µ~µ|Ô]9u@~µxÜPXoKå6à:™$&5åÇðH®}ããjþí[–”è—F¢‹ÆŸœ"üüÚ&,4“&p=zä^dM•l‘~µ|V9¬KpJ| o»ŠU'èÄÄRèøt.îáöÊŸðÃ#¨ ®S¼Üߘ'1[b½eØ•ÖD­(²öòìÈ!¬ÜöÚ»–ºfÀ†ç ó=ÑJÅ1­Ñ«g¾LøÏïºðöÁèºÿ.7Ýÿ~±ÇîØøÌϬqÇ¢ÖœÍMÅ×¼)m3)"ßÞTŒ€º®ÅOÄÞ¤ ˜öCäéè-å,îÉ¥Í9Gî#RÎ!ã=>—Hø )#— $ÿFûÞ2hHÐ3êPe,A¸82;ôMI9Ü,X"/ÈP×yå1ãÑQû í÷Þ[Ì#쥆øÎâÏ Q 0î>gìy /§%ìÈ­fö XL[³$Ö0¥/>4v/É77>½'óûž&æ8¯`/Gæ‘ú[ñÂÑéèÝÄÇèT1&ô!§Ê$½ŽäUÙ'í&øõÛŸÄr««µg‰“¨žÎõÛqæá¶éÎݲËà4 Ð)t tñ= àäìð ™&+!¥ ȹêÙÓ葺ÿ³=”|¤D…£EœÓ³¤ÑëçÔÞòÁ/¶ÈÌ ë,ßöÙÐû)!¾ âH “q:G(%&AÞFx¹rñ~ªg¢EW0]Y˜F6!?ÖT´#î%6E½4Bׯá‚ðIîùçâÍ8Â,·Ô´#_öÜAʹɵ铺J´' Š „øó0 !+ 9ÎA˜Gâ2"ïRw^·Zjg HfWHxQ~µ[°6Ç%CÃ@å¥âïû ȲÒÒ£‘¤m„K±¹Õ Í…ßÓʞɌèåÉ=ðGÔr·æ×éåpëÅé¢å¸ÛLýƹ ’ÉêÂÁ­µÙ»3ËÆ×Ø $ÎêG)¶ yýÙÝ8ú ‚äóO8Õ%¹â ÎÖ‚áþ½…ÈÚàµÎ§ï~æ ®³ç²m×Çýé§ .ê[MéüK+é-;5P7ˆ8nO-IÁöª ;%ï8Z#c:äA ê4B²&ü>žB$¾ëåúÃMöåãà8Ü) ÔÔýæÄÙ27é™ É/]÷0 g"¶í™ —ù>ö™í‰ËÓãìÿÍãç{C |$š d R,§L >])Pß!_©%$ü¼)›ôøDåƒ(z×Ôé¬è¥À•âJìåî(â…»¤ÁDÎzÇÈêžùn8ôÇÿ±öïï9ÞUÙ£Ì-ÕâRÙ醨µÆ…Ú­¸©oÚ`ÌåJðÀä—Õ.÷ïérÎT$/:òÖÉãk+B ;§;<,oULcN?Õ7E.¡6”ý þ»#õãÅÝãê™äÓÁc Œ’ü­æÚ$f4+÷ ‘ M/³0h9Ð!v$òIh7HBü2#qLf+«èþÿ‰úü©ë–" ?3 ª&ˆ2F9¢’5.Ayÿ íªð¼í­ÔˆâOÊ÷ÊÚß ÄÇÒ+áóèoØŽ¬¤¥p»ðÍ7ܾ>ƒ2_.£%Ïê Š*c)ë×Ý×A \ãÈÞèêÏ︾×+ÏaäîÙ|à4êêê°û‡ö‹Ý‡ÈÄïß÷áêÔ½ãì}ÊÍÍ“ÌØ“ î|׾Πö±Ñ ä÷èÃoêN=$iïÕ¼ Ü-Bõ<˜n82QØ;\<ÏE/ Š&' ] Má5ô)#^#Š SþvüXÿ 73úð÷clô~é·öKû®ôé#A. û c÷éþ¶ÚÓÊŒÝ$ú<ÿÍ Fà NTìàùñbþD#…õêë±@æ/!»ü\°ô,íáô×ýšà[ÙvØØäß1?yäÐoý²Àúß´2H”÷·™AâYùíùÆä†ØÞáÄÝ"Í›à[×ÜÙSâYÜ4È7»Ó ã3ã ½ Âgç×çàáEïõøAõ *²þà Ô]Ë[ÿ¦åÃþ ãwýÆù!áH/-3–󨙰q@ bð¬Ü[ì[AnhSeƒ<æýe%K±Š#“3fE÷+»7þ»ûÒ fÉ%ní{-/Á%ôÕb™WéX¾$S#OÁþÐÖ²À¶-â½÷ÄóÒôü ùTÿ ™MÈ(hWî_ñ„û§îyÛÉã[!þÔÄáhÞûë¯ø6 †¯ÓTÚëþ')—"† ênó ûæ×Ò—à’äZÙnµ™ÿsÙÆª˜ÜªîÖO̹öáÅÜŸêªï†ówø=çðôÕ-Kj@oƒ  !ü]Äôâõ î‘â×EñbøèSÙÍÀ2¶%Îøçk°û èŠõwüÆþ×:==0Û?8Ò÷Žþ¤-ß,R @ð€¦â1¯G»@YGX¿ øÔ a)|2x-t'¬$C,M° ]#H %1’+#ÂÍ& ¡óìêð àð÷.ê¿ü¸~ü–tòÐáWälçÅÒ¡ætð~ã' \ 'òPëš?ýô æ@äÖô:ùÚþ‚oý õáÝ8ã—äìNñÃjK;ðÆã—áRõòƒú0óÍùŽóxñéWÐEð¶÷lÐ û*Ÿ=· $Ì{ ðò2ð®îa¢ðcÉ8 ´#çË“ÈUÞׄ*–óû¸ý.ë |åÏ߈ý\Úç2æùþn >ý”Óîú)ÒëÒõ7øV Uì‰/²Ïþ¡¹9÷9úC'5)˜E)·9Þ \/ô'UÚ à v)àÿø2ùBt<¨-+¨#„>@7$À:á@Øù´ç*ý¬úËöJôÈâ€ï4í¢ðJÕõß¿.ãOKû¥üc÷ëØÚÂXÎ å­í‘ç‘ËÉØ~ìoò‹×…×þñ—ñRçpô5ëdñ(èØãâhãÍú= A )üÊÙêûq¸Ç J{Š&Û 2G SéæöD „ûCú,Ž ç%â_æMôÀ hlñ‹Ù]çVüjã®ÔOä’þNð[æÃý]1îFè‹èÙïFúøð(ò› k÷kìŸý| ôõ 8ûâðà$2L>+Ò(Ò+z;„&åÊ!ñ(Ýç£ýüù ‘øÓ e •ã¾°:Ì ß>$ƒ.³ÌêMaÿQú ùË’ÀÆÌÙûá§ïŠöiùFèBíê×ëàä–ò„* èFÙ{Þlõïçö] AüÍèzüªóLõpûÚé)ù$õVìÏýó«*ñÜ–ØðYÕtïÎôdÛ²ÙýŸyøõÀÿô â5nˬ/ç ªüŽôhe!˜]ŒTýrh.¢#þ´ý>øÙÑfêî*ßyâwò‘ò»í(ØÛæüïÔÞ–ÝëðñòÿÚm Žö²Þæœì³ïwí)ï|¢šõˆÏ> R*‹*(  ákÕ% wà@ 2P0ûŸ 4…-,Býœ%‡.‘"ƒýÉ ŠfrÇ2ø„ïùÉ÷¯óå§ð¥ãûó¯>ç÷çºúÊïÀü4ÿ¿ \õ#æågÊj̟ˤÇ˳ÜÞÍ$Üš ýŠòpóŸþ_øºïöîuóåÞðÕ€ ç ÿtõvY+áôEò¾¯l–ë9- ú8 ¹ëÎ( ö GFýöÞpaüHõñ£öòñÒáÞ|ø{ôöw t Èê†é$ö# SÒûSêïÎðêìÚàxÜñ>÷B b ¤±£ &F&1– [¼ f5¿/Æ#?h;pO!‘îA» ? K ¤ ÈZ }ò3! –ü¹Æü”å¿íUëóäÐ÷ŠùÆöÁõ¶ö{îïòµø„òÖîõù)Åüþ ÄÿËê·ä…ÝÂÑŸÖà®äùæ§ß–ÍIÒ†ázöˆø÷!ôuåLëkø<ú3õÚ9$ÜqýyöX TA Npô ï)×Þ5 :$Gr³ƒôüë,»[… ø ‘ñAõ{sÝûC € É ?ùêöpêH飸ðµåkì¼çääèßö³æyòµþL¸¤ýâÿÉáûGž* f`¢yÚþ?V à w o™ ƒ¥üøœô¸ûÓû†;2([ Ø p n }éý×ÿB= >ÃŽ¨¹S Là#þºùôû`çäô÷Mõéúß§ã,õ÷ógëäûýñZë+ìoðnç›ãDâ–ߘäñøcñrÖªðB1àûì´î«øÚüÇðç÷hþŸµü¸•jô2H‘ `åÿÔí-Ïí-7À÷`QðÛ)âä{àê×ê&õ* <mïŠùÝ ¨`> uý©ò4ñÿ,úíì-îúð•¸Üj¨üáñúþÜøÊ6 ,. íäÙ¥¥¤ , ä Ë rÕ d {býnSøæ£TkEõYôƒè“ðšÖ:ôùþÿŠõýê×öç÷¯éaìÌîÏôyó“â„߬å#ÙèáNîíOòÙöÔû¢÷ èžò¶úW÷úœô ø!÷O÷L"¿û>Ø·ÿ9ø™I4ÆqcKP# N W 6m êÏë{÷Úöª¬ùöÑ÷ö•ôFøô‹û«« 5üÇ f4û)²ú/ûµûWø‘óîuøv÷æóˆûIïÉïj= ?³ý µËRP@Óÿ­–QýUá\-ôÛ ­Jüõõùv÷iýhýóøöäþsýoE¥Åͧ: àBÿØú…ô“ôÆõ¬„IüŒø[÷Èû—ösö¾òü¬÷D÷Bö¬û÷ŽíªæKêùöEùd­zõÀî0õæûg^“ieý¤íc÷[*’žR ­¡ÿŒŒÓù è—²ø÷µöUï*óýýþíøc÷™ø±øôý0cóíýÿùBëþõÛ D¦ ‚C ‘E âÌ'cjú,öLÿÃNÿ=üÆJ 0  d ä w(ÿ"ýÝÓµóÌõËö;ïÈíjóZþË©¿ >÷JüŒÃV T ÞaOpuÿÿÞçÃhþûèõøõêöðÜïåUæÚïVìDñrîríïúážùJ÷Uþ2ÿ¹÷ýÿcþÛöò©òFò:ú©Q¼ñ'ãé£ìÄðÛõ×Ñý‰û›úÉ ð{°*Ê|!\ÐÖV Í Ã ¸®ûìùm9üçôÝ ‰·H Ëÿ—èÿ&rÈdÑBþ\ýsÿîýú®½ºa ¯  £ûWô¾øçJ ÃÇÿøÒõÏo •]÷Œdü)øÔñÑøÏùøðüfö|õ>ò‚ð¯ÿ^¯šƒøÎúÿq¯‹ €zô’ù—þÜêþÂÁ Î-‘ê b°ª Ãè +ÿ\Ŧ6©üºývý¢û‰øùYûô<òôÏù*4 é÷Öñnï|ñ6÷Õð¯ì1íMóIó„öDüoÝ÷ÝùD± n»ðþÀúûùhþ`;ktÍ Y ïû½ûÒÿÇ÷°üйýÔöòîóÏ÷%üÊ@ÿÃ> cUÎX @­x@‡ ˜ñö0þ³‡þ´Q¿þ]ü³ü þ$ûýÿ5ÿçõÍìVï°ú‘çlþ]x÷¨õXþ¹LpÿŠfø%ö(üb;‚ü]ýØýVAü2ø=û\¾ðf oüa’ ý ß ® ©e3øcõn+úXëñ­û+ñüöîüÄù÷Åû›ÿ)öªõÝýDü¶þ5ýºÿõ’õœõÀöXù8ú4¬Zú_¥5ñþ q þòû˜ÿÕŠ £ d9@)7ÿwýÆú½‰Wû„ü) ¹ mýöûu BÃC &9ÿD¼ž©} ÿþ…÷5; ÐIøjý)sý¡ˆ8¨ü/ûø›ýØNþnû)õ¯÷¹øp÷›÷ öËôÀîãò²ôºù¦ÿ‘h‚>ý„ô]òïù«¼þÛþ<N·fÄ E ö ;)Ò2µ%Á ` h< 1 S ½ºÿûlÿéþ»þ4ÿÅøŽúöýsö:÷ÿ³ û1õ÷ƒø÷ô/ìÐðwï¯ô›üKý5þ¾úÂøFö[÷ÚùÎø±þšý¼ýû˜û)è`ýæeâŨà C™2þ»þô‹ª Yÿq5Än.ÓÇ1§Íœ†UnšQ‘üY ˜$ãŠÿÿüFö ýe@õìó3ø õ9öSûÿ6»ü´ûný>ùËø¹ò¼îìù¼ÿ¤ÿuþðù|õ›ôwóoøUþ°ýcs™iý™Áß 2 - ¶n !ÝýEýEý_4hþðùÓµ U££þ‚\ú”úÿŸ÷Ë÷òTò/ôú8ÿÙýûû"÷óiôeô|õêûx>*þªý•ü¶ý/þÑ c õ ¶ ãU¨é `?ÈøRÝþ¦üžýîãŠý­¸þ¬ÿâúúù¿Ahß®¨è U/ÿ=ú­ûŸHì9ûŒü=¼4ÿb»1ÿ}ýÖÿ±mù²óñ€ñ>öëû`ûBø#øjøÿøYøîùÇôÈövûüûþþÁý§úùôúòÿQþ·ù‹úçü kÊËŽâ BïýËü¹ÿC5i º3 ÿ5 ¾ö½¡*T h cÖ @ žïÕÜaþçþžýù3úØýøvôlñ…öœùØù^øôW÷6øKú™üóù ùý§ÿáÿð©üm÷ÛóÁúÒ? ÿf‘úýº1š¶ÛÒ0 ÉbU÷r°3ýiþóÿ¡ù“ôºõþ)Š1ý‚üäѦR°X 9 Ö¸ ªèËFÿ¸o ?\¥Vþ¸üZ÷÷öŒöCøù·öšõøœøù1ö;ö÷ö<øzþ'ÿý˜übýú+ùg´+þÉýÎþ‘ý×ú‹û>ÿË>^þBþè´N+ÿØÿ#ŠþÛªåiUÃõ%ýþþ!þ¬úüþ£þGýìúÒûÉþÿÿ\þ˜ûÀû­ýˆý”ýSýYþZG“7sšžD…€13ˆ±ö¦þûüDüþþþÌQ4í½®ûà?çVþZü·ï¿Xñ$žýeþ˜Þçù¾¤ýøþúþ(þ•ÿ´ü[ùËûo]ÿkúþ„ýRù¾÷Rúœù…÷›ö+øÁü$ülý¶üøèöÎúGúøæûú=úWüÊýLý‘þ ÿæý×apüýßOþDûÓþÔæ&ÿ¼µÐ6Zi¤ >ïÄ´_û X|ŒxQÈ­O96ÿ†ÿÊüdüúÏühþ›þáþ„ÿNryŒ½¼ýˆûünû’üžú·ü°ÿXû÷ŸôÞôôû úÊù1ø®ù¯ûmý"úKþу)¬Ö EÿN§{ÇŠœu÷–ûÕê%ŒÿÖ¡ü•÷¿øüÿÚ¸ëv8àÏ  þD´¿ØÑÿÑütû¡û®þ”þ2ýOý«ü˜üú"ûÔüòû(üÀü‹ü)üýnþôÿdùâøïû=úüùýùâû(ýS*þÁM?¸ ÿI[þÉÿväˆçÿ6xìmL£Q»ùÙùÿývÿ›üÊúbûŠÿ(þýXÿ}ÿÎQ¨¡Ñï°<þ‚ÿ•YÍÆ?/ÿÖ+†ŸûÚŠNe’ ñOó½Ï.c–J‘O%ŽÿŸ/€ÏþjñÿÒüýÜÿñJ÷ªœÿ¥ý«íÙÌšïÔ8;ãH þÂÔüÁûþÝýiüûhû©û×ùlú£ûXù\ùÁú9ùJúTüþ1ÿ„üíýùÿ‰ÿÛý‹üúûÑú@ûIüåýYýðýYþâÿW…ÿÑÿâÿLq@ §}t¢1ÍLà EWø>‹:²Rô‹ïÿ=þAÿ+Fþ×þÑ5ÿªþ¸Êÿ|ýwû¢üücû[û€ú6ø½úCüÂÿlþÖûíû]ûÁýgüÙü†ýÐÿmý1ý“ÿÜ›Gï;øÿWÿä” ­v÷1k§hÿ±þÑý2ÿFÿâÀrþ˜ýOýãÿ2þÐÿº{ûÑTýÒÿÏXT®Ü~ñÿgõ˜-Wÿ-ÿÂþfýµÿ¾­þîþFtýqüÍþ<þêý«þqüLûlü>ýMý„ý=üÛÿIÛXþMþµþåþ!ý¡"ˆ+¡qÖƒ}ˆïcœÿ™gÿÑþKþÿþ ýwü³ýgÿðƒÿýâþSþYþù&ì~—¢ZÿÉÿ»ÒeåŽôh1›mkÓìs6þÄ€ýÕþQ8ÿŽ6@zÈôâÿ™þVÿùþýü_þHÿÙÿüËý5þ%þ‚þþ>þ?þüŠþvþ@ÿð‰c›Î–¥&_FdâV²Œ]Bïnþbý{ý!üúùÞü¶ü«üYüÏýÿ¸þçþÿ)ýÕþ‡¾¯óZZ8(ý‰ÿ.[ƒXñÿ½~}T_òñÿèë‰6ÒšÆÆÿ[ü‡ý·ÿS9ÉÿÁBpbÿÇþóÿpa¦Pÿ9ü»ü¹ý|ûû¹þßÿ§þ]þÝþóþÓÿ2ÿé‘ÜÿüAüÕýßþÁÿ!ÿóý®ýbþÿy´š$SD—Äþ~ÿ$(cÿ§*øb[ÿ …Ótýƒÿ›ðÃkHÿgí†ÿ þéÿ¹=dÿþØþ½þ,þd]Q€’Ÿð ÿ€\¤ÿÅ*,8³ ‡°'ÿ’þÈþRý™ý¹ÿLþwûoûýzýüºþ=ÿeÿ4ýþ<ÿ$ÿÿÆšFë½´ŽÿñVf/ùñmÿˆÿÿÁ%<÷ZR‘;v›ÿÐþ¡ÿ;âÏízuƒ/{#zfsþÖÿÅ'„ÿDþÑÿ5ÿ\þ.þOþAýùü ü1þôÿýòýsýkþ~ÿ#ÿéÌ„)•z*,ÿYÿLþ’ý¯ÿ9ÿûÿìþËþýjþþüÉýÒÿí:£?sÿÈÿ>ÿ£§d„ÏÿQýýTýÀÿS/+<]ÿFvµgH"’[ÁX¹drÏ“ž¢÷þêþsþ2þ¿ÿÿÿDG¾ÿ±ÿ9ÿ²ÿ ÖÐÅÿ©üãüüþòÿé ½ÿÔÿ¹}g-V8ÿ¥8;ÿùþ¾þ«þkýgüŠýŽþ¦þEþý[þHÿ%ÿþgþµý¼û?û]üKþs{ ÿ,þmþòÿ•þòÿs.jª?­ú\ÿr¢’*&ËÔÆ„kªæãp/W©à'JÿBÿÀ5ÿ°þáþIþ#þôö¦‹ÿšý?ý?ý’þì)µ}òº›9/ú þ%ývþ˼yÜþ¤þgþ‹ý¨ý¯þ-þ ünúõüèþFýýý{ýüºþ]ÿøÉS¡·Àÿà{G`ZI66Õàˆ"ÓITÿoÿKþûÿiÿ£þÅý½þþWþÇÿ†°ÿúó†.Uÿ£w3z|•pR“k.»óú1@¦7ÁŸ bUÿÿ þ‘ýáýDýöý@ú–úÎüúüôü,ü¢ü”üfüvýÓþ½ýÂü>ûéýƒþ¨þ©ÿ":k툭yéœÍÑÀÇ×ÅÿÏÿKÿœ©ÐÈó±YÿÇÿ¦ÿÿÿmÿªZ¹‘QƒCâ’zöRîé ÞGÝÿìÿ{ÿ@ÿà”"ès³j kýÄÿ¿9°”ÿŸÿØG!xÿÐþýœü¡ü<ýaýÎþ•ÿ"ÿ¬þìþ6þý˜ýþ:ÿCÿ/ÿ¼ÿ¹;ÿþþ;þ{ý=ýëþ”ýïþ)ÿþ‹þFþùÿiÿí_ÿœÿÓÿYèg¬R8⛳qUþ‹üná+_ Kÿãÿùÿû$;”‡‘þØoPmþáþŒÿN*iÿþ%þ]þ þƒþÁþ¹þ‡ÿÿÏþfÿ' §9Û«ˆJdÿÿÿ¨þÔþ2ýÁýÚý†ý¥ýjþþÓÿÿþ[þÅFÿçSÿöÿìþÓWŽVÉÜþ¶Ü^ŽbHËEy~¯p" Ì<þGþÿ1΀¬ÿWýóÿÿ4ÿþÄþ.þœÿ°;¤Mv÷[…Zÿ¤Ü×”|$Ï™ŸIÿÄþíþÊþ,þÆÿó.ÿ?þdþjþžþ¤þaþñÿýèü³ýŒýïþLþý¸ý?üiüfü9ýHþŽÿ+ÿk ÿÔÈ®¿üä.† ®KÊDÿÏ#ÿËÿ4ÿÿ½ÿ®ÿŽÿÀ†z.Ì;mì¯B°yúK—BÙVD;þĦµÿëÿ„ÿÏ*Ú‹gœú@ÿOÿ=þˆþ¶ÿ þòþàþÉþcýùþ1þ°ÿPÿÿ0ÿ/þ7ý’ýÉþÝÿhÿÿÿ×ÿý¥þÿNÿËÔyÿaþmýÓýbýPüÿýýüþ0þiÿþ]þ¼þõÿÿΧÁ¡üriz‚%$4ã ¡¥uzeëŸ'xÿ›¦%}U7ÿÛÿÌ=ÿûÿUÿ(þœþ%ýöþÌÿÜÿ1ÿÿšÿÖÿjþ ýÐýñþ€ÿ|Lwô ¯z!Xq³6‘ÿÃÿ6ÿm œÿÅþXý“ýPý"ýÄþ$þpþ`þ¢ÿMÿ!þÎþÁþÁÿ]ÿå#ÿùÿ%ÿfvû§g*ZÒí+T7 K¾åÝ©[l‘©\ïyfÿ£ÿ`þ|þþFþIþ~þÉþÒÿ1ÿhÿÿÏÐÃZö?)®=-Àÿåÿiÿ;þ¤þ¾þÒþsþÐþaýÔýñýâýøþ%þpþáÿ ÿ•ÿWÿ#þÐýüþ{þWþ þ§þ­ÿHÿ.ÿAOÜQdx¨œÿ^ÿ8ÿeÿ/ÿ„Cb“KïÓ‡búrh'úüvÿìKDÿ¼ÿ¬ÿ‚ÿÊMÛ‰]vq=;ÎÛåüiùcÿ¤ÿ~ÿÿÿMÿ™ÿÁliÿ¨ÿ4þìþ\ÿÿ²ÿúÿ©ÿ3þñÿ'ÿÿ¿ÿ þÆþêþÆþ(ýöþBþ–þšþºþþ‹ÿjl.ÿËÿ}ÿ›þúÿNÿ«ÿ‡ÿ½ÿíÿÀÿÜó–z/ä ³¨:3ÿšê9.Ÿè?’\buùD †ëZé Ç?,ÿöwÿ&þÀþ¢þÎþÑþâÿ\ÿÿlÿ™ÿŸÿ;ÿŒÿð$-ÿ÷/ÿêÿ¢&eL¤ÅÿòÿUþ–þúÿ²ÿ9þëÿ)ÿÒLVÿûÿiþíþžþÈÿÿ6þÇÿ^ÿ¬ÿtÿyÿïÚ4ëΔÿ£þÖþÁÿ1ÿ™;šÐ4‚÷/Œ¥(ÏÖÕ·ÎÆÜÿ¯ÿÿÊÿ»ÿFþÿþ®þØþèþàÿÿþßþ¼þ«ÿŒIÿçÿ\ÿ.ÿUÿ¶d,´L@*ZQ*ê4ÙFÿÇÿtÿƒÿwþõþÊþÍþžþÂþ‡þPþiþÿÿ„5ÿîQ ÿ³ÿDÿ´B‡3ÿ¼ÿ–ÿ&þÂÿ^|¡‰ßjë'F‰ ¼WºŒ¶ÊoÀåÿùÿÁÿÐÿZÿlÿæ}„Hÿéÿeÿÿuÿpþùÿ7ÿàÿëÿÉ 0“h'¢ÿàêëàÿè¸Ú‘ÿÁÿNÿþ¸þÏÿ&ÿ#þÎþyþMþ/þ²ÿÿ ÿ)ÿmÿéÿ›ÿþ»ÿþðþûÿÛ2s¯Èëèjž²ÿµÿMÿ°Kþ>øŠ™Ø¶ZÿÞ4ÿhþØþîÿÿÿmÿÑþJ6à݇á9$#tJ†-*”õ…ÿ’ÿrÿyþþþsþÙÿ+ÿMKÐ^ÿìÿÅÿ{þúÿÿŠÿ²ÿ·ÿ£ÿrÿ–ÿ¤ÿ±ÿÜ/šmÿ¹ÿ”ÿ•ÿZÿuÿ¦ÿÿõÿˆÿÍÿíÿÅÿ`ÿ8ÿ—ÿ¿ÿëÿÙÿ–ÿév©ÃÐÝœÿÊÿ„ÿwÿçC !…ó.›gçõpÿÌÿ–ÿûÿÝÿ“ÿ§ PZŒfl“ÿÈbMOÿ–ÿ:ÿ)ÿÿNÿ“ÿgÿ þwþAþ¼ÿ$ÿ]ÿÈb³z‚•*ÿ{ÿ6ÿjÿ8ÿÿfÿë&„³Ž× îê…YBÿØÿ³ÿ›ÿzÿxÿ•ÿÿmÿUÿ”ÿÿoÿ™ÿˆÿ‡j´ÉºöQ¦…Fó›·‚ÿöu ÿý)R€kQ,ÿ³ÿ—ÿ©ÿûHŽœj‹KÿÍÿºÿžÿ‹ ÿâÿÿBÿJÿNÿ׬ÿqÿ#ÿ'ÿþëÿBÿkÿšÿuÿ³# dí­587ÿúÿŽÿ_ÿ/ÿ ÿIÿ¨ÿÿ4ÿ ÿ8ÿÿ!ÿŸÿí ÿóÿöÿÝAnNïXuE0¶ÿò7Iÿ§ÿ.ÿÿ*ÿ8þàÿÿÿÚ-gªæÏöÍz(9m\e‚¦µ§mfxngx3ÿÇÿÄm÷²Ï:ÿþºÿPÿ‹ÿ?ÿxÿŸÿ€ÿ6þéþöÿ@ÿ“ÿ|ÿ:þüÿ&ÿœ-ÿØÿÍÿÞÿ»ÿÿ}ÿÊÿùZ@ÿÇÿ¢ÿùÿßÿ¼ÿ ÿ¨ÿßÿúÿ™ÿã‚¶¿[ <p÷ÓÒóZo[gÆ®ýJ_:ÿäF ÿÁÿqÿŸÿàÿ²ÿÂÿ¯ÿÓÿóÿüG":(ÿtþâþÀþþTþ‡þþÿë'ÿë n0ÿËÿ—ÿjÿ~ „9ÿÌÿãÿ«ÿƒÿâÿàÿvÿ[ÿ«ÿîÿÙÿ`ÿŸÿ¢ÿ^ÿÿRÿÃÿ«ÿÅÿåÿÑH†…€°Ïbc^{ÏèøØ¯v«*mŽg|R‰¢€ÓËÿÿÿqÿÿ¬ÿwÿ_ÿPÿÿÿhÿÿ ÿ¬ÿgÿ³ÿÁÿ²ÿí%!C1ÿýÿÚcb‰Ç‡ÿòÿÚÿ®ÿþ¢þkþ¹ÿOÿfÿ þÅÿþûÿÿ"ÿ ÿÿÿÿÿ4ÿyÿã ~¡ŽD–˦™ËC >DÙÑù?©—*'>\H`ÿ¤ÿ§ÿÖÿîÿÕÿØÿûÿ¹ÿ[ÿkÿªÿ¾?YKsÿÈÿÇÿà"S”-ÿÿÿý9—£wIP#ÿþÿöÿÀÿ_ÿÁÿ~ÿÿ þùþªþoþ¼ÿsÿÒÿ×ÿò \{ÿüÿÛ7KÿíÿÇÿèÿü(ÿá ÿÛÿ¸ÿ™ÿÝÿú/ƒ{/ÿíÿÅÿÛÿûgà¿w`g€GBr´º­§rMbc¥â<ZùÞÓŽKÿÚÿgÿoÿ›ÿ½ÿ¼ÿ+þÆþ›ÿÿÿß ÿäÿšÿvÿÿ¯ÿ ÿlÿ‚ÿ`ÿ/ÿ8ÿpÿ×ÿø (!4Sh ÿéÿèÿãÿ‡ÿŸÿÔÿãÿßÿ¥ÿœÿö.ÿûÿµÿjÿÿ¼ÿºÿ¤ÿõ8Cÿ½ÿõ0KK\» ØÉ¸ÇƒfžËîï¶Ï¦–½±uQ%Wy>(/(ÿýÿ¾ÿÀÿ£ÿŠÿ§ÿ–ÿIÿmÿ{ÿ^ÿ—ÿ¾ÿÈÿ÷;? ÿûÿòÿûÿÎÿlÿÿkÿeÿ€ÿˆÿLÿJÿwÿÿrÿ~ÿ¤ÿrÿFÿÿ¸ÿåÿÌÿ—ÿÿ¸ÿ¢ÿÁÿÝÿù Q{pˆ¤±4Iu¡’‚©£iSalƒ³»Æ¦FÿþÿÙÿóÿÔÿÜÿÑsu; ÿÐÿóS@ÿÛÿÙÿõÿð 5ÿÌÿ­ÿ×9Y-! ÿïÿ„ÿKÿXÿkÿ_ÿpÿeÿ1ÿnÿØÿûÿÔÿ±ÿœÿá ÿéÿÃÿÉÿæÿÑÿÎÿð I% g®Í½ÉàÃp\ÿöÿÚÿ¡ÿ»ÿØÿêÿÓÿ³ÿÿ™ÿ©ÿ½ÿÆÿ¶ÿü4O;@kÐú̇Wa]C*M2ÿàÿÕÿÝÿâ$ÿæÿÿWÿXÿ”ÿXÿ$ÿLÿŒÿ}ÿ™ÿìÿÉÿÁÿåÿé=:$A0ÿýÿäÿÕÿåÿóÿìÿÙÿáÿáÿå502'ÿØÿ¶ÿµÿÉÿ¶ÿ«ÿ®ÿÿ”ÿ½?Bÿåÿ®ÿ²ÿÏÿöÿök¥¶™¾1òÓÀ»‘„‘~ocFCÿÿÿÊÿÒÿÌÿËÿ»ÿªÿÈÿØÿ¿ÿ…ÿ‘ÿÏÿëÿæÿêÿÿÿüÿÙÿ¶ÿ†ÿ¯ÿØÿ¾ÿ¸ÿÈÿ«ÿ¯ÿÓÿÇÿ­ÿÿ¤ÿ¤ÿ·ÿîÿÖÿÝÿÿÿøÿÊÿ¯ÿÄÿÄÿÕÿóÿæÿÝÿáÿºÿ»ÿÞÿÇÿÍÿëÿðUC'(=58dcMfz?7|}leg…•l.ÿÿ ÿñÿù%ÿøÿæÿîÿÙÿÑÿ¾ÿ²ÿÅÿÃÿÓÿåÿì$ÿëÿéÿïÿÍÿÇÿÖÿöÿì#% ÿôÿíÿìÿìÿ¡ÿ¥ÿ ÿƒÿ©ÿàÿö 4^bM+DILE9?\SÿìÿßÿäÿÕÿÖÿüÿíÿÐÿÐÿÒÿ×ÿÏÿÇÿØÿúÿûÿßÿÙ:@[vnF*<_YakR:9  ÿÊÿ«ÿºÿÇÿÐÿæ ÿÇÿ¹ÿ¿ÿ£ÿ’ÿÿ\ÿGÿ^ÿ‰ÿ´ÿ×ÿÖÿËÿÓÿì  ÿù EjL55K°´žPÿÈÿ¬ÿ®ÿ«ÿ¿ÿð,P8ÿõÿäÿæÿ¾ÿµÿ¿ÿÓÿáÿïÿÿ$1WLPUEBJKN7!"9NdHB1ÿûÿÏÿ´ÿ²ÿ¶ÿÓÿìÿüÿðÿËÿ«ÿ¹ÿÃÿÈÿÇÿÏÿ¿ÿ£ÿºÿËÿÇÿÄÿÃÿÓÿû.4=4/ ÿïÿÊÿ›ÿ•ÿ¡ÿ—ÿ¹ÿúÿóÿ÷ÿýÿóÿï - 5egcNCRY=-/ER?0-0?O+ÿ÷ÿñÿàÿÚÿû#" ÿðÿÅÿ®ÿÂÿÄÿ¥ÿÿ†ÿŒÿ³ÿÐÿÞÿÞÿÏÿé)9.#*ÿÿ  ÿíÿèÿÚÿÛÿâÿÖÿÝÿÚÿÉÿã $02,56KZ;18704#ÿùÿçÿÛÿè '.ÿûÿõ#ÿíÿèÿÝÿÌÿÎÿÀÿ»ÿ·ÿ¶ÿÂÿÓÿÝÿÞÿäÿÿÿþÿø$:UN9?*ÿüÿý4D6<8ÿûÿû ÿ÷ÿàÿÂÿÀÿ¶ÿžÿÿ‡ÿ‹ÿ‹ÿˆÿ‰ÿ™ÿµÿÚ ##( 0?5/.!&*)(1KB:')2>F2?:# ÿûÿõÿðÿèÿçÿïÿòÿõÿ÷-KI6$+(+%ÿîÿßÿºÿ£ÿ•ÿˆÿ“ÿ«ÿ£ÿ¡ÿ¸ÿÀÿÕÿëÿåÿÍÿ½ÿÅÿÚÿãÿÚÿÖÿÞÿÒÿÛÿù  +6-8202,7<5ÿü 16ÿ÷ÿñÿñÿêÿÜÿßÿãÿéÿó 0:/3:=)(3FXMBJ>/ÿñÿéÿõÿóÿòÿõÿÜÿÅÿËÿÖÿÕÿÑÿÑÿÍÿÇÿ¾ÿ¸ÿÁÿÏÿØÿãÿù ÿñÿìÿçÿïÿûÿÿÿöÿñÿóÿÿ ÿü  ÿúÿìÿáÿåÿçÿîÿ÷ÿû!7B5" !7OXZU5 ÿ÷ÿáÿÏÿÜÿèÿÝÿÏÿÏÿÁÿ¸ÿ¾ÿÎÿàÿÝÿÕÿÜÿßÿéÿû ÿü ÿøÿáÿÜÿçÿòÿû ÿýÿñÿãÿÞÿËÿ¾ÿÉÿÞÿåÿèÿÿ ÿýÿúÿùB<>QZXU[_MA;.%:E9?A$ ÿ÷ÿàÿÜÿåÿõ "ÿøÿÿÿïÿåÿÖÿÖÿî   ',3ÿúÿýÿÝÿÀÿ¹ÿ²ÿ¾ÿÇÿÆÿ¿ÿÂÿÂÿÍÿÈÿÑÿÊÿÈÿÌÿØÿçÿçÿæÿãÿÛÿØÿë     ÿÿÿþ,$$1!ÿéÿåÿìÿö (,#!#(96$ ÿùÿïÿèÿåÿáÿÏÿËÿÕÿÞÿóÿõÿòÿîÿòÿãÿäÿþÿÿÿü  )(#'  ÿóÿàÿÜÿßÿæÿìÿòÿëÿô %& ÿóÿóÿÿ ÿõ ÿüÿëÿäÿëÿþ ÿüÿôÿõÿöÿóÿéÿßÿæÿóÿ÷ÿøÿôÿïÿñÿúÿþÿôÿíÿëÿîÿêÿö ÿýÿòÿêÿäÿÚÿÔÿ×ÿçÿñÿûÿúÿîÿÝÿÍÿÈÿÙÿäÿçÿòÿú &&/1/9C8*#%!  ÿþÿñÿèÿèÿéÿëÿîÿíÿîÿúÿþÿõÿïÿõÿÿÿü ÿöÿïÿéÿñÿòÿøÿüÿöÿ÷ÿþÿúÿëÿìÿíÿîÿôÿóÿôÿïÿëÿæÿïÿøÿû  ÿÿÿÿÿýÿûÿøÿõÿñÿõÿÿ ÿúÿõÿöÿûÿÿ  ÿ÷ÿþÿþÿÿÿöÿéÿåÿîÿðÿïÿõÿÿÿüÿïÿèÿêÿçÿáÿãÿìÿòÿòÿùÿÿÿÿÿýÿý   ÿõÿîÿïÿòÿíÿéÿåÿìÿòÿòÿ÷  ÿúÿõÿø  ÿùÿñÿðÿôÿüÿùÿùÿýÿûÿûÿ÷ÿôÿõÿðÿïÿíÿìÿóÿøÿüÿÿÿýÿþÿþÿüÿüÿþÿÿÿþÿýÿýÿýÿüÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿýÿÿÿÿÿþÿüÿþÿÿÿþÿþÿþÿýÿþÿüÿûÿûÿüÿþÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿstk-4.5.0/rawwaves/snglpeak.raw0000644000076600007660000000100012327014024014300 0ustar gary 'XöbâuÕ¢‚u{“ ¾ û I ª 5Û’Y0 !(#K%}'¼* ,d.Ë1?3¿6K8â;„>1@èC¨FrIEL OQîTàWØZ×]Û`åcógjm7pSssv”y·|Úþ|Úy·v”sspSm7jgcó`å]ÛZ×WØTàQîOL IEFrC¨@è>1;„8â6K3¿1?.Ë,d* '¼%}#K!( 0Y’Û5  ª I û ¾“{u‚¢ÕuâböX' stk-4.5.0/rawwaves/tambourn.raw0000644000076600007660000002203012327014024014331 0ustar gary/ù0½ ðÿzúwÂ7$e!©ùØã¿·Rýºðg ç8ú2ë!6Òx¿Aõ|>ßÁÈ„I/î¾ÉÄÐÈ@?›ú‹È >z0ã½µ ÚîÜò~#Iúà“ë‡ëÄ*É ¹cúEmñÌ´Ç/8*÷ñ/óy"7ÐÑ÷m7¼zËõ>BÑDæå#xã'6ŽúÖ» 6ìX™ïUÿN¨âÔ*O ÊøYÉî= âô´Ê±w"9õiÎLH3ŽîÄmL;ãý{Ôæ†H'ú™å;ÇJxêýþ¯Üf2NÂøÕÔ“!ÓÖ ÄW*œoÉÒ(">—¬Ýõ[ ü„è׉{þDíæñ’+åýMã7û_ñ€üp÷Íûn%ö%ì”9§øêñä%þû&ãÂ…sÿœì¥ýr"Ìv#õôõÿ–9ðÒJ(!!Õ÷òP"ýœò£Aã÷½ÝãMú(¡÷+í òÜ­ –òuAÎCR²èuÕÂ6>Àó’êsú¾|SÓ‘ß™;_ÿ~ó¼ù¶÷B Ûõä^2-ñûëî ¿[ÿEõšÙçò"íçòŒ .ùzçä eôèuæ[-8ô&àÅõ²'ç îËô\5Œï…àý¡':ùGñ•鳨 ¡ñbáì;zùRÑB ñ,0úDÓÒ ÓÊÞ_`÷ ãîçøXgêgø O áëC.ú×g®7Þüìü+ð âð÷R!‡ó…WîÅÿÏ"ÜæÌõôø>-Öæ€øèŒ4®ü ã^à5F?ö¯ÖÇz&ùpìðB"3îñåÓ?ë¹÷3óÆ0åí›¶#‹ã/ §ðO —úòàᢠÒé¤íª7‹Íƒ©l!ÚŒxåVþðù.ÛSš$?Þ’ù,Ìóò èYÊ#Lë«ô­ ïe¨jùOé02(ëçáÏ Žæ< œˆïã(ÿÀ÷Ú Kï%…ø;óÍ ½÷æ1é` îÿžæ"]ÜVÈíä¦åôoêmÅêyÑå%×Ý÷)sèëÚëÑ9ÊŽ önçQ8LÍõ ³\Ï3®çIóG8/AÉ1 ÿåUðã ÿåXeé ì(îYù| ÒrÚt Œ÷öõñë÷ éýHü–ðÓù‹ ŸUÄë7Ñýèþ]ûÊ Tú…ò$ 7þ¹ ëVþÇCùîJú–¹§Ý" D ÕþUùËDýüüOXÞú’fó…í*øö¾äì4OIéåðÊ$r Oâ†òÍlFì†Æúà¯üÚî¶ú":ñ¤ò È1âV ÿ­ nó)ýÐömvòïùÊú„ _ý~í\óÏáYœ¶k÷}ˆô„ ðõABë®õEdDê ÐöÂ×ûƒûäù_!¦Ü Ç( $êß#ý*û¯ò'`ï¦ðâè µ äɃ|ùÍå± 1ôלý?9í‡6êè ÐøÖÄÚá]îøqÚoöí }<îšòüBoéoþEêÚ üü¢Þõ -Ý«÷éßì& ?öEâïð½}2î›á*h¹ÉNàf Ýæ\ö*Eööï°Içuü¬ eÚè €÷wû)ë£ê`*èÙøäÇúSø²ñéZ~ùQîŽ$¨îûÿæê#÷D!KïGïõ Á¬õ‡vå¶Ïã¼Qýí#óþí x PøÜþ Þù:õè.ÜŒµÂøò"oì†ñ·öi  –õ°ñ­¹ô”ÿoäû&°ô±4êó î| ;úÞÇ2N% mÈg¢ ¾ iæ©4èq…õøLù¹(;ÕÎ ¤ý=úØ8 ¥ÿÏUÿŽæp.$«ó„æ6 dÂù ÷~IQ äôí÷9bEáSk~çâšú}Áù!úq÷Æš¨ìóó›!’ôSûùuKøç÷1Î7þ[òý {àŒÿzú^òóùƒL"ýùõØî«ûàï¦l8iÿ™ö>è ü,íÄ ò_ñŸýõZ/ªô:êß?žóŠè ûö•ú-ú8“øê!ßÿ*ê³õ½+8òé…áîä="ù}‚IÝ|+ö ü{å¹-›êÒùk'é\cá ÙXB̓%RhðGây*²ìäË³é½ {ê±ì‰M ­Ú»? ‘úûž³ëõ Å× ±§þ›â Gð€ÚöýƒÒèðÅ"ò‘üÐ+öö} ÿgôê<ÿð‡ë üðé tðøŽûvùÛ EæçËi÷} ù†ýŠf Èìç  gø#ôl 1¹Û *NôMü’Üó WòæN×ùQñvE`öúþÒú²§þÔýá÷` ¿Fê} ¦ µå8 pjóÿC@_Õ#×þå©ðŸ›ÿJ×ófýBóæ%›ï9í€ yõªú ü;§÷¹|ö¤ nê†&`ù™ùø úòË wÿûÛ÷ Zìpû¸ Š "í“–BøÑ^÷Zûô;öƒú ]Ë÷UÞÿ)õnÍþíð HQø„í< nñ0ú{·sð99ñ«z§|ä’éð õÇ&ÀÞwø¥×ñv&ÐÖ\z Õ'!{úLú'þŠé Å©ñHQaäÒû6 C ‘òK7øÑ&÷ßòh9ýô÷ |ùAAø¨ ù–gúYù` ÝyõÇû·ÎøÈ ¨öÐE`þ˜ù+û4ªõvû$ÏøqônýÒ BøëzúsöÎ ˜<ê© ì©³^ñAõM®õWü üû>ê¯%¾ïò½ hé"/ öãû ø ûáöN»ç â•ú%ücý‡ ïõ­ÿÁ§ +íð úäwùÒLÿEòðÓ¨ðª­îJ¡ÿé <óà´üÏ ú~ÿùú¬aýÜúQíÒKûôú½ öŒ :ó®;_ ê 1†ósü¤–ï æüŽ öðg³ó ®ëéåKmÿü/àÿÛölò™'õLáåª ˜æòQîõí¤þGúíbË÷bþ%ý[“îþ ýT )ú ‚ú%Ýþ)ýfþ RöùqùPµõ‰Þö½ 6úøËû™Œ*ù^÷ƒç±ùKüKýwäç® àúD  óä“ÿ·ø¶eÍü&ûÆüÀ #ÿ«õ7 Ã÷d·ÿžú©ûÒ ¯µë< *Üí½Ññw ßÉýÐùö6áûû°âèÖùì Ví®èï-ø’øÅáØ ö!'•î{ýäú$sù‹/;ô±þÉ ¥„éWšøS¦MøÔù(  ;è [:ü¸ü@ñwO÷D: uìñè OÖÜÞÏ\íŸèí @ögütæS¬ûsÙÙ«%1ñB/ö4ê²–ûDð¢ÒhñöPðàðî+)ÿã ô^þëñBÜÿ©ö;çêû )íV œ€þ”ö' »õ3>ÿ/Í÷Ü jú¬ý­ü4äF öÓ Tñ` éö Öø§ûùàö“ü ˜!õ›+öšÿp4ñ7)"óYƒêûÉöŒ'ë¶ŽéÖó p÷ª˜ú¹ Rðú ŒöþnÿFës 9ùΘý1ÿbü’Ý‘þù¡ óón(îÅö( Ÿý øüq†üAáËúÿnŽÿùýfý úˆ$û™Kõ̲ü¯Uû~Yõ D÷ËS÷SüôÖÿ ìGÿ_ú@¢íoüªþýø©HîDÒÿsñTÕö÷öfùÔù [ùúöÇ? îôš {úÌüÇŠ ³ì€ ]øŽüá}ó ÿŒmøÄ :ùöúœ 5:ï"‰Ý9ø*„ö.ßý2õW Löú/ÿùüõÒ rù³Çù=¶Ÿþeð”ÉøÊûjÓñÏ ˜ûCàûC YðEåòûýIóyþåÝúMöúÃ8ïü4öøðùùúÖLøÕéýãþOÿ¬úMôvL×ûËúò3±üÖYú<­™þ ÿNrþˆ_JGåù÷fmû.ûôk‚£øÞý–CTþGÿ+þbeƒÿ.ø* åú”÷A-˜õ$ý¥ Xú&)úÍÿæó`žætúÍÿ„Š)ÿNûîý¿õðaY½ó‰ÏuÿÙþx.÷À šücùDÿB aøèWøwí?ÿ÷{6ôWž°÷*0ÿÖÂø• ‰òŒV£ ìì “™ÿ\õ ;ý¹ÿh{õöbø4ÿçürï‚ýùúî Oòo …ÿJûUùZô>úg ï÷ îý¶óË!iðÑV îÊÿÈyï´ý‚ áûøã ‰ýôÁñýVôb %ß÷õM ì4 Ì#÷úÌ„ímÓGúôó,Èòàþ.däç©òùâøÿ RøÿU ƒ÷2ÿIuýùk¤ôÍÍÿùúMùiûGïü Sø4 Zñ2Åð”“ÒIóð¬ÿ½)ù3 ¨ðç/÷Ï/øŽòô§õ’¦ ùô†úæUÿ™þ4ö™  ?ü/õƒ‡üªø:Àÿ4kùüM 0ÿÌñþ$ .þ ïîÒû€Vø®ú< øü,÷¥û­ïŠ}÷„KõløsÙUÿšøÈ`ÿk²òÎmú‚+ö‡ï÷ù¦ ü ù–ö/ òãûúÿSoÿšØbû3‘ ô¬¸BÕó¤`ø|FÿD5ïÿHïðÿU=î›é |ôúìþp,ÓîT Átðª Ã4ø9l Yé• +ð]ø›–ñ‰ýÀ<Ïì‰î•ýO¢çáZZâÿYõˆµì… þôÇvñGû¶? îìÌ)ø÷× £7ôS1 ˜õ‡þ¡¦þ#÷u Êùý.\úñû ý‰úÅúzëá @®ü,ü¿›òþz ”ÿ ô~ „ÿ³ö» ÜúÃüMèÒò Pºö ùt¾ðùû_þ öŸÂöÿûÑO î† ¹þ¢ûÈQö¼ †þÿøˆ <BúÏýÔ6ý#Bù:œû0ú¡ zú/üÆÿ‰ øe˜ü$ƒÿ] ½ìä rpþxõý 4ÿûòZþÄüóPD÷ ñþ<þûÍ ÈøX–ü},üŽ/öJ^ÿ’ûøñ¤?õù¹]þU ÷ñ6ù¤öþ"ûcÞù¸úø ±ø•Ògî¢Ìü|÷ª,œïn¢ˆó‘oôS•`þÔõö2üïL ;îþ úÿ$û5Z óîñ ¾.ùÅùz Õ¤ö…^ünýê•ñôØùVù¾ tû„ú ÞûiøŠ ùÿ<ù ° €ñÔ øÿâùÜÈ™ùÜúŽ @ÿ ôÖ ÄþMûDô#µåùãýeñý¶ 9ýÒû0Bûïû Wÿ×ô‹ > ù>øÔk„ý½ÿ´oû³ÿY÷ÿšùVüèõú¡ŸüµÿŒÒü¼ÿ¼Ëÿšù´ãb÷ˆÙ2þ‰þ‡Dõ­ 2ú:þ©Åþ"ød þÆú‚€%ùkû%ÿ¾ýö 3öèÓTïü' ôSàíxøëÆýqþÿitözëû| û  ú^ýwÚ»ú=ÿÉ=ÿ¬³üãû‘ ü(ÿ!=¹û’†üÍù÷å—ø_8ý6üÕöÓ+ÍjùÀÄüÌÿÿúeÿø‡Ý,þâö Ñû¢©ýúý|þålý-ý[ýÉ çö •þÙ³ø6Ìý‡áùüŠ÷ÿ2û¤¢—ùàUOûg:øÍ öüûJ~ jõXþÈt¬÷È öÿCÛLõ7°ÿÞùë °õ ÿ”ÿûþlÞþ¡ûHÝÿÄùé=q÷.;ürþüb ?øTþ¨ö²ö¨ gøâýxÿÁ ó©`ÎúeûìÅò,þ<Éÿqõæ Èÿ²ôÝ y’õ Éò5¸ÑûŒøPªò­ÿSŽ"óXpöWý7>:íª ’øûݧñȸêû‰ûë ûz÷' 5žôvÉfòJ` þXùÿ&ð<½*+ïÃË÷Kþþ- ò8 5û¼ý¸ ﺼü€ùz 3ûDý  ý û /ü*õç  ö+þ bø<¼¬ÿZýW Zô4-Mõ¯wúI]‘ ÿO}ú•ñÿþüÀû² ý û]ú[–üònûª‰ö(¼ÿ.óöíäü‰÷Æü8ªø‰@˜ùaü„ÿþžgiú@1þLKX@ü–þ5øÙy*þ¼þfü Åþ‚íý>müÿ‘œúÝþË÷úŒþßþÃöô¶AEþ‰øïøUþ¢ýoö ßû²üïÊbóÐüÇù1úxëôòÿX2þäú1 tþîòg ¦øóéø #óGf'ú"ü) @úÚø8 àýÓòÉ DŠöê$Qö€˜kðÚ8Šöø\šûù|e˜õ ßþGõût íØX{ûÙõðÑöåþi ‡ûšö+gÿô¸øòPÙ%øùÿµ kóˆ¸úùÐøó ²üU÷Ô þdû ÿ6øïäòö^emø`´ùüŒþ%¥úÿ»sý¼ùº ÿÖú甪üšÿÝþqÿ?ùh³‡ÿ´û=Õþvü¼¥ÿÏþ2=û Gþ÷ÿ«þ¯.þBþêþ‡]ü…ÿ2^¢ûÔüÀþdüã LûDÿ<1?-ûâÿ5RûÏ)ÿ={üÞ2ûŸÜøÿêãùÆ ÿ,?ü^¼ù¾cü©ùûðyÿTÿòþÿaý%ý…“ûáõý;ümIàûW”eýkÿ×ÿÞÿÿþãÈý6 þÄþÙÐäüI(&ÿüÝÿÉ¢ÿO5ÿUý˜;,þ€þ3ØþÀýRwÿÿ…ÿÿiçÿÖúx¤çúSÿÿV’þÃïú’<Wÿ¹ûfÐ)ûî^¹þ¸ÿ¹yþÈqÿ üGŽÖûÌÿoëR'û¦ËþÂü9Xüî|ÿ¡fûÄbû'(þòûPÝñÿý¾7ÿÅþº†ý[üBþ¬þí*èýЖý}ûËLùçÄþOXúä¥ûªBû2ú:ü­õþGoúÒ¢ÿ!áû·Á~ýYýDÎŒþ*þÛ?ýZ}íþGÿkj0ÿîý^ûñ£ÿ#ÿ§ú7  þÝû?q±ûÍúÿ® ú°ýß=ý@üy Šÿ-úyþ+uþ ü(ÿ"E6ü¤ÿ”G?üfþ5ýKý²óÿ†û ÕÃÿÎþ†þš ÿ6ÿGü{ ‘üðþ˜ïý’þÄþÌ!ýùðü^Bÿhù“,WûúþD<ýÿAþÿ¦£û¡ýpýªý®_ÿe¿þ£³kûT*ïý¦ûÃþŸþÿʵþÿú7Çéû@ü*þjýƒµËý’µÿ‰ÿÙ*ÿÛú)¶ýmýÉ0DÔþüçÈÎúóÿxRûeýûnú»Ìþþþà´ÿ<ù¢ïgøÄþ[EÿUü&ÿá­ÿ—ö-kJ›öËGíûhÿˆFÿµùO3ü^û´üÿöúáü€Õý €ùþ.’iö¡Píþ¦þepýJŽÿ¢ûÉJûdü>O¢þßýBÿ:£ý²úú†Èúdœã·ÿnÿAÿ)A¬ûU‰þýÿKÿcÿœý³A÷ëürÿ^Ipú}ÿÞÁýÂúÜ“Rü¶þÏ4Ú´½ú5›cÿ=ùOÅgüÝ«:kû.ÿWIú1ìgÿûüÇuþ¢ýÿ1ÿ7Gýëûz¨FýõýûÑiKDþlþšý«þfJ’ün½?þ¿‰ýe‚ýcÿ‰ÖýCÿ£ÿËÿö­ø[®кù'Ãþ¢ûÀnîú[!)üA¯ûnþÝØ/ý_ûü”!þ£ýÁüuÿ²—×ú’+þfÿ@PŽù›oÛþŽûG þþÿ Öû4Äÿiàû±ýiÿ~µû•ùyþ¡GÝýÝ6ûŸþ¨Rÿ©þÿ7ýeÿâcÿöûTEüÊœúõ£²ÿÿÿ‹ûíÿË-þ¾ûûäþÐhÿ…ÿ‡xüúgÿïðþŸYÿ0˜þjûçþ.àþ™Zý-ŒÿÒgúÊãþÒý¾þý²üìÿnÿ?0ÿhnùÁ›þû–ÿKÿNÿ|©üS)þýAvÈûJf1ÿTýZþI|…þ†þaÆþ…ÿ'ÿ%ý.½ÿ„-ÉþR}þí«ÿÿÄæþ›Æ þ ÿs¦ýtþÁtÿÏü‡0oý7Bžú›®û‘þÓÚþ¨ýê…ýKÿ,Âü…ý£$_ûfTTú´£Åý6éýzcý^ý9ÿdþE%¡þÆèÿ¯þþGÿ#ÿ³¶üÝÿ°þªÂý4ÿ€f"Áýq­ 6ý°jýüÿ jŽü4ä^þiî\ýéÿÀ¦ýþªÿýª$Jÿƒÿ|ÿ½iÿ9ÿPÜý!¬ÿÃÿkÿÙ”ÿs ˜ÿþ³ÿ³þwXÿÙÿu’ÿg_¯þ¿sÿæþò5ÿþÝý³=þ¬D*þ)ÿØ·,ûéQ<þ¡ÿ{ÀþÑ2þÌÿâ[þgÿãý°ÿÑþ)êCýÁÄ=üîIý<¿A“Jþõ ÿümþ4aÿdæ§þ’ÿï¼2uý ÞþÕüüDÿ sÿp¥üî²ýâ¤þU·ÿ"þ7_Vÿ®þºý}ÿHþ:þ´ïUþ§ÿžcûBþ-þÙgÿlüœ«ÿ2ýÚþÇCþi?þcÉŠQý”toˆý Åÿ¼ÿÿî*þ×&þmþؘüëÿQÀ|þîÿ"ù€þ›ÿ'ÿÍÿÜÿ”´ãý‹ ÿ þ¤þÿ¨ÿ‰MŒþ¦ÝOþÁÿ¿™üúÿ;+ýšþYƒþuvþ¬ÿŠ]ÿd‘ZýîÿII,ý£íaþð }ü¼è@þ£ý™OàýWÿ™ÿúÿêþ^¿~þEÿ$ORýÔ.þo‰×ÿMý·¾eþþó}þ…þò iÿ/Eüÿ(9üUBÿõ¯ýï„ÿ ý¾C7Ñüãÿ“F4ýæ $þ¸)ÿèÿ­ÿšüÔ·þ2ü9Ùÿ¸þ™ýNÃý¾ýÃ{þXý'ØÿËÿ/þ˜EÿÙþÃþõ ŒûÇýÀÿký­*ý­òCÿKþ³‘þ”¬âÿ ü¶‡zþÙýlRŠÿ"þò?ÿøÿÏìÿ9ÿ-¹"ý‰fãÿœñýnþÿý¸ÝÿgþÜóû½ yþæþúUþ†ÿGÿ/ÿyÉÿçþ~–ÿÐý½óEþï]ÿúÿ”¯öý645ÿ ÿ þÿ¸LðÿX…þÝBi#ýñ žÿøþÇzÿ®ÿ·ÿv<ÿÆÿ±ÿ¬ Ñçýô+zOþ#œ;tÿ~ÿ¸š…ÿ¢þ¬„þêÿV+ÿKÿ÷ÿ‚GÿÚÿ6ÿàÿ ÿÀƒÿª ÿÝ=:þÛÑÿÿÜÿ‘ƒÿÉÿ ¦-2þÎtÿ}ÿ„vÙþß¼ÿ^pÿÒØþ"j’ÿ}ÿv¿ÿÊÿÔ+ÿ©¿ÿŒ@/ÿ›ÿœóÿÿú•ÿžÿäq‘þ[ÿ®ÿðéÿˆÿ^ùÿüÿfŸÿ§ÿȯÿ¡ÿÚ!ÿÞÿ+ÿ`ÿ·ÿàÀÿ*ÿ-@¬"þgûÌÿÿ…—ÿ`ÿÚÿ™ÿXÿH‚ÿØþà‹”ÿ‚(ÿãÿæX ÿLõÿØÿ~iaþöPþøÿ‰˜ýå§ Pþ©Mÿ$ŸÿŸzÿa€ÿ¼/ÿÌÿÍÙÿcÿì½ÿNDþnÍ«ÿhÿÍÐÿ?b\þ‘àNÿ†Àþüßÿ›€ÿ ÔÿÖÿìIÿœ WÿÆÿÆÉÿTmOþçËÿS‹©þ¦¥Nÿòÿ0.ÿIÿí‹ ÿ#ÿ~ÿõ€ÿ4}*ÿ±ÿ"fÿ>`Fÿ­ÿ® ÿ\ÿŽÍÿßÿ¥†ÿÍÿ§0ÿ` vÿhÿŠ9 ÿÛ-ÿ÷ÿ ®ÿéÿ^ˆÿ¯ZÿÒÿÛÿýÁÿQÿänÿ¦gÿ¼ Cÿ¬,ÿ’lÿŒ:ÿþ ÿ»ÿØÊÿlÿç[ÿýÿÇYÿâÿÄvÿ‹-ÿÑB%ÿyB 5ÿ–oÿ²Gÿ¸ÿëNÿÂ!,ÿÙÿÙ37ÿ|GÿøÿüÿÜ>ÿ·!ÿö ÿõÿØ* ÿµCÿóÿûÿñ ÿøÿÿ ÿÞ+ÿõÿè;ÿ¿ÿÞ$ÿç  ÿÃFÿëÿøÿåGÿÖ ÿô ÿüÿîÿì9ÿÜÿÚÿýÿÝ7ÿëÿðÿù2ÿÎ#ÿóÿñ"ÿÜ ÿþÿñÿüÿüÿ÷ÿ÷ÿùÿ÷ÿþÿùstk-4.5.0/rawwaves/tomhidrm.raw0000644000076600007660000006577212327014024014351 0ustar garyÿyë€áîÛÑ6ʸÅ1À¤½]»MºÚ»Oº±½.¾Ã Æ}ˎϯÓëڬߡåîÀöëøùótýÑ{‹Ÿ—'&5lD“OøV[¯^š[ûR×K(F>Ú7Ü8·=@Ï@j8‹2G22 3”5ð7í4i-¨'Ü,Öd"'ù(C'Œ'r)ñ/b1Ê2Õ1Ö0I0L15m86ð4ê3g3X0_.ä/ì.Q*'%“S( n}ø—ïÌ鮿iãòÞÄ×ÁÓ>ÐÆÊÀ®»¼¸W´7¶‚»î¹%±Ç§w™ŒˆÁˆ·Œ”m`¢¼¢žœó–|‘ŽœŽÕ„Ž­ë jŒúŽN‘’â‘ñ“ᛋ¤…«Ä¯Ü²æ¸0ÀÈGÍ1ÐCÓ`Ö Ø]ÚìÛ®Ùw×ÕûØÝâkæ­ìköìd) &&î.Ð6ä>fH7TQ_bf(jn5qôvz}N~¨~‚|€y’votr·p÷n3mKk*eÓ_b[gZ7\Ê`þe‚g€e@các¦ay^Û\]\ \‘[qXÕVU‚SÄMêFç?/6c.B(.#O¡,ÕÓÂ5 Z ™¸g¸øï;èðäÎâß®ÜÖƒÐÇx¾ûºM¹7ºpºå»¬¼G¼5¹Q³G­‚©¦i¤ÓŸ––q;‹†‰¿Š ‹ÇŒUа‡'ƒj‚#ƒ…j‡`ˆ’ˆˆ‡žˆŸŒ¿’暣:«Y¯M°Ò²“¶º¾ÁÄÅÌ=Ô$ÜãæVï!÷¼ÿ5iv ?’ÇñŒ! 'x-3 ;þCêFÝEÛB€>Ã;:Ý>µD IRM!OÊN°I%B„=W;Y>¦DVHäKM&NuNzLjJ½J¸LãP¤RÑPÀK%E›Aô>˜<:¬:#9Ü9”9ð:$;/<¶>f@AA$AÍB¦B?4;”7\3.Ò)ö%²#­#I#Ø%&7'w%Î"– `,` Qù}ñšîoî˜î™ìDè„äïâßÛ”ÖËÐìɧÁPº µB±ý­~§Ô¡™Õ’ÚŒ]†×„†‹¡‘̕їY™…ž:£­§F¨W¨ðª]¬"¬Hª¦:¢VŸ|±uzžA¡¬§Ó¯X¶Ë½lÃßÊbÐöÙ@ã#ìŽô;úFþû:2 ‚m8 n&*Å.C13¼6~9Ð<Â=e92*2%$‚(G/¡8•@DDœB ?+>(@éEãJÖO RùT R­O{L·LòNrOÖQScUDUwSÅPRL‹ItGåÚ«Ó÷Ï[ÌËHÉjÅ@¾X¶M®©§|¢cŸÑžæžN=œ»œã#MnÇž–ŸØ¡‹¢x¡[ž³›†™v™èœžŒ ¢¤o¦œ§ò§â§¬©Y«Ü¯ ³@·¾½fÃÀÉ÷ÐSÖÚûà²æê„íîzîÝîùïð5ò¶÷ûû5’ %u“"(*’1ë7‹;c=û>zjA%DFwGŠGD&?Æ:ê6d3ü3î56¨9D= @AïDNGQI–JyI+FyD@BA³AìCÑFIMJôKxIÆE–@t;5è2.«,*€)](ˆ'{&ä'n('½'š'Z'f),./Ø1ò1ê0€.+*Á&‘!µhe ¾{õ5êà¸ØŽÒ^͹ɕÅöÃRÀݽ¿¹Íµq²°V¯È¯6®Ì®¬Ø¬‰­®­­ªS¤œžÖ˜È“_lD¶Ž«‘>•¿›F¡³§ «o¯M³I¸’¾ÝÄËɺÌÏÒÔæ×žÙ~ÛÝÏá˜æäììòÇ÷<ú{üý³þ'ýÁÿ+ÑÛ á¨ýÇ­©ÇXÝŸ@y‡!š)ð0ò5Ç7 7‚9Œ=…ChI»OžTÏWƒWÃUÌRRO(MbKüJ)G¾EHDwEpF†GàI}K¯OIR?TáVüW V]UçTŠQúNKtHÿF»EEE'D‹Bb= 6(-M$Zð\Hà  Ÿÿ·øœðvè’â'Ý2Ù¬×.Ö(Ö6ÕÆÔ°Ó ÑƒÏ¯ËáÆ*À¼½©¼ºò¸s³Â­E¦¹¢.ŸRsœÜž#¡+¥¤ª-­Ñ°|²˜´¦¶é¸•¹uºº)¹V·«µ¦´´µr¸F»%¼ý¾”ÁhņʛÏÇÔ”Ù€ÞáÍ䄿Ùêãð‰ø.™ ®žàrŠÝ—@ødš#À_ ó©a (Ú1"7:¦<>2?ÈB[DmE¤FD/@°<Ý9¿7m5·5ë6o6*4©3§34;6Q8^:ï;ä;6; ;o<7=Š?cCFG®H5F~Ci?-8´2F,b'¯$ñ#¼"Ð!ü L/uh+ Á’Fÿ4ûš÷aò>íQé½è+èjééÆéFæ²ã)ÞÐÚx×\Ô•Ò%ÏÈÍkËȺÆñÅðĽÔ‡ÁÉÁ@ÀiÀ6ÁÂXÃlÃÂÄ"ÄäĸÛÀß¼²¸×¶ ´œ´ø¶k¸º¬»ä¼»½ô¿÷Ã.ÆØÊCÌþÍìͺÍ%Ì5ËäÍMÏçÒÐÔÔÕò֩וٌܙà6ãúçÈëæñ öúÄÿ 0ó áB|Õ’¤f#(v-°1§45“7g:>.C¡I¤ObSæWä[]T_²ayb_ccbíbÉb`˜^…[—X?TŸP“KÜF‹@¼;Æ8¦6Ï5Ä4ä3^0Ï-v)$Çò°1Ô¦XðQƒŸ Șþ•ö2îæÞ…×ôÒ`ÍÝÊ€ÈJÆùÆÅRÅÅ3ÅûÆÆÄ”Â¾õ»÷¹9¶¼´4±f®U«Z©s©3ª|¬ä¯°²#³Ä´©µ´z´´·¶èºÏ¿ÿÆ ÌÒ.×’Û=Ý Ý•ÝƒÜÜÛ¼Ú ÚÚÚÂÛÒÜØÝŠÞ\ß~á[ãŸå¹çúê9ìgîKï¡ðÖò´õóúøWN ÛVTŽŠ}¯!e%(Ë,.È133Á6Þ:y>€B‚F0IºLÌN‚O0ONäN¹NÄNýO NëN†MûM—LÓK¬JœIÁIH}GÖF‘C>Ñ9;3e-‰'¨"-Æu­œ i¿l¡i5õÿ^ý/ú‡÷Yôwò)ðYî½íëRê é[èàè0ç‹çJçCçåÛãYàkÞÝÝ|Þòà…á…á”àyÝðÚ ×ÙÖLÖ8×”Ù”Û`ÜÃ݇ÝËÝ[ÜkÛqÚtÙV׿ÕtÑhÌÆ Àl¼;¹ô¹@¹P¹›ººººK»‹½’ÀFÃ<Å”Æ¶Ç ÇpÈËÏŠÕ,Úúà6ãìå÷æ”æ—æ§ç¿ê ìéï®òmôÏ÷ùnüEÿ‡Wâ Ïh 'W,Ã0!1â3 4t6ž9¦<Ê?ºBœD¿E¨E¦E«EßFéIK>M@O4PŽQQ7P…OFNLêL_L·M¾OOñO²MxJ%FƒBî@=?C?9>ø=ƒ:<5J/(œ"Ù÷·1» U¥üL÷>ókð[îëêé³çßæ]ä´ã>âà—ÞñÝ$Û?ل׺Õ}ҜγɷÄf¿Œ»ð¹Ñ¹'¹uºi¼-¾XÀ§ÂþÄéÆGÇXÈ_ɃÊßÌ<Í>ÍiÌgÊmÇ«Äà ¿“½m»Øºýºï»Ü½ÉÀkÃŶÈÊËäÍÎÎÏ¿Ð6ÐNвÑüÔ_×µÛûá%æ½ëÄïpñ£òðôõ.öãù´ýr¤ ywô"€*/Ï4.7Y9&:½<“>W@A¾C·EÙGÛJ%LmNeOûQVR7S SÊT@T”TªSæR+O¿LÉIDª?×; 6ê3Í1Ó0ï0=/--§+l(a$è!ZïÍ3ãš à2w½Ø%å¡Mþ÷û@÷¨ôZñ’ïŒíÑìêoèãçæòæ æšæúçåé„ëÇíÄîfí3ê'åçá4ÜÉÙÖ3ÔcÓmÓҦѿÐ:Î9Ì"ÉÅÇ!ÄGÁE¾»½d½¹ÀÄȉÍÐØÓ0ÓêÓ¾ÓhÓ›Ô]ÕpÖ[ÖÞ×3׫ØBÙÙpÙ ×¾ÕãÔMÓÇÔ¿×5ÚžÞ:á–äæÕèûë€îžò=õñùMûñýëÿ}5õí ¦+•~r+O!‰'2-2´7ú<þA EÖIÃM1P R/SThTìTíTgS®RËQtO„LõIÙF>B?)<Ï;À;Ç<Â>>Â>Y<ž9™5Ê1¹-”)€%º"]dÓš¦§yÊ… )>ülø5ô¹ñðïí¥ëâê(è¼çîçæè«êë|ìUìbëgétæœãß'ÛsØ@Õ¯Ó`ÐÉÍ´ÊMƼÃHÀu¾z½w½p¾'¿¿Á¿ú¿´¾Ç½;»D¹A·¦¶´¶—·6¸(¸ë¹5¹(¹¹”»5¾8ÂkÇUÌXÐÿÕ@ÙTÝCàõä}èë£ïò ôÕ÷ ø•ù™ú<ûü>þ Œ‚ »7ާ"ƒ'%+’/…2£4œ5v5º5Ü6G6ë7ª8}9 938Å7ª5Í3¥1‡020k2,58¤<? A B-BŽBoBA“A-A@å@8?'=σCXG³JûLÑL’JŠF€AeáÈú!#=%']*#-;0†3 607ø8Ö9979t:3;n<õ>”?ì@¶@û@›?Ê>Ë=¼<”;]:8ƒ6Ô53s1ö0k.¨,º*u(%ï$d#!© u&8º Åz€ì2¼=*-ÿbýú·øÂ÷‰÷÷÷öEô¬òMïDë½è ämáÞ Û’Ù¹ØL×6ÖhÕÞÕHÔ`ÓÐÛÎË0ȒƉÄùÃÓÃHÃ@ÃLÃUÃ:Ã"Ã'Ã<ÃXÃqÃyÃ\ÃDÃwÄÄýÆtÈË!ÎÑÔR×¥Û*ÞÞâÚçDë÷ðçö û<9š Ú ð ï Z ¨ #ã  Á  ÷g3'áV) . p º„eG¿JÆa%w· ¥#G&–)â-02«4£67888ç9L9º9×9ß9™9-8Ó8‰867ø7ì7ø7¢76}5“42V10.£,É*×(¬%õ# K¶Ï„¡ä [ 6œÿ²úºöñ·íÂêçä£â+ßܽٲÖwÓPЉÎ˿ɘÇ~ųÄ-ÂéÁÏÀÄ¿ž¾U¼ò»y¹¹·Áµì´Y³²A² ²j³0´9µ˜·B¹5»œ¾¬ÂrƽÊòÏ ÒÜÖØ‚Ú–ÜXÝåßPàØâ¼åçñëSïòúö·ú'ýIÿí*\›ÿ ®rJ ãÌu!à#Û%I&C&ç'w(:)<*—,.-×/„1)2×45ó77828ß9T99d9 8u7¯6¦5U3Ý2j1/í.Â-­,¥+š*³* )Â)X(›'x%â#é!Áꆯ‰Ö#h|ObQ û  .]~©ùaþÝýMû‰ù™÷kô¹ñpí–éOä²ßûÛy×pÓñÑ ÎÂÌÒËɘÈ?Ç Æ%ÅSÄ®ÄFÃåÃmÂð˜Âu‡ÂêåļÆNÈAÊjÌ­ÏÑ†Ô Ö8×îÙ0Ú2Û2ÜsÞà*âqäéç†êìîÐðüóJõÒøBúPûßý ýýþÌÿ¤ ºð ûÏv›õâT¤ ¼÷ïË p±…˜ŸC!8#|$ý%Õ&t' ( )4*{+Ñ-. /0C1Æ3s5[788Ú:7;%;‡;Q:9Y7Ä5ã3Ï1š/9,Ë*´)'Õ&÷&O%¤$¹#n!ÏìóðàÁýC : ¸]$ýOûù{øˆø ÷Ò÷¸÷’÷4öŸõ¼ôZò~ðEíæë„é'æ¶äá?ÞÚÖÛÓCÏãÍ ÊÆÈéÇÄöÂ_¿¢¼ëºn¸‡·L¶˜¶E¶a¶ë·º¸¸¹ó»|½N¿>ÁZìÅðÇôɼËQÌ×΋МÓ5ÖhÚÞ4âŸç8ëëð‘ôõøÒûùþFÿ´—<*Ù ½ tìKgA2Hc€‚!%"V##d#š#º#ÿ$”%{&Ž'Æ)3*×,¨.ˆ0~24k5÷7k8×:;0d>å?>Á=ÿ<í;à:Ù9¼8`6–4X1±.ƒ*ô'V#Ù Šï${à 4 “ÉÇÿû~÷Ýô/ð—íGêTç½åªäâ¡áà¥ßñß[ÞÔÞFÝ|Ü]ÚæÙA×£Ö5ÕÔ!Ó™ÓNÓÒñÒ”Ò-Ñ×ѠѣÑìÒ[ÒèÓÔ@ÔöÕ›ÖÖRÖ—Ö¼ÖËÖâ×טØdÙ”ÛÜîß áâðä^åBå•åƒåQå'å<åÀæ®çéé‡ëVí,ï4ñBóWõ„÷œùºûÞýðÿù += \ pzw±°ˆ#n’¬ °!²"Æ$%…'V)q+š-¢/€122Z2Q1ù1u0÷0”0/l.š-†,T+&*)(e'Æ'!&T%8#§!´z6PÿLCо« „ÕA×{ ‚ ¡ röfÿçþü…ûùÊø›÷jö#ô³óñî¸ì;é¤çä®âà§ßÝÛüÚIØ[Ö'ÓËÑYÎê̞ʜÈáÇuÆ[Å|ľÄ.ÄÄ©ÅêǺÉÖËùÍòÏ¡ÐßѪÒ.Ò”Ò÷ÓnÓßÔQÔõÕÛרÀÚÇÝ ßxâ ä½ç‘ê|í\ð òôÉöºøƒúûgü‡ý þÒT•Ü2¯W + )PºfFL_m"m%J'ø*_,~.f001ò3Ô5Û7Ñ9¥;(<$<< ™  Š %Ëy1:‘ó:ÿZþZýJü-ûú*ùRøŽ÷Ù÷4ö„õªô¼ó¾òºñ°ðï@íŸëŸé;æ”ãÅàÕÝåÛ؃ÖAÔcÒíÑÃнϷεͿÌÒËïË"Ê|ÊÉÏÉäÊDÊç˹̯ÍÃÎãÐÑvÓ Ôù×(Ù{ÛìÞfàØãUå÷è¾ëœîñxô,ö¤øÛúíüêþ÷!P{² é  öÅ4ïÐź `ä!!ã"l"Ä# #D##Ö$A$±%2%º&8&´'H((þ*+F,m-_..u..Œ.w.S.-. -Ö-t,ë,4+L*8(î'v%é$H"˜! „Ù òpnäÐ? l™ ÿäý6úÿù ÷põÖôHò¶ñïYívëyémçRåBã<á&ßÜæÚÍØÜ×+Õ¾Ô‘ÓœÒÈÒÑPÐËÐpÐWÐxÐÇÑ)Ñ…ÑÉÒÒ;ÒŠÓÓòÕÖa×µØìÚ Û'ÜEÝ`Þß•à­áÍâéä å5ætçÛéuëJí^ï¦òôVö“ø¶úÅü²þ‚;ã“dV n £ ýpÐñx‹1„¡¤¨ÇxžCâ†? å!³"T"¢""!1 Åt@9^¶G T’Ó ‚ý„¼¾,žõ=s•žo?Ϧ’ … ^ Î8èÙÀ†ÿýgûsùBöëôsñåï_ìëê‰èMæ;äQâ•àùßvÝýÜ‹Û"ÙÔØµ×Ï×,ÖÓÖªÖ“Ö{ÖAÕàÕ_ÔËÔCÓæÓÎÔÔÕ|֌׼ÙÚ[ÛªÜñÞ.ßeà›á×ã,äŸæ-çÏé{ëì‰íºî®ï…ðgñ€òïô³ö±øÕú÷ýÿÞ±€Fý — ` ’¢›—œ®Ïí6c©ö =!"¿#ö%%&M'`(^)E**¹+Q+ô, -@-Î.M.«.Ï.É.•./-•,Ô+ê*Ø)Š'ô&#é!”£S2/LÊ K Û5\ЏþæýûEùr÷¢õÇóöò<ð›ïíì)êˆè­æ©ä‡âcàZÞ‚ÜïÛ±Ú½ÚÙxÙ Ø•Ø׆Ö÷Ö_ÕËÕCÔÂÔ9ÓœÒáÑýÑÐÏeÎðÎÆÎôχÐtÑ´Ó5ÔéÖÃØ°Ú¦ÜžÞ¢àÆãå–èNë1î7ñNôP÷,ùÒü=þ‚¬ÉàìÜ ¬ ` ìV«ûDŠÖ,ë†Þô´m; &O’Ú2•þlÊ ûÒ“Aê¤x‡Ã'±J×5C¡ yͦ¥Ø)x¦™OÃìל7©õ · 7±8ÐuÿQýtûÀúøqöÐõ óñ ï ìçê¹èxæMäUâˆàùßÐßÞ¦ÞÞÀß*ßµàFàÌá>áŽá±á¦á}áAàùà´àxàJà*ààà'àHààËááváÐâ-â~â½âøã"ã7ãJãiã¢ã÷ä„åWæWçƒèÊêë(ì:í>îAïTðyñ½ó.ôÎö­øÉû#ý¯]Æ: r d„¿ÑÉ¿Âä(Ž ÏŸv!<"ó$’&''¿(('Ó'g&ì&x&%°%]%$Ù$š$f$[$Z$K$9$#ö#¡#"Ž"!Z ˜ã%ERA â‰5ÔXÉ(  ×wøvôþ’übúXøwöÌõ0óqñŽï›í“ë‰é›çÉæ"ä›ã"áÈàßJÝàÜrÛ.ÚØí×ö×'ÖÕùÕ‡Õ/ÔôÔÎÔ¨ÔÔ—ÔÃÕÕ{ÖֳׇØzÙ†ÚÄÜ*Ý’ÞðàSá¦âØã÷åæ1çbè«êë¨ívïkñuóˆõ—÷—ù|ûCüëþŠ+Ïy8ö û 0 " Ú k äbøNê×ÇÔïùÉu ¢;Ògòf  Y ~ { a L + ðò  # R † ¼ Ê ™ 8™˜H×CŠÔ5¨*¿o# Ï g Ý7µâ"ÿuýÙüNú×ùsø+öêõ²ô—óƒòhñZðaïlî}í‰ìëkêTé?èEç…æóæ“æhæpæ—æÊæùç!ç6ç+æòæŠå÷å5äFã1âáà6ßrÞÜÞƒÞ`ÞiÞ¡Þößgßòà”áIââ·ãrä2äùåÎæ®çè}ésê‚ë ìÍîï0ðDñ?òò¥ó&ó´ôfõKösøùåüþfúµ˜ g š×ËPo>Á19tÊX æôýIS =!!Ü"‹#/#À$Q$é%j%Ø&2&l&ƒ&|&R%ù%ƒ%$†$!#Î#„#R#?#<#0#"±"(!b ZZjh‹e ±x^ƒýóû‘ùg÷Xõ7óðÓîŽìDêç÷åïãöâ,à†ÞãÝMÛìÚÄÙÄØõØuØ0ØØØDØzØÂÙ ÙdÙÖÚFÚÍÛÜJÝ)Þßàààáªâdã ãŸää›åå{åÎææfæ³ççYçÎèWèõé¶ê‘ënìUíIîYï†ðÓòUôõä÷ßúü%þCZ|¯Ñ í ñÝѳs¢úå°c –•öJ•Ý  > u Â!!L!|!®!Å!¯!z! z¡œ~XHIpÎSí‘AÔ1f{ulaUF / ß ±yB Õ®•uYÿSþOýAü3ûùÛø“÷3õ½ôPòïñ”ðOï$î íìëéùèÿè çæ:å…äóäŠäKä/ä5äUäxää†äZäããââ4ââ5âããÞäÎåÜæùèé êêõë¶ìbìÿíŽîî¯ïMïðð˜ñ=ñàò‡ó#ó½ôiõ!õÓö÷*÷¿ø1ø‹øÐùùmùÐúXû ûóý þJÿ§!´X Ð ’ K û /¤IopV,ó³}Z?58H l!•"¶#Ô$Þ%È&¢'c'ô(W((•(j('š&û&7%N$?#!¿ SÝtªIåpÛ76  ݰ˜Ž‹þŒü„úrøhö}ô±òùñ\ïÞîxí#ëáê®é|èNç åöäÚãÉâÈáØáàlßîßß*ÞâÞ—ÞDÝê݆ÝÜžÜ/ÛÔÛÛjÛpÛ©ÜÜ—Ý>ÝóÞžß?ßÒàTàÍá?á¯â*âµãHãåäœåcæ9ç'è=éŠëìîWð,òôöøKúšüùÿdÐ4‹Ö  OjhL§TdGû pÏ1šmÐ , r ´ ¾ » ¨ ’ | ^ 1û¨m£ÀÏÏÍÖãïN­%¿y? Ö˜Uþ‰ yÉö ÿ Ó f ¹Ð»_ÿ:ý1ûCùs÷¹ö ôbò¸ñ ï[í·ì"ê©é\è;çCæså¼åää ã‘ã#âºâ[âáìáöâ=â½ãjäDåAæOçlè€éyêNëëë÷ì:ì`ìmìgìRì=ì0ì5ìQì…ìÒí6í£îî«ïAïÞð„ñ*ñÒò}ó&óËôjõ õ·öp÷2÷þøÍù’úMûûºüoý.þþâÿØÞø-…ú B îÜʨaè2:˜Et™¼Ôò=g˜Ñ;s¨×6VZE ·E¯ö&>FFQiÔ6£é)OZ R B * ÿöèÙÁIìÿ{ý÷ügúÀù÷Qõ~óªñéð.îuìÄëénçÒæ=ä©ãášà/ÞéÝÐÜêÜDÛÙÛšÛÛÛ‘Û¬ÛÄÛÝÜÜ-ÜhÜ·Ý"ݬÞUßßîàÐá³âãmäLå6æ7çXè’éßëDì³î&ïžñò™ôõ“÷ølù¿úÿü5ýfþ˜ÿÄõ3‚áQÏ P Ç / ˆÖ!g¯ÿL›ë4s¦ÁÀ¢_ö e ® × î ù ú ý ü ø ô í Ý Æ ¥ u -È8tX—’£<븪 Ä  a Ó E ª ó ø±?¨üNþ£ü÷ûUùÁøDöåõªô‘óòÅñüñ=ðŠïåïJî³îíƒìíìWëÄë7ê³ê:éÐénéèËè|è(çÌçoçæÈæŽæræuææÁæûç1çVçhçaçBçæÙæªæ–æ¤æÜçBçÒè~éAêë ìíî6ï^ð„ñ©òÊóßôãõßöÐ÷¿ø¬ù¤ú°ûÌüôþ-ÿwÎ8¶>Êa ù ‰ c˜©™e·Y¦Oö†úR“·¾±“Xý’š$Ár34[wˆ—¨»Ôô6EI@0æ¥OæhÖ&WleF È m •¡x¼þáüêúÛø¶ö‡ô_òKðHî^ìêØé=ç½æVåãóâûâ)ávàààgàß¹ß}ßYßNß^ß“ßèàUàÓá`áõâ‹ãã¯ä@äËåQåÖæ^æéçzèè½éqê+êìë°ìní"íÄîSîÜï`ïëðƒñ/ñëò·óšôžõË÷ø™ú=ûþýÎÿ m7ó¤J á k åR·e¬î,h¤ä#W|Š n!4!Ü"d"Ë# #)# "ì"Š!ü!A [P%è¦h0áʹ®¢“o^ R F : - ëÖÇÏ÷B±>Úzÿ©ÿ)þ•ýñý;üuû¦úÕú ù@øx÷¬öÜöõ"ô/ó-òñïæîÍíÂìÇëßë êJé éèmçÖç<æžåøåMä¥ä ãã7ãããaããä™å€æŒç³èçêëAìVíYîAïïÚð•ñNò òÎó™ôlõLö:÷3ø-ù&úûûÝü¯ýrþ&þÈÿQÿÃ${ÍiÁˆžFлºÎ ñ  P ªÐðòÜ­YÔ/n¢¬¶ÅçIŠÛ.†åBˆ¶Éµ{£€Ók»I‹ËV­ q ¹ û B  ¦ÁÈ­p³CÿÍþGüÅûTùêøŒ÷KöôöóÓò²ñ“ð{ïfîZíZìeëê­éóéJè¨èçXæ§åëå%ä[ã—âáâEáÍá€áeáxá®ââoâàãVãÏäOäÞåvæ æ«çKçàèkèðévéúê†ë%ëÝì´í§î¾ïóñFò°ô-õº÷Pøéú„ü!ý¿ÿ]î}ƒôg Ø A ¡ ö?{¤½ËÓÕÌ»Ÿp/ãuÕ*v°ä#ö±F¶4Yp„–´Ùþ+g¯nçløƒ { Ó  @ ] d S3ÓŸh4ÿËþ“ýTü ú»ùeøöõó‰ñûðtîþí ì^ë>êBédè£çþçlæíæxæå¹åqå?å%å)åGåz彿æ\æ»ç$çè'èÊéêxë…ì«íçï1ð{ñ³òÔóÚôÀõˆö9öÔ÷^÷Öø=ø˜øëù5ùyù¼úúHú˜úîûRûÄü<ü¹ý9ý¸þ4þªÿÿ„ÿå@œøYÁ/­DûÐÃÑò  O € § ÁÈ¿©…P¨4¦þ>`jeQ1ì–e+î¯n)ÒmþxÔZ Ä ü G « # ª M  à { 4ë¡Rº|@Í‹-µ(³Ôâ×ÿ¾þ”ý_ü%úÞù€øö§õ*ó²òPðÿï¼î‹íhìVëZêiéyèç²æßæåSä™ãëãOâÔââSâ[âšã ã¬äwå^æSçOèAé#éöê¹ërì)ìâí©î‚ïmðkñzò˜óµôÒõéöð÷âø¾ù…ú=úäû{ü üšý*ýÄþjÿ"ÿíǯ¥­À×ï    û êÖ½¦–Œ†y_+ÜwþvãG¦ÿJ‹Ç÷ Õuß-ê¨_ îɱ¦  — ‹ n >ú¤6·,›þvüêûeùíø|÷õ·ô_óñÒð¦ï“î•í«ìÜì&ë‰ëê•ê7éæéŸé_é%èõèÊè¨èè}èsèuè‡è¦èÓé éIé‘éäê=ê¡ë ëxëìì`ìÕíOíÏîXîçïzðð²ñ\òòÙó¨ô|õTö+öÿ÷Ïø—ùTú ú·û^üüªý[þþíÿϽ¸¸»º°™o4é ( ¹ D Ë P Ï @ ªi¿ R’ÒUë<ˆÊûߤ_·cÄ|;þÄŽ_4 ç È « u X 2 ý ¶ Y ê j ß D žð9x´ñ.k«í-o³ÿûÿDþ‡ýÃüóüû)ú-ù"ø öïõÉô ówòOñ,ðï îíAìˆëôëŒëIë'ëë$ë*ë,ë(ëë êûêëêèêñëëJë˜ëüìxí í¨îMîóï”ð.ðÅñUñäòróó‰ôôõ õzõßö3ö|ö¿öú÷0÷k÷¶øøˆùùÏú¢û“üŸý¶þÐÿê!()%õ Ô ¯ „ a MJ\‚³àÿÐ…à LddU:â¥Y`¢ÉÝÞдfE ,   (Cf•Ì Q”Ù$ÿmþ§ýÜý ü4ûRúfùwø„÷ˆöõ’ô™ó¤ò¯ñ½ðØïÿï/îsíÃíìëäëMê¿ê8é¶é<èÎèmèçÙçªçç†ç’ç·çúèYèÔélêêåë¿ì¥í˜îïŠðñqòXó<ô!õõðöá÷ÙøØùÝúæûéüãýÏþªÿp!ÄYâeã`ÚOÂ0•í8{¾P©ƒ  “ 0 Ð q  ¥ 9 ÃDÀ4œûP˜ÚJy ¿Úï&174)é´s!¾RÔEª W œ Û  C i‰£·ÇÑÞíAÿnþ›ýÍý üSû©û únùÝùOøÅøD÷Í÷e÷ö¸öpö-õíõ¬õdõôÄôjôóœó+ò´ò?ñÓñvñ*ðððÂðšðyðXð4ðïÎïŒïCî÷î§îVîí¾ííRí9í2í>í]í‹íÇîîlîÒïDïÄðTðõñ¨òhó5ô ôëõÒöÄ÷¾øÀùÄúËûÚüòþÿ2]Çÿ4a„Ÿ ® « – u C ûŸ1´#Ðg¹ìXÅ/—ôBƒ³Îο¡s5è‘/ÅRÜaÞQÃ6©r Î " m ± í " Lk„’šœŸ¦¯¶ÿ¾þÇýÒüßûðûúù"ø.÷4ö8õ:ô8ó3ò2ñ:ðJïgî•íÖí/ì ì&ë¼ëdëêéêÆê²ê´êÊêìëëHë…ëËììaì±íí_í¿î.î«ï2ïÆðfññÁò|óAô ôÖõ¡ön÷:øøÕù¡úhû&ûÙü‚ý!ý¹þHþËÿEÿ¸#Œøjäfí|§>Ó^áZË9¥  ø z  ¡ B ì œLú¤HßdÕ-j‰ŠrE ÁmµRê~ ( © % › y å P » $ŒòO§õ>¹ó1wÅÿ„þöþvþý®ýfý,ýüÝüÄü´ü©ü¢üšüŠülüAüû»ûcûúžú4ùÇùZøïø„ø÷¢÷)ö§öõƒôâô=ó–òôòZñÌñJð×ðwð#ïÛïŸïmïBïîüîÝîÁî¨î’î€î{î‡î§îÞï1ïžð$ðÁñqò.òöóÁôŠõSööÚ÷™øWùùÐúûTüüãý°þ~ÿHØ_"â [Ë‚8ë š C å  ™  ˆ ôZÃ1£ ,ÀVïŽ*¼B¶Uw|g3Ünña¾YšÖJ† » ç + ? HH>)ݰRÿ$ýøüÖû¾ú«ù¢ø¢÷¨öºõØõô=óˆòäòOñÈñPðåð‡ð4ïðï¼ï”ï{ïoïnïrïvïuïnï^ïDï#îûîÓî­îî{îvîƒîžîÃîëïïGïtïŸïËï÷ð)ð_ð›ðâñ;ñªò,òÁójô$ôòõÒöÁ÷¿øÇùØúðü ý*þFÿd|˜žšŒvX4  Ò ˜ U  ¬ < º%z»ï5Og~œ¥©¨¢•~].õ°_ ¥ B Û z  Ê } 6 ò ¯ j # Ù ‰ 4ߌ@ù¸}C»a÷yä7t¡ÂÞÿûÿ þNýüèüXûàû|û,úëú´úƒúRúùæù©ùcùø¹øT÷ë÷€÷ö·ö^ö õÉõõaõ>õõôäôÅô¤ôô`ôAô'ôôôôôô/ôQô{ô©ôÜõõDõtõžõÀõÞõõööö)ö<öRöoö’ö½öí÷&÷g÷­÷úøNø©ù ùwùêúgúêûqûþüŽý"ýºþTþòÿ‘3܉=ö«aÁk¾k  × ” L ý ¢ 9 ¿8¨ f¸E€·ë S…¸äÖ•?ÕYË.… Ð  H € º ô 3wºÿF’ã9ŽéG¥_ÿ¹ÿþ`ý¬üñü9û}ú½ùþùBøŠ÷Ý÷>ö«ö õžõ%ô·ôMóåó~óò®òGñÞñvñ ðžð0ïÆïZîôî”î@íòí®ívíFí$í íí ííFí}íÅîîŒï ï–ð3ðÛñ‘òTó(ôôõõëöé÷ïøýúû(ü?ýYþnÿ|…ŒŒ‚lIâœMò  ¤  Ž ó M Ÿ æ $ V  œ © ª ¢ “ ~ a C ! ý Û ¾ ¤ Ž } r o u € ” ­ Æ Ú ë ö ô ç Ì £ j ! Ë l  — " ¨ (¦#¢%¥#—ÿY¤ß)ÿ,þ*ý'ü*û7úUù†øÊø#÷’÷ö«öSö õØõ±õ˜õõõ”õžõ©õ³õ¹õ¼õ½õ¸õ²õ«õ¥õ õšõ—õ–õŸõ²õÏõôö öRö†ö¸öå÷ ÷!÷,÷*÷÷öäö¼ö‘öcö7öõöõçõéõúööNö“öê÷L÷ºø2ø²ù7ùÁúLúÚûküü¢ýHýöþ®ÿl-ñ·|AÆ/Õoûyç F ” Ô  0 L ` n y ƒ ‹ “ © ½ Ú þ ( V ‰ À ù 3 l ¢ Ð ÷  ) . '  õ Ì œ f ( æ   V  · b  ª Fßrþ€÷cÆ!vÆ[£é-ÿrþ°ýíý)üeû£úäú'ùjø®÷ó÷;ö‡õÙõ.ôˆóèóPòÁò?ñÌñkñðÞð¯ðŒðsðaðTðLðFðAð?ð@ðDðLð]ðvð™ðÇðþñDñ–ñóòZòÉó>ó½ôCôÒõiöö¨÷O÷øø¡ùFùèúˆû(ûÉüiý ý·þfÿÿÖ™a*óº>ô9ÊQË : Ÿ û K ’ Ð H ‚ ¿ C … Å  9 k “ ³ Å Ê Â ² œ { U ( ÷ À > õ ¥ T þ ¦ N ô – :Ü}²EÒZÛXÐHÀ6®'¢˜ÿÿ þ„ýþýzüöüqûíûjúêúoùýù•ù7øåø øhø8ø÷ñ÷Ö÷À÷®÷÷÷y÷c÷J÷,÷ öèöÆö£ö~öYö1ö õãõ½õ›õ~õcõJõ3õ!õõ õ õõ"õ;õYõ}õ¨õÙööRöšöë÷K÷´ø*ø©ù/ù¹úJúÝûqüüžý6ýÑþmÿ ÿªGã|"›f¹B|±â<eЬÎï1U|¦Ò7n©ä  Z • Ð H ‡ È P – Ù  Q … ¯ Ò ê õ ñ à  — b $ Ý ‹ + ¿ E ¿ -ëA‘ÚY“Ë9mÿ£þ×þýFüûÀûúDù‰øÓø#÷zöØöBõµõ3ô¿ôYôó¼ó‰óeóNó@ó;ó>óEóNóVó_ógóqó{ó‡ó—ó¨ó¼óÏóÞóéóïóïóëóåóàóÞóáóìóÿôôCôwôµõõ^õÊöEöÑ÷gøø²ùcúúÒû‘üVý!ýñþÉÿ¨ŒveWH5þÑ• K ô  ¡   Ý 1 } ¼ ð3EMJ<% × £ g Í q   / » H Ø k ŸAç>ð¦a!å¬v>ņAö£I耜&­2ÿ·ÿ:þ¼þ@ýÅýMüÕü]ûæûnúõúxùüùùø’ø)÷É÷t÷+öíö¹ö‘öqöZöIö9ö-ö#ööööö!ö,ö:öMöföƒö¡öÄöé÷÷:÷e÷–÷ÍøøKø”øâù5ùŒùçúEúŸúöûEûŽûÐü üEüzü­üáýýLý†ýÁýþþ=þ}þ¾þþÿ?ÿ€ÿÅ U£õHšé5ÅF†ÆR¡÷Q®qÒ4’ë>ˆÇù " C Z j u | ƒ Š • ¥ ¸ Ð ì ) F \ l s q c G ï ³ m Äcû‹˜“ ‰„‹*¹HÿÙÿeþëþmýéý_üÑü?û¬ûú‘úù•ù'øÃømø ÷Ý÷ ÷g÷.öóö·övö3õìõ¤õ]õôÖô™ôaô-óýóÒó«ó†óeóHó1óóóóó0óNóxó¬óìô3ô„ôßõEõ´ö,ö¯÷9÷ÎølùùÅúûAüüÊý‘þWÿÿâ¤e$á™Mû¢AÙiðnå W Æ - ì D • Ü  M u ’ ¤ ® ¬ ¡ “ ƒ n X @ (  ô Ö ´ Ž a / ô ´ n # Ö … /Ôt©AÖjÿ’"°;ÂCÀ7©|ÿàÿ?þšýòýIü¡ûüûYú»ú"ù’ù øø÷¸÷]÷ öÇöö\ö7ööõúõôõóõõõûööö"ö4öIöbö€ö¢öÈöõ÷*÷f÷¨÷ðø<ø‹øÛù,ùyùÂúúEú€ú¹úîû!ûRûû®ûÙüü#üCü^üwüŽü¤üºüÕüóýýEýzý·ýûþIþþøÿXÿ¾'“tèYÉ7¢ lÌ)„Û/‚Ó f¦à:Xlvwn]G, îÏ­mJ'ݶkH' öçáâèï÷ÿüîÕ±ƒNË~.ÝŒ=ð¤ZÄy*Û‡/ÿÓÿnÿþþýŽýüuûãûMú·ú#ù‘ùøø÷Œ÷ öÂöpö*õðõÂõžõõnõcõ^õ`õhõtõ„õ—õ®õÉõäöööCöiö“öÁöö÷2÷u÷Àøøeø»ùùgùºú úTúœúáû%ûhû®ûøüIüžüúý\ýÄþ1þ¥ÿÿ—• ¡—Šý}ýzø u î a Ì 0 Š Û $ b ” · Î Þ ä á Ö ¾ ™ g ) á “ = Ú o ý ˆ ›%®7¾FÎUÚXÕPÈB½8³0ÿ²ÿ4þ¸þ@ýÉýUüãütüû–û*úÁú]ùþù¢ùLøüø³ørø8ø÷Ü÷»÷¢÷‘÷ˆ÷„÷„÷†÷÷–÷¡÷«÷³÷»÷¿÷À÷Á÷À÷À÷À÷¿÷Á÷É÷Ó÷ã÷øøø2øXøƒø¶øìù$ù^ùšù×úú\ú£úîû=ûûãü:ü’üëýEý¡ýÿþ`þÅÿ.ÿ› zíaÕFµÞ6…Ì Dx¦Ïó/H^tˆš«ºÅÌÐÏËĺ¯¢•‡{qjea_]YUNF=2#üäË´œ€dF&èÅžq=Áy+Õz»[ý Cÿéÿ‹ÿ.þÏþoþ ý§ý@üÖümüû—û,ú¿úRùåùzùø¶ø[ø÷¾÷}÷J÷"÷öúöú÷÷÷:÷a÷‰÷´÷ßøø-øMøhø}øŒø˜ø¢ø­øºøÇøØøìùù"ùDùjù–ùÆùùú,úaú˜úÐû ûFûû¾ûÿüDüŽüÞý3ýŽýïþWþÈÿ@ÿÂH×j—/Ç]ï}ŠõaÈ ( Ô ! f ¡ Ó ú  & . *   å » ‰ P  Ï ‡ 9äŒ.Ík¤Aáƒ(Ñ|*ÚŒ@÷¯h"Û“Jý¬Yÿ¨ÿJþêþˆþ%ýÀý\üõüü(ûÀûZúôúú0ùÕù}ù-øåø¤øiø5ø÷Þ÷·÷–÷v÷X÷=÷%÷öþöðöæöãöæöï÷÷÷2÷V÷÷µ÷óø9ø†øÙù3ù’ùöú^úÈû4û¢üüyüáýGý¨þþ[þ®þùÿAÿ…ÿÃÿû._Œ¶à 9h™Èù+\¾îKy¦Òý'R~«Ú :i˜Äî4To†™¨·ÃÍÔ×ÕÍ¿«‘rQ+Ô¥tA סi2ûÊQߪwGé»d9廑g=ÿêÿ½ÿÿ_ÿ,þöþ½þþ=ý÷ý°ýgýüÖüüKüûÈûˆûIû úÈú†úCùÿù¼ù{ù9øüøÂøŒø[ø1ø ÷í÷Ñ÷¹÷¥÷–÷Œ÷ˆ÷ˆ÷Œ÷•÷£÷µ÷Í÷êø ø4øcøšøÙùùnùÃúú€úæûOû½ü.ü ýýˆýûþoþãÿXÿÉ7¥yáE¨ hÆ#€Û4ŠÝ*r´ó-`ޏÞ>[u¢´ÃÎÖÙ×Ðij€^8 Ü©q5ö³o)á™N²a ¶]¤Dày )ÿ³ÿ<þÃþJýÔý_üìü|üû¦ûBúâú…ú,ù×ù†ù9øîø¨øfø)÷ñ÷¾÷‘÷k÷J÷/÷÷ öÿöüöÿ÷ ÷÷8÷X÷÷°÷éø'økø´ùùNùœùêú9ú‡úÕû#ûrûÂüügü»ýýcý¶þþWþ¤þìÿ/ÿoÿªÿà?l—Àê=h–Çú0j§ê0|Êl¿]¦è"T}ž·ÉÓ×ÕÍÁ±ž†lN. 上Y%ï¶y;ù·u3õ¹€Lò̬‘ydO<*ðÛÆ³¡‘‚vi]PD7(ÿëÿÐÿ°ÿÿgÿ=ÿþÞþ¨þoþ3ýñý¬ýbýüÃüqüûÄûmûúÃúrú'ùáù¥ùqùEùùøêøÚøÓøÏøÑø×øáøïùùù/ùLùoù–ùÁùóú)úfú§úêû0ûzûÆüücü³ýýQýŸýìþ8þƒþÌÿÿYÿšÿÚM‚³â<kšÊþ4m©é-s»M™å/xÀI‰Ç7i˜Åí0I\ktyytgR5å²u2ç”<Üy¥8Ê\ï„¶Sô™?ÿêÿ”ÿ>þçþ‘þ8ýàý‡ý-üÕü}ü'ûÕû‡û=úùú¹ú~úIúùêùÁùœùzùZù;ùùøêøÒø¼ø§ø”øƒøtøiø_øYøUøWø\øeøsø†ø ø¾øãù ù<ùqùªùéú,úsú¿ûûeû¾üü{üßýEý®þþ†þóÿ_ÿË3›gÊ(ƒÚ-|Æ H€´ã 4Wx•±Êàó  þìÕ»Ÿ‚dH.þéØÉ¼±¥™ŠyeM1ñÌ£wH赂P꺌^2ܲˆ\/ÿÒÿŸÿmÿ<ÿ þÛþ¬þ€þWþ0þ ýìýÌý¯ý”ý|ýeýPý:ý#ý üòüÖü¸ü–üqüIüûòûÅû™ûnûFû$û úôúåúßúßúåúòûûû5ûPûkû‡û¡û·ûÌûßûðûþü üü$ü2üAüSüfü|ü•ü²üÒüôýýAýlý˜ýÄýñþþNþ|þ«þÙÿÿ8ÿiÿ›ÿÏ;u°î.o²õ9Å Vã(l®ë$ZŒºä *Hc{¢¯·»º´¨—b?ð“a-ùÄŽX!ë´}E Ó˜\à `Û˜WÿÖÿ•ÿSÿþÕþ–þVþýÕý’ýOý üÇüü:ûôû®ûiû%úäú¦úiú/ùúùÆù•ùgù<ùøðøÑø·ø¡øø„ø}ø}øø‹øœø´øÒøöù!ùRù‰ùÆú úUú¦úþû[û¾ü%üüûýiýÖþBþ¬ÿÿwÿÖ1‰Ý-yÀ@x©Öý9Oap|‡‘›¥°»È×çø 0DXl€”§ºÌÞï&8IYempmeVA&áµ…PÙ–P¸hÆt#Õ‰?ÿúÿ¶ÿvÿ9þþþÄþŒþUþ"ýòýÅýœýxýXý=ý'ýý ý ýý ýýý ý&ý+ý.ý.ý*ý#ýý üúüèüÔü¾ü§üüwü_üJü5ü#üüûûûòûíûêûëûîûñûöûûüüü üüüü"ü)ü1ü<üKü]ütüü²üÙýý7ýný«ýíþ4þ~þÊÿÿeÿ±ÿüCˆË Dz«Ø*Or”µÕô0Mk†¡»Ôë-BWk~’¥ºÎãø !4DQZ_`\SE2äà|T)ûË—`'è§dÓ‡:ížOÿ³ÿeÿþÍþƒþ:ýñýªýdýüÝüœü]ü ûäû©ûpû9ûúÔú¨ú~úXú7úúùêùÙùÍùÄùÀùÀùÄùÌù×ùåù÷ú ú%ú?ú\úzú›ú¾úåûû<ûmû¢ûÚüüXüžüèý4ýƒýÓþ$þsþÀÿ ÿTÿ™ÿÚO†ºìN}«Ù2]ˆ±Ú'Lo’´Ôô0Jcz¢³ÁËÔÜâæèèåáÙÏÁ¯šƒjM- 当f7Ô¢n;Óži6Ï›g3ÿÑÿŸÿoÿ?ÿþçþ¿þ˜þuþTþ6þþýïýÞýÏýÃý¹ý°ý¨ý¡ýœý–ý’ýýˆý‚ýzýpýfýYýLý=ý.ýý üûüéü×üÅü´ü¥ü˜üŠü}üoübüVüJüBü=ü<ü?üEüQü`ütüŒü©üÉüìýý7ý`ýŠý´ýÞþþ0þYþþªþÑþùÿ ÿIÿsÿÿÉÿôHp˜¾àþ/AP]dimqwŠ–¦¸Îæ'Mw¤Ó6iœÏ/\†­Ðð %:LYadbZL9Ú®{BÂ{3êŸT Âz4ï¬l.ÿôÿºÿÿHÿþÙþ£þmþ7þýÌý—ýcý1ýüÔüªüƒü`ü@ü#üûðûÙûÆû´û£û“ûƒûsûcûRû@û-ûûúõúäúÔúÆúºú±ú«ú¨ú«ú²ú¿úÒúéûû%ûJûsûŸûÐüü?ü}ü¾ýýMý—ýåþ6þ‰þÜÿ1ÿ‡ÿÛ.‚Ö(yÈ`¨ì-i Ò,Qs¨»Ë×àåèèãÛг¡ŽxaJ1þäʰ—~eM5ïØ¿¥‰mO0íÊ¥~V.ܲ†X+ÿýÿÎÿŸÿmÿ<ÿ þÙþ©þzþMþ ýôýÊý¡ý{ýXý8ýüþüæüÐü¾ü¯ü£üšü•ü’ü’ü“ü—ü›ü ü¥üªü±ü¸ü¿üÇüÏüØüäüñýýý)ýAýZýtýŽý©ýÆýâýþþþ6þPþiþþ˜þ­þ¿þÐþáþðþþÿ ÿÿ"ÿ-ÿ7ÿBÿMÿYÿfÿtÿƒÿ’ÿ£ÿµÿÈÿÜÿò!<Yw–¶Öö5SoФ½Öí2Ib{”¯Ëè#@[sˆ˜¤­±°¬¤šp`PA1"ðÞȲ™|_?ùÕ¯‰d>÷Ô±lI%ÿßÿ¹ÿ’ÿjÿAÿþëþÀþ“þfþ9þ ýÝý°ý„ýZý2ý üèüÇü©üŒürüYüBü,üûÿûéûÓû¼û¥ûûzûfûTûBû4û*û"ûû"û*û9ûOûiû‰û¯ûÙüü:üqü¬üìý-ýrý¸þþJþ–þãÿ0ÿ}ÿÈXßZ“Èü,Y„«Ïð,F^u‰›­½ÌÚæñû  úòéßÔÊ¿µ©œ}jU="⽓f5Ê‘UØ™XÿÜÿŸÿdÿ-þøþÆþ—þlþCþýúýÙý¸ýšý|ýaýGý/ýýüôüåüÙüÏüÉüÆüÅüÈüÍüÕüßüêüöýýýý(ý3ý=ýGýPýXýaýjýsý}ýˆý•ý¡ý¯ý¾ýÎýßýñþþþ'þ:þMþ`þrþ„þ–þ¨þºþÌþàþôÿÿÿ4ÿLÿfÿÿžÿ¼ÿÜÿýDiµÜ'Km«Æßö )5@IQX]aceffeb`]ZWTQNLJHEB?>;:865444444432/*# ÿíÚêmL)ß¹‘jAÿðÿÆÿœÿqÿFÿþñþÆþþtþKþ%ýþýÙý´ý’ýpýOý0ýüùüâüÍü»ü¬ü¡ü™ü’üŽüüŽüü“ü˜üžü£ü¨ü®ü³ü¹üÀüÇüÏüÙüäüñýýý+ýCý_ý|ý›ý»ýÞþþ$þHþmþ’þ·þÝÿÿ*ÿQÿxÿŸÿÇÿï>gºä<h”ÀíGt Ëô@cƒ ¹Îàïü  úîÝɲ—{[:ôϪ„]8íÇ¢}X3éÄ {V0 ÿçÿÁÿœÿwÿSÿ1ÿþòþÔþ¹þŸþ…þnþWþAþ-þþýñýÞýËý¸ý§ý–ý†ýwýjý]ýSýIýBý<ý8ý6ý6ý6ý9ý<ýAýGýMýTý[ýcýjýrý{ýƒýý•ý ý¬ý¹ýÊýÜýñþþ"þ?þ]þ~þ þÃþåÿÿ*ÿKÿlÿŒÿ«ÿÉÿå6Ql‡¢¼×ð !7L^n}ˆ“šž¡££¢¡ œ›››œž £¨¬²¸¾ÆÏØáëôþ"*07<BFIKJHC<1$ëÒ·š{\;öÓ¯ŒhF#ÿßÿ»ÿ˜ÿuÿRÿ0ÿþíþÍþ®þþtþYþ?þ(þýÿýìýÚýÉý¸ý©ýšýý€ýtýiý_ýWýPýKýGýEýEýGýIýMýRýWý]ýbýhýmýqývý|ýý‡ýý”ý›ý¤ý®ý¹ýÇýÖýçýúþþ'þ@þ\þ{þþÁþçÿÿ;ÿgÿ•ÿÅÿõ$V‡¸çCošÃì9^„§Ëì *F]r„‘šŸ –Š|jU?& ñÕºž‚gM3ëÔ½§’}hR<%õÜêv[@%ÿíÿÏÿ°ÿÿoÿLÿ)ÿþßþºþ”þoþJþ'þýäýÆý©ýýwýaýMý<ý-ý!ýýý ýýýýý ýýý(ý8ýJý_ývýýªýÆýäþþ þ>þ\þzþ™þ¶þÔþñÿÿ*ÿEÿaÿ{ÿ”ÿ¬ÿÂÿ×ÿëÿü &1:CLT\enwŠ”Ÿ«·ÄÑßîý ,<KYeq{„‹’—œŸ£¦©­²¶º¾ÁÃÄÅľ¹²ª –ŠrfYM@5) úóíæßØÑʺ±§›Ž€qaP>+ÿîÿ×ÿÁÿªÿ’ÿzÿbÿJÿ1ÿþÿþäþÊþ°þ–þ}þdþLþ5þ þ ýùýèýÙýÌýÁý·ý¯ý©ý¤ý ýžýœý›ýœýžýŸý¢ý¦ýªý¯ýµý¼ýÄýÎýÙýåýóþþþ'þ<þRþjþ‚þ›þ¶þÓþðÿÿ,ÿKÿjÿŠÿ«ÿÌÿí -MlЧÃßû.G`wŒ£¹Ðçþ)>Rfxˆ—¤°ºÂÈÌÎÍÌÉÆÁ»´«¢—‹~p`O<'öÚ½ž~]:ņ̃\6ÿïÿÌÿ©ÿ‡ÿfÿDÿ$ÿþâþÁþ¡þ€þ_þ@þ"þýéýÑý»ý¨ý™ýŒý‚ýzýtýpýnýnýoýrývýzýý…ý‹ý’ý›ý¦ý±ý½ýÌýÛýëýýþþ&þ<þRþjþƒþœþ¶þÐþêÿÿÿ5ÿMÿdÿzÿÿ£ÿµÿÆÿ×ÿçÿ÷%5DTdu…—§¸ÈÙéù *:JZiz‰˜§µÁËÔÜáããàÛÔËÁ¶©œŽ€rdVG8* þîàÑõ¨šŽƒyphb^[YZ[_cglptvxxvrld[OA1 ÿùÿäÿÎÿ·ÿ¡ÿŠÿuÿ_ÿIÿ3ÿÿþóþÞþÊþ¶þ£þ‘þþnþ_þPþBþ7þ-þ%þþþþþþ$þ,þ5þ?þKþWþeþsþþŽþœþªþ·þÄþÐþÛþæþïþùÿÿ ÿÿÿ)ÿ4ÿ>ÿJÿVÿaÿmÿyÿ…ÿ’ÿžÿªÿ·ÿÃÿÐÿÝÿëÿú*<Pe{“«ÄÞú1Nk‡¢½Öî.@P^jt{€ƒ„‚}vl`RB1òÛê‘w]C)öÜÄ«“{cL4ÿòÿÛÿÅÿ¯ÿ™ÿ„ÿnÿXÿAÿ+ÿþþþèþÓþ¾þªþ–þ„þrþaþQþCþ6þ*þþþ þýÿýúýöýòýðýîýíýíýîýðýóý÷ýýþþþþ#þ1þ?þPþaþsþ‡þœþ²þÈþßþ÷ÿÿ'ÿ@ÿYÿqÿ‰ÿ ÿ·ÿÎÿåÿú$9Mat†˜©¹É׿ô)6BNZdnw~…ŠŽ‘’‘Ž‹†xqh`WNE<4+$ þøòëäÝÕÍż²¨ž“‡|qeZNC8-! ÿ÷ÿìÿâÿØÿÍÿÂÿ¸ÿ­ÿ¢ÿ—ÿŒÿ‚ÿwÿlÿbÿWÿNÿEÿ<ÿ4ÿ,ÿ$ÿÿÿ ÿþþþøþòþìþèþãþßþÛþØþÕþÓþÑþÏþÏþÏþÏþÐþÑþÓþÖþÚþÞþâþçþìþñþ÷þûÿÿÿ ÿÿÿÿÿ!ÿ&ÿ,ÿ3ÿ:ÿBÿKÿUÿ_ÿkÿyÿ‡ÿ•ÿ¤ÿ´ÿÃÿÒÿâÿñÿÿ )8GVfxбÅÛñ4I]o€¨²ºÁÆÉËÌÊÈľ¸±© –‹sfYL?1$ùëÝе¨š€rdVG8(ÿôÿáÿÏÿ»ÿ¨ÿ“ÿÿjÿUÿAÿ,ÿÿþñþßþÍþ¼þ¬þœþŒþ}þpþcþWþMþCþ:þ3þ.þ*þ(þ'þ)þ,þ1þ7þ@þJþUþbþpþþþ þ²þÆþÙþíÿÿÿ+ÿ@ÿUÿjÿÿ”ÿ¨ÿ»ÿÍÿßÿð,9DOYbkry€‡“™Ÿ¦­´¼ÄÍÖàéóý"*16;?BDFGGFEDB?<83.(!úîàÒ² Ž|jWD2!ÿôÿçÿÚÿÏÿÆÿ½ÿ¶ÿ¯ÿªÿ¦ÿ£ÿ¡ÿŸÿŸÿžÿŸÿŸÿ ÿ¡ÿ¢ÿ£ÿ¤ÿ¤ÿ¤ÿ£ÿ¡ÿžÿ›ÿ˜ÿ“ÿŽÿˆÿÿyÿqÿiÿaÿXÿPÿHÿ@ÿ8ÿ2ÿ,ÿ&ÿ"ÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿ ÿÿÿÿÿ$ÿ+ÿ2ÿ:ÿBÿKÿTÿ]ÿgÿpÿzÿ„ÿŽÿ™ÿ¤ÿ¯ÿºÿÆÿÒÿÞÿëÿ÷&1=HS^hr|†™£¬µ¿ÈÑÙâìõþ '.5:?CFHIIHFDA=951,'" úïãÖȺªš‰ygUC1 ÿùÿæÿÓÿÁÿ®ÿ›ÿ‰ÿxÿgÿWÿGÿ8ÿ*ÿÿÿþöþëþáþ×þÍþÅþ¼þµþ¯þªþ¥þ¡þžþœþœþœþžþ¡þ¤þ¨þ­þ³þºþÁþÈþÑþÚþãþíþøÿÿÿÿ*ÿ7ÿDÿRÿ`ÿnÿ|ÿŠÿ˜ÿ¦ÿ´ÿÂÿÏÿÝÿêÿ÷*6BMXcmv€‰‘š¢ª³»ÃËÓÛãëòú !! ùðçÝÓɾ²¦™Œ€sgZNA5*ÿþÿôÿêÿáÿÙÿÑÿËÿÅÿÀÿ¼ÿ¹ÿ¶ÿ´ÿ²ÿ±ÿ°ÿ¯ÿ¯ÿ®ÿ­ÿ¬ÿ¬ÿªÿ©ÿ¨ÿ¦ÿ¤ÿ¢ÿ ÿÿšÿ—ÿ”ÿÿÿ‰ÿ„ÿ€ÿ|ÿwÿrÿnÿjÿfÿcÿ`ÿ]ÿ[ÿZÿYÿYÿYÿZÿ[ÿ]ÿ_ÿaÿdÿfÿiÿlÿpÿtÿxÿ|ÿ€ÿ„ÿ‰ÿŽÿ“ÿ™ÿŸÿ¥ÿ¬ÿ²ÿ¸ÿ¾ÿÃÿÉÿÎÿÓÿØÿÝÿâÿæÿêÿïÿóÿ÷ÿûÿÿ $).38=AFKPV\cks|†›¦²½ÈÓÝæîõúþýùôïéãÝÖÏÈÀ¸¯¦“‰~sg[OB6)ÿûÿðÿæÿÜÿÓÿÊÿÁÿ¹ÿ±ÿªÿ¢ÿ›ÿ”ÿŒÿ…ÿ~ÿvÿoÿgÿ_ÿWÿOÿGÿ?ÿ8ÿ0ÿ)ÿ"ÿÿÿÿ ÿÿÿþÿþýþûþûþûþûþýþÿÿÿÿÿ ÿÿÿ"ÿ*ÿ4ÿ>ÿJÿUÿbÿpÿ~ÿŒÿ›ÿªÿ¹ÿÈÿ×ÿåÿô+8DP[fpz„Œ•œ£ª°¶»ÀÄÈËÎÐÑÒÒÒÒÑÏÍËÉÆÃÀ½¹¶²­©¤Ÿ›–’ˆƒ~ytoid^XRKD=5-% ÿøÿîÿäÿÛÿÒÿÉÿÁÿ¸ÿ±ÿªÿ£ÿÿ—ÿ’ÿÿ‰ÿ…ÿÿ~ÿ|ÿyÿxÿwÿvÿvÿwÿxÿyÿ{ÿ}ÿÿÿ„ÿ‡ÿŠÿÿÿ”ÿ—ÿšÿœÿŸÿ¡ÿ£ÿ¥ÿ§ÿ©ÿªÿ«ÿ¬ÿ®ÿ¯ÿ°ÿ²ÿ´ÿ¶ÿ¸ÿºÿ¼ÿ¾ÿÀÿÂÿÅÿÇÿÊÿÍÿÐÿÒÿÕÿØÿÛÿÞÿáÿåÿèÿëÿîÿñÿôÿøÿûÿÿ #',048;?BFJMQUY]aeimquy}€„†‰Š‹ŒŒ‹Šˆ†„~zvsokgd`\YURNKHDA=:62.*&! ÿþÿùÿóÿíÿçÿáÿÚÿÔÿÍÿÇÿÀÿ¹ÿ²ÿ«ÿ¤ÿÿ–ÿÿˆÿ‚ÿ{ÿuÿoÿjÿeÿ`ÿ]ÿYÿVÿTÿRÿPÿPÿOÿOÿPÿQÿSÿUÿXÿ[ÿ_ÿdÿjÿoÿvÿ}ÿ„ÿŒÿ”ÿÿ¦ÿ¯ÿ¸ÿÁÿÊÿÔÿÝÿåÿîÿ÷ÿÿ ")/5:@EKOTY]bfimpsuxz|}€‚ƒƒƒƒƒƒƒƒ‚‚€}|zwtqnjfa\WRLF@:3,% ÿûÿôÿíÿæÿßÿØÿÒÿÍÿÇÿÂÿ¾ÿºÿ·ÿ´ÿ±ÿ¯ÿ­ÿ¬ÿ«ÿ«ÿ«ÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ°ÿ±ÿ²ÿ³ÿ³ÿ´ÿµÿ¶ÿ¶ÿ·ÿ¸ÿ¹ÿºÿ»ÿ¼ÿ½ÿ¾ÿ¾ÿ¿ÿÀÿÁÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÊÿÌÿÎÿÐÿÒÿÕÿ×ÿÚÿÝÿàÿãÿæÿéÿëÿîÿñÿóÿöÿøÿûÿý !%(+.135789:::::::::::::;;;<<==>>>???????????>>=<<;987531/,)&# ÿÿÿúÿöÿñÿíÿèÿäÿàÿÜÿØÿÔÿÑÿÍÿÊÿÇÿÄÿÂÿ¿ÿ½ÿ»ÿ¹ÿ¸ÿ·ÿµÿ´ÿ´ÿ³ÿ³ÿ²ÿ²ÿ±ÿ±ÿ±ÿ±ÿ±ÿ±ÿ²ÿ²ÿ²ÿ³ÿ³ÿ´ÿµÿ¶ÿ·ÿ¸ÿºÿ»ÿ½ÿÀÿÂÿÅÿÇÿÊÿÎÿÑÿÔÿØÿÜÿàÿäÿèÿìÿðÿôÿùÿý "&*-047:<?ADFGIKLMNOOOOONNMKJHGECA?<:8531.+)&#  ÿýÿûÿøÿöÿôÿñÿïÿíÿìÿêÿèÿçÿåÿäÿãÿáÿàÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿÙÿØÿØÿ×ÿ×ÿÖÿÖÿÖÿÖÿÕÿÕÿÕÿÖÿÖÿ×ÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿßÿàÿáÿãÿäÿæÿçÿèÿêÿëÿíÿîÿïÿñÿòÿôÿõÿ÷ÿøÿúÿûÿüÿþÿÿ  ÿÿÿþÿýÿüÿûÿúÿùÿøÿøÿ÷ÿöÿöÿõÿôÿôÿóÿóÿòÿòÿñÿñÿðÿðÿðÿïÿïÿïÿïÿïÿîÿîÿîÿîÿíÿíÿíÿíÿìÿìÿìÿìÿìÿìÿëÿìÿìÿìÿìÿìÿíÿíÿîÿîÿïÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿüÿýÿþÿÿ stk-4.5.0/rawwaves/tomlowdr.raw0000644000076600007660000011444012327014024014360 0ustar garyÿ–ÿmNõÄåãíŒåEÚÏØgÕ¦Ó­ÐÀÍÀÍ$Ì8ʆÊIÊÌ&ÌlÌ*ÎÅÑÒÍÔPÕêØÕÜJÚlÞjäHÝ7â,ìääÀáií)ôHîçwîöUõ³óºóšòÓðEõHÞ½ôtíÏô"ûÒþsûFò·ò=ÿK „e ´öè<ÝÔ¡Ó‹áÏüŽ® î)£0=8AÂNß`1p zIz_oñe®bT_•X³RÄPKíHK1S·]!b`XÈQFN!NnN“O6RþXeYViQ!J`FYE8EF×J&KYG;Ï-³"Ì;iÛhÒy+0 5œãü¯ø€òBë'æ—å@äå䀿ÖìïLî¡ìóí;ïäò1ñ—ïîŠíãëDåõá£áÊåÅéÊë>ì3ïøøO¶Æþsù øoúü1ûùõüòbïí‰ï=ôZû5ÿùü×ù øØûÑð ±D÷\îìVñÑý=›¸—û&í–ååçSï;ø˜þ4ÿþÀþ3ûÆ÷¬òÐìbãAÙÌÔÉÕyÙKÞ$ãlé(î‰òòhï ê8å[áŠàMà˜áâFääÆã)Þ…×8렂 ÂìÃ,ÆÅËçÒöÜ×èÈôÐÿÑ %ÁðÀÒ ‡ æEƒüÔõÍðŒíYëjêòëÄëµéjåÒâ^ߨÞ-ÝŸÜóÛÂÙÈ×5ÔÊÓÿÖÕÜ‹á³åuéZîió™öÖ÷Ä÷8ö1óëïÕìê³ì[ïxñ¼ñíèá奿VêUï˜ôñù ûûôýÂÆWö§ýTöþñ5îð õúXüŒû‘÷Öò¢íÚë%ëHí^ï®ðqîìëåé"èèèvé„ëyî'ð!ðÒîÆéJã‡àß’à¡á#à ÞhÞ ÞÍßpàYâCåEèÇêðêõéeç\å´åBç¦ëÂîiï)ïºðµñÔòóóÖõŠøFùêøóõï›êsæ,âÀàxàBâå¿ëUò#ùÐþ UCw÷ý eL9YDwî¢ ø(“/€3Â5´7­:Œ<Ï> >Î?N@@Ñ@“?;Ø7+2t. +…)=(4(\)´*ô)ª%X‚o” ä Á:¼Ù G ›|Û;Q° "3#“%$'=)™-1Ø7ˆ;í<Ô:µ6Û1Ñ,»(é&è&Q&º'w'£())*h+Î-¡.a,ï)F"Á:ŸI êZ|妾íí vQ;«ÌŸ V } [@‰ÿþó{Wˆ Ü  ‡ ²±º¥ =ÿùûù:û)ÿÔ]å×βѬc ‚ ÝÑX¸ ~ nýÅú øø,÷ê÷çøøgø‡øJøÁú û2ûCú£ùéù¯úúÄû@û>ú)öíñÏìvçâßÏá²æîíñ¦ôSö{ùü`8¨‘ Zùôï8ã®ÙÒÒçϫϢÑÙÕØXÛ]ݱ߻â^äìæcçQèäë¼ïôôwøúæü›ü&ùŠöBó£ñ¿ðÉðåñWòSôÅøUû[ü4ú,õ›îêæÝßÙ Ö²ÕÔ©ÖÙOÝÈâ¤ç¶í„ó#÷%ùmúlúŒú!ùMø¼øÐøž÷ÿ÷/ö.õÿ÷9ù,û=ü”üù>õ1ñLî˜í]íríØí&ë8èÐæLãÛâgââ$âáæáàã)å¸è±ìïèó·öˆ÷|õóò|î¡ëœéêé?èçèæ<ãàâàêàªáçä.æ‹èSè”ç®æ”åkäˆääåZçFèñéÐéÖé_è·è}éNëŠïcóê÷‰ù¸úÉû!û¦üôþŸDƒYþƒüeúLùLúZý"Aµlýø»óÊî»ê¤èyèèóë%î¬òÿ÷ùûûòýyÿp²å °C!û)-^-­*Ç%×ÛÄ[{ B OÿäXjêMÿJûÞøõÅõœöDö-õÇõË÷ú± Ä´ôë,Þ‡Zñ” 2 Gn›‰n‘<ç2#î– [!X ¥ êE "ã' ,2Õ95>NBDADGB›?Ý<$701N+3%¡!/Óe›Æï¸³jy©K“e© ÕÀˆ04: 1áS& þ$u("+*, *­($ã!ˆ[7Ã÷™"‘‘ø0 ù`Òµ2- ùÏå Ø  ° 5,@å-FVMÃûTÿ(úÆõöñ|îZí3í6í@í ïñ4ó¹öKøLùµûü]ý9ý:ûËù²÷Üö+ôŠò°ð‘î€ìiêHèŸçèèpê­îáóãø!ûü•ý ý™þ/þºÿ¢CÔ¼  ² £ º  qÑ~Ló£½2ÿZûµ÷òíçãâ´Þ1ÚÚØÈ×ç×ôØT؈ØwØ]Ø×dÖ©Õ•ÔÒdÑПдÐÏæÍÕÉíÄåÀ¼û¼X¾UÂ4Æ´ËÄÑ:ÕÉØþÛ}ÝÿàÇãDäàåºæ+åýåZäèäÆäÈåIæ—è€êííºð—óî÷éûÌÿ²j µÖ(Çw®  ’=K ß«ÙknÖ Í ÊâŠK<`¢¡ÊýÒùõõQðlìBé4çNæÏçwèéÊê{ê™êòìDîñLó¨õõ­ö–ø;ùòú~ùi÷óùðTì¾éÑçså¸å+娿®æ·åîä±ãàÂÝvÙø×Õ„ÕpÖ½ÙÛúÞÁá*ã:å/çkêí'ð•ócôÈöø­ý™— ¦P®F;è» tp ´ó-~Î_«EâÆ!êŸW<”ôÙ±R * #xA Ó e"í·ÚHY‚ײõ U S ä ÚT¨§he ¶q… ö…èˆ Ë B ¶ ÞÆíPIp,)fT®!/"^#"ì!rËÈÑÀ,ù*ZƒŒZÙJ ö$(b+ö/1a2h281!/á.ö.\.2.a.M-á-‚-3,%)ô&â#L -m4â %H:[¾ä± F ‰ JßðHýRù*ôÓðÂíMêgèæÎæàè¶ëøï¤ó#õõ÷ÒùúRûûþ/ø(B – b ¸´kõº¡œ4 á gQ=B:  ™>ÿeýBûšúùoútü÷˜½Ÿ à ã̽ Û ìÁˆüNù*ö›ôÙôôô”õwö>õîô6ñtîê›ç£åUãšáòàÞ0Ü*Ùë×GÓòÐ#ÌžÊ$ÈÿÈìÉÆË‰ÍØÐHÒ—Ô¿ÖáØ¡ÙúÛ ÜEÝÐ߸âäÔè ë2íõðcònóÀôõõÊöÕø/ù°úÆúáú>ù$÷û÷¸øéû]þ±lßÄ ! Í þÉéq c   1aþ“û÷ô*ñîWëÏé¨ç“åTãà­ÞaÜeÛÚÛzݰàÊãúæ èªéðéÓèålâ[ßrÝÛ4ÙúÙeÙ^ÙÿÛÃÞóãDè%ì­ð:òÌôù÷xúJüõþñÿ“þeû²ø^õEòåñ]ðžð©ñzòÈôZö ÷Ùù’úaù÷0óÅð¾ï,îñïnðKñKòYó—õY÷ùûÿjI«÷;tÙ ¾ :ØH¨ ^ UˆIþûòûû)ü}þƘ€ÿ  Ï x àQ á ˜ 2 û ÙÌpýéüÀý.ÿ(Zö H | Ó D Ûþøíó îcéVäôáóààxá!âãGäÌæúêíºñ ó÷ökøRùŠúLú¾úÚú´úûüŒþújß ÃÎß±ü"Ì&n)ù-/J0w0†/·.o-H,Ÿ,ï.O0$1Õ2½2o0Ç-ù*î(L&$C"! ¨E³1‰.Á8ãµt/Üe±zˆÄL(ìO    ÇR†SDX[½ 2é¬>§$õæ8v J U  ¤ xä™t » eÄÃ3ÛÎ/ïT„˜ä:) ˜?ZþÀû&÷póôñZïØï´ñ.óê÷Júqü¿þ þþ“þ&ýeü†ûÒûšû´û±ûfû,ûFû~ûÌü%üHü—ý…ÿ=€Y Tèvç+c× Ûˬgÿ û†øô·ñÙï‰íëhèåKáéÞªÛ³Ø÷Ö$ÓKÐÑÏYÏHЪÓ5ÖAÙBÛùÞß‚àYàçáà›ßvݧÛVÙ@ØØ;ÙØÜQßáã¸å´ç¦édê§êØé¥çKäqáõà›àÜâ©åéGìêðòÿõ›÷Šø§ùcúLûlüŒýƒþ9þfýÏü”ûùøf÷;öõTõGö6ø^ûÈ w› GXÃÔH» ä (Ö¨€ÌÆ^F4ÿÚü ùõžò©ðEîÛîZî`î©îÒî·î[í½ìÃë¯ê­é‚èæÖåüåhååäúäÒä äâäáÞ³ÜÙq×$Õ£Õկ׉ÚbÝÐá'ãºå]æ1æzæ‘æÝçëêì°ïð´ñ—ñðÛð=ðxñ ó·öØú˜þvLà” V n¥ÙWXg÷ 9 xÀ®Å{{ ° ¸ ™ ›  ƒ ] ?Õ1{˜,4½}  •  Ò£%¿ä¥Î= ’ ¦Ÿ @اõ¯Ñ´e s;<ÈõÎ f - L ¶ V  { [ • ÷®}Œ ð û —´3æ.q » í¿Õí¿ô"“$†%ž&%á%c$Û$o#á#^# "ä"Š" öSEþjÄ·S®ŠØõ‚ë×`èø‘ ê ÷ ¶ Š¿á 3 öÔáêz¾þˆ¶# ï äáÅ´$Œ26a *Ë‘%X3 W ƒô¨ˆÛÌLR‰êuÛ‡ ý´û>ùjøÍù£û—ýñÿúWñ[heÿ ‚ Û 6Ôãfø//p Wº-Ȫ ë ¤ —ÿœýeûÃúFø£öŸô7ñoîUë%èäÔámÝ™Ù,ÔoÏÈËaÇdÄÁ¦À¾ÁÂKÄ\ÆÂÉ5ËͽÐ4Óx×ÃÝ7ãŠê4ð¥öjû$þŒrÚþ¹ý¦ýQý–þPÿ‡êÌ)ÉÝÚ ÿ«ÿÊ;Ú} òÿÓþ­ý™üìýý«þ‘ÿ£æJÌ]—Q ~ü7÷Øôðãî7ëÛéäèQæôåÜåäŽä‹å åÃæwæ¥åÒäIâ˜áßÙß.ß[à’â¸åzè1êYë¾ìuìæí¸ïLñró™õTönöÍöUôþó0ñ|ð5ïÃð@ñ:òò‰òôóŠôö?øÆûþVƒÃø:ÿ§ýeúöûò±îëéêê%ìFïÉóÂ÷’ûýÃÿÔu¸}·^ÿŽüøAõòßñåòóôâ÷ùƒü#þ”³dxø+bTŒõÿ|ü®ú;øu÷~÷i÷ûøÏùùÄù÷áöçöŽöË÷G÷Þø‡ù3ùìúûýR· ÇK'–!h$ƒ&×(€)ÿ+y,ª-x-¾-j,j*Å(Å&[#x 0EL Üaû~õÑñîíì¸íîïŒñ™ô*÷<ûÿ}ø ‰2:ÃÖpeÂæ?+÷k vd°\lêö  µ ¤ÁëCáÔW’^’º. \ B æ R { ¾ > Jõöùë¿Mn.#Ô[­’<Å”èÙˆÞžpŒÈÅk¹Ü Ý%zî0¸nã ç ³oýHùšö«ô­ó¼óªô*õ ö<÷êùãû’ü†üü/ûýüWýþ%ÿcº„ý× ` Š êÿ¼%ÙW!2þâüÕûåü…þ`öô°‹ b ˜ » h û1©Êÿ3ýnüñýþ€ÿƒ!ÿüÿþ.þþ ÿwÿÓÿ:ý²ûøýõ¶ñ¢í èeã®ßRÛúÙ»Øq××ת×ÇØØ^ÙNÚÜÜjÝyÞAßàGáÉã€äååtäîãââµãìæètê‡ëëAê'è‡æ×å’äïåLæ¥èŽê¸ìíïñrô4÷ûoÿZÀeŠ d G }ý…Á\ï¨ê.# sðlÿYýû¨úÏúTú)ú,úù¤øÖ÷xõ„óEðëî›ìuê•é>è™èwèyè=ç=å[âïàÜèÙ¸ÖïÕ ÔÔ8Õ’×ãÚzÜÍÞYÞêÞÖÞ¨ÞÑßÒáÍä5æ|è9èÿéèÄè”èöê0ìî=ðLòcô­÷>úý` à› :h;‡O»õª]‡bJ€@©‰X ¦ › ; HîœÖþíü¯ú ÷ô?ñôðŽð ð5ðÎñ¦òŽóeô+ô°ôÓô¡ôóNò—òNò™óvôÁömø‰ûýÑL.& D¾þ¿ü¥úæùÒù‡ùçúºûÃüÃý™þlÿzá²ãe ç þ »>Îý-#P"S&)+ª-í01À2•2l14.Þ+Î(|%D"b»ùÏJ®c ð V R » ‡ PÊÓSl]{þÂý,ü ûÅûàü ü;ü+üûÈûƒûUûAû2ûúêúÎúÑúîúõúîúÏúúŠúÊû’ýþ÷[Ð Ÿ o/° P]ûÞïOiÐÌr®éiXâ× Û"m#P#§##J"Ø"2!;ø‹toDÈŸÌ —  · ø ;_˜ÿmû±ù'øøJùú û]üÚþˆG­Gô*ÁŠ2ý‰ú¡øa÷{øRúDü^þþöÿYÿœUÚ&Í B  ¹ | Ç  « § ù ‰ 2 Ä , ) ? J¦š'üiø“ôäñ”îúíë¼ëêÜêÖêÇêjé”èbç3æ,å[ä÷äÈäŽäZä=äTäÛåìç}éŠëÉíÛï§ñò<ó4óÿô‡ô¹ô­ôËõbö\÷¯ùXûüXý2ý‚ýrýûôúRø;õÁó"ðÀïîjîïIðañ‚òVòåópôô·õ7õGôÂóÙóò¢òÝó¹õö÷çùùØúUúzúiúù€ø¸÷ÒöËõŽóùò ðUïîtî ï=ïýð¦ñ#ñ’òò£óBóùô§õõqõñö¶÷²øÝùûúæû·üIü‚üiüûoú±ùÛøï÷ð÷öUõwô`óŽóVó¨ôhõSö3öõ÷{÷¸÷¼÷vöØöõŽõjõ«ö%ööõëôºó}òÚó—öù¾þO…®ùØ™1Tüi»ÿèÿCþÓþIý€ü ú2øPöÿö1õžõô¨ôvô·õ|ö–÷’ø)ø'÷_ö'ôüô`ôÈö?ø–ûrþVÓš·|¥M7ÂýÏg3[ f&ÕD•àë›þMÄsuÖ¯È̽pö…P [ ¥ C Ê¿6NÝôš ½   ¿GP÷(¥a E  Þ ¹ ¬ ›ZÀ¡ ú é ‡ «–ÎBãÐ ¶hŠÅÞö ! 5 çð N  ó  GˆÛF‘„ˆâ<úïÓVóÿQ~Ä} ÷ ²Ä0ݹ‹7žþ¼ü¬úøÌ÷|öÙöÿ÷þù¾üþÀÝ+6 ª @ á À ù Á „gkÎóÊ  ¹ P ŠR»áàΛ/   í  g 6 é µrÀBª½S!U"‡"Û"I Ö¼ÙŸ• × Œ¿t·w¦9ÿ´ Óô–ˆ¬þ&ùòõ;ð‚ìèHåBâÝáßâß*Þ¥ÞÝŸÝGÝÝ ÝÅÞöà¤âÄå(ç–é×ë²ìíí§îî]îoîZî8î!íúí¾íxí$í í{îšðqòìõÜùüQÿŠf·<èèf‹…¨ µ›²ýQ]û1ÿ”þüÎû’úŠùÌùZùjú ûRü×þsÿѺõª$ÿ@ýÒûëù€öówð¥îAì{ë\ê‹éÁèÅç¶æ¿æå½åÉå½ånä¨ãgáäàpßYÞèß?à9á›ã/䯿ççßèšéeêêáìí¯ï›ñ®óÇõ±÷Gøƒù‡úŠûÆýIþóƒ§ä7lÿÇÿ‘ÿóÓ˜OÚ3 Ÿ  > XX.²½ Ã ê –ºoÿýü¥ù÷MõêõYõnõÂõÄõ(ôòùòyò—òèó#óòŒñœðIîÊíží í í©îzïgð8ðòñ†ñÕñîñŸðµï‹îîXîûðò¶ôíö»÷Á÷ê÷›÷?÷Pøaúý¿lBå Ž¦´‰ ý & d_?¤‡ ß ˜ ‡{HùxÖ2£+ŽúŽ·}¾¨€ é  c ú€‰ µ  óæ7 wš‘&xÃ-ÿè†ÍÆxÿ½ÿÄ^žHõǤáèöÌ«È:áwÀ¶ÿƒþfýkü‰ûÒûRúûúéûLüUþA·k4 ó ©\÷X\çñ±©R›·À¼¹‚ô%2 D y  ¸  F—¨ 2 5 .h&y(ZâºÈÑ ¹ u ü ~  Í ‘/: € Äf8ƒcÿ÷jÊ+” ¶q†´ ª""Á"Í!ù P&ÊT }›Ã ýú¤øFö‚õJô„ô:ô…õ'õÇöGö˜ö“ö5õ“ôÐó÷óòðõðïLî·î>íïí–ìõìêáé¶è³èçÆçÐçåçÈç‚çæ?åå/å(åƒæ@ç7è-èöé™ê"ê¢ë8ìí=î¸ð—òÝõT÷Êú üþ 5€É  ó 4ÉfÈ¿ wL& É K·uÿ üèû2ùôøø÷ðö™õóãóòœò…ònòñ+ïÔíòë¹éAæ½äxâŠáAàÖá6â)ã¬å¼èê0ëéìçíì“ë’êéóéáê„ëäíáð+ò]ôJõÂöÍ÷¿ø°ù³úÞü ýIþþhþýû{ù»øö…õvôÙôôbô4ôóãósòºñÙðôðNðAðÕñÜóNõöåøÙúºüxþ)ÿÎiòe«–]™¿ÑÝÍ“+”lèúþðýû7ù„÷êö›õ˜ôÊô@óÖóZò´ñÝð×ïºî×îwîºïŒð~ñ@ñÆò òqòñóÅôËõ¾ö“÷LøøÝùíûDü¬ýæþàÿ£JÓ3lc#Êm)#~W»˜í ’ *[Û¥ò #nè‚ÿ]1toD8 ϸÕ+–ßâ‰î J Û » ÁÐáùEܽÓ::ÚéË×LXæ½¢]ë2)ßiàcéuÍÛž,)1 ç Ç pû¨Û&þ©üuú®ùgø­øUø;øVøøÏùù—ú~ûëý¥ÿŽŒc áç Ÿ aäNÔ§ñÅ  ¸ ‘n/°ßÁbÕ í˜1<Cn÷ü®%EÉR½Å *!!!ÿ"["y"?!ˆ 8wVà0Y‚› à –Êƒ ü‘BÃ@žø^úÇ©‡Cÿ¹þÔý¥üRúìùxøöÅõ‘ô‘ó·òýòoòòòIò…òÈòìòÆòYñÎñð1ïXîÊîmîcîÑï®ðßò7óˆôœõQõ™õ±õÑõÛõÛööu÷'øùùúú‘úÏúÛúáû&û½üqýýcýRýüÎüÆýý¥þVþëÿMÿ–ÿÈÿÜÿ×ÿªÿTþßþEýŽüÉûøû ú]ùÒùùªùÛùØù^ø÷jõÖóÔñ‚ï ìÌêè…æÅåhäwãÕãlã5ã;ãŠääØåÝæéçóèÿéûêèëÜìøî7ïºñ|ó6ô×ö\÷¯øÆù›ú]û ûžü.üÆýZýàþNþ¢þÖþÍþþ@ýâý}ý)üåüŽüû+ùïøFöhô¢ó3òWòòió?ôsõ¼öâ÷ÆøVø˜ø¦ø›ø¡øçùgú úÄûlûëüûàû>úLù*÷ûöëöõsõ ôçôâôêôþõ7õÂö˜÷œø¡ùgùãúùéùoøÆ÷ÿ÷-öVõ™ôþôyôóóPóòßò©òcò,òò&òlóô<õÈ÷¡ùµûñþ/XLæåb±ü\  * I  g & { ‡ gJDS™¹Nèzë ºÈ-œÓ ¶ 8 y ¼ 2 ó û:rî/g ­ / Õ Y µ ÍÄ·oH1ArÄp™äZ¿G $ ‹ pÎ×·Å\Xɨª¸ Õ ù û À A } ~ G Æ < H 3K |ëq/=• Õ¿³—_ÿ Ž  ¼ g © - ‘ Ñ ø.4& ý Ñ § ˜ ¸±zOtœ`ÀÝÑ  rþ¼ð  âH‚dôK}Ë€ Ð¦ŠY  „ Ù $ B v ²  u ý Ä Êå 1}_Ñöß— 2 ª y" VèßÔÀŽ@àaÏ8~µÿüÿHþ…ý¦ü‘û&ùs÷ŒõyóvñÑðºðLð’ñqò£óåõõÔö\ö»÷÷Y÷²ø'ø¼ùgúú¡ûCûÕüUü¬ü®üEûnú:ø¹÷õaóÃòSñ+ðNïÑï¡ï»ð!ð¯ñUòòâóÚõö“ø5ùÇûüü¿üÿüÔüTû„ú{ùL÷ïöuô÷ó…ò.ñðï'î~îîîoï8ð@ñ`òSòâóòæòtñÒðýðïXî©î*í÷î,îÇï’ðZðûñWñqñnñ‘òó1ôÊö¢ø€ú8û‹ü`üÀüµüeûÛûúøó÷˜ö'ôÇó‚òlñ¢ñ1ññ_òóôqõç÷Yø›ùú ú)ùôù—ù3ùù)ù€ùêúfúãûFû€û•ûtúïúø¼÷/õnóŸñïð¥ïÎïrï„ïÞðeð÷ñkñÂñëñÑññRñ2ñ<ñkñ¥ñ·ñ£ñ‚ñuñ¦òBó_ôÞö‹øFùÌúþûþüèýÑþ×ÿóÖ]†^çÍÛ]¸*Àl,ÿÓ–_1  Õ ¢ [ Ø  Õ 9 S \ÙyWdŽÖ(‹  n ¼ ó ë …â Fм–äùÝEÔI³|ì`Æc¯)ÿÖÿšÿqÿVÿVÿŠÿú¯©äBšÎÝØ « \ é ; X Y _ „ Ç & € º Ý ï  8 Œš8Ìk(öСQÁÕ„×à½kW J g Ï ‡  ¬ ì $ /  œ ü > ŠÿŽ.ߟeŸ0Ú”_:"(Ev¶ô"==304<67=TŸÐ° § ² ï M©ééPz¨Íˇêà—z‘Ã%ÃN ± í ù ççqü¨pE0ô«/i]¶ÿCýÀüHúñùÊøïøiø)ø,øføÆù#ùdùƒù‰ùxùMù'ù'ùLù­úUû ûÝüoü½ü£üûùÌøi÷õêõô“ômô¨õ$õ˜õèõüõ«ôèó·ò=ðžîôíXëÜê«éâé“éÓê§ëêípïðÌòƒô<õñ÷’ù2úºûûüÿýàþ™ÿÿFÿ:þéþ4ýû ú ø‰÷Eö;õjôÖô‹ôô¤ôçõ1õqõœõ³õ»õ¶õ–õTôùô¥ôjôSôyôçõ‡öG÷÷»øRø¯ø¸øm÷Ò÷ö+õŠõ;õHõŽõèö%ö*õîõyôÖôóZò¬òñ™ñHñðÿññ\ñ¿ò/òŒò¹òºò}ñññðîÔí¦ìië;ê6égèîèÝé4éÜêÄëßíîIïrð…ñ‹ò€óNóåôQôœôÍôÔô§ôEó·óòŽò@òBòóTôWõvö‡÷d÷éø ÷Û÷y÷öâöÿ÷yøCùRú©ü4ýÆÿ9dj{fOG7õÝá gìiWc–ñ _ Ì 6 †”ZÎî¿N˜ ¯ , ¶ðLîñiIxÞnË‚Cð¿mñ J  “ „ S Ô“VÔŽ=ñ¦Q½ŽÂ1àÅÎ Õ ² F ¤ Æ ’  l ªë:ªeyí± ² » ¬ v  I ] D  û ÷ & —FE†÷‚ l‡A†JŒ8Ôq4N ¸ I ø ¬ V ã 8 P 0ÝeÚF­þlüÚû„úŠúùýúlûû÷üìýóÿ);/ô”š„ÿÿ r Õ ; ¡ Þ Ø •  dª}44ˆá È Ä Ì ï)õnuXv « /  |$Î>=Ì A ¡ S 4  ’ ± T¢äjt#m/PÄq - × W‡P¯­Fz H ­ ¸Fñÿ$ý»ü¸üûxû ú–ú ùbøx÷_ö*ôåó¡òtñkð’ïåïKîÇîSíäíwìýì’ì)ë¶ë?êÒê{ê:éðé˜é2èÇèwè\è|èÑé_êêßë¦ì]ííãî°ïžð¶ñêó@ôšõé÷@øŠù»úÇû¨ü_ü÷ýpýÚþ*þ\þhþEþý×ýßþþbþ¢þ¼þ„ýîýûÑúhøÊöùõ ó,ñ™ðŠððTñ òòÿóÁô,ôFôó¦óòšòFò ñîñéñåñåñíñüò1ò›ó&óÆôxõõ‘õ¿õ‡ôáóæò¤ñBðïî îŸïïÀð—ñvò8ò´òûóòúòÎòœòjò@ò$ò/òbò±óó«ôWôûõ{õÀõÌõ“õôSóZòDñ@ðððð?ð»ñƒòvó‡ô­õÕöî÷ëø­ù*ù[ù[ùRùTùùòú¯û§ü®ý›þYþãÿFÿ~ÿ”ÿ~ÿ,þœýëý.ü„üüüFüÅýmþ1ÿ÷Ÿù!I‰ý d I K ^ a I†ÌИI ò › A í   Z  â ³ ¡ q P # â “ @ ñ ± ™ ² û 5 ô ª - ` N ñ > @ ³MüÑè8»~s¯GðÔ¡Mçe¾ö  0 4 R “ ý Œ 5 ú Î ¶¿óCµ­^¤{ïüÛÆÄÝ V ­  ‘ ! ä È Ê Ò Î ´ ˆ ^ 8 Ø š =°ö.tâ7ü­2Þ9·l€,«qZ Y V™·cvôø¢  „ ÷”`OQSIßÿ±þ­ý÷ýœý°þ0þüÿüñæŽu:ºÕnŽPÒSvhåÈá!9_{ e  Y K ò iÚh+%T« ] § Ó Ô Â ¦  @áZ¾Òäo´Ä“ÿý[ûZù<÷Bõ‹ô)ó!ògñìñ‘ñFñ ð°ð)ïjî{íiìLë;ê|ê.êIê¼ëmì6ìòí£î^ïAð]ñ«óô˜ö÷?ø;øóùwùßú,úZú]ú ù–øÂ÷ËöÖöõsõ*õõSõªõþö<öLö>ö(öõÇõ}õ,ôÙô‡ô8óòó½óó^ó-òçò‚òñ›ñð²ðXðïõïâïçð ðQð”ðÇðàðÎð‘ð(ï¬ï:îÔî—îšîÆïï‘ð)ðÙñ¬òó{ôrõtö…÷¤øÎùóú÷ûÓüsü»ü±üIûƒú‰ùiøö¥õDôóNòøóóvôôµõ1õ‡õ²õ¿õÈõÕõÖõ¾õ™õfõ!ôÃôIóÀóQóó'óyôõ ö+÷\øŠù¥ú´ûÌüÞýçþÍÿ|ÿüQk]>ÿÞÿµÿ›ÿ˜ÿ¿t®ª`ÿÈþòþýlý+ýYýèþ«ÿhÿâÿüÿÅÿXþËþ?ýÁýZýý,ý›þtÿ¥ ~åÖY ±£¹ÿ  ó ; N . Û kþ¤aJ_~™³Ëì + ž X [ “ â9•Ü $ µ7Ð_Ì"g–p& ¿ - z¾¹¨ìz3íàô3˜¨Wu’½´ªÙ  D ) ± Ý ¶ ? £  n â f ²v[Xl’¾ãû   " 6 \ ” Ò 5 P [ [ R B 4 '  Ô ™ h H I l ¤ ø m ò h ¸ Ý Ê | ü W ¢ìDÄk1!.?O[T#Ê^î…$ÍmS¬ÿºþËýòý4üü?ü üBü¤ýIþ%ÿ*Ks§êB¨ ^ \ ù ! ¸ ÔŒw qNƒ í"ˆø D 6 › Y iâßþ²ü‚ú¬ùRø{ø/øSø»ùCùÂú!úTú`úLú ùòùÆù—ùjùEù.ù$ù(ù*ù øËøc÷»öÅõ ô\óñèðæðïŽïî°î,í•ìóìXëâë°ëÈì2ìÕíœînïHð(ñ ñòòÞóÎôÁõ¬ö÷+÷÷×÷Õ÷š÷/ö›õüõsõ ôáôóõ;õÃöƒ÷uøŒùªú²û”üAü«üÆü–ü ûiúù†ø¡÷å÷W÷öð÷÷1÷x÷ÇøøYøŽø§øªø•ølø>ø÷å÷¼÷Ž÷Oö÷ö€õæõô%ó ñ×ð”ïUî2í5ìwìëþìjí?î\ï¡ðöò+óóÃôôôóñóóôôMôœôçõõ ôåô¹ô­ôäõkö;÷Føoù©úãü ýýÊþDþYþý…üÂûãûúúFú{ûüý9þzÿª JŒ[ÄÿæþÛýÎüÐûàûúEù¤ù'øÛøÐù ù‰ú+úÛûyûöüJübüGüûìûßûøü<ü°ýYþ(ÿ  2BNT@  š ÿ - 5 #  â Ï Ù Z Ü y  ¼ V åeäpÅ`Î õ´WÚ@ª7 ”Q:!ñ”û)Þi²Â’$ ‰ Ü <´Q2U¸T-JfsfUC"ýèêhßhèK„rL1A„óŠ=ó ¦ L Õ ! 6  ©  =Tk­$åïAÕ©· Ü ô ì ± ? ” ¾ Ñ Ñ Ä ¬ x ! «   Þ O Ø } A ' 6 d ¢ ê * M R 3 ä d¥¿·”g:äÿ¼þ›ý‡ü•ûÐûEú÷úíûûsûáü_üîý‹þ?ÿ ÿè¿_¨æ*q©É˽¥„l7Ó7o™ÿØÿCþüÿÿ~ä°`î`·ôæ D߇>÷ìݳ\ÓÿNþýÓýUýýý.ýqýÀþþ%þý¾ý-ümû‰ú‹ù‡ø‘÷³ö÷ö^õÙõeôùôˆôóœóò‹ñìñ8ðgï‹î¯íÅìàìëëêÕê¸ê°ê¹êáë+ë§ìIìóí¡îSîýïšð#ðµñjòSóŒõö’øùaú]úûûDûRû0úïú·ú™ú“ú¢ú¹úÑúæúäúÃúvúùƒøìøW÷Õ÷böÿö©ö`ö&ööö9özö½öìöóöÖö¢ömöTöiö´÷.÷Ìørù ù‡ùÝúúú úùýúú'ú\ú‰ú›úú^ùøùxøôør÷ø÷š÷h÷b÷|÷¼øøhø»øýù$ù.ù"ùùøýù ù6ùùñúuûû‰ûñü3üJü>üûßûƒûú¾ú}úfú…úËûûUûqû^û*úÔú`ùÒù1ø€÷Û÷Y÷ öö÷÷‡ø(øãù˜ú úyúµúìû"ûZûšûìüQüËýfþ7ÿ>zÖ®¯"/ ì ÿËÿô”¬%Ћ, £ ê ý㽌AÝ^¶éùÙo«ß` Ë ` ' % V §„ÉÑ• ’  º   Ä  $žö ÅB … ¤ ¢ › ¯åHÔx/è˜Dí˜KÄ‘lR?4,ܲ€O%)jÑIÐVæ‡-Øzü S z y l j ˆ Å  e ² é   ê –  ,øâÀûѰ L Ê  ðy¡u ù ? ] r Š ¢ÇÿPÄX®>²T³O?€ù†ôùœlºû?ÿ•ÿþ£þ„þ±ÿÿ°WìJVõ(þýýüú®ùšøäø‘ø©ùù¶ú|ûPüü×ýxýûþ`þ¥þÚÿ ÿJÿ©-Ìu"Éað~‰úS~lŠ¼Â¢j þ½ýEûÌú\ù ÷ÄöŽõpô~óÇó]óPó¤ôCõõÓö•÷J÷êøkøÒùù!øÿø®ø-÷•öéö-õ\ô}ó òÆò ñ}ñ+ññ=ñ…ñãò;ò…òµòÉòÐòÑòÕòöó7ó“ôôõ õšö2öÍ÷e÷òøjøÃø÷ù ùù ù ùù,ùWùˆùªù®ù†ù ø‹÷Õ÷öPõ¡õôÖôÆôýõtö4÷1øQù€ú¦û˜ü@ü¤üÍüÈü®ü”üsüAüû²ûLúÜúpú ù·ùkù0ùøåøßøôù#ù^ùžùÛúú2úOúkú‡ú¬úÔúøû û úíúºúrú$ùÚù’ù?øãøx÷ô÷eö×öPõéõœõlõLõ.õõôþõ õ+õbõªöö†÷1øùúMûüÈýçþÓÿ„ÿñÿæÿ_þ”ý¥ü¨ûÀûú¼ú¤úÍû.û¥üüpü§üÃüÐüßüøýý7ýQýgýý¨ýçþLþëÿ¿Î"-«ø  ¾ 5 o € r P  Å \ÚI¬jï —ãv9÷ È z g ” ‘ a Ø — a 8  ì ¾ i V S Z m  ‹ œ ° Ê ó  H „ Õ 9 ® : × l úðNœØÿÜnÂ Ý Í £ o A;ƒù«Š‹¥Ñ1]‡ºô&F^em{šáHÅG¿ * z ¤ ± ¥ ˆ Y $óÞxEþž#Ÿ"¾wH) êÁ’a4 @ñcádäT¨ÞòìΑ&†­¡q0õÿÝþõþCýÇý|ýWýPý[ýoýý®ýÃýÇýºý”ýgýAý=ýtýÿþè*¾€Cã6  Ž YW)渰Î$·‚~ŸÓûù½1ÿTþ'ü»û'ùø öÁõÎõBõ"õuö-÷<ø”ú%ûÖýƒÿ@W7³ÿÚþ»ýkûüúù÷½ö¨õÛõ_õ:õfõÊö^÷÷íøÍù›úFú½ú÷úûúÒú‰ú<ùæùsøæø0÷OöKõ2ôó'òmñüñÔñòò:ò™òêóó#ó òÓòˆò1ñàñ¢ññ…ñªñúòpòüó¢ôaõ+ö öö÷íøäùÕú²ûgûãü'ü5üûêû±û€ûYû4ûúÉú‡ú1ùÍùdøùø’ø>÷þ÷Õ÷Â÷¼÷Î÷òø4ø›ù(ùáú´û—üpý)ý½þ4þŽþ×ÿÿ>ÿMÿ4þîþ„þýˆýüÍüžüŒüü¨üÜý7ý³þOþýÿ£+µŸZÿèÿYþÉþOýñý·ý¢ýý—ýŒýdýüªü û…úæúLùÄùUùø½ø‚øE÷ú÷¦÷Höáöyöõ®õOôøô¦ôKóðóœóhóOóTó{óÆô,ô®õ[ö.÷(øBùmú¨ûáý þ#ÿ'úÇ~–ù6RQE.îÄ”l[sÀI ìÈ… W^&½3š„LJb`‰àXó¯L ¹ A ¡ Ù ç ä Ù Ö à ý 7 ÷ y  ¢.¦ù¸A » C Ý ¢ “ ­ í \ ía*×Ec(’·´ š s Q E Ic‘Ìráh²o>&$5Z˜êFžç ß–CøÂ©©¶Êàï9b’Ë4[vˆ“–—ž«¸½½¹«“w]G7%úΉ(®+­L(rÍ0–ð:~¶ì(_—Î-=/÷‹ëîÈÿ¼þãþ]þ,þOþºÿYâ®klž;§ÖÐÿ¦þmý:üû,úkùåù¨ùºúúŸûVüüæý þ;þ±þ÷ÿ þþþÐþ”þRþý¶ýZüòüüû¤ûGúòú«ú}úmúwúœúÑû ûBûoû„ûyûRûú¯úAùÊùTøÙøX÷Ò÷MöÔöqö.öö,öröé÷…ø6øèùŒúú{ú±ú¹úú8ù½ù-ø–÷ý÷|÷"öòöé÷÷)÷M÷W÷B÷ö¥ö)õ˜õôô0óòóÞóïôô`ô´õ õ^õ õÔõüö+öxöí÷•øeùRúKû:ü ü¬ýý?ý6ý üÇüuü&ûÙûŠû=úëú–úCùþùÏù½ùÈùëúúTúƒú úªú—úkú"ù¾ùIøÕø{øWø{øíù”úRûû·üCü³ýýkýÊþ%þqþžþ¢þqþýlü¬ûÚû úQù¶ùNùù"ùZù»úHúöû¹ü…ýDýäþ[þ°þìÿÿ@ÿjÿ•ÿÅÿïÿùÿçÿÔÿÝ o©Rí\Šx‚ª§ÿ†þYý2ü*ûVúÄúyúsú£úûûyüü½ýnþþ§ÿ)ÿŒÿÈÿáÿ×ÿ®ÿwÿEÿ ÿÿ!ÿYÿ»@ë¯x3ÑC…”x7Üx²f/ þHu¥Îù*iÄ>Ó‹RÅM¥½­ŠbFDaò ` Þ g ó { ð L “ Æ ð  < w ¹ û(2 Ó q  ž J  ê Í ¯ ƒ < Ú j ÷ œ j g ˜ ï [ Ë & b s Z  ª  UˈѬ§¼æUƒ—9Ê?¤yùŠ/çªo1ì—5ÿÊÿ_ÿ þØþÎþêÿ.ÿ— Ɖ_9 ÅUºú0:Pj† ±°Œ8´ V£ ¤y™÷„+ÏO–›cøhÄi¹Sÿ–þØþ#ý€üøü‡ü,ûÜûŒû<úëú«ú…úúªûû†ü3ýýÚþ¯ÿq„Ìô5mÁ$‹ïG‹°¦`Óÿïÿ²þZüûû úUù$ø÷8ö’ö)õøõõöö8öVöböUö;öõíõÇõ¦õõ{õ\õ)ôßô‚ôóó!ò¬òEñöñËñÉñåòòjò×ócôôÜõ¿öµ÷²ø°ùŸúzû4ûÈü0ühüuü\ü+ûòûËûÓüü ýlþdÿog0±Ý¯2vÿþŽýŽü›ûÌû3úÝúÏúóûAû¥üüHümütüWüû²û8ú´ú,ù©ù=øþøåøðùù5ùKùBùøÒøuø ÷š÷$ö¯ö?õÕõ|õ8õõõõ7õyõÝö`öø÷¥øWùù¦ú7ú¿ûKûÝüý9þþÌÿ„‚Æåå̤t:ÿüÿÃÿ•ÿzÿqÿ}ÿ—ÿ¸ÿÙÿñÿöÿßÿ°ÿbþøþwýëýaüãü‚ü@üüü9üŠýý¥þrÿafzŠˆf t „ ~²ËÕèÿgþãþŽþiþnþ‘þÅÿÿKÿ™ÿñI¥Z«ð%EM?Õsõ^ÿÄÿ<þÒþ›þ£þÜÿ<ÿ­Œé.\ojHØ—`@:Náu<7Y’Ò / 3  Ë e à : p Š ’ † t ^ >  ÿ å Ë « J ö „ ÷ V ° oê‡H2BwÌ?É V å h Þ F ™ Ö ú ù Í z þ \ ¨æ ]¥ò?ˆÊ P¡ÿwÿèÿð5¨7Øw øIvpD Ηq_d~¡Ëø#â§f4#=}ÝYáaÏ%[x„ˆƒzd=°MÝgüœQ# ûúúñâ»u¤2Ù®¹ø\ÒH«í ç´n¹FÍGÿ½ÿ/þ­þ@ý÷ýØýäþþLþxþþˆþgþ4ýþýÏý£ýqý'ü¼ü3û‚úµùÔøèø÷/ösõßõ{õMõ[õžöözöê÷J÷Œ÷³÷Å÷Ç÷¾÷¢÷j÷öªö1õ¼õ^õ)õõõ'õ-õ$õôÆôwô"óÏóócódó’óÞôFô¹õ;õÇöc÷÷Îø ùuúHûûÝüý3ýÁþ<þ¤þÿÿNÿ‰ÿµÿÙÿþ(Y“Ù$i¢ÅË«bõjÿ¿þ÷þý?üiû«ûú£úZú-úùïùËù©ù’ù…ù~ù€ùƒùùuùjùeùhùuù‚ù†ù}ù`ù0øþøÍø­ø¨øºøÓøëøûøôøÏø•øVø÷ü÷öøøø%øø÷ã÷È÷Ã÷ßø6øÐù¬ú½ûõý=þ{ÿ£–QÇ÷ê²Vê‹H->sÁ{×*i•¨¦e0ò±s>øÛ¾¦™ŸµÛ :`zˆ•®×4[†Á fÎ5ÇϤCºsÏ3—ÿúÿSþ©ýùýDü‡ûÌûú…úùÜùäú8úÏûüŽýþ‰ÿn9åa¦¬taÿ§þêþ@ý¿ýzýxýÅþTÿ8OQ9­GÔg ¼ y F  ð À,¿5ƒ¥f…è1 b z  { ~²Yl¿GúÁ ‹ O ý ” o » é ú é ® C ¨ ã ü ùìæñV·/¯,ŸÿkþÕþKýÑýtý=ý2ýXý­þ/þÖÿ—[±&l|Vùj¾ ÿhþìþ³þÆÿÿ·yP%å‰ i«ÐÜÝÛÛßì#;KQI7õöþ ?vÁCfoh\NB2é˜&Ú)ÿRþ¢þ&ýâýËýÒýèþþ þ=þfþžþåÿ2ÿÿË)/ÿïÿ«ÿSþãþWý¯üðüû)ú$ù ÷îöäõêõ ôLó­ó0òÔò›ò}ò|ò›òËó óYó¬ôôaô¾õõpõÇööLöwö†ö{ö\ö-õúõÇõ•õkõIõ6õ8õNõõÍö6ö¸÷H÷èøù2ùÏú\úáû[ûÉü4ü’üèý5ýxý¶ýðþ(þkþ¹ÿÿˆ’š o¹åðט4³"‰ÿùÿoþùþ˜þJþýâýºý–ýný9üöü¦üKûæûtúÿú‡úù·ùpùEù)ùøýø×ø¡ø`ø ÷è÷Â÷¬÷¢÷›÷÷÷s÷c÷V÷K÷K÷_÷‹÷ÉøøsøØùQùÕúiûûºü^üðýeýÃþ þDþ{þ³þóÿ?ÿÿÖÿãÿšÿ?þØþqþýÎý£ý™ý´ýìþ@þ¡ÿ ÿ|ÿæ@„©­XÿÉÿŒÿeÿ`ÿ{ÿ²ÿýU³cªÞ+15:DQYWH-Û²•y`I.ïØÒÜø<JD,ÑšlMCXêqÛ°ŠX¥ >:¤$’óQ¸#™#Às=!@zÌ8½S툩+£{Ù)r®Ûþ  ) > U i u t ` 2ë(·AÌ[ø­†ŽÍ5¼Síƒ  o µ Û ä Ð © s *Ðo ¬Rú¥V­a!òÑÁ²¡…U˜Ž ŸLîÇŽLÿÑÿ³ÿ´ÿÓlÙM½!t±Øì÷ýÿâ©PÙWÔXÿóÿªÿÿ|ÿ•ÿÍ$•«BÖ]ÙF£ë25î°_þ“!Ÿ{å`ÿøÿµÿžÿ³ÿê< jÇl±äþú×›LÿþäþEý®ý!üü'û²û3ú¦úùYøž÷Ý÷%ösõÎõ:ô¬ô'ó¬óAòêòªòŽò‹òòÄò÷ó9óƒóÕô0ô‹ôèõJõ¦ööYö«öý÷L÷›÷ëø=ø“øéùAùŸùûúXú¸ûûûáüBü›üíý0ýcý‚ýý‹ý}ýgýNý7ý.ý1ýAý\ý‚ý²ýçþ$þ`þ˜þÄþãþ÷þüþóþÜþ¸þ‡þHýýý§ý@ü×üpü û´ûkû:û#û%û<û`ûƒûžû±û¹û¶û«û˜ûƒûmûUû=ûú÷ú×ú¹ú¥úšú–ú”ú‰úoú=ùòù•ù*ø¼øT÷þ÷Ã÷©÷±÷×øøvøîùú*úéû·üŽýeþ6þõÿ”d‰‡f3ÿûÿÅÿ–ÿqÿ\ÿUÿ_ÿ|ÿ£ÿÎÿü&H]b[NHM\{©æ5ŒëGœÜþâªa ½xB$ 1R{¥ÉÞéæÛÅŸn5ø½ŒeF/"ÿýÿÞÿ´ÿ‚ÿTÿ3ÿ)ÿ8ÿpÿÐOë£pL1ë¤-{‡WüŽÃ‚`Yexˆ‚b#ÅOÈ9«/Ñ’wzšÐiÀzÓ"m´õ7|Æc¬é:NVYUJ7üÜÆÁÎñ$a£Þ,0ô²Zöˆ²c,9n¬ì)b’Àæ%/41$ç¦GÈ'l ÑD•ÿþÿ‰ÿ5ÿþõÿ ÿCÿ’ÿ÷dÐ7Ñú÷Ñš^ã°ƒ]?)#/BRXO/ÿñÿ“ÿþýûýxýüÞüãý#ý¦þnÿr™ÓÙmÀÖÂ’Xå°x0¾Sp—ÿäÿfÿ*ÿ&ÿQÿ¤²rM5 ¯ ÌL«úM£ÿÆÿ„ÿ;þÞþ`ýËý*ü‘ü ûû@úõú®úcúù«ù7ø­ø÷wöÍö$õxôÕô<ó°ó1òºòKñêñ“ñNñðÿðöññ"ñ]ñµò+ò¹ó]ôôÜõ¥öo÷6÷ýøµùcúú”ûû{ûÎüü>ü[ürüˆüü»üçýý`ý¯þþxþîÿlÿðtõg àœCÜcÿÖÿ?þ®þ'ý²ýUý üÆüü>üûØûÀû¹û²û˜û\ûú“ú&ùÒù¦ù±ùíúJú¸û!ûwû´ûÒûÖû¿ûûGúéú}úùžù4øÊøbø÷¬÷y÷l÷‚÷»øøùù–ú9úìûªügýý±þ9þþèÿÿ;ÿUÿxÿ¤ÿÝ$vË!vÃ+A=( æÄª™—˜Ÿ¢•{W,ÞÆÅßjÓF²X‰±Ø0j§ë:Žß)Za<ìqÐ:[}®ÿùÿ[þÙþrþýÐýˆýDýüÜüÑüòý?ý¿þiÿ4Ö,­d¡Íí:k±„}å1WL°0ž ’=4uÓAª8LB!ûÝÑÛù#Ow”žpC᳊_-ê›@âƒ.é¶–†Š¦ÑX¤ó:z®ÒéìèãÔ¯–}nsŠ´÷GžùM¹Ç´…@í”BýÆ ƒsnlk^CÖFШƒ€}xm\@ò¶r*á:ÿäÿŠÿ2þØþ€þ3ýîý´ýýUý2ýüþüóüøý ý!ý@ý^ývýŒý¥ýÇýûþCþ£ÿÿƒÿñQŸÙ/Tw—±¸­–xY?,á¼–pL.ÿéÿÐÿ·ÿ§ÿ¡ÿ±ÿÓ:q𰫉EÿâÿdþØþJý¼ý9üÂüPûãûû.úîúÃú±ú¹úÍúßúéúàú¾ú{úù›ùøw÷Õ÷7ö¨ö(õ¼õfõ&ôüôÝôÃô«ô“ôqôHôóÜóªó„óoóuó¤ôô}õõÎö“÷\ø$øæù¢úVûû«üGüØýXý¹ýúþþ)þ(þþþ&þIþ‹þìÿiÿ÷-ÆP¾$߃j¼ÿþÿ0þZý‚ü³ûùû\úàú‰úRú4ú'ú&ú-ú=úRúlú‰ú¨úÎúøûû@ûYûjûyûŠûŸû¶ûÍûåûúü üü üûôûäûÍû®ûƒûJûú¸úwúJú;úMú}úÁûû~ûìü_üÚýYýäþqþüÿˆ™!¡tºæñÛ¨Z¦Tôëû#\žæ1x½AºîÓƒ$̇fr© ‡‘ uÌSnb(´,3+(Cÿ‹þþþ¥þwþmþ€þ©þßÿÿcÿ³]· U”Èí!2H`ªÛX°ˆõV™¹²‡CõªqTTw´fÂ^‘­®X“ uÖ9ª4Þ«Ÿµâ;Yhoqv|€‚~~”¼øF£gÂX’¿âðæÄKù Eð¢\$ùÝÐÒÙãåÝšc*øÜØð#i¸0@)í’$­.²<Ñv,ÿøÿÕÿÁÿÁÿÎÿäÿùÿÿÿêÿÉÿ¡ÿoÿ1þéþ›þKýþý¶ýzýQý=ý<ýKýaýtý{ýnýMýüçüªüsüLüDüdü©ý ý„þþþïÿLÿ¨™$¤9XuØ%nžœUÏRÿÞÿCþ¶þ1ý¸ýWýýý ý0ý^ý‹ý¬ý·ý¤ýný!üºüEûÌûYúôú¦úmúJú6ú+ú$ú"ú&ú2úEúaúzúúxúZú1úùàùÎùÐùëúúGúzú­úÝû û*û<û7ûúàúú#ùªù%øŸø"÷°÷U÷÷÷÷I÷”÷âø(ødøøµøÚù ùKù™ùôúYúÈû<û¶ü5ü²ý#ýŒýîþEþ–þÛÿÿ_ÿ¢ÿë<Žà$T`G¿aÿüÿ–ÿ*þ¹þ=ý¹ý9üÉüvüAü)ü#ü!üûòû´ûXúçúlù÷ù’ùKù%ùù>ù†ùñúxûû¹ü[üëý`ý¹ýÿþ9þsþ´þøÿ4ÿ[ÿ[ÿ/þÑþLý¶ý$ü­ücüFüNütü¤üÎüëýýýý1ýPýyý¬ýçþ.þƒþæÿWÿ×\âX¹ü#/ÿÍŒIˈ„“¯Ñû-i¯ûD†¾ì@p³g×KÃ2˜öIŽ¿ØÑªh —yÙ/}Í*›+Þ·±Æñ(b¡ç2…Û.v©¿µŽNý«b$öÜÓà5~ÜE°zÍAct{€‡—¯Ö?v¢ÃÖáàÑ´„6Ä1‰Û:¼kGFWo~›µØ2`‡ªÍë%(% $6Rv¤Ôþ#8<#犋Œ.íȾÉâ-Mcnnhdi†¼]¾KaV'Únï_¾[ÿ¦þòþOýÍýyýXýfý¢ýúþ[þ¹ÿ ÿBÿcÿvÿ~ÿzÿnÿ_ÿPÿFÿAÿKÿfÿ“ÿÑe®ê ó§;ÿ³ÿþýûý„ý"üØü¨üŽüü¥üÐý ýGý‚ý´ýâþ þ9þnþ¯þóÿ,ÿUÿjÿhÿQÿ,þúþÇþ™þwþ_þNþCþ@þ@þ?þBþJþ[þyþ£þÔÿÿÿþíþ˜þýŒüïüYûÓûdû úÈúšú|úoúpú}úŒúšú£ú¤ú•úrú>úùÂùˆù\ùAù<ùOùtù®ùûúNú¥úúûGûŠû¸ûÓûÝûÕû¼ûûVûúÃútú-ùðù¾ù”ùqùYùIùJùaùùÓú*úŠúæû6ûuû£û¾ûÎûÑûÏûÊûÊûÚüüWüÐýfþþ¿ÿ_ÿèO”¹Á´™tHÿôÿÌÿªÿÿqÿ^ÿUÿUÿSÿKÿ<ÿ"þøþ»þpþý¨ý<üÔüqüûËû„û?úüú¿ú…úSú)úú ú!úQú›úøûcûÔüCüªýýOýý½ýàýùþþ ýúýÝý¶ý‡ýVý'ýüöýý"ýaý¿þ5þ¾ÿVÿí þZ ÏÞÓ°{A ߯ÃÛ S¬rÒ%h’ –r8é‘7á‘Nõäçÿ%W“Î>t®ë/w¾ú#80ÙšXà­dX`|ªâYŽº×ææÔ¬l¥-³F²ÝpÍ.‹â)bŽª¼ÇÊÉÇÅÆÌÖæý;bЬÁĸ™k6þƈGÿ´n2ìçí÷ýþõåÒÁ®›‹„„‘®Ö3]Ÿ·ÅÅ·”]Ѓ>ШŒ|vuz~…ŠŽ“˜£µÃÓÝæïý9fœÖ<^rtdEÖ‰-Éaûš@ÿèÿŽÿ7þâþþ>ýõý¸ýˆýgýYý]ývý ýÖþþ^þ¡þÔþóþþþöþáþÀþ—þkþ@þýöýÝýÆý³ý¥ýšýý€ýmýZýJýBýHý]ý€ý«ý×þþ)þMþqþ”þ´þÊþÒþÊþªþrþ*ýÝý”ý^ýCýIýký¨ýýþbþÍÿ1ÿ†ÿÅÿçÿíÿÙÿ®ÿpÿ!þÉþkþý¤ý<üÎüYûÖûIúºú/ù¶ùYù!ùù'ùXù—ùÛúúIúaúeúUú4úùÌù™ùnùSùOùbùùÒú%ú‡úðû^ûÊü6ü›üúýOýýÜþ þ'þ3þ3þ$þ ýëýÄýšýgý/üîü¦üTûøû‘û$ú±ú=ùÔù|ù<ùù ùùKù•ùûúyû û­üWýý£þ/þ£þùÿ3ÿPÿ_ÿcÿeÿhÿqÿ|ÿ†ÿ‹ÿŠÿ„ÿvÿcÿQÿDÿ;ÿ7ÿ<ÿBÿFÿIÿEÿ<ÿ)ÿþïþÅþ‘þTþýÉýƒýAýüïüÚüÔüÖüÛüâüæüäüáüÜüãüôýýFýýÅþþqþÙÿIÿÂ=²m ²¤x3âŠ4ÿæÿ£ÿpÿPÿ=ÿ3ÿ/ÿ.ÿ+ÿ)ÿ$ÿÿÿ#ÿ0ÿJÿtÿ­ÿøR¸'šŽ€õ`ÁTœ¨§š‡iFê¹…V- ìѺ¦“‚nXD2!úäÐÂ½ÅØü,bœÎó "'/?Rct€~pT.ߟ¿Ý<w­Úø  âµy1Ú|³[ݾ¸Ìñ(lµU¨úIÆï ÷ÔŸ^ ²Vü¬k:þêÖİ ‰‹–®ÓCŠÒIhjPÈdö„±]ÿöÿäÿì >„×/ƒÐ :RVE#ò»€DæÌÆÕø0uÃh´ó/#öªCÆ:¨ÿ„þþþ†þýÁýuý8ý üòüèüêüòüýýý ý ý ýýý0ýPýxý¥ýÒýùþþ+þ,þ þýØýœýVý ü¼ütü5üûæûÚûáûûü)üiü·ý ýeý»þþKþþ§þ¿þÊþÊþÀþ¯þ›þ‰þ|þwþ}þ‹þœþ®þ¿þÏþÚþÜþÔþ¿þþnþ5ýôýªýZýü¦üGûêûû:úèúœúUúùÖù¢ù|ùbùVùWùdùzù–ù³ùÑùêúúú3úTú|ú¯úìû1û|ûÇüüUü‘üÁüãüõüõüæüÊü©ü…ükü[üYüdüzü–üºüàýý ý6ýEýKýLýJýCý:ý/ý!ýýüüüøüûýýýAýný¤ýâþ%þiþ«þêÿ!ÿOÿnÿ€ÿŠÿ‹ÿˆÿˆÿ‰ÿ“ÿ£ÿ¸ÿËÿÝÿëÿóÿõÿóÿîÿéÿäÿâÿáÿÞÿØÿÆÿ¨ÿ{ÿAþúþ°þfþ!ýçý·ý’ýyýhýeýiývý‰ý¤ýÂýäþ þ6þfþ•þÂþñÿÿHÿpÿ”ÿ·ÿÖÿö,CS]]TC.ÿ÷ÿñÿ÷ &O€¸ó0n«è![•Ñ F|¬ÔïþýïÓ­}J潘z^A"䯭œ™¥Äõ8‹äB™ä F\`Q8îÉ¥ˆq`WPMMIGGFGJPX`is|…˜¦¶Å×í%Jr—¾ßü.BQZ`]R<ë¯g¼b »yJ+$8StœÄðCjލ¼Ä¾¯’i2ï¡Kö¢UẢ”•¥»Øø>b…¤Æç -Qt•®½º¦~F¾|DûëâÞÛÖË»£…dAÿöÿÔÿ³ÿ–ÿ}ÿiÿ[ÿQÿOÿTÿ_ÿoÿÿ”ÿ¥ÿ³ÿÀÿÎÿÜÿëÿøÿýÿåÿÀÿÿWÿþÉþzþ+ýÝý‘ýIýüÆüü_ü<ü&üü$ü7üTüvüšü¿üãýý&ýDý^ýtý„ýý–ý–ýŽý€ýiýEýüäü«ütüBüüüü ü-ü]üžüèý;ýŽýßþ*þlþ þÆþÛþßþÏþ®þ~þAýúý¯ýcýüÛü¨üühü_üeüxüšüÃüïýý<ýQýTýBýüëü­üpü4üûØû»û©û¦û­û½ûÏûæûýüü%ü6üCüKüRüYüaükü{üü®üÒýý5ýoý©ýáþþ6þKþQþFþ/þ ýÝýªýyýMý'ý üýü÷üûý ýý0ýDýWýgýsý|ýƒý†ý†ý„ýýzýsýjýcý\ýYý]ýfývý‹ý§ýÊýñþþFþtþ£þÒÿÿ,ÿVÿ€ÿ©ÿÕ2gÒ+HXVCè¥Y ÿ·ÿfÿþâþµþ›þ•þ¥þÉÿÿJÿÿ÷Qªø;o›•yNÖŒBÿûÿ¸ÿ€ÿRÿ5ÿ(ÿ.ÿCÿeÿ”ÿÍ MŒÇö4CJIB8.('1Gi˜Ód¯ù9pš´¿¿²™vO(âÆ³§¢§´Éç 3]…¨ÃÕâææâÜÖÍÇÁ»¸³ªvY8úâÐÈÈÎÛéõ%+2=J[p„™­¿ÐÜçðöü  ÿéÏ®‹fAáŨŠjE ûعŸŒ‚~‹—¨»Ðåù ößȯ™†wj^PC4%ûðéáÝÜÝßáäåãáÞØÑÅ·¤sT4ÿ÷ÿÝÿÆÿ³ÿ ÿÿ€ÿnÿZÿFÿ4ÿ!ÿÿþôþìþèþäþáþßþÝþÞþâþêþóþúþýþùþêþÓþ³þŒþbþ7þ ýäý¿ý ý‰ýyýpýpýwýƒýý–ýšýšý–ýŒýýmýYýBý,ýüüüæüÔüÄü·ü³ü¶ü¿üÏüæýýý=ýYýmýyý}ýtýbýGý'ýüÜü¸üœü…ü{ü{üˆüŸüÀüçýý9ý_ýýšý¬ýºýÁýÃýÄýÄýÉýÐýÜýíþþþ)þ6þ;þ9þ,þý÷ýÑý¢ýmý3üùü¿ü‹ü^ü<ü%üü&ü7üUüxü üÆüìýý/ýLýbýuý…ý‘ýšý¡ý¦ý¬ý³ý¼ýÊýÜýòþþþ4þFþSþYþVþJþ6þýôýËý¡ýzýZýAý6ý4ý=ýOýgý†ý§ýËýðþþ5þVþrþþ¨þÂþÜþôÿ ÿÿ*ÿ2ÿ5ÿ4ÿ0ÿ&ÿÿþñþÛþÂþ©þŽþtþ^þKþ=þ8þ@þVþ{þ¯þïÿ:ÿŠÿÙ$gœÆáïîÞÄžsJ$ÿìÿßÿÝÿâÿð/EWfosuw{‚ž´Îî7`‰´à 7_„£¼ÌÓÓÍ÷¨™ˆxhZRJEBBCFHIG@90%-Giºä 0Pk€‘ž¦«¬§Ÿ’‚nW=ýÞ½Ÿ†qaTKC<5/*&#!#(.8HYk’¤´ÃÑáð':M\gmprsuy~†Œ‘’Ž…wcM3÷Ó­ƒU#X. óâÛÛãñ6Oh’ ©¬«¦ž–Ž…€ƒˆŽ“›Ÿ£¤ž‘eCð”g?" &=UjyvdG#ÿøÿÅÿÿYÿ&þöþÍþ¥þ„þgþOþ9þ'þþþýþýöýñýìýèýåýçýïýþþþ+þMþsþ™þ¿þáþýÿÿÿÿÿþâþºþ‰þSþýÔý‘ýOýüÐü˜ügüBü'üüüü)ü@ü\ü|üü¾üÞüþýý8ýRýlýˆý¢ý»ýÔýèýùþþþýýýïýÜýÆý°ýšý‰ý|ýtýrýuý{ý„ýŒý’ý™ýŸý§ý¯ýºýÇýÕýåýòýþþþþþýûýôýîýéýåýàýÙýÍý·ýœýwýIýüãü®ü}üRü2üüüü&üCüiü˜üÏý ýIý‰ýÇþþ9þlþ˜þ¿þäÿÿÿ)ÿ.ÿ,ÿ#ÿþüþäþÌþ·þ¨þŸþ™þ˜þ˜þšþšþ™þ–þŽþ„þtþaþLþ7þ$þþþþþþ!þ;þ\þþ¨þÑþúÿ!ÿGÿkÿ‹ÿ¦ÿ»ÿÊÿÓÿÓÿÍÿ¿ÿªÿÿnÿJÿ%ÿþâþÇþ²þ§þ¦þ±þÇþêÿÿQÿ‘ÿÛ(yÈ_¤áIp¦²³«™}[2Òh4Õ«‡hN9* $.<Md~œ½á-QqŒŸ¬´·¸¸½ÅÕë'Jp’³Ñæ÷       þëЬ‚T%ûÖ»­©µÏô#Z“Í-Ofv}{teQ;!çÊ­•tkkq|ž²Ç×åíðîæÜÏÀ³¥œ–‘Œ…xhQ6õÖ»§œš ¬»ÍÜçìçÚáxHá­|N#ÿýÿÜÿ¾ÿ§ÿ–ÿÿÿšÿ¯ÿÎÿô P‚¸ëJr•²ÈÛëø'2:>=3!à­q*Ø$ÿÊÿtÿ&þäþ®þ…þhþVþNþKþLþPþRþVþZþ]þbþiþqþ{þ‡þ–þ¥þ·þÉþÙþéþöþþÿÿþýþõþêþßþÕþÉþÀþ¸þ´þ²þ³þ¸þ¼þÁþÆþÉþÇþÁþµþ þ…þbþ8þýÍýýOý üÇü„üFüûÞû¹ûœûŠû„û‡û”û¬ûËûîüü@ühüŽü²üÐüçüúý ýýý&ý1ý<ýJý[ýnýƒý™ý®ýÀýÏý×ýÚýØýÓýÌýÆýÃýÄýÌýÛýñþ þ+þNþqþ•þ´þÐþçþ÷ÿÿÿþ÷þìþÝþÍþ¼þ«þ™þ„þoþXþAþ*þþýìýÜýÏýÇýÃýÃýÇýÎýÕýÝýãýèýëýìýêýèýåýãýæýìýöþþþ/þHþ`þxþþ¢þ³þÀþÇþÍþÐþÑþÒþÑþÑþÏþÐþÑþÔþÚþàþçþíþõþüÿÿÿÿÿÿÿÿÿ ÿÿ"ÿ5ÿMÿgÿ…ÿ¥ÿÆÿç)Mm‹¦¼ÍÕÚ×ÏÁ¯šƒlYF92/5BXv˜Àè7Yvž©®®§œŽ~lYG9-#öáɬŽoR9%#<^мó/p²õ8xµìA\p}‚„‚€€€‚†‹‘”•“Ž…veN4ÿå̸¨˜—šŸ¥¬®«¤•~a?í™uYE924<FS`my„š¤¯ºÇÖäô%3@IPTTQKA4&öåÕȺ®£˜‡}vof]QD5%úðéäáààááâàÞ×ÏÆ¹©•}cG( ÿðÿØÿÅÿ·ÿ°ÿ¯ÿ±ÿ·ÿÀÿÊÿÕÿáÿíÿû(8GPUPA&ÿÓÿÿaÿ$þèþ±þƒþ_þHþ=þ>þHþYþqþŠþ¢þ¸þËþÜþèþðþõþ÷þöþôþñþíþçþâþÝþÙþÖþÓþÒþÕþÙþáþêþøÿÿÿ%ÿ1ÿ:ÿ?ÿ?ÿ;ÿ0ÿÿ þòþÔþ³þþeþ9þ ýÖý¡ýiý/üöü¼ü‚üIüûÛû©û|ûUû5û ûûûû8û]û‹ûÁûüü:üuü­üáýý5ýTýoý‡ý›ý°ýÃýÖýëþþþ4þPþmþŒþ«þËþéÿ ÿ%ÿ>ÿTÿeÿmÿnÿfÿVÿ=ÿþõþËþžþsþKþ(þ ýùýíýéýîý÷þþþ%þ6þFþVþcþoþyþ‚þ‹þ’þ˜þþ£þ§þ®þµþ½þÊþÙþíÿÿÿ4ÿMÿbÿuÿ„ÿÿ“ÿ”ÿ’ÿÿ‡ÿ€ÿxÿlÿ]ÿMÿ8ÿ"ÿ þõþâþÓþÈþÃþÄþÎþÜþïÿÿÿ,ÿ;ÿEÿKÿKÿGÿ@ÿ9ÿ3ÿ0ÿ1ÿ5ÿ=ÿIÿYÿkÿÿ›ÿ¹ÿÙÿý!Gj¬Èàò +9GVdqz€‚~zrjb][[_fmv†‹ŒŠ„zl]N=,òÝÆ±‚|yŠ›±Íí8a‹´Ý&E^s€‡Œ‹‡‚{uokihinsy‹• «µ¿ÈÑÖØ×ÕÐÈÀ´©ž“ˆ}sh[OB2#öéÜÐŹ®¡–‹‚{vuuw{€‡–Ÿ§¯¸ÂÍÛìÿ(;KV\YN8öËžm: Ú¯‰hM9*!   *>Xrލ¿ÓáççáÕî–{`D)ÿøÿâÿÌÿ¸ÿ¦ÿ’ÿ€ÿmÿZÿFÿ4ÿ"ÿÿþõþéþÞþÕþÍþÄþ½þ¶þ¯þªþ¥þ£þ þžþžþŸþ¡þ¤þ©þ­þ´þ»þÃþÊþÑþ×þÛþÝþÛþÙþÕþÎþÆþ¾þµþ­þ¤þœþ”þŒþƒþzþqþiþ_þUþMþEþ>þ9þ5þ4þ5þ7þ:þ@þEþIþMþPþPþMþGþ?þ2þ#þþýîýÚýÇýµý¥ý–ý†ýzýmýbýWýKý@ý3ý&ýýüöüäüÓüÃüµü«ü¤ü¢ü¦ü¯ü¾üÓüìý ý0ýXý…ýµýçþþQþ…þ¸þéÿÿ@ÿeÿ…ÿ¡ÿ·ÿÈÿÓÿÚÿÛÿØÿÑÿÇÿºÿ®ÿ¡ÿ”ÿˆÿ{ÿnÿ`ÿRÿCÿ1ÿÿ þóþÜþÆþ±þþþ~þrþhþcþaþbþeþmþxþ†þ–þ©þ½þÑþçþüÿÿ ÿ/ÿ;ÿDÿIÿKÿJÿFÿAÿ;ÿ6ÿ1ÿ,ÿ'ÿ"ÿÿÿÿ ÿ ÿÿÿ ÿÿ"ÿ2ÿCÿWÿkÿÿ’ÿ¤ÿ´ÿÁÿÏÿÚÿäÿðÿÿ!7Pl‰¦ÃÜó&('$  #.9FRao{‡˜ž¢¢ž˜ƒufWG9+       ÿýùöôõù%@d޾ñ%Z¼å"4=>6&óÓ±‘u]K?98<CKT]fknmh_TD1ðØÀ¨‘|iWG8+þôëäÞÙ××ÙÚÞãæêíðòõùý !+7CP]jvƒŒ”›¡¢¢Ÿ˜Žp\C( 鯢}X5ÿøÿßÿÉÿ¸ÿªÿŸÿ™ÿ•ÿ”ÿ”ÿ—ÿœÿ£ÿ«ÿµÿÀÿËÿ×ÿàÿçÿêÿéÿåÿÛÿÍÿ½ÿ­ÿ›ÿŠÿ{ÿnÿcÿ[ÿTÿOÿJÿFÿBÿ<ÿ5ÿ.ÿ$ÿÿ þúþèþÔþ¾þ©þ•þƒþuþiþbþaþdþlþwþ†þ—þ«þÀþ×þîÿÿÿ0ÿCÿRÿ^ÿfÿiÿfÿ_ÿSÿDÿ1ÿÿþðþÜþÈþ¶þ§þ›þ”þþþþ”þ–þ™þ™þ•þþ…þxþiþXþDþ3þ"þþýüýóýíýçýãýßýÜýÙýÖýÓýÑýÎýÌýËýÊýËýÍýÐýÔýÙýÜýßýÞýÚýÓýÈýºý¨ý”ý~ýhýTýBý4ý)ý%ý&ý-ý9ýLýdý‚ý¤ýÉýðþþBþlþ”þ¼þáÿÿ"ÿ>ÿVÿkÿ{ÿ‡ÿÿ”ÿ•ÿ’ÿŒÿ„ÿ{ÿoÿdÿ[ÿRÿMÿIÿJÿNÿTÿ]ÿgÿsÿ€ÿŒÿ™ÿ£ÿ­ÿ´ÿ¸ÿºÿ¸ÿµÿ°ÿ©ÿ¡ÿšÿ’ÿ‹ÿ…ÿÿ|ÿyÿxÿtÿsÿqÿnÿkÿfÿ`ÿYÿPÿGÿ;ÿ.ÿÿÿþóþåþÖþÊþÀþ·þ²þ±þ³þ¼þÊþÝþõÿÿ7ÿ^ÿ‡ÿ¯ÿ×ÿû7Pcs‰’š¤°¿Ïäû2PoެÇàô!"  õç×Ų†nV>'ñæÝÙ×ÙÝâêóü#'))))''')+.27=ELRW[\\YTOH@93-('')/8DSdwŒ¢·Ìßò)5?JU`ly‡“ «´º¼¹°£x\;òÊ¢|V2óØ¿ª˜ˆ|tnkjmrx€‡’”–”’‹ŠŠ•Ÿ¬¼Îàò(05887420.,*(% ùæÍ²”sQ. ÿîÿÑÿ·ÿ¢ÿ“ÿŠÿ†ÿ‰ÿÿ›ÿ¨ÿµÿÁÿÉÿÏÿÏÿËÿÂÿµÿ¤ÿÿ|ÿgÿSÿAÿ1ÿ#ÿÿ ÿþÿþùþôþïþéþäþÞþØþÓþÍþÇþÂþ¼þ·þ²þªþ£þ›þ’þ‰þ€þyþsþpþqþtþ{þ…þ“þ£þ¶þÉþÞþóÿÿÿ'ÿ5ÿ@ÿFÿIÿIÿGÿBÿ;ÿ4ÿ-ÿ&ÿÿÿÿ ÿÿþýþøþôþðþëþåþÝþÕþËþÀþ¶þªþžþ’þ†þyþmþ`þTþGþ;þ.þ!þþýûýðýæýßýÚý×ý×ýÙýÝýáýçýíýòýøýüþþþþþ þ þ þ þ þþþþþþþþ þþþ!þ-þ<þNþaþxþ’þ­þËþéÿÿ)ÿHÿfÿ„ÿžÿ¶ÿÌÿÝÿëÿôÿùÿúÿ÷ÿñÿéÿßÿÔÿÈÿ¼ÿ±ÿ¤ÿ™ÿÿ€ÿtÿiÿ_ÿWÿRÿOÿOÿSÿYÿbÿmÿzÿˆÿ—ÿ¥ÿ³ÿÀÿÊÿÒÿ×ÿÙÿÙÿ×ÿÓÿÎÿÈÿÃÿ¾ÿºÿ¹ÿºÿ»ÿ¿ÿÂÿÆÿËÿÎÿÐÿÏÿÌÿÈÿÁÿ¸ÿ®ÿ£ÿ—ÿŒÿ„ÿ~ÿ|ÿ€ÿˆÿ•ÿ§ÿ¾ÿÙÿö3Sr§¿Óåô !$(.6@LXerŒ˜ §ª©¤œlW@)ûç×Ƚ¶±®­¯±´¸½ÃËÓÜæòÿ (6DQ^ju˜£¯»ÈÖäó %-120)üæÎµ›iS@1' !'/8DQ^mz†‘™ž¡ š‘…wfVD5& þúöòîéãÝ×ÐËǾº·µ²¯­«©¨¨¨ª¬­°³¶¹¼¿ÃÆÉËÍÎÎËÇ¿·®¥›’Šƒ|xsokf`YQG=2% ÿýÿîÿÞÿÏÿÁÿ³ÿ¨ÿÿ•ÿÿ‹ÿ‰ÿ‡ÿ†ÿ†ÿ„ÿ€ÿzÿrÿhÿ]ÿOÿBÿ5ÿ(ÿÿÿÿÿÿÿÿÿÿ!ÿ$ÿ$ÿ#ÿÿÿ ÿþòþâþÑþÀþ±þ¢þ—þþŠþ‰þŒþ‘þ›þ§þ¶þÆþ×þèþøÿÿÿÿ&ÿ+ÿ/ÿ1ÿ2ÿ2ÿ1ÿ0ÿ/ÿ.ÿ,ÿ+ÿ(ÿ$ÿÿÿÿþüþòþæþÛþÑþÇþ¾þ´þ¨þžþ’þ…þwþiþZþLþ?þ4þ*þ"þþþþþ"þ)þ2þ=þHþRþ^þhþsþ}þ†þþ—þþ£þ¦þ©þªþ«þ«þ«þªþ©þ¨þ©þ«þ­þ±þ·þ¾þÆþÍþÔþÚþßþâþäþäþãþâþàþàþßþßþáþäþèþíþõþþÿÿÿÿ*ÿ6ÿDÿSÿcÿsÿ…ÿ—ÿªÿ¾ÿÓÿèÿü /:BEEA9- ÿóÿåÿÚÿÐÿËÿÈÿÇÿÊÿÏÿÕÿÛÿáÿåÿèÿêÿéÿçÿäÿàÿÜÿØÿÔÿÑÿÏÿÎÿÎÿÍÿÍÿÌÿËÿÌÿÌÿÎÿÎÿÐÿÓÿÕÿÚÿßÿåÿíÿöÿÿ '/5:>@@@ABDHOXbp€‘£¶ÉÛî#3DUfv‡–¦µÁÌÕÛÞßÜÕÌÀ± ŒxdP=,÷îåßÙÓÎÊÇÄÂÀ¿¾¾¾¿¿¿ÀÁÂÅÈÌÒØáêõ+9HVdq|‡–›Ÿ¡¢ ž™“Œ‚xmaUI>4*""(.6=FNW^ejnppnibYNA2"üçй ˆqZF4%")07>ELRX^dinruxxxvtqnkhdb^YSKC9."ÿûÿîÿàÿÔÿÉÿÀÿ¸ÿ±ÿ¬ÿ§ÿ£ÿžÿšÿ”ÿÿˆÿ~ÿtÿiÿ[ÿLÿ=ÿ+ÿÿ þøþéþÚþÎþÄþ¼þ·þµþµþ¸þ»þÀþÆþÌþÒþÖþÚþÛþÛþÚþÖþÑþÌþÅþ¿þ¹þµþ³þ³þµþ¹þ¿þÆþÍþÓþÙþÝþáþâþãþâþáþáþáþãþçþîþöÿÿ ÿÿ,ÿ=ÿNÿ^ÿnÿ{ÿ‡ÿÿ–ÿšÿœÿšÿ—ÿ’ÿ‹ÿÿwÿmÿ`ÿSÿEÿ7ÿ'ÿÿþöþæþÖþÇþ¸þ¬þ¡þ˜þþŠþ…þ€þ|þxþuþqþmþiþeþbþ_þ]þ]þ_þbþfþlþrþzþƒþþ™þ§þµþÅþÖþçþøÿ ÿÿ+ÿ:ÿGÿQÿZÿ`ÿeÿiÿlÿnÿoÿqÿsÿuÿwÿxÿ{ÿ~ÿÿ„ÿ‡ÿŠÿŽÿ’ÿ–ÿ›ÿ ÿ¦ÿ¬ÿ²ÿ¸ÿ¿ÿÆÿÌÿÒÿØÿÞÿäÿëÿòÿø",6AKU_goty{{xrj^O>+ÿýÿäÿÊÿ±ÿ™ÿ‚ÿnÿ]ÿOÿFÿ@ÿ?ÿBÿGÿPÿ]ÿlÿ~ÿ‘ÿ§ÿ¾ÿÕÿî6Og~•«ÁÕèú  (,..,'"  $,38=BDFEDB?<83.)$ þöîäÛÑǾµ¬¥Ÿ›˜––—˜œ ¤©®´¹¾ÃÈÍÑÖÛßåëóü .=KYfr|ƒ‰ŒŒ‹ˆ‚{rh]QC5' ûíßÒǾ¸²°°±¶»ÂÉÑÙáçìñóóñìæÞÕɼ¯ ’‚raP>, ÿûÿíÿâÿÚÿÔÿÑÿÑÿÔÿØÿßÿèÿòÿþ  +5>FLQTWYZ[[YXVSOJD>70*" ÿÿÿýÿúÿ÷ÿóÿíÿæÿÞÿÕÿÊÿ¾ÿ²ÿ¦ÿšÿŽÿ‚ÿvÿkÿ_ÿUÿIÿ>ÿ2ÿ&ÿÿ þÿþñþãþÕþÈþºþ¬þ þ–þþ…þ€þ}þ}þ€þ…þŒþ—þ£þ²þÁþÑþâþòÿÿÿÿ'ÿ/ÿ6ÿ;ÿ>ÿ@ÿAÿAÿCÿCÿEÿGÿJÿMÿPÿSÿVÿXÿZÿ\ÿ\ÿ]ÿ]ÿ]ÿ]ÿ^ÿ_ÿ`ÿbÿeÿhÿkÿnÿpÿrÿrÿqÿoÿkÿfÿ^ÿVÿMÿCÿ9ÿ.ÿ#ÿÿÿþÿþùþõþòþðþîþïþðþñþòþôþõþõþõþôþòþðþíþèþäþßþÚþÔþÎþÉþÆþÃþÁþÂþÄþÉþÏþØþâþîþûÿ ÿÿ%ÿ3ÿ@ÿLÿXÿbÿkÿtÿ{ÿ‚ÿ‰ÿÿ–ÿÿ£ÿªÿ°ÿ¶ÿ¼ÿÁÿÆÿÊÿÍÿÑÿÓÿÖÿØÿÙÿÚÿÜÿÞÿàÿâÿåÿèÿëÿîÿñÿõÿøÿü %.6>FNU\bhlprstroje]TI<.ÿþÿìÿÛÿËÿ¼ÿ°ÿ¥ÿžÿ™ÿ˜ÿ™ÿžÿ¥ÿ®ÿ¹ÿÅÿÒÿàÿîÿü &4AO]kx†”¡®¼ÉÕáíø "',/1220-+&# ý÷ðèßÕËÀµª —ˆ„€…‰•›¡¦«®²´¶·¸¸¹º¼¿ÃÈÎÖÞçðù ÿ÷îåÜÓʺ³­§£Ÿœ™˜——–•’Œ‡{sjaWMC7-"ÿþÿ÷ÿðÿëÿæÿáÿÞÿÛÿÙÿ×ÿÖÿÖÿ×ÿÙÿÜÿáÿçÿîÿöÿÿ!(.256530,'! ÿýÿúÿ÷ÿóÿñÿîÿìÿéÿçÿåÿâÿßÿÜÿØÿÔÿÐÿÍÿÈÿÃÿ¾ÿ¹ÿ´ÿ®ÿ¨ÿ¢ÿ›ÿ“ÿŒÿ„ÿ}ÿuÿmÿdÿ\ÿTÿLÿEÿ=ÿ5ÿ.ÿ&ÿÿÿÿ ÿþýþ÷þòþîþêþèþçþæþçþèþêþîþñþõþùþþÿÿÿÿÿÿÿ$ÿ*ÿ/ÿ5ÿ:ÿ?ÿDÿIÿMÿRÿVÿZÿ^ÿaÿdÿgÿiÿkÿmÿnÿpÿqÿsÿuÿvÿwÿyÿzÿ{ÿ|ÿ}ÿ~ÿ~ÿ~ÿ~ÿ}ÿ|ÿ{ÿxÿwÿsÿpÿmÿiÿfÿbÿ_ÿ[ÿXÿUÿRÿOÿMÿJÿHÿEÿCÿAÿ?ÿ=ÿ;ÿ9ÿ8ÿ7ÿ6ÿ5ÿ6ÿ6ÿ7ÿ8ÿ8ÿ8ÿ8ÿ8ÿ7ÿ6ÿ5ÿ4ÿ3ÿ3ÿ2ÿ3ÿ4ÿ5ÿ9ÿ<ÿ@ÿEÿKÿRÿZÿbÿkÿuÿ€ÿ‹ÿ—ÿ¤ÿ±ÿ¿ÿÌÿÚÿçÿô %,03432/,'"#)06<CINRVXZZZYVTQMJFB>:62.)%!   )3=HS_ju€Š”¦®µ¼ÂÇÍÑÖÚÞáäæéëìííííìëêèæäáÞÚÖÑÌÆÁ»µ¯ª¥ œ™—•”“’‘‘ŽŒ‹ŠŠŠŒ’•™ ¤¨«¯²´·¹º»¼¼¼»º¹¶³°¬§£ž˜”ŽŠ†‚}|{{{{{||}}~€ƒ…‡‰Œ’”–˜™™˜–’…}sh[OA3& ÿøÿïÿçÿàÿÚÿÕÿÑÿÍÿÊÿÈÿÆÿÅÿÅÿÅÿÆÿÇÿÊÿÍÿÑÿÕÿÚÿÞÿãÿçÿêÿíÿðÿñÿóÿôÿôÿõÿõÿõÿöÿ÷ÿøÿùÿúÿûÿûÿüÿüÿûÿúÿùÿ÷ÿõÿóÿðÿíÿëÿçÿäÿàÿÜÿØÿÓÿÎÿÉÿÃÿ¼ÿµÿ®ÿ¨ÿ¡ÿšÿ”ÿŽÿˆÿƒÿ~ÿzÿvÿrÿoÿkÿhÿdÿaÿ]ÿYÿUÿQÿLÿHÿCÿ>ÿ:ÿ5ÿ1ÿ-ÿ*ÿ&ÿ$ÿ"ÿ ÿÿÿÿ!ÿ#ÿ&ÿ)ÿ-ÿ2ÿ7ÿ<ÿAÿFÿJÿOÿSÿWÿZÿ\ÿ`ÿbÿdÿgÿiÿkÿmÿoÿqÿtÿvÿxÿzÿ}ÿÿ‚ÿ†ÿ‰ÿŒÿÿ“ÿ—ÿšÿÿ ÿ¢ÿ¤ÿ¥ÿ¥ÿ¥ÿ¤ÿ¢ÿ ÿÿšÿ—ÿ“ÿÿÿŠÿˆÿ†ÿ…ÿ…ÿ…ÿ†ÿˆÿ‰ÿŒÿÿ’ÿ•ÿ˜ÿ›ÿÿžÿŸÿžÿÿ›ÿ˜ÿ”ÿÿ‹ÿ†ÿ‚ÿ~ÿzÿwÿuÿtÿsÿtÿuÿvÿwÿzÿ|ÿÿ‚ÿ†ÿ‰ÿŽÿ’ÿ˜ÿžÿ¤ÿ«ÿ²ÿ¹ÿÀÿÇÿÎÿÕÿÜÿâÿèÿîÿóÿùÿþ  %*049>BFIKMOPPQPPPPPPPPOONMKIGD@=84/+&!   &-4;BIOV\bglrw{€„ˆŒ“–™›žŸ ¢£¤¥§©«­¯±³µ·¸¹ºººº¹·¶´²°®«©§¤¢Ÿœ˜”Š„~xqib[TOIEB@??@BEHLPTX\_behjloqstvwyzzzzzyxxwvuutsrponljheca_][YWUSQOMKIGEDB@><:740,'" ÿûÿõÿñÿíÿéÿåÿâÿàÿÞÿÜÿÛÿÚÿÙÿÙÿØÿØÿÙÿÙÿÚÿÚÿÛÿÛÿÜÿÜÿÛÿÛÿÚÿÙÿØÿ×ÿÖÿÔÿÓÿÑÿÐÿÏÿÍÿÌÿÊÿÉÿÈÿÆÿÅÿÃÿÂÿÀÿ¿ÿ¾ÿ¼ÿ»ÿ»ÿºÿ¹ÿ¹ÿ¸ÿ·ÿ·ÿ¶ÿ´ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ¨ÿ¦ÿ¤ÿ¢ÿ ÿžÿœÿ›ÿ™ÿ˜ÿ–ÿ•ÿ”ÿ“ÿ’ÿ‘ÿÿÿÿŒÿ‹ÿ‰ÿ‡ÿ†ÿ„ÿ‚ÿ€ÿ~ÿ|ÿzÿyÿwÿvÿuÿuÿtÿtÿtÿtÿtÿtÿsÿsÿsÿrÿrÿrÿqÿqÿqÿrÿsÿuÿwÿzÿ~ÿƒÿ‰ÿÿ•ÿœÿ£ÿ«ÿ²ÿ¹ÿ¿ÿÄÿÉÿÍÿÐÿÓÿÕÿÕÿÕÿÔÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÄÿÃÿÂÿÂÿÁÿÁÿÀÿ¿ÿ¾ÿ½ÿ¼ÿºÿ¸ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ¨ÿ§ÿ¦ÿ¦ÿ¦ÿ¦ÿ§ÿ§ÿ¨ÿ¨ÿ©ÿªÿ¬ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿ¸ÿ»ÿ¾ÿÁÿÃÿÆÿÈÿÊÿËÿÌÿÍÿÍÿÎÿÎÿÎÿÎÿÏÿÐÿÑÿÓÿÖÿÙÿÝÿâÿçÿíÿòÿøÿý  !#%'),/258;>ACEGHIIHHFEC@=;851.+(&#! "%),159>CHNSX]bfjnqstvvvutrqomkjiggffghikmoqsvxz|~~|ywtqmifb^ZVRNJGC@=:864322234568:;=>@ABBBBBA@?>=<<;;;;;<<===>>>==<;:8764310.-+*)('&%$#!  ÿýÿûÿøÿöÿóÿñÿðÿîÿìÿëÿêÿèÿçÿæÿåÿäÿâÿáÿàÿßÿÝÿÜÿÛÿÙÿØÿ×ÿÖÿÔÿÓÿÒÿÐÿÏÿÎÿÍÿÌÿËÿËÿËÿËÿËÿËÿÌÿÍÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÕÿÕÿÕÿÕÿÕÿÔÿÒÿÐÿÎÿËÿÈÿÅÿÁÿ¾ÿºÿ·ÿ´ÿ±ÿ®ÿ¬ÿ«ÿªÿ©ÿ©ÿ©ÿ©ÿªÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ²ÿ²ÿ²ÿ²ÿ²ÿ±ÿ±ÿ±ÿ°ÿ°ÿ°ÿ°ÿ°ÿ¯ÿ¯ÿ°ÿ°ÿ°ÿ±ÿ²ÿ³ÿ´ÿµÿ¶ÿ¸ÿºÿ»ÿ½ÿ¿ÿÀÿÂÿÃÿÅÿÆÿÇÿÈÿÈÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÈÿÇÿÇÿÆÿÆÿÅÿÅÿÄÿÄÿÅÿÅÿÆÿÈÿÉÿËÿÍÿÐÿÒÿÕÿ×ÿÚÿÜÿßÿáÿãÿåÿæÿèÿèÿéÿêÿêÿêÿêÿéÿéÿèÿçÿæÿåÿäÿãÿâÿáÿáÿàÿàÿàÿáÿáÿâÿãÿãÿäÿåÿçÿèÿéÿêÿêÿëÿìÿíÿíÿîÿîÿïÿðÿñÿòÿóÿôÿõÿ÷ÿùÿúÿüÿþ  "$'*,/135789::9876420-+)&$"   #'+/269<?BDFGHIIIIHHGFDCBA?>=<;;:::99999888877776666655554433210/.-,+*)('&%$"!  ÿþÿüÿûÿùÿ÷ÿöÿõÿôÿóÿòÿñÿñÿñÿðÿðÿðÿðÿðÿðÿðÿðÿðÿðÿðÿïÿïÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿåÿäÿãÿâÿâÿáÿáÿàÿàÿàÿßÿßÿßÿßÿßÿßÿßÿàÿàÿáÿâÿãÿãÿäÿåÿæÿçÿçÿèÿèÿèÿèÿèÿèÿçÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÝÿÜÿÜÿÛÿÛÿÚÿÚÿÚÿÚÿÚÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÙÿÚÿÚÿÚÿÚÿÛÿÛÿÜÿÜÿÝÿÝÿÝÿÞÿÞÿßÿßÿßÿàÿàÿáÿáÿâÿâÿãÿäÿåÿåÿæÿçÿçÿèÿèÿéÿéÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿêÿëÿëÿëÿìÿìÿíÿíÿîÿîÿïÿïÿðÿðÿñÿñÿòÿòÿóÿóÿôÿôÿõÿõÿöÿ÷ÿ÷ÿøÿøÿùÿùÿúÿúÿûÿûÿüÿüÿýÿýÿýÿýÿþÿþÿþÿþÿþÿþÿýÿýÿýÿýÿýÿýÿýÿþÿþÿþÿþÿÿÿÿÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿstk-4.5.0/rawwaves/tommiddr.raw0000644000076600007660000006720412327014024014335 0ustar garyêÀ¤Y® — “TØð h$Ý&¿(((Ä+k-Ò/Ï.’070¼0m2å2#1¯.ß3>;3o,=/­8a;.Í ¬6sMGZm^;X$D“%7ëçvË!¶Ä©ù¥±¤é¢ïŸ&œd™Áša›U–M’÷‘ì∃÷„‡*ˆ{‡ÿŽçœ?®BÀªÑÞmåðé~íiñ¤î±è±èŒê¿ípñdønûGùóuîõ# ¾'P'l"Øe …úºëªàûÖÃÊ@½'³]¬¤ š‘ì Dšb¢ª¢Ö ©¢³® ¿‘Ìԋܺçó=ûÊýüþŒŒ  */ù³ôôùÐ=Ú5ÙH\QuTR@RY?a¤c3cweÑj.m\k cvXNCþ;Eï P× S0+Ú ÇT×È ¯ D z YŠƒ$\-5‡>±J¹V„_3e hŠhNhèmrWx |«~˜}w¬o·eB\kU8M¼G†C/>#95]3ð2H,<"Œú©p»7çó¹æŽßEØcÒAÎ-ÌxÎÆÓ0Ӌ͉źÁŽÃjÈÅËLÈëÅÄÄŒÂæÃóÏaäÈøÌMzsíÚ þTõ@ê¥å€â‘àŽßÂâDåñçåÀâ¸Ý־ЂËçÈ—Äb¿È¼õ¿ ÄãÊ ÎÑÛÕ›Ø5ÚMÛÚzÙ&ÕYΩǰÄÇ!ÍWÔºÚQÞ‘á†ß†ÚJÖ?Õ÷ØÜŸázæÆí¯÷…ÿçÅÿ/û\øÅö ô1ñ:ìæòå<è.ìùíÝèîà×ÐÊÎ~ÐIÒ÷Ô%Ô Ò†Ð½Ï«ÏØÏÎ?ΆЛÓÔÑ*ʲÅ.Ã×ÉXÓFÜÏá4à?ÜÐÛÀàeèzïóõú޳ FÌ ´$.q6¸9÷9I7N4£2^1Â1À1!01.l-J,R,@ CøG¿INH2E:B(?<;ç7û3[.#(“%i#93fò‚âÅmQF™!Õ#G"† Yylßò« í ǰ ý6ùõ®÷wù¾ü»ÿSÖÀà G `[mbåšÙL8d ¾ÁdüõòñØñò>ò×òlò&ðçïíƒìFëãë éÙçâšÞóÝ ÞXâúêìõ ÿȸâe—üâ>NÅ É™ýªö¼ò¡ð íé-ä¹ádßUÝÙùÕÏ&É¨Æ€Æ¥ÈæÉõÈxÄ’¿xºß·´“³»³†³Æ´´ú¶6·¹H»´¾öÂÅ{ÉvÎßÕ÷ݾåé®ìuî©ð›ò$óó¿óÁóò<ò[óÉõ1öb÷=÷›÷õ£ó¾óYõ*ù ýÿÍtÿúÿpþçþî"Pÿ¬qúÎô‰îþê¢ç±åûåHä`â›à§à.âIævëÑð„ô÷Ôüb^#K8"£&3'ï(ç*`+ò,Á,S*à)…&ˆ"?‚ÿK ˜ ë Òx i € ˜Sœ?-uˆ=¤úA?öÿ ö4î]çÍâÂߢßtâõêõ50ü”(ô1®8=AE4H´K¹MÔN°NML®I¸EäAV;á4Ž,r%~åº/…oÄ ²· Z!û$j&­'$†q´{ òÙq“w ÁÚ™ªÓrý\û4ûüÌC#Uý ˆ.ìôIåe«;õùòwêâÛ~×<ÕŒÖäÛžãCì2ôøû ýXýøþý,ú‘öwò6îÙìÅìjíñðÖôÊùyÿ& "Þý÷MñÀí9èñåsãáŽà–à1à¾âìæÔëÔð–ôNõüôŽðôì¿èÐåáÇß(ÝbܦÜùÞàãã£åšæÂæ¬äúâoàÞvÝmÝÝGÝ܈Û[ÙâØÔ×è×(Öÿ××Tן×רÙCÛGÞ›âôçê5ëLê”éè è¶êøíYîºîVìŸêêéèÝèÕéšë$ì×îìðêò¤óqòÃñ.ïmî‚î›ïðGñ÷óËö[øðû¢ýãÿ4ÿ™%À÷KbL×Ô É/G!&k*_-¯042y3[1À/a,U)%¬"” U¾©úJUWžÇã ·IAý›úútþðvA-|nI=vÔ –@S5 (íE!™)¯0„5(786Ÿ3»/–+²(½&I#è!¢b€°÷“Ú)8k ã ¿Ñ K ‡  §V5 Ø ¹XÅü¼ùÏøøPù×û¬ü¾ýtÿ£xU  d  ø ɬ.‘ ú$-%¾&%#ú!õÀ·Ë “9ûózî<ëÎéÜé]êÉêÕëOì8ëÒëÔíºïGïlíèÎâû܈Õ÷Ð~Ì¾ÊØËÌÔφÓ.ÖˆØóܶá äaæåÇãéâªá÷âPã(äâç·ë–ï¨ô¡ù¼þ—LÊ®‘þ=øëônñªðJððþñÑò•ó>ò¯òñ§ñrñ8ð$îLë³èšæ¡å´åËåälámÝ[ØÌÔìÑ:ÎPÌäÌÍ ÏÑîÕ†ÙâÞ)â;æ éðíüñoôö~ùüŒç  1 X ½Ðžâ„†Á ù ƒ ) º —P5i9E®²ÿ›üèú)÷Aóˆîïéðåoá®ßPßBá©å·éáíÓñô ÷hûs¶> æ ã Íø¹ K$“*S0‚5T88w6Ã3l.ý+t)¡)l* *,)Q( &3$!ì—>å-w¼:ˆÅ_L W ©t*qP³.—¥å € Ú¹€ÇÛkŠe™nÒÅ)2 ¦ ç ‚ Ü?y´»è!%!Š £ØeÛP²   ¿ã„ Õ<ùüÅ÷öóÛñMñó õÄ÷¹÷¤õÝòî„êÕèaèGêFìññ“õÜù7üü¨üÄü£üvýÙÿ¨Y³„ï‡ÈæÿuþÑý2üŠþy:? G ‚Žý·øôZó–ô{õô^ñíƒèâÍ݆ÙÝØ×)Ö—ÖRÕ®ÔùÕÔzÔÓàÓÀÔÊÖíÙÊÝXáäOçñëÜîrðð·ï˜íAê=æûäÕãÂãÖäoåsæÈé)ìÉñ†÷üõ:°€gˆüc÷ñèîë1é®é”éÉê­ëàí:ï•ñäó‘ôÀôÀô òaðEîÏíóí)ìfëêhëíñÛ÷=ü/4®ßÿUBýæû»ùÐ÷Ùõèô¯ôü÷ úÈÿ»Z ïe{‚øCq¨ w 7-‰Ç[­ì  C à œðgêõù Ó/„­±‘6³Í,Œ š À r¾ 4 â Ê^ 3ÃPÐXŠZ*Q ß#%Ù'&Ó$n ô«…?6$bôsÿ¢·™Tï/d#> — à4fôï™%-uÿ#f]Ì è Ú\ŠòNþ¥?x3 #L(§Þô•%ÿ ÿÿ×ùpÿaý·û/÷ýô€ðíìýè·äná;ßÄß–à à*àEà4ààJàóâ¨äNæÂé—ì¯ð‹ô’÷íúŒûÖûšú÷zôò0ðÂðÝòõ0ø~û„þÿwM)§;gýÿùsôˆðBíêôêHê•ë³ì°íìŒë©êFè£æ·ä@ámÞeÛÙ¸ÙÙåÛßÞ-à™âoãfãÐä2ä¡åwæpçìéé»éøéòéµéÚê]ë“íIï\ñ.ò‚ó&óò©ò—óôõ‹÷oùœûuü¢ýý!ýþÍö‘ ÒÅ /ãø±RõÑÕà×`êSý›ùÐö¥ô\òñòPòòò&òcò¬ó{õXø|üüµù]ª¡F}«ü) l/ÎLg !Ú$%Œ&|&ˆ&o&3%$#g!@rý×: & ßKC|p x™< ”\ì°\#ƒ“7Òb Q ÷ tëQéDx&QŽA^Žœïˆ™¢"4z¦ z Ç 1 *l²}™âÿü‘ûû(ü~þ´|"Y ~ -¢ ^gÿ þƒþ'þŒÿxBÉ •ÿjýËüú³ú/úú|ûMü2ýýœýgü#ù½õúñ€ícéþç¿æÊæÝçÃé[ëkívï ððð“ðbïçîßíì>ê±èíçeåÓä$âáßåßsßËàÓâ°åçÉê¼íèðýó‰õ¼÷“øæù‘ù¥ùbùFù{úŒûáý<þÿ•ÿ¾þ®üqùRõØòHïKí,ëßëHê†ê-êÌë¹ììîUï—ð½ñ„ò5òúóÙô›õõ=õ2ôÕôô-ó–òËòLñsðïÈïqïþñ_òãôÂö*÷ø·ùaúú•ûMü…þÿØiq/ÏJÿÐþjü¾úèøõ÷1õ¾ô±ô€õövøùlúïü@ý€þyÿ/ÿcÿþÕþPý6üDû{û]üüõþÿ!`ú'¤ ± ”_S¢±©!X"@##™#ð#!" øxBÛrñ¿\„„Ò<Vª™ý‘ñ· r J äå~,íÀÃoÀïN[ ‡ ç ƒ³ù}NQ¥–Z D ʘ矈¢[¶ú÷õ‰CÈbì ¾Nþæý¨üŠü)ü™ýÿ‚ø:ûÖ L‘ D ) ù9üÓúXøÑ÷ý÷È÷ëøSù>úyûðý9þþý]ûöù÷÷þö>õhõFö÷&øùùèùùù­ù÷ÕömôÉòÒðvîìêé˜éèôè¯èDç?æåQäèä×äáä±äVãíã[ãâðãMäi嵿¿ç æÙåääÐã´âæâÌã|åç©êsíIï÷òQôôéõmõéöŠ÷_ø3øÝùù+ùEù_ù_úû üIýJýáþŒþÉþ’ýÂühúãù$÷šö ôxó ñªð>ï~ï…ðñQòòõ ÷ø×úúŽú‘úœúÈû…üný¢þÃÏ®Di.¯3Hpò0dRÞÀsCÈb0š‡ .@½„7ÿºÿ²ÿòÿù‚ƨ#Ô×7y  # ë ¤ Ž =0'&{OÀÓÖ5H¤âÅB)Ö,;ô;|ÓxnÖ¼ ×OÐñŽ HÝ^ Ê ˆ | è ‰ @ ÿ Ö ä Á ù 3%s4 } Ë # « w J 6 + ÿ ™  Ï • T ~Ú0vt]îsÿcý¶û÷ûúùû¬ý7ÿ%<‡ý2~þMü.ú¦ù•ùkùÑû<ýbÿV„…<Snÿrý³ûÃù'ö^óËñ~ïËîâîòïîñÈó»õKöö%õ^ôòcðRîLì¾ëÇë0ëëDëíìóîVïüñ¸ó‚õWöÔøJù“úZúƒúhúùøêønøø ø÷ç÷öùõýôšóñKï“î3í ì-ëRê1é-èBçNæ‡æ.æ<ædæ»æÝæÑæ‚æå£å^åBå5åæ<ç3è}éçëNì í§îrï>ðMñ@òEóbôTôîõwöö“÷øòú±ü¨þ‰HÚ÷ÿ§þüû^û7û‚üký‹þƒÿS\G¨¹è_Œ‡ê·êHÚe f ò   à • M ¾)cÐRY>:]ªèú h O x€Ä^SÚ¦2¸R ´ ­ I ¤ÄC½è o š6œÖÞ¸`°™¾vÆ& ˆ K q  L ú  ´^æJ®ô]f¯¿ ß X K ¹¦öIuVÁ¬ñ¹4w ü ä ÿ T  ï ò í Ù ± j B ðô   ' $ N Œ § w *®Ûï`!CÈ”j … èÿügúZùGùù\úúÿû›ü-ü›üãýýMýFüÐû±ùæ÷fôhñtîÑìÌëxêËêâë”ìí³î¯ï.ïîpíYì"ë êé³éŽéÔê(ê€êïëXëÚìyííÇî‘ï+ï¡ððMð{ðõñàódõ›øiû«þø ·¥Ž~ФHÿ¨ýúÔøÍöëõôuó«ó8òáò•òOñÃñð8ï)íàìë3é×è½çÞçgçOçŸè"è«é:é‰é‰éRé)é8éˆê.ë=ìqíËï0ð¨ò5ó±õq÷rù}ûŸýžÿwïÜ,ü_“ÿÇþôþJýÂýYý ü¶üLûÉû"ú€ùüù–ùPù-ù<ù~ùùúžûŠüŸýÐÿ#€Îý²,é8y¨¦¯¥ ÂYd  ç î´2"˜¹¨¢ÈRžðmø^ŽŽ}wƒŠZÞñ)]ºiB‰mÏ·k ¢ ´ Ê&‘ v S M % » & y Ã Õ È Ä Š * ç H š Ù t ? ñ "  T f c K X W Z € ¿ Å | : ³ 'ˆçU९üHn9¶ÖÖöwY³>å_†xŸ.ÔŠxx¥ýgÚ=tˆ\õTa$wþpüJúeøå÷û÷…÷÷ïøù-ùšùËù©øù÷Ëö)ôAò<ð,îì>ê»é¨èòèmè,è9èé`êAë6ì$ìõí¿îEî²ïïð ð¿ñkò$òåóˆôô‚ôŠôRóêó[ò¡ñùñfñðñññRñÃòUòðóuóíôWô¿õ*õ‚õÉõáõÊõsôÚóêò£ñCïüîîîíˆí/íí9í„íïîyîüï°ðŽñbò5ó óÔô¿õöz÷Pøø³ù9ùŸùùú^úÓû7ûûÛü0ü›üäý ýKý®þŽÿè¡¡ªo¸ l nÓ½BvKÿñý¢ûtù­øT÷–÷øù)ú¨üPýÝÿ,<ÇXÅLaS"Ôv<?¨€­Ø Ë a Á ç þ 9 † Ø + … ŶËìù  ÓFv“ŽTÖ^½8Û«Š{i\q™Õ-†Ñß‘H~¨ â  ; p Ö { e x ¨ æ M ¯ ý 6 e — … O  ¨ & q ¦î]ÐIÃF½;¯!›»\74t¤ê*Q8õl¯þ\ÿÜÿtÿFÿÿí‰6ì¥7›ÝÿîŦoz Šÿ?ýÑü7ú¼ù,÷±öôœóSò2ñbð¹ð6ïÉï^îÞîkíãíaìôì–ìsì¨íí¦îjïbðcñmòtójôRõBööª÷(÷v÷¹ø ø“ùQú<û;üIýKþ þ“þãþèþýËüúâøÿöëôÒòºðÏïí{ìêðêéyé!èÔè¢èè€è¿ééaéËêDêîë©ìpíoîšïïñ=òLó0ó¶óëóÌóhòèòò7ò-òó/ô6õdö¹øùBú#úÇû:ûˆûÈûÿüPü¼ý+ýžþþZþlþpþ-ýØýjüòü˜üPü3üGüý:þ2ÿ„¹XÃýð· 3 ` :¾ C‰ø°¶ ·¿{î 3 + ® Ú ›  s å µ Û 8 ½ m  Ë R ° ó(hÏAÂÜaÏ. ­ T : 8 S n x [ Ô 6 2 }ðÑ  p S B /éÏ«[âµ9É~"ú A‚§¢m÷?T 9  ' k Þ s ¥(~Ì'p²äýí ÿSþèþÆþìÿ?ÿ義Ÿ{<Íå|Õó >±ryÌm%®ÞcÑö 2ÿˆÿþØþáþúÿ(ÿ%þ¬ýàü¤ûù8÷gõ€óŽñ·ðîÑíäíQí ííí*íHí[íNí7í@ímí®íáî%îoîºï%ï¾ðqñNò-óóØô©õföö´÷(÷|÷©÷¼÷¿÷Í÷ïø4øŠøÉø÷ùùùøûøÑøœøcø"÷Ã÷;ösõqôQóñàð£ï‹î®îíÎí§í‘íí[í;í(í<ípíëî¡ï›ð®ñÄòàôõ+öA÷Bø!øÕùSù­ùÝùíú úTú©ûûªü-üÉýiý÷þzþãÿ=ÿšÿå (;[ƒÏËÃ|ÿûÿ_þäþhýëýzý%üÇüXû×û^úáú€ú“úøû²üÇþÿÂ"œâÕ ‰  ¨ , £ < ì ³€Fñq¤†'y– ¢ × ? ó ð    Ák¯[d1°f Œ µ Þ & µ ˜ Ö Z Ù Ç¡?ž©nð? – ï f õ   ®  ß d  ½ N ¬ Ò µ p  Œ ø T ì Ÿ o b f « é ú í ª : œ½šGæ†*Ùÿ·þÍþý¨ý€ýýÓþþPþ‚þ­þ³þ þþmþ<þýæýØýïþþWþ·ÿ*ÿ­LìtæA…ÀgÌD¾]p=–„!•ÿ1ýýýüLû½û7ú›ùËøµ÷öôZò–ðåïaî$íOìÚì­ìµìåí)ímí¯íÄí·ííOí$íí&í“îJïKðÅò€ôgö€ø™úˆü6ý‡þxÿ%ÿ…ÿÿnþüþLýcüOû#ùëøÏ÷ÕöáõþõBô¢ô óƒóòòñ­ñBðÆð3ïwî¡í¸ìÖì#ëÇë ë¨ëÑëòìì7ìeì¬ííÅî™ï¦ðéò=ó õ öf÷Éù+ú}û½üâýÑþ‡ÿÿgÿ–ÿ¤ÿ˜ÿyÿWÿEÿ@ÿ`ÿ±±fÇ<t`ŒïT㘈¢Ë#ݶz-ñ_›ÐšuÆ©¥²Æçú õ å µ h  ”ˆßöÂp £ _ H M m ¢ Ô CiŠŸ©ºÑäð¥ U r } | ÙlMƒå P ½ ! { à ï . V s ³ Ï É ¢ N Ô C ± *ΫŠ ¢ H  þ ß ¦9’®™5 ¦ ì = ~ Ö 8 ‰Éòâ¯_ë]þÒýéýOýýý1ý;ýQý0üåüvûüû‘ûú±ú[ú,ú$ú>úYúúØûDûÑüfüéýHý˜ýÙþBþåÿ·©œs%¤×“ßÁ8ÿý˜û—ùŽ÷qõ6òúðÊî¾ìîëwê^é˜é7é4é‘ê=ëìííøîÔï~ð ðpð»ññ<ñmñ˜ñÏòò€óó®ô†õ‰ö§÷ëùXúÞü…þ8ÿÏP­¿ô{šQ¬þÒüÏúÅøÈöýõtô5óIòœò6ñýñÁñ†ñUñ#ðõðàðÔðèññgñ·òòyò¼òðóó.óVó•óÙô5ô©õ1õæö¸÷¤ø£ù²ú×ûüüòýÏþPþ¡þ¾þ–þ=ýÜý{ý6ýýý&ýgý¤þþnþ þ£þœþ[ýðýýü¨üSü?üzý ýäþ×ÿï8—ÕúܧTç Z Ç 2 p ˆ t @ ö ýz¿¼¡ ‰ ± $ ·ký6 Wu^ø‚    „ µ T T ž  n Ý A ­  ‰ ñ ^ ×e¨D¿úù¼G¹ ¿ £ q = Þå€çÜï[´!¡”D\*²øîδÑ8ܲ®·ÍÝÏÓþPÁZ"Ü„H ¥Ð®QÿÝþgý1üPû×ûÌü=ýþ)ÿ‰âC”°1¦éøÑ­w'­ 3;311ÿ'þ#ý8übû¥ûúqùÚù<ø€÷ºöæöõ1ôLógò{ñiðKïíÓìyëéÄè˜ç©çæãç ç˜èmé{êºìívîãðSñ±óô–ö4ø ùåû±ýLþ–ÿ…(qn/ÿÂÿ@þ´þ*ý¬ý;üÃüSûèû‹û2úÉúMùÐù=øœ÷î÷0öõÝõ#ôbó˜ò±ñÍðëð3ï¢ï)îçîÝïïrððçñàòüô1õŒöêøTù·û ü>ýXþIÿ"ÿÊWÒ=«n½ ;?%î ;¿Lù¼¸Úd­ßüá¡DÖYÿ×ÿDþ¬þý‚üýü‰ü<üü ü4ü…ýý«þmÿ:û伌YÔ¢g Y P . à f Ê  < P ` | »*Ì‹X¡ëô®'zÃD Œ Ý B ¶ 9 Ù š ^ E &  Ú ¤ n J %  * f Ö e ï } å % + ÷ ¤ Y   # T Ž Ñ  Z œ Ä Ë £ U Ó ' d šÌCŽÓAl‹¥±ÿÀþÄýÐüãûèûúCùøáøP÷à÷v÷0÷÷A÷‘ø-ø÷ùÐú»ûyüüDüVüMü:üüüüLü«ý6ýüþû9¤)­Þ<=Í ë²^qÿ þÜþý(ü úÊù_÷áöSôÅóYò+ñ?ðœðMð?ðaðŽð´ðÎð½ðŸðoð;ððððXð¾ñQò òÑó±ô¢õ—ö—÷ø„ùwúqûqütýoþhÿCÿðbv/ÿ«ÿþ9ýOü`ûtú–ù×ù9ø¸øL÷ö÷¤÷@öÃö0õwô£ó±ò¸ñÄðëð2ï±ïaï2ïïï+ïKï|ï¶ïöð@ðœññÙòÎôõhöôø¦úXûøýwþÏÿòâ«MÈ.š zørêdÛD’»¸‚lš£”ƒ‚® ÿªÿ~ÿÿÉr¾íûìÊ m1ÿßÿØÿûJ¹XÏ™h)Ü…¢$º ^  Ò œ g & à|øEcQ£" š ( Ù Ÿ ’ ¬ ã ( c y d   ¼ Þ õ )U‹ÉhÍ5®6ËzH9P“øyú{÷vþ‰.öäñ  = P BŠàüã¡@ ä › w r € ‰ • œ ” m  • Ñ Ð 8¥ú2\ÿnýû¾úøv÷õãôãôó|ó*óóTóéô‘õ[öM÷2øøîù­úfû-üüñýåþÓÿ¡DÆ5žð#Hr¯÷3\mYâþ÷ý–ûöú@øpöôªò¶ðÌîüíqì@ë}ë êïëëQëñìÐíëï:ðŽñåó2ôfõ‘ö¬÷·ø¯ù—úeûû§üüˆüåýFý ýíþ,þdþ•þÄþäÿÿÿþÝþ¡þIýéýnüäüJûŽúÀùÝøÙ÷Ëö˜õiôRóeò½òbò8òKò“òöó|ôô¯õIõÍö7ö…öÉ÷÷@÷s÷¬÷ëø3ø{øÓù)ùkù¡ùÎúú4ú\ú€ú¡ú¾úÜûû9ûšüü°ýaþ#þôÿÂ{›ß÷à¢Làr#z ÆŒYÁUÉ)øÓª}Qîʦ„[0׫޹³Œ›Ô % t ² Ó ËŒf|f1î‘+ Ä I Õ k  â Ô Ù  9 f ¡ Ð ð   Û ™ 1 ¶ ' í 9q¡°ÀÊ×ö5«_MsÚs?BbŽy.°þ ýÆ…@ âÇ»®¢‘k<ö¡Iï¤j4߬sO:*ÌtõT–¯ÿ´þ£ý“üŽûœúÞú6ù½ù€ù}ùÃú+ú£û(ûËünýý–ýñþýÒýaüÔü'û|úÛúPùóù­ùù‡ù±ù÷úNú¹û'û­ü'ü•üìý4ýWý`ýHýüÄüSûÂûú^ù¢øÂ÷Èö«õƒôgólò–ñãñ\ðüðÊðÒññuñöò¢óNôôËõ”öf÷8øøºù^ùèúQú‘ú®ú¶ú¤ú‰úYú+ú ùéùÃù¥ù‘ùŽù—ù•ùù^ù/ùøãø¹øŠøA÷Ú÷Mö¢õìõ:ô‘óìóeòýòßóóqô$õö÷<ølù“ú®û²ü”ýYþþšÿ ÿ¨"Œå1n‘—j ”ÿ¬ÿRÿþØþÃþÄþÒþüÿ1ÿfÿœÿ¶ÿ·ÿ–ÿQþòþþý~ý ü®ü€üvü¢ýý­þˆÿ©×"4-Ö‰ 1 Ñ c Õ : ½ à © `  – % » g % ìäãäâäÞÝÕǯŒdMA;H`‰Û 7 — õ I • å  ; > ,  ì Ë ¼ ¸ Á ¹ ¨ „ I ì òB|±ê7š·‰~™Ø/•uÎ)†Û<•í7s´Ôÿ  K ] Z T 2ÓU“«®•ƒ€›Õ=ÿ¿ÿdÿ!þãþ©þRýþý®ýdý$ýýý)ý\ý•ýÌþþþ)þ6þ$þþ ýîýÑýÄý½ýÆýÞýßýáýÓý²ýsýü¤üûmúÌúùRø½ø1÷Ì÷|÷@÷ öÛö öZö õ¤õHôôô­ôôôµôûõKõ¡õ÷ö.ö`ö}ö‘ö©öÆöì÷/÷Š÷þø‹ù;ùðú¬ûPûÜüMüžüÖüãü×ü¬ümü%ûÕûŠûGûúÏúúCùôùŸùVù ø°øbø÷£÷Iöæözöõ¯õYõ ôÍô°ô¦ô¸ôåõ1õ~õÝö7öŒöÝ÷÷`÷÷»÷íø4øwøÑù)ùˆùðú\úÁû(ûüü~üíýWýÃþ,þ…þÎÿÿÿ4ÿ>ÿBÿ,ÿÿÿÿÿÿÿ þÿþæþ×þÎþÕþçÿÿDÿ|ÿÊuØ5ýr÷fÆ6K=÷.vÝqÖ¬Œ o G ö } ç < € µ ã ÿ    Ç | , Ð u $ È d  £ Iö¦s`]l‡™·ÆØãÝÌ«v8ðšPºup„œ¼à4wµì+bŒ¦´»´ˆCàmë\É1¤­S ص£¶ÃàNz©©“e«*®7Ü“w¶œ5À7†½¶9ÒqΜr;ÊDÿ÷ÿ–ÿ:þÎþkþýïýÊýÄýÈýÄý¾ý«ýŠýMüóü”üûƒúûú\ù¹ùø0÷?öKõDô<óCò^ñ¤ñðÁðŸð°ðöñhñíòŽó.óÏôjôïõbõÖö4öŠöæ÷Q÷ºø%øøâù.ù_ù}ù”ù¯ù¶ù¸ù¸ù³ù¯ùÀùÜùüú*úVúƒú®úÙúìúðúÞú®ú~ú6ùëù‘ù4øÆø^÷ò÷‘÷;öîö»ö¥ö¶öé÷8÷÷õø^øÇù,ùuù¸ùæùýúú:úbú”ú½úçûûGûpûšû¶ûÏûðüügüÇý2ý¯þ4þ¹ÿ6ÿ¯Ú-avsMÍn ÿ¡ÿAþåþþEýýý½ý—ý}ývý}ý‡ý‹ý¦ýÖþþ‰ÿÿ³_"ç¨X÷„d®ù6a‰µöIÃCÑ _ è ` Ð 6 › ü X ¤ å  * .  ï ž 0 ª  l ¾ "Æk\gНá!Ry—ª­§™~snk€žÅõ 1 r · ù 9 z ½ ÷ / Q k _ G  Þ — F Î P¾^¨°µÓ[ÈIÿëÿ¨ÿxÿOÿ%þåþ–þ1ý½ýBüÕü|üBü-ü>ü…üéý}þþµÿRÿØHËÙÈ©˜’˜«ÝY¢é)Sƒˆh+¿6ÿuþîþ~þýÔý ýýjýZý2üòü”üûrú½ùçøûø ÷ö,õEôwó¶óòƒòñ¥ñ\ñCñ5ñJñ|ñ×ò;òÒóô>õõíöÈ÷˜øQøðùsùÙú"ú^ú|ú›ú­úÀúåúûûû3ûjû°ûñü0üfü£üÔüðüòüÎü‘ü(û¡úøú3ù^ø‹÷³öØöõ3ôuóÜóXòîòò]ò+òòò)ò[ò˜òåóDó¿ôXõ õÔö´÷šøvùYú0úõû¨ü4ü»ý2ý”ýíþKþ¿ÿFÿå‹=ñ™*¡OqqCô“'¾g ëÝìAmŸÓ&@PWZLFJ]q‡¬ÐêþûíÍšoN0%3d¸Š„{Ù3‚Àõ!Gf{•³Ø  b Ï B ¾ ; ®  P c d > ú ¤ > Ì _ û ‘ 5à‹@ýÀ„S&ýÌ¡n>ïÇ{Älã_ÜH¢å  쾑Mݨ~AÇh¡0µ/£+³Lí›O°DÿÉÿHþÄþ>ýÃýný'üüüîüæüùýý>ý‡ýÉþþDþ„þ þÅþÜþãþèþÞþ×þÚþØþÚþÒþ½þ¢þzþUþýÎýgüîüwûéûVú¸úù`ø¬÷ü÷`öÚöXõõõžõdõHõGõRõuõ§õ×ööXöžöá÷+÷p÷š÷Ä÷æøøø.øGøhø–øÆùù[ùªùûú?únú„úˆú}úeúJú,ú ùåùÃù¨ùùtù\ùBù ùøêøØøÑøÔøèøþùùLù|ù¤ùÌùäùñù÷ùïùàùÐù©ùjù'øßø•øQø÷ñ÷Ô÷Ç÷¼÷É÷Ýøø-ø]ø”øÌù ùKùŽùÐúúUúŽúÀúíû)ûfû«üü`üËýFýÅþ>þ¥þòÿ/ÿ[ÿÿ”ÿÿ²ÿÉÿå Bã9ÿhÒ0‘å*n³ê%Nl”Ãê<]šž–“…“¦Çù.k©Ý;Tdi^K2îØº§›¢»Óÿ7rº  B ‘ Ñ  F h r } w Z G  ó ¿ „ H ÏŸ{I#îåéäçÙ±1Ïdès ¢CüÁ–rL+ûá» ‡€ˆ‡„€viVC8+&'7Ff‰¨ÀñEp°ÁÎŧƒW-ýË‹S©=Â1ÿ¥ÿþ}ýêýdüèü~ü ûÒû‹ûKû úÊú„ú5ùÜùŠù1øÏølø ÷ ÷Döåöö:õöõ°õõPõ#õôøôûõõ0õ`õžõïöJö¯÷÷ŠøøzøðùkùäúbúËû)ûvû­ûÚüü üûôûâûËû´ûœû~ûVû(úõú¹úyú>ùøù«ùZø÷øø,÷®÷5ö¾öKõéõ™õVõ*õ ôÿõ õ%õNõ„õ»õôö8örö·öþ÷J÷¤øøbøÑù<ù«ú!ú“ûû‘üüýýþþqþÖÿ9ÿ–ÿé9‚¸àðóëßÙ_ÿðÿ¹ÿ’ÿzÿlÿrÿ‹ÿªÿàVœÐ Hw£Ðí1H]lu~{ƒŠ¦·Ëõ&pÖDº5¤Šõ\¼]‰¨·³²µ´±³¼Õ  C ç L ±  } Ö  Q e O  Ì d í c Ï A´)³AÝ“W#óó +Q‚¹ö(KcgbV8à£gÍy5øÑ´€yypmfO6 Õ¡X׊Jë—kJ'ûÌœi1ÿàÿÁÿ³ÿ±ÿ½ÿÛ/n¾û0l¢Óïøùä¼|ž ÿkþÅþ(ý„üèü]ûÜûqûúÂú|ú9ùøù³ù`ùø¨ø8÷Æ÷LöÙöuöõÁõrõ3õôõôîôùõõ2õ[õõÃö ö\ö½÷0÷­ø*ø²ùEùÖúeúÙûAû£ûúüAürüüü¢ü”ü„üdüAü"üûìûÑû¸û¢û“ûûiûJû%úùúÄú„ú=ùôù¤ùLøäøq÷ó÷möãöXõÓõ[ôôôôXô"ôô ô3ôxôÍõ6õ­ö3ö¿÷I÷ÔøYøÛùVùÃú#ú‚úéûSû¿ü*ü£ý#ý§þ-þ±ÿ4ÿ¹=ÅKÆ.‰Ò /?9'ܲ‰iSD>=:;@FNNG<403F\l|Š”£¯¶ÃÐæ(d¬úXÁ3³'’øY¼#Ší M ¯  w Ø 4 ‡ Ó  P  ¯ Ü  ! / 4 /  ú Ì Ž F õ — / ¼ B à 5ŸfÈ%€âJ½=ËfÞ¸¤¡²Õ:i•¼ã(P}¥Ååÿ1Le|‘¡´ÊØÛ×ǹ €`: מg.÷¾d@!éϱ”i9Ä{7ÿòÿ«ÿnÿ6þ÷þ»þxþBþýÅý‰ýPýüîüÆü™üiü6ûüû¿û†ûIûúÈú‹úOúù×ùùeù(øîø¶øxø>ø ÷Ú÷¯÷‹÷s÷j÷m÷p÷w÷ƒ÷÷¼÷Ü÷ÿø"øCøbøzøŒø™ø©øºøÎøèøþùù+ùBùRùVù\ùcùfùjùgùdùaùRù9ù!ù øúøëøÚøÉø³ø§ø£ø¥ø§ø§ø¨ø­ø°ø¶øÃøÒøãø÷ù ù#ù@ùfù•ùËùýú0ú]úˆú®úÉúÛúæúèúìúìúëúïúóúûûû:ûkû¨ûâüüNü}ü©üÓüýý.ý[ýŠýºýìþ þaþ¬ÿÿeÿÅ(š }æ?‘à'j Ïû;TacW<çªi#ߣmBìÜÒÐÞô?oªí:”ô]ÕPÐUÔWÖL½ ) ô L ¡ ñ < ‚ ¼ î  2 G S J 0 ÿ È ‘ Z ' ó Â Ž Y $ ó à • i 8ý¼rÀYãmø‡#Çy?öéêøę̂}LÚœ] ã«wK%ì̾·¹ÆÜü<UefV5Ò–Yÿäÿ®ÿ…ÿmÿhÿzÿ”ÿ¹ÿè1LJ>#ÿòÿ¦ÿLþêþyþ ýý2üÍüsüûÎû’ûaû<ûûúðúÓú¶ú’újú:ú ùÔù›ù`ù%øëø²øzøBø÷ê÷Î÷¸÷¨÷ ÷¥÷¾÷éø*ø€øâùGù²ú!ú“úÿûeûÁüüQü}ü˜üªü·ü¼ü¸ü£ü„ücü3ûÿû¼ûeúüú‡úùuøâøI÷¯÷öŒöõŒõ ôÆôzôAôôô ô"ôCôsô­ôïõ@õšöövöñ÷xøøù#ùÀú^úýû–ü0üÆýYýéþpþëÿ[ÿÂf§ÓéìÞâu?ÿþÿ«ÿLþæþ}þý©ýFüîü¬ü‚üjüjü…üºýýfýÙþ]þõÿ’2Õu³E×aä]Ë/„Çú-3,ì×Ë¿¹¶°ª¢x`D' èÍ·¦¡¨Àç!lÁ‚çK²  i À 7 Y d R 5 þ ² _õzñ`ÐB¹:Ä`à½ÄÜ=‚Ñ&×%i¨Ý&+/473) ýíÓ±[&å—Gîƒ Œó[»‡ÿûÿÿþŸþCýùý¸ýýjýVýUý`ý|ý¡ýÅýìþþ5þVþtþ‘þ®þÎþðÿÿ:ÿ\ÿzÿŠÿÿ‹ÿ‚ÿuÿ`ÿBÿ&ÿ þíþËþ£þsþ2ýêýšý=ü×üpüûûúžúù‹ùøm÷Ü÷OöÌö]öõÃõõyõzõõÁööSö²÷÷ø ø‚ùù{ùëúYú»ûû`û û×üü)üMügüyü‡üü–ü üŸü˜ü‡üfü8ûûû²ûdûú¬úOùñù”ù9øäø—øMø÷±÷k÷/öúöÌö­öö}öuö}ö—ö¾öò÷1÷~÷ÛøDø´ù-ù¬ú0ú²û8û·ü0üýý]ý°ýþþKþ”þÚÿ"ÿgÿ«ÿî(Z„¥¾ÍÏÆ°“k9ÿÌÿÿPÿþÒþ•þ^þ,þýíýáýäýúþþ@þxþ»ÿÿWÿ°qÝNÅDËUâgèaÍ+|Àü3e—Êü)U‚µè X à ö  = S \ X G ) Ï ™ ^ Û”UÒ˜d: "9Uv˜´ÈÎį‰R º^üŸCî¢f8øèè÷*Ij‹®Ôý B`|š˜ŠtV5ò̪[3 êá~O!ã¡Rô‘&©)ÿ›ÿ þþýŽý(üÍüüEüûôûÖûÂûµûªû¦û¨ûµûÆûÔûâûöüü5ücü“üÃüøý1ýný¶þþUþ®þûÿ=ÿxÿ£ÿÌÿáÿêÿàÿ¾ÿ‡ÿAþéþ{þýnüÖü5ûúãú7ùøðø_÷Ù÷WöàövöõÒõ•õnõQõ@õFõYõõ·õõö?ö’öí÷R÷Âø3ø³ù7ùºú=úºû0û üüKü‚ü¬üÄüÏüÁü¡ülü)ûÛû~ûúµúIùåù‹ù8øçøœøWø÷×÷ ÷o÷M÷,÷÷öüöù÷÷÷C÷}÷Ìø/ø¡ùùªúIûûÆü™ýqþDÿÿ±NÖL­þ?o›£™{NÅn Ÿ0ÿÇÿYþòþ˜þTþ&þþþ0þZþˆþÆÿ ÿYÿ¥ÿòB•é;âE¯ ” yëT³i¾ O¢¹ÁÂÀ¾³§•€kWC1&"+<Sk‡¦Éí7a‰¨¿ÉÈÇÆ¸¢€Pã¨k3üÇQã·–ycL:,çÆ¤†tjdcgmw‡–§½Õñ $<Nbr}›¦­«‰jDçžKòŠ)ÀRåmüŠÿ¬ÿ:þÒþuþ ýÊýuýüÅüvü)ûäû¯û‰ûlû\û[ûcûxû‘û¦ûÄûéüü:üWürüƒü…üüjüPü-üûØû®û‡ûdûHû9û6û@ûVûkû€û˜û®û¿ûÉûÆûÀû¼û­û•û{û\û:ûûúêúÑú¸úœú}úVú3úùØù§ùxùUù;ù$ùùøïøÜøÙøØøæøùùù+ùMùgù~ù™ù®ùÄùÛùõúú-úGú^úrú€ú†úŠú‹ú~úlúSú<ú$úùìùÑù½ù©ùù|ùnùkùmùzùù¤ù¼ùÓùïú ú/úZú‹úÁúþûGû”ûèüGü¬ýý‚ýéþQþ´ÿÿ`ÿ¦ÿèRw”«·ÁË×äíðèÚÆ«‡^0ÿÙÿ¸ÿžÿŽÿ~ÿuÿzÿ‡ÿžÿÃÿñ,wÆrÏ1‘îJª“—ž(­.©  … Ú R q u d F  ì ± q .æ™Cî–=è˜Sè¾žŠ‚’«Æßú;^~¹Óëÿ''  íÇ™d.ó´n.ô´~GþéÜÒÊ»¬œŠx];ìÄ¡}`OBA><BKSW]baebR7ïÉp9ù®[ÿýÿšÿ0þÇþ`ýòýý/üÕüü7ûÿûÑû²ûŸûŠû€û€ûˆû†ûŠûŽû•ûžû©û²û½ûÆûÏûÜûèûìûïûøüüüü"ü-ü9üFüRü]ü`üZüIü-ü ûÕû“ûCúôú¤úXúùÂùtù%øÛø—ø\ø/ø÷Ù÷³÷÷v÷k÷e÷l÷~÷›÷Å÷ùø?ø‹øÜù,ùxù¾ùûú.úRúfúmúmúdúVúFú8ú.úú úú ú"ú@úbú„ú¥úÁúÚúíúùúÿúýúñúÝúÆú«ú’ú~úrúlúpú…ú¬úÞûûeû¹üü}üæýPý·þþpþ¿ÿÿJÿ‚ÿ­ÿÐÿçÿ÷ÿüÿùÿñÿéÿÞÿÕÿÉÿ½ÿ´ÿ¯ÿ­ÿµÿÇÿá,^”Í=pŸÍû*X‚¨Ëð<bƒŸ»Ü(Gd…ªÚK†¾÷0iÉê'3=DFHGFGLNPSVXYYXRH>8540'ùëØÃ«“y_H1 ý&6Kdš°ÃËÌʺ§‹i@Õ‘Eê*ÃYò<ì£\á·wdUNLNZfux‚€ytplh`R<% ÿñÿÔÿµÿ›ÿ€ÿ_ÿ8ÿ þØþ›þUþ ý½ýsý$üÐü~ü(û×ûƒû,úØú‹úFú ùÑù®ùù|ùxù€ù‡ùŸùºùÙùûú úFúpú’ú²úÏúæúùûûû)ûDû]ûtûû¢ûºûÎûçûûü üüü ûýûäû¿û—ûdû&úâúšúQú ùÄù„ùIùøäø¾ø¤ø‘øˆø†øŠø–ø¨øÂøÞøöù ùù2ùJùbùuùŒù¦ùÁùÝùüúú>ú_ú}úœú¼úÚúùûû4ûIûZûeûsûûûû¨ûµûÂûÑûäûøü ü,üWü…üµüãýý@ýtý­ýãþþBþkþþ°þÍþêÿÿ6ÿ`ÿ–ÿÍ>u«Ý 5YxŽ¢²¼ÄÎÝó3]•Øj¶TªþPœå(e•»Ùñ"*.-,++/48::::8/çÅ£€V-ܼ£“‰†‰“¢´ÈÞ÷%<Tgx‡Ž‘…yhR7ùÚ¼›~iS=*ïÞØÏÀ¬”uR.Û¨r6üËOݧ{R0ïк©˜› ¥§°¹¾¿µ¨—„pV<ÿõÿÑÿ¬ÿ“ÿ…ÿqÿ\ÿJÿ9ÿ&ÿþÛþ¦þgþ(ýäý’ý9üÒüfûûû•û4úÙú|ú#ùÌùùCùøäøÆø²ø¥øžø¥ø³øÍøêù ù4ùZù}ù£ùÈùèùþúúú*ú9úVúvú–ú³úÎúéûûû6ûMûbûsû€û„û‚ûyûcûKû-û úßú¯ú~úNúùëù¸ù‚ùMùøêøÃø¡ø…øsømøtøƒø¡øÆøòù#ùVùˆùÁù÷ú3úpú©úàûû?ûmûžûÑüüEüˆüÔý$ýsý½þþFþ‚þ¾þóÿ"ÿIÿfÿzÿƒÿˆÿŠÿ‡ÿ‚ÿrÿXÿ7ÿþçþÀþ“þbþ-ýøýÂý’ýhýKý<ý>ýOýqý¦ýæþ0þþÚÿ?ÿ­‘táLµpÆe¯ö4m¡Ìð)>LOME90(öíééëïòõú&0<HWi{‘­Èæ#@Yp„’œ—‡oN$÷ÆY%óˬweSF<78>FNUXYWPE?-ì–c6Ì—e3ܶŽkEùÕ®…W,ß¼’j@ÿíÿÃÿ ÿ}ÿZÿ>ÿ'ÿÿÿÿÿÿ ÿÿ!ÿ2ÿ?ÿKÿWÿeÿiÿgÿfÿbÿYÿQÿHÿ:ÿ(ÿþíþÆþ–þaþ%ýäýŸýVý ü¾üpü$ûÜû”ûOû úËúúTúùëù¾ù™ù~ùmùaù]ù_ùiùwùŽù­ùÑùùú%úSú†ú²úÚúÿû û?ûXûjûzûû‡ûŽû’û’ûŒûƒûvûhûYûGû1ûûúèúÊú¦úúUú)ùûùÐù©ùùVù*øÿøÙø·øšø~øcøNøCø?øDøOøaøwø“øµøÝù ù?ùvù¸ùþúNú¨ûûiûÌü0ü•üüýbýÆþ"þuþÃÿÿBÿxÿ©ÿÓÿó"" ÿøÿêÿÛÿÌÿ½ÿ¬ÿÿŒÿxÿfÿTÿFÿAÿDÿQÿdÿƒÿ©ÿÜX¨ÿ]¼uÎ$zÌ\›Ðÿ'Kjˆ¡·Íâø%=Wo†œ®¼ÅÈÈ·¨•}_?øÖµ–{hXPOTc{›ÁìK±â5QcicP/Ï“TÍ…=ö¯l1ýÒ¯–…|yx{„‘ ³ÁÊÎÑÒÐÌÀ¯œ…oU;"óÚÄ«ŒpP, Þ±{=þ¼w0ÿëÿ¢ÿXÿþÑþ›þlþEþ*þ ý÷ýãýáýäýæýèýîýöýÿþþþþþþýôýèýÝýÌýµý›ýý`ý<ýüåü¯üyü;ûþûÆûû]û*úùúÇú˜úpúHú"ùýùÙù¾ù©ù“ùùrùoùsùzùˆùœù·ùÙùÿú)úRúú¬ú×ûû%ûEûaû{û’û£û±û¾ûÅûÌûÎûÎûÌûÅû¹û¤û‹ûkûKû"úùúÍúŸúrúBúùîùËù®ù˜ù‰ù{ùrùrùzù‡ù—ù«ùÃùÙùöúú<úbú‰ú²úàûûKû‡ûÊüüTü•üÖýýWý–ýÔþþGþxþ£þÊþíÿÿ.ÿDÿUÿ_ÿeÿhÿfÿbÿ[ÿYÿWÿRÿLÿHÿHÿNÿYÿiÿ€ÿÿ¾ÿä >r«æ$c¢å(l°ð*b•Æø,_‘¿è ,EXht{~}zwpjd]SMGBCEKS]jy§ÇìAožÎþ2`Œ±Îèü ÷Þ¿žxQ(üМh-î¬i'ä¡\ÔOÙ¦vK"ÿàÉ»Ìíñü IƵ¢¹ÁÏÃÊÌÎéí£qÄ®g173ø±o*á•L,ÿÓÿ”ÿMÿþªþZþýÙý¹ýŸý]ýüÖü–ü^üûüû¬û\û*ûúõú÷úõúÚúËúÚúÔúäúàúêû+û€ûÂûüü*üWü„ü”ü™ü¯ü¿üÜýýýýüýüüüýý ý üíüÇüµü¤üürüKüûÒû’ûvûmûWû2ûúöú×ú¨ú}údúJú*úùøùìùÐù¯ù”ù|ùmù`ùIù.ùùù!ù*ùùù"ù.ù?ùOùhùù–ù¢ù»ùÓùÐùÒùðú!úJúdúƒú±úìû'û`û˜ûÓü*ü|üÅýýMý•ýÚþþZþŒþ»þÞþõÿÿÿÿ%ÿ;ÿTÿfÿ~ÿÿ·ÿÉÿËÿÂÿÂÿ½ÿºÿºÿ¿ÿÏÿæÿÿ.<FXpŒ¬Û>o¦ì?‘Ù^›Õ GŒÑFez…’¥¸ÂÈËÏ×Þß×É´–sU2 ߸™|\:ñìíùA|¶ì#c«ï0u½ÿ9qžÄãõþíÉœf+ð«bÓ'Ênè¹fÕŽ…ÚÄ9 öøïàËÚtldZ‘Äèüèáͳƽ¤ˆUÇ€+å­kÿôÿ’ÿþ¯þ?ýèý·ýJüêü±ü—ü^üAüûÄûŠûpûGûBûûû!û>ûLûQûHûVûsûrûcû]û?û;û>û,ûúÜúÍúËúÛúùûû û û&ûEûhûûÃûðüü6üüâý5ýtý®ýáþþþ#þEþPþXþHþRþUþ7þýïý¼ýŽýYýüÊüvü5ûóûû0úÅúbúùÛù¡ùiù(øâøšøhø9÷í÷½÷¶÷Ö÷ôø ø-øeø°øýùIùùáúPú¸ûûpûÇüürüÏý+ý}ýÊþþHþþ®þ×ÿÿ2ÿgÿ™ÿÎ%FLF>)ÿïÿÃÿ¯ÿ¤ÿ›ÿ–ÿ‹ÿrÿWÿ:ÿþôþÁþ þþeþTþKþ[þˆþ¼þíÿÿTÿ‚ÿ­ÿØD‰ÑHy­í=ß-xÁf´û=qŸÈ÷>[x“¯ÀÌÒÏÌÉÄ¿¬”†vV'òÙf2Ú³‹f=õÔ¿¾º¸ÄÞþ0k†”¦Éàðÿ"2:3ëäϯžž›‡u\5èʰ™†mNùÔ®Šf=ج‚W8þøóìÔµœ€`AÿæÿÎÿÉÿÇÿÈÿÌÿÐÿÂÿ¥ÿÿYÿ+ÿþçþÉþ¡þtþBþýÌýŽýKüüü¿ü‘üjü;ü ûéûÃû˜ûqûKû&ûû!û)û/û;ûLû`û{ûŸûÊûùü.ü`üŒüªüÒüùýý?ý_ýsýý‰ý–ý›ýŸý¦ý ý›ý•ý‘ý•ýŒý}ýjýWýAýüïü¿ü•üiü7üûØû´ûšû‚ûkûTû@û-ûúùúáúÏúÃú´úŸúˆújúSú:ú'úúú úúúú,ú<úKúbú}úúÂúçûû6û_ûŽûÆüüKüžüöýTý³þþpþÁÿÿYÿ ÿÜK…¹è=[qƒ“››{Y2Þ·’kH&ÿÚÿ·ÿ“ÿvÿiÿ`ÿAÿ"ÿÿÿÿ*ÿDÿnÿ¡ÿÜS‡Û/rµýHÔI€¼ö*^“Áì1Lf”Ÿž‹pS7òáÔÏÐÏÆ¾³¢’€fN9-+)*---*üæÕÅ·¬¥£§«µÁÊÑÔÖÓȶ§•ƒoZD/þ!.?FOZh{•x^8Í\,÷¾‡MÖ™b-ÿùÿÄÿ•ÿcÿ/þþþÌþ˜þgþ2ýøýÀýŽýXý"üóüÉü üüfüWüWü]üjüü–ü²üÏüëýýý#ý(ý,ý.ý)ýý ýüðüØüÂüªü›ü“ü…üyüvüxü|ü€ü†üŒü”ü›ü«üÃüØüîýý"ý?ý`ýýžý¸ýÍýÚýâýéýôý÷ýõýöý÷ýôýîýïýðýëýàýÉý§ýýPýüãü¤ücü#ûãûŸûdû.ûúßúÁú«úžú™ú–ú—úœú¦úµúÍúçûû1ûdûšûÔüüRü”üÜý#ýlý²ý÷þ7þsþ¬þÝÿ ÿ9ÿdÿ‘ÿºÿà9Rgw‚…†q_G.ÿèÿÒÿ¿ÿ°ÿ§ÿ§ÿªÿ²ÿ¼ÿËÿÝÿú+:Rj…©ÇÔð$@Up•´Íçù 8Sq›Èð?`~¸Ñì 3Jjƒ–ª±´¹ÀÁÁº¬œˆmU6óÞȵ¢ŒrU7ñàÐļ¹¼ÄÕâêòóóô÷öõíéæãáàÜØÍÁ¸²®¥šx]?# ïØÃ±¦¦«©«®°¬¦y`F%Û»šy]?'ÿüÿÚÿ²ÿ‹ÿhÿAÿþýþÝþ¼þ¡þ…þhþIþ/þýñýÐý«ý‡ýaý@ý ýüïüãüÙüÕüÕüÙüäüóýýý(ý=ýUýlýý”ýžý¡ý ýŸýšý”ý“ýýŒý‰ýˆýŠýý”ý•ý“ýŽý†ý}ýoýaýVýNýJýDý?ý:ý-ý ýýýüúüçüÓüÂü¶ü«ü¦ü«üµüÅü×üíýý!ý?ý]ýxýý¥ý´ý¼ý¾ýºý²ý¦ý–ý€ýhýNý7ýýüñüáüÔüÉüÃü¾üÀüÅüÏüÝüïýý ýBýdýŠýµýßþ þ<þkþþÏþÿÿ/ÿ[ÿ‰ÿ¶ÿæ=f·Üü/ANZ`a^YNB3!úèØÍÆÀ´ª¤¦¨§©´ÀÌÚåñ/@Vr’­Çå;Rkƒš®ÅÝö #4ERZ]]_[UPE5#    #$#$# üïáÒÀª“|h[SNF:,ùíåááàãæèðõù#)-121-#îÞË´™}^<úÔ®„W(ÿýÿÑÿ¨ÿƒÿ^ÿ<ÿþÿþèþÏþ³þ™þ~þiþVþEþ6þ*þ þþþýÿýöýíýâýÚýÔýÎýËýËýËýÌýÍýÎýÑýÕý×ýÚýÜýÝýÛýØýÕýÒýÏýÐýÐýÑýÒýÓýÓýÒýÑýÒýÐýÌýÄý½ý¹ý¸ýºý¿ýÃýÈýÎýÓýÖý×ýØýÚýØýÔýËýÀý´ý¦ý—ýŠý}ýoýbýXýOýJýFýGýMýWýbýnýxýƒýŽýœýªý¸ýÂýÈýÎýÔýÝýçýòýþþ þþ#þ/þ>þOþ`þpþ€þ“þ¨þ¿þÙþóÿ ÿ"ÿ7ÿKÿ[ÿjÿvÿÿƒÿƒÿÿvÿjÿZÿGÿ4ÿ!ÿþÿþïþàþÕþÍþÊþÉþÍþÖþäþùÿÿ*ÿFÿ`ÿ~ÿžÿÁÿå 3_в×ù>^z—´Íåû 0AP\empnhb\N?1#üòëéìîòü )8K[fsy}‡‘˜£©ª©¤  £¢žœ›”‡}uk\NA4#ðãØÍû³­ª§¤¢¦¬²²±¬¨Ÿ•†}seZO@0 óèÞÒÆ¼µ±¬§Ÿš•“’‘Œˆƒ}ulaQB4$ÿïÿÞÿÏÿ¾ÿ¬ÿ™ÿ…ÿrÿbÿQÿ=ÿ%ÿ þõþÞþÅþ¯þšþ‡þtþaþOþBþ6þ.þ(þ%þ)þ-þ0þ2þ7þ?þGþNþTþWþ^þcþfþiþjþhþeþaþ[þTþOþHþAþ:þ3þ.þ*þ%þþþ þýöýíýãýÜýÖýÐýÊýÄýÀýºý³ý¯ý¬ý©ý©ýªýªý«ý©ý¨ýªý­ý±ýµý¹ýÀýÊýÕýâýïýúþþþþ%þ1þ<þGþQþ[þgþuþ…þ“þ£þ°þ½þÉþÕþáþðþÿÿÿ$ÿ8ÿKÿ_ÿpÿ‚ÿ”ÿ¦ÿ¹ÿÍÿàÿò(9FT_hlopoi_SE9-!ÿüÿøÿ÷ÿóÿïÿêÿåÿãÿáÿáÿèÿìÿó-Fa|›¼Þ$KlЧÅàú#;N]iosvvspjcZPG;/#öæÖȼ­Ÿ”‹€wpmjkpwz~—¥«²··¾ÆËËÈû·°¬§œ‰…yi`YOF=5,(%!$%&# þøñìçßÕÍÄ»¯£˜ŒzfR>+ÿéÿÑÿ¹ÿÿ„ÿlÿUÿ>ÿ*ÿÿþõþêþâþ×þËþÃþ»þ´þ°þ°þ±þ°þ°þ°þ±þ²þµþ¹þ¾þÂþÆþÌþ×þäþïþöþÿÿÿÿÿÿÿÿ ÿþûþñþçþÝþÑþÃþµþ«þŸþ“þ†þzþmþcþZþSþMþHþBþ>þ:þ9þ8þ6þ4þ2þ1þ1þ3þ6þ9þ?þDþIþPþXþ`þiþrþ~þŠþ”þŸþ«þ¶þÂþÐþÜþçþîþöþüÿÿÿ ÿÿÿÿÿÿ"ÿ$ÿ%ÿ$ÿ"ÿ!ÿ!ÿ!ÿ"ÿ#ÿ(ÿ.ÿ3ÿ8ÿ>ÿCÿKÿTÿ]ÿeÿnÿxÿƒÿÿœÿªÿµÿÂÿÍÿÙÿãÿîÿ÷$/7?EKSZepz|‚‡Œ‘™¢ª°¸½ÁÄÈËÎÑØÛÝäëò÷  (17@EQZ`fmu‰‘›¥«´»ÁÄÈÇÉÍÎÎÌÊÇÁ¶®£˜†zpg\RG>3(  ùïçÞÕËÁº³«¦¡œœžžž›š™™˜”‘‡‚{tmd\TMF@:3,$ÿÿÿúÿóÿîÿèÿäÿáÿÞÿÝÿÝÿÞÿÞÿÞÿÞÿÞÿßÿßÿßÿÝÿÚÿ×ÿÕÿÑÿËÿÂÿ¸ÿ¬ÿ¡ÿ•ÿ‰ÿ{ÿmÿ^ÿPÿBÿ6ÿ)ÿÿÿþöþëþàþÔþËþÂþ¼þ·þ³þ±þ±þ³þ¹þÀþÈþÒþÜþæþðþúÿÿÿÿ)ÿ4ÿ>ÿFÿNÿSÿVÿXÿYÿXÿVÿRÿNÿIÿCÿ=ÿ7ÿ0ÿ)ÿ#ÿÿÿ ÿþûþôþïþêþæþâþßþÜþÙþÖþÕþÕþ×þÛþáþèþñþúÿÿ ÿÿÿ*ÿ7ÿFÿTÿbÿnÿzÿ…ÿÿšÿ¤ÿ®ÿ´ÿ»ÿÀÿÅÿÊÿÎÿÎÿÐÿÑÿÓÿÔÿ×ÿÚÿÜÿÞÿßÿàÿáÿäÿæÿèÿéÿêÿëÿìÿîÿôÿøÿý(1=IU_kv‹”œ¤«³¹½¾¿¾½¾ÀÃÆÈËÎÑÕØÜáäéíïðïïñòôöúûýýüûüú÷óðíêèçæåãßÜÙÔÏÉþ¹³«¥Ÿ›™–”•–˜šœžžŸ ¢¡£¤¤¡Ÿœ™–’Žˆ€wmdZQG=4+"ÿþÿúÿ÷ÿóÿðÿîÿíÿîÿñÿôÿøÿü  ÿþÿøÿòÿëÿäÿÛÿÔÿÌÿÄÿ¼ÿ²ÿ©ÿŸÿ—ÿÿ‰ÿ‚ÿ|ÿvÿpÿjÿeÿ`ÿ\ÿWÿSÿPÿMÿLÿLÿLÿLÿMÿOÿQÿSÿVÿXÿ[ÿ^ÿaÿcÿeÿgÿhÿjÿjÿkÿjÿiÿhÿgÿeÿcÿ`ÿ]ÿ[ÿYÿWÿUÿSÿRÿSÿSÿTÿUÿVÿVÿWÿWÿYÿ\ÿ`ÿdÿjÿoÿtÿzÿÿ…ÿ‹ÿ‘ÿ˜ÿžÿ¥ÿ«ÿ±ÿ·ÿ¼ÿÀÿÃÿÅÿÈÿÊÿËÿËÿÌÿÌÿËÿÊÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÑÿÒÿÓÿÖÿÙÿÜÿàÿåÿêÿñÿ÷ÿý !##$$&()+,./1257:=?ACEHJMQTW[_cglptx|~„‡ŠŽ‘”–˜™š›žŸ ¢££££¢¡ ž›š™˜—–•”’‘‹Šˆ‡…ƒ‚}zwtpmjeb]YTOJFB>;852/+'$!  ÿþÿúÿöÿñÿíÿçÿâÿÞÿÚÿÖÿÑÿÍÿÉÿÅÿÂÿ¿ÿ½ÿ¼ÿºÿ¹ÿ¸ÿ·ÿ¶ÿ¶ÿ·ÿ·ÿ¸ÿ¸ÿ¹ÿ»ÿ½ÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÎÿÐÿÐÿÑÿÑÿÐÿÏÿÎÿÌÿÊÿÉÿÇÿÅÿÂÿÀÿ½ÿºÿ·ÿµÿ²ÿ¯ÿ¬ÿ¨ÿ¥ÿ£ÿ¡ÿ ÿŸÿžÿžÿžÿžÿŸÿ¡ÿ¢ÿ¥ÿ§ÿªÿ­ÿ°ÿ´ÿ¸ÿ»ÿ¾ÿÁÿÃÿÆÿÇÿÈÿÉÿÊÿÊÿÊÿÉÿÉÿÈÿÈÿÆÿÅÿÄÿÂÿ¿ÿ¾ÿ¼ÿºÿ¸ÿ·ÿ¶ÿ¶ÿµÿ´ÿµÿ¶ÿ·ÿ¸ÿ»ÿ½ÿÀÿÃÿÈÿÌÿÐÿÖÿÛÿàÿæÿëÿñÿöÿü !"#%&%$"!  $(+/37;?DINQUX[]_abdddcba`_^\ZWVSPNKIGEBA?>==>======>?>>?>>?>>==<:99875310-+)'$"  ÿÿÿþÿüÿûÿùÿ÷ÿöÿõÿóÿòÿñÿðÿïÿîÿîÿîÿíÿîÿîÿîÿïÿïÿðÿðÿñÿòÿòÿòÿòÿòÿòÿòÿòÿòÿñÿñÿïÿîÿìÿëÿéÿçÿæÿäÿâÿàÿÝÿÛÿÚÿØÿÖÿÕÿÓÿÑÿÐÿÏÿÍÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÄÿÅÿÅÿÅÿÆÿÇÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿáÿãÿäÿåÿæÿçÿèÿèÿéÿéÿéÿêÿêÿêÿëÿëÿëÿëÿëÿëÿìÿëÿëÿëÿêÿêÿéÿéÿèÿèÿçÿçÿçÿèÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿóÿôÿöÿ÷ÿøÿùÿúÿüÿýÿþÿÿ !#$%&'''((''&%$#" !"#%&'(())***))('&%$"!  ÿÿÿþÿýÿüÿüÿûÿúÿùÿùÿøÿøÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ÷ÿ÷ÿöÿöÿõÿõÿôÿóÿóÿòÿòÿñÿñÿðÿðÿïÿïÿïÿïÿïÿïÿïÿïÿïÿïÿïÿïÿðÿðÿñÿñÿòÿóÿóÿôÿôÿõÿõÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿöÿõÿõÿõÿôÿôÿôÿôÿôÿôÿôÿóÿóÿóÿóÿóÿóÿóÿóÿóÿóÿóÿóÿôÿôÿõÿõÿöÿ÷ÿ÷ÿøÿùÿûÿüÿýÿýÿþÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿstk-4.5.0/rawwaves/twopeaks.raw0000644000076600007660000000100012327014024014331 0ustar gary 'XöbâuÕ¢‚u{“ ¾ û I ª 5Û’Y0 !(#K%}'¼* ,d.Ë1?3¿6K8â;„>1@èC¨FrIEL OQîTàWØZ×]Û`åcógjm7pSssv”y·|Úþ|Úy·v”sspSm7jgcó`å]ÛZ×WØTàQîOL IEFrC¨@è>1;„8â6K3¿1?.Ë,d* '¼%}#K!( 0Y’Û5  ª I û ¾“{u‚¢ÕuâböX' ÿ÷ÿÙÿ¨ÿcÿ þžþý‹üäü+û^ú~ù‹ø…÷möBõó·òVðãï`íËì%ênè§æÐäéâóàíÞØÜµÚƒØDÕöÓœÑ5ÎÁÌAɵÇÄ|ÁÏ¿¼X¹Ž¶»³à°ý®« ¨(¥)¢%Ÿœ ˜ú•ã’É­Œ‰l†Iƒ&€ƒ&†I‰lŒ­’É•ã˜úœ Ÿ¢%¥)¨(« ®°ý³à¶»¹Ž¼X¿ÁÏÄ|ÇɵÌAÎÁÑ5ÓœÕöØDÚƒÜµÞØàíâóäéæÐè§ênì%íËï`ðãòVó·õöB÷mø…ù‹ú~û^ü+üäý‹þþžÿ ÿcÿ¨ÿÙÿ÷stk-4.5.0/README.md0000644000076600007660000002267612327014024011427 0ustar gary# The Synthesis ToolKit in C++ (STK) By Perry R. Cook and Gary P. Scavone, 1995--2014. This distribution of the Synthesis ToolKit in C++ (STK) contains the following: * [`include`](include/): STK class header files * [`src`](src/): STK class source files * [`rawwaves`](rawwaves): STK audio files (1-channel, 16-bit, big-endian) * [`doc`](doc): STK documentation * [`projects`](projects): example STK projects and programs Please read the [Legal and Ethical notes](#legal-and-ethical) near the bottom of this document and the [License](LICENSE). For compiling and installing STK, see the [INSTALL.md](INSTALL.md) file in this directory. ##Contents * [Overview](#overview) * [System Requirements](#system-requirements) * [What's New (and not so new)](#whats-new-and-not-so-new) * [Disclaimer](#disclaimer) * [Legal and Ethical](#legal-and-ethical) * [Further Reading](#further-reading) * [Perry's Notes From the Original Distribution](#perrys-notes-from-the-original-distribution) # OVERVIEW 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 (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. 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 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 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. Snd, Cool Edit, Matlab). The Synthesis Toolkit is not one particular program. Rather, it is a set of C++ classes that you can use to create your own programs. A few example applications are provided to demonstrate some of the ways to use the classes. If you have specific needs, you will probably have to either modify the example programs or write a new program altogether. Further, the example programs don't have a fancy GUI wrapper. If you feel the need to have a "drag and drop" graphical patching GUI, you probably don't want to use the ToolKit. Spending hundreds of hours making platform-dependent graphics code would go against one of the fundamental design goals of the ToolKit - platform independence. For those instances where a simple GUI with sliders and buttons is helpful, we use Tcl/Tk (http://dev.scriptics.com) which is freely distributed for all the supported ToolKit platforms. A number of Tcl/Tk GUI scripts are distributed with the ToolKit release. For control, the Synthesis Toolkit uses raw MIDI (on supported platforms), and SKINI (Synthesis ToolKit Instrument Network Interface, a MIDI-like text message synthesis control format). # SYSTEM REQUIREMENTS See the individual README's (eg. README-linux) in the /doc directory for platform specific information and system requirements. In general, you will use the configure script to create Makefiles on unix platforms (and MinGW) or the VC++ workspace files to compile the example programs. To use the Tcl/Tk GUIs, you will need Tcl/Tk version 8.0 or higher. # WHAT'S NEW (AND NOT SO NEW) 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" 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 been updated to include tick() functions that accept StkFrames arguments. The control message handling scheme has been simplified greatly through the use of the Messager class. It is now possible to have access to simultaneous piped, socketed, and/or MIDI input control 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 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 file types. Though somewhat obsolete, the program Md2Skini can be used to write SKINI scorefiles from realtime MIDI input. Finally, STK should compile with non-realtime functionality on any platform with a 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. # DISCLAIMER You probably already guessed this, but just to be sure, we don't guarantee anything works. :-) It's free ... what do you expect? If you find a bug, please let us know and we'll try to correct it. You can also make suggestions, but again, no guarantees. Send email to the mail list. # LEGAL AND ETHICAL This software was designed and created to be made publicly available 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. 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 administered by the Stanford Office of Technology and Licensing. The good news is that large hunks of the techniques used here are public domain. To avoid subtle legal issues, we'll not state what's freely useable here, but we'll try to note within the various classes where certain things are likely to be protected by patents. # FURTHER READING For complete documentation on this ToolKit, the classes, etc., see the doc directory of the distribution or surf to http://ccrma.stanford.edu/software/stk/. Also check the platform specific README's for specific system requirements. # PERRY'S NOTES FROM THE ORIGINAL DISTRIBUTION This whole world was created with no particular hardware in mind. These examples are intended to be tutorial in nature, as a platform for the continuation of my research, and as a possible starting point for a software synthesis system. The basic motivation was to create the necessary unit generators to do the synthesis, processing, and control that I want to do and teach about. Little thought for optimization was given and therefore improvements, especially speed enhancements, should be possible with these classes. It was written with some basic concepts in mind about how to let compilers optimize. Your question at this point might be, "But Perry, with CMix, CMusic, CSound, CShells, CMonkeys, etc. already cluttering the landscape, why a new set of stupid C functions for music synthesis and processing?" The answers lie below. 1) I needed to port many of the things I've done into something which is generic enough to port further to different machines. 2) I really plan to document this stuff, so that you don't have to be me to figure out what's going on. (I'll probably be sorry I said this in a couple of years, when even I can't figure out what I was thinking.) 3) The classic difficulties most people have in trying to implement physical models are: A) They have trouble understanding the papers, and/or in turning the theory into practice. B) The Physical Model instruments are a pain to get to oscillate, and coming up with stable and meaningful parameter values is required to get the models to work at all. This set of C++ unit generators and instruments might help to diminish the scores of emails I get asking what to do with those block diagrams I put in my papers. 4) I wanted to try some new stuff with modal synthesis, and implement some classic FM patches as well. 5) I wanted to reimplement, and newly implement more of the intelligent and physical performer models I've talked about in some of my papers. But I wanted to do it in a portable way, and in such a way that I can hook up modules quickly. I also wanted to make these instruments connectable to such player objects, so folks like Brad Garton who really think a lot about the players can connect them to my instruments, a lot about which I think. 6) More rationalizations to follow . . . stk-4.5.0/src/0000755000076600007660000000000012327014024010722 5ustar garystk-4.5.0/src/ADSR.cpp0000644000076600007660000001035612327014024012164 0ustar gary/***************************************************/ /*! \class ADSR \brief STK ADSR envelope class. This class implements a traditional ADSR (Attack, Decay, Sustain, Release) envelope. It responds to simple keyOn and keyOff messages, keeping track of its state. The \e state = ADSR::IDLE before being triggered and after the envelope value reaches 0.0 in the ADSR::RELEASE state. All rate, target and level settings must be non-negative. All time settings must be positive. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "ADSR.h" namespace stk { ADSR :: ADSR( void ) { target_ = 0.0; value_ = 0.0; attackRate_ = 0.001; decayRate_ = 0.001; releaseRate_ = 0.005; releaseTime_ = -1.0; sustainLevel_ = 0.5; state_ = IDLE; Stk::addSampleRateAlert( this ); } ADSR :: ~ADSR( void ) { } void ADSR :: sampleRateChanged( StkFloat newRate, StkFloat oldRate ) { if ( !ignoreSampleRateChange_ ) { attackRate_ = oldRate * attackRate_ / newRate; decayRate_ = oldRate * decayRate_ / newRate; releaseRate_ = oldRate * releaseRate_ / newRate; } } void ADSR :: keyOn() { if ( target_ <= 0.0 ) target_ = 1.0; state_ = ATTACK; } void ADSR :: keyOff() { target_ = 0.0; state_ = RELEASE; // FIXED October 2010 - Nick Donaldson // Need to make release rate relative to current value!! // Only update if we have set a TIME rather than a RATE, // in which case releaseTime_ will be -1 if ( releaseTime_ > 0.0 ) releaseRate_ = value_ / ( releaseTime_ * Stk::sampleRate() ); } void ADSR :: setAttackRate( StkFloat rate ) { if ( rate < 0.0 ) { oStream_ << "ADSR::setAttackRate: argument must be >= 0.0!"; handleError( StkError::WARNING ); return; } attackRate_ = rate; } void ADSR :: setAttackTarget( StkFloat target ) { if ( target < 0.0 ) { oStream_ << "ADSR::setAttackTarget: negative target not allowed!"; handleError( StkError::WARNING ); return; } target_ = target; } void ADSR :: setDecayRate( StkFloat rate ) { if ( rate < 0.0 ) { oStream_ << "ADSR::setDecayRate: negative rates not allowed!"; handleError( StkError::WARNING ); return; } decayRate_ = rate; } void ADSR :: setSustainLevel( StkFloat level ) { if ( level < 0.0 ) { oStream_ << "ADSR::setSustainLevel: negative level not allowed!"; handleError( StkError::WARNING ); return; } sustainLevel_ = level; } void ADSR :: setReleaseRate( StkFloat rate ) { if ( rate < 0.0 ) { oStream_ << "ADSR::setReleaseRate: negative rates not allowed!"; handleError( StkError::WARNING ); return; } releaseRate_ = rate; // Set to negative value so we don't update the release rate on keyOff() releaseTime_ = -1.0; } void ADSR :: setAttackTime( StkFloat time ) { if ( time <= 0.0 ) { oStream_ << "ADSR::setAttackTime: negative or zero times not allowed!"; handleError( StkError::WARNING ); return; } attackRate_ = 1.0 / ( time * Stk::sampleRate() ); } void ADSR :: setDecayTime( StkFloat time ) { if ( time <= 0.0 ) { oStream_ << "ADSR::setDecayTime: negative or zero times not allowed!"; handleError( StkError::WARNING ); return; } decayRate_ = (1.0 - sustainLevel_) / ( time * Stk::sampleRate() ); } void ADSR :: setReleaseTime( StkFloat time ) { if ( time <= 0.0 ) { oStream_ << "ADSR::setReleaseTime: negative or zero times not allowed!"; handleError( StkError::WARNING ); return; } releaseRate_ = sustainLevel_ / ( time * Stk::sampleRate() ); releaseTime_ = time; } void ADSR :: setAllTimes( StkFloat aTime, StkFloat dTime, StkFloat sLevel, StkFloat rTime ) { this->setAttackTime( aTime ); this->setSustainLevel( sLevel ); this->setDecayTime( dTime ); this->setReleaseTime( rTime ); } void ADSR :: setTarget( StkFloat target ) { if ( target < 0.0 ) { oStream_ << "ADSR::setTarget: negative target not allowed!"; handleError( StkError::WARNING ); return; } target_ = target; this->setSustainLevel( target_ ); if ( value_ < target_ ) state_ = ATTACK; if ( value_ > target_ ) state_ = DECAY; } void ADSR :: setValue( StkFloat value ) { state_ = SUSTAIN; target_ = value; value_ = value; this->setSustainLevel( value ); lastFrame_[0] = value; } } // stk namespace stk-4.5.0/src/Asymp.cpp0000644000076600007660000000514712327014024012526 0ustar gary/***************************************************/ /*! \class Asymp \brief STK asymptotic curve envelope class This class implements a simple envelope generator which asymptotically approaches a target value. The algorithm used is of the form: y[n] = a y[n-1] + (1-a) target, where a = exp(-T/tau), T is the sample period, and tau is a time constant. The user can set the time constant (default value = 0.3) and target value. Theoretically, this recursion never reaches its target, though the calculations in this class are stopped when the current value gets within a small threshold value of the target (at which time the current value is set to the target). It responds to \e keyOn and \e keyOff messages by ramping to 1.0 on keyOn and to 0.0 on keyOff. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Asymp.h" #include namespace stk { Asymp :: Asymp( void ) { value_ = 0.0; target_ = 0.0; state_ = 0; factor_ = exp( -1.0 / ( 0.3 * Stk::sampleRate() ) ); constant_ = 0.0; Stk::addSampleRateAlert( this ); } Asymp :: ~Asymp( void ) { } void Asymp :: sampleRateChanged( StkFloat newRate, StkFloat oldRate ) { if ( !ignoreSampleRateChange_ ) { StkFloat tau = -1.0 / ( std::log( factor_ ) * oldRate ); factor_ = std::exp( -1.0 / ( tau * newRate ) ); } } void Asymp :: keyOn( void ) { this->setTarget( 1.0 ); } void Asymp :: keyOff( void ) { this->setTarget( 0.0 ); } void Asymp :: setTau( StkFloat tau ) { if ( tau <= 0.0 ) { oStream_ << "Asymp::setTau: negative or zero tau not allowed!"; handleError( StkError::WARNING ); return; } factor_ = std::exp( -1.0 / ( tau * Stk::sampleRate() ) ); constant_ = ( 1.0 - factor_ ) * target_; } void Asymp :: setTime( StkFloat time ) { if ( time <= 0.0 ) { oStream_ << "Asymp::setTime: negative or zero times not allowed!"; handleError( StkError::WARNING ); return; } StkFloat tau = -time / std::log( TARGET_THRESHOLD ); factor_ = std::exp( -1.0 / ( tau * Stk::sampleRate() ) ); constant_ = ( 1.0 - factor_ ) * target_; } void Asymp :: setT60( StkFloat t60 ) { if ( t60 <= 0.0 ) { oStream_ << "Asymp::setT60: negative or zero t60 not allowed!"; handleError( StkError::WARNING ); return; } setTau( t60 / 6.91 ); } void Asymp :: setTarget( StkFloat target ) { target_ = target; if ( value_ != target_ ) state_ = 1; constant_ = ( 1.0 - factor_ ) * target_; } void Asymp :: setValue( StkFloat value ) { state_ = 0; target_ = value; value_ = value; } } // stk namespace stk-4.5.0/src/BandedWG.cpp0000644000076600007660000002273112327014024013046 0ustar gary/***************************************************/ /*! \class BandedWG \brief Banded waveguide modeling class. This class uses banded waveguide techniques to model a variety of sounds, including bowed bars, glasses, and bowls. For more information, see Essl, G. and Cook, P. "Banded Waveguides: Towards Physical Modelling of Bar Percussion Instruments", Proceedings of the 1999 International Computer Music Conference. Control Change Numbers: - Bow Pressure = 2 - Bow Motion = 4 - Strike Position = 8 (not implemented) - Vibrato Frequency = 11 - Gain = 1 - Bow Velocity = 128 - Set Striking = 64 - Instrument Presets = 16 - Uniform Bar = 0 - Tuned Bar = 1 - Glass Harmonica = 2 - Tibetan Bowl = 3 by Georg Essl, 1999 - 2004. Modified for STK 4.0 by Gary Scavone. */ /***************************************************/ #include "BandedWG.h" #include "SKINI.msg" #include namespace stk { BandedWG :: BandedWG( void ) { doPluck_ = true; bowTable_.setSlope( 3.0 ); adsr_.setAllTimes( 0.02, 0.005, 0.9, 0.01 ); frequency_ = 220.0; this->setPreset(0); bowPosition_ = 0; baseGain_ = 0.999; integrationConstant_ = 0.0; trackVelocity_ = false; bowVelocity_ = 0.0; bowTarget_ = 0.0; strikeAmp_ = 0.0; } BandedWG :: ~BandedWG( void ) { } void BandedWG :: clear( void ) { for ( int i=0; i 1568.0) frequency = 1568.0; StkFloat radius; StkFloat base = Stk::sampleRate() / frequency; StkFloat length; for (int i=0; i 2.0) { delay_[i].setDelay( length ); gains_[i]=basegains_[i]; // gains_[i]=(StkFloat) pow(basegains_[i], 1/((StkFloat)delay_[i].getDelay())); // std::cerr << gains_[i]; } else { nModes_ = i; break; } // std::cerr << std::endl; // Set the bandpass filter resonances radius = 1.0 - PI * 32 / Stk::sampleRate(); //frequency_ * modes_[i] / Stk::sampleRate()/32; if ( radius < 0.0 ) radius = 0.0; bandpass_[i].setResonance(frequency * modes_[i], radius, true); delay_[i].clear(); bandpass_[i].clear(); } //int olen = (int)(delay_[0].getDelay()); //strikePosition_ = (int)(strikePosition_*(length/modes_[0])/olen); } void BandedWG :: setStrikePosition( StkFloat position ) { strikePosition_ = (int)(delay_[0].getDelay() * position / 2.0); } void BandedWG :: startBowing( StkFloat amplitude, StkFloat rate ) { adsr_.setAttackRate(rate); adsr_.keyOn(); maxVelocity_ = 0.03 + (0.1 * amplitude); } void BandedWG :: stopBowing( StkFloat rate ) { adsr_.setReleaseRate(rate); adsr_.keyOff(); } void BandedWG :: pluck( StkFloat amplitude ) { int j; StkFloat min_len = delay_[nModes_-1].getDelay(); for (int i=0; isetFrequency( frequency ); if ( doPluck_ ) this->pluck( amplitude ); else this->startBowing( amplitude, amplitude * 0.001 ); } void BandedWG :: noteOff( StkFloat amplitude ) { if ( !doPluck_ ) this->stopBowing( (1.0 - amplitude) * 0.005 ); } StkFloat BandedWG :: tick( unsigned int ) { int k; StkFloat input = 0.0; if ( doPluck_ ) { input = 0.0; // input = strikeAmp_/nModes_; // strikeAmp_ = 0.0; } else { if ( integrationConstant_ == 0.0 ) velocityInput_ = 0.0; else velocityInput_ = integrationConstant_ * velocityInput_; for ( k=0; k 128.0 ) ) { oStream_ << "BandedWG::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_BowPressure_) { // 2 if ( normalizedValue == 0.0 ) doPluck_ = true; else { doPluck_ = false; bowTable_.setSlope( 10.0 - (9.0 * normalizedValue)); } } else if (number == 4) { // 4 if ( !trackVelocity_ ) trackVelocity_ = true; bowTarget_ += 0.005 * (normalizedValue - bowPosition_); bowPosition_ = normalizedValue; //adsr_.setTarget(bowPosition_); } else if (number == 8) // 8 this->setStrikePosition( normalizedValue ); else if (number == __SK_AfterTouch_Cont_) { // 128 //bowTarget_ += 0.02 * (normalizedValue - bowPosition_); //bowPosition_ = normalizedValue; if ( trackVelocity_ ) trackVelocity_ = false; maxVelocity_ = 0.13 * normalizedValue; adsr_.setTarget(normalizedValue); } else if (number == __SK_ModWheel_) { // 1 // baseGain_ = 0.9989999999 + (0.001 * normalizedValue ); baseGain_ = 0.8999999999999999 + (0.1 * normalizedValue); // std::cerr << "Yuck!" << std::endl; for (int i=0; isetPreset((int) value); #if defined(_STK_DEBUG_) else { oStream_ << "BandedWG::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/BeeThree.cpp0000644000076600007660000000405612327014024013116 0ustar gary/***************************************************/ /*! \class BeeThree \brief STK Hammond-oid organ FM synthesis instrument. This class implements a simple 4 operator topology, also referred to as algorithm 8 of the TX81Z. \code Algorithm 8 is : 1 --. 2 -\| +-> Out 3 -/| 4 -- \endcode Control Change Numbers: - Operator 4 (feedback) Gain = 2 - Operator 3 Gain = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "BeeThree.h" namespace stk { BeeThree :: BeeThree( void ) : FM() { // Concatenate the STK rawwave path to the rawwave files for ( unsigned int i=0; i<3; i++ ) waves_[i] = new FileLoop( (Stk::rawwavePath() + "sinewave.raw").c_str(), true ); waves_[3] = new FileLoop( (Stk::rawwavePath() + "fwavblnk.raw").c_str(), true ); this->setRatio( 0, 0.999 ); this->setRatio( 1, 1.997 ); this->setRatio( 2, 3.006 ); this->setRatio( 3, 6.009 ); gains_[0] = fmGains_[95]; gains_[1] = fmGains_[95]; gains_[2] = fmGains_[99]; gains_[3] = fmGains_[95]; adsr_[0]->setAllTimes( 0.005, 0.003, 1.0, 0.01 ); adsr_[1]->setAllTimes( 0.005, 0.003, 1.0, 0.01 ); adsr_[2]->setAllTimes( 0.005, 0.003, 1.0, 0.01 ); adsr_[3]->setAllTimes( 0.005, 0.001, 0.4, 0.03 ); twozero_.setGain( 0.1 ); } BeeThree :: ~BeeThree( void ) { } void BeeThree :: noteOn( StkFloat frequency, StkFloat amplitude ) { gains_[0] = amplitude * fmGains_[95]; gains_[1] = amplitude * fmGains_[95]; gains_[2] = amplitude * fmGains_[99]; gains_[3] = amplitude * fmGains_[95]; this->setFrequency( frequency ); this->keyOn(); } } // stk namespace stk-4.5.0/src/BiQuad.cpp0000644000076600007660000000533412327014024012600 0ustar gary/***************************************************/ /*! \class BiQuad \brief STK biquad (two-pole, two-zero) filter class. This class implements a two-pole, two-zero digital filter. Methods are provided for creating a resonance or notch in the frequency response while maintaining a constant filter gain. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "BiQuad.h" #include namespace stk { BiQuad :: BiQuad() : Filter() { b_.resize( 3, 0.0 ); a_.resize( 3, 0.0 ); b_[0] = 1.0; a_[0] = 1.0; inputs_.resize( 3, 1, 0.0 ); outputs_.resize( 3, 1, 0.0 ); Stk::addSampleRateAlert( this ); } BiQuad :: ~BiQuad() { Stk::removeSampleRateAlert( this ); } void BiQuad :: setCoefficients( StkFloat b0, StkFloat b1, StkFloat b2, StkFloat a1, StkFloat a2, bool clearState ) { b_[0] = b0; b_[1] = b1; b_[2] = b2; a_[1] = a1; a_[2] = a2; if ( clearState ) this->clear(); } void BiQuad :: sampleRateChanged( StkFloat newRate, StkFloat oldRate ) { if ( !ignoreSampleRateChange_ ) { oStream_ << "BiQuad::sampleRateChanged: you may need to recompute filter coefficients!"; handleError( StkError::WARNING ); } } void BiQuad :: setResonance( StkFloat frequency, StkFloat radius, bool normalize ) { #if defined(_STK_DEBUG_) if ( frequency < 0.0 || frequency > 0.5 * Stk::sampleRate() ) { oStream_ << "BiQuad::setResonance: frequency argument (" << frequency << ") is out of range!"; handleError( StkError::WARNING ); return; } if ( radius < 0.0 || radius >= 1.0 ) { oStream_ << "BiQuad::setResonance: radius argument (" << radius << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif a_[2] = radius * radius; a_[1] = -2.0 * radius * cos( TWO_PI * frequency / Stk::sampleRate() ); if ( normalize ) { // Use zeros at +- 1 and normalize the filter peak gain. b_[0] = 0.5 - 0.5 * a_[2]; b_[1] = 0.0; b_[2] = -b_[0]; } } void BiQuad :: setNotch( StkFloat frequency, StkFloat radius ) { #if defined(_STK_DEBUG_) if ( frequency < 0.0 || frequency > 0.5 * Stk::sampleRate() ) { oStream_ << "BiQuad::setNotch: frequency argument (" << frequency << ") is out of range!"; handleError( StkError::WARNING ); return; } if ( radius < 0.0 ) { oStream_ << "BiQuad::setNotch: radius argument (" << radius << ") is negative!"; handleError( StkError::WARNING ); return; } #endif // This method does not attempt to normalize the filter gain. b_[2] = radius * radius; b_[1] = (StkFloat) -2.0 * radius * cos( TWO_PI * (double) frequency / Stk::sampleRate() ); } void BiQuad :: setEqualGainZeroes( void ) { b_[0] = 1.0; b_[1] = 0.0; b_[2] = -1.0; } } // stk namespace stk-4.5.0/src/Blit.cpp0000644000076600007660000000405512327014024012324 0ustar gary/***************************************************/ /*! \class Blit \brief STK band-limited impulse train class. This class generates a band-limited impulse train using a closed-form algorithm reported by Stilson and Smith in "Alias-Free Digital Synthesis of Classic Analog Waveforms", 1996. The user can specify both the fundamental frequency of the impulse train and the number of harmonics contained in the resulting signal. The signal is normalized so that the peak value is +/-1.0. If nHarmonics is 0, then the signal will contain all harmonics up to half the sample rate. Note, however, that this setting may produce aliasing in the signal when the frequency is changing (no automatic modification of the number of harmonics is performed by the setFrequency() function). Original code by Robin Davies, 2005. Revisions by Gary Scavone for STK, 2005. */ /***************************************************/ #include "Blit.h" namespace stk { Blit:: Blit( StkFloat frequency ) { if ( frequency <= 0.0 ) { oStream_ << "Blit::Blit: argument (" << frequency << ") must be positive!"; handleError( StkError::FUNCTION_ARGUMENT ); } nHarmonics_ = 0; this->setFrequency( frequency ); this->reset(); } Blit :: ~Blit() { } void Blit :: reset() { phase_ = 0.0; lastFrame_[0] = 0.0; } void Blit :: setFrequency( StkFloat frequency ) { if ( frequency <= 0.0 ) { oStream_ << "Blit::setFrequency: argument (" << frequency << ") must be positive!"; handleError( StkError::WARNING ); return; } p_ = Stk::sampleRate() / frequency; rate_ = PI / p_; this->updateHarmonics(); } void Blit :: setHarmonics( unsigned int nHarmonics ) { nHarmonics_ = nHarmonics; this->updateHarmonics(); } void Blit :: updateHarmonics( void ) { if ( nHarmonics_ <= 0 ) { unsigned int maxHarmonics = (unsigned int) floor( 0.5 * p_ ); m_ = 2 * maxHarmonics + 1; } else m_ = 2 * nHarmonics_ + 1; } } // stk namespace stk-4.5.0/src/BlitSaw.cpp0000644000076600007660000000527212327014024013001 0ustar gary/***************************************************/ /*! \class BlitSaw \brief STK band-limited sawtooth wave class. This class generates a band-limited sawtooth waveform using a closed-form algorithm reported by Stilson and Smith in "Alias-Free Digital Synthesis of Classic Analog Waveforms", 1996. The user can specify both the fundamental frequency of the sawtooth and the number of harmonics contained in the resulting signal. If nHarmonics is 0, then the signal will contain all harmonics up to half the sample rate. Note, however, that this setting may produce aliasing in the signal when the frequency is changing (no automatic modification of the number of harmonics is performed by the setFrequency() function). Based on initial code of Robin Davies, 2005. Modified algorithm code by Gary Scavone, 2005. */ /***************************************************/ #include "BlitSaw.h" namespace stk { BlitSaw:: BlitSaw( StkFloat frequency ) { if ( frequency <= 0.0 ) { oStream_ << "BlitSaw::BlitSaw: argument (" << frequency << ") must be positive!"; handleError( StkError::FUNCTION_ARGUMENT ); } nHarmonics_ = 0; this->reset(); this->setFrequency( frequency ); } BlitSaw :: ~BlitSaw() { } void BlitSaw :: reset() { phase_ = 0.0f; state_ = 0.0; lastFrame_[0] = 0.0; } void BlitSaw :: setFrequency( StkFloat frequency ) { if ( frequency <= 0.0 ) { oStream_ << "BlitSaw::setFrequency: argument (" << frequency << ") must be positive!"; handleError( StkError::WARNING ); return; } p_ = Stk::sampleRate() / frequency; C2_ = 1 / p_; rate_ = PI * C2_; this->updateHarmonics(); } void BlitSaw :: setHarmonics( unsigned int nHarmonics ) { nHarmonics_ = nHarmonics; this->updateHarmonics(); // I found that the initial DC offset could be minimized with an // initial state setting as given below. This initialization should // only happen before starting the oscillator for the first time // (but after setting the frequency and number of harmonics). I // struggled a bit to decide where best to put this and finally // settled on here. In general, the user shouldn't be messing with // the number of harmonics once the oscillator is running because // this is automatically taken care of in the setFrequency() // function. (GPS - 1 October 2005) state_ = -0.5 * a_; } void BlitSaw :: updateHarmonics( void ) { if ( nHarmonics_ <= 0 ) { unsigned int maxHarmonics = (unsigned int) floor( 0.5 * p_ ); m_ = 2 * maxHarmonics + 1; } else m_ = 2 * nHarmonics_ + 1; a_ = m_ / p_; } } // stk namespace stk-4.5.0/src/BlitSquare.cpp0000644000076600007660000000601512327014024013503 0ustar gary/***************************************************/ /*! \class BlitSquare \brief STK band-limited square wave class. This class generates a band-limited square wave signal. It is derived in part from the approach reported by Stilson and Smith in "Alias-Free Digital Synthesis of Classic Analog Waveforms", 1996. The algorithm implemented in this class uses a SincM function with an even M value to achieve a bipolar bandlimited impulse train. This signal is then integrated to achieve a square waveform. The integration process has an associated DC offset so a DC blocking filter is applied at the output. The user can specify both the fundamental frequency of the waveform and the number of harmonics contained in the resulting signal. If nHarmonics is 0, then the signal will contain all harmonics up to half the sample rate. Note, however, that this setting may produce aliasing in the signal when the frequency is changing (no automatic modification of the number of harmonics is performed by the setFrequency() function). Also note that the harmonics of a square wave fall at odd integer multiples of the fundamental, so aliasing will happen with a lower fundamental than with the other Blit waveforms. This class is not guaranteed to be well behaved in the presence of significant aliasing. Based on initial code of Robin Davies, 2005 Modified algorithm code by Gary Scavone, 2005 - 2010. */ /***************************************************/ #include "BlitSquare.h" namespace stk { BlitSquare:: BlitSquare( StkFloat frequency ) { if ( frequency <= 0.0 ) { oStream_ << "BlitSquare::BlitSquare: argument (" << frequency << ") must be positive!"; handleError( StkError::FUNCTION_ARGUMENT ); } nHarmonics_ = 0; this->setFrequency( frequency ); this->reset(); } BlitSquare :: ~BlitSquare() { } void BlitSquare :: reset() { phase_ = 0.0; lastFrame_[0] = 0.0; dcbState_ = 0.0; lastBlitOutput_ = 0; } void BlitSquare :: setFrequency( StkFloat frequency ) { if ( frequency <= 0.0 ) { oStream_ << "BlitSquare::setFrequency: argument (" << frequency << ") must be positive!"; handleError( StkError::WARNING ); return; } // By using an even value of the parameter M, we get a bipolar blit // waveform at half the blit frequency. Thus, we need to scale the // frequency value here by 0.5. (GPS, 2006). p_ = 0.5 * Stk::sampleRate() / frequency; rate_ = PI / p_; this->updateHarmonics(); } void BlitSquare :: setHarmonics( unsigned int nHarmonics ) { nHarmonics_ = nHarmonics; this->updateHarmonics(); } void BlitSquare :: updateHarmonics( void ) { // Make sure we end up with an even value of the parameter M here. if ( nHarmonics_ <= 0 ) { unsigned int maxHarmonics = (unsigned int) floor( 0.5 * p_ ); m_ = 2 * (maxHarmonics + 1); } else m_ = 2 * (nHarmonics_ + 1); a_ = m_ / p_; } } // stk namespace stk-4.5.0/src/BlowBotl.cpp0000644000076600007660000000573312327014024013162 0ustar gary/***************************************************/ /*! \class BlowBotl \brief STK blown bottle instrument class. This class implements a helmholtz resonator (biquad filter) with a polynomial jet excitation (a la Cook). Control Change Numbers: - Noise Gain = 4 - Vibrato Frequency = 11 - Vibrato Gain = 1 - Volume = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "BlowBotl.h" #include "SKINI.msg" namespace stk { #define __BOTTLE_RADIUS_ 0.999 BlowBotl :: BlowBotl( void ) { dcBlock_.setBlockZero(); vibrato_.setFrequency( 5.925 ); vibratoGain_ = 0.0; resonator_.setResonance( 500.0, __BOTTLE_RADIUS_, true ); adsr_.setAllTimes( 0.005, 0.01, 0.8, 0.010 ); noiseGain_ = 20.0; maxPressure_ = 0.0; } BlowBotl :: ~BlowBotl( void ) { } void BlowBotl :: clear( void ) { resonator_.clear(); } void BlowBotl :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "BlowBotl::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif resonator_.setResonance( frequency, __BOTTLE_RADIUS_, true ); } void BlowBotl :: startBlowing( StkFloat amplitude, StkFloat rate ) { if ( amplitude <= 0.0 || rate <= 0.0 ) { oStream_ << "BlowBotl::startBowing: one or more arguments is less than or equal to zero!"; handleError( StkError::WARNING ); return; } adsr_.setAttackRate( rate ); maxPressure_ = amplitude; adsr_.keyOn(); } void BlowBotl :: stopBlowing( StkFloat rate ) { if ( rate <= 0.0 ) { oStream_ << "BlowBotl::stopBowing: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } adsr_.setReleaseRate( rate ); adsr_.keyOff(); } void BlowBotl :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); startBlowing( 1.1 + (amplitude * 0.20), amplitude * 0.02); outputGain_ = amplitude + 0.001; } void BlowBotl :: noteOff( StkFloat amplitude ) { this->stopBlowing( amplitude * 0.02 ); } void BlowBotl :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( value < 0 || ( number != 101 && value > 128.0 ) ) { oStream_ << "BlowBotl::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_NoiseLevel_) // 4 noiseGain_ = normalizedValue * 30.0; else if (number == __SK_ModFrequency_) // 11 vibrato_.setFrequency( normalizedValue * 12.0 ); else if (number == __SK_ModWheel_) // 1 vibratoGain_ = normalizedValue * 0.4; else if (number == __SK_AfterTouch_Cont_) // 128 adsr_.setTarget( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "BlowBotl::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/BlowHole.cpp0000644000076600007660000001505312327014024013145 0ustar gary/***************************************************/ /*! \class BlowHole \brief STK clarinet physical model with one register hole and one tonehole. This class is based on the clarinet model, with the addition of a two-port register hole and a three-port dynamic tonehole implementation, as discussed by Scavone and Cook (1998). In this implementation, the distances between the reed/register hole and tonehole/bell are fixed. As a result, both the tonehole and register hole will have variable influence on the playing frequency, which is dependent on the length of the air column. In addition, the highest playing freqeuency is limited by these fixed lengths. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Reed Stiffness = 2 - Noise Gain = 4 - Tonehole State = 11 - Register State = 1 - Breath Pressure = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "BlowHole.h" #include "SKINI.msg" #include namespace stk { BlowHole :: BlowHole( StkFloat lowestFrequency ) { if ( lowestFrequency <= 0.0 ) { oStream_ << "BlowHole::BlowHole: argument is less than or equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } unsigned long nDelays = (unsigned long) ( 0.5 * Stk::sampleRate() / lowestFrequency ); // delays[0] is the delay line between the reed and the register vent. delays_[0].setDelay( 5.0 * Stk::sampleRate() / 22050.0 ); // delays[1] is the delay line between the register vent and the tonehole. delays_[1].setMaximumDelay( nDelays + 1 ); // delays[2] is the delay line between the tonehole and the end of the bore. delays_[2].setDelay( 4.0 * Stk::sampleRate() / 22050.0 ); reedTable_.setOffset( 0.7 ); reedTable_.setSlope( -0.3 ); // Calculate the initial tonehole three-port scattering coefficient StkFloat rb = 0.0075; // main bore radius StkFloat rth = 0.003; // tonehole radius scatter_ = -pow(rth,2) / ( pow(rth,2) + 2*pow(rb,2) ); // Calculate tonehole coefficients and set for initially open. StkFloat te = 1.4 * rth; // effective length of the open hole thCoeff_ = (te*2*Stk::sampleRate() - 347.23) / (te*2*Stk::sampleRate() + 347.23); tonehole_.setA1( -thCoeff_ ); tonehole_.setB0( thCoeff_ ); tonehole_.setB1( -1.0 ); // Calculate register hole filter coefficients double r_rh = 0.0015; // register vent radius te = 1.4 * r_rh; // effective length of the open hole double xi = 0.0; // series resistance term double zeta = 347.23 + 2*PI*pow(rb,2)*xi/1.1769; double psi = 2*PI*pow(rb,2)*te / (PI*pow(r_rh,2)); StkFloat rhCoeff = (zeta - 2 * Stk::sampleRate() * psi) / (zeta + 2 * Stk::sampleRate() * psi); rhGain_ = -347.23 / (zeta + 2 * Stk::sampleRate() * psi); vent_.setA1( rhCoeff ); vent_.setB0( 1.0 ); vent_.setB1( 1.0 ); // Start with register vent closed vent_.setGain( 0.0 ); vibrato_.setFrequency((StkFloat) 5.735); outputGain_ = 1.0; noiseGain_ = 0.2; vibratoGain_ = 0.01; this->setFrequency( 220.0 ); this->clear(); } BlowHole :: ~BlowHole( void ) { } void BlowHole :: clear( void ) { delays_[0].clear(); delays_[1].clear(); delays_[2].clear(); filter_.tick( 0.0 ); tonehole_.tick( 0.0 ); vent_.tick( 0.0 ); } void BlowHole :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "BlowHole::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif // Account for approximate filter delays and one sample "lastOut" delay. StkFloat delay = ( Stk::sampleRate() / frequency ) * 0.5 - 3.5; delay -= delays_[0].getDelay() + delays_[2].getDelay(); delays_[1].setDelay( delay ); } void BlowHole :: setVent( StkFloat newValue ) { // This method allows setting of the register vent "open-ness" at // any point between "Open" (newValue = 1) and "Closed" // (newValue = 0). StkFloat gain; if ( newValue <= 0.0 ) gain = 0.0; else if ( newValue >= 1.0 ) gain = rhGain_; else gain = newValue * rhGain_; vent_.setGain( gain ); } void BlowHole :: setTonehole( StkFloat newValue ) { // This method allows setting of the tonehole "open-ness" at // any point between "Open" (newValue = 1) and "Closed" // (newValue = 0). StkFloat new_coeff; if ( newValue <= 0.0 ) new_coeff = 0.9995; else if ( newValue >= 1.0 ) new_coeff = thCoeff_; else new_coeff = ( newValue * (thCoeff_ - 0.9995) ) + 0.9995; tonehole_.setA1( -new_coeff ); tonehole_.setB0( new_coeff ); } void BlowHole :: startBlowing( StkFloat amplitude, StkFloat rate ) { if ( amplitude <= 0.0 || rate <= 0.0 ) { oStream_ << "BlowHole::startBlowing: one or more arguments is less than or equal to zero!"; handleError( StkError::WARNING ); return; } envelope_.setRate( rate ); envelope_.setTarget( amplitude ); } void BlowHole :: stopBlowing( StkFloat rate ) { if ( rate <= 0.0 ) { oStream_ << "BlowHole::stopBlowing: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } envelope_.setRate( rate ); envelope_.setTarget( 0.0 ); } void BlowHole :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); this->startBlowing( 0.55 + (amplitude * 0.30), amplitude * 0.005 ); outputGain_ = amplitude + 0.001; } void BlowHole :: noteOff( StkFloat amplitude ) { this->stopBlowing( amplitude * 0.01 ); } void BlowHole :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "BlowHole::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_ReedStiffness_) // 2 reedTable_.setSlope( -0.44 + (0.26 * normalizedValue) ); else if (number == __SK_NoiseLevel_) // 4 noiseGain_ = ( normalizedValue * 0.4); else if (number == __SK_ModFrequency_) // 11 this->setTonehole( normalizedValue ); else if (number == __SK_ModWheel_) // 1 this->setVent( normalizedValue ); else if (number == __SK_AfterTouch_Cont_) // 128 envelope_.setValue( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "BlowHole::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Bowed.cpp0000644000076600007660000001237412327014024012475 0ustar gary/***************************************************/ /*! \class Bowed \brief STK bowed string instrument class. This class implements a bowed string model, a la Smith (1986), after McIntyre, Schumacher, Woodhouse (1983). This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Bow Pressure = 2 - Bow Position = 4 - Vibrato Frequency = 11 - Vibrato Gain = 1 - Bow Velocity = 100 - Frequency = 101 - Volume = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. Contributions by Esteban Maestre, 2011. */ /***************************************************/ #include "Bowed.h" #include "SKINI.msg" namespace stk { Bowed :: Bowed( StkFloat lowestFrequency ) { if ( lowestFrequency <= 0.0 ) { oStream_ << "Bowed::Bowed: argument is less than or equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } unsigned long nDelays = (unsigned long) ( Stk::sampleRate() / lowestFrequency ); neckDelay_.setMaximumDelay( nDelays + 1 ); neckDelay_.setDelay( 100.0 ); bridgeDelay_.setMaximumDelay( nDelays + 1 ); bridgeDelay_.setDelay( 29.0 ); bowTable_.setSlope( 3.0 ); bowTable_.setOffset( 0.001); bowDown_ = false; maxVelocity_ = 0.25; vibrato_.setFrequency( 6.12723 ); vibratoGain_ = 0.0; stringFilter_.setPole( 0.75 - (0.2 * 22050.0 / Stk::sampleRate()) ); stringFilter_.setGain( 0.95 ); // Old single body filter //bodyFilter_.setResonance( 500.0, 0.85, true ); //bodyFilter_.setGain( 0.2 ); // New body filter provided by Esteban Maestre (cascade of second-order sections) bodyFilters_[0].setCoefficients( 1.0, 1.5667, 0.3133, -0.5509, -0.3925 ); bodyFilters_[1].setCoefficients( 1.0, -1.9537, 0.9542, -1.6357, 0.8697 ); bodyFilters_[2].setCoefficients( 1.0, -1.6683, 0.8852, -1.7674, 0.8735 ); bodyFilters_[3].setCoefficients( 1.0, -1.8585, 0.9653, -1.8498, 0.9516 ); bodyFilters_[4].setCoefficients( 1.0, -1.9299, 0.9621, -1.9354, 0.9590 ); bodyFilters_[5].setCoefficients( 1.0, -1.9800, 0.9888, -1.9867, 0.9923 ); adsr_.setAllTimes( 0.02, 0.005, 0.9, 0.01 ); betaRatio_ = 0.127236; // Necessary to initialize internal variables. this->setFrequency( 220.0 ); this->clear(); } Bowed :: ~Bowed( void ) { } void Bowed :: clear( void ) { neckDelay_.clear(); bridgeDelay_.clear(); stringFilter_.clear(); for ( int i=0; i<6; i++ ) bodyFilters_[i].clear(); } void Bowed :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Bowed::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif // Delay = length - approximate filter delay. baseDelay_ = Stk::sampleRate() / frequency - 4.0; if ( baseDelay_ <= 0.0 ) baseDelay_ = 0.3; bridgeDelay_.setDelay( baseDelay_ * betaRatio_ ); // bow to bridge length neckDelay_.setDelay( baseDelay_ * (1.0 - betaRatio_) ); // bow to nut (finger) length } void Bowed :: startBowing( StkFloat amplitude, StkFloat rate ) { if ( amplitude <= 0.0 || rate <= 0.0 ) { oStream_ << "Bowed::startBowing: one or more arguments is less than or equal to zero!"; handleError( StkError::WARNING ); return; } adsr_.setAttackRate( rate ); adsr_.keyOn(); maxVelocity_ = 0.03 + ( 0.2 * amplitude ); bowDown_ = true; } void Bowed :: stopBowing( StkFloat rate ) { if ( rate <= 0.0 ) { oStream_ << "Bowed::stopBowing: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } adsr_.setReleaseRate( rate ); adsr_.keyOff(); } void Bowed :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->startBowing( amplitude, amplitude * 0.001 ); this->setFrequency( frequency ); } void Bowed :: noteOff( StkFloat amplitude ) { this->stopBowing( (1.0 - amplitude) * 0.005 ); } void Bowed :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( value < 0 || ( number != 101 && value > 128.0 ) ) { oStream_ << "Bowed::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if ( number == __SK_BowPressure_ ) { // 2 if ( normalizedValue > 0.0 ) bowDown_ = true; else bowDown_ = false; bowTable_.setSlope( 5.0 - (4.0 * normalizedValue) ); } else if ( number == __SK_BowPosition_ ) { // 4 betaRatio_ = normalizedValue; bridgeDelay_.setDelay( baseDelay_ * betaRatio_ ); neckDelay_.setDelay( baseDelay_ * (1.0 - betaRatio_) ); } else if ( number == __SK_ModFrequency_ ) // 11 vibrato_.setFrequency( normalizedValue * 12.0 ); else if ( number == __SK_ModWheel_ ) // 1 vibratoGain_ = ( normalizedValue * 0.4 ); else if ( number == 100 ) // 100: set instantaneous bow velocity adsr_.setTarget( normalizedValue ); else if ( number == 101 ) // 101: set instantaneous value of frequency this->setFrequency( value ); else if (number == __SK_AfterTouch_Cont_) // 128 adsr_.setTarget( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "Bowed::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Brass.cpp0000644000076600007660000001003512327014024012477 0ustar gary/***************************************************/ /*! \class Brass \brief STK simple brass instrument class. This class implements a simple brass instrument waveguide model, a la Cook (TBone, HosePlayer). This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Lip Tension = 2 - Slide Length = 4 - Vibrato Frequency = 11 - Vibrato Gain = 1 - Volume = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Brass.h" #include "SKINI.msg" #include namespace stk { Brass :: Brass( StkFloat lowestFrequency ) { if ( lowestFrequency <= 0.0 ) { oStream_ << "Brass::Brass: argument is less than or equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } unsigned long nDelays = (unsigned long) ( Stk::sampleRate() / lowestFrequency ); delayLine_.setMaximumDelay( nDelays + 1 ); lipFilter_.setGain( 0.03 ); dcBlock_.setBlockZero(); adsr_.setAllTimes( 0.005, 0.001, 1.0, 0.010 ); vibrato_.setFrequency( 6.137 ); vibratoGain_ = 0.0; maxPressure_ = 0.0; lipTarget_ = 0.0; this->clear(); // This is necessary to initialize variables. this->setFrequency( 220.0 ); } Brass :: ~Brass( void ) { } void Brass :: clear( void ) { delayLine_.clear(); lipFilter_.clear(); dcBlock_.clear(); } void Brass :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Brass::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif // Fudge correction for filter delays. slideTarget_ = ( Stk::sampleRate() / frequency * 2.0 ) + 3.0; delayLine_.setDelay( slideTarget_ ); // play a harmonic lipTarget_ = frequency; lipFilter_.setResonance( frequency, 0.997 ); } void Brass :: setLip( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Brass::setLip: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif lipFilter_.setResonance( frequency, 0.997 ); } void Brass :: startBlowing( StkFloat amplitude, StkFloat rate ) { if ( amplitude <= 0.0 || rate <= 0.0 ) { oStream_ << "Brass::startBlowing: one or more arguments is less than or equal to zero!"; handleError( StkError::WARNING ); return; } adsr_.setAttackRate( rate ); maxPressure_ = amplitude; adsr_.keyOn(); } void Brass :: stopBlowing( StkFloat rate ) { if ( rate <= 0.0 ) { oStream_ << "Brass::stopBlowing: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } adsr_.setReleaseRate( rate ); adsr_.keyOff(); } void Brass :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); this->startBlowing( amplitude, amplitude * 0.001 ); } void Brass :: noteOff( StkFloat amplitude ) { this->stopBlowing( amplitude * 0.005 ); } void Brass :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Brass::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_LipTension_) { // 2 StkFloat temp = lipTarget_ * pow( 4.0, (2.0 * normalizedValue) - 1.0 ); this->setLip( temp ); } else if (number == __SK_SlideLength_) // 4 delayLine_.setDelay( slideTarget_ * (0.5 + normalizedValue) ); else if (number == __SK_ModFrequency_) // 11 vibrato_.setFrequency( normalizedValue * 12.0 ); else if (number == __SK_ModWheel_ ) // 1 vibratoGain_ = normalizedValue * 0.4; else if (number == __SK_AfterTouch_Cont_) // 128 adsr_.setTarget( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "Brass::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Chorus.cpp0000644000076600007660000000261412327014024012674 0ustar gary/***************************************************/ /*! \class Chorus \brief STK chorus effect class. This class implements a chorus effect. It takes a monophonic input signal and produces a stereo output signal. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Chorus.h" namespace stk { Chorus :: Chorus( StkFloat baseDelay ) { lastFrame_.resize( 1, 2, 0.0 ); // resize lastFrame_ for stereo output delayLine_[0].setMaximumDelay( (unsigned long) (baseDelay * 1.414) + 2); delayLine_[0].setDelay( baseDelay ); delayLine_[1].setMaximumDelay( (unsigned long) (baseDelay * 1.414) + 2); delayLine_[1].setDelay( baseDelay ); baseLength_ = baseDelay; mods_[0].setFrequency( 0.2 ); mods_[1].setFrequency( 0.222222 ); modDepth_ = 0.05; effectMix_ = 0.5; this->clear(); } void Chorus :: clear( void ) { delayLine_[0].clear(); delayLine_[1].clear(); lastFrame_[0] = 0.0; lastFrame_[1] = 0.0; } void Chorus :: setModDepth( StkFloat depth ) { if ( depth < 0.0 || depth > 1.0 ) { oStream_ << "Chorus::setModDepth(): depth argument must be between 0.0 - 1.0!"; handleError( StkError::WARNING ); return; } modDepth_ = depth; }; void Chorus :: setModFrequency( StkFloat frequency ) { mods_[0].setFrequency( frequency ); mods_[1].setFrequency( frequency * 1.1111 ); } } // stk namespace stk-4.5.0/src/Clarinet.cpp0000644000076600007660000000732512327014024013176 0ustar gary/***************************************************/ /*! \class Clarinet \brief STK clarinet physical model class. This class implements a simple clarinet physical model, as discussed by Smith (1986), McIntyre, Schumacher, Woodhouse (1983), and others. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Reed Stiffness = 2 - Noise Gain = 4 - Vibrato Frequency = 11 - Vibrato Gain = 1 - Breath Pressure = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Clarinet.h" #include "SKINI.msg" namespace stk { Clarinet :: Clarinet( StkFloat lowestFrequency ) { if ( lowestFrequency <= 0.0 ) { oStream_ << "Clarinet::Clarinet: argument is less than or equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } unsigned long nDelays = (unsigned long) ( 0.5 * Stk::sampleRate() / lowestFrequency ); delayLine_.setMaximumDelay( nDelays + 1 ); reedTable_.setOffset( 0.7 ); reedTable_.setSlope( -0.3 ); vibrato_.setFrequency( 5.735 ); outputGain_ = 1.0; noiseGain_ = 0.2; vibratoGain_ = 0.1; this->setFrequency( 220.0 ); this->clear(); } Clarinet :: ~Clarinet( void ) { } void Clarinet :: clear( void ) { delayLine_.clear(); filter_.tick( 0.0 ); } void Clarinet :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Clarinet::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif // Account for filter delay and one sample "lastOut" delay. StkFloat delay = ( Stk::sampleRate() / frequency ) * 0.5 - filter_.phaseDelay( frequency ) - 1.0; delayLine_.setDelay( delay ); } void Clarinet :: startBlowing( StkFloat amplitude, StkFloat rate ) { if ( amplitude <= 0.0 || rate <= 0.0 ) { oStream_ << "Clarinet::startBlowing: one or more arguments is less than or equal to zero!"; handleError( StkError::WARNING ); return; } envelope_.setRate( rate ); envelope_.setTarget( amplitude ); } void Clarinet :: stopBlowing( StkFloat rate ) { if ( rate <= 0.0 ) { oStream_ << "Clarinet::stopBlowing: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } envelope_.setRate( rate ); envelope_.setTarget( 0.0 ); } void Clarinet :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); this->startBlowing( 0.55 + (amplitude * 0.30), amplitude * 0.005 ); outputGain_ = amplitude + 0.001; } void Clarinet :: noteOff( StkFloat amplitude ) { this->stopBlowing( amplitude * 0.01 ); } void Clarinet :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Clarinet::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if ( number == __SK_ReedStiffness_ ) // 2 reedTable_.setSlope( -0.44 + ( 0.26 * normalizedValue ) ); else if ( number == __SK_NoiseLevel_ ) // 4 noiseGain_ = ( normalizedValue * 0.4 ); else if ( number == __SK_ModFrequency_ ) // 11 vibrato_.setFrequency( normalizedValue * 12.0 ); else if ( number == __SK_ModWheel_ ) // 1 vibratoGain_ = ( normalizedValue * 0.5 ); else if ( number == __SK_AfterTouch_Cont_ ) // 128 envelope_.setValue( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "Clarinet::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Delay.cpp0000644000076600007660000000525012327014024012466 0ustar gary/***************************************************/ /*! \class Delay \brief STK non-interpolating delay line class. This class implements a non-interpolating digital delay-line. If the delay and maximum length are not specified during instantiation, a fixed maximum length of 4095 and a delay of zero is set. A non-interpolating delay line is typically used in fixed delay-length applications, such as for reverberation. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Delay.h" namespace stk { Delay :: Delay( unsigned long delay, unsigned long maxDelay ) { // Writing before reading allows delays from 0 to length-1. // If we want to allow a delay of maxDelay, we need a // delay-line of length = maxDelay+1. if ( delay > maxDelay ) { oStream_ << "Delay::Delay: maxDelay must be > than delay argument!\n"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( ( maxDelay + 1 ) > inputs_.size() ) inputs_.resize( maxDelay + 1, 1, 0.0 ); inPoint_ = 0; this->setDelay( delay ); } Delay :: ~Delay() { } void Delay :: setMaximumDelay( unsigned long delay ) { if ( delay < inputs_.size() ) return; inputs_.resize( delay + 1 ); } void Delay :: setDelay( unsigned long delay ) { if ( delay > inputs_.size() - 1 ) { // The value is too big. oStream_ << "Delay::setDelay: argument (" << delay << ") greater than maximum!\n"; handleError( StkError::WARNING ); return; } // read chases write if ( inPoint_ >= delay ) outPoint_ = inPoint_ - delay; else outPoint_ = inputs_.size() + inPoint_ - delay; delay_ = delay; } StkFloat Delay :: energy( void ) const { unsigned long i; StkFloat e = 0; if ( inPoint_ >= outPoint_ ) { for ( i=outPoint_; i= 0.5!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( delay > (StkFloat) maxDelay ) { oStream_ << "DelayA::DelayA: maxDelay must be > than delay argument!"; handleError( StkError::FUNCTION_ARGUMENT ); } // Writing before reading allows delays from 0 to length-1. if ( maxDelay + 1 > inputs_.size() ) inputs_.resize( maxDelay + 1, 1, 0.0 ); inPoint_ = 0; this->setDelay( delay ); apInput_ = 0.0; doNextOut_ = true; } DelayA :: ~DelayA() { } void DelayA :: clear() { for ( unsigned int i=0; i length ) { // The value is too big. oStream_ << "DelayA::setDelay: argument (" << delay << ") greater than maximum!"; handleError( StkError::WARNING ); return; } if ( delay < 0.5 ) { oStream_ << "DelayA::setDelay: argument (" << delay << ") less than 0.5 not possible!"; handleError( StkError::WARNING ); } StkFloat outPointer = inPoint_ - delay + 1.0; // outPoint chases inpoint delay_ = delay; while ( outPointer < 0 ) outPointer += length; // modulo maximum length outPoint_ = (long) outPointer; // integer part if ( outPoint_ == length ) outPoint_ = 0; alpha_ = 1.0 + outPoint_ - outPointer; // fractional part if ( alpha_ < 0.5 ) { // The optimal range for alpha is about 0.5 - 1.5 in order to // achieve the flattest phase delay response. outPoint_ += 1; if ( outPoint_ >= length ) outPoint_ -= length; alpha_ += (StkFloat) 1.0; } coeff_ = (1.0 - alpha_) / (1.0 + alpha_); // coefficient for allpass } StkFloat DelayA :: tapOut( unsigned long tapDelay ) { long tap = inPoint_ - tapDelay - 1; while ( tap < 0 ) // Check for wraparound. tap += inputs_.size(); return inputs_[tap]; } void DelayA :: tapIn( StkFloat value, unsigned long tapDelay ) { long tap = inPoint_ - tapDelay - 1; while ( tap < 0 ) // Check for wraparound. tap += inputs_.size(); inputs_[tap] = value; } } // stk namespace stk-4.5.0/src/DelayL.cpp0000644000076600007660000000533112327014024012602 0ustar gary/***************************************************/ /*! \class DelayL \brief STK linear interpolating delay line class. This class implements a fractional-length digital delay-line using first-order linear interpolation. If the delay and maximum length are not specified during instantiation, a fixed maximum length of 4095 and a delay of zero is set. Linear interpolation is an efficient technique for achieving fractional delay lengths, though it does introduce high-frequency signal attenuation to varying degrees depending on the fractional delay setting. The use of higher order Lagrange interpolators can typically improve (minimize) this attenuation characteristic. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "DelayL.h" namespace stk { DelayL :: DelayL( StkFloat delay, unsigned long maxDelay ) { if ( delay < 0.0 ) { oStream_ << "DelayL::DelayL: delay must be >= 0.0!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( delay > (StkFloat) maxDelay ) { oStream_ << "DelayL::DelayL: maxDelay must be > than delay argument!"; handleError( StkError::FUNCTION_ARGUMENT ); } // Writing before reading allows delays from 0 to length-1. if ( maxDelay + 1 > inputs_.size() ) inputs_.resize( maxDelay + 1, 1, 0.0 ); inPoint_ = 0; this->setDelay( delay ); doNextOut_ = true; } DelayL :: ~DelayL() { } void DelayL :: setMaximumDelay( unsigned long delay ) { if ( delay < inputs_.size() ) return; inputs_.resize( delay + 1 ); } void DelayL :: setDelay( StkFloat delay ) { if ( delay + 1 > inputs_.size() ) { // The value is too big. oStream_ << "DelayL::setDelay: argument (" << delay << ") greater than maximum!"; handleError( StkError::WARNING ); return; } if (delay < 0 ) { oStream_ << "DelayL::setDelay: argument (" << delay << ") less than zero!"; handleError( StkError::WARNING ); return; } StkFloat outPointer = inPoint_ - delay; // read chases write delay_ = delay; while ( outPointer < 0 ) outPointer += inputs_.size(); // modulo maximum length outPoint_ = (long) outPointer; // integer part if ( outPoint_ == inputs_.size() ) outPoint_ = 0; alpha_ = outPointer - outPoint_; // fractional part omAlpha_ = (StkFloat) 1.0 - alpha_; } StkFloat DelayL :: tapOut( unsigned long tapDelay ) { long tap = inPoint_ - tapDelay - 1; while ( tap < 0 ) // Check for wraparound. tap += inputs_.size(); return inputs_[tap]; } void DelayL :: tapIn( StkFloat value, unsigned long tapDelay ) { long tap = inPoint_ - tapDelay - 1; while ( tap < 0 ) // Check for wraparound. tap += inputs_.size(); inputs_[tap] = value; } } // stk namespace stk-4.5.0/src/Drummer.cpp0000644000076600007660000001022512327014024013041 0ustar gary/***************************************************/ /*! \class Drummer \brief STK drum sample player class. This class implements a drum sampling synthesizer using FileWvIn objects and one-pole filters. The drum rawwave files are sampled at 22050 Hz, but will be appropriately interpolated for other sample rates. You can specify the maximum polyphony (maximum number of simultaneous voices) via a #define in the Drummer.h. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Drummer.h" #include namespace stk { // Not really General MIDI yet. unsigned char genMIDIMap[128] = { 0,0,0,0,0,0,0,0, // 0-7 0,0,0,0,0,0,0,0, // 8-15 0,0,0,0,0,0,0,0, // 16-23 0,0,0,0,0,0,0,0, // 24-31 0,0,0,0,1,0,2,0, // 32-39 2,3,6,3,6,4,7,4, // 40-47 5,8,5,0,0,0,10,0, // 48-55 9,0,0,0,0,0,0,0, // 56-63 0,0,0,0,0,0,0,0, // 64-71 0,0,0,0,0,0,0,0, // 72-79 0,0,0,0,0,0,0,0, // 80-87 0,0,0,0,0,0,0,0, // 88-95 0,0,0,0,0,0,0,0, // 96-103 0,0,0,0,0,0,0,0, // 104-111 0,0,0,0,0,0,0,0, // 112-119 0,0,0,0,0,0,0,0 // 120-127 }; char waveNames[DRUM_NUMWAVES][16] = { "dope.raw", "bassdrum.raw", "snardrum.raw", "tomlowdr.raw", "tommiddr.raw", "tomhidrm.raw", "hihatcym.raw", "ridecymb.raw", "crashcym.raw", "cowbell1.raw", "tambourn.raw" }; Drummer :: Drummer( void ) : Instrmnt() { // This counts the number of sounding voices. nSounding_ = 0; soundOrder_ = std::vector (DRUM_POLYPHONY, -1); soundNumber_ = std::vector (DRUM_POLYPHONY, -1); } Drummer :: ~Drummer( void ) { } void Drummer :: noteOn( StkFloat instrument, StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "Drummer::noteOn: amplitude parameter is out of bounds!"; handleError( StkError::WARNING ); return; } // Yes, this is tres kludgey. int noteNumber = (int) ( ( 12 * log( instrument / 220.0 ) / log( 2.0 ) ) + 57.01 ); // If we already have a wave of this note number loaded, just reset // it. Otherwise, look first for an unused wave or preempt the // oldest if already at maximum polyphony. int iWave; for ( iWave=0; iWave soundOrder_[iWave] ) soundOrder_[j] -= 1; } } soundOrder_[iWave] = nSounding_ - 1; soundNumber_[iWave] = noteNumber; //std::cout << "iWave = " << iWave << ", nSounding = " << nSounding_ << ", soundOrder[] = " << soundOrder_[iWave] << std::endl; // Concatenate the STK rawwave path to the rawwave file waves_[iWave].openFile( (Stk::rawwavePath() + waveNames[ genMIDIMap[ noteNumber ] ]).c_str(), true ); if ( Stk::sampleRate() != 22050.0 ) waves_[iWave].setRate( 22050.0 / Stk::sampleRate() ); filters_[iWave].setPole( 0.999 - (amplitude * 0.6) ); filters_[iWave].setGain( amplitude ); } /* #if defined(_STK_DEBUG_) oStream_ << "Drummer::noteOn: number sounding = " << nSounding_ << ", notes: "; for ( int i=0; i namespace stk { Echo :: Echo( unsigned long maximumDelay ) : Effect() { this->setMaximumDelay( maximumDelay ); delayLine_.setDelay( length_ >> 1 ); effectMix_ = 0.5; this->clear(); } void Echo :: clear( void ) { delayLine_.clear(); lastFrame_[0] = 0.0; } void Echo :: setMaximumDelay( unsigned long delay ) { if ( delay == 0 ) { oStream_ << "Echo::setMaximumDelay: parameter cannot be zero!"; handleError( StkError::WARNING ); return; } length_ = delay; delayLine_.setMaximumDelay( delay ); } void Echo :: setDelay( unsigned long delay ) { if ( delay > length_ ) { oStream_ << "Echo::setDelay: parameter is greater than maximum delay length!"; handleError( StkError::WARNING ); return; } delayLine_.setDelay( delay ); } } // stk namespace stk-4.5.0/src/Envelope.cpp0000644000076600007660000000337512327014024013213 0ustar gary/***************************************************/ /*! \class Envelope \brief STK linear line envelope class. This class implements a simple linear line envelope generator which is capable of ramping to an arbitrary target value by a specified \e rate. It also responds to simple \e keyOn and \e keyOff messages, ramping to 1.0 on keyOn and to 0.0 on keyOff. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Envelope.h" namespace stk { Envelope :: Envelope( void ) : Generator() { target_ = 0.0; value_ = 0.0; rate_ = 0.001; state_ = 0; Stk::addSampleRateAlert( this ); } Envelope :: ~Envelope( void ) { Stk::removeSampleRateAlert( this ); } Envelope& Envelope :: operator= ( const Envelope& e ) { if ( this != &e ) { target_ = e.target_; value_ = e.value_; rate_ = e.rate_; state_ = e.state_; } return *this; } void Envelope :: sampleRateChanged( StkFloat newRate, StkFloat oldRate ) { if ( !ignoreSampleRateChange_ ) rate_ = oldRate * rate_ / newRate; } void Envelope :: setRate( StkFloat rate ) { if ( rate < 0.0 ) { oStream_ << "Envelope::setRate: argument must be >= 0.0!"; handleError( StkError::WARNING ); return; } rate_ = rate; } void Envelope :: setTime( StkFloat time ) { if ( time <= 0.0 ) { oStream_ << "Envelope::setTime: argument must be > 0.0!"; handleError( StkError::WARNING ); return; } rate_ = 1.0 / ( time * Stk::sampleRate() ); } void Envelope :: setTarget( StkFloat target ) { target_ = target; if ( value_ != target_ ) state_ = 1; } void Envelope :: setValue( StkFloat value ) { state_ = 0; target_ = value; value_ = value; lastFrame_[0] = value_; } } // stk namespace stk-4.5.0/src/FileLoop.cpp0000644000076600007660000001425412327014024013145 0ustar gary/***************************************************/ /*! \class FileLoop \brief STK file looping / oscillator class. This class provides audio file looping functionality. Any audio file that can be loaded by FileRead can be looped using this class. FileLoop supports multi-channel data. It is important to distinguish the tick() method that computes a single frame (and returns only the specified sample of a multi-channel frame) from the overloaded one that takes an StkFrames object for multi-channel and/or multi-frame data. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "FileLoop.h" #include namespace stk { FileLoop :: FileLoop( unsigned long chunkThreshold, unsigned long chunkSize ) : FileWvIn( chunkThreshold, chunkSize ), phaseOffset_(0.0) { Stk::addSampleRateAlert( this ); } FileLoop :: FileLoop( std::string fileName, bool raw, bool doNormalize, unsigned long chunkThreshold, unsigned long chunkSize ) : FileWvIn( chunkThreshold, chunkSize ), phaseOffset_(0.0) { this->openFile( fileName, raw, doNormalize ); Stk::addSampleRateAlert( this ); } FileLoop :: ~FileLoop( void ) { Stk::removeSampleRateAlert( this ); } void FileLoop :: openFile( std::string fileName, bool raw, bool doNormalize ) { // Call close() in case another file is already open. this->closeFile(); // Attempt to open the file ... an error might be thrown here. file_.open( fileName, raw ); // Determine whether chunking or not. if ( file_.fileSize() > chunkThreshold_ ) { chunking_ = true; chunkPointer_ = 0; data_.resize( chunkSize_ + 1, file_.channels() ); if ( doNormalize ) normalizing_ = true; else normalizing_ = false; } else { chunking_ = false; data_.resize( file_.fileSize() + 1, file_.channels() ); } // Load all or part of the data. file_.read( data_, 0, doNormalize ); if ( chunking_ ) { // If chunking, save the first sample frame for later. firstFrame_.resize( 1, data_.channels() ); for ( unsigned int i=0; isetRate( data_.dataRate() / Stk::sampleRate() ); if ( doNormalize & !chunking_ ) this->normalize(); this->reset(); } void FileLoop :: setRate( StkFloat rate ) { rate_ = rate; if ( fmod( rate_, 1.0 ) != 0.0 ) interpolate_ = true; else interpolate_ = false; } void FileLoop :: addTime( StkFloat time ) { // Add an absolute time in samples. time_ += time; StkFloat fileSize = file_.fileSize(); while ( time_ < 0.0 ) time_ += fileSize; while ( time_ >= fileSize ) time_ -= fileSize; } void FileLoop :: addPhase( StkFloat angle ) { // Add a time in cycles (one cycle = fileSize). StkFloat fileSize = file_.fileSize(); time_ += fileSize * angle; while ( time_ < 0.0 ) time_ += fileSize; while ( time_ >= fileSize ) time_ -= fileSize; } void FileLoop :: addPhaseOffset( StkFloat angle ) { // Add a phase offset in cycles, where 1.0 = fileSize. phaseOffset_ = file_.fileSize() * angle; } StkFloat FileLoop :: tick( unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= data_.channels() ) { oStream_ << "FileLoop::tick(): channel argument and soundfile data are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif // Check limits of time address ... if necessary, recalculate modulo // fileSize. StkFloat fileSize = file_.fileSize(); while ( time_ < 0.0 ) time_ += fileSize; while ( time_ >= fileSize ) time_ -= fileSize; StkFloat tyme = time_; if ( phaseOffset_ ) { tyme += phaseOffset_; while ( tyme < 0.0 ) tyme += fileSize; while ( tyme >= fileSize ) tyme -= fileSize; } if ( chunking_ ) { // Check the time address vs. our current buffer limits. if ( ( time_ < (StkFloat) chunkPointer_ ) || ( time_ > (StkFloat) ( chunkPointer_ + chunkSize_ - 1 ) ) ) { while ( time_ < (StkFloat) chunkPointer_ ) { // negative rate chunkPointer_ -= chunkSize_ - 1; // overlap chunks by one frame if ( chunkPointer_ < 0 ) chunkPointer_ = 0; } while ( time_ > (StkFloat) ( chunkPointer_ + chunkSize_ - 1 ) ) { // positive rate chunkPointer_ += chunkSize_ - 1; // overlap chunks by one frame if ( chunkPointer_ + chunkSize_ > file_.fileSize() ) { // at end of file chunkPointer_ = file_.fileSize() - chunkSize_ + 1; // leave extra frame at end of buffer // Now fill extra frame with first frame data. for ( unsigned int j=0; jtick(); for ( j=0; j2) soundfiles are supported. The file data is returned via an external StkFrames object passed to the read() function. This class does not store its own copy of the file data, rather the data is read directly from disk. FileRead currently supports uncompressed WAV, AIFF/AIFC, SND (AU), MAT-file (Matlab), and STK RAW file formats. Signed integer (8-, 16-, 24- and 32-bit) and floating-point (32- and 64-bit) data types are supported. Compressed data types are not supported. STK RAW files have no header and are assumed to contain a monophonic stream of 16-bit signed integers in big-endian byte order at a sample rate of 22050 Hz. MAT-file data should be saved in an array with each data channel filling a matrix row. The sample rate for MAT-files should be specified in a variable named "fs". If no such variable is found, the sample rate is assumed to be 44100 Hz. by Perry R. Cook and Gary P. Scavone, 1995 - 2007. */ /***************************************************/ #include "FileRead.h" #include #include #include #include #include namespace stk { FileRead :: FileRead() : fd_(0), fileSize_(0), channels_(0), dataType_(0), fileRate_(0.0) { } FileRead :: FileRead( std::string fileName, bool typeRaw, unsigned int nChannels, StkFormat format, StkFloat rate ) : fd_(0) { open( fileName, typeRaw, nChannels, format, rate ); } FileRead :: ~FileRead() { if ( fd_ ) fclose( fd_ ); } void FileRead :: close( void ) { if ( fd_ ) fclose( fd_ ); fd_ = 0; wavFile_ = false; fileSize_ = 0; channels_ = 0; dataType_ = 0; fileRate_ = 0.0; } bool FileRead :: isOpen( void ) { if ( fd_ ) return true; else return false; } void FileRead :: open( std::string fileName, bool typeRaw, unsigned int nChannels, StkFormat format, StkFloat rate ) { // If another file is open, close it. close(); // Try to open the file. fd_ = fopen( fileName.c_str(), "rb" ); if ( !fd_ ) { oStream_ << "FileRead::open: could not open or find file (" << fileName << ")!"; handleError( StkError::FILE_NOT_FOUND ); } // Attempt to determine file type from header (unless RAW). bool result = false; if ( typeRaw ) result = getRawInfo( fileName.c_str(), nChannels, format, rate ); else { char header[12]; if ( fread( &header, 4, 3, fd_ ) != 3 ) goto error; if ( !strncmp( header, "RIFF", 4 ) && !strncmp( &header[8], "WAVE", 4 ) ) result = getWavInfo( fileName.c_str() ); else if ( !strncmp( header, ".snd", 4 ) ) result = getSndInfo( fileName.c_str() ); else if ( !strncmp( header, "FORM", 4 ) && ( !strncmp( &header[8], "AIFF", 4 ) || !strncmp(&header[8], "AIFC", 4) ) ) result = getAifInfo( fileName.c_str() ); else { if ( fseek( fd_, 126, SEEK_SET ) == -1 ) goto error; if ( fread( &header, 2, 1, fd_ ) != 1 ) goto error; if ( !strncmp( header, "MI", 2 ) || !strncmp( header, "IM", 2 ) ) result = getMatInfo( fileName.c_str() ); else { oStream_ << "FileRead::open: file (" << fileName << ") format unknown."; handleError( StkError::FILE_UNKNOWN_FORMAT ); } } } // If here, we had a file type candidate but something else went wrong. if ( result == false ) handleError( StkError::FILE_ERROR ); // Check for empty files. if ( fileSize_ == 0 ) { oStream_ << "FileRead::open: file (" << fileName << ") data size is zero!"; handleError( StkError::FILE_ERROR ); } return; error: oStream_ << "FileRead::open: error reading file (" << fileName << ")!"; handleError( StkError::FILE_ERROR ); } bool FileRead :: getRawInfo( const char *fileName, unsigned int nChannels, StkFormat format, StkFloat rate ) { // Use the system call "stat" to determine the file length. struct stat filestat; if ( stat(fileName, &filestat) == -1 ) { oStream_ << "FileRead: Could not stat RAW file (" << fileName << ")."; return false; } if ( nChannels == 0 ) { oStream_ << "FileRead: number of channels can't be 0 (" << fileName << ")."; return false; } // Rawwave files have no header and by default, are assumed to // contain a monophonic stream of 16-bit signed integers in // big-endian byte order at a sample rate of 22050 Hz. However, // different parameters can be specified if desired. dataOffset_ = 0; channels_ = nChannels; dataType_ = format; fileRate_ = rate; int sampleBytes = 0; if ( format == STK_SINT8 ) sampleBytes = 1; else if ( format == STK_SINT16 ) sampleBytes = 2; else if ( format == STK_SINT32 || format == STK_FLOAT32 ) sampleBytes = 4; else if ( format == STK_FLOAT64 ) sampleBytes = 8; else { oStream_ << "FileRead: StkFormat " << format << " is invalid (" << fileName << ")."; return false; } fileSize_ = (long) filestat.st_size / sampleBytes / channels_; // length in frames byteswap_ = false; #ifdef __LITTLE_ENDIAN__ byteswap_ = true; #endif return true; } bool FileRead :: getWavInfo( const char *fileName ) { // Find "format" chunk ... it must come before the "data" chunk. char id[4]; SINT32 chunkSize; if ( fread(&id, 4, 1, fd_) != 1 ) goto error; while ( strncmp(id, "fmt ", 4) ) { if ( fread(&chunkSize, 4, 1, fd_) != 1 ) goto error; #ifndef __LITTLE_ENDIAN__ swap32((unsigned char *)&chunkSize); #endif if ( fseek(fd_, chunkSize, SEEK_CUR) == -1 ) goto error; if ( fread(&id, 4, 1, fd_) != 1 ) goto error; } // Check that the data is not compressed. unsigned short format_tag; if ( fread(&chunkSize, 4, 1, fd_) != 1 ) goto error; // Read fmt chunk size. if ( fread(&format_tag, 2, 1, fd_) != 1 ) goto error; #ifndef __LITTLE_ENDIAN__ swap16((unsigned char *)&format_tag); swap32((unsigned char *)&chunkSize); #endif if ( format_tag == 0xFFFE ) { // WAVE_FORMAT_EXTENSIBLE dataOffset_ = ftell(fd_); if ( fseek(fd_, 14, SEEK_CUR) == -1 ) goto error; unsigned short extSize; if ( fread(&extSize, 2, 1, fd_) != 1 ) goto error; #ifndef __LITTLE_ENDIAN__ swap16((unsigned char *)&extSize); #endif if ( extSize == 0 ) goto error; if ( fseek(fd_, 6, SEEK_CUR) == -1 ) goto error; if ( fread(&format_tag, 2, 1, fd_) != 1 ) goto error; #ifndef __LITTLE_ENDIAN__ swap16((unsigned char *)&format_tag); #endif if ( fseek(fd_, dataOffset_, SEEK_SET) == -1 ) goto error; } if ( format_tag != 1 && format_tag != 3 ) { // PCM = 1, FLOAT = 3 oStream_ << "FileRead: "<< fileName << " contains an unsupported data format type (" << format_tag << ")."; return false; } // Get number of channels from the header. SINT16 temp; if ( fread(&temp, 2, 1, fd_) != 1 ) goto error; #ifndef __LITTLE_ENDIAN__ swap16((unsigned char *)&temp); #endif channels_ = (unsigned int ) temp; // Get file sample rate from the header. SINT32 srate; if ( fread(&srate, 4, 1, fd_) != 1 ) goto error; #ifndef __LITTLE_ENDIAN__ swap32((unsigned char *)&srate); #endif fileRate_ = (StkFloat) srate; // Determine the data type. dataType_ = 0; if ( fseek(fd_, 6, SEEK_CUR) == -1 ) goto error; // Locate bits_per_sample info. if ( fread(&temp, 2, 1, fd_) != 1 ) goto error; #ifndef __LITTLE_ENDIAN__ swap16((unsigned char *)&temp); #endif if ( format_tag == 1 ) { if ( temp == 8 ) dataType_ = STK_SINT8; else if ( temp == 16 ) dataType_ = STK_SINT16; else if ( temp == 24 ) dataType_ = STK_SINT24; else if ( temp == 32 ) dataType_ = STK_SINT32; } else if ( format_tag == 3 ) { if ( temp == 32 ) dataType_ = STK_FLOAT32; else if ( temp == 64 ) dataType_ = STK_FLOAT64; } if ( dataType_ == 0 ) { oStream_ << "FileRead: " << temp << " bits per sample with data format " << format_tag << " are not supported (" << fileName << ")."; return false; } // Jump over any remaining part of the "fmt" chunk. if ( fseek(fd_, chunkSize-16, SEEK_CUR) == -1 ) goto error; // Find "data" chunk ... it must come after the "fmt" chunk. if ( fread(&id, 4, 1, fd_) != 1 ) goto error; while ( strncmp(id, "data", 4) ) { if ( fread(&chunkSize, 4, 1, fd_) != 1 ) goto error; #ifndef __LITTLE_ENDIAN__ swap32((unsigned char *)&chunkSize); #endif chunkSize += chunkSize % 2; // chunk sizes must be even if ( fseek(fd_, chunkSize, SEEK_CUR) == -1 ) goto error; if ( fread(&id, 4, 1, fd_) != 1 ) goto error; } // Get length of data from the header. SINT32 bytes; if ( fread(&bytes, 4, 1, fd_) != 1 ) goto error; #ifndef __LITTLE_ENDIAN__ swap32((unsigned char *)&bytes); #endif fileSize_ = bytes / temp / channels_; // sample frames fileSize_ *= 8; // sample frames dataOffset_ = ftell(fd_); byteswap_ = false; #ifndef __LITTLE_ENDIAN__ byteswap_ = true; #endif wavFile_ = true; return true; error: oStream_ << "FileRead: error reading WAV file (" << fileName << ")."; return false; } bool FileRead :: getSndInfo( const char *fileName ) { // Determine the data type. UINT32 format; if ( fseek(fd_, 12, SEEK_SET) == -1 ) goto error; // Locate format if ( fread(&format, 4, 1, fd_) != 1 ) goto error; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&format); #endif if (format == 2) dataType_ = STK_SINT8; else if (format == 3) dataType_ = STK_SINT16; else if (format == 4) dataType_ = STK_SINT24; else if (format == 5) dataType_ = STK_SINT32; else if (format == 6) dataType_ = STK_FLOAT32; else if (format == 7) dataType_ = STK_FLOAT64; else { oStream_ << "FileRead: data format in file " << fileName << " is not supported."; return false; } // Get file sample rate from the header. UINT32 srate; if ( fread(&srate, 4, 1, fd_) != 1 ) goto error; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&srate); #endif fileRate_ = (StkFloat) srate; // Get number of channels from the header. UINT32 chans; if ( fread(&chans, 4, 1, fd_) != 1 ) goto error; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&chans); #endif channels_ = chans; UINT32 offset; if ( fseek(fd_, 4, SEEK_SET) == -1 ) goto error; if ( fread(&offset, 4, 1, fd_) != 1 ) goto error; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&offset); #endif dataOffset_ = offset; // Get length of data from the header. if ( fread(&fileSize_, 4, 1, fd_) != 1 ) goto error; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&fileSize_); #endif // Convert to sample frames. if ( dataType_ == STK_SINT8 ) fileSize_ /= channels_; if ( dataType_ == STK_SINT16 ) fileSize_ /= 2 * channels_; else if ( dataType_ == STK_SINT24 ) fileSize_ /= 3 * channels_; else if ( dataType_ == STK_SINT32 || dataType_ == STK_FLOAT32 ) fileSize_ /= 4 * channels_; else if ( dataType_ == STK_FLOAT64 ) fileSize_ /= 8 * channels_; byteswap_ = false; #ifdef __LITTLE_ENDIAN__ byteswap_ = true; #endif return true; error: oStream_ << "FileRead: Error reading SND file (" << fileName << ")."; return false; } bool FileRead :: getAifInfo( const char *fileName ) { bool aifc = false; char id[4]; // Determine whether this is AIFF or AIFC. if ( fseek(fd_, 8, SEEK_SET) == -1 ) goto error; if ( fread(&id, 4, 1, fd_) != 1 ) goto error; if ( !strncmp(id, "AIFC", 4) ) aifc = true; // Find "common" chunk SINT32 chunkSize; if ( fread(&id, 4, 1, fd_) != 1) goto error; while ( strncmp(id, "COMM", 4) ) { if ( fread(&chunkSize, 4, 1, fd_) != 1 ) goto error; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&chunkSize); #endif chunkSize += chunkSize % 2; // chunk sizes must be even if ( fseek(fd_, chunkSize, SEEK_CUR) == -1 ) goto error; if ( fread(&id, 4, 1, fd_) != 1 ) goto error; } // Get number of channels from the header. SINT16 temp; if ( fseek(fd_, 4, SEEK_CUR) == -1 ) goto error; // Jump over chunk size if ( fread(&temp, 2, 1, fd_) != 1 ) goto error; #ifdef __LITTLE_ENDIAN__ swap16((unsigned char *)&temp); #endif channels_ = temp; // Get length of data from the header. SINT32 frames; if ( fread(&frames, 4, 1, fd_) != 1 ) goto error; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&frames); #endif fileSize_ = frames; // sample frames // Read the number of bits per sample. if ( fread(&temp, 2, 1, fd_) != 1 ) goto error; #ifdef __LITTLE_ENDIAN__ swap16((unsigned char *)&temp); #endif // Get file sample rate from the header. For AIFF files, this value // is stored in a 10-byte, IEEE Standard 754 floating point number, // so we need to convert it first. unsigned char srate[10]; unsigned char exp; unsigned long mantissa; unsigned long last; if ( fread(&srate, 10, 1, fd_) != 1 ) goto error; mantissa = (unsigned long) *(unsigned long *)(srate+2); #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&mantissa); #endif exp = 30 - *(srate+1); last = 0; while (exp--) { last = mantissa; mantissa >>= 1; } if (last & 0x00000001) mantissa++; fileRate_ = (StkFloat) mantissa; byteswap_ = false; #ifdef __LITTLE_ENDIAN__ byteswap_ = true; #endif // Determine the data format. dataType_ = 0; if ( aifc == false ) { if ( temp <= 8 ) dataType_ = STK_SINT8; else if ( temp <= 16 ) dataType_ = STK_SINT16; else if ( temp <= 24 ) dataType_ = STK_SINT24; else if ( temp <= 32 ) dataType_ = STK_SINT32; } else { if ( fread(&id, 4, 1, fd_) != 1 ) goto error; if ( !strncmp(id, "sowt", 4) ) { // uncompressed little-endian if ( byteswap_ == false ) byteswap_ = true; else byteswap_ = false; } if ( !strncmp(id, "NONE", 4) || !strncmp(id, "sowt", 4) ) { if ( temp <= 8 ) dataType_ = STK_SINT8; else if ( temp <= 16 ) dataType_ = STK_SINT16; else if ( temp <= 24 ) dataType_ = STK_SINT24; else if ( temp <= 32 ) dataType_ = STK_SINT32; } else if ( (!strncmp(id, "fl32", 4) || !strncmp(id, "FL32", 4)) && temp == 32 ) dataType_ = STK_FLOAT32; else if ( (!strncmp(id, "fl64", 4) || !strncmp(id, "FL64", 4)) && temp == 64 ) dataType_ = STK_FLOAT64; } if ( dataType_ == 0 ) { oStream_ << "FileRead: AIFF/AIFC file (" << fileName << ") has unsupported data type (" << id << ")."; return false; } // Start at top to find data (SSND) chunk ... chunk order is undefined. if ( fseek(fd_, 12, SEEK_SET) == -1 ) goto error; // Find data (SSND) chunk if ( fread(&id, 4, 1, fd_) != 1 ) goto error; while ( strncmp(id, "SSND", 4) ) { if ( fread(&chunkSize, 4, 1, fd_) != 1 ) goto error; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&chunkSize); #endif chunkSize += chunkSize % 2; // chunk sizes must be even if ( fseek(fd_, chunkSize, SEEK_CUR) == -1 ) goto error; if ( fread(&id, 4, 1, fd_) != 1 ) goto error; } // Skip over chunk size, offset, and blocksize fields if ( fseek(fd_, 12, SEEK_CUR) == -1 ) goto error; dataOffset_ = ftell(fd_); return true; error: oStream_ << "FileRead: Error reading AIFF file (" << fileName << ")."; return false; } bool FileRead :: findNextMatArray( SINT32 *chunkSize, SINT32 *rows, SINT32 *columns, SINT32 *nametype ) { // Look for the next data array element. The file pointer should be // at the data element type when this function is called. SINT32 datatype; *chunkSize = 0; do { if ( fseek(fd_, *chunkSize, SEEK_CUR) == -1 ) return false; if ( fread(&datatype, 4, 1, fd_) != 1 ) return false; if ( byteswap_ ) swap32((unsigned char *)&datatype); if ( fread(chunkSize, 4, 1, fd_) != 1 ) return false; if ( byteswap_ ) swap32((unsigned char *)chunkSize); } while ( datatype != 14 ); // Check dimension subelement size to make sure 2D if ( fseek(fd_, 20, SEEK_CUR) == -1 ) return false; SINT32 size; if ( fread(&size, 4, 1, fd_) != 1 ) return false; if ( byteswap_ ) swap32((unsigned char *)&size); if ( size != 8 ) return false; // Read dimensions data if ( fread(rows, 4, 1, fd_) != 1 ) return false; if ( byteswap_ ) swap32((unsigned char *)rows); if ( fread(columns, 4, 1, fd_) != 1 ) return false; if ( byteswap_ ) swap32((unsigned char *)columns); // Read array name subelement type if ( fread(nametype, 4, 1, fd_) != 1 ) return false; if ( byteswap_ ) swap32((unsigned char *)nametype); return true; } bool FileRead :: getMatInfo( const char *fileName ) { // MAT-file formatting information is available at: // http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/matfile_format.pdf // Verify this is a version 5 MAT-file format. char head[5]; if ( fseek(fd_, 0, SEEK_SET) == -1 ) goto error; if ( fread(&head, 4, 1, fd_) != 1 ) goto error; // If any of the first 4 characters of the header = 0, then this is // a Version 4 MAT-file. head[4] = '\0'; if ( strstr(head, "0") ) { oStream_ << "FileRead: " << fileName << " appears to be a Version 4 MAT-file, which is not currently supported."; return false; } // Determine the endian-ness of the file. char mi[2]; byteswap_ = false; // Locate "M" and "I" characters in header. if ( fseek(fd_, 126, SEEK_SET) == -1 ) goto error; if ( fread(&mi, 2, 1, fd_) != 1) goto error; #ifdef __LITTLE_ENDIAN__ if ( !strncmp(mi, "MI", 2) ) byteswap_ = true; else if ( strncmp(mi, "IM", 2) ) goto error; #else if ( !strncmp(mi, "IM", 2)) byteswap_ = true; else if ( strncmp(mi, "MI", 2) ) goto error; #endif // We are expecting a data element containing the audio data and an // optional data element containing the sample rate (with an array // name of "fs"). Both elements should be stored as a Matlab array // type (14). bool doneParsing, haveData, haveSampleRate; SINT32 chunkSize, rows, columns, nametype; long dataoffset; doneParsing = false; haveData = false; haveSampleRate = false; while ( !doneParsing ) { dataoffset = ftell( fd_ ); // save location in file if ( findNextMatArray( &chunkSize, &rows, &columns, &nametype ) == false ) { // No more Matlab array type chunks found. if ( !haveData ) { oStream_ << "FileRead: No audio data found in MAT-file (" << fileName << ")."; return false; } else if ( !haveSampleRate ) { fileRate_ = 44100.0; oStream_ << "FileRead: No sample rate found ... assuming 44100.0"; handleError( StkError::WARNING ); return true; } else return true; } if ( !haveSampleRate && rows == 1 && columns == 1 ) { // Parse for sample rate. SINT32 namesize = 4; if ( nametype == 1 ) { // array name > 4 characters if ( fread(&namesize, 4, 1, fd_) != 1 ) goto error; if ( byteswap_ ) swap32((unsigned char *)&namesize); if ( namesize != 2 ) goto tryagain; // expecting name = "fs" namesize = 8; // field must be padded to multiple of 8 bytes } char name[3]; name[2] = '\0'; if ( fread(&name, 2, 1, fd_) != 1) goto error; if ( strncmp(name, "fs", 2) ) goto tryagain; // Jump to real part data subelement, which is likely to be in a // small data format. if ( fseek(fd_, namesize-2, SEEK_CUR) == -1 ) goto error; UINT32 type; StkFloat srate; if ( fread(&type, 4, 1, fd_) != 1 ) goto error; if ( byteswap_ ) swap32((unsigned char *)&type); if ( (type & 0xffff0000) != 0 ) // small data format type = (type & 0x0000ffff); else if ( fseek(fd_, 4, SEEK_CUR) == -1 ) goto error; if ( type == 1 ) { // SINT8 signed char rate; if ( fread(&rate, 1, 1, fd_) != 1 ) goto error; srate = (StkFloat) rate; } else if ( type == 2 ) { // UINT8 unsigned char rate; if ( fread(&rate, 1, 1, fd_) != 1 ) goto error; srate = (StkFloat) rate; } else if ( type == 3 ) { // SINT16 SINT16 rate; if ( fread(&rate, 2, 1, fd_) != 1 ) goto error; if ( byteswap_ ) swap16((unsigned char *)&rate); srate = (StkFloat) rate; } else if ( type == 4 ) { // UINT16 UINT16 rate; if ( fread(&rate, 2, 1, fd_) != 1 ) goto error; if ( byteswap_ ) swap16((unsigned char *)&rate); srate = (StkFloat) rate; } else if ( type == 5 ) { // SINT32 SINT32 rate; if ( fread(&rate, 4, 1, fd_) != 1 ) goto error; if ( byteswap_ ) swap32((unsigned char *)&rate); srate = (StkFloat) rate; } else if ( type == 6 ) { // UINT32 UINT32 rate; if ( fread(&rate, 4, 1, fd_) != 1 ) goto error; if ( byteswap_ ) swap32((unsigned char *)&rate); srate = (StkFloat) rate; } else if ( type == 7 ) { // FLOAT32 FLOAT32 rate; if ( fread(&rate, 4, 1, fd_) != 1 ) goto error; if ( byteswap_ ) swap32((unsigned char *)&rate); srate = (StkFloat) rate; } else if ( type == 9 ) { // FLOAT64 FLOAT64 rate; if ( fread(&rate, 8, 1, fd_) != 1 ) goto error; if ( byteswap_ ) swap64((unsigned char *)&rate); srate = (StkFloat) rate; } else goto tryagain; if ( srate > 0 ) fileRate_ = srate; haveSampleRate = true; } else if ( !haveData ) { // Parse for data. // Assume channels = smaller of rows or columns. if ( rows < columns ) { channels_ = rows; fileSize_ = columns; } else { oStream_ << "FileRead: Transpose the MAT-file array so that audio channels fill matrix rows (not columns)."; return false; } SINT32 namesize = 4; if ( nametype == 1 ) { // array name > 4 characters if ( fread(&namesize, 4, 1, fd_) != 1 ) goto error; if ( byteswap_ ) swap32((unsigned char *)&namesize); namesize = (SINT32) ceil((float)namesize / 8); if ( fseek( fd_, namesize*8, SEEK_CUR) == -1 ) goto error; // jump over array name } else { if ( fseek( fd_, 4, SEEK_CUR ) == -1 ) goto error; } // Now at real part data subelement SINT32 type; if ( fread(&type, 4, 1, fd_) != 1 ) goto error; if ( byteswap_ ) swap32((unsigned char *)&type); if ( type == 1 ) dataType_ = STK_SINT8; else if ( type == 3 ) dataType_ = STK_SINT16; else if ( type == 5 ) dataType_ = STK_SINT32; else if ( type == 7 ) dataType_ = STK_FLOAT32; else if ( type == 9 ) dataType_ = STK_FLOAT64; else { oStream_ << "FileRead: The MAT-file array data format (" << type << ") is not supported."; return false; } // Jump to the data. if ( fseek(fd_, 4, SEEK_CUR) == -1 ) goto error; dataOffset_ = ftell(fd_); haveData = true; } tryagain: if ( haveData && haveSampleRate ) doneParsing = true; else // jump to end of data element and keep trying if ( fseek( fd_, dataoffset+chunkSize+8, SEEK_SET) == -1 ) goto error; } return true; error: oStream_ << "FileRead: Error reading MAT-file (" << fileName << ") header."; return false; } void FileRead :: read( StkFrames& buffer, unsigned long startFrame, bool doNormalize ) { // Make sure we have an open file. if ( fd_ == 0 ) { oStream_ << "FileRead::read: a file is not open!"; Stk::handleError( StkError::WARNING ); return; } // Check the buffer size. unsigned long nFrames = buffer.frames(); if ( nFrames == 0 ) { oStream_ << "FileRead::read: StkFrames buffer size is zero ... no data read!"; Stk::handleError( StkError::WARNING ); return; } if ( buffer.channels() != channels_ ) { oStream_ << "FileRead::read: StkFrames argument has incompatible number of channels!"; Stk::handleError( StkError::FUNCTION_ARGUMENT ); } if ( startFrame >= fileSize_ ) { oStream_ << "FileRead::read: startFrame argument is greater than or equal to the file size!"; Stk::handleError( StkError::FUNCTION_ARGUMENT ); } // Check for file end. if ( startFrame + nFrames > fileSize_ ) nFrames = fileSize_ - startFrame; long i, nSamples = (long) ( nFrames * channels_ ); unsigned long offset = startFrame * channels_; // Read samples into StkFrames data buffer. if ( dataType_ == STK_SINT16 ) { SINT16 *buf = (SINT16 *) &buffer[0]; if ( fseek( fd_, dataOffset_+(offset*2), SEEK_SET ) == -1 ) goto error; if ( fread( buf, nSamples * 2, 1, fd_ ) != 1 ) goto error; if ( byteswap_ ) { SINT16 *ptr = buf; for ( i=nSamples-1; i>=0; i-- ) swap16( (unsigned char *) ptr++ ); } if ( doNormalize ) { StkFloat gain = 1.0 / 32768.0; for ( i=nSamples-1; i>=0; i-- ) buffer[i] = buf[i] * gain; } else { for ( i=nSamples-1; i>=0; i-- ) buffer[i] = buf[i]; } } else if ( dataType_ == STK_SINT32 ) { SINT32 *buf = (SINT32 *) &buffer[0]; if ( fseek( fd_, dataOffset_+(offset*4 ), SEEK_SET ) == -1 ) goto error; if ( fread( buf, nSamples * 4, 1, fd_ ) != 1 ) goto error; if ( byteswap_ ) { SINT32 *ptr = buf; for ( i=nSamples-1; i>=0; i-- ) swap32( (unsigned char *) ptr++ ); } if ( doNormalize ) { StkFloat gain = 1.0 / 2147483648.0; for ( i=nSamples-1; i>=0; i-- ) buffer[i] = buf[i] * gain; } else { for ( i=nSamples-1; i>=0; i-- ) buffer[i] = buf[i]; } } else if ( dataType_ == STK_FLOAT32 ) { FLOAT32 *buf = (FLOAT32 *) &buffer[0]; if ( fseek( fd_, dataOffset_+(offset*4), SEEK_SET ) == -1 ) goto error; if ( fread( buf, nSamples * 4, 1, fd_ ) != 1 ) goto error; if ( byteswap_ ) { FLOAT32 *ptr = buf; for ( i=nSamples-1; i>=0; i-- ) swap32( (unsigned char *) ptr++ ); } for ( i=nSamples-1; i>=0; i-- ) buffer[i] = buf[i]; } else if ( dataType_ == STK_FLOAT64 ) { FLOAT64 *buf = (FLOAT64 *) &buffer[0]; if ( fseek( fd_, dataOffset_+(offset*8), SEEK_SET ) == -1 ) goto error; if ( fread( buf, nSamples * 8, 1, fd_ ) != 1 ) goto error; if ( byteswap_ ) { FLOAT64 *ptr = buf; for ( i=nSamples-1; i>=0; i-- ) swap64( (unsigned char *) ptr++ ); } for ( i=nSamples-1; i>=0; i-- ) buffer[i] = buf[i]; } else if ( dataType_ == STK_SINT8 && wavFile_ ) { // 8-bit WAV data is unsigned! unsigned char *buf = (unsigned char *) &buffer[0]; if ( fseek( fd_, dataOffset_+offset, SEEK_SET ) == -1 ) goto error; if ( fread( buf, nSamples, 1, fd_) != 1 ) goto error; if ( doNormalize ) { StkFloat gain = 1.0 / 128.0; for ( i=nSamples-1; i>=0; i-- ) buffer[i] = ( buf[i] - 128 ) * gain; } else { for ( i=nSamples-1; i>=0; i-- ) buffer[i] = buf[i] - 128.0; } } else if ( dataType_ == STK_SINT8 ) { // signed 8-bit data char *buf = (char *) &buffer[0]; if ( fseek( fd_, dataOffset_+offset, SEEK_SET ) == -1 ) goto error; if ( fread( buf, nSamples, 1, fd_ ) != 1 ) goto error; if ( doNormalize ) { StkFloat gain = 1.0 / 128.0; for ( i=nSamples-1; i>=0; i-- ) buffer[i] = buf[i] * gain; } else { for ( i=nSamples-1; i>=0; i-- ) buffer[i] = buf[i]; } } else if ( dataType_ == STK_SINT24 ) { // 24-bit values are harder to import efficiently since there is // no native 24-bit type. The following routine works but is much // less efficient than that used for the other data types. SINT32 temp; unsigned char *ptr = (unsigned char *) &temp; StkFloat gain = 1.0 / 2147483648.0; if ( fseek(fd_, dataOffset_+(offset*3), SEEK_SET ) == -1 ) goto error; for ( i=0; i #include #include #include namespace stk { const FileWrite::FILE_TYPE FileWrite :: FILE_RAW = 1; const FileWrite::FILE_TYPE FileWrite :: FILE_WAV = 2; const FileWrite::FILE_TYPE FileWrite :: FILE_SND = 3; const FileWrite::FILE_TYPE FileWrite :: FILE_AIF = 4; const FileWrite::FILE_TYPE FileWrite :: FILE_MAT = 5; // WAV header structure. See // http://www-mmsp.ece.mcgill.ca/documents/audioformats/WAVE/Docs/rfc2361.txt // for information regarding format codes. struct WaveHeader { char riff[4]; // "RIFF" SINT32 fileSize; // in bytes char wave[4]; // "WAVE" char fmt[4]; // "fmt " SINT32 chunkSize; // in bytes (16 for PCM) SINT16 formatCode; // 1=PCM, 2=ADPCM, 3=IEEE float, 6=A-Law, 7=Mu-Law SINT16 nChannels; // 1=mono, 2=stereo SINT32 sampleRate; SINT32 bytesPerSecond; SINT16 bytesPerSample; // 2=16-bit mono, 4=16-bit stereo SINT16 bitsPerSample; SINT16 cbSize; // size of extension SINT16 validBits; // valid bits per sample SINT32 channelMask; // speaker position mask char subformat[16]; // format code and GUID char fact[4]; // "fact" SINT32 factSize; // fact chunk size SINT32 frames; // sample frames }; // SND (AU) header structure (NeXT and Sun). struct SndHeader { char pref[4]; SINT32 headerBytes; SINT32 dataBytes; SINT32 format; SINT32 sampleRate; SINT32 nChannels; char comment[16]; }; // AIFF/AIFC header structure ... only the part common to both // formats. struct AifHeader { char form[4]; // "FORM" SINT32 formSize; // in bytes char aiff[4]; // "AIFF" or "AIFC" char comm[4]; // "COMM" SINT32 commSize; // "COMM" chunk size (18 for AIFF, 24 for AIFC) SINT16 nChannels; // number of channels unsigned long sampleFrames; // sample frames of audio data SINT16 sampleSize; // in bits unsigned char srate[10]; // IEEE 754 floating point format }; struct AifSsnd { char ssnd[4]; // "SSND" SINT32 ssndSize; // "SSND" chunk size unsigned long offset; // data offset in data block (should be 0) unsigned long blockSize; // not used by STK (should be 0) }; // MAT-file 5 header structure. struct MatHeader { char heading[124]; // Header text field SINT16 hff[2]; // Header flag fields SINT32 fs[16]; // Sample rate data element SINT32 adf[11]; // Array data format fields // There's more, but it's of variable length }; FileWrite :: FileWrite() : fd_( 0 ) { } FileWrite::FileWrite( std::string fileName, unsigned int nChannels, FILE_TYPE type, Stk::StkFormat format ) : fd_( 0 ) { this->open( fileName, nChannels, type, format ); } FileWrite :: ~FileWrite() { this->close(); } void FileWrite :: close( void ) { if ( fd_ == 0 ) return; if ( fileType_ == FILE_RAW ) fclose( fd_ ); else if ( fileType_ == FILE_WAV ) this->closeWavFile(); else if ( fileType_ == FILE_SND ) this->closeSndFile(); else if ( fileType_ == FILE_AIF ) this->closeAifFile(); else if ( fileType_ == FILE_MAT ) this->closeMatFile(); fd_ = 0; } bool FileWrite :: isOpen( void ) { if ( fd_ ) return true; else return false; } void FileWrite :: open( std::string fileName, unsigned int nChannels, FileWrite::FILE_TYPE type, Stk::StkFormat format ) { // Call close() in case another file is already open. this->close(); if ( nChannels < 1 ) { oStream_ << "FileWrite::open: then channels argument must be greater than zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } channels_ = nChannels; fileType_ = type; if ( format != STK_SINT8 && format != STK_SINT16 && format != STK_SINT24 && format != STK_SINT32 && format != STK_FLOAT32 && format != STK_FLOAT64 ) { oStream_ << "FileWrite::open: unknown data type (" << format << ") specified!"; handleError( StkError::FUNCTION_ARGUMENT ); } dataType_ = format; bool result = false; if ( fileType_ == FILE_RAW ) { if ( channels_ != 1 ) { oStream_ << "FileWrite::open: STK RAW files are, by definition, always monaural (channels = " << nChannels << " not supported)!"; handleError( StkError::FUNCTION_ARGUMENT ); } result = setRawFile( fileName ); } else if ( fileType_ == FILE_WAV ) result = setWavFile( fileName ); else if ( fileType_ == FILE_SND ) result = setSndFile( fileName ); else if ( fileType_ == FILE_AIF ) result = setAifFile( fileName ); else if ( fileType_ == FILE_MAT ) result = setMatFile( fileName ); else { oStream_ << "FileWrite::open: unknown file type (" << fileType_ << ") specified!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( result == false ) handleError( StkError::FILE_ERROR ); frameCounter_ = 0; } bool FileWrite :: setRawFile( std::string fileName ) { if ( fileName.find( ".raw" ) == std::string::npos ) fileName += ".raw"; fd_ = fopen( fileName.c_str(), "wb" ); if ( !fd_ ) { oStream_ << "FileWrite: could not create RAW file: " << fileName << '.'; return false; } if ( dataType_ != STK_SINT16 ) { dataType_ = STK_SINT16; oStream_ << "FileWrite: using 16-bit signed integer data format for file " << fileName << '.'; handleError( StkError::WARNING ); } byteswap_ = false; #ifdef __LITTLE_ENDIAN__ byteswap_ = true; #endif oStream_ << "FileWrite: creating RAW file: " << fileName; handleError( StkError::STATUS ); return true; } bool FileWrite :: setWavFile( std::string fileName ) { if ( fileName.find( ".wav" ) == std::string::npos ) fileName += ".wav"; fd_ = fopen( fileName.c_str(), "wb" ); if ( !fd_ ) { oStream_ << "FileWrite: could not create WAV file: " << fileName; return false; } struct WaveHeader hdr = { {'R','I','F','F'}, 44, {'W','A','V','E'}, {'f','m','t',' '}, 16, 1, 1, (SINT32) Stk::sampleRate(), 0, 2, 16, 0, 0, 0, {'\x01','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x80','\x00','\x00','\xAA','\x00','\x38','\x9B','\x71'}, {'f','a','c','t'}, 4, 0 }; hdr.nChannels = (SINT16) channels_; if ( dataType_ == STK_SINT8 ) hdr.bitsPerSample = 8; else if ( dataType_ == STK_SINT16 ) hdr.bitsPerSample = 16; else if ( dataType_ == STK_SINT24 ) hdr.bitsPerSample = 24; else if ( dataType_ == STK_SINT32 ) hdr.bitsPerSample = 32; else if ( dataType_ == STK_FLOAT32 ) { hdr.formatCode = 3; hdr.bitsPerSample = 32; } else if ( dataType_ == STK_FLOAT64 ) { hdr.formatCode = 3; hdr.bitsPerSample = 64; } hdr.bytesPerSample = (SINT16) (channels_ * hdr.bitsPerSample / 8); hdr.bytesPerSecond = (SINT32) (hdr.sampleRate * hdr.bytesPerSample); unsigned int bytesToWrite = 36; if ( channels_ > 2 || hdr.bitsPerSample > 16 ) { // use extensible format bytesToWrite = 72; hdr.chunkSize += 24; hdr.formatCode = 0xFFFE; hdr.cbSize = 22; hdr.validBits = hdr.bitsPerSample; SINT16 *subFormat = (SINT16 *)&hdr.subformat[0]; if ( dataType_ == STK_FLOAT32 || dataType_ == STK_FLOAT64 ) *subFormat = 3; else *subFormat = 1; } byteswap_ = false; #ifndef __LITTLE_ENDIAN__ byteswap_ = true; swap32((unsigned char *)&hdr.chunkSize); swap16((unsigned char *)&hdr.formatCode); swap16((unsigned char *)&hdr.nChannels); swap32((unsigned char *)&hdr.sampleRate); swap32((unsigned char *)&hdr.bytesPerSecond); swap16((unsigned char *)&hdr.bytesPerSample); swap16((unsigned char *)&hdr.bitsPerSample); swap16((unsigned char *)&hdr.cbSize); swap16((unsigned char *)&hdr.validBits); swap16((unsigned char *)&hdr.subformat[0]); swap32((unsigned char *)&hdr.factSize); #endif char data[4] = {'d','a','t','a'}; SINT32 dataSize = 0; if ( fwrite(&hdr, 1, bytesToWrite, fd_) != bytesToWrite ) goto error; if ( fwrite(&data, 4, 1, fd_) != 1 ) goto error; if ( fwrite(&dataSize, 4, 1, fd_) != 1 ) goto error; oStream_ << "FileWrite: creating WAV file: " << fileName; handleError( StkError::STATUS ); return true; error: oStream_ << "FileWrite: could not write WAV header for file: " << fileName; return false; } void FileWrite :: closeWavFile( void ) { int bytesPerSample = 1; if ( dataType_ == STK_SINT16 ) bytesPerSample = 2; else if ( dataType_ == STK_SINT24 ) bytesPerSample = 3; else if ( dataType_ == STK_SINT32 || dataType_ == STK_FLOAT32 ) bytesPerSample = 4; else if ( dataType_ == STK_FLOAT64 ) bytesPerSample = 8; bool useExtensible = false; int dataLocation = 40; if ( bytesPerSample > 2 || channels_ > 2 ) { useExtensible = true; dataLocation = 76; } SINT32 bytes = (SINT32) (frameCounter_ * channels_ * bytesPerSample); if ( bytes % 2 ) { // pad extra byte if odd signed char sample = 0; fwrite( &sample, 1, 1, fd_ ); } #ifndef __LITTLE_ENDIAN__ swap32((unsigned char *)&bytes); #endif fseek( fd_, dataLocation, SEEK_SET ); // jump to data length fwrite( &bytes, 4, 1, fd_ ); bytes = (SINT32) (frameCounter_ * channels_ * bytesPerSample + 44); if ( useExtensible ) bytes += 36; #ifndef __LITTLE_ENDIAN__ swap32((unsigned char *)&bytes); #endif fseek( fd_, 4, SEEK_SET ); // jump to file size fwrite( &bytes, 4, 1, fd_ ); if ( useExtensible ) { // fill in the "fact" chunk frames value bytes = (SINT32) frameCounter_; #ifndef __LITTLE_ENDIAN__ swap32((unsigned char *)&bytes); #endif fseek( fd_, 68, SEEK_SET ); fwrite( &bytes, 4, 1, fd_ ); } fclose( fd_ ); } bool FileWrite :: setSndFile( std::string fileName ) { std::string name( fileName ); if ( fileName.find( ".snd" ) == std::string::npos ) fileName += ".snd"; fd_ = fopen( fileName.c_str(), "wb" ); if ( !fd_ ) { oStream_ << "FileWrite: could not create SND file: " << fileName; return false; } struct SndHeader hdr = {".sn", 40, 0, 3, (SINT32) Stk::sampleRate(), 1, "Created by STK"}; hdr.pref[3] = 'd'; hdr.nChannels = channels_; if ( dataType_ == STK_SINT8 ) hdr.format = 2; else if ( dataType_ == STK_SINT16 ) hdr.format = 3; else if ( dataType_ == STK_SINT24 ) hdr.format = 4; else if ( dataType_ == STK_SINT32 ) hdr.format = 5; else if ( dataType_ == STK_FLOAT32 ) hdr.format = 6; else if ( dataType_ == STK_FLOAT64 ) hdr.format = 7; byteswap_ = false; #ifdef __LITTLE_ENDIAN__ byteswap_ = true; swap32 ((unsigned char *)&hdr.headerBytes); swap32 ((unsigned char *)&hdr.format); swap32 ((unsigned char *)&hdr.sampleRate); swap32 ((unsigned char *)&hdr.nChannels); #endif if ( fwrite(&hdr, 4, 10, fd_) != 10 ) { oStream_ << "FileWrite: Could not write SND header for file " << fileName << '.'; return false; } oStream_ << "FileWrite: creating SND file: " << fileName; handleError( StkError::STATUS ); return true; } void FileWrite :: closeSndFile( void ) { int bytesPerSample = 1; if ( dataType_ == STK_SINT16 ) bytesPerSample = 2; else if ( dataType_ == STK_SINT24 ) bytesPerSample = 3; else if ( dataType_ == STK_SINT32 ) bytesPerSample = 4; else if ( dataType_ == STK_FLOAT32 ) bytesPerSample = 4; else if ( dataType_ == STK_FLOAT64 ) bytesPerSample = 8; SINT32 bytes = (SINT32) (frameCounter_ * bytesPerSample * channels_); #ifdef __LITTLE_ENDIAN__ swap32 ((unsigned char *)&bytes); #endif fseek(fd_, 8, SEEK_SET); // jump to data size fwrite(&bytes, 4, 1, fd_); fclose(fd_); } bool FileWrite :: setAifFile( std::string fileName ) { std::string name( fileName ); if ( fileName.find( ".aif" ) == std::string::npos ) fileName += ".aif"; fd_ = fopen( fileName.c_str(), "wb" ); if ( !fd_ ) { oStream_ << "FileWrite: could not create AIF file: " << fileName; return false; } // Common parts of AIFF/AIFC header. struct AifHeader hdr = {{'F','O','R','M'}, 46, {'A','I','F','F'}, {'C','O','M','M'}, 18, 0, 0, 16, "0"}; struct AifSsnd ssnd = {{'S','S','N','D'}, 8, 0, 0}; hdr.nChannels = channels_; if ( dataType_ == STK_SINT8 ) hdr.sampleSize = 8; else if ( dataType_ == STK_SINT16 ) hdr.sampleSize = 16; else if ( dataType_ == STK_SINT24 ) hdr.sampleSize = 24; else if ( dataType_ == STK_SINT32 ) hdr.sampleSize = 32; else if ( dataType_ == STK_FLOAT32 ) { hdr.aiff[3] = 'C'; hdr.sampleSize = 32; hdr.commSize = 24; } else if ( dataType_ == STK_FLOAT64 ) { hdr.aiff[3] = 'C'; hdr.sampleSize = 64; hdr.commSize = 24; } // For AIFF files, the sample rate is stored in a 10-byte, // IEEE Standard 754 floating point number, so we need to // convert to that. SINT16 i; unsigned long exp; unsigned long rate = (unsigned long) Stk::sampleRate(); memset( hdr.srate, 0, 10 ); exp = rate; for ( i=0; i<32; i++ ) { exp >>= 1; if ( !exp ) break; } i += 16383; #ifdef __LITTLE_ENDIAN__ swap16((unsigned char *)&i); #endif memcpy( hdr.srate, &i, sizeof(SINT16) ); for ( i=32; i; i-- ) { if ( rate & 0x80000000 ) break; rate <<= 1; } #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&rate); #endif memcpy( hdr.srate + 2, &rate, sizeof(rate) ); byteswap_ = false; #ifdef __LITTLE_ENDIAN__ byteswap_ = true; swap32((unsigned char *)&hdr.formSize); swap32((unsigned char *)&hdr.commSize); swap16((unsigned char *)&hdr.nChannels); swap16((unsigned char *)&hdr.sampleSize); swap32((unsigned char *)&ssnd.ssndSize); swap32((unsigned char *)&ssnd.offset); swap32((unsigned char *)&ssnd.blockSize); #endif // The structure boundaries don't allow a single write of 54 bytes. if ( fwrite(&hdr, 4, 5, fd_) != 5 ) goto error; if ( fwrite(&hdr.nChannels, 2, 1, fd_) != 1 ) goto error; if ( fwrite(&hdr.sampleFrames, 4, 1, fd_) != 1 ) goto error; if ( fwrite(&hdr.sampleSize, 2, 1, fd_) != 1 ) goto error; if ( fwrite(&hdr.srate, 10, 1, fd_) != 1 ) goto error; if ( dataType_ == STK_FLOAT32 ) { char type[4] = {'f','l','3','2'}; char zeroes[2] = { 0, 0 }; if ( fwrite(&type, 4, 1, fd_) != 1 ) goto error; if ( fwrite(&zeroes, 2, 1, fd_) != 1 ) goto error; } else if ( dataType_ == STK_FLOAT64 ) { char type[4] = {'f','l','6','4'}; char zeroes[2] = { 0, 0 }; if ( fwrite(&type, 4, 1, fd_) != 1 ) goto error; if ( fwrite(&zeroes, 2, 1, fd_) != 1 ) goto error; } if ( fwrite(&ssnd, 4, 4, fd_) != 4 ) goto error; oStream_ << "FileWrite: creating AIF file: " << fileName; handleError( StkError::STATUS ); return true; error: oStream_ << "FileWrite: could not write AIF header for file: " << fileName; return false; } void FileWrite :: closeAifFile( void ) { unsigned long frames = (unsigned long) frameCounter_; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&frames); #endif fseek(fd_, 22, SEEK_SET); // jump to "COMM" sampleFrames fwrite(&frames, 4, 1, fd_); int bytesPerSample = 1; if ( dataType_ == STK_SINT16 ) bytesPerSample = 2; if ( dataType_ == STK_SINT24 ) bytesPerSample = 3; else if ( dataType_ == STK_SINT32 || dataType_ == STK_FLOAT32 ) bytesPerSample = 4; else if ( dataType_ == STK_FLOAT64 ) bytesPerSample = 8; unsigned long bytes = frameCounter_ * bytesPerSample * channels_ + 46; if ( dataType_ == STK_FLOAT32 || dataType_ == STK_FLOAT64 ) bytes += 6; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&bytes); #endif fseek(fd_, 4, SEEK_SET); // jump to file size fwrite(&bytes, 4, 1, fd_); bytes = frameCounter_ * bytesPerSample * channels_ + 8; if ( dataType_ == STK_FLOAT32 || dataType_ == STK_FLOAT64 ) bytes += 6; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&bytes); #endif if ( dataType_ == STK_FLOAT32 || dataType_ == STK_FLOAT64 ) fseek(fd_, 48, SEEK_SET); // jump to "SSND" chunk size else fseek(fd_, 42, SEEK_SET); // jump to "SSND" chunk size fwrite(&bytes, 4, 1, fd_); fclose( fd_ ); } bool FileWrite :: setMatFile( std::string fileName ) { if ( fileName.find( ".mat" ) == std::string::npos ) fileName += ".mat"; fd_ = fopen( fileName.c_str(), "w+b" ); if ( !fd_ ) { oStream_ << "FileWrite: could not create MAT file: " << fileName; return false; } if ( dataType_ != STK_FLOAT64 ) { dataType_ = STK_FLOAT64; oStream_ << "FileWrite: using 64-bit floating-point data format for file " << fileName << '.'; handleError( StkError::DEBUG_PRINT ); } struct MatHeader hdr; strcpy( hdr.heading,"MATLAB 5.0 MAT-file, Generated using the Synthesis ToolKit in C++ (STK). By Perry R. Cook and Gary P. Scavone." ); for ( size_t i =strlen(hdr.heading); i<124; i++ ) hdr.heading[i] = ' '; // Header Flag Fields hdr.hff[0] = (SINT16) 0x0100; // Version field hdr.hff[1] = (SINT16) 'M'; // Endian indicator field ("MI") hdr.hff[1] <<= 8; hdr.hff[1] += 'I'; // Write sample rate in array data element hdr.fs[0] = (SINT32) 14; // Matlab array data type value hdr.fs[1] = (SINT32) 56; // Size of data element to follow (in bytes) // Numeric Array Subelements (4): // 1. Array Flags hdr.fs[2] = (SINT32) 6; // Matlab 32-bit unsigned integer data type value hdr.fs[3] = (SINT32) 8; // 8 bytes of data to follow hdr.fs[4] = (SINT32) 6; // Double-precision array, no array flags set hdr.fs[5] = (SINT32) 0; // 4 bytes undefined // 2. Array Dimensions hdr.fs[6] = (SINT32) 5; // Matlab 32-bit signed integer data type value hdr.fs[7] = (SINT32) 8; // 8 bytes of data to follow (2D array) hdr.fs[8] = (SINT32) 1; // 1 row hdr.fs[9] = (SINT32) 1; // 1 column // 3. Array Name (small data format element) hdr.fs[10] = 0x00020001; hdr.fs[11] = 's' << 8; hdr.fs[11] += 'f'; // 4. Real Part hdr.fs[12] = 9; // Matlab IEEE 754 double data type hdr.fs[13] = 8; // 8 bytes of data to follow FLOAT64 *sampleRate = (FLOAT64 *)&hdr.fs[14]; *sampleRate = (FLOAT64) Stk::sampleRate(); // Write audio samples in array data element hdr.adf[0] = (SINT32) 14; // Matlab array data type value hdr.adf[1] = (SINT32) 0; // Size of file after this point to end (in bytes) // Numeric Array Subelements (4): // 1. Array Flags hdr.adf[2] = (SINT32) 6; // Matlab 32-bit unsigned integer data type value hdr.adf[3] = (SINT32) 8; // 8 bytes of data to follow hdr.adf[4] = (SINT32) 6; // Double-precision array, no array flags set hdr.adf[5] = (SINT32) 0; // 4 bytes undefined // 2. Array Dimensions hdr.adf[6] = (SINT32) 5; // Matlab 32-bit signed integer data type value hdr.adf[7] = (SINT32) 8; // 8 bytes of data to follow (2D array) hdr.adf[8] = (SINT32) channels_; // This is the number of rows hdr.adf[9] = (SINT32) 0; // This is the number of columns // 3. Array Name We'll use fileName for the matlab array name (as // well as the file name), though we might need to strip off a // leading directory path. If fileName is 4 characters or less, we // have to use a small data format element for the array name data // element. Otherwise, the array name must be formatted in 8-byte // increments (up to 31 characters + NULL). std::string name = fileName; size_t found; found = name.find_last_of("/\\"); name = name.substr(found+1); SINT32 namelength = (SINT32) name.size() - 4; // strip off the ".mat" extension if ( namelength > 31 ) namelength = 31; // Truncate name to 31 characters. if ( namelength > 4 ) { hdr.adf[10] = (SINT32) 1; // Matlab 8-bit signed integer data type value } else { // Compressed data element format hdr.adf[10] = (namelength << 16) + 1; } SINT32 headsize = 40; // Number of bytes in audio data element so far. // Write the fixed portion of the header if ( fwrite(&hdr, 236, 1, fd_) != 1 ) goto error; // Write MATLAB array name SINT32 tmp; if ( namelength > 4 ) { if ( fwrite(&namelength, 4, 1, fd_) != 1) goto error; if ( fwrite(name.c_str(), namelength, 1, fd_) != 1 ) goto error; tmp = (SINT32) ceil((float)namelength / 8); if ( fseek(fd_, tmp*8-namelength, SEEK_CUR) == -1 ) goto error; headsize += tmp * 8; } else { // Compressed data element format if ( fwrite(name.c_str(), namelength, 1, fd_) != 1 ) goto error; tmp = 4 - namelength; if ( fseek(fd_, tmp, SEEK_CUR) == -1 ) goto error; } // Finish writing known header information //4. Real Part tmp = 9; // Matlab IEEE 754 double data type if ( fwrite(&tmp, 4, 1, fd_) != 1 ) goto error; tmp = 0; // Size of real part subelement in bytes (8 per sample) if ( fwrite(&tmp, 4, 1, fd_) != 1 ) goto error; headsize += 8; // Total number of bytes in data element so far if ( fseek(fd_, 196, SEEK_SET) == -1 ) goto error; if ( fwrite(&headsize, 4, 1, fd_) != 1 ) goto error; // Write header size ... will update at end if ( fseek(fd_, 0, SEEK_END) == -1 ) goto error; byteswap_ = false; oStream_ << "FileWrite: creating MAT-file: " << fileName; handleError( StkError::STATUS ); return true; error: oStream_ << "FileWrite: could not write MAT-file header for file " << fileName << '.'; return false; } void FileWrite :: closeMatFile( void ) { fseek(fd_, 228, SEEK_SET); // jump to number of columns fwrite(&frameCounter_, 4, 1, fd_); SINT32 headsize, temp; fseek(fd_, 196, SEEK_SET); // jump to header size if (fread(&headsize, 4, 1, fd_) < 4) { oStream_ << "FileWrite: could not read MAT-file header size."; goto close_file; } temp = headsize; headsize += (SINT32) (frameCounter_ * 8 * channels_); fseek(fd_, 196, SEEK_SET); // Write file size (minus some header info) fwrite(&headsize, 4, 1, fd_); fseek(fd_, temp+196, SEEK_SET); // jumpt to data size (in bytes) temp = (SINT32) (frameCounter_ * 8 * channels_); fwrite(&temp, 4, 1, fd_); close_file: fclose(fd_); } void FileWrite :: write( StkFrames& buffer ) { if ( fd_ == 0 ) { oStream_ << "FileWrite::write(): a file has not yet been opened!"; handleError( StkError::WARNING ); return; } if ( buffer.channels() != channels_ ) { oStream_ << "FileWrite::write(): number of channels in the StkFrames argument does not match that specified to open() function!"; handleError( StkError::FUNCTION_ARGUMENT ); return; } unsigned long nSamples = buffer.size(); if ( dataType_ == STK_SINT16 ) { SINT16 sample; for ( unsigned long k=0; k namespace stk { FileWvIn :: FileWvIn( unsigned long chunkThreshold, unsigned long chunkSize ) : finished_(true), interpolate_(false), time_(0.0), rate_(0.0), chunkThreshold_(chunkThreshold), chunkSize_(chunkSize) { Stk::addSampleRateAlert( this ); } FileWvIn :: FileWvIn( std::string fileName, bool raw, bool doNormalize, unsigned long chunkThreshold, unsigned long chunkSize ) : finished_(true), interpolate_(false), time_(0.0), rate_(0.0), chunkThreshold_(chunkThreshold), chunkSize_(chunkSize) { openFile( fileName, raw, doNormalize ); Stk::addSampleRateAlert( this ); } FileWvIn :: ~FileWvIn() { this->closeFile(); Stk::removeSampleRateAlert( this ); } void FileWvIn :: sampleRateChanged( StkFloat newRate, StkFloat oldRate ) { if ( !ignoreSampleRateChange_ ) this->setRate( oldRate * rate_ / newRate ); } void FileWvIn :: closeFile( void ) { if ( file_.isOpen() ) file_.close(); finished_ = true; lastFrame_.resize( 0, 0 ); } void FileWvIn :: openFile( std::string fileName, bool raw, bool doNormalize ) { // Call close() in case another file is already open. this->closeFile(); // Attempt to open the file ... an error might be thrown here. file_.open( fileName, raw ); // Determine whether chunking or not. if ( file_.fileSize() > chunkThreshold_ ) { chunking_ = true; chunkPointer_ = 0; data_.resize( chunkSize_, file_.channels() ); if ( doNormalize ) normalizing_ = true; else normalizing_ = false; } else { chunking_ = false; data_.resize( (size_t) file_.fileSize(), file_.channels() ); } // Load all or part of the data. file_.read( data_, 0, doNormalize ); // Resize our lastFrame container. lastFrame_.resize( 1, file_.channels() ); // Set default rate based on file sampling rate. this->setRate( data_.dataRate() / Stk::sampleRate() ); if ( doNormalize & !chunking_ ) this->normalize(); this->reset(); } void FileWvIn :: reset(void) { time_ = (StkFloat) 0.0; for ( unsigned int i=0; inormalize( 1.0 ); } // Normalize all channels equally by the greatest magnitude in all of the data. void FileWvIn :: normalize( StkFloat peak ) { // When chunking, the "normalization" scaling is performed by FileRead. if ( chunking_ ) return; size_t i; StkFloat max = 0.0; for ( i=0; i max ) max = (StkFloat) fabs((double) data_[i]); } if ( max > 0.0 ) { max = 1.0 / max; max *= peak; for ( i=0; i file_.fileSize() - 1.0 ) { time_ = file_.fileSize() - 1.0; for ( unsigned int i=0; i= data_.channels() ) { oStream_ << "FileWvIn::tick(): channel argument and soundfile data are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif if ( finished_ ) return 0.0; if ( time_ < 0.0 || time_ > (StkFloat) ( file_.fileSize() - 1.0 ) ) { for ( unsigned int i=0; i (StkFloat) ( chunkPointer_ + chunkSize_ - 1 ) ) ) { while ( time_ < (StkFloat) chunkPointer_ ) { // negative rate chunkPointer_ -= chunkSize_ - 1; // overlap chunks by one frame if ( chunkPointer_ < 0 ) chunkPointer_ = 0; } while ( time_ > (StkFloat) ( chunkPointer_ + chunkSize_ - 1 ) ) { // positive rate chunkPointer_ += chunkSize_ - 1; // overlap chunks by one frame if ( chunkPointer_ + chunkSize_ > file_.fileSize() ) // at end of file chunkPointer_ = file_.fileSize() - chunkSize_; } // Load more data. file_.read( data_, chunkPointer_, normalizing_ ); } // Adjust index for the current buffer. tyme -= chunkPointer_; } if ( interpolate_ ) { for ( unsigned int i=0; itick(); for ( j=0; jopenFile( fileName, nChannels, type, format ); } FileWvOut :: ~FileWvOut() { this->closeFile(); } void FileWvOut :: closeFile( void ) { if ( file_.isOpen() ) { // Output any remaining samples in the buffer before closing. if ( bufferIndex_ > 0 ) { data_.resize( bufferIndex_, data_.channels() ); file_.write( data_ ); } file_.close(); frameCounter_ = 0; } } void FileWvOut :: openFile( std::string fileName, unsigned int nChannels, FileWrite::FILE_TYPE type, Stk::StkFormat format ) { closeFile(); if ( nChannels < 1 ) { oStream_ << "FileWvOut::openFile: the channels argument must be greater than zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } // An StkError can be thrown by the FileWrite class here. file_.open( fileName, nChannels, type, format ); // Allocate new memory if necessary. data_.resize( bufferFrames_, nChannels ); bufferIndex_ = 0; iData_ = 0; } void FileWvOut :: incrementFrame( void ) { frameCounter_++; bufferIndex_++; if ( bufferIndex_ == bufferFrames_ ) { file_.write( data_ ); bufferIndex_ = 0; iData_ = 0; } } void FileWvOut :: tick( const StkFloat sample ) { #if defined(_STK_DEBUG_) if ( !file_.isOpen() ) { oStream_ << "FileWvOut::tick(): no file open!"; handleError( StkError::WARNING ); return; } #endif unsigned int nChannels = data_.channels(); StkFloat input = sample; clipTest( input ); for ( unsigned int j=0; jincrementFrame(); } void FileWvOut :: tick( const StkFrames& frames ) { #if defined(_STK_DEBUG_) if ( !file_.isOpen() ) { oStream_ << "FileWvOut::tick(): no file open!"; handleError( StkError::WARNING ); return; } if ( data_.channels() != frames.channels() ) { oStream_ << "FileWvOut::tick(): incompatible channel value in StkFrames argument!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif unsigned int iFrames = 0; unsigned int j, nChannels = data_.channels(); for ( unsigned int i=0; iincrementFrame(); } } } // stk namespace stk-4.5.0/src/Fir.cpp0000644000076600007660000000351712327014024012154 0ustar gary/***************************************************/ /*! \class Fir \brief STK general finite impulse response filter class. This class provides a generic digital filter structure that can be used to implement FIR filters. For filters with feedback terms, the Iir class should be used. In particular, this class implements the standard difference equation: y[n] = b[0]*x[n] + ... + b[nb]*x[n-nb] The \e gain parameter is applied at the filter input and does not affect the coefficient values. The default gain value is 1.0. This structure results in one extra multiply per computed sample, but allows easy control of the overall filter gain. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Fir.h" #include namespace stk { Fir :: Fir() { // The default constructor should setup for pass-through. b_.push_back( 1.0 ); inputs_.resize( 1, 1, 0.0 ); } Fir :: Fir( std::vector &coefficients ) { // Check the arguments. if ( coefficients.size() == 0 ) { oStream_ << "Fir: coefficient vector must have size > 0!"; handleError( StkError::FUNCTION_ARGUMENT ); } gain_ = 1.0; b_ = coefficients; inputs_.resize( b_.size(), 1, 0.0 ); this->clear(); } Fir :: ~Fir() { } void Fir :: setCoefficients( std::vector &coefficients, bool clearState ) { // Check the argument. if ( coefficients.size() == 0 ) { oStream_ << "Fir::setCoefficients: coefficient vector must have size > 0!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( b_.size() != coefficients.size() ) { b_ = coefficients; inputs_.resize( b_.size(), 1, 0.0 ); } else { for ( unsigned int i=0; iclear(); } } // stk namespace stk-4.5.0/src/Flute.cpp0000644000076600007660000001066112327014024012511 0ustar gary/***************************************************/ /*! \Class Flute \brief STK flute physical model class. This class implements a simple flute physical model, as discussed by Karjalainen, Smith, Waryznyk, etc. The jet model uses a polynomial, a la Cook. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Jet Delay = 2 - Noise Gain = 4 - Vibrato Frequency = 11 - Vibrato Gain = 1 - Breath Pressure = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Flute.h" #include "SKINI.msg" namespace stk { Flute :: Flute( StkFloat lowestFrequency ) { if ( lowestFrequency <= 0.0 ) { oStream_ << "Flute::Flute: argument is less than or equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } unsigned long nDelays = (unsigned long) ( Stk::sampleRate() / lowestFrequency ); boreDelay_.setMaximumDelay( nDelays + 1 ); jetDelay_.setMaximumDelay( nDelays + 1 ); jetDelay_.setDelay( 49.0 ); vibrato_.setFrequency( 5.925 ); filter_.setPole( 0.7 - ( 0.1 * 22050.0 / Stk::sampleRate() ) ); dcBlock_.setBlockZero(); adsr_.setAllTimes( 0.005, 0.01, 0.8, 0.010 ); endReflection_ = 0.5; jetReflection_ = 0.5; noiseGain_ = 0.15; // Breath pressure random component. vibratoGain_ = 0.05; // Breath periodic vibrato component. jetRatio_ = 0.32; maxPressure_ = 0.0; this->clear(); this->setFrequency( 220.0 ); } Flute :: ~Flute( void ) { } void Flute :: clear( void ) { jetDelay_.clear(); boreDelay_.clear(); filter_.clear(); dcBlock_.clear(); } void Flute :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Flute::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif // We're overblowing here. lastFrequency_ = frequency * 0.66666; // Account for filter delay and one sample "lastOut" delay // (previously approximated as 2.0 samples). The tuning is still // not perfect but I'm not sure why. Also, we are not accounting // for the dc blocking filter delay. StkFloat delay = Stk::sampleRate() / lastFrequency_ - filter_.phaseDelay( lastFrequency_ ) - 1.0; boreDelay_.setDelay( delay ); jetDelay_.setDelay( delay * jetRatio_ ); } void Flute :: setJetDelay( StkFloat aRatio ) { jetRatio_ = aRatio; jetDelay_.setDelay( boreDelay_.getDelay() * aRatio ); // Scaled by ratio. } void Flute :: startBlowing( StkFloat amplitude, StkFloat rate ) { if ( amplitude <= 0.0 || rate <= 0.0 ) { oStream_ << "Flute::startBlowing: one or more arguments is less than or equal to zero!"; handleError( StkError::WARNING ); return; } adsr_.setAttackRate( rate ); maxPressure_ = amplitude / (StkFloat) 0.8; adsr_.keyOn(); } void Flute :: stopBlowing( StkFloat rate ) { if ( rate <= 0.0 ) { oStream_ << "Flute::stopBlowing: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } adsr_.setReleaseRate( rate ); adsr_.keyOff(); } void Flute :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); this->startBlowing( 1.1 + (amplitude * 0.20), amplitude * 0.02 ); outputGain_ = amplitude + 0.001; } void Flute :: noteOff( StkFloat amplitude ) { this->stopBlowing( amplitude * 0.02 ); } void Flute :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Flute::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_JetDelay_) // 2 this->setJetDelay( (StkFloat) (0.08 + (0.48 * normalizedValue)) ); else if (number == __SK_NoiseLevel_) // 4 noiseGain_ = ( normalizedValue * 0.4); else if (number == __SK_ModFrequency_) // 11 vibrato_.setFrequency( normalizedValue * 12.0); else if (number == __SK_ModWheel_) // 1 vibratoGain_ = ( normalizedValue * 0.4 ); else if (number == __SK_AfterTouch_Cont_) // 128 adsr_.setTarget( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "Flute::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/FM.cpp0000644000076600007660000001044112327014024011730 0ustar gary/***************************************************/ /*! \class FM \brief STK abstract FM synthesis base class. This class controls an arbitrary number of waves and envelopes, determined via a constructor argument. Control Change Numbers: - Control One = 2 - Control Two = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "FM.h" #include "SKINI.msg" namespace stk { FM :: FM( unsigned int operators ) : nOperators_(operators) { if ( nOperators_ == 0 ) { oStream_ << "FM::FM: Number of operators must be greater than zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } twozero_.setB2( -1.0 ); twozero_.setGain( 0.0 ); vibrato_.setFrequency( 6.0 ); unsigned int j; adsr_.resize( nOperators_ ); waves_.resize( nOperators_ ); for (j=0; j=0; i--) { fmGains_[i] = temp; temp *= 0.933033; } temp = 1.0; for (i=15; i>=0; i--) { fmSusLevels_[i] = temp; temp *= 0.707101; } temp = 8.498186; for (i=0; i<32; i++) { fmAttTimes_[i] = temp; temp *= 0.707101; } } FM :: ~FM( void ) { for (unsigned int i=0; isetFrequency( baseFrequency_ * ratios_[i] ); } void FM :: setRatio( unsigned int waveIndex, StkFloat ratio ) { if ( waveIndex >= nOperators_ ) { oStream_ << "FM:setRatio: waveIndex parameter is greater than the number of operators!"; handleError( StkError::WARNING ); return; } ratios_[waveIndex] = ratio; if (ratio > 0.0) waves_[waveIndex]->setFrequency( baseFrequency_ * ratio ); else waves_[waveIndex]->setFrequency( ratio ); } void FM :: setGain( unsigned int waveIndex, StkFloat gain ) { if ( waveIndex >= nOperators_ ) { oStream_ << "FM::setGain: waveIndex parameter is greater than the number of operators!"; handleError( StkError::WARNING ); return; } gains_[waveIndex] = gain; } void FM :: keyOn( void ) { for ( unsigned int i=0; ikeyOn(); } void FM :: keyOff( void ) { for ( unsigned int i=0; ikeyOff(); } void FM :: noteOff( StkFloat amplitude ) { this->keyOff(); } void FM :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "FM::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_Breath_) // 2 this->setControl1( normalizedValue ); else if (number == __SK_FootControl_) // 4 this->setControl2( normalizedValue ); else if (number == __SK_ModFrequency_) // 11 this->setModulationSpeed( normalizedValue * 12.0); else if (number == __SK_ModWheel_) // 1 this->setModulationDepth( normalizedValue ); else if (number == __SK_AfterTouch_Cont_) { // 128 //adsr_[0]->setTarget( normalizedValue ); adsr_[1]->setTarget( normalizedValue ); //adsr_[2]->setTarget( normalizedValue ); adsr_[3]->setTarget( normalizedValue ); } #if defined(_STK_DEBUG_) else { oStream_ << "FM::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/FMVoices.cpp0000644000076600007660000001054312327014024013104 0ustar gary/***************************************************/ /*! \class FMVoices \brief STK singing FM synthesis instrument. This class implements 3 carriers and a common modulator, also referred to as algorithm 6 of the TX81Z. \code Algorithm 6 is : /->1 -\ 4-|-->2 - +-> Out \->3 -/ \endcode Control Change Numbers: - Vowel = 2 - Spectral Tilt = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "FMVoices.h" #include "SKINI.msg" #include "Phonemes.h" namespace stk { FMVoices :: FMVoices( void ) : FM() { // Concatenate the STK rawwave path to the rawwave files for ( unsigned int i=0; i<3; i++ ) waves_[i] = new FileLoop( (Stk::rawwavePath() + "sinewave.raw").c_str(), true ); waves_[3] = new FileLoop( (Stk::rawwavePath() + "fwavblnk.raw").c_str(), true ); this->setRatio(0, 2.00); this->setRatio(1, 4.00); this->setRatio(2, 12.0); this->setRatio(3, 1.00); gains_[3] = fmGains_[80]; adsr_[0]->setAllTimes( 0.05, 0.05, fmSusLevels_[15], 0.05); adsr_[1]->setAllTimes( 0.05, 0.05, fmSusLevels_[15], 0.05); adsr_[2]->setAllTimes( 0.05, 0.05, fmSusLevels_[15], 0.05); adsr_[3]->setAllTimes( 0.01, 0.01, fmSusLevels_[15], 0.5); twozero_.setGain( 0.0 ); modDepth_ = (StkFloat) 0.005; currentVowel_ = 0; tilt_[0] = 1.0; tilt_[1] = 0.5; tilt_[2] = 0.2; mods_[0] = 1.0; mods_[1] = 1.1; mods_[2] = 1.1; baseFrequency_ = 110.0; this->setFrequency( 110.0 ); } FMVoices :: ~FMVoices( void ) { } void FMVoices :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "FMVoices::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif StkFloat temp, temp2 = 0.0; int tempi = 0; unsigned int i = 0; if (currentVowel_ < 32) { i = currentVowel_; temp2 = 0.9; } else if (currentVowel_ < 64) { i = currentVowel_ - 32; temp2 = 1.0; } else if (currentVowel_ < 96) { i = currentVowel_ - 64; temp2 = 1.1; } else if (currentVowel_ <= 128) { i = currentVowel_ - 96; temp2 = 1.2; } baseFrequency_ = frequency; temp = (temp2 * Phonemes::formantFrequency(i, 0) / baseFrequency_) + 0.5; tempi = (int) temp; this->setRatio( 0, (StkFloat) tempi ); temp = (temp2 * Phonemes::formantFrequency(i, 1) / baseFrequency_) + 0.5; tempi = (int) temp; this->setRatio( 1, (StkFloat) tempi ); temp = (temp2 * Phonemes::formantFrequency(i, 2) / baseFrequency_) + 0.5; tempi = (int) temp; this->setRatio( 2, (StkFloat) tempi ); gains_[0] = 1.0; gains_[1] = 1.0; gains_[2] = 1.0; } void FMVoices :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); tilt_[0] = amplitude; tilt_[1] = amplitude * amplitude; tilt_[2] = tilt_[1] * amplitude; this->keyOn(); } void FMVoices :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "FMVoices::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_Breath_) // 2 gains_[3] = fmGains_[(int) ( normalizedValue * 99.9 )]; else if (number == __SK_FootControl_) { // 4 currentVowel_ = (int) (normalizedValue * 128.0); this->setFrequency(baseFrequency_); } else if (number == __SK_ModFrequency_) // 11 this->setModulationSpeed( normalizedValue * 12.0); else if (number == __SK_ModWheel_) // 1 this->setModulationDepth( normalizedValue ); else if (number == __SK_AfterTouch_Cont_) { // 128 tilt_[0] = normalizedValue; tilt_[1] = normalizedValue * normalizedValue; tilt_[2] = tilt_[1] * normalizedValue; } #if defined(_STK_DEBUG_) else { oStream_ << "FMVoices::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/FormSwep.cpp0000644000076600007660000000710012327014024013166 0ustar gary/***************************************************/ /*! \class FormSwep \brief STK sweepable formant filter class. This class implements a formant (resonance) which can be "swept" over time from one frequency setting to another. It provides methods for controlling the sweep rate and target frequency. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "FormSwep.h" #include namespace stk { FormSwep :: FormSwep( void ) { frequency_ = 0.0; radius_ = 0.0; targetGain_ = 1.0; targetFrequency_ = 0.0; targetRadius_ = 0.0; deltaGain_ = 0.0; deltaFrequency_ = 0.0; deltaRadius_ = 0.0; sweepState_ = 0.0; sweepRate_ = 0.002; dirty_ = false; b_.resize( 3, 0.0 ); a_.resize( 3, 0.0 ); a_[0] = 1.0; inputs_.resize( 3, 1, 0.0 ); outputs_.resize( 3, 1, 0.0 ); Stk::addSampleRateAlert( this ); } FormSwep :: ~FormSwep() { Stk::removeSampleRateAlert( this ); } void FormSwep :: sampleRateChanged( StkFloat newRate, StkFloat oldRate ) { if ( !ignoreSampleRateChange_ ) { oStream_ << "FormSwep::sampleRateChanged: you may need to recompute filter coefficients!"; handleError( StkError::WARNING ); } } void FormSwep :: setResonance( StkFloat frequency, StkFloat radius ) { #if defined(_STK_DEBUG_) if ( frequency < 0.0 || frequency > 0.5 * Stk::sampleRate() ) { oStream_ << "FormSwep::setResonance: frequency argument (" << frequency << ") is out of range!"; handleError( StkError::WARNING ); return; } if ( radius < 0.0 || radius >= 1.0 ) { oStream_ << "FormSwep::setResonance: radius argument (" << radius << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif radius_ = radius; frequency_ = frequency; a_[2] = radius * radius; a_[1] = -2.0 * radius * cos( TWO_PI * frequency / Stk::sampleRate() ); // Use zeros at +- 1 and normalize the filter peak gain. b_[0] = 0.5 - 0.5 * a_[2]; b_[1] = 0.0; b_[2] = -b_[0]; } void FormSwep :: setStates( StkFloat frequency, StkFloat radius, StkFloat gain ) { dirty_ = false; if ( frequency_ != frequency || radius_ != radius ) this->setResonance( frequency, radius ); gain_ = gain; targetFrequency_ = frequency; targetRadius_ = radius; targetGain_ = gain; } void FormSwep :: setTargets( StkFloat frequency, StkFloat radius, StkFloat gain ) { if ( frequency < 0.0 || frequency > 0.5 * Stk::sampleRate() ) { oStream_ << "FormSwep::setTargets: frequency argument (" << frequency << ") is out of range!"; handleError( StkError::WARNING ); return; } if ( radius < 0.0 || radius >= 1.0 ) { oStream_ << "FormSwep::setTargets: radius argument (" << radius << ") is out of range!"; handleError( StkError::WARNING ); return; } dirty_ = true; startFrequency_ = frequency_; startRadius_ = radius_; startGain_ = gain_; targetFrequency_ = frequency; targetRadius_ = radius; targetGain_ = gain; deltaFrequency_ = frequency - frequency_; deltaRadius_ = radius - radius_; deltaGain_ = gain - gain_; sweepState_ = 0.0; } void FormSwep :: setSweepRate( StkFloat rate ) { if ( rate < 0.0 || rate > 1.0 ) { oStream_ << "FormSwep::setSweepRate: argument (" << rate << ") is out of range!"; handleError( StkError::WARNING ); return; } sweepRate_ = rate; } void FormSwep :: setSweepTime( StkFloat time ) { if ( time <= 0.0 ) { oStream_ << "FormSwep::setSweepTime: argument (" << time << ") must be > 0.0!"; handleError( StkError::WARNING ); return; } this->setSweepRate( 1.0 / ( time * Stk::sampleRate() ) ); } } // stk namespace stk-4.5.0/src/FreeVerb.cpp0000644000076600007660000001415012327014024013127 0ustar gary/***********************************************************************/ /*! \class FreeVerb \brief Jezar at Dreampoint's FreeVerb, implemented in STK. Freeverb is a free and open-source Schroeder reverberator originally implemented in C++. The parameters of the reverberation model are exceptionally well tuned. FreeVerb uses 8 lowpass-feedback-comb-filters in parallel, followed by 4 Schroeder allpass filters in series. The input signal can be either mono or stereo, and the output signal is stereo. The delay lengths are optimized for a sample rate of 44100 Hz. Ported to STK by Gregory Burlet, 2012. */ /***********************************************************************/ #include "FreeVerb.h" #include #include using namespace stk; // Set static delay line lengths const StkFloat FreeVerb::fixedGain = 0.015; const StkFloat FreeVerb::scaleWet = 3; const StkFloat FreeVerb::scaleDry = 2; const StkFloat FreeVerb::scaleDamp = 0.4; const StkFloat FreeVerb::scaleRoom = 0.28; const StkFloat FreeVerb::offsetRoom = 0.7; int FreeVerb::cDelayLengths[] = {1617, 1557, 1491, 1422, 1356, 1277, 1188, 1116}; int FreeVerb::aDelayLengths[] = {225, 556, 441, 341}; FreeVerb::FreeVerb( void ) { // Resize lastFrame_ for stereo output lastFrame_.resize( 1, 2, 0.0 ); // Initialize parameters Effect::setEffectMix( 0.75 ); // set initially to 3/4 wet 1/4 dry signal (different than original freeverb) roomSizeMem_ = (0.75 * scaleRoom) + offsetRoom; // feedback attenuation in LBFC dampMem_ = 0.25 * scaleDamp; // pole of lowpass filters in the LBFC width_ = 1.0; frozenMode_ = false; update(); gain_ = fixedGain; // input gain before sending to filters g_ = 0.5; // allpass coefficient, immutable in FreeVerb // Scale delay line lengths according to the current sampling rate double fsScale = Stk::sampleRate() / 44100.0; if ( fsScale != 1.0 ) { // scale comb filter delay lines for ( int i = 0; i < nCombs; i++ ) { cDelayLengths[i] = (int) floor(fsScale * cDelayLengths[i]); } // Scale allpass filter delay lines for ( int i = 0; i < nAllpasses; i++ ) { aDelayLengths[i] = (int) floor(fsScale * aDelayLengths[i]); } } // Initialize delay lines for the LBFC filters for ( int i = 0; i < nCombs; i++ ) { combDelayL_[i].setMaximumDelay( cDelayLengths[i] ); combDelayL_[i].setDelay( cDelayLengths[i] ); combDelayR_[i].setMaximumDelay( cDelayLengths[i] + stereoSpread ); combDelayR_[i].setDelay( cDelayLengths[i] + stereoSpread ); } // initialize delay lines for the allpass filters for (int i = 0; i < nAllpasses; i++) { allPassDelayL_[i].setMaximumDelay( aDelayLengths[i] ); allPassDelayL_[i].setDelay( aDelayLengths[i] ); allPassDelayR_[i].setMaximumDelay( aDelayLengths[i] + stereoSpread ); allPassDelayR_[i].setDelay( aDelayLengths[i] + stereoSpread ); } } FreeVerb::~FreeVerb() { } void FreeVerb::setEffectMix( StkFloat mix ) { Effect::setEffectMix( mix ); update(); } void FreeVerb::setRoomSize( StkFloat roomSize ) { roomSizeMem_ = (roomSize * scaleRoom) + offsetRoom; update(); } StkFloat FreeVerb::getRoomSize() { return (roomSizeMem_ - offsetRoom) / scaleRoom; } void FreeVerb::setDamping( StkFloat damping ) { dampMem_ = damping * scaleDamp; update(); } StkFloat FreeVerb::getDamping() { return dampMem_ / scaleDamp; } void FreeVerb::setWidth( StkFloat width ) { width_ = width; update(); } StkFloat FreeVerb::getWidth() { return width_; } void FreeVerb::setMode( bool isFrozen ) { frozenMode_ = isFrozen; update(); } StkFloat FreeVerb::getMode() { return frozenMode_; } void FreeVerb::update() { StkFloat wet = scaleWet * effectMix_; dry_ = scaleDry * (1.0-effectMix_); // Use the L1 norm so the output gain will sum to one while still // preserving the ratio of scalings in original FreeVerb wet /= (wet + dry_); dry_ /= (wet + dry_); wet1_ = wet * (width_/2.0 + 0.5); wet2_ = wet * (1.0 - width_)/2.0; if ( frozenMode_ ) { // put into freeze mode roomSize_ = 1.0; damp_ = 0.0; gain_ = 0.0; } else { roomSize_ = roomSizeMem_; damp_ = dampMem_; gain_ = fixedGain; } for ( int i=0; i= frames.channels() - 1 ) { oStream_ << "FreeVerb::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() - 1 ) { oStream_ << "FreeVerb::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(); unsigned int oHop = oFrames.channels(); bool stereoInput = ( iFrames.channels() > iChannel+1 ) ? true : false; for ( unsigned int i=0; i namespace stk { Granulate :: Granulate( void ) { this->setGrainParameters(); // use default values this->setRandomFactor(); gStretch_ = 0; stretchCounter_ = 0; gain_ = 1.0; } Granulate :: Granulate( unsigned int nVoices, std::string fileName, bool typeRaw ) { this->setGrainParameters(); // use default values this->setRandomFactor(); gStretch_ = 0; stretchCounter_ = 0; this->openFile( fileName, typeRaw ); this->setVoices( nVoices ); } Granulate :: ~Granulate( void ) { } void Granulate :: setStretch( unsigned int stretchFactor ) { if ( stretchFactor <= 1 ) gStretch_ = 0; else if ( gStretch_ >= 1000 ) gStretch_ = 1000; else gStretch_ = stretchFactor - 1; } void Granulate :: setGrainParameters( unsigned int duration, unsigned int rampPercent, int offset, unsigned int delay ) { gDuration_ = duration; if ( gDuration_ == 0 ) { gDuration_ = 1; oStream_ << "Granulate::setGrainParameters: duration argument cannot be zero ... setting to 1 millisecond."; handleError( StkError::WARNING ); } gRampPercent_ = rampPercent; if ( gRampPercent_ > 100 ) { gRampPercent_ = 100; oStream_ << "Granulate::setGrainParameters: rampPercent argument cannot be greater than 100 ... setting to 100."; handleError( StkError::WARNING ); } gOffset_ = offset; gDelay_ = delay; } void Granulate :: setRandomFactor( StkFloat randomness ) { if ( randomness < 0.0 ) gRandomFactor_ = 0.0; else if ( randomness > 1.0 ) gRandomFactor_ = 0.97; gRandomFactor_ = 0.97 * randomness; }; void Granulate :: openFile( std::string fileName, bool typeRaw ) { // Attempt to load the soundfile data. FileRead file( fileName, typeRaw ); data_.resize( file.fileSize(), file.channels() ); file.read( data_ ); lastFrame_.resize( 1, file.channels(), 0.0 ); this->reset(); #if defined(_STK_DEBUG_) std::ostringstream message; message << "Granulate::openFile: file = " << fileName << ", file frames = " << file.fileSize() << '.'; handleError( message.str(), StkError::DEBUG_PRINT ); #endif } void Granulate :: reset( void ) { gPointer_ = 0; // Reset grain parameters. size_t count; size_t nVoices = (unsigned int)grains_.size(); for ( unsigned int i=0; icalculateGrain( grains_[i] ); break; case GRAIN_FADEIN: // We're done ramping up the envelope if ( grains_[i].sustainCount > 0 ) { grains_[i].counter = grains_[i].sustainCount; grains_[i].state = GRAIN_SUSTAIN; break; } // else no sustain state (i.e. perfect triangle window) case GRAIN_SUSTAIN: // We're done with flat part of envelope ... setup to ramp down if ( grains_[i].decayCount > 0 ) { grains_[i].counter = grains_[i].decayCount; grains_[i].eRate = -grains_[i].eRate; grains_[i].state = GRAIN_FADEOUT; break; } // else no fade out state (gRampPercent = 0) case GRAIN_FADEOUT: // We're done ramping down ... setup for wait between grains if ( grains_[i].delayCount > 0 ) { grains_[i].counter = grains_[i].delayCount; grains_[i].state = GRAIN_STOPPED; break; } // else no delay (gDelay = 0) this->calculateGrain( grains_[i] ); } } // Accumulate the grain outputs. if ( grains_[i].state > 0 ) { for ( j=0; j= data_.frames() ) grains_[i].pointer = 0; } // Decrement counter for all states. grains_[i].counter--; } // Increment our global file pointer at the stretch rate. if ( stretchCounter_++ == gStretch_ ) { gPointer_++; if ( (unsigned long) gPointer_ >= data_.frames() ) gPointer_ = 0; stretchCounter_ = 0; } return lastFrame_[channel]; } } // stk namespace stk-4.5.0/src/Guitar.cpp0000644000076600007660000001665512327014024012676 0ustar gary/***************************************************/ /*! \class Guitar \brief STK guitar model class. This class implements a guitar model with an arbitrary number of strings (specified during instantiation). Each string is represented by an stk::Twang object. The model supports commuted synthesis, as discussed by Smith and Karjalainen. It also includes a basic body coupling model and supports feedback. This class does not attempt voice management. Rather, most functions support a parameter to specify a particular string number and string (voice) management is assumed to occur externally. Note that this class does not inherit from stk::Instrmnt because of API inconsistencies. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Bridge Coupling Gain = 2 - Pluck Position = 4 - Loop Gain = 11 - Coupling Filter Pole = 1 - Pick Filter Pole = 128 by Gary P. Scavone, 2012. */ /***************************************************/ #include "Guitar.h" #include "FileWvIn.h" #include "Noise.h" #include "SKINI.msg" #include namespace stk { #define BASE_COUPLING_GAIN 0.01 Guitar :: Guitar( unsigned int nStrings, std::string bodyfile ) { strings_.resize( nStrings ); stringState_.resize( nStrings, 0 ); decayCounter_.resize( nStrings, 0 ); filePointer_.resize( nStrings, 0 ); pluckGains_.resize( nStrings, 0 ); setBodyFile( bodyfile ); couplingGain_ = BASE_COUPLING_GAIN; couplingFilter_.setPole( 0.9 ); pickFilter_.setPole( 0.95 ); lastFrame_.resize(1, 1, 0.0); } void Guitar :: clear( void ) { for ( unsigned int i=0; i 1.0 ) { std::cerr << "Guitar::setPluckPosition: position parameter out of range!"; handleError( StkError::WARNING ); return; } if ( string >= (int) strings_.size() ) { oStream_ << "Guitar::setPluckPosition: string parameter is greater than number of strings!"; handleError( StkError::WARNING ); return; } if ( string < 0 ) // set all strings for ( unsigned int i=0; i 1.0 ) { std::cerr << "Guitar::setLoopGain: gain parameter out of range!"; handleError( StkError::WARNING ); return; } if ( string >= (int) strings_.size() ) { oStream_ << "Guitar::setLoopGain: string parameter is greater than number of strings!"; handleError( StkError::WARNING ); return; } if ( string < 0 ) // set all strings for ( unsigned int i=0; i= strings_.size() ) { oStream_ << "Guitar::setFrequency: string parameter is greater than number of strings!"; handleError( StkError::WARNING ); return; } #endif strings_[string].setFrequency( frequency ); } void Guitar :: noteOn( StkFloat frequency, StkFloat amplitude, unsigned int string ) { #if defined(_STK_DEBUG_) if ( string >= strings_.size() ) { oStream_ << "Guitar::noteOn: string parameter is greater than number of strings!"; handleError( StkError::WARNING ); return; } if ( Stk::inRange( amplitude, 0.0, 1.0 ) == false ) { oStream_ << "Guitar::noteOn: amplitude parameter is outside range 0.0 - 1.0!"; handleError( StkError::WARNING ); return; } #endif this->setFrequency( frequency, string ); stringState_[string] = 2; filePointer_[string] = 0; strings_[string].setLoopGain( 0.995 ); pluckGains_[string] = amplitude; } void Guitar :: noteOff( StkFloat amplitude, unsigned int string ) { #if defined(_STK_DEBUG_) if ( string >= strings_.size() ) { oStream_ << "Guitar::noteOff: string parameter is greater than number of strings!"; handleError( StkError::WARNING ); return; } if ( Stk::inRange( amplitude, 0.0, 1.0 ) == false ) { oStream_ << "Guitar::noteOff: amplitude parameter is outside range 0.0 - 1.0!"; handleError( StkError::WARNING ); return; } #endif strings_[string].setLoopGain( (1.0 - amplitude) * 0.9 ); stringState_[string] = 1; } void Guitar :: controlChange( int number, StkFloat value, int string ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Guitar::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } if ( string > 0 && string >= (int) strings_.size() ) { oStream_ << "Guitar::controlChange: string parameter is greater than number of strings!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if ( number == 2 ) couplingGain_ = 1.5 * BASE_COUPLING_GAIN * normalizedValue; else if ( number == __SK_PickPosition_ ) // 4 this->setPluckPosition( normalizedValue, string ); else if ( number == __SK_StringDamping_ ) // 11 this->setLoopGain( 0.97 + (normalizedValue * 0.03), string ); else if ( number == __SK_ModWheel_ ) // 1 couplingFilter_.setPole( 0.98 * normalizedValue ); else if (number == __SK_AfterTouch_Cont_) // 128 pickFilter_.setPole( 0.95 * normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "Guitar::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/HevyMetl.cpp0000644000076600007660000000400512327014024013162 0ustar gary/***************************************************/ /*! \class HevyMetl \brief STK heavy metal FM synthesis instrument. This class implements 3 cascade operators with feedback modulation, also referred to as algorithm 3 of the TX81Z. Algorithm 3 is : 4--\ 3-->2-- + -->1-->Out Control Change Numbers: - Total Modulator Index = 2 - Modulator Crossfade = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "HevyMetl.h" namespace stk { HevyMetl :: HevyMetl( void ) : FM() { // Concatenate the STK rawwave path to the rawwave files for ( unsigned int i=0; i<3; i++ ) waves_[i] = new FileLoop( (Stk::rawwavePath() + "sinewave.raw").c_str(), true ); waves_[3] = new FileLoop( (Stk::rawwavePath() + "fwavblnk.raw").c_str(), true ); this->setRatio(0, 1.0 * 1.000); this->setRatio(1, 4.0 * 0.999); this->setRatio(2, 3.0 * 1.001); this->setRatio(3, 0.5 * 1.002); gains_[0] = fmGains_[92]; gains_[1] = fmGains_[76]; gains_[2] = fmGains_[91]; gains_[3] = fmGains_[68]; adsr_[0]->setAllTimes( 0.001, 0.001, 1.0, 0.01); adsr_[1]->setAllTimes( 0.001, 0.010, 1.0, 0.50); adsr_[2]->setAllTimes( 0.010, 0.005, 1.0, 0.20); adsr_[3]->setAllTimes( 0.030, 0.010, 0.2, 0.20); twozero_.setGain( 2.0 ); vibrato_.setFrequency( 5.5 ); modDepth_ = 0.0; } HevyMetl :: ~HevyMetl( void ) { } void HevyMetl :: noteOn( StkFloat frequency, StkFloat amplitude ) { gains_[0] = amplitude * fmGains_[92]; gains_[1] = amplitude * fmGains_[76]; gains_[2] = amplitude * fmGains_[91]; gains_[3] = amplitude * fmGains_[68]; this->setFrequency( frequency ); this->keyOn(); } } // stk namespace stk-4.5.0/src/Iir.cpp0000644000076600007660000000664712327014024012166 0ustar gary/***************************************************/ /*! \class Iir \brief STK general infinite impulse response filter class. This class provides a generic digital filter structure that can be used to implement IIR filters. For filters containing only feedforward terms, the Fir class is slightly more efficient. In particular, this class implements the standard difference equation: a[0]*y[n] = b[0]*x[n] + ... + b[nb]*x[n-nb] - a[1]*y[n-1] - ... - a[na]*y[n-na] If a[0] is not equal to 1, the filter coeffcients are normalized by a[0]. The \e gain parameter is applied at the filter input and does not affect the coefficient values. The default gain value is 1.0. This structure results in one extra multiply per computed sample, but allows easy control of the overall filter gain. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Iir.h" namespace stk { Iir :: Iir() { // The default constructor should setup for pass-through. b_.push_back( 1.0 ); a_.push_back( 1.0 ); inputs_.resize( 1, 1, 0.0 ); outputs_.resize( 1, 1, 0.0 ); } Iir :: Iir( std::vector &bCoefficients, std::vector &aCoefficients ) { // Check the arguments. if ( bCoefficients.size() == 0 || aCoefficients.size() == 0 ) { oStream_ << "Iir: a and b coefficient vectors must both have size > 0!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( aCoefficients[0] == 0.0 ) { oStream_ << "Iir: a[0] coefficient cannot == 0!"; handleError( StkError::FUNCTION_ARGUMENT ); } gain_ = 1.0; b_ = bCoefficients; a_ = aCoefficients; inputs_.resize( b_.size(), 1, 0.0 ); outputs_.resize( a_.size(), 1, 0.0 ); this->clear(); } Iir :: ~Iir() { } void Iir :: setCoefficients( std::vector &bCoefficients, std::vector &aCoefficients, bool clearState ) { this->setNumerator( bCoefficients, false ); this->setDenominator( aCoefficients, false ); if ( clearState ) this->clear(); } void Iir :: setNumerator( std::vector &bCoefficients, bool clearState ) { // Check the argument. if ( bCoefficients.size() == 0 ) { oStream_ << "Iir::setNumerator: coefficient vector must have size > 0!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( b_.size() != bCoefficients.size() ) { b_ = bCoefficients; inputs_.resize( b_.size(), 1, 0.0 ); } else { for ( unsigned int i=0; iclear(); } void Iir :: setDenominator( std::vector &aCoefficients, bool clearState ) { // Check the argument. if ( aCoefficients.size() == 0 ) { oStream_ << "Iir::setDenominator: coefficient vector must have size > 0!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( aCoefficients[0] == 0.0 ) { oStream_ << "Iir::setDenominator: a[0] coefficient cannot == 0!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( a_.size() != aCoefficients.size() ) { a_ = aCoefficients; outputs_.resize( a_.size(), 1, 0.0 ); } else { for ( unsigned int i=0; iclear(); // Scale coefficients by a[0] if necessary if ( a_[0] != 1.0 ) { unsigned int i; for ( i=0; i #include "asiosys.h" // platform definition #include "asio.h" #if MAC #include "asiodrvr.h" #pragma export on AsioDriver *theAsioDriver = 0; extern "C" { long main() { return 'ASIO'; } #elif WINDOWS #include "windows.h" #include "iasiodrv.h" #include "asiodrivers.h" IASIO *theAsioDriver = 0; extern AsioDrivers *asioDrivers; #elif SGI || SUN || BEOS || LINUX #include "asiodrvr.h" static AsioDriver *theAsioDriver = 0; #endif //----------------------------------------------------------------------------------------------------- ASIOError ASIOInit(ASIODriverInfo *info) { #if MAC || SGI || SUN || BEOS || LINUX if(theAsioDriver) { delete theAsioDriver; theAsioDriver = 0; } info->driverVersion = 0; strcpy(info->name, "No ASIO Driver"); theAsioDriver = getDriver(); if(!theAsioDriver) { strcpy(info->errorMessage, "Not enough memory for the ASIO driver!"); return ASE_NotPresent; } if(!theAsioDriver->init(info->sysRef)) { theAsioDriver->getErrorMessage(info->errorMessage); delete theAsioDriver; theAsioDriver = 0; return ASE_NotPresent; } strcpy(info->errorMessage, "No ASIO Driver Error"); theAsioDriver->getDriverName(info->name); info->driverVersion = theAsioDriver->getDriverVersion(); return ASE_OK; #else info->driverVersion = 0; strcpy(info->name, "No ASIO Driver"); if(theAsioDriver) // must be loaded! { if(!theAsioDriver->init(info->sysRef)) { theAsioDriver->getErrorMessage(info->errorMessage); theAsioDriver = 0; return ASE_NotPresent; } strcpy(info->errorMessage, "No ASIO Driver Error"); theAsioDriver->getDriverName(info->name); info->driverVersion = theAsioDriver->getDriverVersion(); return ASE_OK; } return ASE_NotPresent; #endif // !MAC } ASIOError ASIOExit(void) { if(theAsioDriver) { #if WINDOWS asioDrivers->removeCurrentDriver(); #else delete theAsioDriver; #endif } theAsioDriver = 0; return ASE_OK; } ASIOError ASIOStart(void) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->start(); } ASIOError ASIOStop(void) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->stop(); } ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels) { if(!theAsioDriver) { *numInputChannels = *numOutputChannels = 0; return ASE_NotPresent; } return theAsioDriver->getChannels(numInputChannels, numOutputChannels); } ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency) { if(!theAsioDriver) { *inputLatency = *outputLatency = 0; return ASE_NotPresent; } return theAsioDriver->getLatencies(inputLatency, outputLatency); } ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity) { if(!theAsioDriver) { *minSize = *maxSize = *preferredSize = *granularity = 0; return ASE_NotPresent; } return theAsioDriver->getBufferSize(minSize, maxSize, preferredSize, granularity); } ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->canSampleRate(sampleRate); } ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->getSampleRate(currentRate); } ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->setSampleRate(sampleRate); } ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources) { if(!theAsioDriver) { *numSources = 0; return ASE_NotPresent; } return theAsioDriver->getClockSources(clocks, numSources); } ASIOError ASIOSetClockSource(long reference) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->setClockSource(reference); } ASIOError ASIOGetSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->getSamplePosition(sPos, tStamp); } ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info) { if(!theAsioDriver) { info->channelGroup = -1; info->type = ASIOSTInt16MSB; strcpy(info->name, "None"); return ASE_NotPresent; } return theAsioDriver->getChannelInfo(info); } ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks) { if(!theAsioDriver) { ASIOBufferInfo *info = bufferInfos; for(long i = 0; i < numChannels; i++, info++) info->buffers[0] = info->buffers[1] = 0; return ASE_NotPresent; } return theAsioDriver->createBuffers(bufferInfos, numChannels, bufferSize, callbacks); } ASIOError ASIODisposeBuffers(void) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->disposeBuffers(); } ASIOError ASIOControlPanel(void) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->controlPanel(); } ASIOError ASIOFuture(long selector, void *opt) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->future(selector, opt); } ASIOError ASIOOutputReady(void) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->outputReady(); } #if MAC } // extern "C" #pragma export off #endif stk-4.5.0/src/include/asio.h0000644000076600007660000012361112327014024013455 0ustar gary//--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- /* Steinberg Audio Stream I/O API (c) 1997 - 2005, Steinberg Media Technologies GmbH ASIO Interface Specification v 2.1 2005 - Added support for DSD sample data (in cooperation with Sony) basic concept is an i/o synchronous double-buffer scheme: on bufferSwitch(index == 0), host will read/write: after ASIOStart(), the read first input buffer A (index 0) | will be invalid (empty) * ------------------------ |------------------------|-----------------------| | | | | Input Buffer A (0) | Input Buffer B (1) | | | | |------------------------|-----------------------| | | | | Output Buffer A (0) | Output Buffer B (1) | | | | |------------------------|-----------------------| * ------------------------- | before calling ASIOStart(), write host will have filled output buffer B (index 1) already *please* take special care of proper statement of input and output latencies (see ASIOGetLatencies()), these control sequencer sync accuracy */ //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- /* prototypes summary: ASIOError ASIOInit(ASIODriverInfo *info); ASIOError ASIOExit(void); ASIOError ASIOStart(void); ASIOError ASIOStop(void); ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels); ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency); ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate); ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate); ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate); ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources); ASIOError ASIOSetClockSource(long reference); ASIOError ASIOGetSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp); ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info); ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); ASIOError ASIODisposeBuffers(void); ASIOError ASIOControlPanel(void); void *ASIOFuture(long selector, void *params); ASIOError ASIOOutputReady(void); */ //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- #ifndef __ASIO_H #define __ASIO_H // force 4 byte alignment #if defined(_MSC_VER) && !defined(__MWERKS__) #pragma pack(push,4) #elif PRAGMA_ALIGN_SUPPORTED #pragma options align = native #endif //- - - - - - - - - - - - - - - - - - - - - - - - - // Type definitions //- - - - - - - - - - - - - - - - - - - - - - - - - // number of samples data type is 64 bit integer #if NATIVE_INT64 typedef long long int ASIOSamples; #else typedef struct ASIOSamples { unsigned long hi; unsigned long lo; } ASIOSamples; #endif // Timestamp data type is 64 bit integer, // Time format is Nanoseconds. #if NATIVE_INT64 typedef long long int ASIOTimeStamp ; #else typedef struct ASIOTimeStamp { unsigned long hi; unsigned long lo; } ASIOTimeStamp; #endif // Samplerates are expressed in IEEE 754 64 bit double float, // native format as host computer #if IEEE754_64FLOAT typedef double ASIOSampleRate; #else typedef struct ASIOSampleRate { char ieee[8]; } ASIOSampleRate; #endif // Boolean values are expressed as long typedef long ASIOBool; enum { ASIOFalse = 0, ASIOTrue = 1 }; // Sample Types are expressed as long typedef long ASIOSampleType; enum { ASIOSTInt16MSB = 0, ASIOSTInt24MSB = 1, // used for 20 bits as well ASIOSTInt32MSB = 2, ASIOSTFloat32MSB = 3, // IEEE 754 32 bit float ASIOSTFloat64MSB = 4, // IEEE 754 64 bit double float // these are used for 32 bit data buffer, with different alignment of the data inside // 32 bit PCI bus systems can be more easily used with these ASIOSTInt32MSB16 = 8, // 32 bit data with 16 bit alignment ASIOSTInt32MSB18 = 9, // 32 bit data with 18 bit alignment ASIOSTInt32MSB20 = 10, // 32 bit data with 20 bit alignment ASIOSTInt32MSB24 = 11, // 32 bit data with 24 bit alignment ASIOSTInt16LSB = 16, ASIOSTInt24LSB = 17, // used for 20 bits as well ASIOSTInt32LSB = 18, ASIOSTFloat32LSB = 19, // IEEE 754 32 bit float, as found on Intel x86 architecture ASIOSTFloat64LSB = 20, // IEEE 754 64 bit double float, as found on Intel x86 architecture // these are used for 32 bit data buffer, with different alignment of the data inside // 32 bit PCI bus systems can more easily used with these ASIOSTInt32LSB16 = 24, // 32 bit data with 18 bit alignment ASIOSTInt32LSB18 = 25, // 32 bit data with 18 bit alignment ASIOSTInt32LSB20 = 26, // 32 bit data with 20 bit alignment ASIOSTInt32LSB24 = 27, // 32 bit data with 24 bit alignment // ASIO DSD format. ASIOSTDSDInt8LSB1 = 32, // DSD 1 bit data, 8 samples per byte. First sample in Least significant bit. ASIOSTDSDInt8MSB1 = 33, // DSD 1 bit data, 8 samples per byte. First sample in Most significant bit. ASIOSTDSDInt8NER8 = 40, // DSD 8 bit data, 1 sample per byte. No Endianness required. ASIOSTLastEntry }; /*----------------------------------------------------------------------------- // DSD operation and buffer layout // Definition by Steinberg/Sony Oxford. // // We have tried to treat DSD as PCM and so keep a consistant structure across // the ASIO interface. // // DSD's sample rate is normally referenced as a multiple of 44.1Khz, so // the standard sample rate is refered to as 64Fs (or 2.8224Mhz). We looked // at making a special case for DSD and adding a field to the ASIOFuture that // would allow the user to select the Over Sampleing Rate (OSR) as a seperate // entity but decided in the end just to treat it as a simple value of // 2.8224Mhz and use the standard interface to set it. // // The second problem was the "word" size, in PCM the word size is always a // greater than or equal to 8 bits (a byte). This makes life easy as we can // then pack the samples into the "natural" size for the machine. // In DSD the "word" size is 1 bit. This is not a major problem and can easily // be dealt with if we ensure that we always deal with a multiple of 8 samples. // // DSD brings with it another twist to the Endianness religion. How are the // samples packed into the byte. It would be nice to just say the most significant // bit is always the first sample, however there would then be a performance hit // on little endian machines. Looking at how some of the processing goes... // Little endian machines like the first sample to be in the Least Significant Bit, // this is because when you write it to memory the data is in the correct format // to be shifted in and out of the words. // Big endian machine prefer the first sample to be in the Most Significant Bit, // again for the same reasion. // // And just when things were looking really muddy there is a proposed extension to // DSD that uses 8 bit word sizes. It does not care what endianness you use. // // Switching the driver between DSD and PCM mode // ASIOFuture allows for extending the ASIO API quite transparently. // See kAsioSetIoFormat, kAsioGetIoFormat, kAsioCanDoIoFormat // //-----------------------------------------------------------------------------*/ //- - - - - - - - - - - - - - - - - - - - - - - - - // Error codes //- - - - - - - - - - - - - - - - - - - - - - - - - typedef long ASIOError; enum { ASE_OK = 0, // This value will be returned whenever the call succeeded ASE_SUCCESS = 0x3f4847a0, // unique success return value for ASIOFuture calls ASE_NotPresent = -1000, // hardware input or output is not present or available ASE_HWMalfunction, // hardware is malfunctioning (can be returned by any ASIO function) ASE_InvalidParameter, // input parameter invalid ASE_InvalidMode, // hardware is in a bad mode or used in a bad mode ASE_SPNotAdvancing, // hardware is not running when sample position is inquired ASE_NoClock, // sample clock or rate cannot be determined or is not present ASE_NoMemory // not enough memory for completing the request }; //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- //- - - - - - - - - - - - - - - - - - - - - - - - - // Time Info support //- - - - - - - - - - - - - - - - - - - - - - - - - typedef struct ASIOTimeCode { double speed; // speed relation (fraction of nominal speed) // optional; set to 0. or 1. if not supported ASIOSamples timeCodeSamples; // time in samples unsigned long flags; // some information flags (see below) char future[64]; } ASIOTimeCode; typedef enum ASIOTimeCodeFlags { kTcValid = 1, kTcRunning = 1 << 1, kTcReverse = 1 << 2, kTcOnspeed = 1 << 3, kTcStill = 1 << 4, kTcSpeedValid = 1 << 8 } ASIOTimeCodeFlags; typedef struct AsioTimeInfo { double speed; // absolute speed (1. = nominal) ASIOTimeStamp systemTime; // system time related to samplePosition, in nanoseconds // on mac, must be derived from Microseconds() (not UpTime()!) // on windows, must be derived from timeGetTime() ASIOSamples samplePosition; ASIOSampleRate sampleRate; // current rate unsigned long flags; // (see below) char reserved[12]; } AsioTimeInfo; typedef enum AsioTimeInfoFlags { kSystemTimeValid = 1, // must always be valid kSamplePositionValid = 1 << 1, // must always be valid kSampleRateValid = 1 << 2, kSpeedValid = 1 << 3, kSampleRateChanged = 1 << 4, kClockSourceChanged = 1 << 5 } AsioTimeInfoFlags; typedef struct ASIOTime // both input/output { long reserved[4]; // must be 0 struct AsioTimeInfo timeInfo; // required struct ASIOTimeCode timeCode; // optional, evaluated if (timeCode.flags & kTcValid) } ASIOTime; /* using time info: it is recommended to use the new method with time info even if the asio device does not support timecode; continuous calls to ASIOGetSamplePosition and ASIOGetSampleRate are avoided, and there is a more defined relationship between callback time and the time info. see the example below. to initiate time info mode, after you have received the callbacks pointer in ASIOCreateBuffers, you will call the asioMessage callback with kAsioSupportsTimeInfo as the argument. if this returns 1, host has accepted time info mode. now host expects the new callback bufferSwitchTimeInfo to be used instead of the old bufferSwitch method. the ASIOTime structure is assumed to be valid and accessible until the callback returns. using time code: if the device supports reading time code, it will call host's asioMessage callback with kAsioSupportsTimeCode as the selector. it may then fill the according fields and set the kTcValid flag. host will call the future method with the kAsioEnableTimeCodeRead selector when it wants to enable or disable tc reading by the device. you should also support the kAsioCanTimeInfo and kAsioCanTimeCode selectors in ASIOFuture (see example). note: the AsioTimeInfo/ASIOTimeCode pair is supposed to work in both directions. as a matter of convention, the relationship between the sample position counter and the time code at buffer switch time is (ignoring offset between tc and sample pos when tc is running): on input: sample 0 -> input buffer sample 0 -> time code 0 on output: sample 0 -> output buffer sample 0 -> time code 0 this means that for 'real' calculations, one has to take into account the according latencies. example: ASIOTime asioTime; in createBuffers() { memset(&asioTime, 0, sizeof(ASIOTime)); AsioTimeInfo* ti = &asioTime.timeInfo; ti->sampleRate = theSampleRate; ASIOTimeCode* tc = &asioTime.timeCode; tc->speed = 1.; timeInfoMode = false; canTimeCode = false; if(callbacks->asioMessage(kAsioSupportsTimeInfo, 0, 0, 0) == 1) { timeInfoMode = true; #if kCanTimeCode if(callbacks->asioMessage(kAsioSupportsTimeCode, 0, 0, 0) == 1) canTimeCode = true; #endif } } void switchBuffers(long doubleBufferIndex, bool processNow) { if(timeInfoMode) { AsioTimeInfo* ti = &asioTime.timeInfo; ti->flags = kSystemTimeValid | kSamplePositionValid | kSampleRateValid; ti->systemTime = theNanoSeconds; ti->samplePosition = theSamplePosition; if(ti->sampleRate != theSampleRate) ti->flags |= kSampleRateChanged; ti->sampleRate = theSampleRate; #if kCanTimeCode if(canTimeCode && timeCodeEnabled) { ASIOTimeCode* tc = &asioTime.timeCode; tc->timeCodeSamples = tcSamples; // tc in samples tc->flags = kTcValid | kTcRunning | kTcOnspeed; // if so... } ASIOTime* bb = callbacks->bufferSwitchTimeInfo(&asioTime, doubleBufferIndex, processNow ? ASIOTrue : ASIOFalse); #else callbacks->bufferSwitchTimeInfo(&asioTime, doubleBufferIndex, processNow ? ASIOTrue : ASIOFalse); #endif } else callbacks->bufferSwitch(doubleBufferIndex, ASIOFalse); } ASIOError ASIOFuture(long selector, void *params) { switch(selector) { case kAsioEnableTimeCodeRead: timeCodeEnabled = true; return ASE_SUCCESS; case kAsioDisableTimeCodeRead: timeCodeEnabled = false; return ASE_SUCCESS; case kAsioCanTimeInfo: return ASE_SUCCESS; #if kCanTimeCode case kAsioCanTimeCode: return ASE_SUCCESS; #endif } return ASE_NotPresent; }; */ //- - - - - - - - - - - - - - - - - - - - - - - - - // application's audio stream handler callbacks //- - - - - - - - - - - - - - - - - - - - - - - - - typedef struct ASIOCallbacks { void (*bufferSwitch) (long doubleBufferIndex, ASIOBool directProcess); // bufferSwitch indicates that both input and output are to be processed. // the current buffer half index (0 for A, 1 for B) determines // - the output buffer that the host should start to fill. the other buffer // will be passed to output hardware regardless of whether it got filled // in time or not. // - the input buffer that is now filled with incoming data. Note that // because of the synchronicity of i/o, the input always has at // least one buffer latency in relation to the output. // directProcess suggests to the host whether it should immedeately // start processing (directProcess == ASIOTrue), or whether its process // should be deferred because the call comes from a very low level // (for instance, a high level priority interrupt), and direct processing // would cause timing instabilities for the rest of the system. If in doubt, // directProcess should be set to ASIOFalse. // Note: bufferSwitch may be called at interrupt time for highest efficiency. void (*sampleRateDidChange) (ASIOSampleRate sRate); // gets called when the AudioStreamIO detects a sample rate change // If sample rate is unknown, 0 is passed (for instance, clock loss // when externally synchronized). long (*asioMessage) (long selector, long value, void* message, double* opt); // generic callback for various purposes, see selectors below. // note this is only present if the asio version is 2 or higher ASIOTime* (*bufferSwitchTimeInfo) (ASIOTime* params, long doubleBufferIndex, ASIOBool directProcess); // new callback with time info. makes ASIOGetSamplePosition() and various // calls to ASIOGetSampleRate obsolete, // and allows for timecode sync etc. to be preferred; will be used if // the driver calls asioMessage with selector kAsioSupportsTimeInfo. } ASIOCallbacks; // asioMessage selectors enum { kAsioSelectorSupported = 1, // selector in , returns 1L if supported, // 0 otherwise kAsioEngineVersion, // returns engine (host) asio implementation version, // 2 or higher kAsioResetRequest, // request driver reset. if accepted, this // will close the driver (ASIO_Exit() ) and // re-open it again (ASIO_Init() etc). some // drivers need to reconfigure for instance // when the sample rate changes, or some basic // changes have been made in ASIO_ControlPanel(). // returns 1L; note the request is merely passed // to the application, there is no way to determine // if it gets accepted at this time (but it usually // will be). kAsioBufferSizeChange, // not yet supported, will currently always return 0L. // for now, use kAsioResetRequest instead. // once implemented, the new buffer size is expected // in , and on success returns 1L kAsioResyncRequest, // the driver went out of sync, such that // the timestamp is no longer valid. this // is a request to re-start the engine and // slave devices (sequencer). returns 1 for ok, // 0 if not supported. kAsioLatenciesChanged, // the drivers latencies have changed. The engine // will refetch the latencies. kAsioSupportsTimeInfo, // if host returns true here, it will expect the // callback bufferSwitchTimeInfo to be called instead // of bufferSwitch kAsioSupportsTimeCode, // kAsioMMCCommand, // unused - value: number of commands, message points to mmc commands kAsioSupportsInputMonitor, // kAsioSupportsXXX return 1 if host supports this kAsioSupportsInputGain, // unused and undefined kAsioSupportsInputMeter, // unused and undefined kAsioSupportsOutputGain, // unused and undefined kAsioSupportsOutputMeter, // unused and undefined kAsioOverload, // driver detected an overload kAsioNumMessageSelectors }; //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- //- - - - - - - - - - - - - - - - - - - - - - - - - // (De-)Construction //- - - - - - - - - - - - - - - - - - - - - - - - - typedef struct ASIODriverInfo { long asioVersion; // currently, 2 long driverVersion; // driver specific char name[32]; char errorMessage[124]; void *sysRef; // on input: system reference // (Windows: application main window handle, Mac & SGI: 0) } ASIODriverInfo; ASIOError ASIOInit(ASIODriverInfo *info); /* Purpose: Initialize the AudioStreamIO. Parameter: info: pointer to an ASIODriver structure: - asioVersion: - on input, the host version. *** Note *** this is 0 for earlier asio implementations, and the asioMessage callback is implemeted only if asioVersion is 2 or greater. sorry but due to a design fault the driver doesn't have access to the host version in ASIOInit :-( added selector for host (engine) version in the asioMessage callback so we're ok from now on. - on return, asio implementation version. older versions are 1 if you support this version (namely, ASIO_outputReady() ) this should be 2 or higher. also see the note in ASIO_getTimeStamp() ! - version: on return, the driver version (format is driver specific) - name: on return, a null-terminated string containing the driver's name - error message: on return, should contain a user message describing the type of error that occured during ASIOInit(), if any. - sysRef: platform specific Returns: If neither input nor output is present ASE_NotPresent will be returned. ASE_NoMemory, ASE_HWMalfunction are other possible error conditions */ ASIOError ASIOExit(void); /* Purpose: Terminates the AudioStreamIO. Parameter: None. Returns: If neither input nor output is present ASE_NotPresent will be returned. Notes: this implies ASIOStop() and ASIODisposeBuffers(), meaning that no host callbacks must be accessed after ASIOExit(). */ //- - - - - - - - - - - - - - - - - - - - - - - - - // Start/Stop //- - - - - - - - - - - - - - - - - - - - - - - - - ASIOError ASIOStart(void); /* Purpose: Start input and output processing synchronously. This will - reset the sample counter to zero - start the hardware (both input and output) The first call to the hosts' bufferSwitch(index == 0) then tells the host to read from input buffer A (index 0), and start processing to output buffer A while output buffer B (which has been filled by the host prior to calling ASIOStart()) is possibly sounding (see also ASIOGetLatencies()) Parameter: None. Returns: If neither input nor output is present, ASE_NotPresent will be returned. If the hardware fails to start, ASE_HWMalfunction will be returned. Notes: There is no restriction on the time that ASIOStart() takes to perform (that is, it is not considered a realtime trigger). */ ASIOError ASIOStop(void); /* Purpose: Stops input and output processing altogether. Parameter: None. Returns: If neither input nor output is present ASE_NotPresent will be returned. Notes: On return from ASIOStop(), the driver must in no case call the hosts' bufferSwitch() routine. */ //- - - - - - - - - - - - - - - - - - - - - - - - - // Inquiry methods and sample rate //- - - - - - - - - - - - - - - - - - - - - - - - - ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels); /* Purpose: Returns number of individual input/output channels. Parameter: numInputChannels will hold the number of available input channels numOutputChannels will hold the number of available output channels Returns: If no input/output is present ASE_NotPresent will be returned. If only inputs, or only outputs are available, the according other parameter will be zero, and ASE_OK is returned. */ ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency); /* Purpose: Returns the input and output latencies. This includes device specific delays, like FIFOs etc. Parameter: inputLatency will hold the 'age' of the first sample frame in the input buffer when the hosts reads it in bufferSwitch() (this is theoretical, meaning it does not include the overhead and delay between the actual physical switch, and the time when bufferSitch() enters). This will usually be the size of one block in sample frames, plus device specific latencies. outputLatency will specify the time between the buffer switch, and the time when the next play buffer will start to sound. The next play buffer is defined as the one the host starts processing after (or at) bufferSwitch(), indicated by the index parameter (0 for buffer A, 1 for buffer B). It will usually be either one block, if the host writes directly to a dma buffer, or two or more blocks if the buffer is 'latched' by the driver. As an example, on ASIOStart(), the host will have filled the play buffer at index 1 already; when it gets the callback (with the parameter index == 0), this tells it to read from the input buffer 0, and start to fill the play buffer 0 (assuming that now play buffer 1 is already sounding). In this case, the output latency is one block. If the driver decides to copy buffer 1 at that time, and pass it to the hardware at the next slot (which is most commonly done, but should be avoided), the output latency becomes two blocks instead, resulting in a total i/o latency of at least 3 blocks. As memory access is the main bottleneck in native dsp processing, and to acheive less latency, it is highly recommended to try to avoid copying (this is also why the driver is the owner of the buffers). To summarize, the minimum i/o latency can be acheived if the input buffer is processed by the host into the output buffer which will physically start to sound on the next time slice. Also note that the host expects the bufferSwitch() callback to be accessed for each time slice in order to retain sync, possibly recursively; if it fails to process a block in time, it will suspend its operation for some time in order to recover. Returns: If no input/output is present ASE_NotPresent will be returned. */ ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); /* Purpose: Returns min, max, and preferred buffer sizes for input/output Parameter: minSize will hold the minimum buffer size maxSize will hold the maxium possible buffer size preferredSize will hold the preferred buffer size (a size which best fits performance and hardware requirements) granularity will hold the granularity at which buffer sizes may differ. Usually, the buffer size will be a power of 2; in this case, granularity will hold -1 on return, signalling possible buffer sizes starting from minSize, increased in powers of 2 up to maxSize. Returns: If no input/output is present ASE_NotPresent will be returned. Notes: When minimum and maximum buffer size are equal, the preferred buffer size has to be the same value as well; granularity should be 0 in this case. */ ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate); /* Purpose: Inquires the hardware for the available sample rates. Parameter: sampleRate is the rate in question. Returns: If the inquired sample rate is not supported, ASE_NoClock will be returned. If no input/output is present ASE_NotPresent will be returned. */ ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate); /* Purpose: Get the current sample Rate. Parameter: currentRate will hold the current sample rate on return. Returns: If sample rate is unknown, sampleRate will be 0 and ASE_NoClock will be returned. If no input/output is present ASE_NotPresent will be returned. Notes: */ ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate); /* Purpose: Set the hardware to the requested sample Rate. If sampleRate == 0, enable external sync. Parameter: sampleRate: on input, the requested rate Returns: If sampleRate is unknown ASE_NoClock will be returned. If the current clock is external, and sampleRate is != 0, ASE_InvalidMode will be returned If no input/output is present ASE_NotPresent will be returned. Notes: */ typedef struct ASIOClockSource { long index; // as used for ASIOSetClockSource() long associatedChannel; // for instance, S/PDIF or AES/EBU long associatedGroup; // see channel groups (ASIOGetChannelInfo()) ASIOBool isCurrentSource; // ASIOTrue if this is the current clock source char name[32]; // for user selection } ASIOClockSource; ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources); /* Purpose: Get the available external audio clock sources Parameter: clocks points to an array of ASIOClockSource structures: - index: this is used to identify the clock source when ASIOSetClockSource() is accessed, should be an index counting from zero - associatedInputChannel: the first channel of an associated input group, if any. - associatedGroup: the group index of that channel. groups of channels are defined to seperate for instance analog, S/PDIF, AES/EBU, ADAT connectors etc, when present simultaniously. Note that associated channel is enumerated according to numInputs/numOutputs, means it is independant from a group (see also ASIOGetChannelInfo()) inputs are associated to a clock if the physical connection transfers both data and clock (like S/PDIF, AES/EBU, or ADAT inputs). if there is no input channel associated with the clock source (like Word Clock, or internal oscillator), both associatedChannel and associatedGroup should be set to -1. - isCurrentSource: on exit, ASIOTrue if this is the current clock source, ASIOFalse else - name: a null-terminated string for user selection of the available sources. numSources: on input: the number of allocated array members on output: the number of available clock sources, at least 1 (internal clock generator). Returns: If no input/output is present ASE_NotPresent will be returned. Notes: */ ASIOError ASIOSetClockSource(long index); /* Purpose: Set the audio clock source Parameter: index as obtained from an inquiry to ASIOGetClockSources() Returns: If no input/output is present ASE_NotPresent will be returned. If the clock can not be selected because an input channel which carries the current clock source is active, ASE_InvalidMode *may* be returned (this depends on the properties of the driver and/or hardware). Notes: Should *not* return ASE_NoClock if there is no clock signal present at the selected source; this will be inquired via ASIOGetSampleRate(). It should call the host callback procedure sampleRateHasChanged(), if the switch causes a sample rate change, or if no external clock is present at the selected source. */ ASIOError ASIOGetSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp); /* Purpose: Inquires the sample position/time stamp pair. Parameter: sPos will hold the sample position on return. The sample position is reset to zero when ASIOStart() gets called. tStamp will hold the system time when the sample position was latched. Returns: If no input/output is present, ASE_NotPresent will be returned. If there is no clock, ASE_SPNotAdvancing will be returned. Notes: in order to be able to synchronise properly, the sample position / time stamp pair must refer to the current block, that is, the engine will call ASIOGetSamplePosition() in its bufferSwitch() callback and expect the time for the current block. thus, when requested in the very first bufferSwitch after ASIO_Start(), the sample position should be zero, and the time stamp should refer to the very time where the stream was started. it also means that the sample position must be block aligned. the driver must ensure proper interpolation if the system time can not be determined for the block position. the driver is responsible for precise time stamps as it usually has most direct access to lower level resources. proper behaviour of ASIO_GetSamplePosition() and ASIO_GetLatencies() are essential for precise media synchronization! */ typedef struct ASIOChannelInfo { long channel; // on input, channel index ASIOBool isInput; // on input ASIOBool isActive; // on exit long channelGroup; // dto ASIOSampleType type; // dto char name[32]; // dto } ASIOChannelInfo; ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info); /* Purpose: retreive information about the nature of a channel Parameter: info: pointer to a ASIOChannelInfo structure with - channel: on input, the channel index of the channel in question. - isInput: on input, ASIOTrue if info for an input channel is requested, else output - channelGroup: on return, the channel group that the channel belongs to. For drivers which support different types of channels, like analog, S/PDIF, AES/EBU, ADAT etc interfaces, there should be a reasonable grouping of these types. Groups are always independant form a channel index, that is, a channel index always counts from 0 to numInputs/numOutputs regardless of the group it may belong to. There will always be at least one group (group 0). Please also note that by default, the host may decide to activate channels 0 and 1; thus, these should belong to the most useful type (analog i/o, if present). - type: on return, contains the sample type of the channel - isActive: on return, ASIOTrue if channel is active as it was installed by ASIOCreateBuffers(), ASIOFalse else - name: describing the type of channel in question. Used to allow for user selection, and enabling of specific channels. examples: "Analog In", "SPDIF Out" etc Returns: If no input/output is present ASE_NotPresent will be returned. Notes: If possible, the string should be organised such that the first characters are most significantly describing the nature of the port, to allow for identification even if the view showing the port name is too small to display more than 8 characters, for instance. */ //- - - - - - - - - - - - - - - - - - - - - - - - - // Buffer preparation //- - - - - - - - - - - - - - - - - - - - - - - - - typedef struct ASIOBufferInfo { ASIOBool isInput; // on input: ASIOTrue: input, else output long channelNum; // on input: channel index void *buffers[2]; // on output: double buffer addresses } ASIOBufferInfo; ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); /* Purpose: Allocates input/output buffers for all input and output channels to be activated. Parameter: bufferInfos is a pointer to an array of ASIOBufferInfo structures: - isInput: on input, ASIOTrue if the buffer is to be allocated for an input, output buffer else - channelNum: on input, the index of the channel in question (counting from 0) - buffers: on exit, 2 pointers to the halves of the channels' double-buffer. the size of the buffer(s) of course depend on both the ASIOSampleType as obtained from ASIOGetChannelInfo(), and bufferSize numChannels is the sum of all input and output channels to be created; thus bufferInfos is a pointer to an array of numChannels ASIOBufferInfo structures. bufferSize selects one of the possible buffer sizes as obtained from ASIOGetBufferSizes(). callbacks is a pointer to an ASIOCallbacks structure. Returns: If not enough memory is available ASE_NoMemory will be returned. If no input/output is present ASE_NotPresent will be returned. If bufferSize is not supported, or one or more of the bufferInfos elements contain invalid settings, ASE_InvalidMode will be returned. Notes: If individual channel selection is not possible but requested, the driver has to handle this. namely, bufferSwitch() will only have filled buffers of enabled outputs. If possible, processing and buss activities overhead should be avoided for channels which were not enabled here. */ ASIOError ASIODisposeBuffers(void); /* Purpose: Releases all buffers for the device. Parameter: None. Returns: If no buffer were ever prepared, ASE_InvalidMode will be returned. If no input/output is present ASE_NotPresent will be returned. Notes: This implies ASIOStop(). */ ASIOError ASIOControlPanel(void); /* Purpose: request the driver to start a control panel component for device specific user settings. This will not be accessed on some platforms (where the component is accessed instead). Parameter: None. Returns: If no panel is available ASE_NotPresent will be returned. Actually, the return code is ignored. Notes: if the user applied settings which require a re-configuration of parts or all of the enigine and/or driver (such as a change of the block size), the asioMessage callback can be used (see ASIO_Callbacks). */ ASIOError ASIOFuture(long selector, void *params); /* Purpose: various Parameter: selector: operation Code as to be defined. zero is reserved for testing purposes. params: depends on the selector; usually pointer to a structure for passing and retreiving any type and amount of parameters. Returns: the return value is also selector dependant. if the selector is unknown, ASE_InvalidParameter should be returned to prevent further calls with this selector. on success, ASE_SUCCESS must be returned (note: ASE_OK is *not* sufficient!) Notes: see selectors defined below. */ enum { kAsioEnableTimeCodeRead = 1, // no arguments kAsioDisableTimeCodeRead, // no arguments kAsioSetInputMonitor, // ASIOInputMonitor* in params kAsioTransport, // ASIOTransportParameters* in params kAsioSetInputGain, // ASIOChannelControls* in params, apply gain kAsioGetInputMeter, // ASIOChannelControls* in params, fill meter kAsioSetOutputGain, // ASIOChannelControls* in params, apply gain kAsioGetOutputMeter, // ASIOChannelControls* in params, fill meter kAsioCanInputMonitor, // no arguments for kAsioCanXXX selectors kAsioCanTimeInfo, kAsioCanTimeCode, kAsioCanTransport, kAsioCanInputGain, kAsioCanInputMeter, kAsioCanOutputGain, kAsioCanOutputMeter, // DSD support // The following extensions are required to allow switching // and control of the DSD subsystem. kAsioSetIoFormat = 0x23111961, /* ASIOIoFormat * in params. */ kAsioGetIoFormat = 0x23111983, /* ASIOIoFormat * in params. */ kAsioCanDoIoFormat = 0x23112004, /* ASIOIoFormat * in params. */ }; typedef struct ASIOInputMonitor { long input; // this input was set to monitor (or off), -1: all long output; // suggested output for monitoring the input (if so) long gain; // suggested gain, ranging 0 - 0x7fffffffL (-inf to +12 dB) ASIOBool state; // ASIOTrue => on, ASIOFalse => off long pan; // suggested pan, 0 => all left, 0x7fffffff => right } ASIOInputMonitor; typedef struct ASIOChannelControls { long channel; // on input, channel index ASIOBool isInput; // on input long gain; // on input, ranges 0 thru 0x7fffffff long meter; // on return, ranges 0 thru 0x7fffffff char future[32]; } ASIOChannelControls; typedef struct ASIOTransportParameters { long command; // see enum below ASIOSamples samplePosition; long track; long trackSwitches[16]; // 512 tracks on/off char future[64]; } ASIOTransportParameters; enum { kTransStart = 1, kTransStop, kTransLocate, // to samplePosition kTransPunchIn, kTransPunchOut, kTransArmOn, // track kTransArmOff, // track kTransMonitorOn, // track kTransMonitorOff, // track kTransArm, // trackSwitches kTransMonitor // trackSwitches }; /* // DSD support // Some notes on how to use ASIOIoFormatType. // // The caller will fill the format with the request types. // If the board can do the request then it will leave the // values unchanged. If the board does not support the // request then it will change that entry to Invalid (-1) // // So to request DSD then // // ASIOIoFormat NeedThis={kASIODSDFormat}; // // if(ASE_SUCCESS != ASIOFuture(kAsioSetIoFormat,&NeedThis) ){ // // If the board did not accept one of the parameters then the // // whole call will fail and the failing parameter will // // have had its value changes to -1. // } // // Note: Switching between the formats need to be done before the "prepared" // state (see ASIO 2 documentation) is entered. */ typedef long int ASIOIoFormatType; enum ASIOIoFormatType_e { kASIOFormatInvalid = -1, kASIOPCMFormat = 0, kASIODSDFormat = 1, }; typedef struct ASIOIoFormat_s { ASIOIoFormatType FormatType; char future[512-sizeof(ASIOIoFormatType)]; } ASIOIoFormat; ASIOError ASIOOutputReady(void); /* Purpose: this tells the driver that the host has completed processing the output buffers. if the data format required by the hardware differs from the supported asio formats, but the hardware buffers are DMA buffers, the driver will have to convert the audio stream data; as the bufferSwitch callback is usually issued at dma block switch time, the driver will have to convert the *previous* host buffer, which increases the output latency by one block. when the host finds out that ASIOOutputReady() returns true, it will issue this call whenever it completed output processing. then the driver can convert the host data directly to the dma buffer to be played next, reducing output latency by one block. another way to look at it is, that the buffer switch is called in order to pass the *input* stream to the host, so that it can process the input into the output, and the output stream is passed to the driver when the host has completed its process. Parameter: None Returns: only if the above mentioned scenario is given, and a reduction of output latency can be acheived by this mechanism, should ASE_OK be returned. otherwise (and usually), ASE_NotPresent should be returned in order to prevent further calls to this function. note that the host may want to determine if it is to use this when the system is not yet fully initialized, so ASE_OK should always be returned if the mechanism makes sense. Notes: please remeber to adjust ASIOGetLatencies() according to whether ASIOOutputReady() was ever called or not, if your driver supports this scenario. also note that the engine may fail to call ASIO_OutputReady() in time in overload cases. as already mentioned, bufferSwitch should be called for every block regardless of whether a block could be processed in time. */ // restore old alignment #if defined(_MSC_VER) && !defined(__MWERKS__) #pragma pack(pop) #elif PRAGMA_ALIGN_SUPPORTED #pragma options align = reset #endif #endif stk-4.5.0/src/include/asiodrivers.cpp0000644000076600007660000000654212327014024015412 0ustar gary#include #include "asiodrivers.h" AsioDrivers* asioDrivers = 0; bool loadAsioDriver(char *name); bool loadAsioDriver(char *name) { if(!asioDrivers) asioDrivers = new AsioDrivers(); if(asioDrivers) return asioDrivers->loadDriver(name); return false; } //------------------------------------------------------------------------------------ #if MAC bool resolveASIO(unsigned long aconnID); AsioDrivers::AsioDrivers() : CodeFragments("ASIO Drivers", 'AsDr', 'Asio') { connID = -1; curIndex = -1; } AsioDrivers::~AsioDrivers() { removeCurrentDriver(); } bool AsioDrivers::getCurrentDriverName(char *name) { if(curIndex >= 0) return getName(curIndex, name); return false; } long AsioDrivers::getDriverNames(char **names, long maxDrivers) { for(long i = 0; i < getNumFragments() && i < maxDrivers; i++) getName(i, names[i]); return getNumFragments() < maxDrivers ? getNumFragments() : maxDrivers; } bool AsioDrivers::loadDriver(char *name) { char dname[64]; unsigned long newID; for(long i = 0; i < getNumFragments(); i++) { if(getName(i, dname) && !strcmp(name, dname)) { if(newInstance(i, &newID)) { if(resolveASIO(newID)) { if(connID != -1) removeInstance(curIndex, connID); curIndex = i; connID = newID; return true; } } break; } } return false; } void AsioDrivers::removeCurrentDriver() { if(connID != -1) removeInstance(curIndex, connID); connID = -1; curIndex = -1; } //------------------------------------------------------------------------------------ #elif WINDOWS #include "iasiodrv.h" extern IASIO* theAsioDriver; AsioDrivers::AsioDrivers() : AsioDriverList() { curIndex = -1; } AsioDrivers::~AsioDrivers() { } bool AsioDrivers::getCurrentDriverName(char *name) { if(curIndex >= 0) return asioGetDriverName(curIndex, name, 32) == 0 ? true : false; name[0] = 0; return false; } long AsioDrivers::getDriverNames(char **names, long maxDrivers) { for(long i = 0; i < asioGetNumDev() && i < maxDrivers; i++) asioGetDriverName(i, names[i], 32); return asioGetNumDev() < maxDrivers ? asioGetNumDev() : maxDrivers; } bool AsioDrivers::loadDriver(char *name) { char dname[64]; char curName[64]; for(long i = 0; i < asioGetNumDev(); i++) { if(!asioGetDriverName(i, dname, 32) && !strcmp(name, dname)) { curName[0] = 0; getCurrentDriverName(curName); // in case we fail... removeCurrentDriver(); if(!asioOpenDriver(i, (void **)&theAsioDriver)) { curIndex = i; return true; } else { theAsioDriver = 0; if(curName[0] && strcmp(dname, curName)) loadDriver(curName); // try restore } break; } } return false; } void AsioDrivers::removeCurrentDriver() { if(curIndex != -1) asioCloseDriver(curIndex); curIndex = -1; } #elif SGI || BEOS #include "asiolist.h" AsioDrivers::AsioDrivers() : AsioDriverList() { curIndex = -1; } AsioDrivers::~AsioDrivers() { } bool AsioDrivers::getCurrentDriverName(char *name) { return false; } long AsioDrivers::getDriverNames(char **names, long maxDrivers) { return 0; } bool AsioDrivers::loadDriver(char *name) { return false; } void AsioDrivers::removeCurrentDriver() { } #else #error implement me #endif stk-4.5.0/src/include/asiodrivers.h0000644000076600007660000000131712327014024015052 0ustar gary#ifndef __AsioDrivers__ #define __AsioDrivers__ #include "ginclude.h" #if MAC #include "CodeFragments.hpp" class AsioDrivers : public CodeFragments #elif WINDOWS #include #include "asiolist.h" class AsioDrivers : public AsioDriverList #elif SGI || BEOS #include "asiolist.h" class AsioDrivers : public AsioDriverList #else #error implement me #endif { public: AsioDrivers(); ~AsioDrivers(); bool getCurrentDriverName(char *name); long getDriverNames(char **names, long maxDrivers); bool loadDriver(char *name); void removeCurrentDriver(); long getCurrentDriverIndex() {return curIndex;} protected: unsigned long connID; long curIndex; }; #endif stk-4.5.0/src/include/asiodrvr.h0000644000076600007660000000433212327014024014351 0ustar gary/* Steinberg Audio Stream I/O API (c) 1996, Steinberg Soft- und Hardware GmbH charlie (May 1996) asiodrvr.h c++ superclass to implement asio functionality. from this, you can derive whatever required */ #ifndef _asiodrvr_ #define _asiodrvr_ // cpu and os system we are running on #include "asiosys.h" // basic "C" interface #include "asio.h" class AsioDriver; extern AsioDriver *getDriver(); // for generic constructor #if WINDOWS #include #include "combase.h" #include "iasiodrv.h" class AsioDriver : public IASIO ,public CUnknown { public: AsioDriver(LPUNKNOWN pUnk, HRESULT *phr); DECLARE_IUNKNOWN // Factory method static CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr); // IUnknown virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid,void **ppvObject); #else class AsioDriver { public: AsioDriver(); #endif virtual ~AsioDriver(); virtual ASIOBool init(void* sysRef); virtual void getDriverName(char *name); // max 32 bytes incl. terminating zero virtual long getDriverVersion(); virtual void getErrorMessage(char *string); // max 124 bytes incl. virtual ASIOError start(); virtual ASIOError stop(); virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels); virtual ASIOError getLatencies(long *inputLatency, long *outputLatency); virtual ASIOError getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); virtual ASIOError canSampleRate(ASIOSampleRate sampleRate); virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate); virtual ASIOError setSampleRate(ASIOSampleRate sampleRate); virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources); virtual ASIOError setClockSource(long reference); virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp); virtual ASIOError getChannelInfo(ASIOChannelInfo *info); virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); virtual ASIOError disposeBuffers(); virtual ASIOError controlPanel(); virtual ASIOError future(long selector, void *opt); virtual ASIOError outputReady(); }; #endif stk-4.5.0/src/include/asiolist.cpp0000644000076600007660000001515012327014024014702 0ustar gary#include #include "iasiodrv.h" #include "asiolist.h" #define ASIODRV_DESC "description" #define INPROC_SERVER "InprocServer32" #define ASIO_PATH "software\\asio" #define COM_CLSID "clsid" // ****************************************************************** // Local Functions // ****************************************************************** static LONG findDrvPath (char *clsidstr,char *dllpath,int dllpathsize) { HKEY hkEnum,hksub,hkpath; char databuf[512]; LONG cr,rc = -1; DWORD datatype,datasize; DWORD index; OFSTRUCT ofs; HFILE hfile; BOOL found = FALSE; CharLowerBuff(clsidstr,strlen(clsidstr)); if ((cr = RegOpenKey(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) { index = 0; while (cr == ERROR_SUCCESS && !found) { cr = RegEnumKey(hkEnum,index++,(LPTSTR)databuf,512); if (cr == ERROR_SUCCESS) { CharLowerBuff(databuf,strlen(databuf)); if (!(strcmp(databuf,clsidstr))) { if ((cr = RegOpenKeyEx(hkEnum,(LPCTSTR)databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) { if ((cr = RegOpenKeyEx(hksub,(LPCTSTR)INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) { datatype = REG_SZ; datasize = (DWORD)dllpathsize; cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize); if (cr == ERROR_SUCCESS) { memset(&ofs,0,sizeof(OFSTRUCT)); ofs.cBytes = sizeof(OFSTRUCT); hfile = OpenFile(dllpath,&ofs,OF_EXIST); if (hfile) rc = 0; } RegCloseKey(hkpath); } RegCloseKey(hksub); } found = TRUE; // break out } } } RegCloseKey(hkEnum); } return rc; } static LPASIODRVSTRUCT newDrvStruct (HKEY hkey,char *keyname,int drvID,LPASIODRVSTRUCT lpdrv) { HKEY hksub; char databuf[256]; char dllpath[MAXPATHLEN]; WORD wData[100]; CLSID clsid; DWORD datatype,datasize; LONG cr,rc; if (!lpdrv) { if ((cr = RegOpenKeyEx(hkey,(LPCTSTR)keyname,0,KEY_READ,&hksub)) == ERROR_SUCCESS) { datatype = REG_SZ; datasize = 256; cr = RegQueryValueEx(hksub,COM_CLSID,0,&datatype,(LPBYTE)databuf,&datasize); if (cr == ERROR_SUCCESS) { rc = findDrvPath (databuf,dllpath,MAXPATHLEN); if (rc == 0) { lpdrv = new ASIODRVSTRUCT[1]; if (lpdrv) { memset(lpdrv,0,sizeof(ASIODRVSTRUCT)); lpdrv->drvID = drvID; MultiByteToWideChar(CP_ACP,0,(LPCSTR)databuf,-1,(LPWSTR)wData,100); if ((cr = CLSIDFromString((LPOLESTR)wData,(LPCLSID)&clsid)) == S_OK) { memcpy(&lpdrv->clsid,&clsid,sizeof(CLSID)); } datatype = REG_SZ; datasize = 256; cr = RegQueryValueEx(hksub,ASIODRV_DESC,0,&datatype,(LPBYTE)databuf,&datasize); if (cr == ERROR_SUCCESS) { strcpy(lpdrv->drvname,databuf); } else strcpy(lpdrv->drvname,keyname); } } } RegCloseKey(hksub); } } else lpdrv->next = newDrvStruct(hkey,keyname,drvID+1,lpdrv->next); return lpdrv; } static void deleteDrvStruct (LPASIODRVSTRUCT lpdrv) { IASIO *iasio; if (lpdrv != 0) { deleteDrvStruct(lpdrv->next); if (lpdrv->asiodrv) { iasio = (IASIO *)lpdrv->asiodrv; iasio->Release(); } delete lpdrv; } } static LPASIODRVSTRUCT getDrvStruct (int drvID,LPASIODRVSTRUCT lpdrv) { while (lpdrv) { if (lpdrv->drvID == drvID) return lpdrv; lpdrv = lpdrv->next; } return 0; } // ****************************************************************** // ****************************************************************** // AsioDriverList // ****************************************************************** AsioDriverList::AsioDriverList () { HKEY hkEnum = 0; char keyname[MAXDRVNAMELEN]; LPASIODRVSTRUCT pdl; LONG cr; DWORD index = 0; BOOL fin = FALSE; numdrv = 0; lpdrvlist = 0; cr = RegOpenKey(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum); while (cr == ERROR_SUCCESS) { if ((cr = RegEnumKey(hkEnum,index++,(LPTSTR)keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) { lpdrvlist = newDrvStruct (hkEnum,keyname,0,lpdrvlist); } else fin = TRUE; } if (hkEnum) RegCloseKey(hkEnum); pdl = lpdrvlist; while (pdl) { numdrv++; pdl = pdl->next; } if (numdrv) CoInitialize(0); // initialize COM } AsioDriverList::~AsioDriverList () { if (numdrv) { deleteDrvStruct(lpdrvlist); CoUninitialize(); } } LONG AsioDriverList::asioGetNumDev (VOID) { return (LONG)numdrv; } LONG AsioDriverList::asioOpenDriver (int drvID,LPVOID *asiodrv) { LPASIODRVSTRUCT lpdrv = 0; long rc; if (!asiodrv) return DRVERR_INVALID_PARAM; if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { if (!lpdrv->asiodrv) { rc = CoCreateInstance(lpdrv->clsid,0,CLSCTX_INPROC_SERVER,lpdrv->clsid,asiodrv); if (rc == S_OK) { lpdrv->asiodrv = *asiodrv; return 0; } // else if (rc == REGDB_E_CLASSNOTREG) // strcpy (info->messageText, "Driver not registered in the Registration Database!"); } else rc = DRVERR_DEVICE_ALREADY_OPEN; } else rc = DRVERR_DEVICE_NOT_FOUND; return rc; } LONG AsioDriverList::asioCloseDriver (int drvID) { LPASIODRVSTRUCT lpdrv = 0; IASIO *iasio; if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { if (lpdrv->asiodrv) { iasio = (IASIO *)lpdrv->asiodrv; iasio->Release(); lpdrv->asiodrv = 0; } } return 0; } LONG AsioDriverList::asioGetDriverName (int drvID,char *drvname,int drvnamesize) { LPASIODRVSTRUCT lpdrv = 0; if (!drvname) return DRVERR_INVALID_PARAM; if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { if (strlen(lpdrv->drvname) < (unsigned int)drvnamesize) { strcpy(drvname,lpdrv->drvname); } else { memcpy(drvname,lpdrv->drvname,drvnamesize-4); drvname[drvnamesize-4] = '.'; drvname[drvnamesize-3] = '.'; drvname[drvnamesize-2] = '.'; drvname[drvnamesize-1] = 0; } return 0; } return DRVERR_DEVICE_NOT_FOUND; } LONG AsioDriverList::asioGetDriverPath (int drvID,char *dllpath,int dllpathsize) { LPASIODRVSTRUCT lpdrv = 0; if (!dllpath) return DRVERR_INVALID_PARAM; if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { if (strlen(lpdrv->dllpath) < (unsigned int)dllpathsize) { strcpy(dllpath,lpdrv->dllpath); return 0; } dllpath[0] = 0; return DRVERR_INVALID_PARAM; } return DRVERR_DEVICE_NOT_FOUND; } LONG AsioDriverList::asioGetDriverCLSID (int drvID,CLSID *clsid) { LPASIODRVSTRUCT lpdrv = 0; if (!clsid) return DRVERR_INVALID_PARAM; if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { memcpy(clsid,&lpdrv->clsid,sizeof(CLSID)); return 0; } return DRVERR_DEVICE_NOT_FOUND; } stk-4.5.0/src/include/asiolist.h0000644000076600007660000000174212327014024014351 0ustar gary#ifndef __asiolist__ #define __asiolist__ #define DRVERR -5000 #define DRVERR_INVALID_PARAM DRVERR-1 #define DRVERR_DEVICE_ALREADY_OPEN DRVERR-2 #define DRVERR_DEVICE_NOT_FOUND DRVERR-3 #define MAXPATHLEN 512 #define MAXDRVNAMELEN 128 struct asiodrvstruct { int drvID; CLSID clsid; char dllpath[MAXPATHLEN]; char drvname[MAXDRVNAMELEN]; LPVOID asiodrv; struct asiodrvstruct *next; }; typedef struct asiodrvstruct ASIODRVSTRUCT; typedef ASIODRVSTRUCT *LPASIODRVSTRUCT; class AsioDriverList { public: AsioDriverList(); ~AsioDriverList(); LONG asioOpenDriver (int,VOID **); LONG asioCloseDriver (int); // nice to have LONG asioGetNumDev (VOID); LONG asioGetDriverName (int,char *,int); LONG asioGetDriverPath (int,char *,int); LONG asioGetDriverCLSID (int,CLSID *); // or use directly access LPASIODRVSTRUCT lpdrvlist; int numdrv; }; typedef class AsioDriverList *LPASIODRIVERLIST; #endif stk-4.5.0/src/include/asiosys.h0000644000076600007660000000252012327014024014207 0ustar gary#ifndef __asiosys__ #define __asiosys__ #ifdef WIN32 #undef MAC #define PPC 0 #define WINDOWS 1 #define SGI 0 #define SUN 0 #define LINUX 0 #define BEOS 0 #define NATIVE_INT64 0 #define IEEE754_64FLOAT 1 #elif BEOS #define MAC 0 #define PPC 0 #define WINDOWS 0 #define PC 0 #define SGI 0 #define SUN 0 #define LINUX 0 #define NATIVE_INT64 0 #define IEEE754_64FLOAT 1 #ifndef DEBUG #define DEBUG 0 #if DEBUG void DEBUGGERMESSAGE(char *string); #else #define DEBUGGERMESSAGE(a) #endif #endif #elif SGI #define MAC 0 #define PPC 0 #define WINDOWS 0 #define PC 0 #define SUN 0 #define LINUX 0 #define BEOS 0 #define NATIVE_INT64 0 #define IEEE754_64FLOAT 1 #ifndef DEBUG #define DEBUG 0 #if DEBUG void DEBUGGERMESSAGE(char *string); #else #define DEBUGGERMESSAGE(a) #endif #endif #else // MAC #define MAC 1 #define PPC 1 #define WINDOWS 0 #define PC 0 #define SGI 0 #define SUN 0 #define LINUX 0 #define BEOS 0 #define NATIVE_INT64 0 #define IEEE754_64FLOAT 1 #ifndef DEBUG #define DEBUG 0 #if DEBUG void DEBUGGERMESSAGE(char *string); #else #define DEBUGGERMESSAGE(a) #endif #endif #endif #endif stk-4.5.0/src/include/dsound.h0000644000076600007660000032354312327014024014024 0ustar gary/*==========================================================================; * * Copyright (c) Microsoft Corporation. All rights reserved. * * File: dsound.h * Content: DirectSound include file * **************************************************************************/ #define COM_NO_WINDOWS_H #include #include #ifndef DIRECTSOUND_VERSION #define DIRECTSOUND_VERSION 0x0900 /* Version 9.0 */ #endif #ifdef __cplusplus extern "C" { #endif // __cplusplus #ifndef __DSOUND_INCLUDED__ #define __DSOUND_INCLUDED__ /* Type definitions shared with Direct3D */ #ifndef DX_SHARED_DEFINES typedef float D3DVALUE, *LPD3DVALUE; #ifndef D3DCOLOR_DEFINED typedef DWORD D3DCOLOR; #define D3DCOLOR_DEFINED #endif #ifndef LPD3DCOLOR_DEFINED typedef DWORD *LPD3DCOLOR; #define LPD3DCOLOR_DEFINED #endif #ifndef D3DVECTOR_DEFINED typedef struct _D3DVECTOR { float x; float y; float z; } D3DVECTOR; #define D3DVECTOR_DEFINED #endif #ifndef LPD3DVECTOR_DEFINED typedef D3DVECTOR *LPD3DVECTOR; #define LPD3DVECTOR_DEFINED #endif #define DX_SHARED_DEFINES #endif // DX_SHARED_DEFINES #define _FACDS 0x878 /* DirectSound's facility code */ #define MAKE_DSHRESULT(code) MAKE_HRESULT(1, _FACDS, code) // DirectSound Component GUID {47D4D946-62E8-11CF-93BC-444553540000} DEFINE_GUID(CLSID_DirectSound, 0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); // DirectSound 8.0 Component GUID {3901CC3F-84B5-4FA4-BA35-AA8172B8A09B} DEFINE_GUID(CLSID_DirectSound8, 0x3901cc3f, 0x84b5, 0x4fa4, 0xba, 0x35, 0xaa, 0x81, 0x72, 0xb8, 0xa0, 0x9b); // DirectSound Capture Component GUID {B0210780-89CD-11D0-AF08-00A0C925CD16} DEFINE_GUID(CLSID_DirectSoundCapture, 0xb0210780, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); // DirectSound 8.0 Capture Component GUID {E4BCAC13-7F99-4908-9A8E-74E3BF24B6E1} DEFINE_GUID(CLSID_DirectSoundCapture8, 0xe4bcac13, 0x7f99, 0x4908, 0x9a, 0x8e, 0x74, 0xe3, 0xbf, 0x24, 0xb6, 0xe1); // DirectSound Full Duplex Component GUID {FEA4300C-7959-4147-B26A-2377B9E7A91D} DEFINE_GUID(CLSID_DirectSoundFullDuplex, 0xfea4300c, 0x7959, 0x4147, 0xb2, 0x6a, 0x23, 0x77, 0xb9, 0xe7, 0xa9, 0x1d); // DirectSound default playback device GUID {DEF00000-9C6D-47ED-AAF1-4DDA8F2B5C03} DEFINE_GUID(DSDEVID_DefaultPlayback, 0xdef00000, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); // DirectSound default capture device GUID {DEF00001-9C6D-47ED-AAF1-4DDA8F2B5C03} DEFINE_GUID(DSDEVID_DefaultCapture, 0xdef00001, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); // DirectSound default device for voice playback {DEF00002-9C6D-47ED-AAF1-4DDA8F2B5C03} DEFINE_GUID(DSDEVID_DefaultVoicePlayback, 0xdef00002, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); // DirectSound default device for voice capture {DEF00003-9C6D-47ED-AAF1-4DDA8F2B5C03} DEFINE_GUID(DSDEVID_DefaultVoiceCapture, 0xdef00003, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); // // Forward declarations for interfaces. // 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined // #ifdef __cplusplus struct IDirectSound; struct IDirectSoundBuffer; struct IDirectSound3DListener; struct IDirectSound3DBuffer; struct IDirectSoundCapture; struct IDirectSoundCaptureBuffer; struct IDirectSoundNotify; #endif // __cplusplus // // DirectSound 8.0 interfaces. // #if DIRECTSOUND_VERSION >= 0x0800 #ifdef __cplusplus struct IDirectSound8; struct IDirectSoundBuffer8; struct IDirectSoundCaptureBuffer8; struct IDirectSoundFXGargle; struct IDirectSoundFXChorus; struct IDirectSoundFXFlanger; struct IDirectSoundFXEcho; struct IDirectSoundFXDistortion; struct IDirectSoundFXCompressor; struct IDirectSoundFXParamEq; struct IDirectSoundFXWavesReverb; struct IDirectSoundFXI3DL2Reverb; struct IDirectSoundCaptureFXAec; struct IDirectSoundCaptureFXNoiseSuppress; struct IDirectSoundFullDuplex; #endif // __cplusplus // IDirectSound8, IDirectSoundBuffer8 and IDirectSoundCaptureBuffer8 are the // only DirectSound 7.0 interfaces with changed functionality in version 8.0. // The other level 8 interfaces as equivalent to their level 7 counterparts: #define IDirectSoundCapture8 IDirectSoundCapture #define IDirectSound3DListener8 IDirectSound3DListener #define IDirectSound3DBuffer8 IDirectSound3DBuffer #define IDirectSoundNotify8 IDirectSoundNotify #define IDirectSoundFXGargle8 IDirectSoundFXGargle #define IDirectSoundFXChorus8 IDirectSoundFXChorus #define IDirectSoundFXFlanger8 IDirectSoundFXFlanger #define IDirectSoundFXEcho8 IDirectSoundFXEcho #define IDirectSoundFXDistortion8 IDirectSoundFXDistortion #define IDirectSoundFXCompressor8 IDirectSoundFXCompressor #define IDirectSoundFXParamEq8 IDirectSoundFXParamEq #define IDirectSoundFXWavesReverb8 IDirectSoundFXWavesReverb #define IDirectSoundFXI3DL2Reverb8 IDirectSoundFXI3DL2Reverb #define IDirectSoundCaptureFXAec8 IDirectSoundCaptureFXAec #define IDirectSoundCaptureFXNoiseSuppress8 IDirectSoundCaptureFXNoiseSuppress #define IDirectSoundFullDuplex8 IDirectSoundFullDuplex #endif // DIRECTSOUND_VERSION >= 0x0800 typedef struct IDirectSound *LPDIRECTSOUND; typedef struct IDirectSoundBuffer *LPDIRECTSOUNDBUFFER; typedef struct IDirectSound3DListener *LPDIRECTSOUND3DLISTENER; typedef struct IDirectSound3DBuffer *LPDIRECTSOUND3DBUFFER; typedef struct IDirectSoundCapture *LPDIRECTSOUNDCAPTURE; typedef struct IDirectSoundCaptureBuffer *LPDIRECTSOUNDCAPTUREBUFFER; typedef struct IDirectSoundNotify *LPDIRECTSOUNDNOTIFY; #if DIRECTSOUND_VERSION >= 0x0800 typedef struct IDirectSoundFXGargle *LPDIRECTSOUNDFXGARGLE; typedef struct IDirectSoundFXChorus *LPDIRECTSOUNDFXCHORUS; typedef struct IDirectSoundFXFlanger *LPDIRECTSOUNDFXFLANGER; typedef struct IDirectSoundFXEcho *LPDIRECTSOUNDFXECHO; typedef struct IDirectSoundFXDistortion *LPDIRECTSOUNDFXDISTORTION; typedef struct IDirectSoundFXCompressor *LPDIRECTSOUNDFXCOMPRESSOR; typedef struct IDirectSoundFXParamEq *LPDIRECTSOUNDFXPARAMEQ; typedef struct IDirectSoundFXWavesReverb *LPDIRECTSOUNDFXWAVESREVERB; typedef struct IDirectSoundFXI3DL2Reverb *LPDIRECTSOUNDFXI3DL2REVERB; typedef struct IDirectSoundCaptureFXAec *LPDIRECTSOUNDCAPTUREFXAEC; typedef struct IDirectSoundCaptureFXNoiseSuppress *LPDIRECTSOUNDCAPTUREFXNOISESUPPRESS; typedef struct IDirectSoundFullDuplex *LPDIRECTSOUNDFULLDUPLEX; typedef struct IDirectSound8 *LPDIRECTSOUND8; typedef struct IDirectSoundBuffer8 *LPDIRECTSOUNDBUFFER8; typedef struct IDirectSound3DListener8 *LPDIRECTSOUND3DLISTENER8; typedef struct IDirectSound3DBuffer8 *LPDIRECTSOUND3DBUFFER8; typedef struct IDirectSoundCapture8 *LPDIRECTSOUNDCAPTURE8; typedef struct IDirectSoundCaptureBuffer8 *LPDIRECTSOUNDCAPTUREBUFFER8; typedef struct IDirectSoundNotify8 *LPDIRECTSOUNDNOTIFY8; typedef struct IDirectSoundFXGargle8 *LPDIRECTSOUNDFXGARGLE8; typedef struct IDirectSoundFXChorus8 *LPDIRECTSOUNDFXCHORUS8; typedef struct IDirectSoundFXFlanger8 *LPDIRECTSOUNDFXFLANGER8; typedef struct IDirectSoundFXEcho8 *LPDIRECTSOUNDFXECHO8; typedef struct IDirectSoundFXDistortion8 *LPDIRECTSOUNDFXDISTORTION8; typedef struct IDirectSoundFXCompressor8 *LPDIRECTSOUNDFXCOMPRESSOR8; typedef struct IDirectSoundFXParamEq8 *LPDIRECTSOUNDFXPARAMEQ8; typedef struct IDirectSoundFXWavesReverb8 *LPDIRECTSOUNDFXWAVESREVERB8; typedef struct IDirectSoundFXI3DL2Reverb8 *LPDIRECTSOUNDFXI3DL2REVERB8; typedef struct IDirectSoundCaptureFXAec8 *LPDIRECTSOUNDCAPTUREFXAEC8; typedef struct IDirectSoundCaptureFXNoiseSuppress8 *LPDIRECTSOUNDCAPTUREFXNOISESUPPRESS8; typedef struct IDirectSoundFullDuplex8 *LPDIRECTSOUNDFULLDUPLEX8; #endif // DIRECTSOUND_VERSION >= 0x0800 // // IID definitions for the unchanged DirectSound 8.0 interfaces // #if DIRECTSOUND_VERSION >= 0x0800 #define IID_IDirectSoundCapture8 IID_IDirectSoundCapture #define IID_IDirectSound3DListener8 IID_IDirectSound3DListener #define IID_IDirectSound3DBuffer8 IID_IDirectSound3DBuffer #define IID_IDirectSoundNotify8 IID_IDirectSoundNotify #define IID_IDirectSoundFXGargle8 IID_IDirectSoundFXGargle #define IID_IDirectSoundFXChorus8 IID_IDirectSoundFXChorus #define IID_IDirectSoundFXFlanger8 IID_IDirectSoundFXFlanger #define IID_IDirectSoundFXEcho8 IID_IDirectSoundFXEcho #define IID_IDirectSoundFXDistortion8 IID_IDirectSoundFXDistortion #define IID_IDirectSoundFXCompressor8 IID_IDirectSoundFXCompressor #define IID_IDirectSoundFXParamEq8 IID_IDirectSoundFXParamEq #define IID_IDirectSoundFXWavesReverb8 IID_IDirectSoundFXWavesReverb #define IID_IDirectSoundFXI3DL2Reverb8 IID_IDirectSoundFXI3DL2Reverb #define IID_IDirectSoundCaptureFXAec8 IID_IDirectSoundCaptureFXAec #define IID_IDirectSoundCaptureFXNoiseSuppress8 IID_IDirectSoundCaptureFXNoiseSuppress #define IID_IDirectSoundFullDuplex8 IID_IDirectSoundFullDuplex #endif // DIRECTSOUND_VERSION >= 0x0800 // // Compatibility typedefs // #ifndef _LPCWAVEFORMATEX_DEFINED #define _LPCWAVEFORMATEX_DEFINED typedef const WAVEFORMATEX *LPCWAVEFORMATEX; #endif // _LPCWAVEFORMATEX_DEFINED #ifndef __LPCGUID_DEFINED__ #define __LPCGUID_DEFINED__ typedef const GUID *LPCGUID; #endif // __LPCGUID_DEFINED__ typedef LPDIRECTSOUND *LPLPDIRECTSOUND; typedef LPDIRECTSOUNDBUFFER *LPLPDIRECTSOUNDBUFFER; typedef LPDIRECTSOUND3DLISTENER *LPLPDIRECTSOUND3DLISTENER; typedef LPDIRECTSOUND3DBUFFER *LPLPDIRECTSOUND3DBUFFER; typedef LPDIRECTSOUNDCAPTURE *LPLPDIRECTSOUNDCAPTURE; typedef LPDIRECTSOUNDCAPTUREBUFFER *LPLPDIRECTSOUNDCAPTUREBUFFER; typedef LPDIRECTSOUNDNOTIFY *LPLPDIRECTSOUNDNOTIFY; #if DIRECTSOUND_VERSION >= 0x0800 typedef LPDIRECTSOUND8 *LPLPDIRECTSOUND8; typedef LPDIRECTSOUNDBUFFER8 *LPLPDIRECTSOUNDBUFFER8; typedef LPDIRECTSOUNDCAPTURE8 *LPLPDIRECTSOUNDCAPTURE8; typedef LPDIRECTSOUNDCAPTUREBUFFER8 *LPLPDIRECTSOUNDCAPTUREBUFFER8; #endif // DIRECTSOUND_VERSION >= 0x0800 // // Structures // typedef struct _DSCAPS { DWORD dwSize; DWORD dwFlags; DWORD dwMinSecondarySampleRate; DWORD dwMaxSecondarySampleRate; DWORD dwPrimaryBuffers; DWORD dwMaxHwMixingAllBuffers; DWORD dwMaxHwMixingStaticBuffers; DWORD dwMaxHwMixingStreamingBuffers; DWORD dwFreeHwMixingAllBuffers; DWORD dwFreeHwMixingStaticBuffers; DWORD dwFreeHwMixingStreamingBuffers; DWORD dwMaxHw3DAllBuffers; DWORD dwMaxHw3DStaticBuffers; DWORD dwMaxHw3DStreamingBuffers; DWORD dwFreeHw3DAllBuffers; DWORD dwFreeHw3DStaticBuffers; DWORD dwFreeHw3DStreamingBuffers; DWORD dwTotalHwMemBytes; DWORD dwFreeHwMemBytes; DWORD dwMaxContigFreeHwMemBytes; DWORD dwUnlockTransferRateHwBuffers; DWORD dwPlayCpuOverheadSwBuffers; DWORD dwReserved1; DWORD dwReserved2; } DSCAPS, *LPDSCAPS; typedef const DSCAPS *LPCDSCAPS; typedef struct _DSBCAPS { DWORD dwSize; DWORD dwFlags; DWORD dwBufferBytes; DWORD dwUnlockTransferRate; DWORD dwPlayCpuOverhead; } DSBCAPS, *LPDSBCAPS; typedef const DSBCAPS *LPCDSBCAPS; #if DIRECTSOUND_VERSION >= 0x0800 typedef struct _DSEFFECTDESC { DWORD dwSize; DWORD dwFlags; GUID guidDSFXClass; DWORD_PTR dwReserved1; DWORD_PTR dwReserved2; } DSEFFECTDESC, *LPDSEFFECTDESC; typedef const DSEFFECTDESC *LPCDSEFFECTDESC; #define DSFX_LOCHARDWARE 0x00000001 #define DSFX_LOCSOFTWARE 0x00000002 enum { DSFXR_PRESENT, // 0 DSFXR_LOCHARDWARE, // 1 DSFXR_LOCSOFTWARE, // 2 DSFXR_UNALLOCATED, // 3 DSFXR_FAILED, // 4 DSFXR_UNKNOWN, // 5 DSFXR_SENDLOOP // 6 }; typedef struct _DSCEFFECTDESC { DWORD dwSize; DWORD dwFlags; GUID guidDSCFXClass; GUID guidDSCFXInstance; DWORD dwReserved1; DWORD dwReserved2; } DSCEFFECTDESC, *LPDSCEFFECTDESC; typedef const DSCEFFECTDESC *LPCDSCEFFECTDESC; #define DSCFX_LOCHARDWARE 0x00000001 #define DSCFX_LOCSOFTWARE 0x00000002 #define DSCFXR_LOCHARDWARE 0x00000010 #define DSCFXR_LOCSOFTWARE 0x00000020 #endif // DIRECTSOUND_VERSION >= 0x0800 typedef struct _DSBUFFERDESC { DWORD dwSize; DWORD dwFlags; DWORD dwBufferBytes; DWORD dwReserved; LPWAVEFORMATEX lpwfxFormat; #if DIRECTSOUND_VERSION >= 0x0700 GUID guid3DAlgorithm; #endif } DSBUFFERDESC, *LPDSBUFFERDESC; typedef const DSBUFFERDESC *LPCDSBUFFERDESC; // Older version of this structure: typedef struct _DSBUFFERDESC1 { DWORD dwSize; DWORD dwFlags; DWORD dwBufferBytes; DWORD dwReserved; LPWAVEFORMATEX lpwfxFormat; } DSBUFFERDESC1, *LPDSBUFFERDESC1; typedef const DSBUFFERDESC1 *LPCDSBUFFERDESC1; typedef struct _DS3DBUFFER { DWORD dwSize; D3DVECTOR vPosition; D3DVECTOR vVelocity; DWORD dwInsideConeAngle; DWORD dwOutsideConeAngle; D3DVECTOR vConeOrientation; LONG lConeOutsideVolume; D3DVALUE flMinDistance; D3DVALUE flMaxDistance; DWORD dwMode; } DS3DBUFFER, *LPDS3DBUFFER; typedef const DS3DBUFFER *LPCDS3DBUFFER; typedef struct _DS3DLISTENER { DWORD dwSize; D3DVECTOR vPosition; D3DVECTOR vVelocity; D3DVECTOR vOrientFront; D3DVECTOR vOrientTop; D3DVALUE flDistanceFactor; D3DVALUE flRolloffFactor; D3DVALUE flDopplerFactor; } DS3DLISTENER, *LPDS3DLISTENER; typedef const DS3DLISTENER *LPCDS3DLISTENER; typedef struct _DSCCAPS { DWORD dwSize; DWORD dwFlags; DWORD dwFormats; DWORD dwChannels; } DSCCAPS, *LPDSCCAPS; typedef const DSCCAPS *LPCDSCCAPS; typedef struct _DSCBUFFERDESC1 { DWORD dwSize; DWORD dwFlags; DWORD dwBufferBytes; DWORD dwReserved; LPWAVEFORMATEX lpwfxFormat; } DSCBUFFERDESC1, *LPDSCBUFFERDESC1; typedef struct _DSCBUFFERDESC { DWORD dwSize; DWORD dwFlags; DWORD dwBufferBytes; DWORD dwReserved; LPWAVEFORMATEX lpwfxFormat; #if DIRECTSOUND_VERSION >= 0x0800 DWORD dwFXCount; LPDSCEFFECTDESC lpDSCFXDesc; #endif } DSCBUFFERDESC, *LPDSCBUFFERDESC; typedef const DSCBUFFERDESC *LPCDSCBUFFERDESC; typedef struct _DSCBCAPS { DWORD dwSize; DWORD dwFlags; DWORD dwBufferBytes; DWORD dwReserved; } DSCBCAPS, *LPDSCBCAPS; typedef const DSCBCAPS *LPCDSCBCAPS; typedef struct _DSBPOSITIONNOTIFY { DWORD dwOffset; HANDLE hEventNotify; } DSBPOSITIONNOTIFY, *LPDSBPOSITIONNOTIFY; typedef const DSBPOSITIONNOTIFY *LPCDSBPOSITIONNOTIFY; // // DirectSound API // typedef BOOL (CALLBACK *LPDSENUMCALLBACKA)(LPGUID, LPCSTR, LPCSTR, LPVOID); typedef BOOL (CALLBACK *LPDSENUMCALLBACKW)(LPGUID, LPCWSTR, LPCWSTR, LPVOID); extern HRESULT WINAPI DirectSoundCreate(LPCGUID pcGuidDevice, LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter); extern HRESULT WINAPI DirectSoundEnumerateA(LPDSENUMCALLBACKA pDSEnumCallback, LPVOID pContext); extern HRESULT WINAPI DirectSoundEnumerateW(LPDSENUMCALLBACKW pDSEnumCallback, LPVOID pContext); extern HRESULT WINAPI DirectSoundCaptureCreate(LPCGUID pcGuidDevice, LPDIRECTSOUNDCAPTURE *ppDSC, LPUNKNOWN pUnkOuter); extern HRESULT WINAPI DirectSoundCaptureEnumerateA(LPDSENUMCALLBACKA pDSEnumCallback, LPVOID pContext); extern HRESULT WINAPI DirectSoundCaptureEnumerateW(LPDSENUMCALLBACKW pDSEnumCallback, LPVOID pContext); #if DIRECTSOUND_VERSION >= 0x0800 extern HRESULT WINAPI DirectSoundCreate8(LPCGUID pcGuidDevice, LPDIRECTSOUND8 *ppDS8, LPUNKNOWN pUnkOuter); extern HRESULT WINAPI DirectSoundCaptureCreate8(LPCGUID pcGuidDevice, LPDIRECTSOUNDCAPTURE8 *ppDSC8, LPUNKNOWN pUnkOuter); extern HRESULT WINAPI DirectSoundFullDuplexCreate(LPCGUID pcGuidCaptureDevice, LPCGUID pcGuidRenderDevice, LPCDSCBUFFERDESC pcDSCBufferDesc, LPCDSBUFFERDESC pcDSBufferDesc, HWND hWnd, DWORD dwLevel, LPDIRECTSOUNDFULLDUPLEX* ppDSFD, LPDIRECTSOUNDCAPTUREBUFFER8 *ppDSCBuffer8, LPDIRECTSOUNDBUFFER8 *ppDSBuffer8, LPUNKNOWN pUnkOuter); #define DirectSoundFullDuplexCreate8 DirectSoundFullDuplexCreate extern HRESULT WINAPI GetDeviceID(LPCGUID pGuidSrc, LPGUID pGuidDest); #endif // DIRECTSOUND_VERSION >= 0x0800 #ifdef UNICODE #define LPDSENUMCALLBACK LPDSENUMCALLBACKW #define DirectSoundEnumerate DirectSoundEnumerateW #define DirectSoundCaptureEnumerate DirectSoundCaptureEnumerateW #else // UNICODE #define LPDSENUMCALLBACK LPDSENUMCALLBACKA #define DirectSoundEnumerate DirectSoundEnumerateA #define DirectSoundCaptureEnumerate DirectSoundCaptureEnumerateA #endif // UNICODE // // IUnknown // #if !defined(__cplusplus) || defined(CINTERFACE) #ifndef IUnknown_QueryInterface #define IUnknown_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #endif // IUnknown_QueryInterface #ifndef IUnknown_AddRef #define IUnknown_AddRef(p) (p)->lpVtbl->AddRef(p) #endif // IUnknown_AddRef #ifndef IUnknown_Release #define IUnknown_Release(p) (p)->lpVtbl->Release(p) #endif // IUnknown_Release #else // !defined(__cplusplus) || defined(CINTERFACE) #ifndef IUnknown_QueryInterface #define IUnknown_QueryInterface(p,a,b) (p)->QueryInterface(a,b) #endif // IUnknown_QueryInterface #ifndef IUnknown_AddRef #define IUnknown_AddRef(p) (p)->AddRef() #endif // IUnknown_AddRef #ifndef IUnknown_Release #define IUnknown_Release(p) (p)->Release() #endif // IUnknown_Release #endif // !defined(__cplusplus) || defined(CINTERFACE) #ifndef __IReferenceClock_INTERFACE_DEFINED__ #define __IReferenceClock_INTERFACE_DEFINED__ typedef LONGLONG REFERENCE_TIME; typedef REFERENCE_TIME *LPREFERENCE_TIME; DEFINE_GUID(IID_IReferenceClock, 0x56a86897, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); #undef INTERFACE #define INTERFACE IReferenceClock DECLARE_INTERFACE_(IReferenceClock, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IReferenceClock methods STDMETHOD(GetTime) (THIS_ REFERENCE_TIME *pTime) PURE; STDMETHOD(AdviseTime) (THIS_ REFERENCE_TIME rtBaseTime, REFERENCE_TIME rtStreamTime, HANDLE hEvent, LPDWORD pdwAdviseCookie) PURE; STDMETHOD(AdvisePeriodic) (THIS_ REFERENCE_TIME rtStartTime, REFERENCE_TIME rtPeriodTime, HANDLE hSemaphore, LPDWORD pdwAdviseCookie) PURE; STDMETHOD(Unadvise) (THIS_ DWORD dwAdviseCookie) PURE; }; #endif // __IReferenceClock_INTERFACE_DEFINED__ #ifndef IReferenceClock_QueryInterface #define IReferenceClock_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IReferenceClock_AddRef(p) IUnknown_AddRef(p) #define IReferenceClock_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IReferenceClock_GetTime(p,a) (p)->lpVtbl->GetTime(p,a) #define IReferenceClock_AdviseTime(p,a,b,c,d) (p)->lpVtbl->AdviseTime(p,a,b,c,d) #define IReferenceClock_AdvisePeriodic(p,a,b,c,d) (p)->lpVtbl->AdvisePeriodic(p,a,b,c,d) #define IReferenceClock_Unadvise(p,a) (p)->lpVtbl->Unadvise(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IReferenceClock_GetTime(p,a) (p)->GetTime(a) #define IReferenceClock_AdviseTime(p,a,b,c,d) (p)->AdviseTime(a,b,c,d) #define IReferenceClock_AdvisePeriodic(p,a,b,c,d) (p)->AdvisePeriodic(a,b,c,d) #define IReferenceClock_Unadvise(p,a) (p)->Unadvise(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) #endif // IReferenceClock_QueryInterface // // IDirectSound // DEFINE_GUID(IID_IDirectSound, 0x279AFA83, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); #undef INTERFACE #define INTERFACE IDirectSound DECLARE_INTERFACE_(IDirectSound, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSound methods STDMETHOD(CreateSoundBuffer) (THIS_ LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOuter) PURE; STDMETHOD(GetCaps) (THIS_ LPDSCAPS pDSCaps) PURE; STDMETHOD(DuplicateSoundBuffer) (THIS_ LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate) PURE; STDMETHOD(SetCooperativeLevel) (THIS_ HWND hwnd, DWORD dwLevel) PURE; STDMETHOD(Compact) (THIS) PURE; STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD pdwSpeakerConfig) PURE; STDMETHOD(SetSpeakerConfig) (THIS_ DWORD dwSpeakerConfig) PURE; STDMETHOD(Initialize) (THIS_ LPCGUID pcGuidDevice) PURE; }; #define IDirectSound_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSound_AddRef(p) IUnknown_AddRef(p) #define IDirectSound_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSound_CreateSoundBuffer(p,a,b,c) (p)->lpVtbl->CreateSoundBuffer(p,a,b,c) #define IDirectSound_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) #define IDirectSound_DuplicateSoundBuffer(p,a,b) (p)->lpVtbl->DuplicateSoundBuffer(p,a,b) #define IDirectSound_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) #define IDirectSound_Compact(p) (p)->lpVtbl->Compact(p) #define IDirectSound_GetSpeakerConfig(p,a) (p)->lpVtbl->GetSpeakerConfig(p,a) #define IDirectSound_SetSpeakerConfig(p,b) (p)->lpVtbl->SetSpeakerConfig(p,b) #define IDirectSound_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSound_CreateSoundBuffer(p,a,b,c) (p)->CreateSoundBuffer(a,b,c) #define IDirectSound_GetCaps(p,a) (p)->GetCaps(a) #define IDirectSound_DuplicateSoundBuffer(p,a,b) (p)->DuplicateSoundBuffer(a,b) #define IDirectSound_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) #define IDirectSound_Compact(p) (p)->Compact() #define IDirectSound_GetSpeakerConfig(p,a) (p)->GetSpeakerConfig(a) #define IDirectSound_SetSpeakerConfig(p,b) (p)->SetSpeakerConfig(b) #define IDirectSound_Initialize(p,a) (p)->Initialize(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) #if DIRECTSOUND_VERSION >= 0x0800 // // IDirectSound8 // DEFINE_GUID(IID_IDirectSound8, 0xC50A7E93, 0xF395, 0x4834, 0x9E, 0xF6, 0x7F, 0xA9, 0x9D, 0xE5, 0x09, 0x66); #undef INTERFACE #define INTERFACE IDirectSound8 DECLARE_INTERFACE_(IDirectSound8, IDirectSound) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSound methods STDMETHOD(CreateSoundBuffer) (THIS_ LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOuter) PURE; STDMETHOD(GetCaps) (THIS_ LPDSCAPS pDSCaps) PURE; STDMETHOD(DuplicateSoundBuffer) (THIS_ LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate) PURE; STDMETHOD(SetCooperativeLevel) (THIS_ HWND hwnd, DWORD dwLevel) PURE; STDMETHOD(Compact) (THIS) PURE; STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD pdwSpeakerConfig) PURE; STDMETHOD(SetSpeakerConfig) (THIS_ DWORD dwSpeakerConfig) PURE; STDMETHOD(Initialize) (THIS_ LPCGUID pcGuidDevice) PURE; // IDirectSound8 methods STDMETHOD(VerifyCertification) (THIS_ LPDWORD pdwCertified) PURE; }; #define IDirectSound8_QueryInterface(p,a,b) IDirectSound_QueryInterface(p,a,b) #define IDirectSound8_AddRef(p) IDirectSound_AddRef(p) #define IDirectSound8_Release(p) IDirectSound_Release(p) #define IDirectSound8_CreateSoundBuffer(p,a,b,c) IDirectSound_CreateSoundBuffer(p,a,b,c) #define IDirectSound8_GetCaps(p,a) IDirectSound_GetCaps(p,a) #define IDirectSound8_DuplicateSoundBuffer(p,a,b) IDirectSound_DuplicateSoundBuffer(p,a,b) #define IDirectSound8_SetCooperativeLevel(p,a,b) IDirectSound_SetCooperativeLevel(p,a,b) #define IDirectSound8_Compact(p) IDirectSound_Compact(p) #define IDirectSound8_GetSpeakerConfig(p,a) IDirectSound_GetSpeakerConfig(p,a) #define IDirectSound8_SetSpeakerConfig(p,a) IDirectSound_SetSpeakerConfig(p,a) #define IDirectSound8_Initialize(p,a) IDirectSound_Initialize(p,a) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSound8_VerifyCertification(p,a) (p)->lpVtbl->VerifyCertification(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSound8_VerifyCertification(p,a) (p)->VerifyCertification(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) #endif // DIRECTSOUND_VERSION >= 0x0800 // // IDirectSoundBuffer // DEFINE_GUID(IID_IDirectSoundBuffer, 0x279AFA85, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); #undef INTERFACE #define INTERFACE IDirectSoundBuffer DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundBuffer methods STDMETHOD(GetCaps) (THIS_ LPDSBCAPS pDSBufferCaps) PURE; STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor) PURE; STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; STDMETHOD(GetVolume) (THIS_ LPLONG plVolume) PURE; STDMETHOD(GetPan) (THIS_ LPLONG plPan) PURE; STDMETHOD(GetFrequency) (THIS_ LPDWORD pdwFrequency) PURE; STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; STDMETHOD(Initialize) (THIS_ LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc) PURE; STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; STDMETHOD(Play) (THIS_ DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) PURE; STDMETHOD(SetCurrentPosition) (THIS_ DWORD dwNewPosition) PURE; STDMETHOD(SetFormat) (THIS_ LPCWAVEFORMATEX pcfxFormat) PURE; STDMETHOD(SetVolume) (THIS_ LONG lVolume) PURE; STDMETHOD(SetPan) (THIS_ LONG lPan) PURE; STDMETHOD(SetFrequency) (THIS_ DWORD dwFrequency) PURE; STDMETHOD(Stop) (THIS) PURE; STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; STDMETHOD(Restore) (THIS) PURE; }; #define IDirectSoundBuffer_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundBuffer_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundBuffer_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundBuffer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) #define IDirectSoundBuffer_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b) #define IDirectSoundBuffer_GetFormat(p,a,b,c) (p)->lpVtbl->GetFormat(p,a,b,c) #define IDirectSoundBuffer_GetVolume(p,a) (p)->lpVtbl->GetVolume(p,a) #define IDirectSoundBuffer_GetPan(p,a) (p)->lpVtbl->GetPan(p,a) #define IDirectSoundBuffer_GetFrequency(p,a) (p)->lpVtbl->GetFrequency(p,a) #define IDirectSoundBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a) #define IDirectSoundBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) #define IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g) #define IDirectSoundBuffer_Play(p,a,b,c) (p)->lpVtbl->Play(p,a,b,c) #define IDirectSoundBuffer_SetCurrentPosition(p,a) (p)->lpVtbl->SetCurrentPosition(p,a) #define IDirectSoundBuffer_SetFormat(p,a) (p)->lpVtbl->SetFormat(p,a) #define IDirectSoundBuffer_SetVolume(p,a) (p)->lpVtbl->SetVolume(p,a) #define IDirectSoundBuffer_SetPan(p,a) (p)->lpVtbl->SetPan(p,a) #define IDirectSoundBuffer_SetFrequency(p,a) (p)->lpVtbl->SetFrequency(p,a) #define IDirectSoundBuffer_Stop(p) (p)->lpVtbl->Stop(p) #define IDirectSoundBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d) #define IDirectSoundBuffer_Restore(p) (p)->lpVtbl->Restore(p) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundBuffer_GetCaps(p,a) (p)->GetCaps(a) #define IDirectSoundBuffer_GetCurrentPosition(p,a,b) (p)->GetCurrentPosition(a,b) #define IDirectSoundBuffer_GetFormat(p,a,b,c) (p)->GetFormat(a,b,c) #define IDirectSoundBuffer_GetVolume(p,a) (p)->GetVolume(a) #define IDirectSoundBuffer_GetPan(p,a) (p)->GetPan(a) #define IDirectSoundBuffer_GetFrequency(p,a) (p)->GetFrequency(a) #define IDirectSoundBuffer_GetStatus(p,a) (p)->GetStatus(a) #define IDirectSoundBuffer_Initialize(p,a,b) (p)->Initialize(a,b) #define IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) (p)->Lock(a,b,c,d,e,f,g) #define IDirectSoundBuffer_Play(p,a,b,c) (p)->Play(a,b,c) #define IDirectSoundBuffer_SetCurrentPosition(p,a) (p)->SetCurrentPosition(a) #define IDirectSoundBuffer_SetFormat(p,a) (p)->SetFormat(a) #define IDirectSoundBuffer_SetVolume(p,a) (p)->SetVolume(a) #define IDirectSoundBuffer_SetPan(p,a) (p)->SetPan(a) #define IDirectSoundBuffer_SetFrequency(p,a) (p)->SetFrequency(a) #define IDirectSoundBuffer_Stop(p) (p)->Stop() #define IDirectSoundBuffer_Unlock(p,a,b,c,d) (p)->Unlock(a,b,c,d) #define IDirectSoundBuffer_Restore(p) (p)->Restore() #endif // !defined(__cplusplus) || defined(CINTERFACE) #if DIRECTSOUND_VERSION >= 0x0800 // // IDirectSoundBuffer8 // DEFINE_GUID(IID_IDirectSoundBuffer8, 0x6825a449, 0x7524, 0x4d82, 0x92, 0x0f, 0x50, 0xe3, 0x6a, 0xb3, 0xab, 0x1e); #undef INTERFACE #define INTERFACE IDirectSoundBuffer8 DECLARE_INTERFACE_(IDirectSoundBuffer8, IDirectSoundBuffer) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundBuffer methods STDMETHOD(GetCaps) (THIS_ LPDSBCAPS pDSBufferCaps) PURE; STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor) PURE; STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; STDMETHOD(GetVolume) (THIS_ LPLONG plVolume) PURE; STDMETHOD(GetPan) (THIS_ LPLONG plPan) PURE; STDMETHOD(GetFrequency) (THIS_ LPDWORD pdwFrequency) PURE; STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; STDMETHOD(Initialize) (THIS_ LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc) PURE; STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; STDMETHOD(Play) (THIS_ DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) PURE; STDMETHOD(SetCurrentPosition) (THIS_ DWORD dwNewPosition) PURE; STDMETHOD(SetFormat) (THIS_ LPCWAVEFORMATEX pcfxFormat) PURE; STDMETHOD(SetVolume) (THIS_ LONG lVolume) PURE; STDMETHOD(SetPan) (THIS_ LONG lPan) PURE; STDMETHOD(SetFrequency) (THIS_ DWORD dwFrequency) PURE; STDMETHOD(Stop) (THIS) PURE; STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; STDMETHOD(Restore) (THIS) PURE; // IDirectSoundBuffer8 methods STDMETHOD(SetFX) (THIS_ DWORD dwEffectsCount, LPDSEFFECTDESC pDSFXDesc, LPDWORD pdwResultCodes) PURE; STDMETHOD(AcquireResources) (THIS_ DWORD dwFlags, DWORD dwEffectsCount, LPDWORD pdwResultCodes) PURE; STDMETHOD(GetObjectInPath) (THIS_ REFGUID rguidObject, DWORD dwIndex, REFGUID rguidInterface, LPVOID *ppObject) PURE; }; // Special GUID meaning "select all objects" for use in GetObjectInPath() DEFINE_GUID(GUID_All_Objects, 0xaa114de5, 0xc262, 0x4169, 0xa1, 0xc8, 0x23, 0xd6, 0x98, 0xcc, 0x73, 0xb5); #define IDirectSoundBuffer8_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundBuffer8_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundBuffer8_Release(p) IUnknown_Release(p) #define IDirectSoundBuffer8_GetCaps(p,a) IDirectSoundBuffer_GetCaps(p,a) #define IDirectSoundBuffer8_GetCurrentPosition(p,a,b) IDirectSoundBuffer_GetCurrentPosition(p,a,b) #define IDirectSoundBuffer8_GetFormat(p,a,b,c) IDirectSoundBuffer_GetFormat(p,a,b,c) #define IDirectSoundBuffer8_GetVolume(p,a) IDirectSoundBuffer_GetVolume(p,a) #define IDirectSoundBuffer8_GetPan(p,a) IDirectSoundBuffer_GetPan(p,a) #define IDirectSoundBuffer8_GetFrequency(p,a) IDirectSoundBuffer_GetFrequency(p,a) #define IDirectSoundBuffer8_GetStatus(p,a) IDirectSoundBuffer_GetStatus(p,a) #define IDirectSoundBuffer8_Initialize(p,a,b) IDirectSoundBuffer_Initialize(p,a,b) #define IDirectSoundBuffer8_Lock(p,a,b,c,d,e,f,g) IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) #define IDirectSoundBuffer8_Play(p,a,b,c) IDirectSoundBuffer_Play(p,a,b,c) #define IDirectSoundBuffer8_SetCurrentPosition(p,a) IDirectSoundBuffer_SetCurrentPosition(p,a) #define IDirectSoundBuffer8_SetFormat(p,a) IDirectSoundBuffer_SetFormat(p,a) #define IDirectSoundBuffer8_SetVolume(p,a) IDirectSoundBuffer_SetVolume(p,a) #define IDirectSoundBuffer8_SetPan(p,a) IDirectSoundBuffer_SetPan(p,a) #define IDirectSoundBuffer8_SetFrequency(p,a) IDirectSoundBuffer_SetFrequency(p,a) #define IDirectSoundBuffer8_Stop(p) IDirectSoundBuffer_Stop(p) #define IDirectSoundBuffer8_Unlock(p,a,b,c,d) IDirectSoundBuffer_Unlock(p,a,b,c,d) #define IDirectSoundBuffer8_Restore(p) IDirectSoundBuffer_Restore(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundBuffer8_SetFX(p,a,b,c) (p)->lpVtbl->SetFX(p,a,b,c) #define IDirectSoundBuffer8_AcquireResources(p,a,b,c) (p)->lpVtbl->AcquireResources(p,a,b,c) #define IDirectSoundBuffer8_GetObjectInPath(p,a,b,c,d) (p)->lpVtbl->GetObjectInPath(p,a,b,c,d) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundBuffer8_SetFX(p,a,b,c) (p)->SetFX(a,b,c) #define IDirectSoundBuffer8_AcquireResources(p,a,b,c) (p)->AcquireResources(a,b,c) #define IDirectSoundBuffer8_GetObjectInPath(p,a,b,c,d) (p)->GetObjectInPath(a,b,c,d) #endif // !defined(__cplusplus) || defined(CINTERFACE) #endif // DIRECTSOUND_VERSION >= 0x0800 // // IDirectSound3DListener // DEFINE_GUID(IID_IDirectSound3DListener, 0x279AFA84, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); #undef INTERFACE #define INTERFACE IDirectSound3DListener DECLARE_INTERFACE_(IDirectSound3DListener, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSound3DListener methods STDMETHOD(GetAllParameters) (THIS_ LPDS3DLISTENER pListener) PURE; STDMETHOD(GetDistanceFactor) (THIS_ D3DVALUE* pflDistanceFactor) PURE; STDMETHOD(GetDopplerFactor) (THIS_ D3DVALUE* pflDopplerFactor) PURE; STDMETHOD(GetOrientation) (THIS_ D3DVECTOR* pvOrientFront, D3DVECTOR* pvOrientTop) PURE; STDMETHOD(GetPosition) (THIS_ D3DVECTOR* pvPosition) PURE; STDMETHOD(GetRolloffFactor) (THIS_ D3DVALUE* pflRolloffFactor) PURE; STDMETHOD(GetVelocity) (THIS_ D3DVECTOR* pvVelocity) PURE; STDMETHOD(SetAllParameters) (THIS_ LPCDS3DLISTENER pcListener, DWORD dwApply) PURE; STDMETHOD(SetDistanceFactor) (THIS_ D3DVALUE flDistanceFactor, DWORD dwApply) PURE; STDMETHOD(SetDopplerFactor) (THIS_ D3DVALUE flDopplerFactor, DWORD dwApply) PURE; STDMETHOD(SetOrientation) (THIS_ D3DVALUE xFront, D3DVALUE yFront, D3DVALUE zFront, D3DVALUE xTop, D3DVALUE yTop, D3DVALUE zTop, DWORD dwApply) PURE; STDMETHOD(SetPosition) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; STDMETHOD(SetRolloffFactor) (THIS_ D3DVALUE flRolloffFactor, DWORD dwApply) PURE; STDMETHOD(SetVelocity) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; STDMETHOD(CommitDeferredSettings) (THIS) PURE; }; #define IDirectSound3DListener_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSound3DListener_AddRef(p) IUnknown_AddRef(p) #define IDirectSound3DListener_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSound3DListener_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #define IDirectSound3DListener_GetDistanceFactor(p,a) (p)->lpVtbl->GetDistanceFactor(p,a) #define IDirectSound3DListener_GetDopplerFactor(p,a) (p)->lpVtbl->GetDopplerFactor(p,a) #define IDirectSound3DListener_GetOrientation(p,a,b) (p)->lpVtbl->GetOrientation(p,a,b) #define IDirectSound3DListener_GetPosition(p,a) (p)->lpVtbl->GetPosition(p,a) #define IDirectSound3DListener_GetRolloffFactor(p,a) (p)->lpVtbl->GetRolloffFactor(p,a) #define IDirectSound3DListener_GetVelocity(p,a) (p)->lpVtbl->GetVelocity(p,a) #define IDirectSound3DListener_SetAllParameters(p,a,b) (p)->lpVtbl->SetAllParameters(p,a,b) #define IDirectSound3DListener_SetDistanceFactor(p,a,b) (p)->lpVtbl->SetDistanceFactor(p,a,b) #define IDirectSound3DListener_SetDopplerFactor(p,a,b) (p)->lpVtbl->SetDopplerFactor(p,a,b) #define IDirectSound3DListener_SetOrientation(p,a,b,c,d,e,f,g) (p)->lpVtbl->SetOrientation(p,a,b,c,d,e,f,g) #define IDirectSound3DListener_SetPosition(p,a,b,c,d) (p)->lpVtbl->SetPosition(p,a,b,c,d) #define IDirectSound3DListener_SetRolloffFactor(p,a,b) (p)->lpVtbl->SetRolloffFactor(p,a,b) #define IDirectSound3DListener_SetVelocity(p,a,b,c,d) (p)->lpVtbl->SetVelocity(p,a,b,c,d) #define IDirectSound3DListener_CommitDeferredSettings(p) (p)->lpVtbl->CommitDeferredSettings(p) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSound3DListener_GetAllParameters(p,a) (p)->GetAllParameters(a) #define IDirectSound3DListener_GetDistanceFactor(p,a) (p)->GetDistanceFactor(a) #define IDirectSound3DListener_GetDopplerFactor(p,a) (p)->GetDopplerFactor(a) #define IDirectSound3DListener_GetOrientation(p,a,b) (p)->GetOrientation(a,b) #define IDirectSound3DListener_GetPosition(p,a) (p)->GetPosition(a) #define IDirectSound3DListener_GetRolloffFactor(p,a) (p)->GetRolloffFactor(a) #define IDirectSound3DListener_GetVelocity(p,a) (p)->GetVelocity(a) #define IDirectSound3DListener_SetAllParameters(p,a,b) (p)->SetAllParameters(a,b) #define IDirectSound3DListener_SetDistanceFactor(p,a,b) (p)->SetDistanceFactor(a,b) #define IDirectSound3DListener_SetDopplerFactor(p,a,b) (p)->SetDopplerFactor(a,b) #define IDirectSound3DListener_SetOrientation(p,a,b,c,d,e,f,g) (p)->SetOrientation(a,b,c,d,e,f,g) #define IDirectSound3DListener_SetPosition(p,a,b,c,d) (p)->SetPosition(a,b,c,d) #define IDirectSound3DListener_SetRolloffFactor(p,a,b) (p)->SetRolloffFactor(a,b) #define IDirectSound3DListener_SetVelocity(p,a,b,c,d) (p)->SetVelocity(a,b,c,d) #define IDirectSound3DListener_CommitDeferredSettings(p) (p)->CommitDeferredSettings() #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSound3DBuffer // DEFINE_GUID(IID_IDirectSound3DBuffer, 0x279AFA86, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); #undef INTERFACE #define INTERFACE IDirectSound3DBuffer DECLARE_INTERFACE_(IDirectSound3DBuffer, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSound3DBuffer methods STDMETHOD(GetAllParameters) (THIS_ LPDS3DBUFFER pDs3dBuffer) PURE; STDMETHOD(GetConeAngles) (THIS_ LPDWORD pdwInsideConeAngle, LPDWORD pdwOutsideConeAngle) PURE; STDMETHOD(GetConeOrientation) (THIS_ D3DVECTOR* pvOrientation) PURE; STDMETHOD(GetConeOutsideVolume) (THIS_ LPLONG plConeOutsideVolume) PURE; STDMETHOD(GetMaxDistance) (THIS_ D3DVALUE* pflMaxDistance) PURE; STDMETHOD(GetMinDistance) (THIS_ D3DVALUE* pflMinDistance) PURE; STDMETHOD(GetMode) (THIS_ LPDWORD pdwMode) PURE; STDMETHOD(GetPosition) (THIS_ D3DVECTOR* pvPosition) PURE; STDMETHOD(GetVelocity) (THIS_ D3DVECTOR* pvVelocity) PURE; STDMETHOD(SetAllParameters) (THIS_ LPCDS3DBUFFER pcDs3dBuffer, DWORD dwApply) PURE; STDMETHOD(SetConeAngles) (THIS_ DWORD dwInsideConeAngle, DWORD dwOutsideConeAngle, DWORD dwApply) PURE; STDMETHOD(SetConeOrientation) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; STDMETHOD(SetConeOutsideVolume) (THIS_ LONG lConeOutsideVolume, DWORD dwApply) PURE; STDMETHOD(SetMaxDistance) (THIS_ D3DVALUE flMaxDistance, DWORD dwApply) PURE; STDMETHOD(SetMinDistance) (THIS_ D3DVALUE flMinDistance, DWORD dwApply) PURE; STDMETHOD(SetMode) (THIS_ DWORD dwMode, DWORD dwApply) PURE; STDMETHOD(SetPosition) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; STDMETHOD(SetVelocity) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; }; #define IDirectSound3DBuffer_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSound3DBuffer_AddRef(p) IUnknown_AddRef(p) #define IDirectSound3DBuffer_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSound3DBuffer_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #define IDirectSound3DBuffer_GetConeAngles(p,a,b) (p)->lpVtbl->GetConeAngles(p,a,b) #define IDirectSound3DBuffer_GetConeOrientation(p,a) (p)->lpVtbl->GetConeOrientation(p,a) #define IDirectSound3DBuffer_GetConeOutsideVolume(p,a) (p)->lpVtbl->GetConeOutsideVolume(p,a) #define IDirectSound3DBuffer_GetPosition(p,a) (p)->lpVtbl->GetPosition(p,a) #define IDirectSound3DBuffer_GetMinDistance(p,a) (p)->lpVtbl->GetMinDistance(p,a) #define IDirectSound3DBuffer_GetMaxDistance(p,a) (p)->lpVtbl->GetMaxDistance(p,a) #define IDirectSound3DBuffer_GetMode(p,a) (p)->lpVtbl->GetMode(p,a) #define IDirectSound3DBuffer_GetVelocity(p,a) (p)->lpVtbl->GetVelocity(p,a) #define IDirectSound3DBuffer_SetAllParameters(p,a,b) (p)->lpVtbl->SetAllParameters(p,a,b) #define IDirectSound3DBuffer_SetConeAngles(p,a,b,c) (p)->lpVtbl->SetConeAngles(p,a,b,c) #define IDirectSound3DBuffer_SetConeOrientation(p,a,b,c,d) (p)->lpVtbl->SetConeOrientation(p,a,b,c,d) #define IDirectSound3DBuffer_SetConeOutsideVolume(p,a,b) (p)->lpVtbl->SetConeOutsideVolume(p,a,b) #define IDirectSound3DBuffer_SetPosition(p,a,b,c,d) (p)->lpVtbl->SetPosition(p,a,b,c,d) #define IDirectSound3DBuffer_SetMinDistance(p,a,b) (p)->lpVtbl->SetMinDistance(p,a,b) #define IDirectSound3DBuffer_SetMaxDistance(p,a,b) (p)->lpVtbl->SetMaxDistance(p,a,b) #define IDirectSound3DBuffer_SetMode(p,a,b) (p)->lpVtbl->SetMode(p,a,b) #define IDirectSound3DBuffer_SetVelocity(p,a,b,c,d) (p)->lpVtbl->SetVelocity(p,a,b,c,d) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSound3DBuffer_GetAllParameters(p,a) (p)->GetAllParameters(a) #define IDirectSound3DBuffer_GetConeAngles(p,a,b) (p)->GetConeAngles(a,b) #define IDirectSound3DBuffer_GetConeOrientation(p,a) (p)->GetConeOrientation(a) #define IDirectSound3DBuffer_GetConeOutsideVolume(p,a) (p)->GetConeOutsideVolume(a) #define IDirectSound3DBuffer_GetPosition(p,a) (p)->GetPosition(a) #define IDirectSound3DBuffer_GetMinDistance(p,a) (p)->GetMinDistance(a) #define IDirectSound3DBuffer_GetMaxDistance(p,a) (p)->GetMaxDistance(a) #define IDirectSound3DBuffer_GetMode(p,a) (p)->GetMode(a) #define IDirectSound3DBuffer_GetVelocity(p,a) (p)->GetVelocity(a) #define IDirectSound3DBuffer_SetAllParameters(p,a,b) (p)->SetAllParameters(a,b) #define IDirectSound3DBuffer_SetConeAngles(p,a,b,c) (p)->SetConeAngles(a,b,c) #define IDirectSound3DBuffer_SetConeOrientation(p,a,b,c,d) (p)->SetConeOrientation(a,b,c,d) #define IDirectSound3DBuffer_SetConeOutsideVolume(p,a,b) (p)->SetConeOutsideVolume(a,b) #define IDirectSound3DBuffer_SetPosition(p,a,b,c,d) (p)->SetPosition(a,b,c,d) #define IDirectSound3DBuffer_SetMinDistance(p,a,b) (p)->SetMinDistance(a,b) #define IDirectSound3DBuffer_SetMaxDistance(p,a,b) (p)->SetMaxDistance(a,b) #define IDirectSound3DBuffer_SetMode(p,a,b) (p)->SetMode(a,b) #define IDirectSound3DBuffer_SetVelocity(p,a,b,c,d) (p)->SetVelocity(a,b,c,d) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundCapture // DEFINE_GUID(IID_IDirectSoundCapture, 0xb0210781, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); #undef INTERFACE #define INTERFACE IDirectSoundCapture DECLARE_INTERFACE_(IDirectSoundCapture, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundCapture methods STDMETHOD(CreateCaptureBuffer) (THIS_ LPCDSCBUFFERDESC pcDSCBufferDesc, LPDIRECTSOUNDCAPTUREBUFFER *ppDSCBuffer, LPUNKNOWN pUnkOuter) PURE; STDMETHOD(GetCaps) (THIS_ LPDSCCAPS pDSCCaps) PURE; STDMETHOD(Initialize) (THIS_ LPCGUID pcGuidDevice) PURE; }; #define IDirectSoundCapture_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundCapture_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundCapture_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundCapture_CreateCaptureBuffer(p,a,b,c) (p)->lpVtbl->CreateCaptureBuffer(p,a,b,c) #define IDirectSoundCapture_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) #define IDirectSoundCapture_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundCapture_CreateCaptureBuffer(p,a,b,c) (p)->CreateCaptureBuffer(a,b,c) #define IDirectSoundCapture_GetCaps(p,a) (p)->GetCaps(a) #define IDirectSoundCapture_Initialize(p,a) (p)->Initialize(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundCaptureBuffer // DEFINE_GUID(IID_IDirectSoundCaptureBuffer, 0xb0210782, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); #undef INTERFACE #define INTERFACE IDirectSoundCaptureBuffer DECLARE_INTERFACE_(IDirectSoundCaptureBuffer, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundCaptureBuffer methods STDMETHOD(GetCaps) (THIS_ LPDSCBCAPS pDSCBCaps) PURE; STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCapturePosition, LPDWORD pdwReadPosition) PURE; STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; STDMETHOD(Initialize) (THIS_ LPDIRECTSOUNDCAPTURE pDirectSoundCapture, LPCDSCBUFFERDESC pcDSCBufferDesc) PURE; STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; STDMETHOD(Start) (THIS_ DWORD dwFlags) PURE; STDMETHOD(Stop) (THIS) PURE; STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; }; #define IDirectSoundCaptureBuffer_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundCaptureBuffer_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundCaptureBuffer_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundCaptureBuffer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) #define IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b) #define IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) (p)->lpVtbl->GetFormat(p,a,b,c) #define IDirectSoundCaptureBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a) #define IDirectSoundCaptureBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) #define IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g) #define IDirectSoundCaptureBuffer_Start(p,a) (p)->lpVtbl->Start(p,a) #define IDirectSoundCaptureBuffer_Stop(p) (p)->lpVtbl->Stop(p) #define IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundCaptureBuffer_GetCaps(p,a) (p)->GetCaps(a) #define IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) (p)->GetCurrentPosition(a,b) #define IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) (p)->GetFormat(a,b,c) #define IDirectSoundCaptureBuffer_GetStatus(p,a) (p)->GetStatus(a) #define IDirectSoundCaptureBuffer_Initialize(p,a,b) (p)->Initialize(a,b) #define IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) (p)->Lock(a,b,c,d,e,f,g) #define IDirectSoundCaptureBuffer_Start(p,a) (p)->Start(a) #define IDirectSoundCaptureBuffer_Stop(p) (p)->Stop() #define IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) (p)->Unlock(a,b,c,d) #endif // !defined(__cplusplus) || defined(CINTERFACE) #if DIRECTSOUND_VERSION >= 0x0800 // // IDirectSoundCaptureBuffer8 // DEFINE_GUID(IID_IDirectSoundCaptureBuffer8, 0x990df4, 0xdbb, 0x4872, 0x83, 0x3e, 0x6d, 0x30, 0x3e, 0x80, 0xae, 0xb6); #undef INTERFACE #define INTERFACE IDirectSoundCaptureBuffer8 DECLARE_INTERFACE_(IDirectSoundCaptureBuffer8, IDirectSoundCaptureBuffer) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundCaptureBuffer methods STDMETHOD(GetCaps) (THIS_ LPDSCBCAPS pDSCBCaps) PURE; STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCapturePosition, LPDWORD pdwReadPosition) PURE; STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; STDMETHOD(Initialize) (THIS_ LPDIRECTSOUNDCAPTURE pDirectSoundCapture, LPCDSCBUFFERDESC pcDSCBufferDesc) PURE; STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; STDMETHOD(Start) (THIS_ DWORD dwFlags) PURE; STDMETHOD(Stop) (THIS) PURE; STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; // IDirectSoundCaptureBuffer8 methods STDMETHOD(GetObjectInPath) (THIS_ REFGUID rguidObject, DWORD dwIndex, REFGUID rguidInterface, LPVOID *ppObject) PURE; STDMETHOD(GetFXStatus) (DWORD dwFXCount, LPDWORD pdwFXStatus) PURE; }; #define IDirectSoundCaptureBuffer8_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundCaptureBuffer8_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundCaptureBuffer8_Release(p) IUnknown_Release(p) #define IDirectSoundCaptureBuffer8_GetCaps(p,a) IDirectSoundCaptureBuffer_GetCaps(p,a) #define IDirectSoundCaptureBuffer8_GetCurrentPosition(p,a,b) IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) #define IDirectSoundCaptureBuffer8_GetFormat(p,a,b,c) IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) #define IDirectSoundCaptureBuffer8_GetStatus(p,a) IDirectSoundCaptureBuffer_GetStatus(p,a) #define IDirectSoundCaptureBuffer8_Initialize(p,a,b) IDirectSoundCaptureBuffer_Initialize(p,a,b) #define IDirectSoundCaptureBuffer8_Lock(p,a,b,c,d,e,f,g) IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) #define IDirectSoundCaptureBuffer8_Start(p,a) IDirectSoundCaptureBuffer_Start(p,a) #define IDirectSoundCaptureBuffer8_Stop(p) IDirectSoundCaptureBuffer_Stop(p)) #define IDirectSoundCaptureBuffer8_Unlock(p,a,b,c,d) IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundCaptureBuffer8_GetObjectInPath(p,a,b,c,d) (p)->lpVtbl->GetObjectInPath(p,a,b,c,d) #define IDirectSoundCaptureBuffer8_GetFXStatus(p,a,b) (p)->lpVtbl->GetFXStatus(p,a,b) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundCaptureBuffer8_GetObjectInPath(p,a,b,c,d) (p)->GetObjectInPath(a,b,c,d) #define IDirectSoundCaptureBuffer8_GetFXStatus(p,a,b) (p)->GetFXStatus(a,b) #endif // !defined(__cplusplus) || defined(CINTERFACE) #endif // DIRECTSOUND_VERSION >= 0x0800 // // IDirectSoundNotify // DEFINE_GUID(IID_IDirectSoundNotify, 0xb0210783, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); #undef INTERFACE #define INTERFACE IDirectSoundNotify DECLARE_INTERFACE_(IDirectSoundNotify, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundNotify methods STDMETHOD(SetNotificationPositions) (THIS_ DWORD dwPositionNotifies, LPCDSBPOSITIONNOTIFY pcPositionNotifies) PURE; }; #define IDirectSoundNotify_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundNotify_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundNotify_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->lpVtbl->SetNotificationPositions(p,a,b) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->SetNotificationPositions(a,b) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IKsPropertySet // #ifndef _IKsPropertySet_ #define _IKsPropertySet_ #ifdef __cplusplus // 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined struct IKsPropertySet; #endif // __cplusplus typedef struct IKsPropertySet *LPKSPROPERTYSET; #define KSPROPERTY_SUPPORT_GET 0x00000001 #define KSPROPERTY_SUPPORT_SET 0x00000002 DEFINE_GUID(IID_IKsPropertySet, 0x31efac30, 0x515c, 0x11d0, 0xa9, 0xaa, 0x00, 0xaa, 0x00, 0x61, 0xbe, 0x93); #undef INTERFACE #define INTERFACE IKsPropertySet DECLARE_INTERFACE_(IKsPropertySet, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IKsPropertySet methods STDMETHOD(Get) (THIS_ REFGUID rguidPropSet, ULONG ulId, LPVOID pInstanceData, ULONG ulInstanceLength, LPVOID pPropertyData, ULONG ulDataLength, PULONG pulBytesReturned) PURE; STDMETHOD(Set) (THIS_ REFGUID rguidPropSet, ULONG ulId, LPVOID pInstanceData, ULONG ulInstanceLength, LPVOID pPropertyData, ULONG ulDataLength) PURE; STDMETHOD(QuerySupport) (THIS_ REFGUID rguidPropSet, ULONG ulId, PULONG pulTypeSupport) PURE; }; #define IKsPropertySet_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IKsPropertySet_AddRef(p) IUnknown_AddRef(p) #define IKsPropertySet_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IKsPropertySet_Get(p,a,b,c,d,e,f,g) (p)->lpVtbl->Get(p,a,b,c,d,e,f,g) #define IKsPropertySet_Set(p,a,b,c,d,e,f) (p)->lpVtbl->Set(p,a,b,c,d,e,f) #define IKsPropertySet_QuerySupport(p,a,b,c) (p)->lpVtbl->QuerySupport(p,a,b,c) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IKsPropertySet_Get(p,a,b,c,d,e,f,g) (p)->Get(a,b,c,d,e,f,g) #define IKsPropertySet_Set(p,a,b,c,d,e,f) (p)->Set(a,b,c,d,e,f) #define IKsPropertySet_QuerySupport(p,a,b,c) (p)->QuerySupport(a,b,c) #endif // !defined(__cplusplus) || defined(CINTERFACE) #endif // _IKsPropertySet_ #if DIRECTSOUND_VERSION >= 0x0800 // // IDirectSoundFXGargle // DEFINE_GUID(IID_IDirectSoundFXGargle, 0xd616f352, 0xd622, 0x11ce, 0xaa, 0xc5, 0x00, 0x20, 0xaf, 0x0b, 0x99, 0xa3); typedef struct _DSFXGargle { DWORD dwRateHz; // Rate of modulation in hz DWORD dwWaveShape; // DSFXGARGLE_WAVE_xxx } DSFXGargle, *LPDSFXGargle; #define DSFXGARGLE_WAVE_TRIANGLE 0 #define DSFXGARGLE_WAVE_SQUARE 1 typedef const DSFXGargle *LPCDSFXGargle; #define DSFXGARGLE_RATEHZ_MIN 1 #define DSFXGARGLE_RATEHZ_MAX 1000 #undef INTERFACE #define INTERFACE IDirectSoundFXGargle DECLARE_INTERFACE_(IDirectSoundFXGargle, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundFXGargle methods STDMETHOD(SetAllParameters) (THIS_ LPCDSFXGargle pcDsFxGargle) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSFXGargle pDsFxGargle) PURE; }; #define IDirectSoundFXGargle_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundFXGargle_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundFXGargle_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXGargle_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundFXGargle_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXGargle_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundFXGargle_GetAllParameters(p,a) (p)->GetAllParameters(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundFXChorus // DEFINE_GUID(IID_IDirectSoundFXChorus, 0x880842e3, 0x145f, 0x43e6, 0xa9, 0x34, 0xa7, 0x18, 0x06, 0xe5, 0x05, 0x47); typedef struct _DSFXChorus { FLOAT fWetDryMix; FLOAT fDepth; FLOAT fFeedback; FLOAT fFrequency; LONG lWaveform; // LFO shape; DSFXCHORUS_WAVE_xxx FLOAT fDelay; LONG lPhase; } DSFXChorus, *LPDSFXChorus; typedef const DSFXChorus *LPCDSFXChorus; #define DSFXCHORUS_WAVE_TRIANGLE 0 #define DSFXCHORUS_WAVE_SIN 1 #define DSFXCHORUS_WETDRYMIX_MIN 0.0f #define DSFXCHORUS_WETDRYMIX_MAX 100.0f #define DSFXCHORUS_DEPTH_MIN 0.0f #define DSFXCHORUS_DEPTH_MAX 100.0f #define DSFXCHORUS_FEEDBACK_MIN -99.0f #define DSFXCHORUS_FEEDBACK_MAX 99.0f #define DSFXCHORUS_FREQUENCY_MIN 0.0f #define DSFXCHORUS_FREQUENCY_MAX 10.0f #define DSFXCHORUS_DELAY_MIN 0.0f #define DSFXCHORUS_DELAY_MAX 20.0f #define DSFXCHORUS_PHASE_MIN 0 #define DSFXCHORUS_PHASE_MAX 4 #define DSFXCHORUS_PHASE_NEG_180 0 #define DSFXCHORUS_PHASE_NEG_90 1 #define DSFXCHORUS_PHASE_ZERO 2 #define DSFXCHORUS_PHASE_90 3 #define DSFXCHORUS_PHASE_180 4 #undef INTERFACE #define INTERFACE IDirectSoundFXChorus DECLARE_INTERFACE_(IDirectSoundFXChorus, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundFXChorus methods STDMETHOD(SetAllParameters) (THIS_ LPCDSFXChorus pcDsFxChorus) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSFXChorus pDsFxChorus) PURE; }; #define IDirectSoundFXChorus_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundFXChorus_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundFXChorus_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXChorus_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundFXChorus_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXChorus_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundFXChorus_GetAllParameters(p,a) (p)->GetAllParameters(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundFXFlanger // DEFINE_GUID(IID_IDirectSoundFXFlanger, 0x903e9878, 0x2c92, 0x4072, 0x9b, 0x2c, 0xea, 0x68, 0xf5, 0x39, 0x67, 0x83); typedef struct _DSFXFlanger { FLOAT fWetDryMix; FLOAT fDepth; FLOAT fFeedback; FLOAT fFrequency; LONG lWaveform; FLOAT fDelay; LONG lPhase; } DSFXFlanger, *LPDSFXFlanger; typedef const DSFXFlanger *LPCDSFXFlanger; #define DSFXFLANGER_WAVE_TRIANGLE 0 #define DSFXFLANGER_WAVE_SIN 1 #define DSFXFLANGER_WETDRYMIX_MIN 0.0f #define DSFXFLANGER_WETDRYMIX_MAX 100.0f #define DSFXFLANGER_FREQUENCY_MIN 0.0f #define DSFXFLANGER_FREQUENCY_MAX 10.0f #define DSFXFLANGER_DEPTH_MIN 0.0f #define DSFXFLANGER_DEPTH_MAX 100.0f #define DSFXFLANGER_PHASE_MIN 0 #define DSFXFLANGER_PHASE_MAX 4 #define DSFXFLANGER_FEEDBACK_MIN -99.0f #define DSFXFLANGER_FEEDBACK_MAX 99.0f #define DSFXFLANGER_DELAY_MIN 0.0f #define DSFXFLANGER_DELAY_MAX 4.0f #define DSFXFLANGER_PHASE_NEG_180 0 #define DSFXFLANGER_PHASE_NEG_90 1 #define DSFXFLANGER_PHASE_ZERO 2 #define DSFXFLANGER_PHASE_90 3 #define DSFXFLANGER_PHASE_180 4 #undef INTERFACE #define INTERFACE IDirectSoundFXFlanger DECLARE_INTERFACE_(IDirectSoundFXFlanger, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundFXFlanger methods STDMETHOD(SetAllParameters) (THIS_ LPCDSFXFlanger pcDsFxFlanger) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSFXFlanger pDsFxFlanger) PURE; }; #define IDirectSoundFXFlanger_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundFXFlanger_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundFXFlanger_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXFlanger_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundFXFlanger_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXFlanger_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundFXFlanger_GetAllParameters(p,a) (p)->GetAllParameters(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundFXEcho // DEFINE_GUID(IID_IDirectSoundFXEcho, 0x8bd28edf, 0x50db, 0x4e92, 0xa2, 0xbd, 0x44, 0x54, 0x88, 0xd1, 0xed, 0x42); typedef struct _DSFXEcho { FLOAT fWetDryMix; FLOAT fFeedback; FLOAT fLeftDelay; FLOAT fRightDelay; LONG lPanDelay; } DSFXEcho, *LPDSFXEcho; typedef const DSFXEcho *LPCDSFXEcho; #define DSFXECHO_WETDRYMIX_MIN 0.0f #define DSFXECHO_WETDRYMIX_MAX 100.0f #define DSFXECHO_FEEDBACK_MIN 0.0f #define DSFXECHO_FEEDBACK_MAX 100.0f #define DSFXECHO_LEFTDELAY_MIN 1.0f #define DSFXECHO_LEFTDELAY_MAX 2000.0f #define DSFXECHO_RIGHTDELAY_MIN 1.0f #define DSFXECHO_RIGHTDELAY_MAX 2000.0f #define DSFXECHO_PANDELAY_MIN 0 #define DSFXECHO_PANDELAY_MAX 1 #undef INTERFACE #define INTERFACE IDirectSoundFXEcho DECLARE_INTERFACE_(IDirectSoundFXEcho, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundFXEcho methods STDMETHOD(SetAllParameters) (THIS_ LPCDSFXEcho pcDsFxEcho) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSFXEcho pDsFxEcho) PURE; }; #define IDirectSoundFXEcho_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundFXEcho_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundFXEcho_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXEcho_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundFXEcho_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXEcho_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundFXEcho_GetAllParameters(p,a) (p)->GetAllParameters(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundFXDistortion // DEFINE_GUID(IID_IDirectSoundFXDistortion, 0x8ecf4326, 0x455f, 0x4d8b, 0xbd, 0xa9, 0x8d, 0x5d, 0x3e, 0x9e, 0x3e, 0x0b); typedef struct _DSFXDistortion { FLOAT fGain; FLOAT fEdge; FLOAT fPostEQCenterFrequency; FLOAT fPostEQBandwidth; FLOAT fPreLowpassCutoff; } DSFXDistortion, *LPDSFXDistortion; typedef const DSFXDistortion *LPCDSFXDistortion; #define DSFXDISTORTION_GAIN_MIN -60.0f #define DSFXDISTORTION_GAIN_MAX 0.0f #define DSFXDISTORTION_EDGE_MIN 0.0f #define DSFXDISTORTION_EDGE_MAX 100.0f #define DSFXDISTORTION_POSTEQCENTERFREQUENCY_MIN 100.0f #define DSFXDISTORTION_POSTEQCENTERFREQUENCY_MAX 8000.0f #define DSFXDISTORTION_POSTEQBANDWIDTH_MIN 100.0f #define DSFXDISTORTION_POSTEQBANDWIDTH_MAX 8000.0f #define DSFXDISTORTION_PRELOWPASSCUTOFF_MIN 100.0f #define DSFXDISTORTION_PRELOWPASSCUTOFF_MAX 8000.0f #undef INTERFACE #define INTERFACE IDirectSoundFXDistortion DECLARE_INTERFACE_(IDirectSoundFXDistortion, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundFXDistortion methods STDMETHOD(SetAllParameters) (THIS_ LPCDSFXDistortion pcDsFxDistortion) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSFXDistortion pDsFxDistortion) PURE; }; #define IDirectSoundFXDistortion_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundFXDistortion_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundFXDistortion_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXDistortion_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundFXDistortion_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXDistortion_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundFXDistortion_GetAllParameters(p,a) (p)->GetAllParameters(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundFXCompressor // DEFINE_GUID(IID_IDirectSoundFXCompressor, 0x4bbd1154, 0x62f6, 0x4e2c, 0xa1, 0x5c, 0xd3, 0xb6, 0xc4, 0x17, 0xf7, 0xa0); typedef struct _DSFXCompressor { FLOAT fGain; FLOAT fAttack; FLOAT fRelease; FLOAT fThreshold; FLOAT fRatio; FLOAT fPredelay; } DSFXCompressor, *LPDSFXCompressor; typedef const DSFXCompressor *LPCDSFXCompressor; #define DSFXCOMPRESSOR_GAIN_MIN -60.0f #define DSFXCOMPRESSOR_GAIN_MAX 60.0f #define DSFXCOMPRESSOR_ATTACK_MIN 0.01f #define DSFXCOMPRESSOR_ATTACK_MAX 500.0f #define DSFXCOMPRESSOR_RELEASE_MIN 50.0f #define DSFXCOMPRESSOR_RELEASE_MAX 3000.0f #define DSFXCOMPRESSOR_THRESHOLD_MIN -60.0f #define DSFXCOMPRESSOR_THRESHOLD_MAX 0.0f #define DSFXCOMPRESSOR_RATIO_MIN 1.0f #define DSFXCOMPRESSOR_RATIO_MAX 100.0f #define DSFXCOMPRESSOR_PREDELAY_MIN 0.0f #define DSFXCOMPRESSOR_PREDELAY_MAX 4.0f #undef INTERFACE #define INTERFACE IDirectSoundFXCompressor DECLARE_INTERFACE_(IDirectSoundFXCompressor, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundFXCompressor methods STDMETHOD(SetAllParameters) (THIS_ LPCDSFXCompressor pcDsFxCompressor) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSFXCompressor pDsFxCompressor) PURE; }; #define IDirectSoundFXCompressor_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundFXCompressor_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundFXCompressor_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXCompressor_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundFXCompressor_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXCompressor_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundFXCompressor_GetAllParameters(p,a) (p)->GetAllParameters(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundFXParamEq // DEFINE_GUID(IID_IDirectSoundFXParamEq, 0xc03ca9fe, 0xfe90, 0x4204, 0x80, 0x78, 0x82, 0x33, 0x4c, 0xd1, 0x77, 0xda); typedef struct _DSFXParamEq { FLOAT fCenter; FLOAT fBandwidth; FLOAT fGain; } DSFXParamEq, *LPDSFXParamEq; typedef const DSFXParamEq *LPCDSFXParamEq; #define DSFXPARAMEQ_CENTER_MIN 80.0f #define DSFXPARAMEQ_CENTER_MAX 16000.0f #define DSFXPARAMEQ_BANDWIDTH_MIN 1.0f #define DSFXPARAMEQ_BANDWIDTH_MAX 36.0f #define DSFXPARAMEQ_GAIN_MIN -15.0f #define DSFXPARAMEQ_GAIN_MAX 15.0f #undef INTERFACE #define INTERFACE IDirectSoundFXParamEq DECLARE_INTERFACE_(IDirectSoundFXParamEq, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundFXParamEq methods STDMETHOD(SetAllParameters) (THIS_ LPCDSFXParamEq pcDsFxParamEq) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSFXParamEq pDsFxParamEq) PURE; }; #define IDirectSoundFXParamEq_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundFXParamEq_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundFXParamEq_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXParamEq_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundFXParamEq_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXParamEq_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundFXParamEq_GetAllParameters(p,a) (p)->GetAllParameters(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundFXI3DL2Reverb // DEFINE_GUID(IID_IDirectSoundFXI3DL2Reverb, 0x4b166a6a, 0x0d66, 0x43f3, 0x80, 0xe3, 0xee, 0x62, 0x80, 0xde, 0xe1, 0xa4); typedef struct _DSFXI3DL2Reverb { LONG lRoom; // [-10000, 0] default: -1000 mB LONG lRoomHF; // [-10000, 0] default: 0 mB FLOAT flRoomRolloffFactor; // [0.0, 10.0] default: 0.0 FLOAT flDecayTime; // [0.1, 20.0] default: 1.49s FLOAT flDecayHFRatio; // [0.1, 2.0] default: 0.83 LONG lReflections; // [-10000, 1000] default: -2602 mB FLOAT flReflectionsDelay; // [0.0, 0.3] default: 0.007 s LONG lReverb; // [-10000, 2000] default: 200 mB FLOAT flReverbDelay; // [0.0, 0.1] default: 0.011 s FLOAT flDiffusion; // [0.0, 100.0] default: 100.0 % FLOAT flDensity; // [0.0, 100.0] default: 100.0 % FLOAT flHFReference; // [20.0, 20000.0] default: 5000.0 Hz } DSFXI3DL2Reverb, *LPDSFXI3DL2Reverb; typedef const DSFXI3DL2Reverb *LPCDSFXI3DL2Reverb; #define DSFX_I3DL2REVERB_ROOM_MIN (-10000) #define DSFX_I3DL2REVERB_ROOM_MAX 0 #define DSFX_I3DL2REVERB_ROOM_DEFAULT (-1000) #define DSFX_I3DL2REVERB_ROOMHF_MIN (-10000) #define DSFX_I3DL2REVERB_ROOMHF_MAX 0 #define DSFX_I3DL2REVERB_ROOMHF_DEFAULT (-100) #define DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MIN 0.0f #define DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MAX 10.0f #define DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_DEFAULT 0.0f #define DSFX_I3DL2REVERB_DECAYTIME_MIN 0.1f #define DSFX_I3DL2REVERB_DECAYTIME_MAX 20.0f #define DSFX_I3DL2REVERB_DECAYTIME_DEFAULT 1.49f #define DSFX_I3DL2REVERB_DECAYHFRATIO_MIN 0.1f #define DSFX_I3DL2REVERB_DECAYHFRATIO_MAX 2.0f #define DSFX_I3DL2REVERB_DECAYHFRATIO_DEFAULT 0.83f #define DSFX_I3DL2REVERB_REFLECTIONS_MIN (-10000) #define DSFX_I3DL2REVERB_REFLECTIONS_MAX 1000 #define DSFX_I3DL2REVERB_REFLECTIONS_DEFAULT (-2602) #define DSFX_I3DL2REVERB_REFLECTIONSDELAY_MIN 0.0f #define DSFX_I3DL2REVERB_REFLECTIONSDELAY_MAX 0.3f #define DSFX_I3DL2REVERB_REFLECTIONSDELAY_DEFAULT 0.007f #define DSFX_I3DL2REVERB_REVERB_MIN (-10000) #define DSFX_I3DL2REVERB_REVERB_MAX 2000 #define DSFX_I3DL2REVERB_REVERB_DEFAULT (200) #define DSFX_I3DL2REVERB_REVERBDELAY_MIN 0.0f #define DSFX_I3DL2REVERB_REVERBDELAY_MAX 0.1f #define DSFX_I3DL2REVERB_REVERBDELAY_DEFAULT 0.011f #define DSFX_I3DL2REVERB_DIFFUSION_MIN 0.0f #define DSFX_I3DL2REVERB_DIFFUSION_MAX 100.0f #define DSFX_I3DL2REVERB_DIFFUSION_DEFAULT 100.0f #define DSFX_I3DL2REVERB_DENSITY_MIN 0.0f #define DSFX_I3DL2REVERB_DENSITY_MAX 100.0f #define DSFX_I3DL2REVERB_DENSITY_DEFAULT 100.0f #define DSFX_I3DL2REVERB_HFREFERENCE_MIN 20.0f #define DSFX_I3DL2REVERB_HFREFERENCE_MAX 20000.0f #define DSFX_I3DL2REVERB_HFREFERENCE_DEFAULT 5000.0f #define DSFX_I3DL2REVERB_QUALITY_MIN 0 #define DSFX_I3DL2REVERB_QUALITY_MAX 3 #define DSFX_I3DL2REVERB_QUALITY_DEFAULT 2 #undef INTERFACE #define INTERFACE IDirectSoundFXI3DL2Reverb DECLARE_INTERFACE_(IDirectSoundFXI3DL2Reverb, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundFXI3DL2Reverb methods STDMETHOD(SetAllParameters) (THIS_ LPCDSFXI3DL2Reverb pcDsFxI3DL2Reverb) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSFXI3DL2Reverb pDsFxI3DL2Reverb) PURE; STDMETHOD(SetPreset) (THIS_ DWORD dwPreset) PURE; STDMETHOD(GetPreset) (THIS_ LPDWORD pdwPreset) PURE; STDMETHOD(SetQuality) (THIS_ LONG lQuality) PURE; STDMETHOD(GetQuality) (THIS_ LONG *plQuality) PURE; }; #define IDirectSoundFXI3DL2Reverb_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundFXI3DL2Reverb_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundFXI3DL2Reverb_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXI3DL2Reverb_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundFXI3DL2Reverb_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #define IDirectSoundFXI3DL2Reverb_SetPreset(p,a) (p)->lpVtbl->SetPreset(p,a) #define IDirectSoundFXI3DL2Reverb_GetPreset(p,a) (p)->lpVtbl->GetPreset(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXI3DL2Reverb_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundFXI3DL2Reverb_GetAllParameters(p,a) (p)->GetAllParameters(a) #define IDirectSoundFXI3DL2Reverb_SetPreset(p,a) (p)->SetPreset(a) #define IDirectSoundFXI3DL2Reverb_GetPreset(p,a) (p)->GetPreset(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundFXWavesReverb // DEFINE_GUID(IID_IDirectSoundFXWavesReverb,0x46858c3a,0x0dc6,0x45e3,0xb7,0x60,0xd4,0xee,0xf1,0x6c,0xb3,0x25); typedef struct _DSFXWavesReverb { FLOAT fInGain; // [-96.0,0.0] default: 0.0 dB FLOAT fReverbMix; // [-96.0,0.0] default: 0.0 db FLOAT fReverbTime; // [0.001,3000.0] default: 1000.0 ms FLOAT fHighFreqRTRatio; // [0.001,0.999] default: 0.001 } DSFXWavesReverb, *LPDSFXWavesReverb; typedef const DSFXWavesReverb *LPCDSFXWavesReverb; #define DSFX_WAVESREVERB_INGAIN_MIN -96.0f #define DSFX_WAVESREVERB_INGAIN_MAX 0.0f #define DSFX_WAVESREVERB_INGAIN_DEFAULT 0.0f #define DSFX_WAVESREVERB_REVERBMIX_MIN -96.0f #define DSFX_WAVESREVERB_REVERBMIX_MAX 0.0f #define DSFX_WAVESREVERB_REVERBMIX_DEFAULT 0.0f #define DSFX_WAVESREVERB_REVERBTIME_MIN 0.001f #define DSFX_WAVESREVERB_REVERBTIME_MAX 3000.0f #define DSFX_WAVESREVERB_REVERBTIME_DEFAULT 1000.0f #define DSFX_WAVESREVERB_HIGHFREQRTRATIO_MIN 0.001f #define DSFX_WAVESREVERB_HIGHFREQRTRATIO_MAX 0.999f #define DSFX_WAVESREVERB_HIGHFREQRTRATIO_DEFAULT 0.001f #undef INTERFACE #define INTERFACE IDirectSoundFXWavesReverb DECLARE_INTERFACE_(IDirectSoundFXWavesReverb, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundFXWavesReverb methods STDMETHOD(SetAllParameters) (THIS_ LPCDSFXWavesReverb pcDsFxWavesReverb) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSFXWavesReverb pDsFxWavesReverb) PURE; }; #define IDirectSoundFXWavesReverb_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundFXWavesReverb_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundFXWavesReverb_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXWavesReverb_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundFXWavesReverb_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFXWavesReverb_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundFXWavesReverb_GetAllParameters(p,a) (p)->GetAllParameters(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundCaptureFXAec // DEFINE_GUID(IID_IDirectSoundCaptureFXAec, 0xad74143d, 0x903d, 0x4ab7, 0x80, 0x66, 0x28, 0xd3, 0x63, 0x03, 0x6d, 0x65); typedef struct _DSCFXAec { BOOL fEnable; BOOL fNoiseFill; DWORD dwMode; } DSCFXAec, *LPDSCFXAec; typedef const DSCFXAec *LPCDSCFXAec; // These match the AEC_MODE_* constants in the DDK's ksmedia.h file #define DSCFX_AEC_MODE_PASS_THROUGH 0x0 #define DSCFX_AEC_MODE_HALF_DUPLEX 0x1 #define DSCFX_AEC_MODE_FULL_DUPLEX 0x2 // These match the AEC_STATUS_* constants in ksmedia.h #define DSCFX_AEC_STATUS_HISTORY_UNINITIALIZED 0x0 #define DSCFX_AEC_STATUS_HISTORY_CONTINUOUSLY_CONVERGED 0x1 #define DSCFX_AEC_STATUS_HISTORY_PREVIOUSLY_DIVERGED 0x2 #define DSCFX_AEC_STATUS_CURRENTLY_CONVERGED 0x8 #undef INTERFACE #define INTERFACE IDirectSoundCaptureFXAec DECLARE_INTERFACE_(IDirectSoundCaptureFXAec, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundCaptureFXAec methods STDMETHOD(SetAllParameters) (THIS_ LPCDSCFXAec pDscFxAec) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSCFXAec pDscFxAec) PURE; STDMETHOD(GetStatus) (THIS_ PDWORD pdwStatus) PURE; STDMETHOD(Reset) (THIS) PURE; }; #define IDirectSoundCaptureFXAec_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundCaptureFXAec_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundCaptureFXAec_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundCaptureFXAec_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundCaptureFXAec_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundCaptureFXAec_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundCaptureFXAec_GetAllParameters(p,a) (p)->GetAllParameters(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundCaptureFXNoiseSuppress // DEFINE_GUID(IID_IDirectSoundCaptureFXNoiseSuppress, 0xed311e41, 0xfbae, 0x4175, 0x96, 0x25, 0xcd, 0x8, 0x54, 0xf6, 0x93, 0xca); typedef struct _DSCFXNoiseSuppress { BOOL fEnable; } DSCFXNoiseSuppress, *LPDSCFXNoiseSuppress; typedef const DSCFXNoiseSuppress *LPCDSCFXNoiseSuppress; #undef INTERFACE #define INTERFACE IDirectSoundCaptureFXNoiseSuppress DECLARE_INTERFACE_(IDirectSoundCaptureFXNoiseSuppress, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundCaptureFXNoiseSuppress methods STDMETHOD(SetAllParameters) (THIS_ LPCDSCFXNoiseSuppress pcDscFxNoiseSuppress) PURE; STDMETHOD(GetAllParameters) (THIS_ LPDSCFXNoiseSuppress pDscFxNoiseSuppress) PURE; STDMETHOD(Reset) (THIS) PURE; }; #define IDirectSoundCaptureFXNoiseSuppress_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundCaptureFXNoiseSuppress_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundCaptureFXNoiseSuppress_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundCaptureFXNoiseSuppress_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) #define IDirectSoundCaptureFXNoiseSuppress_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundCaptureFXNoiseSuppress_SetAllParameters(p,a) (p)->SetAllParameters(a) #define IDirectSoundCaptureFXNoiseSuppress_GetAllParameters(p,a) (p)->GetAllParameters(a) #endif // !defined(__cplusplus) || defined(CINTERFACE) // // IDirectSoundFullDuplex // #ifndef _IDirectSoundFullDuplex_ #define _IDirectSoundFullDuplex_ #ifdef __cplusplus // 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined struct IDirectSoundFullDuplex; #endif // __cplusplus typedef struct IDirectSoundFullDuplex *LPDIRECTSOUNDFULLDUPLEX; DEFINE_GUID(IID_IDirectSoundFullDuplex, 0xedcb4c7a, 0xdaab, 0x4216, 0xa4, 0x2e, 0x6c, 0x50, 0x59, 0x6d, 0xdc, 0x1d); #undef INTERFACE #define INTERFACE IDirectSoundFullDuplex DECLARE_INTERFACE_(IDirectSoundFullDuplex, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IDirectSoundFullDuplex methods STDMETHOD(Initialize) (THIS_ LPCGUID pCaptureGuid, LPCGUID pRenderGuid, LPCDSCBUFFERDESC lpDscBufferDesc, LPCDSBUFFERDESC lpDsBufferDesc, HWND hWnd, DWORD dwLevel, LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8, LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8) PURE; }; #define IDirectSoundFullDuplex_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) #define IDirectSoundFullDuplex_AddRef(p) IUnknown_AddRef(p) #define IDirectSoundFullDuplex_Release(p) IUnknown_Release(p) #if !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFullDuplex_Initialize(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->Initialize(p,a,b,c,d,e,f,g,h) #else // !defined(__cplusplus) || defined(CINTERFACE) #define IDirectSoundFullDuplex_Initialize(p,a,b,c,d,e,f,g,h) (p)->Initialize(a,b,c,d,e,f,g,h) #endif // !defined(__cplusplus) || defined(CINTERFACE) #endif // _IDirectSoundFullDuplex_ #endif // DIRECTSOUND_VERSION >= 0x0800 // // Return Codes // // The function completed successfully #define DS_OK S_OK // The call succeeded, but we had to substitute the 3D algorithm #define DS_NO_VIRTUALIZATION MAKE_HRESULT(0, _FACDS, 10) // The call failed because resources (such as a priority level) // were already being used by another caller #define DSERR_ALLOCATED MAKE_DSHRESULT(10) // The control (vol, pan, etc.) requested by the caller is not available #define DSERR_CONTROLUNAVAIL MAKE_DSHRESULT(30) // An invalid parameter was passed to the returning function #define DSERR_INVALIDPARAM E_INVALIDARG // This call is not valid for the current state of this object #define DSERR_INVALIDCALL MAKE_DSHRESULT(50) // An undetermined error occurred inside the DirectSound subsystem #define DSERR_GENERIC E_FAIL // The caller does not have the priority level required for the function to // succeed #define DSERR_PRIOLEVELNEEDED MAKE_DSHRESULT(70) // Not enough free memory is available to complete the operation #define DSERR_OUTOFMEMORY E_OUTOFMEMORY // The specified WAVE format is not supported #define DSERR_BADFORMAT MAKE_DSHRESULT(100) // The function called is not supported at this time #define DSERR_UNSUPPORTED E_NOTIMPL // No sound driver is available for use #define DSERR_NODRIVER MAKE_DSHRESULT(120) // This object is already initialized #define DSERR_ALREADYINITIALIZED MAKE_DSHRESULT(130) // This object does not support aggregation #define DSERR_NOAGGREGATION CLASS_E_NOAGGREGATION // The buffer memory has been lost, and must be restored #define DSERR_BUFFERLOST MAKE_DSHRESULT(150) // Another app has a higher priority level, preventing this call from // succeeding #define DSERR_OTHERAPPHASPRIO MAKE_DSHRESULT(160) // This object has not been initialized #define DSERR_UNINITIALIZED MAKE_DSHRESULT(170) // The requested COM interface is not available #define DSERR_NOINTERFACE E_NOINTERFACE // Access is denied #define DSERR_ACCESSDENIED E_ACCESSDENIED // Tried to create a DSBCAPS_CTRLFX buffer shorter than DSBSIZE_FX_MIN milliseconds #define DSERR_BUFFERTOOSMALL MAKE_DSHRESULT(180) // Attempt to use DirectSound 8 functionality on an older DirectSound object #define DSERR_DS8_REQUIRED MAKE_DSHRESULT(190) // A circular loop of send effects was detected #define DSERR_SENDLOOP MAKE_DSHRESULT(200) // The GUID specified in an audiopath file does not match a valid MIXIN buffer #define DSERR_BADSENDBUFFERGUID MAKE_DSHRESULT(210) // The object requested was not found (numerically equal to DMUS_E_NOT_FOUND) #define DSERR_OBJECTNOTFOUND MAKE_DSHRESULT(4449) // The effects requested could not be found on the system, or they were found // but in the wrong order, or in the wrong hardware/software locations. #define DSERR_FXUNAVAILABLE MAKE_DSHRESULT(220) // // Flags // #define DSCAPS_PRIMARYMONO 0x00000001 #define DSCAPS_PRIMARYSTEREO 0x00000002 #define DSCAPS_PRIMARY8BIT 0x00000004 #define DSCAPS_PRIMARY16BIT 0x00000008 #define DSCAPS_CONTINUOUSRATE 0x00000010 #define DSCAPS_EMULDRIVER 0x00000020 #define DSCAPS_CERTIFIED 0x00000040 #define DSCAPS_SECONDARYMONO 0x00000100 #define DSCAPS_SECONDARYSTEREO 0x00000200 #define DSCAPS_SECONDARY8BIT 0x00000400 #define DSCAPS_SECONDARY16BIT 0x00000800 #define DSSCL_NORMAL 0x00000001 #define DSSCL_PRIORITY 0x00000002 #define DSSCL_EXCLUSIVE 0x00000003 #define DSSCL_WRITEPRIMARY 0x00000004 #define DSSPEAKER_DIRECTOUT 0x00000000 #define DSSPEAKER_HEADPHONE 0x00000001 #define DSSPEAKER_MONO 0x00000002 #define DSSPEAKER_QUAD 0x00000003 #define DSSPEAKER_STEREO 0x00000004 #define DSSPEAKER_SURROUND 0x00000005 #define DSSPEAKER_5POINT1 0x00000006 // obsolete 5.1 setting #define DSSPEAKER_7POINT1 0x00000007 // obsolete 7.1 setting #define DSSPEAKER_7POINT1_SURROUND 0x00000008 // correct 7.1 Home Theater setting #define DSSPEAKER_7POINT1_WIDE DSSPEAKER_7POINT1 #if (DIRECTSOUND_VERSION >= 0x1000) #define DSSPEAKER_5POINT1_SURROUND 0x00000009 // correct 5.1 setting #define DSSPEAKER_5POINT1_BACK DSSPEAKER_5POINT1 #endif #define DSSPEAKER_GEOMETRY_MIN 0x00000005 // 5 degrees #define DSSPEAKER_GEOMETRY_NARROW 0x0000000A // 10 degrees #define DSSPEAKER_GEOMETRY_WIDE 0x00000014 // 20 degrees #define DSSPEAKER_GEOMETRY_MAX 0x000000B4 // 180 degrees #define DSSPEAKER_COMBINED(c, g) ((DWORD)(((BYTE)(c)) | ((DWORD)((BYTE)(g))) << 16)) #define DSSPEAKER_CONFIG(a) ((BYTE)(a)) #define DSSPEAKER_GEOMETRY(a) ((BYTE)(((DWORD)(a) >> 16) & 0x00FF)) #define DSBCAPS_PRIMARYBUFFER 0x00000001 #define DSBCAPS_STATIC 0x00000002 #define DSBCAPS_LOCHARDWARE 0x00000004 #define DSBCAPS_LOCSOFTWARE 0x00000008 #define DSBCAPS_CTRL3D 0x00000010 #define DSBCAPS_CTRLFREQUENCY 0x00000020 #define DSBCAPS_CTRLPAN 0x00000040 #define DSBCAPS_CTRLVOLUME 0x00000080 #define DSBCAPS_CTRLPOSITIONNOTIFY 0x00000100 #define DSBCAPS_CTRLFX 0x00000200 #define DSBCAPS_STICKYFOCUS 0x00004000 #define DSBCAPS_GLOBALFOCUS 0x00008000 #define DSBCAPS_GETCURRENTPOSITION2 0x00010000 #define DSBCAPS_MUTE3DATMAXDISTANCE 0x00020000 #define DSBCAPS_LOCDEFER 0x00040000 #if (DIRECTSOUND_VERSION >= 0x1000) // Force GetCurrentPosition() to return a buffer's true play position; // unmodified by aids to enhance backward compatibility. #define DSBCAPS_TRUEPLAYPOSITION 0x00080000 #endif #define DSBPLAY_LOOPING 0x00000001 #define DSBPLAY_LOCHARDWARE 0x00000002 #define DSBPLAY_LOCSOFTWARE 0x00000004 #define DSBPLAY_TERMINATEBY_TIME 0x00000008 #define DSBPLAY_TERMINATEBY_DISTANCE 0x000000010 #define DSBPLAY_TERMINATEBY_PRIORITY 0x000000020 #define DSBSTATUS_PLAYING 0x00000001 #define DSBSTATUS_BUFFERLOST 0x00000002 #define DSBSTATUS_LOOPING 0x00000004 #define DSBSTATUS_LOCHARDWARE 0x00000008 #define DSBSTATUS_LOCSOFTWARE 0x00000010 #define DSBSTATUS_TERMINATED 0x00000020 #define DSBLOCK_FROMWRITECURSOR 0x00000001 #define DSBLOCK_ENTIREBUFFER 0x00000002 #define DSBFREQUENCY_ORIGINAL 0 #define DSBFREQUENCY_MIN 100 #if DIRECTSOUND_VERSION >= 0x0900 #define DSBFREQUENCY_MAX 200000 #else #define DSBFREQUENCY_MAX 100000 #endif #define DSBPAN_LEFT -10000 #define DSBPAN_CENTER 0 #define DSBPAN_RIGHT 10000 #define DSBVOLUME_MIN -10000 #define DSBVOLUME_MAX 0 #define DSBSIZE_MIN 4 #define DSBSIZE_MAX 0x0FFFFFFF #define DSBSIZE_FX_MIN 150 // NOTE: Milliseconds, not bytes #define DSBNOTIFICATIONS_MAX 100000UL #define DS3DMODE_NORMAL 0x00000000 #define DS3DMODE_HEADRELATIVE 0x00000001 #define DS3DMODE_DISABLE 0x00000002 #define DS3D_IMMEDIATE 0x00000000 #define DS3D_DEFERRED 0x00000001 #define DS3D_MINDISTANCEFACTOR FLT_MIN #define DS3D_MAXDISTANCEFACTOR FLT_MAX #define DS3D_DEFAULTDISTANCEFACTOR 1.0f #define DS3D_MINROLLOFFFACTOR 0.0f #define DS3D_MAXROLLOFFFACTOR 10.0f #define DS3D_DEFAULTROLLOFFFACTOR 1.0f #define DS3D_MINDOPPLERFACTOR 0.0f #define DS3D_MAXDOPPLERFACTOR 10.0f #define DS3D_DEFAULTDOPPLERFACTOR 1.0f #define DS3D_DEFAULTMINDISTANCE 1.0f #define DS3D_DEFAULTMAXDISTANCE 1000000000.0f #define DS3D_MINCONEANGLE 0 #define DS3D_MAXCONEANGLE 360 #define DS3D_DEFAULTCONEANGLE 360 #define DS3D_DEFAULTCONEOUTSIDEVOLUME DSBVOLUME_MAX // IDirectSoundCapture attributes #define DSCCAPS_EMULDRIVER DSCAPS_EMULDRIVER #define DSCCAPS_CERTIFIED DSCAPS_CERTIFIED #define DSCCAPS_MULTIPLECAPTURE 0x00000001 // IDirectSoundCaptureBuffer attributes #define DSCBCAPS_WAVEMAPPED 0x80000000 #if DIRECTSOUND_VERSION >= 0x0800 #define DSCBCAPS_CTRLFX 0x00000200 #endif #define DSCBLOCK_ENTIREBUFFER 0x00000001 #define DSCBSTATUS_CAPTURING 0x00000001 #define DSCBSTATUS_LOOPING 0x00000002 #define DSCBSTART_LOOPING 0x00000001 #define DSBPN_OFFSETSTOP 0xFFFFFFFF #define DS_CERTIFIED 0x00000000 #define DS_UNCERTIFIED 0x00000001 // // Flags for the I3DL2 effects // // // I3DL2 Material Presets // enum { DSFX_I3DL2_MATERIAL_PRESET_SINGLEWINDOW, DSFX_I3DL2_MATERIAL_PRESET_DOUBLEWINDOW, DSFX_I3DL2_MATERIAL_PRESET_THINDOOR, DSFX_I3DL2_MATERIAL_PRESET_THICKDOOR, DSFX_I3DL2_MATERIAL_PRESET_WOODWALL, DSFX_I3DL2_MATERIAL_PRESET_BRICKWALL, DSFX_I3DL2_MATERIAL_PRESET_STONEWALL, DSFX_I3DL2_MATERIAL_PRESET_CURTAIN }; #define I3DL2_MATERIAL_PRESET_SINGLEWINDOW -2800,0.71f #define I3DL2_MATERIAL_PRESET_DOUBLEWINDOW -5000,0.40f #define I3DL2_MATERIAL_PRESET_THINDOOR -1800,0.66f #define I3DL2_MATERIAL_PRESET_THICKDOOR -4400,0.64f #define I3DL2_MATERIAL_PRESET_WOODWALL -4000,0.50f #define I3DL2_MATERIAL_PRESET_BRICKWALL -5000,0.60f #define I3DL2_MATERIAL_PRESET_STONEWALL -6000,0.68f #define I3DL2_MATERIAL_PRESET_CURTAIN -1200,0.15f enum { DSFX_I3DL2_ENVIRONMENT_PRESET_DEFAULT, DSFX_I3DL2_ENVIRONMENT_PRESET_GENERIC, DSFX_I3DL2_ENVIRONMENT_PRESET_PADDEDCELL, DSFX_I3DL2_ENVIRONMENT_PRESET_ROOM, DSFX_I3DL2_ENVIRONMENT_PRESET_BATHROOM, DSFX_I3DL2_ENVIRONMENT_PRESET_LIVINGROOM, DSFX_I3DL2_ENVIRONMENT_PRESET_STONEROOM, DSFX_I3DL2_ENVIRONMENT_PRESET_AUDITORIUM, DSFX_I3DL2_ENVIRONMENT_PRESET_CONCERTHALL, DSFX_I3DL2_ENVIRONMENT_PRESET_CAVE, DSFX_I3DL2_ENVIRONMENT_PRESET_ARENA, DSFX_I3DL2_ENVIRONMENT_PRESET_HANGAR, DSFX_I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY, DSFX_I3DL2_ENVIRONMENT_PRESET_HALLWAY, DSFX_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR, DSFX_I3DL2_ENVIRONMENT_PRESET_ALLEY, DSFX_I3DL2_ENVIRONMENT_PRESET_FOREST, DSFX_I3DL2_ENVIRONMENT_PRESET_CITY, DSFX_I3DL2_ENVIRONMENT_PRESET_MOUNTAINS, DSFX_I3DL2_ENVIRONMENT_PRESET_QUARRY, DSFX_I3DL2_ENVIRONMENT_PRESET_PLAIN, DSFX_I3DL2_ENVIRONMENT_PRESET_PARKINGLOT, DSFX_I3DL2_ENVIRONMENT_PRESET_SEWERPIPE, DSFX_I3DL2_ENVIRONMENT_PRESET_UNDERWATER, DSFX_I3DL2_ENVIRONMENT_PRESET_SMALLROOM, DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM, DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEROOM, DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL, DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEHALL, DSFX_I3DL2_ENVIRONMENT_PRESET_PLATE }; // // I3DL2 Reverberation Presets Values // #define I3DL2_ENVIRONMENT_PRESET_DEFAULT -1000, -100, 0.0f, 1.49f, 0.83f, -2602, 0.007f, 200, 0.011f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_GENERIC -1000, -100, 0.0f, 1.49f, 0.83f, -2602, 0.007f, 200, 0.011f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_PADDEDCELL -1000,-6000, 0.0f, 0.17f, 0.10f, -1204, 0.001f, 207, 0.002f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_ROOM -1000, -454, 0.0f, 0.40f, 0.83f, -1646, 0.002f, 53, 0.003f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_BATHROOM -1000,-1200, 0.0f, 1.49f, 0.54f, -370, 0.007f, 1030, 0.011f, 100.0f, 60.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_LIVINGROOM -1000,-6000, 0.0f, 0.50f, 0.10f, -1376, 0.003f, -1104, 0.004f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_STONEROOM -1000, -300, 0.0f, 2.31f, 0.64f, -711, 0.012f, 83, 0.017f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_AUDITORIUM -1000, -476, 0.0f, 4.32f, 0.59f, -789, 0.020f, -289, 0.030f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_CONCERTHALL -1000, -500, 0.0f, 3.92f, 0.70f, -1230, 0.020f, -2, 0.029f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_CAVE -1000, 0, 0.0f, 2.91f, 1.30f, -602, 0.015f, -302, 0.022f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_ARENA -1000, -698, 0.0f, 7.24f, 0.33f, -1166, 0.020f, 16, 0.030f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_HANGAR -1000,-1000, 0.0f,10.05f, 0.23f, -602, 0.020f, 198, 0.030f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY -1000,-4000, 0.0f, 0.30f, 0.10f, -1831, 0.002f, -1630, 0.030f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_HALLWAY -1000, -300, 0.0f, 1.49f, 0.59f, -1219, 0.007f, 441, 0.011f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR -1000, -237, 0.0f, 2.70f, 0.79f, -1214, 0.013f, 395, 0.020f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_ALLEY -1000, -270, 0.0f, 1.49f, 0.86f, -1204, 0.007f, -4, 0.011f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_FOREST -1000,-3300, 0.0f, 1.49f, 0.54f, -2560, 0.162f, -613, 0.088f, 79.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_CITY -1000, -800, 0.0f, 1.49f, 0.67f, -2273, 0.007f, -2217, 0.011f, 50.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_MOUNTAINS -1000,-2500, 0.0f, 1.49f, 0.21f, -2780, 0.300f, -2014, 0.100f, 27.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_QUARRY -1000,-1000, 0.0f, 1.49f, 0.83f,-10000, 0.061f, 500, 0.025f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_PLAIN -1000,-2000, 0.0f, 1.49f, 0.50f, -2466, 0.179f, -2514, 0.100f, 21.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_PARKINGLOT -1000, 0, 0.0f, 1.65f, 1.50f, -1363, 0.008f, -1153, 0.012f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_SEWERPIPE -1000,-1000, 0.0f, 2.81f, 0.14f, 429, 0.014f, 648, 0.021f, 80.0f, 60.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_UNDERWATER -1000,-4000, 0.0f, 1.49f, 0.10f, -449, 0.007f, 1700, 0.011f, 100.0f, 100.0f, 5000.0f // // Examples simulating 'musical' reverb presets // // Name Decay time Description // Small Room 1.1s A small size room with a length of 5m or so. // Medium Room 1.3s A medium size room with a length of 10m or so. // Large Room 1.5s A large size room suitable for live performances. // Medium Hall 1.8s A medium size concert hall. // Large Hall 1.8s A large size concert hall suitable for a full orchestra. // Plate 1.3s A plate reverb simulation. // #define I3DL2_ENVIRONMENT_PRESET_SMALLROOM -1000, -600, 0.0f, 1.10f, 0.83f, -400, 0.005f, 500, 0.010f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM -1000, -600, 0.0f, 1.30f, 0.83f, -1000, 0.010f, -200, 0.020f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_LARGEROOM -1000, -600, 0.0f, 1.50f, 0.83f, -1600, 0.020f, -1000, 0.040f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL -1000, -600, 0.0f, 1.80f, 0.70f, -1300, 0.015f, -800, 0.030f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_LARGEHALL -1000, -600, 0.0f, 1.80f, 0.70f, -2000, 0.030f, -1400, 0.060f, 100.0f, 100.0f, 5000.0f #define I3DL2_ENVIRONMENT_PRESET_PLATE -1000, -200, 0.0f, 1.30f, 0.90f, 0, 0.002f, 0, 0.010f, 100.0f, 75.0f, 5000.0f // // DirectSound3D Algorithms // // Default DirectSound3D algorithm {00000000-0000-0000-0000-000000000000} #define DS3DALG_DEFAULT GUID_NULL // No virtualization (Pan3D) {C241333F-1C1B-11d2-94F5-00C04FC28ACA} DEFINE_GUID(DS3DALG_NO_VIRTUALIZATION, 0xc241333f, 0x1c1b, 0x11d2, 0x94, 0xf5, 0x0, 0xc0, 0x4f, 0xc2, 0x8a, 0xca); // High-quality HRTF algorithm {C2413340-1C1B-11d2-94F5-00C04FC28ACA} DEFINE_GUID(DS3DALG_HRTF_FULL, 0xc2413340, 0x1c1b, 0x11d2, 0x94, 0xf5, 0x0, 0xc0, 0x4f, 0xc2, 0x8a, 0xca); // Lower-quality HRTF algorithm {C2413342-1C1B-11d2-94F5-00C04FC28ACA} DEFINE_GUID(DS3DALG_HRTF_LIGHT, 0xc2413342, 0x1c1b, 0x11d2, 0x94, 0xf5, 0x0, 0xc0, 0x4f, 0xc2, 0x8a, 0xca); #if DIRECTSOUND_VERSION >= 0x0800 // // DirectSound Internal Effect Algorithms // // Gargle {DAFD8210-5711-4B91-9FE3-F75B7AE279BF} DEFINE_GUID(GUID_DSFX_STANDARD_GARGLE, 0xdafd8210, 0x5711, 0x4b91, 0x9f, 0xe3, 0xf7, 0x5b, 0x7a, 0xe2, 0x79, 0xbf); // Chorus {EFE6629C-81F7-4281-BD91-C9D604A95AF6} DEFINE_GUID(GUID_DSFX_STANDARD_CHORUS, 0xefe6629c, 0x81f7, 0x4281, 0xbd, 0x91, 0xc9, 0xd6, 0x04, 0xa9, 0x5a, 0xf6); // Flanger {EFCA3D92-DFD8-4672-A603-7420894BAD98} DEFINE_GUID(GUID_DSFX_STANDARD_FLANGER, 0xefca3d92, 0xdfd8, 0x4672, 0xa6, 0x03, 0x74, 0x20, 0x89, 0x4b, 0xad, 0x98); // Echo/Delay {EF3E932C-D40B-4F51-8CCF-3F98F1B29D5D} DEFINE_GUID(GUID_DSFX_STANDARD_ECHO, 0xef3e932c, 0xd40b, 0x4f51, 0x8c, 0xcf, 0x3f, 0x98, 0xf1, 0xb2, 0x9d, 0x5d); // Distortion {EF114C90-CD1D-484E-96E5-09CFAF912A21} DEFINE_GUID(GUID_DSFX_STANDARD_DISTORTION, 0xef114c90, 0xcd1d, 0x484e, 0x96, 0xe5, 0x09, 0xcf, 0xaf, 0x91, 0x2a, 0x21); // Compressor/Limiter {EF011F79-4000-406D-87AF-BFFB3FC39D57} DEFINE_GUID(GUID_DSFX_STANDARD_COMPRESSOR, 0xef011f79, 0x4000, 0x406d, 0x87, 0xaf, 0xbf, 0xfb, 0x3f, 0xc3, 0x9d, 0x57); // Parametric Equalization {120CED89-3BF4-4173-A132-3CB406CF3231} DEFINE_GUID(GUID_DSFX_STANDARD_PARAMEQ, 0x120ced89, 0x3bf4, 0x4173, 0xa1, 0x32, 0x3c, 0xb4, 0x06, 0xcf, 0x32, 0x31); // I3DL2 Environmental Reverberation: Reverb (Listener) Effect {EF985E71-D5C7-42D4-BA4D-2D073E2E96F4} DEFINE_GUID(GUID_DSFX_STANDARD_I3DL2REVERB, 0xef985e71, 0xd5c7, 0x42d4, 0xba, 0x4d, 0x2d, 0x07, 0x3e, 0x2e, 0x96, 0xf4); // Waves Reverberation {87FC0268-9A55-4360-95AA-004A1D9DE26C} DEFINE_GUID(GUID_DSFX_WAVES_REVERB, 0x87fc0268, 0x9a55, 0x4360, 0x95, 0xaa, 0x00, 0x4a, 0x1d, 0x9d, 0xe2, 0x6c); // // DirectSound Capture Effect Algorithms // // Acoustic Echo Canceller {BF963D80-C559-11D0-8A2B-00A0C9255AC1} // Matches KSNODETYPE_ACOUSTIC_ECHO_CANCEL in ksmedia.h DEFINE_GUID(GUID_DSCFX_CLASS_AEC, 0xBF963D80L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1); // Microsoft AEC {CDEBB919-379A-488a-8765-F53CFD36DE40} DEFINE_GUID(GUID_DSCFX_MS_AEC, 0xcdebb919, 0x379a, 0x488a, 0x87, 0x65, 0xf5, 0x3c, 0xfd, 0x36, 0xde, 0x40); // System AEC {1C22C56D-9879-4f5b-A389-27996DDC2810} DEFINE_GUID(GUID_DSCFX_SYSTEM_AEC, 0x1c22c56d, 0x9879, 0x4f5b, 0xa3, 0x89, 0x27, 0x99, 0x6d, 0xdc, 0x28, 0x10); // Noise Supression {E07F903F-62FD-4e60-8CDD-DEA7236665B5} // Matches KSNODETYPE_NOISE_SUPPRESS in post Windows ME DDK's ksmedia.h DEFINE_GUID(GUID_DSCFX_CLASS_NS, 0xe07f903f, 0x62fd, 0x4e60, 0x8c, 0xdd, 0xde, 0xa7, 0x23, 0x66, 0x65, 0xb5); // Microsoft Noise Suppresion {11C5C73B-66E9-4ba1-A0BA-E814C6EED92D} DEFINE_GUID(GUID_DSCFX_MS_NS, 0x11c5c73b, 0x66e9, 0x4ba1, 0xa0, 0xba, 0xe8, 0x14, 0xc6, 0xee, 0xd9, 0x2d); // System Noise Suppresion {5AB0882E-7274-4516-877D-4EEE99BA4FD0} DEFINE_GUID(GUID_DSCFX_SYSTEM_NS, 0x5ab0882e, 0x7274, 0x4516, 0x87, 0x7d, 0x4e, 0xee, 0x99, 0xba, 0x4f, 0xd0); #endif // DIRECTSOUND_VERSION >= 0x0800 #endif // __DSOUND_INCLUDED__ #ifdef __cplusplus }; #endif // __cplusplus stk-4.5.0/src/include/FunctionDiscoveryKeys_devpkey.h0000644000076600007660000004436212327014024020567 0ustar gary#pragma once /*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: devpkey.h Abstract: Defines property keys for the Plug and Play Device Property API. Author: Jim Cavalaris (jamesca) 10-14-2003 Environment: User-mode only. Revision History: 14-October-2003 jamesca Creation and initial implementation. 20-June-2006 dougb Copied Jim's version replaced "DEFINE_DEVPROPKEY(DEVPKEY_" with "DEFINE_PROPERTYKEY(PKEY_" --*/ //#include // // _NAME // DEFINE_PROPERTYKEY(PKEY_NAME, 0xb725f130, 0x47ef, 0x101a, 0xa5, 0xf1, 0x02, 0x60, 0x8c, 0x9e, 0xeb, 0xac, 10); // DEVPROP_TYPE_STRING // // Device properties // These PKEYs correspond to the old setupapi SPDRP_XXX properties // DEFINE_PROPERTYKEY(PKEY_Device_DeviceDesc, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 2); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_HardwareIds, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 3); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_CompatibleIds, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 4); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_Service, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 6); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_Class, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 9); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_ClassGuid, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 10); // DEVPROP_TYPE_GUID DEFINE_PROPERTYKEY(PKEY_Device_Driver, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 11); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_ConfigFlags, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 12); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_Manufacturer, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 13); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_LocationInfo, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 15); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_PDOName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 16); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_Capabilities, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 17); // DEVPROP_TYPE_UNINT32 DEFINE_PROPERTYKEY(PKEY_Device_UINumber, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 18); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_UpperFilters, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 19); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_LowerFilters, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 20); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_BusTypeGuid, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 21); // DEVPROP_TYPE_GUID DEFINE_PROPERTYKEY(PKEY_Device_LegacyBusType, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 22); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_BusNumber, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 23); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_EnumeratorName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 24); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_Security, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 25); // DEVPROP_TYPE_SECURITY_DESCRIPTOR DEFINE_PROPERTYKEY(PKEY_Device_SecuritySDS, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 26); // DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING DEFINE_PROPERTYKEY(PKEY_Device_DevType, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 27); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_Exclusive, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 28); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_Characteristics, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 29); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_Address, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 30); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_UINumberDescFormat, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 31); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_PowerData, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 32); // DEVPROP_TYPE_BINARY DEFINE_PROPERTYKEY(PKEY_Device_RemovalPolicy, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 33); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_RemovalPolicyDefault, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 34); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_RemovalPolicyOverride, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 35); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_InstallState, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 36); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_LocationPaths, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 37); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_BaseContainerId, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 38); // DEVPROP_TYPE_GUID // // Device properties // These PKEYs correspond to a device's status and problem code // DEFINE_PROPERTYKEY(PKEY_Device_DevNodeStatus, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 2); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_ProblemCode, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 3); // DEVPROP_TYPE_UINT32 // // Device properties // These PKEYs correspond to device relations // DEFINE_PROPERTYKEY(PKEY_Device_EjectionRelations, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 4); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_RemovalRelations, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 5); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_PowerRelations, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 6); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_BusRelations, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 7); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_Parent, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 8); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_Children, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 9); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_Siblings, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 10); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_TransportRelations, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 11); // DEVPROP_TYPE_STRING_LIST // // Other Device properties // DEFINE_PROPERTYKEY(PKEY_Device_Reported, 0x80497100, 0x8c73, 0x48b9, 0xaa, 0xd9, 0xce, 0x38, 0x7e, 0x19, 0xc5, 0x6e, 2); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_Device_Legacy, 0x80497100, 0x8c73, 0x48b9, 0xaa, 0xd9, 0xce, 0x38, 0x7e, 0x19, 0xc5, 0x6e, 3); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_Device_InstanceId, 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 256); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_ContainerId, 0x8c7ed206, 0x3f8a, 0x4827, 0xb3, 0xab, 0xae, 0x9e, 0x1f, 0xae, 0xfc, 0x6c, 2); // DEVPROP_TYPE_GUID DEFINE_PROPERTYKEY(PKEY_Device_ModelId, 0x80d81ea6, 0x7473, 0x4b0c, 0x82, 0x16, 0xef, 0xc1, 0x1a, 0x2c, 0x4c, 0x8b, 2); // DEVPROP_TYPE_GUID DEFINE_PROPERTYKEY(PKEY_Device_FriendlyNameAttributes, 0x80d81ea6, 0x7473, 0x4b0c, 0x82, 0x16, 0xef, 0xc1, 0x1a, 0x2c, 0x4c, 0x8b, 3); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_ManufacturerAttributes, 0x80d81ea6, 0x7473, 0x4b0c, 0x82, 0x16, 0xef, 0xc1, 0x1a, 0x2c, 0x4c, 0x8b, 4); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_PresenceNotForDevice, 0x80d81ea6, 0x7473, 0x4b0c, 0x82, 0x16, 0xef, 0xc1, 0x1a, 0x2c, 0x4c, 0x8b, 5); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_Numa_Proximity_Domain, 0x540b947e, 0x8b40, 0x45bc, 0xa8, 0xa2, 0x6a, 0x0b, 0x89, 0x4c, 0xbd, 0xa2, 1); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_DHP_Rebalance_Policy, 0x540b947e, 0x8b40, 0x45bc, 0xa8, 0xa2, 0x6a, 0x0b, 0x89, 0x4c, 0xbd, 0xa2, 2); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_Numa_Node, 0x540b947e, 0x8b40, 0x45bc, 0xa8, 0xa2, 0x6a, 0x0b, 0x89, 0x4c, 0xbd, 0xa2, 3); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_BusReportedDeviceDesc, 0x540b947e, 0x8b40, 0x45bc, 0xa8, 0xa2, 0x6a, 0x0b, 0x89, 0x4c, 0xbd, 0xa2, 4); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_InstallInProgress, 0x83da6326, 0x97a6, 0x4088, 0x94, 0x53, 0xa1, 0x92, 0x3f, 0x57, 0x3b, 0x29, 9); // DEVPROP_TYPE_BOOLEAN // // Device driver properties // DEFINE_PROPERTYKEY(PKEY_Device_DriverDate, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 2); // DEVPROP_TYPE_FILETIME DEFINE_PROPERTYKEY(PKEY_Device_DriverVersion, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 3); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_DriverDesc, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 4); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_DriverInfPath, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 5); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_DriverInfSection, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 6); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_DriverInfSectionExt, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 7); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_MatchingDeviceId, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 8); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_DriverProvider, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 9); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_DriverPropPageProvider, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 10); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_DriverCoInstallers, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 11); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_Device_ResourcePickerTags, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 12); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_ResourcePickerExceptions, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 13); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_DriverRank, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 14); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_DriverLogoLevel, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 15); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_Device_NoConnectSound, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 17); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_Device_GenericDriverInstalled, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 18); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_Device_AdditionalSoftwareRequested, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 19);// DEVPROP_TYPE_BOOLEAN // // Device safe-removal properties // DEFINE_PROPERTYKEY(PKEY_Device_SafeRemovalRequired, 0xafd97640, 0x86a3, 0x4210, 0xb6, 0x7c, 0x28, 0x9c, 0x41, 0xaa, 0xbe, 0x55, 2); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_Device_SafeRemovalRequiredOverride, 0xafd97640, 0x86a3, 0x4210, 0xb6, 0x7c, 0x28, 0x9c, 0x41, 0xaa, 0xbe, 0x55, 3);// DEVPROP_TYPE_BOOLEAN // // Device properties that were set by the driver package that was installed // on the device. // DEFINE_PROPERTYKEY(PKEY_DrvPkg_Model, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 2); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DrvPkg_VendorWebSite, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 3); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DrvPkg_DetailedDescription, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 4); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DrvPkg_DocumentationLink, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 5); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DrvPkg_Icon, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 6); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_DrvPkg_BrandingIcon, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 7); // DEVPROP_TYPE_STRING_LIST // // Device setup class properties // These PKEYs correspond to the old setupapi SPCRP_XXX properties // DEFINE_PROPERTYKEY(PKEY_DeviceClass_UpperFilters, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 19); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_DeviceClass_LowerFilters, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 20); // DEVPROP_TYPE_STRING_LIST DEFINE_PROPERTYKEY(PKEY_DeviceClass_Security, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 25); // DEVPROP_TYPE_SECURITY_DESCRIPTOR DEFINE_PROPERTYKEY(PKEY_DeviceClass_SecuritySDS, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 26); // DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING DEFINE_PROPERTYKEY(PKEY_DeviceClass_DevType, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 27); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_DeviceClass_Exclusive, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 28); // DEVPROP_TYPE_UINT32 DEFINE_PROPERTYKEY(PKEY_DeviceClass_Characteristics, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 29); // DEVPROP_TYPE_UINT32 // // Device setup class properties // These PKEYs correspond to registry values under the device class GUID key // DEFINE_PROPERTYKEY(PKEY_DeviceClass_Name, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 2); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DeviceClass_ClassName, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 3); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DeviceClass_Icon, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 4); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DeviceClass_ClassInstaller, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 5); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DeviceClass_PropPageProvider, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 6); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DeviceClass_NoInstallClass, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 7); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_DeviceClass_NoDisplayClass, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 8); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_DeviceClass_SilentInstall, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 9); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_DeviceClass_NoUseClass, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 10); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_DeviceClass_DefaultService, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 11); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DeviceClass_IconPath, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 12); // DEVPROP_TYPE_STRING_LIST // // Other Device setup class properties // DEFINE_PROPERTYKEY(PKEY_DeviceClass_ClassCoInstallers, 0x713d1703, 0xa2e2, 0x49f5, 0x92, 0x14, 0x56, 0x47, 0x2e, 0xf3, 0xda, 0x5c, 2); // DEVPROP_TYPE_STRING_LIST // // Device interface properties // DEFINE_PROPERTYKEY(PKEY_DeviceInterface_FriendlyName, 0x026e516e, 0xb814, 0x414b, 0x83, 0xcd, 0x85, 0x6d, 0x6f, 0xef, 0x48, 0x22, 2); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_DeviceInterface_Enabled, 0x026e516e, 0xb814, 0x414b, 0x83, 0xcd, 0x85, 0x6d, 0x6f, 0xef, 0x48, 0x22, 3); // DEVPROP_TYPE_BOOLEAN DEFINE_PROPERTYKEY(PKEY_DeviceInterface_ClassGuid, 0x026e516e, 0xb814, 0x414b, 0x83, 0xcd, 0x85, 0x6d, 0x6f, 0xef, 0x48, 0x22, 4); // DEVPROP_TYPE_GUID // // Device interface class properties // DEFINE_PROPERTYKEY(PKEY_DeviceInterfaceClass_DefaultInterface, 0x14c83a99, 0x0b3f, 0x44b7, 0xbe, 0x4c, 0xa1, 0x78, 0xd3, 0x99, 0x05, 0x64, 2); // DEVPROP_TYPE_STRING stk-4.5.0/src/include/ginclude.h0000644000076600007660000000117412327014024014313 0ustar gary#ifndef __gInclude__ #define __gInclude__ #if SGI #undef BEOS #undef MAC #undef WINDOWS // #define ASIO_BIG_ENDIAN 1 #define ASIO_CPU_MIPS 1 #elif defined WIN32 #undef BEOS #undef MAC #undef SGI #define WINDOWS 1 #define ASIO_LITTLE_ENDIAN 1 #define ASIO_CPU_X86 1 #elif BEOS #undef MAC #undef SGI #undef WINDOWS #define ASIO_LITTLE_ENDIAN 1 #define ASIO_CPU_X86 1 // #else #define MAC 1 #undef BEOS #undef WINDOWS #undef SGI #define ASIO_BIG_ENDIAN 1 #define ASIO_CPU_PPC 1 #endif // always #define NATIVE_INT64 0 #define IEEE754_64FLOAT 1 #endif // __gInclude__ stk-4.5.0/src/include/iasiodrv.h0000644000076600007660000000306412327014024014341 0ustar gary#include "asiosys.h" #include "asio.h" /* Forward Declarations */ #ifndef __ASIODRIVER_FWD_DEFINED__ #define __ASIODRIVER_FWD_DEFINED__ typedef interface IASIO IASIO; #endif /* __ASIODRIVER_FWD_DEFINED__ */ interface IASIO : public IUnknown { virtual ASIOBool init(void *sysHandle) = 0; virtual void getDriverName(char *name) = 0; virtual long getDriverVersion() = 0; virtual void getErrorMessage(char *string) = 0; virtual ASIOError start() = 0; virtual ASIOError stop() = 0; virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels) = 0; virtual ASIOError getLatencies(long *inputLatency, long *outputLatency) = 0; virtual ASIOError getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity) = 0; virtual ASIOError canSampleRate(ASIOSampleRate sampleRate) = 0; virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate) = 0; virtual ASIOError setSampleRate(ASIOSampleRate sampleRate) = 0; virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources) = 0; virtual ASIOError setClockSource(long reference) = 0; virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) = 0; virtual ASIOError getChannelInfo(ASIOChannelInfo *info) = 0; virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks) = 0; virtual ASIOError disposeBuffers() = 0; virtual ASIOError controlPanel() = 0; virtual ASIOError future(long selector,void *opt) = 0; virtual ASIOError outputReady() = 0; }; stk-4.5.0/src/include/iasiothiscallresolver.cpp0000644000076600007660000005666312327014024017503 0ustar gary/* IASIOThiscallResolver.cpp see the comments in iasiothiscallresolver.h for the top level description - this comment describes the technical details of the implementation. The latest version of this file is available from: http://www.audiomulch.com/~rossb/code/calliasio please email comments to Ross Bencina BACKGROUND The IASIO interface declared in the Steinberg ASIO 2 SDK declares functions with no explicit calling convention. This causes MSVC++ to default to using the thiscall convention, which is a proprietary convention not implemented by some non-microsoft compilers - notably borland BCC, C++Builder, and gcc. MSVC++ is the defacto standard compiler used by Steinberg. As a result of this situation, the ASIO sdk will compile with any compiler, however attempting to execute the compiled code will cause a crash due to different default calling conventions on non-Microsoft compilers. IASIOThiscallResolver solves the problem by providing an adapter class that delegates to the IASIO interface using the correct calling convention (thiscall). Due to the lack of support for thiscall in the Borland and GCC compilers, the calls have been implemented in assembly language. A number of macros are defined for thiscall function calls with different numbers of parameters, with and without return values - it may be possible to modify the format of these macros to make them work with other inline assemblers. THISCALL DEFINITION A number of definitions of the thiscall calling convention are floating around the internet. The following definition has been validated against output from the MSVC++ compiler: For non-vararg functions, thiscall works as follows: the object (this) pointer is passed in ECX. All arguments are passed on the stack in right to left order. The return value is placed in EAX. The callee clears the passed arguments from the stack. FINDING FUNCTION POINTERS FROM AN IASIO POINTER The first field of a COM object is a pointer to its vtble. Thus a pointer to an object implementing the IASIO interface also points to a pointer to that object's vtbl. The vtble is a table of function pointers for all of the virtual functions exposed by the implemented interfaces. If we consider a variable declared as a pointer to IASO: IASIO *theAsioDriver theAsioDriver points to: object implementing IASIO { IASIOvtbl *vtbl other data } in other words, theAsioDriver points to a pointer to an IASIOvtbl vtbl points to a table of function pointers: IASIOvtbl ( interface IASIO : public IUnknown ) { (IUnknown functions) 0 virtual HRESULT STDMETHODCALLTYPE (*QueryInterface)(REFIID riid, void **ppv) = 0; 4 virtual ULONG STDMETHODCALLTYPE (*AddRef)() = 0; 8 virtual ULONG STDMETHODCALLTYPE (*Release)() = 0; (IASIO functions) 12 virtual ASIOBool (*init)(void *sysHandle) = 0; 16 virtual void (*getDriverName)(char *name) = 0; 20 virtual long (*getDriverVersion)() = 0; 24 virtual void (*getErrorMessage)(char *string) = 0; 28 virtual ASIOError (*start)() = 0; 32 virtual ASIOError (*stop)() = 0; 36 virtual ASIOError (*getChannels)(long *numInputChannels, long *numOutputChannels) = 0; 40 virtual ASIOError (*getLatencies)(long *inputLatency, long *outputLatency) = 0; 44 virtual ASIOError (*getBufferSize)(long *minSize, long *maxSize, long *preferredSize, long *granularity) = 0; 48 virtual ASIOError (*canSampleRate)(ASIOSampleRate sampleRate) = 0; 52 virtual ASIOError (*getSampleRate)(ASIOSampleRate *sampleRate) = 0; 56 virtual ASIOError (*setSampleRate)(ASIOSampleRate sampleRate) = 0; 60 virtual ASIOError (*getClockSources)(ASIOClockSource *clocks, long *numSources) = 0; 64 virtual ASIOError (*setClockSource)(long reference) = 0; 68 virtual ASIOError (*getSamplePosition)(ASIOSamples *sPos, ASIOTimeStamp *tStamp) = 0; 72 virtual ASIOError (*getChannelInfo)(ASIOChannelInfo *info) = 0; 76 virtual ASIOError (*createBuffers)(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks) = 0; 80 virtual ASIOError (*disposeBuffers)() = 0; 84 virtual ASIOError (*controlPanel)() = 0; 88 virtual ASIOError (*future)(long selector,void *opt) = 0; 92 virtual ASIOError (*outputReady)() = 0; }; The numbers in the left column show the byte offset of each function ptr from the beginning of the vtbl. These numbers are used in the code below to select different functions. In order to find the address of a particular function, theAsioDriver must first be dereferenced to find the value of the vtbl pointer: mov eax, theAsioDriver mov edx, [theAsioDriver] // edx now points to vtbl[0] Then an offset must be added to the vtbl pointer to select a particular function, for example vtbl+44 points to the slot containing a pointer to the getBufferSize function. Finally vtbl+x must be dereferenced to obtain the value of the function pointer stored in that address: call [edx+44] // call the function pointed to by // the value in the getBufferSize field of the vtbl SEE ALSO Martin Fay's OpenASIO DLL at http://www.martinfay.com solves the same problem by providing a new COM interface which wraps IASIO with an interface that uses portable calling conventions. OpenASIO must be compiled with MSVC, and requires that you ship the OpenASIO DLL with your application. ACKNOWLEDGEMENTS Ross Bencina: worked out the thiscall details above, wrote the original Borland asm macros, and a patch for asio.cpp (which is no longer needed). Thanks to Martin Fay for introducing me to the issues discussed here, and to Rene G. Ceballos for assisting with asm dumps from MSVC++. Antti Silvast: converted the original calliasio to work with gcc and NASM by implementing the asm code in a separate file. Fraser Adams: modified the original calliasio containing the Borland inline asm to add inline asm for gcc i.e. Intel syntax for Borland and AT&T syntax for gcc. This seems a neater approach for gcc than to have a separate .asm file and it means that we only need one version of the thiscall patch. Fraser Adams: rewrote the original calliasio patch in the form of the IASIOThiscallResolver class in order to avoid modifications to files from the Steinberg SDK, which may have had potential licence issues. Andrew Baldwin: contributed fixes for compatibility problems with more recent versions of the gcc assembler. */ // We only need IASIOThiscallResolver at all if we are on Win32. For other // platforms we simply bypass the IASIOThiscallResolver definition to allow us // to be safely #include'd whatever the platform to keep client code portable #if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(_WIN64) // If microsoft compiler we can call IASIO directly so IASIOThiscallResolver // is not used. #if !defined(_MSC_VER) #include #include // We have a mechanism in iasiothiscallresolver.h to ensure that asio.h is // #include'd before it in client code, we do NOT want to do this test here. #define iasiothiscallresolver_sourcefile 1 #include "iasiothiscallresolver.h" #undef iasiothiscallresolver_sourcefile // iasiothiscallresolver.h redefines ASIOInit for clients, but we don't want // this macro defined in this translation unit. #undef ASIOInit // theAsioDriver is a global pointer to the current IASIO instance which the // ASIO SDK uses to perform all actions on the IASIO interface. We substitute // our own forwarding interface into this pointer. extern IASIO* theAsioDriver; // The following macros define the inline assembler for BORLAND first then gcc #if defined(__BCPLUSPLUS__) || defined(__BORLANDC__) #define CALL_THISCALL_0( resultName, thisPtr, funcOffset )\ void *this_ = (thisPtr); \ __asm { \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ mov resultName, eax ; \ } #define CALL_VOID_THISCALL_1( thisPtr, funcOffset, param1 )\ void *this_ = (thisPtr); \ __asm { \ mov eax, param1 ; \ push eax ; \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ } #define CALL_THISCALL_1( resultName, thisPtr, funcOffset, param1 )\ void *this_ = (thisPtr); \ __asm { \ mov eax, param1 ; \ push eax ; \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ mov resultName, eax ; \ } #define CALL_THISCALL_1_DOUBLE( resultName, thisPtr, funcOffset, param1 )\ void *this_ = (thisPtr); \ void *doubleParamPtr_ (¶m1); \ __asm { \ mov eax, doubleParamPtr_ ; \ push [eax+4] ; \ push [eax] ; \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ mov resultName, eax ; \ } #define CALL_THISCALL_2( resultName, thisPtr, funcOffset, param1, param2 )\ void *this_ = (thisPtr); \ __asm { \ mov eax, param2 ; \ push eax ; \ mov eax, param1 ; \ push eax ; \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ mov resultName, eax ; \ } #define CALL_THISCALL_4( resultName, thisPtr, funcOffset, param1, param2, param3, param4 )\ void *this_ = (thisPtr); \ __asm { \ mov eax, param4 ; \ push eax ; \ mov eax, param3 ; \ push eax ; \ mov eax, param2 ; \ push eax ; \ mov eax, param1 ; \ push eax ; \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ mov resultName, eax ; \ } #elif defined(__GNUC__) #define CALL_THISCALL_0( resultName, thisPtr, funcOffset ) \ __asm__ __volatile__ ("movl (%1), %%edx\n\t" \ "call *"#funcOffset"(%%edx)\n\t" \ :"=a"(resultName) /* Output Operands */ \ :"c"(thisPtr) /* Input Operands */ \ : "%edx" /* Clobbered Registers */ \ ); \ #define CALL_VOID_THISCALL_1( thisPtr, funcOffset, param1 ) \ __asm__ __volatile__ ("pushl %0\n\t" \ "movl (%1), %%edx\n\t" \ "call *"#funcOffset"(%%edx)\n\t" \ : /* Output Operands */ \ :"r"(param1), /* Input Operands */ \ "c"(thisPtr) \ : "%edx" /* Clobbered Registers */ \ ); \ #define CALL_THISCALL_1( resultName, thisPtr, funcOffset, param1 ) \ __asm__ __volatile__ ("pushl %1\n\t" \ "movl (%2), %%edx\n\t" \ "call *"#funcOffset"(%%edx)\n\t" \ :"=a"(resultName) /* Output Operands */ \ :"r"(param1), /* Input Operands */ \ "c"(thisPtr) \ : "%edx" /* Clobbered Registers */ \ ); \ #define CALL_THISCALL_1_DOUBLE( resultName, thisPtr, funcOffset, param1 ) \ do { \ double param1f64 = param1; /* Cast explicitly to double */ \ double *param1f64Ptr = ¶m1f64; /* Make pointer to address */ \ __asm__ __volatile__ ("pushl 4(%1)\n\t" \ "pushl (%1)\n\t" \ "movl (%2), %%edx\n\t" \ "call *"#funcOffset"(%%edx);\n\t" \ : "=a"(resultName) /* Output Operands */ \ : "r"(param1f64Ptr), /* Input Operands */ \ "c"(thisPtr), \ "m"(*param1f64Ptr) /* Using address */ \ : "%edx" /* Clobbered Registers */ \ ); \ } while (0); \ #define CALL_THISCALL_2( resultName, thisPtr, funcOffset, param1, param2 ) \ __asm__ __volatile__ ("pushl %1\n\t" \ "pushl %2\n\t" \ "movl (%3), %%edx\n\t" \ "call *"#funcOffset"(%%edx)\n\t" \ :"=a"(resultName) /* Output Operands */ \ :"r"(param2), /* Input Operands */ \ "r"(param1), \ "c"(thisPtr) \ : "%edx" /* Clobbered Registers */ \ ); \ #define CALL_THISCALL_4( resultName, thisPtr, funcOffset, param1, param2, param3, param4 )\ __asm__ __volatile__ ("pushl %1\n\t" \ "pushl %2\n\t" \ "pushl %3\n\t" \ "pushl %4\n\t" \ "movl (%5), %%edx\n\t" \ "call *"#funcOffset"(%%edx)\n\t" \ :"=a"(resultName) /* Output Operands */ \ :"r"(param4), /* Input Operands */ \ "r"(param3), \ "r"(param2), \ "r"(param1), \ "c"(thisPtr) \ : "%edx" /* Clobbered Registers */ \ ); \ #endif // Our static singleton instance. IASIOThiscallResolver IASIOThiscallResolver::instance; // Constructor called to initialize static Singleton instance above. Note that // it is important not to clear that_ incase it has already been set by the call // to placement new in ASIOInit(). IASIOThiscallResolver::IASIOThiscallResolver() { } // Constructor called from ASIOInit() below IASIOThiscallResolver::IASIOThiscallResolver(IASIO* that) : that_( that ) { } // Implement IUnknown methods as assert(false). IASIOThiscallResolver is not // really a COM object, just a wrapper which will work with the ASIO SDK. // If you wanted to use ASIO without the SDK you might want to implement COM // aggregation in these methods. HRESULT STDMETHODCALLTYPE IASIOThiscallResolver::QueryInterface(REFIID riid, void **ppv) { (void)riid; // suppress unused variable warning assert( false ); // this function should never be called by the ASIO SDK. *ppv = NULL; return E_NOINTERFACE; } ULONG STDMETHODCALLTYPE IASIOThiscallResolver::AddRef() { assert( false ); // this function should never be called by the ASIO SDK. return 1; } ULONG STDMETHODCALLTYPE IASIOThiscallResolver::Release() { assert( false ); // this function should never be called by the ASIO SDK. return 1; } // Implement the IASIO interface methods by performing the vptr manipulation // described above then delegating to the real implementation. ASIOBool IASIOThiscallResolver::init(void *sysHandle) { ASIOBool result; CALL_THISCALL_1( result, that_, 12, sysHandle ); return result; } void IASIOThiscallResolver::getDriverName(char *name) { CALL_VOID_THISCALL_1( that_, 16, name ); } long IASIOThiscallResolver::getDriverVersion() { ASIOBool result; CALL_THISCALL_0( result, that_, 20 ); return result; } void IASIOThiscallResolver::getErrorMessage(char *string) { CALL_VOID_THISCALL_1( that_, 24, string ); } ASIOError IASIOThiscallResolver::start() { ASIOBool result; CALL_THISCALL_0( result, that_, 28 ); return result; } ASIOError IASIOThiscallResolver::stop() { ASIOBool result; CALL_THISCALL_0( result, that_, 32 ); return result; } ASIOError IASIOThiscallResolver::getChannels(long *numInputChannels, long *numOutputChannels) { ASIOBool result; CALL_THISCALL_2( result, that_, 36, numInputChannels, numOutputChannels ); return result; } ASIOError IASIOThiscallResolver::getLatencies(long *inputLatency, long *outputLatency) { ASIOBool result; CALL_THISCALL_2( result, that_, 40, inputLatency, outputLatency ); return result; } ASIOError IASIOThiscallResolver::getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity) { ASIOBool result; CALL_THISCALL_4( result, that_, 44, minSize, maxSize, preferredSize, granularity ); return result; } ASIOError IASIOThiscallResolver::canSampleRate(ASIOSampleRate sampleRate) { ASIOBool result; CALL_THISCALL_1_DOUBLE( result, that_, 48, sampleRate ); return result; } ASIOError IASIOThiscallResolver::getSampleRate(ASIOSampleRate *sampleRate) { ASIOBool result; CALL_THISCALL_1( result, that_, 52, sampleRate ); return result; } ASIOError IASIOThiscallResolver::setSampleRate(ASIOSampleRate sampleRate) { ASIOBool result; CALL_THISCALL_1_DOUBLE( result, that_, 56, sampleRate ); return result; } ASIOError IASIOThiscallResolver::getClockSources(ASIOClockSource *clocks, long *numSources) { ASIOBool result; CALL_THISCALL_2( result, that_, 60, clocks, numSources ); return result; } ASIOError IASIOThiscallResolver::setClockSource(long reference) { ASIOBool result; CALL_THISCALL_1( result, that_, 64, reference ); return result; } ASIOError IASIOThiscallResolver::getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) { ASIOBool result; CALL_THISCALL_2( result, that_, 68, sPos, tStamp ); return result; } ASIOError IASIOThiscallResolver::getChannelInfo(ASIOChannelInfo *info) { ASIOBool result; CALL_THISCALL_1( result, that_, 72, info ); return result; } ASIOError IASIOThiscallResolver::createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks) { ASIOBool result; CALL_THISCALL_4( result, that_, 76, bufferInfos, numChannels, bufferSize, callbacks ); return result; } ASIOError IASIOThiscallResolver::disposeBuffers() { ASIOBool result; CALL_THISCALL_0( result, that_, 80 ); return result; } ASIOError IASIOThiscallResolver::controlPanel() { ASIOBool result; CALL_THISCALL_0( result, that_, 84 ); return result; } ASIOError IASIOThiscallResolver::future(long selector,void *opt) { ASIOBool result; CALL_THISCALL_2( result, that_, 88, selector, opt ); return result; } ASIOError IASIOThiscallResolver::outputReady() { ASIOBool result; CALL_THISCALL_0( result, that_, 92 ); return result; } // Implement our substitute ASIOInit() method ASIOError IASIOThiscallResolver::ASIOInit(ASIODriverInfo *info) { // To ensure that our instance's vptr is correctly constructed, even if // ASIOInit is called prior to main(), we explicitly call its constructor // (potentially over the top of an existing instance). Note that this is // pretty ugly, and is only safe because IASIOThiscallResolver has no // destructor and contains no objects with destructors. new((void*)&instance) IASIOThiscallResolver( theAsioDriver ); // Interpose between ASIO client code and the real driver. theAsioDriver = &instance; // Note that we never need to switch theAsioDriver back to point to the // real driver because theAsioDriver is reset to zero in ASIOExit(). // Delegate to the real ASIOInit return ::ASIOInit(info); } #endif /* !defined(_MSC_VER) */ #endif /* Win32 */ stk-4.5.0/src/include/iasiothiscallresolver.h0000644000076600007660000002321012327014024017126 0ustar gary// **************************************************************************** // // Changed: I have modified this file slightly (includes) to work with // RtAudio. RtAudio.cpp must include this file after asio.h. // // File: IASIOThiscallResolver.h // Description: The IASIOThiscallResolver class implements the IASIO // interface and acts as a proxy to the real IASIO interface by // calling through its vptr table using the thiscall calling // convention. To put it another way, we interpose // IASIOThiscallResolver between ASIO SDK code and the driver. // This is necessary because most non-Microsoft compilers don't // implement the thiscall calling convention used by IASIO. // // iasiothiscallresolver.cpp contains the background of this // problem plus a technical description of the vptr // manipulations. // // In order to use this mechanism one simply has to add // iasiothiscallresolver.cpp to the list of files to compile // and #include // // Note that this #include must come after the other ASIO SDK // #includes, for example: // // #include // #include // #include // #include // #include // // Actually the important thing is to #include // after . We have // incorporated a test to enforce this ordering. // // The code transparently takes care of the interposition by // using macro substitution to intercept calls to ASIOInit() // and ASIOExit(). We save the original ASIO global // "theAsioDriver" in our "that" variable, and then set // "theAsioDriver" to equal our IASIOThiscallResolver instance. // // Whilst this method of resolving the thiscall problem requires // the addition of #include to client // code it has the advantage that it does not break the terms // of the ASIO licence by publishing it. We are NOT modifying // any Steinberg code here, we are merely implementing the IASIO // interface in the same way that we would need to do if we // wished to provide an open source ASIO driver. // // For compilation with MinGW -lole32 needs to be added to the // linker options. For BORLAND, linking with Import32.lib is // sufficient. // // The dependencies are with: CoInitialize, CoUninitialize, // CoCreateInstance, CLSIDFromString - used by asiolist.cpp // and are required on Windows whether ThiscallResolver is used // or not. // // Searching for the above strings in the root library path // of your compiler should enable the correct libraries to be // identified if they aren't immediately obvious. // // Note that the current implementation of IASIOThiscallResolver // is not COM compliant - it does not correctly implement the // IUnknown interface. Implementing it is not necessary because // it is not called by parts of the ASIO SDK which call through // theAsioDriver ptr. The IUnknown methods are implemented as // assert(false) to ensure that the code fails if they are // ever called. // Restrictions: None. Public Domain & Open Source distribute freely // You may use IASIOThiscallResolver commercially as well as // privately. // You the user assume the responsibility for the use of the // files, binary or text, and there is no guarantee or warranty, // expressed or implied, including but not limited to the // implied warranties of merchantability and fitness for a // particular purpose. You assume all responsibility and agree // to hold no entity, copyright holder or distributors liable // for any loss of data or inaccurate representations of data // as a result of using IASIOThiscallResolver. // Version: 1.4 Added separate macro CALL_THISCALL_1_DOUBLE from // Andrew Baldwin, and volatile for whole gcc asm blocks, // both for compatibility with newer gcc versions. Cleaned up // Borland asm to use one less register. // 1.3 Switched to including assert.h for better compatibility. // Wrapped entire .h and .cpp contents with a check for // _MSC_VER to provide better compatibility with MS compilers. // Changed Singleton implementation to use static instance // instead of freestore allocated instance. Removed ASIOExit // macro as it is no longer needed. // 1.2 Removed semicolons from ASIOInit and ASIOExit macros to // allow them to be embedded in expressions (if statements). // Cleaned up some comments. Removed combase.c dependency (it // doesn't compile with BCB anyway) by stubbing IUnknown. // 1.1 Incorporated comments from Ross Bencina including things // such as changing name from ThiscallResolver to // IASIOThiscallResolver, tidying up the constructor, fixing // a bug in IASIOThiscallResolver::ASIOExit() and improving // portability through the use of conditional compilation // 1.0 Initial working version. // Created: 6/09/2003 // Authors: Fraser Adams // Ross Bencina // Rene G. Ceballos // Martin Fay // Antti Silvast // Andrew Baldwin // // **************************************************************************** #ifndef included_iasiothiscallresolver_h #define included_iasiothiscallresolver_h // We only need IASIOThiscallResolver at all if we are on Win32. For other // platforms we simply bypass the IASIOThiscallResolver definition to allow us // to be safely #include'd whatever the platform to keep client code portable //#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) #if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(_WIN64) // If microsoft compiler we can call IASIO directly so IASIOThiscallResolver // is not used. #if !defined(_MSC_VER) // The following is in order to ensure that this header is only included after // the other ASIO headers (except for the case of iasiothiscallresolver.cpp). // We need to do this because IASIOThiscallResolver works by eclipsing the // original definition of ASIOInit() with a macro (see below). #if !defined(iasiothiscallresolver_sourcefile) #if !defined(__ASIO_H) #error iasiothiscallresolver.h must be included AFTER asio.h #endif #endif #include #include "iasiodrv.h" /* From ASIO SDK */ class IASIOThiscallResolver : public IASIO { private: IASIO* that_; // Points to the real IASIO static IASIOThiscallResolver instance; // Singleton instance // Constructors - declared private so construction is limited to // our Singleton instance IASIOThiscallResolver(); IASIOThiscallResolver(IASIO* that); public: // Methods from the IUnknown interface. We don't fully implement IUnknown // because the ASIO SDK never calls these methods through theAsioDriver ptr. // These methods are implemented as assert(false). virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv); virtual ULONG STDMETHODCALLTYPE AddRef(); virtual ULONG STDMETHODCALLTYPE Release(); // Methods from the IASIO interface, implemented as forwarning calls to that. virtual ASIOBool init(void *sysHandle); virtual void getDriverName(char *name); virtual long getDriverVersion(); virtual void getErrorMessage(char *string); virtual ASIOError start(); virtual ASIOError stop(); virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels); virtual ASIOError getLatencies(long *inputLatency, long *outputLatency); virtual ASIOError getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); virtual ASIOError canSampleRate(ASIOSampleRate sampleRate); virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate); virtual ASIOError setSampleRate(ASIOSampleRate sampleRate); virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources); virtual ASIOError setClockSource(long reference); virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp); virtual ASIOError getChannelInfo(ASIOChannelInfo *info); virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); virtual ASIOError disposeBuffers(); virtual ASIOError controlPanel(); virtual ASIOError future(long selector,void *opt); virtual ASIOError outputReady(); // Class method, see ASIOInit() macro below. static ASIOError ASIOInit(ASIODriverInfo *info); // Delegates to ::ASIOInit }; // Replace calls to ASIOInit with our interposing version. // This macro enables us to perform thiscall resolution simply by #including // after the asio #includes (this file _must_ be // included _after_ the asio #includes) #define ASIOInit(name) IASIOThiscallResolver::ASIOInit((name)) #endif /* !defined(_MSC_VER) */ #endif /* Win32 */ #endif /* included_iasiothiscallresolver_h */ stk-4.5.0/src/include/soundcard.h0000644000076600007660000020110112327014024014473 0ustar gary/* * soundcard.h */ /*- * Copyright by Hannu Savolainen 1993 / 4Front Technologies 1993-2006 * Modified for the new FreeBSD sound driver by Luigi Rizzo, 1997 * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/sys/soundcard.h,v 1.48 2006/11/26 11:55:48 netchild Exp $ */ /* * Unless coordinating changes with 4Front Technologies, do NOT make any * modifications to ioctl commands, types, etc. that would break * compatibility with the OSS API. */ #ifndef _SYS_SOUNDCARD_H_ #define _SYS_SOUNDCARD_H_ /* * If you make modifications to this file, please contact me before * distributing the modified version. There is already enough * diversity in the world. * * Regards, * Hannu Savolainen * hannu@voxware.pp.fi * ********************************************************************** * PS. The Hacker's Guide to VoxWare available from * nic.funet.fi:pub/Linux/ALPHA/sound. The file is * snd-sdk-doc-0.1.ps.gz (gzipped postscript). It contains * some useful information about programming with VoxWare. * (NOTE! The pub/Linux/ALPHA/ directories are hidden. You have * to cd inside them before the files are accessible.) ********************************************************************** */ /* * SOUND_VERSION is only used by the voxware driver. Hopefully apps * should not depend on it, but rather look at the capabilities * of the driver in the kernel! */ #define SOUND_VERSION 301 #define VOXWARE /* does this have any use ? */ /* * Supported card ID numbers (Should be somewhere else? We keep * them here just for compativility with the old driver, but these * constants are of little or no use). */ #define SNDCARD_ADLIB 1 #define SNDCARD_SB 2 #define SNDCARD_PAS 3 #define SNDCARD_GUS 4 #define SNDCARD_MPU401 5 #define SNDCARD_SB16 6 #define SNDCARD_SB16MIDI 7 #define SNDCARD_UART6850 8 #define SNDCARD_GUS16 9 #define SNDCARD_MSS 10 #define SNDCARD_PSS 11 #define SNDCARD_SSCAPE 12 #define SNDCARD_PSS_MPU 13 #define SNDCARD_PSS_MSS 14 #define SNDCARD_SSCAPE_MSS 15 #define SNDCARD_TRXPRO 16 #define SNDCARD_TRXPRO_SB 17 #define SNDCARD_TRXPRO_MPU 18 #define SNDCARD_MAD16 19 #define SNDCARD_MAD16_MPU 20 #define SNDCARD_CS4232 21 #define SNDCARD_CS4232_MPU 22 #define SNDCARD_MAUI 23 #define SNDCARD_PSEUDO_MSS 24 #define SNDCARD_AWE32 25 #define SNDCARD_NSS 26 #define SNDCARD_UART16550 27 #define SNDCARD_OPL 28 #include #include #ifndef _IOWR #include #endif /* !_IOWR */ /* * The first part of this file contains the new FreeBSD sound ioctl * interface. Tries to minimize the number of different ioctls, and * to be reasonably general. * * 970821: some of the new calls have not been implemented yet. */ /* * the following three calls extend the generic file descriptor * interface. AIONWRITE is the dual of FIONREAD, i.e. returns the max * number of bytes for a write operation to be non-blocking. * * AIOGSIZE/AIOSSIZE are used to change the behaviour of the device, * from a character device (default) to a block device. In block mode, * (not to be confused with blocking mode) the main difference for the * application is that select() will return only when a complete * block can be read/written to the device, whereas in character mode * select will return true when one byte can be exchanged. For audio * devices, character mode makes select almost useless since one byte * will always be ready by the next sample time (which is often only a * handful of microseconds away). * Use a size of 0 or 1 to return to character mode. */ #define AIONWRITE _IOR('A', 10, int) /* get # bytes to write */ struct snd_size { int play_size; int rec_size; }; #define AIOGSIZE _IOR('A', 11, struct snd_size)/* read current blocksize */ #define AIOSSIZE _IOWR('A', 11, struct snd_size) /* sets blocksize */ /* * The following constants define supported audio formats. The * encoding follows voxware conventions, i.e. 1 bit for each supported * format. We extend it by using bit 31 (RO) to indicate full-duplex * capability, and bit 29 (RO) to indicate that the card supports/ * needs different formats on capture & playback channels. * Bit 29 (RW) is used to indicate/ask stereo. * * The number of bits required to store the sample is: * o 4 bits for the IDA ADPCM format, * o 8 bits for 8-bit formats, mu-law and A-law, * o 16 bits for the 16-bit formats, and * o 32 bits for the 24/32-bit formats. * o undefined for the MPEG audio format. */ #define AFMT_QUERY 0x00000000 /* Return current format */ #define AFMT_MU_LAW 0x00000001 /* Logarithmic mu-law */ #define AFMT_A_LAW 0x00000002 /* Logarithmic A-law */ #define AFMT_IMA_ADPCM 0x00000004 /* A 4:1 compressed format where 16-bit * squence represented using the * the average 4 bits per sample */ #define AFMT_U8 0x00000008 /* Unsigned 8-bit */ #define AFMT_S16_LE 0x00000010 /* Little endian signed 16-bit */ #define AFMT_S16_BE 0x00000020 /* Big endian signed 16-bit */ #define AFMT_S8 0x00000040 /* Signed 8-bit */ #define AFMT_U16_LE 0x00000080 /* Little endian unsigned 16-bit */ #define AFMT_U16_BE 0x00000100 /* Big endian unsigned 16-bit */ #define AFMT_MPEG 0x00000200 /* MPEG MP2/MP3 audio */ #define AFMT_AC3 0x00000400 /* Dolby Digital AC3 */ #if _BYTE_ORDER == _LITTLE_ENDIAN #define AFMT_S16_NE AFMT_S16_LE /* native endian signed 16 */ #else #define AFMT_S16_NE AFMT_S16_BE #endif /* * 32-bit formats below used for 24-bit audio data where the data is stored * in the 24 most significant bits and the least significant bits are not used * (should be set to 0). */ #define AFMT_S32_LE 0x00001000 /* Little endian signed 32-bit */ #define AFMT_S32_BE 0x00002000 /* Big endian signed 32-bit */ #define AFMT_U32_LE 0x00004000 /* Little endian unsigned 32-bit */ #define AFMT_U32_BE 0x00008000 /* Big endian unsigned 32-bit */ #define AFMT_S24_LE 0x00010000 /* Little endian signed 24-bit */ #define AFMT_S24_BE 0x00020000 /* Big endian signed 24-bit */ #define AFMT_U24_LE 0x00040000 /* Little endian unsigned 24-bit */ #define AFMT_U24_BE 0x00080000 /* Big endian unsigned 24-bit */ #define AFMT_STEREO 0x10000000 /* can do/want stereo */ /* * the following are really capabilities */ #define AFMT_WEIRD 0x20000000 /* weird hardware... */ /* * AFMT_WEIRD reports that the hardware might need to operate * with different formats in the playback and capture * channels when operating in full duplex. * As an example, SoundBlaster16 cards only support U8 in one * direction and S16 in the other one, and applications should * be aware of this limitation. */ #define AFMT_FULLDUPLEX 0x80000000 /* can do full duplex */ /* * The following structure is used to get/set format and sampling rate. * While it would be better to have things such as stereo, bits per * sample, endiannes, etc split in different variables, it turns out * that formats are not that many, and not all combinations are possible. * So we followed the Voxware approach of associating one bit to each * format. */ typedef struct _snd_chan_param { u_long play_rate; /* sampling rate */ u_long rec_rate; /* sampling rate */ u_long play_format; /* everything describing the format */ u_long rec_format; /* everything describing the format */ } snd_chan_param; #define AIOGFMT _IOR('f', 12, snd_chan_param) /* get format */ #define AIOSFMT _IOWR('f', 12, snd_chan_param) /* sets format */ /* * The following structure is used to get/set the mixer setting. * Up to 32 mixers are supported, each one with up to 32 channels. */ typedef struct _snd_mix_param { u_char subdev; /* which output */ u_char line; /* which input */ u_char left,right; /* volumes, 0..255, 0 = mute */ } snd_mix_param ; /* XXX AIOGMIX, AIOSMIX not implemented yet */ #define AIOGMIX _IOWR('A', 13, snd_mix_param) /* return mixer status */ #define AIOSMIX _IOWR('A', 14, snd_mix_param) /* sets mixer status */ /* * channel specifiers used in AIOSTOP and AIOSYNC */ #define AIOSYNC_PLAY 0x1 /* play chan */ #define AIOSYNC_CAPTURE 0x2 /* capture chan */ /* AIOSTOP stop & flush a channel, returns the residual count */ #define AIOSTOP _IOWR ('A', 15, int) /* alternate method used to notify the sync condition */ #define AIOSYNC_SIGNAL 0x100 #define AIOSYNC_SELECT 0x200 /* what the 'pos' field refers to */ #define AIOSYNC_READY 0x400 #define AIOSYNC_FREE 0x800 typedef struct _snd_sync_parm { long chan ; /* play or capture channel, plus modifier */ long pos; } snd_sync_parm; #define AIOSYNC _IOWR ('A', 15, snd_sync_parm) /* misc. synchronization */ /* * The following is used to return device capabilities. If the structure * passed to the ioctl is zeroed, default values are returned for rate * and formats, a bitmap of available mixers is returned, and values * (inputs, different levels) for the first one are returned. * * If formats, mixers, inputs are instantiated, then detailed info * are returned depending on the call. */ typedef struct _snd_capabilities { u_long rate_min, rate_max; /* min-max sampling rate */ u_long formats; u_long bufsize; /* DMA buffer size */ u_long mixers; /* bitmap of available mixers */ u_long inputs; /* bitmap of available inputs (per mixer) */ u_short left, right; /* how many levels are supported */ } snd_capabilities; #define AIOGCAP _IOWR('A', 15, snd_capabilities) /* get capabilities */ /* * here is the old (Voxware) ioctl interface */ /* * IOCTL Commands for /dev/sequencer */ #define SNDCTL_SEQ_RESET _IO ('Q', 0) #define SNDCTL_SEQ_SYNC _IO ('Q', 1) #define SNDCTL_SYNTH_INFO _IOWR('Q', 2, struct synth_info) #define SNDCTL_SEQ_CTRLRATE _IOWR('Q', 3, int) /* Set/get timer res.(hz) */ #define SNDCTL_SEQ_GETOUTCOUNT _IOR ('Q', 4, int) #define SNDCTL_SEQ_GETINCOUNT _IOR ('Q', 5, int) #define SNDCTL_SEQ_PERCMODE _IOW ('Q', 6, int) #define SNDCTL_FM_LOAD_INSTR _IOW ('Q', 7, struct sbi_instrument) /* Valid for FM only */ #define SNDCTL_SEQ_TESTMIDI _IOW ('Q', 8, int) #define SNDCTL_SEQ_RESETSAMPLES _IOW ('Q', 9, int) #define SNDCTL_SEQ_NRSYNTHS _IOR ('Q',10, int) #define SNDCTL_SEQ_NRMIDIS _IOR ('Q',11, int) #define SNDCTL_MIDI_INFO _IOWR('Q',12, struct midi_info) #define SNDCTL_SEQ_THRESHOLD _IOW ('Q',13, int) #define SNDCTL_SEQ_TRESHOLD SNDCTL_SEQ_THRESHOLD /* there was once a typo */ #define SNDCTL_SYNTH_MEMAVL _IOWR('Q',14, int) /* in=dev#, out=memsize */ #define SNDCTL_FM_4OP_ENABLE _IOW ('Q',15, int) /* in=dev# */ #define SNDCTL_PMGR_ACCESS _IOWR('Q',16, struct patmgr_info) #define SNDCTL_SEQ_PANIC _IO ('Q',17) #define SNDCTL_SEQ_OUTOFBAND _IOW ('Q',18, struct seq_event_rec) #define SNDCTL_SEQ_GETTIME _IOR ('Q',19, int) struct seq_event_rec { u_char arr[8]; }; #define SNDCTL_TMR_TIMEBASE _IOWR('T', 1, int) #define SNDCTL_TMR_START _IO ('T', 2) #define SNDCTL_TMR_STOP _IO ('T', 3) #define SNDCTL_TMR_CONTINUE _IO ('T', 4) #define SNDCTL_TMR_TEMPO _IOWR('T', 5, int) #define SNDCTL_TMR_SOURCE _IOWR('T', 6, int) # define TMR_INTERNAL 0x00000001 # define TMR_EXTERNAL 0x00000002 # define TMR_MODE_MIDI 0x00000010 # define TMR_MODE_FSK 0x00000020 # define TMR_MODE_CLS 0x00000040 # define TMR_MODE_SMPTE 0x00000080 #define SNDCTL_TMR_METRONOME _IOW ('T', 7, int) #define SNDCTL_TMR_SELECT _IOW ('T', 8, int) /* * Endian aware patch key generation algorithm. */ #if defined(_AIX) || defined(AIX) # define _PATCHKEY(id) (0xfd00|id) #else # define _PATCHKEY(id) ((id<<8)|0xfd) #endif /* * Sample loading mechanism for internal synthesizers (/dev/sequencer) * The following patch_info structure has been designed to support * Gravis UltraSound. It tries to be universal format for uploading * sample based patches but is probably too limited. */ struct patch_info { /* u_short key; Use GUS_PATCH here */ short key; /* Use GUS_PATCH here */ #define GUS_PATCH _PATCHKEY(0x04) #define OBSOLETE_GUS_PATCH _PATCHKEY(0x02) short device_no; /* Synthesizer number */ short instr_no; /* Midi pgm# */ u_long mode; /* * The least significant byte has the same format than the GUS .PAT * files */ #define WAVE_16_BITS 0x01 /* bit 0 = 8 or 16 bit wave data. */ #define WAVE_UNSIGNED 0x02 /* bit 1 = Signed - Unsigned data. */ #define WAVE_LOOPING 0x04 /* bit 2 = looping enabled-1. */ #define WAVE_BIDIR_LOOP 0x08 /* bit 3 = Set is bidirectional looping. */ #define WAVE_LOOP_BACK 0x10 /* bit 4 = Set is looping backward. */ #define WAVE_SUSTAIN_ON 0x20 /* bit 5 = Turn sustaining on. (Env. pts. 3)*/ #define WAVE_ENVELOPES 0x40 /* bit 6 = Enable envelopes - 1 */ /* (use the env_rate/env_offs fields). */ /* Linux specific bits */ #define WAVE_VIBRATO 0x00010000 /* The vibrato info is valid */ #define WAVE_TREMOLO 0x00020000 /* The tremolo info is valid */ #define WAVE_SCALE 0x00040000 /* The scaling info is valid */ /* Other bits must be zeroed */ long len; /* Size of the wave data in bytes */ long loop_start, loop_end; /* Byte offsets from the beginning */ /* * The base_freq and base_note fields are used when computing the * playback speed for a note. The base_note defines the tone frequency * which is heard if the sample is played using the base_freq as the * playback speed. * * The low_note and high_note fields define the minimum and maximum note * frequencies for which this sample is valid. It is possible to define * more than one samples for an instrument number at the same time. The * low_note and high_note fields are used to select the most suitable one. * * The fields base_note, high_note and low_note should contain * the note frequency multiplied by 1000. For example value for the * middle A is 440*1000. */ u_int base_freq; u_long base_note; u_long high_note; u_long low_note; int panning; /* -128=left, 127=right */ int detuning; /* New fields introduced in version 1.99.5 */ /* Envelope. Enabled by mode bit WAVE_ENVELOPES */ u_char env_rate[ 6 ]; /* GUS HW ramping rate */ u_char env_offset[ 6 ]; /* 255 == 100% */ /* * The tremolo, vibrato and scale info are not supported yet. * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or * WAVE_SCALE */ u_char tremolo_sweep; u_char tremolo_rate; u_char tremolo_depth; u_char vibrato_sweep; u_char vibrato_rate; u_char vibrato_depth; int scale_frequency; u_int scale_factor; /* from 0 to 2048 or 0 to 2 */ int volume; int spare[4]; char data[1]; /* The waveform data starts here */ }; struct sysex_info { short key; /* Use GUS_PATCH here */ #define SYSEX_PATCH _PATCHKEY(0x05) #define MAUI_PATCH _PATCHKEY(0x06) short device_no; /* Synthesizer number */ long len; /* Size of the sysex data in bytes */ u_char data[1]; /* Sysex data starts here */ }; /* * Patch management interface (/dev/sequencer, /dev/patmgr#) * Don't use these calls if you want to maintain compatibility with * the future versions of the driver. */ #define PS_NO_PATCHES 0 /* No patch support on device */ #define PS_MGR_NOT_OK 1 /* Plain patch support (no mgr) */ #define PS_MGR_OK 2 /* Patch manager supported */ #define PS_MANAGED 3 /* Patch manager running */ #define SNDCTL_PMGR_IFACE _IOWR('P', 1, struct patmgr_info) /* * The patmgr_info is a fixed size structure which is used for two * different purposes. The intended use is for communication between * the application using /dev/sequencer and the patch manager daemon * associated with a synthesizer device (ioctl(SNDCTL_PMGR_ACCESS)). * * This structure is also used with ioctl(SNDCTL_PGMR_IFACE) which allows * a patch manager daemon to read and write device parameters. This * ioctl available through /dev/sequencer also. Avoid using it since it's * extremely hardware dependent. In addition access trough /dev/sequencer * may confuse the patch manager daemon. */ struct patmgr_info { /* Note! size must be < 4k since kmalloc() is used */ u_long key; /* Don't worry. Reserved for communication between the patch manager and the driver. */ #define PM_K_EVENT 1 /* Event from the /dev/sequencer driver */ #define PM_K_COMMAND 2 /* Request from an application */ #define PM_K_RESPONSE 3 /* From patmgr to application */ #define PM_ERROR 4 /* Error returned by the patmgr */ int device; int command; /* * Commands 0x000 to 0xfff reserved for patch manager programs */ #define PM_GET_DEVTYPE 1 /* Returns type of the patch mgr interface of dev */ #define PMTYPE_FM2 1 /* 2 OP fm */ #define PMTYPE_FM4 2 /* Mixed 4 or 2 op FM (OPL-3) */ #define PMTYPE_WAVE 3 /* Wave table synthesizer (GUS) */ #define PM_GET_NRPGM 2 /* Returns max # of midi programs in parm1 */ #define PM_GET_PGMMAP 3 /* Returns map of loaded midi programs in data8 */ #define PM_GET_PGM_PATCHES 4 /* Return list of patches of a program (parm1) */ #define PM_GET_PATCH 5 /* Return patch header of patch parm1 */ #define PM_SET_PATCH 6 /* Set patch header of patch parm1 */ #define PM_READ_PATCH 7 /* Read patch (wave) data */ #define PM_WRITE_PATCH 8 /* Write patch (wave) data */ /* * Commands 0x1000 to 0xffff are for communication between the patch manager * and the client */ #define _PM_LOAD_PATCH 0x100 /* * Commands above 0xffff reserved for device specific use */ long parm1; long parm2; long parm3; union { u_char data8[4000]; u_short data16[2000]; u_long data32[1000]; struct patch_info patch; } data; }; /* * When a patch manager daemon is present, it will be informed by the * driver when something important happens. For example when the * /dev/sequencer is opened or closed. A record with key == PM_K_EVENT is * returned. The command field contains the event type: */ #define PM_E_OPENED 1 /* /dev/sequencer opened */ #define PM_E_CLOSED 2 /* /dev/sequencer closed */ #define PM_E_PATCH_RESET 3 /* SNDCTL_RESETSAMPLES called */ #define PM_E_PATCH_LOADED 4 /* A patch has been loaded by appl */ /* * /dev/sequencer input events. * * The data written to the /dev/sequencer is a stream of events. Events * are records of 4 or 8 bytes. The first byte defines the size. * Any number of events can be written with a write call. There * is a set of macros for sending these events. Use these macros if you * want to maximize portability of your program. * * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events. * (All input events are currently 4 bytes long. Be prepared to support * 8 byte events also. If you receive any event having first byte >= 128, * it's a 8 byte event. * * The events are documented at the end of this file. * * Normal events (4 bytes) * There is also a 8 byte version of most of the 4 byte events. The * 8 byte one is recommended. */ #define SEQ_NOTEOFF 0 #define SEQ_FMNOTEOFF SEQ_NOTEOFF /* Just old name */ #define SEQ_NOTEON 1 #define SEQ_FMNOTEON SEQ_NOTEON #define SEQ_WAIT TMR_WAIT_ABS #define SEQ_PGMCHANGE 3 #define SEQ_FMPGMCHANGE SEQ_PGMCHANGE #define SEQ_SYNCTIMER TMR_START #define SEQ_MIDIPUTC 5 #define SEQ_DRUMON 6 /*** OBSOLETE ***/ #define SEQ_DRUMOFF 7 /*** OBSOLETE ***/ #define SEQ_ECHO TMR_ECHO /* For synching programs with output */ #define SEQ_AFTERTOUCH 9 #define SEQ_CONTROLLER 10 /* * Midi controller numbers * * Controllers 0 to 31 (0x00 to 0x1f) and 32 to 63 (0x20 to 0x3f) * are continuous controllers. * In the MIDI 1.0 these controllers are sent using two messages. * Controller numbers 0 to 31 are used to send the MSB and the * controller numbers 32 to 63 are for the LSB. Note that just 7 bits * are used in MIDI bytes. */ #define CTL_BANK_SELECT 0x00 #define CTL_MODWHEEL 0x01 #define CTL_BREATH 0x02 /* undefined 0x03 */ #define CTL_FOOT 0x04 #define CTL_PORTAMENTO_TIME 0x05 #define CTL_DATA_ENTRY 0x06 #define CTL_MAIN_VOLUME 0x07 #define CTL_BALANCE 0x08 /* undefined 0x09 */ #define CTL_PAN 0x0a #define CTL_EXPRESSION 0x0b /* undefined 0x0c - 0x0f */ #define CTL_GENERAL_PURPOSE1 0x10 #define CTL_GENERAL_PURPOSE2 0x11 #define CTL_GENERAL_PURPOSE3 0x12 #define CTL_GENERAL_PURPOSE4 0x13 /* undefined 0x14 - 0x1f */ /* undefined 0x20 */ /* * The controller numbers 0x21 to 0x3f are reserved for the * least significant bytes of the controllers 0x00 to 0x1f. * These controllers are not recognised by the driver. * * Controllers 64 to 69 (0x40 to 0x45) are on/off switches. * 0=OFF and 127=ON (intermediate values are possible) */ #define CTL_DAMPER_PEDAL 0x40 #define CTL_SUSTAIN CTL_DAMPER_PEDAL /* Alias */ #define CTL_HOLD CTL_DAMPER_PEDAL /* Alias */ #define CTL_PORTAMENTO 0x41 #define CTL_SOSTENUTO 0x42 #define CTL_SOFT_PEDAL 0x43 /* undefined 0x44 */ #define CTL_HOLD2 0x45 /* undefined 0x46 - 0x4f */ #define CTL_GENERAL_PURPOSE5 0x50 #define CTL_GENERAL_PURPOSE6 0x51 #define CTL_GENERAL_PURPOSE7 0x52 #define CTL_GENERAL_PURPOSE8 0x53 /* undefined 0x54 - 0x5a */ #define CTL_EXT_EFF_DEPTH 0x5b #define CTL_TREMOLO_DEPTH 0x5c #define CTL_CHORUS_DEPTH 0x5d #define CTL_DETUNE_DEPTH 0x5e #define CTL_CELESTE_DEPTH CTL_DETUNE_DEPTH /* Alias for the above one */ #define CTL_PHASER_DEPTH 0x5f #define CTL_DATA_INCREMENT 0x60 #define CTL_DATA_DECREMENT 0x61 #define CTL_NONREG_PARM_NUM_LSB 0x62 #define CTL_NONREG_PARM_NUM_MSB 0x63 #define CTL_REGIST_PARM_NUM_LSB 0x64 #define CTL_REGIST_PARM_NUM_MSB 0x65 /* undefined 0x66 - 0x78 */ /* reserved 0x79 - 0x7f */ /* Pseudo controllers (not midi compatible) */ #define CTRL_PITCH_BENDER 255 #define CTRL_PITCH_BENDER_RANGE 254 #define CTRL_EXPRESSION 253 /* Obsolete */ #define CTRL_MAIN_VOLUME 252 /* Obsolete */ #define SEQ_BALANCE 11 #define SEQ_VOLMODE 12 /* * Volume mode decides how volumes are used */ #define VOL_METHOD_ADAGIO 1 #define VOL_METHOD_LINEAR 2 /* * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as * input events. */ /* * Event codes 0xf0 to 0xfc are reserved for future extensions. */ #define SEQ_FULLSIZE 0xfd /* Long events */ /* * SEQ_FULLSIZE events are used for loading patches/samples to the * synthesizer devices. These events are passed directly to the driver * of the associated synthesizer device. There is no limit to the size * of the extended events. These events are not queued but executed * immediately when the write() is called (execution can take several * seconds of time). * * When a SEQ_FULLSIZE message is written to the device, it must * be written using exactly one write() call. Other events cannot * be mixed to the same write. * * For FM synths (YM3812/OPL3) use struct sbi_instrument and write * it to the /dev/sequencer. Don't write other data together with * the instrument structure Set the key field of the structure to * FM_PATCH. The device field is used to route the patch to the * corresponding device. * * For Gravis UltraSound use struct patch_info. Initialize the key field * to GUS_PATCH. */ #define SEQ_PRIVATE 0xfe /* Low level HW dependent events (8 bytes) */ #define SEQ_EXTENDED 0xff /* Extended events (8 bytes) OBSOLETE */ /* * Record for FM patches */ typedef u_char sbi_instr_data[32]; struct sbi_instrument { u_short key; /* FM_PATCH or OPL3_PATCH */ #define FM_PATCH _PATCHKEY(0x01) #define OPL3_PATCH _PATCHKEY(0x03) short device; /* Synth# (0-4) */ int channel; /* Program# to be initialized */ sbi_instr_data operators; /* Reg. settings for operator cells * (.SBI format) */ }; struct synth_info { /* Read only */ char name[30]; int device; /* 0-N. INITIALIZE BEFORE CALLING */ int synth_type; #define SYNTH_TYPE_FM 0 #define SYNTH_TYPE_SAMPLE 1 #define SYNTH_TYPE_MIDI 2 /* Midi interface */ int synth_subtype; #define FM_TYPE_ADLIB 0x00 #define FM_TYPE_OPL3 0x01 #define MIDI_TYPE_MPU401 0x401 #define SAMPLE_TYPE_BASIC 0x10 #define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC #define SAMPLE_TYPE_AWE32 0x20 int perc_mode; /* No longer supported */ int nr_voices; int nr_drums; /* Obsolete field */ int instr_bank_size; u_long capabilities; #define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */ #define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */ #define SYNTH_CAP_INPUT 0x00000004 /* Input (MIDI) device */ int dummies[19]; /* Reserve space */ }; struct sound_timer_info { char name[32]; int caps; }; struct midi_info { char name[30]; int device; /* 0-N. INITIALIZE BEFORE CALLING */ u_long capabilities; /* To be defined later */ int dev_type; int dummies[18]; /* Reserve space */ }; /* * ioctl commands for the /dev/midi## */ typedef struct { u_char cmd; char nr_args, nr_returns; u_char data[30]; } mpu_command_rec; #define SNDCTL_MIDI_PRETIME _IOWR('m', 0, int) #define SNDCTL_MIDI_MPUMODE _IOWR('m', 1, int) #define SNDCTL_MIDI_MPUCMD _IOWR('m', 2, mpu_command_rec) #define MIOSPASSTHRU _IOWR('m', 3, int) #define MIOGPASSTHRU _IOWR('m', 4, int) /* * IOCTL commands for /dev/dsp and /dev/audio */ #define SNDCTL_DSP_RESET _IO ('P', 0) #define SNDCTL_DSP_SYNC _IO ('P', 1) #define SNDCTL_DSP_SPEED _IOWR('P', 2, int) #define SNDCTL_DSP_STEREO _IOWR('P', 3, int) #define SNDCTL_DSP_GETBLKSIZE _IOR('P', 4, int) #define SNDCTL_DSP_SETBLKSIZE _IOW('P', 4, int) #define SNDCTL_DSP_SETFMT _IOWR('P',5, int) /* Selects ONE fmt*/ /* * SOUND_PCM_WRITE_CHANNELS is not that different * from SNDCTL_DSP_STEREO */ #define SOUND_PCM_WRITE_CHANNELS _IOWR('P', 6, int) #define SNDCTL_DSP_CHANNELS SOUND_PCM_WRITE_CHANNELS #define SOUND_PCM_WRITE_FILTER _IOWR('P', 7, int) #define SNDCTL_DSP_POST _IO ('P', 8) /* * SNDCTL_DSP_SETBLKSIZE and the following two calls mostly do * the same thing, i.e. set the block size used in DMA transfers. */ #define SNDCTL_DSP_SUBDIVIDE _IOWR('P', 9, int) #define SNDCTL_DSP_SETFRAGMENT _IOWR('P',10, int) #define SNDCTL_DSP_GETFMTS _IOR ('P',11, int) /* Returns a mask */ /* * Buffer status queries. */ typedef struct audio_buf_info { int fragments; /* # of avail. frags (partly used ones not counted) */ int fragstotal; /* Total # of fragments allocated */ int fragsize; /* Size of a fragment in bytes */ int bytes; /* Avail. space in bytes (includes partly used fragments) */ /* Note! 'bytes' could be more than fragments*fragsize */ } audio_buf_info; #define SNDCTL_DSP_GETOSPACE _IOR ('P',12, audio_buf_info) #define SNDCTL_DSP_GETISPACE _IOR ('P',13, audio_buf_info) /* * SNDCTL_DSP_NONBLOCK is the same (but less powerful, since the * action cannot be undone) of FIONBIO. The same can be achieved * by opening the device with O_NDELAY */ #define SNDCTL_DSP_NONBLOCK _IO ('P',14) #define SNDCTL_DSP_GETCAPS _IOR ('P',15, int) #define DSP_CAP_REVISION 0x000000ff /* revision level (0 to 255) */ #define DSP_CAP_DUPLEX 0x00000100 /* Full duplex record/playback */ #define DSP_CAP_REALTIME 0x00000200 /* Real time capability */ #define DSP_CAP_BATCH 0x00000400 /* * Device has some kind of internal buffers which may * cause some delays and decrease precision of timing */ #define DSP_CAP_COPROC 0x00000800 /* Has a coprocessor, sometimes it's a DSP but usually not */ #define DSP_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */ #define DSP_CAP_MMAP 0x00002000 /* Supports mmap() */ /* * What do these function do ? */ #define SNDCTL_DSP_GETTRIGGER _IOR ('P',16, int) #define SNDCTL_DSP_SETTRIGGER _IOW ('P',16, int) #define PCM_ENABLE_INPUT 0x00000001 #define PCM_ENABLE_OUTPUT 0x00000002 typedef struct count_info { int bytes; /* Total # of bytes processed */ int blocks; /* # of fragment transitions since last time */ int ptr; /* Current DMA pointer value */ } count_info; /* * GETIPTR and GETISPACE are not that different... same for out. */ #define SNDCTL_DSP_GETIPTR _IOR ('P',17, count_info) #define SNDCTL_DSP_GETOPTR _IOR ('P',18, count_info) typedef struct buffmem_desc { caddr_t buffer; int size; } buffmem_desc; #define SNDCTL_DSP_MAPINBUF _IOR ('P', 19, buffmem_desc) #define SNDCTL_DSP_MAPOUTBUF _IOR ('P', 20, buffmem_desc) #define SNDCTL_DSP_SETSYNCRO _IO ('P', 21) #define SNDCTL_DSP_SETDUPLEX _IO ('P', 22) #define SNDCTL_DSP_GETODELAY _IOR ('P', 23, int) /* * I guess these are the readonly version of the same * functions that exist above as SNDCTL_DSP_... */ #define SOUND_PCM_READ_RATE _IOR ('P', 2, int) #define SOUND_PCM_READ_CHANNELS _IOR ('P', 6, int) #define SOUND_PCM_READ_BITS _IOR ('P', 5, int) #define SOUND_PCM_READ_FILTER _IOR ('P', 7, int) /* * ioctl calls to be used in communication with coprocessors and * DSP chips. */ typedef struct copr_buffer { int command; /* Set to 0 if not used */ int flags; #define CPF_NONE 0x0000 #define CPF_FIRST 0x0001 /* First block */ #define CPF_LAST 0x0002 /* Last block */ int len; int offs; /* If required by the device (0 if not used) */ u_char data[4000]; /* NOTE! 4000 is not 4k */ } copr_buffer; typedef struct copr_debug_buf { int command; /* Used internally. Set to 0 */ int parm1; int parm2; int flags; int len; /* Length of data in bytes */ } copr_debug_buf; typedef struct copr_msg { int len; u_char data[4000]; } copr_msg; #define SNDCTL_COPR_RESET _IO ('C', 0) #define SNDCTL_COPR_LOAD _IOWR('C', 1, copr_buffer) #define SNDCTL_COPR_RDATA _IOWR('C', 2, copr_debug_buf) #define SNDCTL_COPR_RCODE _IOWR('C', 3, copr_debug_buf) #define SNDCTL_COPR_WDATA _IOW ('C', 4, copr_debug_buf) #define SNDCTL_COPR_WCODE _IOW ('C', 5, copr_debug_buf) #define SNDCTL_COPR_RUN _IOWR('C', 6, copr_debug_buf) #define SNDCTL_COPR_HALT _IOWR('C', 7, copr_debug_buf) #define SNDCTL_COPR_SENDMSG _IOW ('C', 8, copr_msg) #define SNDCTL_COPR_RCVMSG _IOR ('C', 9, copr_msg) /* * IOCTL commands for /dev/mixer */ /* * Mixer devices * * There can be up to 20 different analog mixer channels. The * SOUND_MIXER_NRDEVICES gives the currently supported maximum. * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells * the devices supported by the particular mixer. */ #define SOUND_MIXER_NRDEVICES 25 #define SOUND_MIXER_VOLUME 0 /* Master output level */ #define SOUND_MIXER_BASS 1 /* Treble level of all output channels */ #define SOUND_MIXER_TREBLE 2 /* Bass level of all output channels */ #define SOUND_MIXER_SYNTH 3 /* Volume of synthesier input */ #define SOUND_MIXER_PCM 4 /* Output level for the audio device */ #define SOUND_MIXER_SPEAKER 5 /* Output level for the PC speaker * signals */ #define SOUND_MIXER_LINE 6 /* Volume level for the line in jack */ #define SOUND_MIXER_MIC 7 /* Volume for the signal coming from * the microphone jack */ #define SOUND_MIXER_CD 8 /* Volume level for the input signal * connected to the CD audio input */ #define SOUND_MIXER_IMIX 9 /* Recording monitor. It controls the * output volume of the selected * recording sources while recording */ #define SOUND_MIXER_ALTPCM 10 /* Volume of the alternative codec * device */ #define SOUND_MIXER_RECLEV 11 /* Global recording level */ #define SOUND_MIXER_IGAIN 12 /* Input gain */ #define SOUND_MIXER_OGAIN 13 /* Output gain */ /* * The AD1848 codec and compatibles have three line level inputs * (line, aux1 and aux2). Since each card manufacturer have assigned * different meanings to these inputs, it's inpractical to assign * specific meanings (line, cd, synth etc.) to them. */ #define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */ #define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */ #define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */ #define SOUND_MIXER_DIGITAL1 17 /* Digital (input) 1 */ #define SOUND_MIXER_DIGITAL2 18 /* Digital (input) 2 */ #define SOUND_MIXER_DIGITAL3 19 /* Digital (input) 3 */ #define SOUND_MIXER_PHONEIN 20 /* Phone input */ #define SOUND_MIXER_PHONEOUT 21 /* Phone output */ #define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */ #define SOUND_MIXER_RADIO 23 /* Radio in */ #define SOUND_MIXER_MONITOR 24 /* Monitor (usually mic) volume */ /* * Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) * Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */ #define SOUND_ONOFF_MIN 28 #define SOUND_ONOFF_MAX 30 #define SOUND_MIXER_MUTE 28 /* 0 or 1 */ #define SOUND_MIXER_ENHANCE 29 /* Enhanced stereo (0, 40, 60 or 80) */ #define SOUND_MIXER_LOUD 30 /* 0 or 1 */ /* Note! Number 31 cannot be used since the sign bit is reserved */ #define SOUND_MIXER_NONE 31 #define SOUND_DEVICE_LABELS { \ "Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \ "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \ "Line1", "Line2", "Line3", "Digital1", "Digital2", "Digital3", \ "PhoneIn", "PhoneOut", "Video", "Radio", "Monitor"} #define SOUND_DEVICE_NAMES { \ "vol", "bass", "treble", "synth", "pcm", "speaker", "line", \ "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \ "line1", "line2", "line3", "dig1", "dig2", "dig3", \ "phin", "phout", "video", "radio", "monitor"} /* Device bitmask identifiers */ #define SOUND_MIXER_RECSRC 0xff /* 1 bit per recording source */ #define SOUND_MIXER_DEVMASK 0xfe /* 1 bit per supported device */ #define SOUND_MIXER_RECMASK 0xfd /* 1 bit per supp. recording source */ #define SOUND_MIXER_CAPS 0xfc #define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only 1 rec. src at a time */ #define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */ /* Device mask bits */ #define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME) #define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS) #define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE) #define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH) #define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM) #define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER) #define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE) #define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC) #define SOUND_MASK_CD (1 << SOUND_MIXER_CD) #define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX) #define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM) #define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV) #define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN) #define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN) #define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1) #define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2) #define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3) #define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1) #define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2) #define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3) #define SOUND_MASK_PHONEIN (1 << SOUND_MIXER_PHONEIN) #define SOUND_MASK_PHONEOUT (1 << SOUND_MIXER_PHONEOUT) #define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO) #define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO) #define SOUND_MASK_MONITOR (1 << SOUND_MIXER_MONITOR) /* Obsolete macros */ #define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE) #define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE) #define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD) #define MIXER_READ(dev) _IOR('M', dev, int) #define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME) #define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS) #define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE) #define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH) #define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM) #define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER) #define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE) #define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC) #define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD) #define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX) #define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM) #define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV) #define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN) #define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN) #define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1) #define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2) #define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3) #define SOUND_MIXER_READ_DIGITAL1 MIXER_READ(SOUND_MIXER_DIGITAL1) #define SOUND_MIXER_READ_DIGITAL2 MIXER_READ(SOUND_MIXER_DIGITAL2) #define SOUND_MIXER_READ_DIGITAL3 MIXER_READ(SOUND_MIXER_DIGITAL3) #define SOUND_MIXER_READ_PHONEIN MIXER_READ(SOUND_MIXER_PHONEIN) #define SOUND_MIXER_READ_PHONEOUT MIXER_READ(SOUND_MIXER_PHONEOUT) #define SOUND_MIXER_READ_RADIO MIXER_READ(SOUND_MIXER_RADIO) #define SOUND_MIXER_READ_VIDEO MIXER_READ(SOUND_MIXER_VIDEO) #define SOUND_MIXER_READ_MONITOR MIXER_READ(SOUND_MIXER_MONITOR) /* Obsolete macros */ #define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE) #define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE) #define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD) #define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC) #define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK) #define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK) #define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS) #define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS) #define MIXER_WRITE(dev) _IOWR('M', dev, int) #define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME) #define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS) #define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE) #define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH) #define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM) #define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER) #define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE) #define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC) #define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD) #define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX) #define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM) #define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV) #define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN) #define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN) #define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1) #define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2) #define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3) #define SOUND_MIXER_WRITE_DIGITAL1 MIXER_WRITE(SOUND_MIXER_DIGITAL1) #define SOUND_MIXER_WRITE_DIGITAL2 MIXER_WRITE(SOUND_MIXER_DIGITAL2) #define SOUND_MIXER_WRITE_DIGITAL3 MIXER_WRITE(SOUND_MIXER_DIGITAL3) #define SOUND_MIXER_WRITE_PHONEIN MIXER_WRITE(SOUND_MIXER_PHONEIN) #define SOUND_MIXER_WRITE_PHONEOUT MIXER_WRITE(SOUND_MIXER_PHONEOUT) #define SOUND_MIXER_WRITE_RADIO MIXER_WRITE(SOUND_MIXER_RADIO) #define SOUND_MIXER_WRITE_VIDEO MIXER_WRITE(SOUND_MIXER_VIDEO) #define SOUND_MIXER_WRITE_MONITOR MIXER_WRITE(SOUND_MIXER_MONITOR) #define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE) #define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE) #define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD) #define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC) typedef struct mixer_info { char id[16]; char name[32]; int modify_counter; int fillers[10]; } mixer_info; #define SOUND_MIXER_INFO _IOR('M', 101, mixer_info) #define LEFT_CHN 0 #define RIGHT_CHN 1 /* * Level 2 event types for /dev/sequencer */ /* * The 4 most significant bits of byte 0 specify the class of * the event: * * 0x8X = system level events, * 0x9X = device/port specific events, event[1] = device/port, * The last 4 bits give the subtype: * 0x02 = Channel event (event[3] = chn). * 0x01 = note event (event[4] = note). * (0x01 is not used alone but always with bit 0x02). * event[2] = MIDI message code (0x80=note off etc.) * */ #define EV_SEQ_LOCAL 0x80 #define EV_TIMING 0x81 #define EV_CHN_COMMON 0x92 #define EV_CHN_VOICE 0x93 #define EV_SYSEX 0x94 /* * Event types 200 to 220 are reserved for application use. * These numbers will not be used by the driver. */ /* * Events for event type EV_CHN_VOICE */ #define MIDI_NOTEOFF 0x80 #define MIDI_NOTEON 0x90 #define MIDI_KEY_PRESSURE 0xA0 /* * Events for event type EV_CHN_COMMON */ #define MIDI_CTL_CHANGE 0xB0 #define MIDI_PGM_CHANGE 0xC0 #define MIDI_CHN_PRESSURE 0xD0 #define MIDI_PITCH_BEND 0xE0 #define MIDI_SYSTEM_PREFIX 0xF0 /* * Timer event types */ #define TMR_WAIT_REL 1 /* Time relative to the prev time */ #define TMR_WAIT_ABS 2 /* Absolute time since TMR_START */ #define TMR_STOP 3 #define TMR_START 4 #define TMR_CONTINUE 5 #define TMR_TEMPO 6 #define TMR_ECHO 8 #define TMR_CLOCK 9 /* MIDI clock */ #define TMR_SPP 10 /* Song position pointer */ #define TMR_TIMESIG 11 /* Time signature */ /* * Local event types */ #define LOCL_STARTAUDIO 1 #if (!defined(_KERNEL) && !defined(INKERNEL)) || defined(USE_SEQ_MACROS) /* * Some convenience macros to simplify programming of the * /dev/sequencer interface * * These macros define the API which should be used when possible. */ #ifndef USE_SIMPLE_MACROS void seqbuf_dump(void); /* This function must be provided by programs */ /* Sample seqbuf_dump() implementation: * * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes * * int seqfd; -- The file descriptor for /dev/sequencer. * * void * seqbuf_dump () * { * if (_seqbufptr) * if (write (seqfd, _seqbuf, _seqbufptr) == -1) * { * perror ("write /dev/sequencer"); * exit (-1); * } * _seqbufptr = 0; * } */ #define SEQ_DEFINEBUF(len) \ u_char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0 #define SEQ_USE_EXTBUF() \ extern u_char _seqbuf[]; \ extern int _seqbuflen;extern int _seqbufptr #define SEQ_DECLAREBUF() SEQ_USE_EXTBUF() #define SEQ_PM_DEFINES struct patmgr_info _pm_info #define _SEQ_NEEDBUF(len) \ if ((_seqbufptr+(len)) > _seqbuflen) \ seqbuf_dump() #define _SEQ_ADVBUF(len) _seqbufptr += len #define SEQ_DUMPBUF seqbuf_dump #else /* * This variation of the sequencer macros is used just to format one event * using fixed buffer. * * The program using the macro library must define the following macros before * using this library. * * #define _seqbuf name of the buffer (u_char[]) * #define _SEQ_ADVBUF(len) If the applic needs to know the exact * size of the event, this macro can be used. * Otherwise this must be defined as empty. * #define _seqbufptr Define the name of index variable or 0 if * not required. */ #define _SEQ_NEEDBUF(len) /* empty */ #endif #define PM_LOAD_PATCH(dev, bank, pgm) \ (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \ _pm_info.device=dev, _pm_info.data.data8[0]=pgm, \ _pm_info.parm1 = bank, _pm_info.parm2 = 1, \ ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info)) #define PM_LOAD_PATCHES(dev, bank, pgm) \ (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \ _pm_info.device=dev, bcopy( pgm, _pm_info.data.data8, 128), \ _pm_info.parm1 = bank, _pm_info.parm2 = 128, \ ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info)) #define SEQ_VOLUME_MODE(dev, mode) { \ _SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ _seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\ _seqbuf[_seqbufptr+2] = (dev);\ _seqbuf[_seqbufptr+3] = (mode);\ _seqbuf[_seqbufptr+4] = 0;\ _seqbuf[_seqbufptr+5] = 0;\ _seqbuf[_seqbufptr+6] = 0;\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);} /* * Midi voice messages */ #define _CHN_VOICE(dev, event, chn, note, parm) { \ _SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_CHN_VOICE;\ _seqbuf[_seqbufptr+1] = (dev);\ _seqbuf[_seqbufptr+2] = (event);\ _seqbuf[_seqbufptr+3] = (chn);\ _seqbuf[_seqbufptr+4] = (note);\ _seqbuf[_seqbufptr+5] = (parm);\ _seqbuf[_seqbufptr+6] = (0);\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);} #define SEQ_START_NOTE(dev, chn, note, vol) \ _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol) #define SEQ_STOP_NOTE(dev, chn, note, vol) \ _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol) #define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \ _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure) /* * Midi channel messages */ #define _CHN_COMMON(dev, event, chn, p1, p2, w14) { \ _SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_CHN_COMMON;\ _seqbuf[_seqbufptr+1] = (dev);\ _seqbuf[_seqbufptr+2] = (event);\ _seqbuf[_seqbufptr+3] = (chn);\ _seqbuf[_seqbufptr+4] = (p1);\ _seqbuf[_seqbufptr+5] = (p2);\ *(short *)&_seqbuf[_seqbufptr+6] = (w14);\ _SEQ_ADVBUF(8);} /* * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits * sending any MIDI bytes but it's absolutely not possible. Trying to do * so _will_ cause problems with MPU401 intelligent mode). * * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be * sent by calling SEQ_SYSEX() several times (there must be no other events * between them). First sysex fragment must have 0xf0 in the first byte * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte * between these sysex start and end markers cannot be larger than 0x7f. Also * lengths of each fragments (except the last one) must be 6. * * Breaking the above rules may work with some MIDI ports but is likely to * cause fatal problems with some other devices (such as MPU401). */ #define SEQ_SYSEX(dev, buf, len) { \ int i, l=(len); if (l>6)l=6;\ _SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_SYSEX;\ for(i=0;i namespace stk { extern "C" THREAD_RETURN THREAD_TYPE inputThread( void * ptr ) { ThreadInfo *info = (ThreadInfo *)ptr; while ( !info->finished ) { ((InetWvIn *) info->object)->receive(); } return 0; } InetWvIn :: InetWvIn( unsigned long bufferFrames, unsigned int nBuffers ) :soket_(0), buffer_(0), bufferFrames_(bufferFrames), bufferBytes_(0), nBuffers_(nBuffers), connected_(false) { threadInfo_.finished = false; threadInfo_.object = (void *) this; // Start the input thread. if ( !thread_.start( &inputThread, &threadInfo_ ) ) { oStream_ << "InetWvIn(): unable to start input thread in constructor!"; handleError( StkError::PROCESS_THREAD ); } } InetWvIn :: ~InetWvIn() { // Close down the thread. connected_ = false; threadInfo_.finished = true; if ( soket_ ) delete soket_; if ( buffer_ ) delete [] buffer_; } void InetWvIn :: listen( int port, unsigned int nChannels, Stk::StkFormat format, Socket::ProtocolType protocol ) { mutex_.lock(); if ( connected_ ) delete soket_; if ( nChannels < 1 ) { oStream_ << "InetWvIn()::listen(): the channel argument must be greater than zero."; handleError( StkError::FUNCTION_ARGUMENT ); } if ( format == STK_SINT16 ) dataBytes_ = 2; else if ( format == STK_SINT32 || format == STK_FLOAT32 ) dataBytes_ = 4; else if ( format == STK_FLOAT64 ) dataBytes_ = 8; else if ( format == STK_SINT8 ) dataBytes_ = 1; else { oStream_ << "InetWvIn(): unknown data type specified!"; handleError( StkError::FUNCTION_ARGUMENT ); } dataType_ = format; unsigned long bufferBytes = bufferFrames_ * nBuffers_ * nChannels * dataBytes_; if ( bufferBytes > bufferBytes_ ) { if ( buffer_) delete [] buffer_; buffer_ = (char *) new char[ bufferBytes ]; bufferBytes_ = bufferBytes; } data_.resize( bufferFrames_, nChannels ); lastFrame_.resize( 1, nChannels, 0.0 ); bufferCounter_ = 0; writePoint_ = 0; readPoint_ = 0; bytesFilled_ = 0; if ( protocol == Socket::PROTO_TCP ) { TcpServer *socket = new TcpServer( port ); oStream_ << "InetWvIn:listen(): waiting for TCP connection on port " << socket->port() << " ... "; handleError( StkError::STATUS ); fd_ = socket->accept(); if ( fd_ < 0) { oStream_ << "InetWvIn::listen(): Error accepting TCP connection request!"; handleError( StkError::PROCESS_SOCKET ); } oStream_ << "InetWvIn::listen(): TCP socket connection made!"; handleError( StkError::STATUS ); soket_ = (Socket *) socket; } else { soket_ = new UdpSocket( port ); fd_ = soket_->id(); } connected_ = true; mutex_.unlock(); } void InetWvIn :: receive( void ) { if ( !connected_ ) { Stk::sleep(100); return; } fd_set mask; FD_ZERO( &mask ); FD_SET( fd_, &mask ); // The select function will block until data is available for reading. select( fd_+1, &mask, (fd_set *)0, (fd_set *)0, NULL ); if ( FD_ISSET( fd_, &mask ) ) { mutex_.lock(); unsigned long unfilled = bufferBytes_ - bytesFilled_; if ( unfilled > 0 ) { // There's room in our buffer for more data. unsigned long endPoint = writePoint_ + unfilled; if ( endPoint > bufferBytes_ ) unfilled -= endPoint - bufferBytes_; int i = soket_->readBuffer( fd_, (void *)&buffer_[writePoint_], unfilled, 0 ); //int i = Socket::readBuffer( fd_, (void *)&buffer_[writePoint_], unfilled, 0 ); if ( i <= 0 ) { oStream_ << "InetWvIn::receive(): the remote InetWvIn socket has closed."; handleError( StkError::STATUS ); connected_ = false; mutex_.unlock(); return; } bytesFilled_ += i; writePoint_ += i; if ( writePoint_ == bufferBytes_ ) writePoint_ = 0; mutex_.unlock(); } else { // Sleep 10 milliseconds AFTER unlocking mutex. mutex_.unlock(); Stk::sleep( 10 ); } } } int InetWvIn :: readData( void ) { // We have two potential courses of action should this method // be called and the input buffer isn't sufficiently filled. // One solution is to fill the data buffer with zeros and return. // The other solution is to wait until the necessary data exists. // I chose the latter, as it works for both streamed files // (non-realtime data transport) and realtime playback (given // adequate network bandwidth and speed). // Wait until data is ready. unsigned long bytes = data_.size() * dataBytes_; while ( connected_ && bytesFilled_ < bytes ) Stk::sleep( 10 ); if ( !connected_ && bytesFilled_ == 0 ) return 0; bytes = ( bytesFilled_ < bytes ) ? bytesFilled_ : bytes; // Copy samples from buffer to data. StkFloat gain; long samples = bytes / dataBytes_; mutex_.lock(); if ( dataType_ == STK_SINT16 ) { gain = 1.0 / 32767.0; SINT16 *buf = (SINT16 *) (buffer_+readPoint_); for (int i=0; i 0 || bufferCounter_ > 0 ) return true; else return connected_; } StkFloat InetWvIn :: tick( unsigned int channel ) { // If no connection and we've output all samples in the queue, return 0.0. if ( !connected_ && bytesFilled_ == 0 && bufferCounter_ == 0 ) { #if defined(_STK_DEBUG_) oStream_ << "InetWvIn::tick(): a valid socket connection does not exist!"; handleError( StkError::DEBUG_PRINT ); #endif return 0.0; } #if defined(_STK_DEBUG_) if ( channel >= data_.channels() ) { oStream_ << "InetWvIn::tick(): channel argument is incompatible with data stream!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif if ( bufferCounter_ == 0 ) bufferCounter_ = readData(); unsigned int nChannels = lastFrame_.channels(); long index = ( bufferFrames_ - bufferCounter_ ) * nChannels; for ( unsigned int i=0; itick(); for ( j=0; j namespace stk { InetWvOut :: InetWvOut( unsigned long packetFrames ) : buffer_(0), soket_(0), bufferFrames_(packetFrames), bufferBytes_(0) { } InetWvOut :: InetWvOut( int port, Socket::ProtocolType protocol, std::string hostname, unsigned int nChannels, Stk::StkFormat format, unsigned long packetFrames ) : buffer_(0), soket_(0), bufferFrames_(packetFrames), bufferBytes_(0) { connect( port, protocol, hostname, nChannels, format ); } InetWvOut :: ~InetWvOut() { disconnect(); if ( soket_ ) delete soket_; if ( buffer_ ) delete [] buffer_; } void InetWvOut :: connect( int port, Socket::ProtocolType protocol, std::string hostname, unsigned int nChannels, Stk::StkFormat format ) { if ( soket_ && soket_->isValid( soket_->id() ) ) disconnect(); if ( nChannels == 0 ) { oStream_ << "InetWvOut::connect: the channel argument must be greater than zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } if ( format == STK_SINT8 ) dataBytes_ = 1; else if ( format == STK_SINT16 ) dataBytes_ = 2; else if ( format == STK_SINT32 || format == STK_FLOAT32 ) dataBytes_ = 4; else if ( format == STK_FLOAT64 ) dataBytes_ = 8; else { oStream_ << "InetWvOut::connect: unknown data type specified."; handleError( StkError::FUNCTION_ARGUMENT ); } dataType_ = format; if ( protocol == Socket::PROTO_TCP ) { soket_ = new TcpClient( port, hostname ); } else { // For UDP sockets, the sending and receiving sockets cannot have // the same port number. Since the port argument corresponds to // the destination port, we will associate this socket instance // with a different port number (arbitrarily determined as port - // 1). UdpSocket *socket = new UdpSocket( port - 1 ); socket->setDestination( port, hostname ); soket_ = (Socket *) socket; } // Allocate new memory if necessary. data_.resize( bufferFrames_, nChannels ); unsigned long bufferBytes = dataBytes_ * bufferFrames_ * nChannels; if ( bufferBytes > bufferBytes_ ) { if ( buffer_) delete [] buffer_; buffer_ = (char *) new char[ bufferBytes ]; bufferBytes_ = bufferBytes; } frameCounter_ = 0; bufferIndex_ = 0; iData_ = 0; } void InetWvOut :: disconnect(void) { if ( soket_ ) { writeData( bufferIndex_ ); soket_->close( soket_->id() ); delete soket_; soket_ = 0; } } void InetWvOut :: writeData( unsigned long frames ) { unsigned long samples = frames * data_.channels(); if ( dataType_ == STK_SINT8 ) { signed char *ptr = (signed char *) buffer_; for ( unsigned long k=0; kclipTest( data_[k] ); *ptr++ = (signed char) (data_[k] * 127.0); } } else if ( dataType_ == STK_SINT16 ) { SINT16 *ptr = (SINT16 *) buffer_; for ( unsigned long k=0; kclipTest( data_[k] ); *ptr = (SINT16) (data_[k] * 32767.0); #ifdef __LITTLE_ENDIAN__ swap16 ((unsigned char *)ptr); #endif ptr++; } } else if ( dataType_ == STK_SINT32 ) { SINT32 *ptr = (SINT32 *) buffer_; for ( unsigned long k=0; kclipTest( data_[k] ); *ptr = (SINT32) (data_[k] * 2147483647.0); #ifdef __LITTLE_ENDIAN__ swap32 ((unsigned char *)ptr); #endif ptr++; } } else if ( dataType_ == STK_FLOAT32 ) { FLOAT32 *ptr = (FLOAT32 *) buffer_; for ( unsigned long k=0; kclipTest( data_[k] ); *ptr = (FLOAT32) data_[k]; #ifdef __LITTLE_ENDIAN__ swap32 ((unsigned char *)ptr); #endif ptr++; } } else if ( dataType_ == STK_FLOAT64 ) { FLOAT64 *ptr = (FLOAT64 *) buffer_; for ( unsigned long k=0; kclipTest( data_[k] ); *ptr = (FLOAT64) data_[k]; #ifdef __LITTLE_ENDIAN__ swap64 ((unsigned char *)ptr); #endif ptr++; } } long bytes = dataBytes_ * samples; if ( soket_->writeBuffer( (const void *)buffer_, bytes, 0 ) < 0 ) { oStream_ << "InetWvOut: connection to socket server failed!"; handleError( StkError::PROCESS_SOCKET ); } } void InetWvOut :: incrementFrame( void ) { frameCounter_++; bufferIndex_++; if ( bufferIndex_ == bufferFrames_ ) { writeData( bufferFrames_ ); bufferIndex_ = 0; iData_ = 0; } } void InetWvOut :: tick( const StkFloat sample ) { if ( !soket_ || !soket_->isValid( soket_->id() ) ) { #if defined(_STK_DEBUG_) oStream_ << "InetWvOut::tick(): a valid socket connection does not exist!"; handleError( StkError::DEBUG_PRINT ); #endif return; } unsigned int nChannels = data_.channels(); StkFloat input = sample; clipTest( input ); for ( unsigned int j=0; jincrementFrame(); } void InetWvOut :: tick( const StkFrames& frames ) { if ( !soket_ || !soket_->isValid( soket_->id() ) ) { #if defined(_STK_DEBUG_) oStream_ << "InetWvOut::tick(): a valid socket connection does not exist!"; handleError( StkError::DEBUG_PRINT ); #endif return; } #if defined(_STK_DEBUG_) if ( data_.channels() != frames.channels() ) { oStream_ << "InetWvOut::tick(): incompatible channel value in StkFrames argument!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif unsigned int j, nChannels = data_.channels(); unsigned int iFrames = 0; for ( unsigned int i=0; iincrementFrame(); } } } // stk namespace stk-4.5.0/src/JCRev.cpp0000644000076600007660000000751512327014024012407 0ustar gary/***************************************************/ /*! \class JCRev \brief John Chowning's reverberator class. This class takes a monophonic input signal and produces a stereo output signal. It is derived from the CLM JCRev function, which is based on the use of networks of simple allpass and comb delay filters. This class implements three series allpass units, followed by four parallel comb filters, and two decorrelation delay lines in parallel at the output. Although not in the original JC reverberator, one-pole lowpass filters have been added inside the feedback comb filters. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "JCRev.h" #include namespace stk { JCRev :: JCRev( StkFloat T60 ) { if ( T60 <= 0.0 ) { oStream_ << "JCRev::JCRev: argument (" << T60 << ") must be positive!"; handleError( StkError::FUNCTION_ARGUMENT ); } lastFrame_.resize( 1, 2, 0.0 ); // resize lastFrame_ for stereo output // Delay lengths for 44100 Hz sample rate. int lengths[9] = {1116, 1356, 1422, 1617, 225, 341, 441, 211, 179}; double scaler = Stk::sampleRate() / 44100.0; int delay, i; if ( scaler != 1.0 ) { for ( i=0; i<9; i++ ) { delay = (int) floor( scaler * lengths[i] ); if ( (delay & 1) == 0) delay++; while ( !this->isPrime(delay) ) delay += 2; lengths[i] = delay; } } for ( i=0; i<3; i++ ) { allpassDelays_[i].setMaximumDelay( lengths[i+4] ); allpassDelays_[i].setDelay( lengths[i+4] ); } for ( i=0; i<4; i++ ) { combDelays_[i].setMaximumDelay( lengths[i] ); combDelays_[i].setDelay( lengths[i] ); combFilters_[i].setPole( 0.2 ); } this->setT60( T60 ); outLeftDelay_.setMaximumDelay( lengths[7] ); outLeftDelay_.setDelay( lengths[7] ); outRightDelay_.setMaximumDelay( lengths[8] ); outRightDelay_.setDelay( lengths[8] ); allpassCoefficient_ = 0.7; effectMix_ = 0.3; this->clear(); } void JCRev :: clear() { allpassDelays_[0].clear(); allpassDelays_[1].clear(); allpassDelays_[2].clear(); combDelays_[0].clear(); combDelays_[1].clear(); combDelays_[2].clear(); combDelays_[3].clear(); outRightDelay_.clear(); outLeftDelay_.clear(); lastFrame_[0] = 0.0; lastFrame_[1] = 0.0; } void JCRev :: setT60( StkFloat T60 ) { if ( T60 <= 0.0 ) { oStream_ << "JCRev::setT60: argument (" << T60 << ") must be positive!"; handleError( StkError::WARNING ); return; } for ( int i=0; i<4; i++ ) combCoefficient_[i] = pow(10.0, (-3.0 * combDelays_[i].getDelay() / (T60 * Stk::sampleRate()))); } StkFrames& JCRev :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() - 1 ) { oStream_ << "JCRev::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() - 1 ) { oStream_ << "JCRev::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; isetFrequency( 220.0 ); this->setPluckPosition( 0.4 ); } Mandolin :: ~Mandolin( void ) { } void Mandolin :: clear( void ) { strings_[0].clear(); strings_[1].clear(); } void Mandolin :: setPluckPosition( StkFloat position ) { if ( position < 0.0 || position > 1.0 ) { std::cerr << "Mandolin::setPluckPosition: position parameter out of range!"; handleError( StkError::WARNING ); return; } strings_[0].setPluckPosition( position ); strings_[1].setPluckPosition( position ); } void Mandolin :: setDetune( StkFloat detune ) { if ( detune <= 0.0 ) { oStream_ << "Mandolin::setDeturn: parameter is less than or equal to zero!"; handleError( StkError::WARNING ); return; } detuning_ = detune; strings_[1].setFrequency( frequency_ * detuning_ ); } void Mandolin :: setBodySize( StkFloat size ) { // Scale the commuted body response by its sample rate (22050). StkFloat rate = size * 22050.0 / Stk::sampleRate(); for ( int i=0; i<12; i++ ) soundfile_[i].setRate( rate ); } void Mandolin :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Mandolin::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif frequency_ = frequency; strings_[0].setFrequency( frequency_ ); strings_[1].setFrequency( frequency_ * detuning_ ); } void Mandolin :: pluck( StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "Mandolin::pluck: amplitude parameter out of range!"; handleError( StkError::WARNING ); return; } soundfile_[mic_].reset(); pluckAmplitude_ = amplitude; //strings_[0].setLoopGain( 0.97 + pluckAmplitude_ * 0.03 ); //strings_[1].setLoopGain( 0.97 + pluckAmplitude_ * 0.03 ); } void Mandolin :: pluck( StkFloat amplitude, StkFloat position ) { this->setPluckPosition( position ); this->pluck( amplitude ); } void Mandolin :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); this->pluck( amplitude ); } void Mandolin :: noteOff( StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "Mandolin::noteOff: amplitude is out of range!"; handleError( StkError::WARNING ); return; } //strings_[0].setLoopGain( 0.97 + (1 - amplitude) * 0.03 ); //strings_[1].setLoopGain( 0.97 + (1 - amplitude) * 0.03 ); } void Mandolin :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Mandolin::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if ( number == __SK_BodySize_ ) // 2 this->setBodySize( normalizedValue * 2.0 ); else if ( number == __SK_PickPosition_ ) // 4 this->setPluckPosition( normalizedValue ); else if ( number == __SK_StringDamping_ ) { // 11 strings_[0].setLoopGain( 0.97 + (normalizedValue * 0.03) ); strings_[1].setLoopGain( 0.97 + (normalizedValue * 0.03) ); } else if ( number == __SK_StringDetune_ ) // 1 this->setDetune( 1.0 - (normalizedValue * 0.1) ); else if ( number == __SK_AfterTouch_Cont_ ) // 128 mic_ = (int) (normalizedValue * 11.0); #if defined(_STK_DEBUG_) else { oStream_ << "Mandolin::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Mesh2D.cpp0000644000076600007660000002160612327014024012515 0ustar gary/***************************************************/ /*! \class Mesh2D \brief Two-dimensional rectilinear waveguide mesh class. This class implements a rectilinear, two-dimensional digital waveguide mesh structure. For details, see Van Duyne and Smith, "Physical Modeling with the 2-D Digital Waveguide Mesh", Proceedings of the 1993 International Computer Music Conference. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - X Dimension = 2 - Y Dimension = 4 - Mesh Decay = 11 - X-Y Input Position = 1 by Julius Smith, 2000 - 2002. Revised by Gary Scavone for STK, 2002. */ /***************************************************/ #include "Mesh2D.h" #include "SKINI.msg" namespace stk { Mesh2D :: Mesh2D( unsigned short nX, unsigned short nY ) { if ( nX == 0.0 || nY == 0.0 ) { oStream_ << "Mesh2D::Mesh2D: one or more argument is equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } this->setNX( nX ); this->setNY( nY ); StkFloat pole = 0.05; unsigned short i; for ( i=0; iclearMesh(); counter_ = 0; xInput_ = 0; yInput_ = 0; } Mesh2D :: ~Mesh2D( void ) { } void Mesh2D :: clear( void ) { this->clearMesh(); unsigned short i; for ( i=0; i NXMAX ) { oStream_ << "Mesh2D::setNX(" << lenX << "): Maximum length is " << NXMAX << '!'; handleError( StkError::WARNING ); return; } NX_ = lenX; } void Mesh2D :: setNY( unsigned short lenY ) { if ( lenY < 2 ) { oStream_ << "Mesh2D::setNY(" << lenY << "): Minimum length is 2!"; handleError( StkError::WARNING ); return; } else if ( lenY > NYMAX ) { oStream_ << "Mesh2D::setNY(" << lenY << "): Maximum length is " << NXMAX << '!'; handleError( StkError::WARNING ); return; } NY_ = lenY; } void Mesh2D :: setDecay( StkFloat decayFactor ) { if ( decayFactor < 0.0 || decayFactor > 1.0 ) { oStream_ << "Mesh2D::setDecay: decayFactor is out of range!"; handleError( StkError::WARNING ); return; } int i; for ( i=0; i 1.0 ) { oStream_ << "Mesh2D::setInputPosition xFactor value is out of range!"; handleError( StkError::WARNING ); return; } if ( yFactor < 0.0 || yFactor > 1.0 ) { oStream_ << "Mesh2D::setInputPosition yFactor value is out of range!"; handleError( StkError::WARNING ); return; } xInput_ = (unsigned short) (xFactor * (NX_ - 1)); yInput_ = (unsigned short) (yFactor * (NY_ - 1)); } void Mesh2D :: noteOn( StkFloat frequency, StkFloat amplitude ) { // Input at corner. if ( counter_ & 1 ) { vxp1_[xInput_][yInput_] += amplitude; vyp1_[xInput_][yInput_] += amplitude; } else { vxp_[xInput_][yInput_] += amplitude; vyp_[xInput_][yInput_] += amplitude; } } void Mesh2D :: noteOff( StkFloat amplitude ) { return; } StkFloat Mesh2D :: inputTick( StkFloat input ) { if ( counter_ & 1 ) { vxp1_[xInput_][yInput_] += input; vyp1_[xInput_][yInput_] += input; lastFrame_[0] = tick1(); } else { vxp_[xInput_][yInput_] += input; vyp_[xInput_][yInput_] += input; lastFrame_[0] = tick0(); } counter_++; return lastFrame_[0]; } StkFloat Mesh2D :: tick( unsigned int ) { lastFrame_[0] = ((counter_ & 1) ? this->tick1() : this->tick0()); counter_++; return lastFrame_[0]; } const StkFloat VSCALE = 0.5; StkFloat Mesh2D :: tick0( void ) { int x, y; StkFloat outsamp = 0; // Update junction velocities. for (x=0; xsetNX( (unsigned short) (normalizedValue * (NXMAX-2) + 2) ); else if ( number == 4 ) // 4 this->setNY( (unsigned short) (normalizedValue * (NYMAX-2) + 2) ); else if ( number == 11 ) // 11 this->setDecay( 0.9 + (normalizedValue * 0.1) ); else if ( number == __SK_ModWheel_ ) // 1 this->setInputPosition( normalizedValue, normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "Mesh2D::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Messager.cpp0000644000076600007660000003134612327014024013203 0ustar gary/***************************************************/ /*! \class Messager \brief STK input control message parser. This class reads and parses control messages from a variety of sources, such as a scorefile, MIDI port, socket connection, or stdin. MIDI messages are retrieved using the RtMidi class. All other input sources (scorefile, socket, or stdin) are assumed to provide SKINI formatted messages. This class can be compiled with generic, non-realtime support, in which case only scorefile reading is possible. The various \e realtime message acquisition mechanisms (from MIDI, socket, or stdin) take place asynchronously, filling the message queue. A call to popMessage() will pop the next available control message from the queue and return it via the referenced Message structure. When a \e non-realtime scorefile is set, it is not possible to start reading realtime input messages (from MIDI, socket, or stdin). Likewise, it is not possible to read from a scorefile when a realtime input mechanism is running. When MIDI input is started, input is also automatically read from stdin. This allows for program termination via the terminal window. An __SK_Exit_ message is pushed onto the stack whenever an "exit" or "Exit" message is received from stdin or when all socket connections close and no stdin thread is running. This class is primarily for use in STK example programs but it is generic enough to work in many other contexts. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Messager.h" #include #include #include "SKINI.msg" namespace stk { #if defined(__STK_REALTIME__) extern "C" THREAD_RETURN THREAD_TYPE stdinHandler(void * ptr); extern "C" THREAD_RETURN THREAD_TYPE socketHandler(void * ptr); #endif // __STK_REALTIME__ typedef int MessagerSourceType; MessagerSourceType STK_FILE = 0x1; MessagerSourceType STK_MIDI = 0x2; MessagerSourceType STK_STDIN = 0x4; MessagerSourceType STK_SOCKET = 0x8; Messager :: Messager() { data_.sources = 0; data_.queueLimit = DEFAULT_QUEUE_LIMIT; #if defined(__STK_REALTIME__) data_.socket = 0; data_.midi = 0; #endif } Messager :: ~Messager() { // Clear the queue in case any thread is waiting on its limit. #if defined(__STK_REALTIME__) data_.mutex.lock(); #endif while ( data_.queue.size() ) data_.queue.pop(); data_.sources = 0; #if defined(__STK_REALTIME__) data_.mutex.unlock(); if ( data_.socket ) { socketThread_.wait(); delete data_.socket; } if ( data_.midi ) delete data_.midi; #endif } bool Messager :: setScoreFile( const char* filename ) { if ( data_.sources ) { if ( data_.sources == STK_FILE ) { oStream_ << "Messager::setScoreFile: already reading a scorefile!"; handleError( StkError::WARNING ); } else { oStream_ << "Messager::setScoreFile: already reading realtime control input ... cannot do scorefile input too!"; handleError( StkError::WARNING ); } return false; } if ( !data_.skini.setFile( filename ) ) return false; data_.sources = STK_FILE; return true; } void Messager :: popMessage( Skini::Message& message ) { if ( data_.sources == STK_FILE ) { // scorefile input if ( !data_.skini.nextMessage( message ) ) message.type = __SK_Exit_; return; } if ( data_.queue.size() == 0 ) { // An empty (or invalid) message is indicated by a type = 0. message.type = 0; return; } // Copy queued message to the message pointer structure and then "pop" it. #if defined(__STK_REALTIME__) data_.mutex.lock(); #endif message = data_.queue.front(); data_.queue.pop(); #if defined(__STK_REALTIME__) data_.mutex.unlock(); #endif } void Messager :: pushMessage( Skini::Message& message ) { #if defined(__STK_REALTIME__) data_.mutex.lock(); #endif data_.queue.push( message ); #if defined(__STK_REALTIME__) data_.mutex.unlock(); #endif } #if defined(__STK_REALTIME__) bool Messager :: startStdInput() { if ( data_.sources == STK_FILE ) { oStream_ << "Messager::startStdInput: already reading a scorefile ... cannot do realtime control input too!"; handleError( StkError::WARNING ); return false; } if ( data_.sources & STK_STDIN ) { oStream_ << "Messager::startStdInput: stdin input thread already started."; handleError( StkError::WARNING ); return false; } // Start the stdin input thread. if ( !stdinThread_.start( (THREAD_FUNCTION)&stdinHandler, &data_ ) ) { oStream_ << "Messager::startStdInput: unable to start stdin input thread!"; handleError( StkError::WARNING ); return false; } data_.sources |= STK_STDIN; return true; } THREAD_RETURN THREAD_TYPE stdinHandler(void *ptr) { Messager::MessagerData *data = (Messager::MessagerData *) ptr; Skini::Message message; std::string line; while ( !std::getline( std::cin, line).eof() ) { if ( line.empty() ) continue; if ( line.compare(0, 4, "Exit") == 0 || line.compare(0, 4, "exit") == 0 ) break; data->mutex.lock(); if ( data->skini.parseString( line, message ) ) data->queue.push( message ); data->mutex.unlock(); while ( data->queue.size() >= data->queueLimit ) Stk::sleep( 50 ); } // We assume here that if someone types an "exit" message in the // terminal window, all processing should stop. message.type = __SK_Exit_; data->queue.push( message ); data->sources &= ~STK_STDIN; return NULL; } void midiHandler( double timeStamp, std::vector *bytes, void *ptr ) { if ( bytes->size() < 2 ) return; // Parse the MIDI bytes ... only keep MIDI channel messages. if ( bytes->at(0) > 239 ) return; Messager::MessagerData *data = (Messager::MessagerData *) ptr; Skini::Message message; message.type = bytes->at(0) & 0xF0; message.channel = bytes->at(0) & 0x0F; message.time = 0.0; // realtime messages should have delta time = 0.0 message.intValues[0] = bytes->at(1); message.floatValues[0] = (StkFloat) message.intValues[0]; if ( ( message.type != 0xC0 ) && ( message.type != 0xD0 ) ) { if ( bytes->size() < 3 ) return; message.intValues[1] = bytes->at(2); if ( message.type == 0xE0 ) { // combine pithbend into single "14-bit" value message.intValues[0] += message.intValues[1] <<= 7; message.floatValues[0] = (StkFloat) message.intValues[0]; message.intValues[1] = 0; } else message.floatValues[1] = (StkFloat) message.intValues[1]; } while ( data->queue.size() >= data->queueLimit ) Stk::sleep( 50 ); data->mutex.lock(); data->queue.push( message ); data->mutex.unlock(); } bool Messager :: startMidiInput( int port ) { if ( data_.sources == STK_FILE ) { oStream_ << "Messager::startMidiInput: already reading a scorefile ... cannot do realtime control input too!"; handleError( StkError::WARNING ); return false; } if ( data_.sources & STK_MIDI ) { oStream_ << "Messager::startMidiInput: MIDI input already started."; handleError( StkError::WARNING ); return false; } // First start the stdin input thread if it isn't already running // (to allow the user to exit). if ( !( data_.sources & STK_STDIN ) ) { if ( this->startStdInput() == false ) { oStream_ << "Messager::startMidiInput: unable to start input from stdin."; handleError( StkError::WARNING ); return false; } } try { data_.midi = new RtMidiIn(); data_.midi->setCallback( &midiHandler, (void *) &data_ ); if ( port == -1 ) data_.midi->openVirtualPort(); else data_.midi->openPort( (unsigned int)port ); } catch ( RtMidiError &error ) { oStream_ << "Messager::startMidiInput: error creating RtMidiIn instance (" << error.getMessage() << ")."; handleError( StkError::WARNING ); return false; } data_.sources |= STK_MIDI; return true; } bool Messager :: startSocketInput( int port ) { if ( data_.sources == STK_FILE ) { oStream_ << "Messager::startSocketInput: already reading a scorefile ... cannot do realtime control input too!"; handleError( StkError::WARNING ); return false; } if ( data_.sources & STK_SOCKET ) { oStream_ << "Messager::startSocketInput: socket input thread already started."; handleError( StkError::WARNING ); return false; } // Create the socket server. try { data_.socket = new TcpServer( port ); } catch ( StkError& ) { return false; } oStream_ << "Socket server listening for connection(s) on port " << port << "..."; handleError( StkError::STATUS ); // Initialize socket descriptor information. FD_ZERO(&data_.mask); int fd = data_.socket->id(); FD_SET( fd, &data_.mask ); data_.fd.push_back( fd ); // Start the socket thread. if ( !socketThread_.start( (THREAD_FUNCTION)&socketHandler, &data_ ) ) { oStream_ << "Messager::startSocketInput: unable to start socket input thread!"; handleError( StkError::WARNING ); return false; } data_.sources |= STK_SOCKET; return true; } #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) #include #include #endif THREAD_RETURN THREAD_TYPE socketHandler(void *ptr) { Messager::MessagerData *data = (Messager::MessagerData *) ptr; Skini::Message message; std::vector& fd = data->fd; struct timeval timeout; fd_set rmask; int newfd; unsigned int i; const int bufferSize = 1024; char buffer[bufferSize]; int index = 0, bytesRead = 0; std::string line; std::vector fdclose; while ( data->sources & STK_SOCKET ) { // Use select function to periodically poll socket desriptors. rmask = data->mask; timeout.tv_sec = 0; timeout.tv_usec = 50000; // 50 milliseconds if ( select( fd.back()+1, &rmask, (fd_set *)0, (fd_set *)0, &timeout ) <= 0 ) continue; // A file descriptor is set. Check if there's a new socket connection available. if ( FD_ISSET( data->socket->id(), &rmask ) ) { // Accept and service new connection. newfd = data->socket->accept(); if ( newfd >= 0 ) { std::cout << "New socket connection made.\n" << std::endl; // Set the socket to non-blocking mode. Socket::setBlocking( newfd, false ); // Save the descriptor and update the masks. fd.push_back( newfd ); std::sort( fd.begin(), data->fd.end() ); FD_SET( newfd, &data->mask ); FD_CLR( data->socket->id(), &rmask ); } else std::cerr << "Messager: Couldn't accept connection request!\n"; } // Check the other descriptors. for ( i=0; imutex.lock(); if ( line.compare(0, 4, "Exit") == 0 || line.compare(0, 4, "exit") == 0 ) { // Ignore this line and assume the connection will be // closed on a subsequent read call. ; } else if ( data->skini.parseString( line, message ) ) data->queue.push( message ); data->mutex.unlock(); line.erase(); } } index = 0; bytesRead = Socket::readBuffer(fd[i], buffer, bufferSize, 0); if (bytesRead == 0) { // This socket connection closed. FD_CLR( fd[i], &data->mask ); Socket::close( fd[i] ); fdclose.push_back( fd[i] ); } } } // Now remove descriptors for closed connections. for ( i=0; isources &= ~STK_SOCKET; if ( data->sources & STK_MIDI ) std::cout << "MIDI input still running ... type 'exit' to quit.\n" << std::endl; else if ( !(data->sources & STK_STDIN) ) { // No stdin thread running, so quit now. message.type = __SK_Exit_; data->queue.push( message ); } } fdclose.clear(); } // Wait until we're below the queue limit. while ( data->queue.size() >= data->queueLimit ) Stk::sleep( 50 ); } return NULL; } #endif } // stk namespace stk-4.5.0/src/MidiFileIn.cpp0000644000076600007660000002714712327014024013412 0ustar gary/**********************************************************************/ /*! \class MidiFileIn \brief A standard MIDI file reading/parsing class. This class can be used to read events from a standard MIDI file. Event bytes are copied to a C++ vector and must be subsequently interpreted by the user. The function getNextMidiEvent() skips meta and sysex events, returning only MIDI channel messages. Event delta-times are returned in the form of "ticks" and a function is provided to determine the current "seconds per tick". Tempo changes are internally tracked by the class and reflected in the values returned by the function getTickSeconds(). by Gary P. Scavone, 2003 - 2010. */ /**********************************************************************/ #include "MidiFileIn.h" #include #include namespace stk { MidiFileIn :: MidiFileIn( std::string fileName ) { // Attempt to open the file. file_.open( fileName.c_str(), std::ios::in | std::ios::binary ); if ( !file_ ) { oStream_ << "MidiFileIn: error opening or finding file (" << fileName << ")."; handleError( StkError::FILE_NOT_FOUND ); } // Parse header info. char chunkType[4]; char buffer[4]; SINT32 *length; if ( !file_.read( chunkType, 4 ) ) goto error; if ( !file_.read( buffer, 4 ) ) goto error; #ifdef __LITTLE_ENDIAN__ swap32((unsigned char *)&buffer); #endif length = (SINT32 *) &buffer; if ( strncmp( chunkType, "MThd", 4 ) || ( *length != 6 ) ) { oStream_ << "MidiFileIn: file (" << fileName << ") does not appear to be a MIDI file!"; handleError( StkError::FILE_UNKNOWN_FORMAT ); } // Read the MIDI file format. SINT16 *data; if ( !file_.read( buffer, 2 ) ) goto error; #ifdef __LITTLE_ENDIAN__ swap16((unsigned char *)&buffer); #endif data = (SINT16 *) &buffer; if ( *data < 0 || *data > 2 ) { oStream_ << "MidiFileIn: the file (" << fileName << ") format is invalid!"; handleError( StkError::FILE_ERROR ); } format_ = *data; // Read the number of tracks. if ( !file_.read( buffer, 2 ) ) goto error; #ifdef __LITTLE_ENDIAN__ swap16((unsigned char *)&buffer); #endif if ( format_ == 0 && *data != 1 ) { oStream_ << "MidiFileIn: invalid number of tracks (>1) for a file format = 0!"; handleError( StkError::FILE_ERROR ); } nTracks_ = *data; // Read the beat division. if ( !file_.read( buffer, 2 ) ) goto error; #ifdef __LITTLE_ENDIAN__ swap16((unsigned char *)&buffer); #endif division_ = (int) *data; double tickrate; usingTimeCode_ = false; if ( *data & 0x8000 ) { // Determine ticks per second from time-code formats. tickrate = (double) -(*data & 0x7F00); // If frames per second value is 29, it really should be 29.97. if ( tickrate == 29.0 ) tickrate = 29.97; tickrate *= (*data & 0x00FF); usingTimeCode_ = true; } else { tickrate = (double) (*data & 0x7FFF); // ticks per quarter note } // Now locate the track offsets and lengths. If not using time // code, we can initialize the "tick time" using a default tempo of // 120 beats per minute. We will then check for tempo meta-events // afterward. unsigned int i; for ( i=0; i event; unsigned long value, count; // We need to temporarily change the usingTimeCode_ value here so // that the getNextEvent() function doesn't try to check the tempo // map (which we're creating here). usingTimeCode_ = true; count = getNextEvent( &event, 0 ); while ( event.size() ) { if ( ( event.size() == 6 ) && ( event[0] == 0xff ) && ( event[1] == 0x51 ) && ( event[2] == 0x03 ) ) { tempoEvent.count = count; value = ( event[3] << 16 ) + ( event[4] << 8 ) + event[5]; tempoEvent.tickSeconds = (double) (0.000001 * value / tickrate); if ( count > tempoEvents_.back().count ) tempoEvents_.push_back( tempoEvent ); else tempoEvents_.back() = tempoEvent; } count += getNextEvent( &event, 0 ); } rewindTrack( 0 ); for ( unsigned int i=0; i= nTracks_ ) { oStream_ << "MidiFileIn::getNextEvent: invalid track argument (" << track << ")."; handleError( StkError::WARNING ); return; } trackPointers_[track] = trackOffsets_[track]; trackStatus_[track] = 0; tickSeconds_[track] = tempoEvents_[0].tickSeconds; } double MidiFileIn :: getTickSeconds( unsigned int track ) { // Return the current tick value in seconds for the given track. if ( track >= nTracks_ ) { oStream_ << "MidiFileIn::getTickSeconds: invalid track argument (" << track << ")."; handleError( StkError::WARNING ); return 0.0; } return tickSeconds_[track]; } unsigned long MidiFileIn :: getNextEvent( std::vector *event, unsigned int track ) { // Fill the user-provided vector with the next event in the // specified track (default = 0) and return the event delta time in // ticks. This function assumes that the stored track pointer is // positioned at the start of a track event. If the track has // reached its end, the event vector size will be zero. // // If we have a format 0 or 2 file and we're not using timecode, we // should check every meta-event for tempo changes and make // appropriate updates to the tickSeconds_ parameter if so. // // If we have a format 1 file and we're not using timecode, keep a // running sum of ticks for each track and update the tickSeconds_ // parameter as needed based on the stored tempo map. event->clear(); if ( track >= nTracks_ ) { oStream_ << "MidiFileIn::getNextEvent: invalid track argument (" << track << ")."; handleError( StkError::WARNING ); return 0; } // Check for the end of the track. if ( (trackPointers_[track] - trackOffsets_[track]) >= trackLengths_[track] ) return 0; unsigned long ticks = 0, bytes = 0; bool isTempoEvent = false; // Read the event delta time. file_.seekg( trackPointers_[track], std::ios_base::beg ); if ( !readVariableLength( &ticks ) ) goto error; // Parse the event stream to determine the event length. unsigned char c; if ( !file_.read( (char *)&c, 1 ) ) goto error; switch ( c ) { case 0xFF: // A Meta-Event unsigned long position; trackStatus_[track] = 0; event->push_back( c ); if ( !file_.read( (char *)&c, 1 ) ) goto error; event->push_back( c ); if ( format_ != 1 && ( c == 0x51 ) ) isTempoEvent = true; position = (unsigned long)file_.tellg(); if ( !readVariableLength( &bytes ) ) goto error; bytes += ( (unsigned long)file_.tellg() - position ); file_.seekg( position, std::ios_base::beg ); break; case 0xF0: case 0xF7: // The start or continuation of a Sysex event trackStatus_[track] = 0; event->push_back( c ); position = (unsigned long)file_.tellg(); if ( !readVariableLength( &bytes ) ) goto error; bytes += ( (unsigned long)file_.tellg() - position ); file_.seekg( position, std::ios_base::beg ); break; default: // Should be a MIDI channel event if ( c & 0x80 ) { // MIDI status byte if ( c > 0xF0 ) goto error; trackStatus_[track] = c; event->push_back( c ); c &= 0xF0; if ( (c == 0xC0) || (c == 0xD0) ) bytes = 1; else bytes = 2; } else if ( trackStatus_[track] & 0x80 ) { // Running status event->push_back( trackStatus_[track] ); event->push_back( c ); c = trackStatus_[track] & 0xF0; if ( (c != 0xC0) && (c != 0xD0) ) bytes = 1; } else goto error; } // Read the rest of the event into the event vector. unsigned long i; for ( i=0; ipush_back( c ); } if ( !usingTimeCode_ ) { if ( isTempoEvent ) { // Parse the tempo event and update tickSeconds_[track]. double tickrate = (double) (division_ & 0x7FFF); unsigned long value = ( event->at(3) << 16 ) + ( event->at(4) << 8 ) + event->at(5); tickSeconds_[track] = (double) (0.000001 * value / tickrate); } if ( format_ == 1 ) { // Update track counter and check the tempo map. trackCounters_[track] += ticks; TempoChange tempoEvent = tempoEvents_[ trackTempoIndex_[track] ]; if ( trackCounters_[track] >= tempoEvent.count && trackTempoIndex_[track] < tempoEvents_.size() - 1 ) { trackTempoIndex_[track]++; tickSeconds_[track] = tempoEvent.tickSeconds; } } } // Save the current track pointer value. trackPointers_[track] = (long)file_.tellg(); return ticks; error: oStream_ << "MidiFileIn::getNextEvent: file read error!"; handleError( StkError::FILE_ERROR ); return 0; } unsigned long MidiFileIn :: getNextMidiEvent( std::vector *midiEvent, unsigned int track ) { // Fill the user-provided vector with the next MIDI event in the // specified track (default = 0) and return the event delta time in // ticks. Meta-Events preceeding this event are skipped and ignored. if ( track >= nTracks_ ) { oStream_ << "MidiFileIn::getNextMidiEvent: invalid track argument (" << track << ")."; handleError( StkError::WARNING ); return 0; } unsigned long ticks = getNextEvent( midiEvent, track ); while ( midiEvent->size() && ( midiEvent->at(0) >= 0xF0 ) ) { //for ( unsigned int i=0; isize(); i++ ) //std::cout << "event byte = " << i << ", value = " << (int)midiEvent->at(i) << std::endl; ticks = getNextEvent( midiEvent, track ); } //for ( unsigned int i=0; isize(); i++ ) //std::cout << "event byte = " << i << ", value = " << (int)midiEvent->at(i) << std::endl; return ticks; } bool MidiFileIn :: readVariableLength( unsigned long *value ) { // It is assumed that this function is called with the file read // pointer positioned at the start of a variable-length value. The // function returns "true" if the value is successfully parsed and // "false" otherwise. *value = 0; char c; if ( !file_.read( &c, 1 ) ) return false; *value = (unsigned long) c; if ( *value & 0x80 ) { *value &= 0x7f; do { if ( !file_.read( &c, 1 ) ) return false; *value = ( *value << 7 ) + ( c & 0x7f ); } while ( c & 0x80 ); } return true; } } // stk namespace stk-4.5.0/src/Modal.cpp0000644000076600007660000001012312327014024012457 0ustar gary/***************************************************/ /*! \class Modal \brief STK resonance model abstract base class. This class contains an excitation wavetable, an envelope, an oscillator, and N resonances (non-sweeping BiQuad filters), where N is set during instantiation. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Modal.h" #include namespace stk { Modal :: Modal( unsigned int modes ) : nModes_(modes) { if ( nModes_ == 0 ) { oStream_ << "Modal: 'modes' argument to constructor is zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } // We don't make the excitation wave here yet, because we don't know // what it's going to be. ratios_.resize( nModes_ ); radii_.resize( nModes_ ); filters_ = (BiQuad **) calloc( nModes_, sizeof(BiQuad *) ); for (unsigned int i=0; isetEqualGainZeroes(); } // Set some default values. vibrato_.setFrequency( 6.0 ); vibratoGain_ = 0.0; directGain_ = 0.0; masterGain_ = 1.0; baseFrequency_ = 440.0; this->clear(); stickHardness_ = 0.5; strikePosition_ = 0.561; } Modal :: ~Modal( void ) { for ( unsigned int i=0; iclear(); } void Modal :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Modal::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif baseFrequency_ = frequency; for ( unsigned int i=0; isetRatioAndRadius( i, ratios_[i], radii_[i] ); } void Modal :: setRatioAndRadius( unsigned int modeIndex, StkFloat ratio, StkFloat radius ) { if ( modeIndex >= nModes_ ) { oStream_ << "Modal::setRatioAndRadius: modeIndex parameter is greater than number of modes!"; handleError( StkError::WARNING ); return; } StkFloat nyquist = Stk::sampleRate() / 2.0; StkFloat temp; if ( ratio * baseFrequency_ < nyquist ) { ratios_[modeIndex] = ratio; } else { temp = ratio; while (temp * baseFrequency_ > nyquist) temp *= 0.5; ratios_[modeIndex] = temp; #if defined(_STK_DEBUG_) oStream_ << "Modal::setRatioAndRadius: aliasing would occur here ... correcting."; handleError( StkError::DEBUG_PRINT ); #endif } radii_[modeIndex] = radius; if (ratio < 0) temp = -ratio; else temp = ratio * baseFrequency_; filters_[modeIndex]->setResonance(temp, radius); } void Modal :: setModeGain( unsigned int modeIndex, StkFloat gain ) { if ( modeIndex >= nModes_ ) { oStream_ << "Modal::setModeGain: modeIndex parameter is greater than number of modes!"; handleError( StkError::WARNING ); return; } filters_[modeIndex]->setGain( gain ); } void Modal :: strike( StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "Modal::strike: amplitude is out of range!"; handleError( StkError::WARNING ); } envelope_.setRate( 1.0 ); envelope_.setTarget( amplitude ); onepole_.setPole( 1.0 - amplitude ); envelope_.tick(); wave_->reset(); StkFloat temp; for ( unsigned int i=0; isetResonance(temp, radii_[i]); } } void Modal :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->strike( amplitude ); this->setFrequency( frequency ); } void Modal :: noteOff( StkFloat amplitude ) { // This calls damp, but inverts the meaning of amplitude (high // amplitude means fast damping). this->damp( 1.0 - (amplitude * 0.03) ); } void Modal :: damp( StkFloat amplitude ) { StkFloat temp; for ( unsigned int i=0; isetResonance( temp, radii_[i]*amplitude ); } } } // stk namespace stk-4.5.0/src/ModalBar.cpp0000644000076600007660000001264012327014024013112 0ustar gary/***************************************************/ /*! \class ModalBar \brief STK resonant bar instrument class. This class implements a number of different struck bar instruments. It inherits from the Modal class. Control Change Numbers: - Stick Hardness = 2 - Stick Position = 4 - Vibrato Gain = 8 - Vibrato Frequency = 11 - Direct Stick Mix = 1 - Volume = 128 - Modal Presets = 16 - Marimba = 0 - Vibraphone = 1 - Agogo = 2 - Wood1 = 3 - Reso = 4 - Wood2 = 5 - Beats = 6 - Two Fixed = 7 - Clump = 8 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "ModalBar.h" #include "SKINI.msg" #include namespace stk { ModalBar :: ModalBar( void ) : Modal() { // Concatenate the STK rawwave path to the rawwave file wave_ = new FileWvIn( (Stk::rawwavePath() + "marmstk1.raw").c_str(), true ); wave_->setRate( 0.5 * 22050.0 / Stk::sampleRate() ); // Set the resonances for preset 0 (marimba). this->setPreset( 0 ); } ModalBar :: ~ModalBar( void ) { delete wave_; } void ModalBar :: setStickHardness( StkFloat hardness ) { if ( hardness < 0.0 || hardness > 1.0 ) { oStream_ << "ModalBar::setStickHardness: parameter is out of range!"; handleError( StkError::WARNING ); return; } stickHardness_ = hardness; wave_->setRate( (0.25 * pow(4.0, stickHardness_) ) ); masterGain_ = 0.1 + (1.8 * stickHardness_); } void ModalBar :: setStrikePosition( StkFloat position ) { if ( position < 0.0 || position > 1.0 ) { oStream_ << "ModalBar::setStrikePosition: parameter is out of range!"; handleError( StkError::WARNING ); return; } strikePosition_ = position; // Hack only first three modes. StkFloat temp2 = position * PI; StkFloat temp = sin(temp2); this->setModeGain(0, 0.12 * temp); temp = sin(0.05 + (3.9 * temp2)); this->setModeGain(1, -0.03 * temp); temp = sin(-0.05 + (11 * temp2)); this->setModeGain(2, 0.11 * temp); } void ModalBar :: setPreset( int preset ) { // Presets: // First line: relative modal frequencies (negative number is // a fixed mode that doesn't scale with frequency // Second line: resonances of the modes // Third line: mode volumes // Fourth line: stickHardness, strikePosition, and direct stick // gain (mixed directly into the output static StkFloat presets[9][4][4] = { {{1.0, 3.99, 10.65, -2443}, // Marimba {0.9996, 0.9994, 0.9994, 0.999}, {0.04, 0.01, 0.01, 0.008}, {0.429688, 0.445312, 0.093750}}, {{1.0, 2.01, 3.9, 14.37}, // Vibraphone {0.99995, 0.99991, 0.99992, 0.9999}, {0.025, 0.015, 0.015, 0.015 }, {0.390625,0.570312,0.078125}}, {{1.0, 4.08, 6.669, -3725.0}, // Agogo {0.999, 0.999, 0.999, 0.999}, {0.06, 0.05, 0.03, 0.02}, {0.609375,0.359375,0.140625}}, {{1.0, 2.777, 7.378, 15.377}, // Wood1 {0.996, 0.994, 0.994, 0.99}, {0.04, 0.01, 0.01, 0.008}, {0.460938,0.375000,0.046875}}, {{1.0, 2.777, 7.378, 15.377}, // Reso {0.99996, 0.99994, 0.99994, 0.9999}, {0.02, 0.005, 0.005, 0.004}, {0.453125,0.250000,0.101562}}, {{1.0, 1.777, 2.378, 3.377}, // Wood2 {0.996, 0.994, 0.994, 0.99}, {0.04, 0.01, 0.01, 0.008}, {0.312500,0.445312,0.109375}}, {{1.0, 1.004, 1.013, 2.377}, // Beats {0.9999, 0.9999, 0.9999, 0.999}, {0.02, 0.005, 0.005, 0.004}, {0.398438,0.296875,0.070312}}, {{1.0, 4.0, -1320.0, -3960.0}, // 2Fix {0.9996, 0.999, 0.9994, 0.999}, {0.04, 0.01, 0.01, 0.008}, {0.453125,0.453125,0.070312}}, {{1.0, 1.217, 1.475, 1.729}, // Clump {0.999, 0.999, 0.999, 0.999}, {0.03, 0.03, 0.03, 0.03 }, {0.390625,0.570312,0.078125}}, }; int temp = (preset % 9); for (unsigned int i=0; isetRatioAndRadius(i, presets[temp][0][i], presets[temp][1][i]); this->setModeGain(i, presets[temp][2][i]); } this->setStickHardness(presets[temp][3][0]); this->setStrikePosition(presets[temp][3][1]); directGain_ = presets[temp][3][2]; if (temp == 1) // vibraphone vibratoGain_ = 0.2; else vibratoGain_ = 0.0; } void ModalBar :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "ModalBar::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_StickHardness_) // 2 this->setStickHardness( normalizedValue ); else if (number == __SK_StrikePosition_) // 4 this->setStrikePosition( normalizedValue ); else if (number == __SK_ProphesyRibbon_) // 16 this->setPreset((int) value); else if (number == __SK_Balance_) // 8 vibratoGain_ = normalizedValue * 0.3; else if (number == __SK_ModWheel_) // 1 directGain_ = normalizedValue; else if (number == __SK_ModFrequency_) // 11 vibrato_.setFrequency( normalizedValue * 12.0 ); else if (number == __SK_AfterTouch_Cont_) // 128 envelope_.setTarget( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "ModalBar::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Modulate.cpp0000644000076600007660000000206712327014024013205 0ustar gary/***************************************************/ /*! \class Modulate \brief STK periodic/random modulator. This class combines random and periodic modulations to give a nice, natural human modulation function. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Modulate.h" namespace stk { Modulate :: Modulate( void ) { vibrato_.setFrequency( 6.0 ); vibratoGain_ = 0.04; noiseRate_ = (unsigned int) ( 330.0 * Stk::sampleRate() / 22050.0 ); noiseCounter_ = noiseRate_; randomGain_ = 0.05; filter_.setPole( 0.999 ); filter_.setGain( randomGain_ ); Stk::addSampleRateAlert( this ); } Modulate :: ~Modulate( void ) { Stk::removeSampleRateAlert( this ); } void Modulate :: sampleRateChanged( StkFloat newRate, StkFloat oldRate ) { if ( !ignoreSampleRateChange_ ) noiseRate_ = (unsigned int ) ( newRate * noiseRate_ / oldRate ); } void Modulate :: setRandomGain( StkFloat gain ) { randomGain_ = gain; filter_.setGain( randomGain_ ); } } // stk namespace stk-4.5.0/src/Moog.cpp0000644000076600007660000000627412327014024012340 0ustar gary/***************************************************/ /*! \class Moog \brief STK moog-like swept filter sampling synthesis class. This instrument uses one attack wave, one looped wave, and an ADSR envelope (inherited from the Sampler class) and adds two sweepable formant (FormSwep) filters. Control Change Numbers: - Filter Q = 2 - Filter Sweep Rate = 4 - Vibrato Frequency = 11 - Vibrato Gain = 1 - Gain = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Moog.h" #include "SKINI.msg" namespace stk { Moog :: Moog( void ) { // Concatenate the STK rawwave path to the rawwave file attacks_.push_back( new FileWvIn( (Stk::rawwavePath() + "mandpluk.raw").c_str(), true ) ); loops_.push_back ( new FileLoop( (Stk::rawwavePath() + "impuls20.raw").c_str(), true ) ); loops_.push_back ( new FileLoop( (Stk::rawwavePath() + "sinewave.raw").c_str(), true ) ); // vibrato loops_[1]->setFrequency( 6.122 ); filters_[0].setTargets( 0.0, 0.7 ); filters_[1].setTargets( 0.0, 0.7 ); adsr_.setAllTimes( 0.001, 1.5, 0.6, 0.250 ); filterQ_ = 0.85; filterRate_ = 0.0001; modDepth_ = 0.0; } Moog :: ~Moog( void ) { } void Moog :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Moog::setFrequency: parameter is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif baseFrequency_ = frequency; StkFloat rate = attacks_[0]->getSize() * 0.01 * baseFrequency_ / Stk::sampleRate(); attacks_[0]->setRate( rate ); loops_[0]->setFrequency( baseFrequency_ ); } void Moog :: noteOn( StkFloat frequency, StkFloat amplitude ) { StkFloat temp; this->setFrequency( frequency ); this->keyOn(); attackGain_ = amplitude * 0.5; loopGain_ = amplitude; temp = filterQ_ + 0.05; filters_[0].setStates( 2000.0, temp ); filters_[1].setStates( 2000.0, temp ); temp = filterQ_ + 0.099; filters_[0].setTargets( frequency, temp ); filters_[1].setTargets( frequency, temp ); filters_[0].setSweepRate( filterRate_ * 22050.0 / Stk::sampleRate() ); filters_[1].setSweepRate( filterRate_ * 22050.0 / Stk::sampleRate() ); } void Moog :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Moog::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_FilterQ_) // 2 filterQ_ = 0.80 + ( 0.1 * normalizedValue ); else if (number == __SK_FilterSweepRate_) // 4 filterRate_ = normalizedValue * 0.0002; else if (number == __SK_ModFrequency_) // 11 this->setModulationSpeed( normalizedValue * 12.0 ); else if (number == __SK_ModWheel_) // 1 this->setModulationDepth( normalizedValue ); else if (number == __SK_AfterTouch_Cont_) // 128 adsr_.setTarget( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "Moog::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Mutex.cpp0000644000076600007660000000403412327014024012531 0ustar gary/***************************************************/ /*! \class Mutex \brief STK mutex class. This class provides a uniform interface for cross-platform mutex use. On Linux and IRIX systems, the pthread library is used. Under Windows, critical sections are used. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Mutex.h" namespace stk { Mutex :: Mutex() { #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) pthread_mutex_init(&mutex_, NULL); pthread_cond_init(&condition_, NULL); #elif defined(__OS_WINDOWS__) InitializeCriticalSection(&mutex_); condition_ = CreateEvent(NULL, // no security true, // manual-reset false, // non-signaled initially NULL); // unnamed #endif } Mutex :: ~Mutex() { #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) pthread_mutex_destroy(&mutex_); pthread_cond_destroy(&condition_); #elif defined(__OS_WINDOWS__) DeleteCriticalSection(&mutex_); CloseHandle( condition_ ); #endif } void Mutex :: lock() { #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) pthread_mutex_lock(&mutex_); #elif defined(__OS_WINDOWS__) EnterCriticalSection(&mutex_); #endif } void Mutex :: unlock() { #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) pthread_mutex_unlock(&mutex_); #elif defined(__OS_WINDOWS__) LeaveCriticalSection(&mutex_); #endif } void Mutex :: wait() { #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) pthread_cond_wait(&condition_, &mutex_); #elif defined(__OS_WINDOWS__) WaitForMultipleObjects(1, &condition_, false, INFINITE); #endif } void Mutex :: signal() { #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) pthread_cond_signal(&condition_); #elif defined(__OS_WINDOWS__) SetEvent( condition_ ); #endif } } // stk namespace stk-4.5.0/src/Noise.cpp0000644000076600007660000000124112327014024012501 0ustar gary/***************************************************/ /*! \class Noise \brief STK noise generator. Generic random number generation using the C rand() function. The quality of the rand() function varies from one OS to another. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Noise.h" #include namespace stk { Noise :: Noise( unsigned int seed ) { // Seed the random number generator this->setSeed( seed ); } void Noise :: setSeed( unsigned int seed ) { if ( seed == 0 ) srand( (unsigned int) time( NULL ) ); else srand( seed ); } } // stk namespace stk-4.5.0/src/NRev.cpp0000644000076600007660000000672612327014024012313 0ustar gary/***************************************************/ /*! \class NRev \brief CCRMA's NRev reverberator class. This class takes a monophonic input signal and produces a stereo output signal. It is derived from the CLM NRev function, which is based on the use of networks of simple allpass and comb delay filters. This particular arrangement consists of 6 comb filters in parallel, followed by 3 allpass filters, a lowpass filter, and another allpass in series, followed by two allpass filters in parallel with corresponding right and left outputs. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "NRev.h" #include namespace stk { NRev :: NRev( StkFloat T60 ) { if ( T60 <= 0.0 ) { oStream_ << "NRev::NRev: argument (" << T60 << ") must be positive!"; handleError( StkError::FUNCTION_ARGUMENT ); } lastFrame_.resize( 1, 2, 0.0 ); // resize lastFrame_ for stereo output int lengths[15] = {1433, 1601, 1867, 2053, 2251, 2399, 347, 113, 37, 59, 53, 43, 37, 29, 19}; double scaler = Stk::sampleRate() / 25641.0; int delay, i; for ( i=0; i<15; i++ ) { delay = (int) floor(scaler * lengths[i]); if ( (delay & 1) == 0) delay++; while ( !this->isPrime(delay) ) delay += 2; lengths[i] = delay; } for ( i=0; i<6; i++ ) { combDelays_[i].setMaximumDelay( lengths[i] ); combDelays_[i].setDelay( lengths[i] ); combCoefficient_[i] = pow(10.0, (-3 * lengths[i] / (T60 * Stk::sampleRate()))); } for ( i=0; i<8; i++ ) { allpassDelays_[i].setMaximumDelay( lengths[i+6] ); allpassDelays_[i].setDelay( lengths[i+6] ); } this->setT60( T60 ); allpassCoefficient_ = 0.7; effectMix_ = 0.3; this->clear(); } void NRev :: clear() { int i; for (i=0; i<6; i++) combDelays_[i].clear(); for (i=0; i<8; i++) allpassDelays_[i].clear(); lastFrame_[0] = 0.0; lastFrame_[1] = 0.0; lowpassState_ = 0.0; } void NRev :: setT60( StkFloat T60 ) { if ( T60 <= 0.0 ) { oStream_ << "NRev::setT60: argument (" << T60 << ") must be positive!"; handleError( StkError::WARNING ); return; } for ( int i=0; i<6; i++ ) combCoefficient_[i] = pow(10.0, (-3.0 * combDelays_[i].getDelay() / (T60 * Stk::sampleRate()))); } StkFrames& NRev :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() - 1 ) { oStream_ << "NRev::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() - 1 ) { oStream_ << "NRev::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; isetPole( thePole ); } OnePole :: ~OnePole() { } void OnePole :: setPole( StkFloat thePole ) { if ( std::abs( thePole ) >= 1.0 ) { oStream_ << "OnePole::setPole: argument (" << thePole << ") should be less than 1.0!"; handleError( StkError::WARNING ); return; } // Normalize coefficients for peak unity gain. if ( thePole > 0.0 ) b_[0] = (StkFloat) (1.0 - thePole); else b_[0] = (StkFloat) (1.0 + thePole); a_[1] = -thePole; } void OnePole :: setCoefficients( StkFloat b0, StkFloat a1, bool clearState ) { if ( std::abs( a1 ) >= 1.0 ) { oStream_ << "OnePole::setCoefficients: a1 argument (" << a1 << ") should be less than 1.0!"; handleError( StkError::WARNING ); return; } b_[0] = b0; a_[1] = a1; if ( clearState ) this->clear(); } } // stk namespace stk-4.5.0/src/OneZero.cpp0000644000076600007660000000201312327014024013003 0ustar gary/***************************************************/ /*! \class OneZero \brief STK one-zero filter class. This class implements a one-zero digital filter. A method is provided for setting the zero position along the real axis of the z-plane while maintaining a constant filter gain. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "OneZero.h" #include namespace stk { OneZero :: OneZero( StkFloat theZero ) { b_.resize( 2 ); inputs_.resize( 2, 1, 0.0 ); this->setZero( theZero ); } OneZero :: ~OneZero( void ) { } void OneZero :: setZero( StkFloat theZero ) { // Normalize coefficients for unity gain. if ( theZero > 0.0 ) b_[0] = 1.0 / ((StkFloat) 1.0 + theZero); else b_[0] = 1.0 / ((StkFloat) 1.0 - theZero); b_[1] = -theZero * b_[0]; } void OneZero :: setCoefficients( StkFloat b0, StkFloat b1, bool clearState ) { b_[0] = b0; b_[1] = b1; if ( clearState ) this->clear(); } } // stk namespace stk-4.5.0/src/PercFlut.cpp0000644000076600007660000000443712327014024013162 0ustar gary/***************************************************/ /*! \class PercFlut \brief STK percussive flute FM synthesis instrument. This class implements algorithm 4 of the TX81Z. \code Algorithm 4 is : 4->3--\ 2-- + -->1-->Out \endcode Control Change Numbers: - Total Modulator Index = 2 - Modulator Crossfade = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "PercFlut.h" namespace stk { PercFlut :: PercFlut( void ) : FM() { // Concatenate the STK rawwave path to the rawwave files for ( unsigned int i=0; i<3; i++ ) waves_[i] = new FileLoop( (Stk::rawwavePath() + "sinewave.raw").c_str(), true ); waves_[3] = new FileLoop( (Stk::rawwavePath() + "fwavblnk.raw").c_str(), true ); this->setRatio(0, 1.50 * 1.000); this->setRatio(1, 3.00 * 0.995); this->setRatio(2, 2.99 * 1.005); this->setRatio(3, 6.00 * 0.997); gains_[0] = fmGains_[99]; gains_[1] = fmGains_[71]; gains_[2] = fmGains_[93]; gains_[3] = fmGains_[85]; adsr_[0]->setAllTimes( 0.05, 0.05, fmSusLevels_[14], 0.05); adsr_[1]->setAllTimes( 0.02, 0.50, fmSusLevels_[13], 0.5); adsr_[2]->setAllTimes( 0.02, 0.30, fmSusLevels_[11], 0.05); adsr_[3]->setAllTimes( 0.02, 0.05, fmSusLevels_[13], 0.01); twozero_.setGain( 0.0 ); modDepth_ = 0.005; } PercFlut :: ~PercFlut( void ) { } void PercFlut :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "PercFlut::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif baseFrequency_ = frequency; } void PercFlut :: noteOn( StkFloat frequency, StkFloat amplitude ) { gains_[0] = amplitude * fmGains_[99] * 0.5; gains_[1] = amplitude * fmGains_[71] * 0.5; gains_[2] = amplitude * fmGains_[93] * 0.5; gains_[3] = amplitude * fmGains_[85] * 0.5; this->setFrequency( frequency ); this->keyOn(); } } // stk namespace stk-4.5.0/src/Phonemes.cpp0000644000076600007660000002012412327014024013203 0ustar gary/***************************************************/ /*! \class Phonemes \brief STK phonemes table. This class does nothing other than declare a set of 32 static phoneme formant parameters and provide access to those values. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Phonemes.h" #include namespace stk { const char Phonemes :: phonemeNames[32][4] = {"eee", "ihh", "ehh", "aaa", "ahh", "aww", "ohh", "uhh", "uuu", "ooo", "rrr", "lll", "mmm", "nnn", "nng", "ngg", "fff", "sss", "thh", "shh", "xxx", "hee", "hoo", "hah", "bbb", "ddd", "jjj", "ggg", "vvv", "zzz", "thz", "zhh" }; const StkFloat Phonemes :: phonemeGains[32][2] = {{1.0, 0.0}, // eee {1.0, 0.0}, // ihh {1.0, 0.0}, // ehh {1.0, 0.0}, // aaa {1.0, 0.0}, // ahh {1.0, 0.0}, // aww {1.0, 0.0}, // ohh {1.0, 0.0}, // uhh {1.0, 0.0}, // uuu {1.0, 0.0}, // ooo {1.0, 0.0}, // rrr {1.0, 0.0}, // lll {1.0, 0.0}, // mmm {1.0, 0.0}, // nnn {1.0, 0.0}, // nng {1.0, 0.0}, // ngg {0.0, 0.7}, // fff {0.0, 0.7}, // sss {0.0, 0.7}, // thh {0.0, 0.7}, // shh {0.0, 0.7}, // xxx {0.0, 0.1}, // hee {0.0, 0.1}, // hoo {0.0, 0.1}, // hah {1.0, 0.1}, // bbb {1.0, 0.1}, // ddd {1.0, 0.1}, // jjj {1.0, 0.1}, // ggg {1.0, 1.0}, // vvv {1.0, 1.0}, // zzz {1.0, 1.0}, // thz {1.0, 1.0} // zhh }; const StkFloat Phonemes :: phonemeParameters[32][4][3] = {{ { 273, 0.996, 10}, // eee (beet) {2086, 0.945, -16}, {2754, 0.979, -12}, {3270, 0.440, -17}}, { { 385, 0.987, 10}, // ihh (bit) {2056, 0.930, -20}, {2587, 0.890, -20}, {3150, 0.400, -20}}, { { 515, 0.977, 10}, // ehh (bet) {1805, 0.810, -10}, {2526, 0.875, -10}, {3103, 0.400, -13}}, { { 773, 0.950, 10}, // aaa (bat) {1676, 0.830, -6}, {2380, 0.880, -20}, {3027, 0.600, -20}}, { { 770, 0.950, 0}, // ahh (father) {1153, 0.970, -9}, {2450, 0.780, -29}, {3140, 0.800, -39}}, { { 637, 0.910, 0}, // aww (bought) { 895, 0.900, -3}, {2556, 0.950, -17}, {3070, 0.910, -20}}, { { 637, 0.910, 0}, // ohh (bone) NOTE:: same as aww (bought) { 895, 0.900, -3}, {2556, 0.950, -17}, {3070, 0.910, -20}}, { { 561, 0.965, 0}, // uhh (but) {1084, 0.930, -10}, {2541, 0.930, -15}, {3345, 0.900, -20}}, { { 515, 0.976, 0}, // uuu (foot) {1031, 0.950, -3}, {2572, 0.960, -11}, {3345, 0.960, -20}}, { { 349, 0.986, -10}, // ooo (boot) { 918, 0.940, -20}, {2350, 0.960, -27}, {2731, 0.950, -33}}, { { 394, 0.959, -10}, // rrr (bird) {1297, 0.780, -16}, {1441, 0.980, -16}, {2754, 0.950, -40}}, { { 462, 0.990, +5}, // lll (lull) {1200, 0.640, -10}, {2500, 0.200, -20}, {3000, 0.100, -30}}, { { 265, 0.987, -10}, // mmm (mom) {1176, 0.940, -22}, {2352, 0.970, -20}, {3277, 0.940, -31}}, { { 204, 0.980, -10}, // nnn (nun) {1570, 0.940, -15}, {2481, 0.980, -12}, {3133, 0.800, -30}}, { { 204, 0.980, -10}, // nng (sang) NOTE:: same as nnn {1570, 0.940, -15}, {2481, 0.980, -12}, {3133, 0.800, -30}}, { { 204, 0.980, -10}, // ngg (bong) NOTE:: same as nnn {1570, 0.940, -15}, {2481, 0.980, -12}, {3133, 0.800, -30}}, { {1000, 0.300, 0}, // fff {2800, 0.860, -10}, {7425, 0.740, 0}, {8140, 0.860, 0}}, { {0, 0.000, 0}, // sss {2000, 0.700, -15}, {5257, 0.750, -3}, {7171, 0.840, 0}}, { { 100, 0.900, 0}, // thh {4000, 0.500, -20}, {5500, 0.500, -15}, {8000, 0.400, -20}}, { {2693, 0.940, 0}, // shh {4000, 0.720, -10}, {6123, 0.870, -10}, {7755, 0.750, -18}}, { {1000, 0.300, -10}, // xxx NOTE:: Not Really Done Yet {2800, 0.860, -10}, {7425, 0.740, 0}, {8140, 0.860, 0}}, { { 273, 0.996, -40}, // hee (beet) (noisy eee) {2086, 0.945, -16}, {2754, 0.979, -12}, {3270, 0.440, -17}}, { { 349, 0.986, -40}, // hoo (boot) (noisy ooo) { 918, 0.940, -10}, {2350, 0.960, -17}, {2731, 0.950, -23}}, { { 770, 0.950, -40}, // hah (father) (noisy ahh) {1153, 0.970, -3}, {2450, 0.780, -20}, {3140, 0.800, -32}}, { {2000, 0.700, -20}, // bbb NOTE:: Not Really Done Yet {5257, 0.750, -15}, {7171, 0.840, -3}, {9000, 0.900, 0}}, { { 100, 0.900, 0}, // ddd NOTE:: Not Really Done Yet {4000, 0.500, -20}, {5500, 0.500, -15}, {8000, 0.400, -20}}, { {2693, 0.940, 0}, // jjj NOTE:: Not Really Done Yet {4000, 0.720, -10}, {6123, 0.870, -10}, {7755, 0.750, -18}}, { {2693, 0.940, 0}, // ggg NOTE:: Not Really Done Yet {4000, 0.720, -10}, {6123, 0.870, -10}, {7755, 0.750, -18}}, { {2000, 0.700, -20}, // vvv NOTE:: Not Really Done Yet {5257, 0.750, -15}, {7171, 0.840, -3}, {9000, 0.900, 0}}, { { 100, 0.900, 0}, // zzz NOTE:: Not Really Done Yet {4000, 0.500, -20}, {5500, 0.500, -15}, {8000, 0.400, -20}}, { {2693, 0.940, 0}, // thz NOTE:: Not Really Done Yet {4000, 0.720, -10}, {6123, 0.870, -10}, {7755, 0.750, -18}}, { {2693, 0.940, 0}, // zhh NOTE:: Not Really Done Yet {4000, 0.720, -10}, {6123, 0.870, -10}, {7755, 0.750, -18}} }; Phonemes :: Phonemes(void) { } Phonemes :: ~Phonemes(void) { } const char *Phonemes :: name( unsigned int index ) { if ( index > 31 ) { oStream_ << "Phonemes::name: index is greater than 31!"; handleError( oStream_.str(), StkError::WARNING ); return 0; } return phonemeNames[index]; } StkFloat Phonemes :: voiceGain( unsigned int index ) { if ( index > 31 ) { oStream_ << "Phonemes::voiceGain: index is greater than 31!"; handleError( oStream_.str(), StkError::WARNING ); return 0.0; } return phonemeGains[index][0]; } StkFloat Phonemes :: noiseGain( unsigned int index ) { if ( index > 31 ) { oStream_ << "Phonemes::noiseGain: index is greater than 31!"; handleError( oStream_.str(), StkError::WARNING ); return 0.0; } return phonemeGains[index][1]; } StkFloat Phonemes :: formantFrequency( unsigned int index, unsigned int partial ) { if ( index > 31 ) { oStream_ << "Phonemes::formantFrequency: index is greater than 31!"; handleError( oStream_.str(), StkError::WARNING ); return 0.0; } if ( partial > 3 ) { oStream_ << "Phonemes::formantFrequency: partial is greater than 3!"; handleError( oStream_.str(), StkError::WARNING ); return 0.0; } return phonemeParameters[index][partial][0]; } StkFloat Phonemes :: formantRadius( unsigned int index, unsigned int partial ) { if ( index > 31 ) { oStream_ << "Phonemes::formantRadius: index is greater than 31!"; handleError( oStream_.str(), StkError::WARNING ); return 0.0; } if ( partial > 3 ) { oStream_ << "Phonemes::formantRadius: partial is greater than 3!"; handleError( oStream_.str(), StkError::WARNING ); return 0.0; } return phonemeParameters[index][partial][1]; } StkFloat Phonemes :: formantGain( unsigned int index, unsigned int partial ) { if ( index > 31 ) { oStream_ << "Phonemes::formantGain: index is greater than 31!"; handleError( oStream_.str(), StkError::WARNING ); return 0.0; } if ( partial > 3 ) { oStream_ << "Phonemes::formantGain: partial is greater than 3!"; handleError( oStream_.str(), StkError::WARNING ); return 0.0; } return phonemeParameters[index][partial][2]; } } // stk namespace stk-4.5.0/src/PitShift.cpp0000644000076600007660000000424612327014024013166 0ustar gary/***************************************************/ /*! \class PitShift \brief STK simple pitch shifter effect class. This class implements a simple pitch shifter using delay lines. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "PitShift.h" #include namespace stk { PitShift :: PitShift( void ) { delayLength_ = maxDelay - 24; halfLength_ = delayLength_ / 2; delay_[0] = 12; delay_[1] = maxDelay / 2; delayLine_[0].setMaximumDelay( maxDelay ); delayLine_[0].setDelay( delay_[0] ); delayLine_[1].setMaximumDelay( maxDelay ); delayLine_[1].setDelay( delay_[1] ); effectMix_ = 0.5; rate_ = 1.0; } void PitShift :: clear() { delayLine_[0].clear(); delayLine_[1].clear(); lastFrame_[0] = 0.0; } void PitShift :: setShift( StkFloat shift ) { if ( shift < 1.0 ) { rate_ = 1.0 - shift; } else if ( shift > 1.0 ) { rate_ = 1.0 - shift; } else { rate_ = 0.0; delay_[0] = halfLength_ + 12; } } StkFrames& PitShift :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() ) { oStream_ << "PitShift::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() ) { oStream_ << "PitShift::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; isetFrequency( 220.0 ); } Plucked :: ~Plucked( void ) { } void Plucked :: clear( void ) { delayLine_.clear(); loopFilter_.clear(); pickFilter_.clear(); } void Plucked :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Plucked::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif // Delay = length - filter delay. StkFloat delay = ( Stk::sampleRate() / frequency ) - loopFilter_.phaseDelay( frequency ); delayLine_.setDelay( delay ); loopGain_ = 0.995 + (frequency * 0.000005); if ( loopGain_ >= 1.0 ) loopGain_ = 0.99999; } void Plucked :: pluck( StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "Plucked::pluck: amplitude is out of range!"; handleError( StkError::WARNING ); return; } pickFilter_.setPole( 0.999 - (amplitude * 0.15) ); pickFilter_.setGain( amplitude * 0.5 ); for ( unsigned long i=0; isetFrequency( frequency ); this->pluck( amplitude ); } void Plucked :: noteOff( StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "Plucked::noteOff: amplitude is out of range!"; handleError( StkError::WARNING ); return; } loopGain_ = 1.0 - amplitude; } } // stk namespace stk-4.5.0/src/PoleZero.cpp0000644000076600007660000000334012327014024013165 0ustar gary/***************************************************/ /*! \class PoleZero \brief STK one-pole, one-zero filter class. This class implements a one-pole, one-zero digital filter. A method is provided for creating an allpass filter with a given coefficient. Another method is provided to create a DC blocking filter. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "PoleZero.h" namespace stk { PoleZero :: PoleZero() { // Default setting for pass-through. b_.resize( 2, 0.0 ); a_.resize( 2, 0.0 ); b_[0] = 1.0; a_[0] = 1.0; inputs_.resize( 2, 1, 0.0 ); outputs_.resize( 2, 1, 0.0 ); } PoleZero :: ~PoleZero() { } void PoleZero :: setCoefficients( StkFloat b0, StkFloat b1, StkFloat a1, bool clearState ) { if ( std::abs( a1 ) >= 1.0 ) { oStream_ << "PoleZero::setCoefficients: a1 argument (" << a1 << ") should be less than 1.0!"; handleError( StkError::WARNING ); return; } b_[0] = b0; b_[1] = b1; a_[1] = a1; if ( clearState ) this->clear(); } void PoleZero :: setAllpass( StkFloat coefficient ) { if ( std::abs( coefficient ) >= 1.0 ) { oStream_ << "PoleZero::setAllpass: argument (" << coefficient << ") makes filter unstable!"; handleError( StkError::WARNING ); return; } b_[0] = coefficient; b_[1] = 1.0; a_[0] = 1.0; // just in case a_[1] = coefficient; } void PoleZero :: setBlockZero( StkFloat thePole ) { if ( std::abs( thePole ) >= 1.0 ) { oStream_ << "PoleZero::setBlockZero: argument (" << thePole << ") makes filter unstable!"; handleError( StkError::WARNING ); return; } b_[0] = 1.0; b_[1] = -1.0; a_[0] = 1.0; // just in case a_[1] = -thePole; } } // stk namespace stk-4.5.0/src/PRCRev.cpp0000644000076600007660000000654412327014024012540 0ustar gary/***************************************************/ /*! \class PRCRev \brief Perry's simple reverberator class. This class is based on some of the famous Stanford/CCRMA reverbs (NRev, KipRev), which were based on the Chowning/Moorer/Schroeder reverberators using networks of simple allpass and comb delay filters. This class implements two series allpass units and two parallel comb filters. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "PRCRev.h" #include namespace stk { PRCRev :: PRCRev( StkFloat T60 ) { if ( T60 <= 0.0 ) { oStream_ << "PRCRev::PRCRev: argument (" << T60 << ") must be positive!"; handleError( StkError::FUNCTION_ARGUMENT ); } lastFrame_.resize( 1, 2, 0.0 ); // resize lastFrame_ for stereo output // Delay lengths for 44100 Hz sample rate. int lengths[4]= {341, 613, 1557, 2137}; double scaler = Stk::sampleRate() / 44100.0; // Scale the delay lengths if necessary. int delay, i; if ( scaler != 1.0 ) { for (i=0; i<4; i++) { delay = (int) floor(scaler * lengths[i]); if ( (delay & 1) == 0) delay++; while ( !this->isPrime(delay) ) delay += 2; lengths[i] = delay; } } for ( i=0; i<2; i++ ) { allpassDelays_[i].setMaximumDelay( lengths[i] ); allpassDelays_[i].setDelay( lengths[i] ); combDelays_[i].setMaximumDelay( lengths[i+2] ); combDelays_[i].setDelay( lengths[i+2] ); } this->setT60( T60 ); allpassCoefficient_ = 0.7; effectMix_ = 0.5; this->clear(); } void PRCRev :: clear( void ) { allpassDelays_[0].clear(); allpassDelays_[1].clear(); combDelays_[0].clear(); combDelays_[1].clear(); lastFrame_[0] = 0.0; lastFrame_[1] = 0.0; } void PRCRev :: setT60( StkFloat T60 ) { if ( T60 <= 0.0 ) { oStream_ << "PRCRev::setT60: argument (" << T60 << ") must be positive!"; handleError( StkError::WARNING ); return; } combCoefficient_[0] = pow(10.0, (-3.0 * combDelays_[0].getDelay() / (T60 * Stk::sampleRate()))); combCoefficient_[1] = pow(10.0, (-3.0 * combDelays_[1].getDelay() / (T60 * Stk::sampleRate()))); } StkFrames& PRCRev :: tick( StkFrames& frames, unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel >= frames.channels() - 1 ) { oStream_ << "PRCRev::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *samples = &frames[channel]; unsigned int hop = frames.channels(); for ( unsigned int i=0; i= iFrames.channels() || oChannel >= oFrames.channels() - 1 ) { oStream_ << "PRCRev::tick(): channel and StkFrames arguments are incompatible!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif StkFloat *iSamples = &iFrames[iChannel]; StkFloat *oSamples = &oFrames[oChannel]; unsigned int iHop = iFrames.channels(), oHop = oFrames.channels(); for ( unsigned int i=0; ikeyOn(); this->setResonance( frequency, poleRadius_ ); } void Resonate :: noteOff( StkFloat amplitude ) { this->keyOff(); } void Resonate :: setResonance( StkFloat frequency, StkFloat radius ) { if ( frequency < 0.0 ) { oStream_ << "Resonate::setResonance: frequency parameter is less than zero!"; handleError( StkError::WARNING ); return; } if ( radius < 0.0 || radius >= 1.0 ) { std::cerr << "Resonate::setResonance: radius parameter is out of range!"; handleError( StkError::WARNING ); return; } poleFrequency_ = frequency; poleRadius_ = radius; filter_.setResonance( poleFrequency_, poleRadius_, true ); } void Resonate :: setNotch( StkFloat frequency, StkFloat radius ) { if ( frequency < 0.0 ) { oStream_ << "Resonate::setNotch: frequency parameter is less than zero ... setting to 0.0!"; handleError( StkError::WARNING ); return; } if ( radius < 0.0 ) { oStream_ << "Resonate::setNotch: radius parameter is less than 0.0!"; handleError( StkError::WARNING ); return; } zeroFrequency_ = frequency; zeroRadius_ = radius; filter_.setNotch( zeroFrequency_, zeroRadius_ ); } void Resonate :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Resonate::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == 2) // 2 setResonance( normalizedValue * Stk::sampleRate() * 0.5, poleRadius_ ); else if (number == 4) // 4 setResonance( poleFrequency_, normalizedValue * 0.9999 ); else if (number == 11) // 11 this->setNotch( normalizedValue * Stk::sampleRate() * 0.5, zeroRadius_ ); else if (number == 1) this->setNotch( zeroFrequency_, normalizedValue ); else if (number == __SK_AfterTouch_Cont_) // 128 adsr_.setTarget( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "Resonate::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Rhodey.cpp0000644000076600007660000000455712327014024012673 0ustar gary/***************************************************/ /*! \class Rhodey \brief STK Fender Rhodes-like electric piano FM synthesis instrument. This class implements two simple FM Pairs summed together, also referred to as algorithm 5 of the TX81Z. \code Algorithm 5 is : 4->3--\ + --> Out 2->1--/ \endcode Control Change Numbers: - Modulator Index One = 2 - Crossfade of Outputs = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Rhodey.h" namespace stk { Rhodey :: Rhodey( void ) : FM() { // Concatenate the STK rawwave path to the rawwave files for ( unsigned int i=0; i<3; i++ ) waves_[i] = new FileLoop( (Stk::rawwavePath() + "sinewave.raw").c_str(), true ); waves_[3] = new FileLoop( (Stk::rawwavePath() + "fwavblnk.raw").c_str(), true ); this->setRatio(0, 1.0); this->setRatio(1, 0.5); this->setRatio(2, 1.0); this->setRatio(3, 15.0); gains_[0] = fmGains_[99]; gains_[1] = fmGains_[90]; gains_[2] = fmGains_[99]; gains_[3] = fmGains_[67]; adsr_[0]->setAllTimes( 0.001, 1.50, 0.0, 0.04); adsr_[1]->setAllTimes( 0.001, 1.50, 0.0, 0.04); adsr_[2]->setAllTimes( 0.001, 1.00, 0.0, 0.04); adsr_[3]->setAllTimes( 0.001, 0.25, 0.0, 0.04); twozero_.setGain( 1.0 ); } Rhodey :: ~Rhodey( void ) { } void Rhodey :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Rhodey::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif baseFrequency_ = frequency * 2.0; for (unsigned int i=0; isetFrequency( baseFrequency_ * ratios_[i] ); } void Rhodey :: noteOn( StkFloat frequency, StkFloat amplitude ) { gains_[0] = amplitude * fmGains_[99]; gains_[1] = amplitude * fmGains_[90]; gains_[2] = amplitude * fmGains_[99]; gains_[3] = amplitude * fmGains_[67]; this->setFrequency( frequency ); this->keyOn(); } } // stk namespace stk-4.5.0/src/RtAudio.cpp0000644000076600007660000131125712327014024013007 0ustar gary/************************************************************************/ /*! \class RtAudio \brief Realtime audio i/o C++ classes. RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), Macintosh OS X (CoreAudio and Jack), and Windows (DirectSound, ASIO and WASAPI) operating systems. RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2014 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /************************************************************************/ // RtAudio: Version 4.1.1 #include "RtAudio.h" #include #include #include #include // Static variable definitions. const unsigned int RtApi::MAX_SAMPLE_RATES = 14; const unsigned int RtApi::SAMPLE_RATES[] = { 4000, 5512, 8000, 9600, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000 }; #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) #define MUTEX_INITIALIZE(A) InitializeCriticalSection(A) #define MUTEX_DESTROY(A) DeleteCriticalSection(A) #define MUTEX_LOCK(A) EnterCriticalSection(A) #define MUTEX_UNLOCK(A) LeaveCriticalSection(A) #elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) // pthread API #define MUTEX_INITIALIZE(A) pthread_mutex_init(A, NULL) #define MUTEX_DESTROY(A) pthread_mutex_destroy(A) #define MUTEX_LOCK(A) pthread_mutex_lock(A) #define MUTEX_UNLOCK(A) pthread_mutex_unlock(A) #else #define MUTEX_INITIALIZE(A) abs(*A) // dummy definitions #define MUTEX_DESTROY(A) abs(*A) // dummy definitions #endif // *************************************************** // // // RtAudio definitions. // // *************************************************** // std::string RtAudio :: getVersion( void ) throw() { return RTAUDIO_VERSION; } void RtAudio :: getCompiledApi( std::vector &apis ) throw() { apis.clear(); // The order here will control the order of RtAudio's API search in // the constructor. #if defined(__UNIX_JACK__) apis.push_back( UNIX_JACK ); #endif #if defined(__LINUX_ALSA__) apis.push_back( LINUX_ALSA ); #endif #if defined(__LINUX_PULSE__) apis.push_back( LINUX_PULSE ); #endif #if defined(__LINUX_OSS__) apis.push_back( LINUX_OSS ); #endif #if defined(__WINDOWS_ASIO__) apis.push_back( WINDOWS_ASIO ); #endif #if defined(__WINDOWS_WASAPI__) apis.push_back( WINDOWS_WASAPI ); #endif #if defined(__WINDOWS_DS__) apis.push_back( WINDOWS_DS ); #endif #if defined(__MACOSX_CORE__) apis.push_back( MACOSX_CORE ); #endif #if defined(__RTAUDIO_DUMMY__) apis.push_back( RTAUDIO_DUMMY ); #endif } void RtAudio :: openRtApi( RtAudio::Api api ) { if ( rtapi_ ) delete rtapi_; rtapi_ = 0; #if defined(__UNIX_JACK__) if ( api == UNIX_JACK ) rtapi_ = new RtApiJack(); #endif #if defined(__LINUX_ALSA__) if ( api == LINUX_ALSA ) rtapi_ = new RtApiAlsa(); #endif #if defined(__LINUX_PULSE__) if ( api == LINUX_PULSE ) rtapi_ = new RtApiPulse(); #endif #if defined(__LINUX_OSS__) if ( api == LINUX_OSS ) rtapi_ = new RtApiOss(); #endif #if defined(__WINDOWS_ASIO__) if ( api == WINDOWS_ASIO ) rtapi_ = new RtApiAsio(); #endif #if defined(__WINDOWS_WASAPI__) if ( api == WINDOWS_WASAPI ) rtapi_ = new RtApiWasapi(); #endif #if defined(__WINDOWS_DS__) if ( api == WINDOWS_DS ) rtapi_ = new RtApiDs(); #endif #if defined(__MACOSX_CORE__) if ( api == MACOSX_CORE ) rtapi_ = new RtApiCore(); #endif #if defined(__RTAUDIO_DUMMY__) if ( api == RTAUDIO_DUMMY ) rtapi_ = new RtApiDummy(); #endif } RtAudio :: RtAudio( RtAudio::Api api ) { rtapi_ = 0; if ( api != UNSPECIFIED ) { // Attempt to open the specified API. openRtApi( api ); if ( rtapi_ ) return; // No compiled support for specified API value. Issue a debug // warning and continue as if no API was specified. std::cerr << "\nRtAudio: no compiled support for specified API argument!\n" << std::endl; } // Iterate through the compiled APIs and return as soon as we find // one with at least one device or we reach the end of the list. std::vector< RtAudio::Api > apis; getCompiledApi( apis ); for ( unsigned int i=0; igetDeviceCount() ) break; } if ( rtapi_ ) return; // It should not be possible to get here because the preprocessor // definition __RTAUDIO_DUMMY__ is automatically defined if no // API-specific definitions are passed to the compiler. But just in // case something weird happens, we'll thow an error. std::string errorText = "\nRtAudio: no compiled API support found ... critical error!!\n\n"; throw( RtAudioError( errorText, RtAudioError::UNSPECIFIED ) ); } RtAudio :: ~RtAudio() throw() { if ( rtapi_ ) delete rtapi_; } void RtAudio :: openStream( RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData, RtAudio::StreamOptions *options, RtAudioErrorCallback errorCallback ) { return rtapi_->openStream( outputParameters, inputParameters, format, sampleRate, bufferFrames, callback, userData, options, errorCallback ); } // *************************************************** // // // Public RtApi definitions (see end of file for // private or protected utility functions). // // *************************************************** // RtApi :: RtApi() { stream_.state = STREAM_CLOSED; stream_.mode = UNINITIALIZED; stream_.apiHandle = 0; stream_.userBuffer[0] = 0; stream_.userBuffer[1] = 0; MUTEX_INITIALIZE( &stream_.mutex ); showWarnings_ = true; firstErrorOccurred_ = false; } RtApi :: ~RtApi() { MUTEX_DESTROY( &stream_.mutex ); } void RtApi :: openStream( RtAudio::StreamParameters *oParams, RtAudio::StreamParameters *iParams, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData, RtAudio::StreamOptions *options, RtAudioErrorCallback errorCallback ) { if ( stream_.state != STREAM_CLOSED ) { errorText_ = "RtApi::openStream: a stream is already open!"; error( RtAudioError::INVALID_USE ); return; } // Clear stream information potentially left from a previously open stream. clearStreamInfo(); if ( oParams && oParams->nChannels < 1 ) { errorText_ = "RtApi::openStream: a non-NULL output StreamParameters structure cannot have an nChannels value less than one."; error( RtAudioError::INVALID_USE ); return; } if ( iParams && iParams->nChannels < 1 ) { errorText_ = "RtApi::openStream: a non-NULL input StreamParameters structure cannot have an nChannels value less than one."; error( RtAudioError::INVALID_USE ); return; } if ( oParams == NULL && iParams == NULL ) { errorText_ = "RtApi::openStream: input and output StreamParameters structures are both NULL!"; error( RtAudioError::INVALID_USE ); return; } if ( formatBytes(format) == 0 ) { errorText_ = "RtApi::openStream: 'format' parameter value is undefined."; error( RtAudioError::INVALID_USE ); return; } unsigned int nDevices = getDeviceCount(); unsigned int oChannels = 0; if ( oParams ) { oChannels = oParams->nChannels; if ( oParams->deviceId >= nDevices ) { errorText_ = "RtApi::openStream: output device parameter value is invalid."; error( RtAudioError::INVALID_USE ); return; } } unsigned int iChannels = 0; if ( iParams ) { iChannels = iParams->nChannels; if ( iParams->deviceId >= nDevices ) { errorText_ = "RtApi::openStream: input device parameter value is invalid."; error( RtAudioError::INVALID_USE ); return; } } bool result; if ( oChannels > 0 ) { result = probeDeviceOpen( oParams->deviceId, OUTPUT, oChannels, oParams->firstChannel, sampleRate, format, bufferFrames, options ); if ( result == false ) { error( RtAudioError::SYSTEM_ERROR ); return; } } if ( iChannels > 0 ) { result = probeDeviceOpen( iParams->deviceId, INPUT, iChannels, iParams->firstChannel, sampleRate, format, bufferFrames, options ); if ( result == false ) { if ( oChannels > 0 ) closeStream(); error( RtAudioError::SYSTEM_ERROR ); return; } } stream_.callbackInfo.callback = (void *) callback; stream_.callbackInfo.userData = userData; stream_.callbackInfo.errorCallback = (void *) errorCallback; if ( options ) options->numberOfBuffers = stream_.nBuffers; stream_.state = STREAM_STOPPED; } unsigned int RtApi :: getDefaultInputDevice( void ) { // Should be implemented in subclasses if possible. return 0; } unsigned int RtApi :: getDefaultOutputDevice( void ) { // Should be implemented in subclasses if possible. return 0; } void RtApi :: closeStream( void ) { // MUST be implemented in subclasses! return; } bool RtApi :: probeDeviceOpen( unsigned int /*device*/, StreamMode /*mode*/, unsigned int /*channels*/, unsigned int /*firstChannel*/, unsigned int /*sampleRate*/, RtAudioFormat /*format*/, unsigned int * /*bufferSize*/, RtAudio::StreamOptions * /*options*/ ) { // MUST be implemented in subclasses! return FAILURE; } void RtApi :: tickStreamTime( void ) { // Subclasses that do not provide their own implementation of // getStreamTime should call this function once per buffer I/O to // provide basic stream time support. stream_.streamTime += ( stream_.bufferSize * 1.0 / stream_.sampleRate ); #if defined( HAVE_GETTIMEOFDAY ) gettimeofday( &stream_.lastTickTimestamp, NULL ); #endif } long RtApi :: getStreamLatency( void ) { verifyStream(); long totalLatency = 0; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) totalLatency = stream_.latency[0]; if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) totalLatency += stream_.latency[1]; return totalLatency; } double RtApi :: getStreamTime( void ) { verifyStream(); #if defined( HAVE_GETTIMEOFDAY ) // Return a very accurate estimate of the stream time by // adding in the elapsed time since the last tick. struct timeval then; struct timeval now; if ( stream_.state != STREAM_RUNNING || stream_.streamTime == 0.0 ) return stream_.streamTime; gettimeofday( &now, NULL ); then = stream_.lastTickTimestamp; return stream_.streamTime + ((now.tv_sec + 0.000001 * now.tv_usec) - (then.tv_sec + 0.000001 * then.tv_usec)); #else return stream_.streamTime; #endif } void RtApi :: setStreamTime( double time ) { verifyStream(); if ( time >= 0.0 ) stream_.streamTime = time; } unsigned int RtApi :: getStreamSampleRate( void ) { verifyStream(); return stream_.sampleRate; } // *************************************************** // // // OS/API-specific methods. // // *************************************************** // #if defined(__MACOSX_CORE__) // The OS X CoreAudio API is designed to use a separate callback // procedure for each of its audio devices. A single RtAudio duplex // stream using two different devices is supported here, though it // cannot be guaranteed to always behave correctly because we cannot // synchronize these two callbacks. // // A property listener is installed for over/underrun information. // However, no functionality is currently provided to allow property // listeners to trigger user handlers because it is unclear what could // be done if a critical stream parameter (buffer size, sample rate, // device disconnect) notification arrived. The listeners entail // quite a bit of extra code and most likely, a user program wouldn't // be prepared for the result anyway. However, we do provide a flag // to the client callback function to inform of an over/underrun. // A structure to hold various information related to the CoreAudio API // implementation. struct CoreHandle { AudioDeviceID id[2]; // device ids #if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) AudioDeviceIOProcID procId[2]; #endif UInt32 iStream[2]; // device stream index (or first if using multiple) UInt32 nStreams[2]; // number of streams to use bool xrun[2]; char *deviceBuffer; pthread_cond_t condition; int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. CoreHandle() :deviceBuffer(0), drainCounter(0), internalDrain(false) { nStreams[0] = 1; nStreams[1] = 1; id[0] = 0; id[1] = 0; xrun[0] = false; xrun[1] = false; } }; RtApiCore:: RtApiCore() { #if defined( AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER ) // This is a largely undocumented but absolutely necessary // requirement starting with OS-X 10.6. If not called, queries and // updates to various audio device properties are not handled // correctly. CFRunLoopRef theRunLoop = NULL; AudioObjectPropertyAddress property = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; OSStatus result = AudioObjectSetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop); if ( result != noErr ) { errorText_ = "RtApiCore::RtApiCore: error setting run loop property!"; error( RtAudioError::WARNING ); } #endif } RtApiCore :: ~RtApiCore() { // The subclass destructor gets called before the base class // destructor, so close an existing stream before deallocating // apiDeviceId memory. if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiCore :: getDeviceCount( void ) { // Find out how many audio devices there are, if any. UInt32 dataSize; AudioObjectPropertyAddress propertyAddress = { kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; OSStatus result = AudioObjectGetPropertyDataSize( kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize ); if ( result != noErr ) { errorText_ = "RtApiCore::getDeviceCount: OS-X error getting device info!"; error( RtAudioError::WARNING ); return 0; } return dataSize / sizeof( AudioDeviceID ); } unsigned int RtApiCore :: getDefaultInputDevice( void ) { unsigned int nDevices = getDeviceCount(); if ( nDevices <= 1 ) return 0; AudioDeviceID id; UInt32 dataSize = sizeof( AudioDeviceID ); AudioObjectPropertyAddress property = { kAudioHardwarePropertyDefaultInputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; OSStatus result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, &dataSize, &id ); if ( result != noErr ) { errorText_ = "RtApiCore::getDefaultInputDevice: OS-X system error getting device."; error( RtAudioError::WARNING ); return 0; } dataSize *= nDevices; AudioDeviceID deviceList[ nDevices ]; property.mSelector = kAudioHardwarePropertyDevices; result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, &dataSize, (void *) &deviceList ); if ( result != noErr ) { errorText_ = "RtApiCore::getDefaultInputDevice: OS-X system error getting device IDs."; error( RtAudioError::WARNING ); return 0; } for ( unsigned int i=0; i= nDevices ) { errorText_ = "RtApiCore::getDeviceInfo: device ID is invalid!"; error( RtAudioError::INVALID_USE ); return info; } AudioDeviceID deviceList[ nDevices ]; UInt32 dataSize = sizeof( AudioDeviceID ) * nDevices; AudioObjectPropertyAddress property = { kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; OSStatus result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, &dataSize, (void *) &deviceList ); if ( result != noErr ) { errorText_ = "RtApiCore::getDeviceInfo: OS-X system error getting device IDs."; error( RtAudioError::WARNING ); return info; } AudioDeviceID id = deviceList[ device ]; // Get the device name. info.name.erase(); CFStringRef cfname; dataSize = sizeof( CFStringRef ); property.mSelector = kAudioObjectPropertyManufacturer; result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &cfname ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceInfo: system error (" << getErrorCode( result ) << ") getting device manufacturer."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } //const char *mname = CFStringGetCStringPtr( cfname, CFStringGetSystemEncoding() ); int length = CFStringGetLength(cfname); char *mname = (char *)malloc(length * 3 + 1); #if defined( UNICODE ) || defined( _UNICODE ) CFStringGetCString(cfname, mname, length * 3 + 1, kCFStringEncodingUTF8); #else CFStringGetCString(cfname, mname, length * 3 + 1, CFStringGetSystemEncoding()); #endif info.name.append( (const char *)mname, strlen(mname) ); info.name.append( ": " ); CFRelease( cfname ); free(mname); property.mSelector = kAudioObjectPropertyName; result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &cfname ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceInfo: system error (" << getErrorCode( result ) << ") getting device name."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } //const char *name = CFStringGetCStringPtr( cfname, CFStringGetSystemEncoding() ); length = CFStringGetLength(cfname); char *name = (char *)malloc(length * 3 + 1); #if defined( UNICODE ) || defined( _UNICODE ) CFStringGetCString(cfname, name, length * 3 + 1, kCFStringEncodingUTF8); #else CFStringGetCString(cfname, name, length * 3 + 1, CFStringGetSystemEncoding()); #endif info.name.append( (const char *)name, strlen(name) ); CFRelease( cfname ); free(name); // Get the output stream "configuration". AudioBufferList *bufferList = nil; property.mSelector = kAudioDevicePropertyStreamConfiguration; property.mScope = kAudioDevicePropertyScopeOutput; // property.mElement = kAudioObjectPropertyElementWildcard; dataSize = 0; result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); if ( result != noErr || dataSize == 0 ) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting output stream configuration info for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // Allocate the AudioBufferList. bufferList = (AudioBufferList *) malloc( dataSize ); if ( bufferList == NULL ) { errorText_ = "RtApiCore::getDeviceInfo: memory error allocating output AudioBufferList."; error( RtAudioError::WARNING ); return info; } result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, bufferList ); if ( result != noErr || dataSize == 0 ) { free( bufferList ); errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting output stream configuration for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // Get output channel information. unsigned int i, nStreams = bufferList->mNumberBuffers; for ( i=0; imBuffers[i].mNumberChannels; free( bufferList ); // Get the input stream "configuration". property.mScope = kAudioDevicePropertyScopeInput; result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); if ( result != noErr || dataSize == 0 ) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting input stream configuration info for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // Allocate the AudioBufferList. bufferList = (AudioBufferList *) malloc( dataSize ); if ( bufferList == NULL ) { errorText_ = "RtApiCore::getDeviceInfo: memory error allocating input AudioBufferList."; error( RtAudioError::WARNING ); return info; } result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, bufferList ); if (result != noErr || dataSize == 0) { free( bufferList ); errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting input stream configuration for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // Get input channel information. nStreams = bufferList->mNumberBuffers; for ( i=0; imBuffers[i].mNumberChannels; free( bufferList ); // If device opens for both playback and capture, we determine the channels. if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // Probe the device sample rates. bool isInput = false; if ( info.outputChannels == 0 ) isInput = true; // Determine the supported sample rates. property.mSelector = kAudioDevicePropertyAvailableNominalSampleRates; if ( isInput == false ) property.mScope = kAudioDevicePropertyScopeOutput; result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); if ( result != kAudioHardwareNoError || dataSize == 0 ) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting sample rate info."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } UInt32 nRanges = dataSize / sizeof( AudioValueRange ); AudioValueRange rangeList[ nRanges ]; result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &rangeList ); if ( result != kAudioHardwareNoError ) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting sample rates."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // The sample rate reporting mechanism is a bit of a mystery. It // seems that it can either return individual rates or a range of // rates. I assume that if the min / max range values are the same, // then that represents a single supported rate and if the min / max // range values are different, the device supports an arbitrary // range of values (though there might be multiple ranges, so we'll // use the most conservative range). Float64 minimumRate = 1.0, maximumRate = 10000000000.0; bool haveValueRange = false; info.sampleRates.clear(); for ( UInt32 i=0; i minimumRate ) minimumRate = rangeList[i].mMinimum; if ( rangeList[i].mMaximum < maximumRate ) maximumRate = rangeList[i].mMaximum; } } if ( haveValueRange ) { for ( unsigned int k=0; k= (unsigned int) minimumRate && SAMPLE_RATES[k] <= (unsigned int) maximumRate ) info.sampleRates.push_back( SAMPLE_RATES[k] ); } } // Sort and remove any redundant values std::sort( info.sampleRates.begin(), info.sampleRates.end() ); info.sampleRates.erase( unique( info.sampleRates.begin(), info.sampleRates.end() ), info.sampleRates.end() ); if ( info.sampleRates.size() == 0 ) { errorStream_ << "RtApiCore::probeDeviceInfo: No supported sample rates found for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // CoreAudio always uses 32-bit floating point data for PCM streams. // Thus, any other "physical" formats supported by the device are of // no interest to the client. info.nativeFormats = RTAUDIO_FLOAT32; if ( info.outputChannels > 0 ) if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; if ( info.inputChannels > 0 ) if ( getDefaultInputDevice() == device ) info.isDefaultInput = true; info.probed = true; return info; } static OSStatus callbackHandler( AudioDeviceID inDevice, const AudioTimeStamp* /*inNow*/, const AudioBufferList* inInputData, const AudioTimeStamp* /*inInputTime*/, AudioBufferList* outOutputData, const AudioTimeStamp* /*inOutputTime*/, void* infoPointer ) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiCore *object = (RtApiCore *) info->object; if ( object->callbackEvent( inDevice, inInputData, outOutputData ) == false ) return kAudioHardwareUnspecifiedError; else return kAudioHardwareNoError; } static OSStatus xrunListener( AudioObjectID /*inDevice*/, UInt32 nAddresses, const AudioObjectPropertyAddress properties[], void* handlePointer ) { CoreHandle *handle = (CoreHandle *) handlePointer; for ( UInt32 i=0; ixrun[1] = true; else handle->xrun[0] = true; } } return kAudioHardwareNoError; } static OSStatus rateListener( AudioObjectID inDevice, UInt32 /*nAddresses*/, const AudioObjectPropertyAddress /*properties*/[], void* ratePointer ) { Float64 *rate = (Float64 *) ratePointer; UInt32 dataSize = sizeof( Float64 ); AudioObjectPropertyAddress property = { kAudioDevicePropertyNominalSampleRate, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; AudioObjectGetPropertyData( inDevice, &property, 0, NULL, &dataSize, rate ); return kAudioHardwareNoError; } bool RtApiCore :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { // Get device ID unsigned int nDevices = getDeviceCount(); if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiCore::probeDeviceOpen: no devices found!"; return FAILURE; } if ( device >= nDevices ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiCore::probeDeviceOpen: device ID is invalid!"; return FAILURE; } AudioDeviceID deviceList[ nDevices ]; UInt32 dataSize = sizeof( AudioDeviceID ) * nDevices; AudioObjectPropertyAddress property = { kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; OSStatus result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, &dataSize, (void *) &deviceList ); if ( result != noErr ) { errorText_ = "RtApiCore::probeDeviceOpen: OS-X system error getting device IDs."; return FAILURE; } AudioDeviceID id = deviceList[ device ]; // Setup for stream mode. bool isInput = false; if ( mode == INPUT ) { isInput = true; property.mScope = kAudioDevicePropertyScopeInput; } else property.mScope = kAudioDevicePropertyScopeOutput; // Get the stream "configuration". AudioBufferList *bufferList = nil; dataSize = 0; property.mSelector = kAudioDevicePropertyStreamConfiguration; result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); if ( result != noErr || dataSize == 0 ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream configuration info for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Allocate the AudioBufferList. bufferList = (AudioBufferList *) malloc( dataSize ); if ( bufferList == NULL ) { errorText_ = "RtApiCore::probeDeviceOpen: memory error allocating AudioBufferList."; return FAILURE; } result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, bufferList ); if (result != noErr || dataSize == 0) { free( bufferList ); errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream configuration for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Search for one or more streams that contain the desired number of // channels. CoreAudio devices can have an arbitrary number of // streams and each stream can have an arbitrary number of channels. // For each stream, a single buffer of interleaved samples is // provided. RtAudio prefers the use of one stream of interleaved // data or multiple consecutive single-channel streams. However, we // now support multiple consecutive multi-channel streams of // interleaved data as well. UInt32 iStream, offsetCounter = firstChannel; UInt32 nStreams = bufferList->mNumberBuffers; bool monoMode = false; bool foundStream = false; // First check that the device supports the requested number of // channels. UInt32 deviceChannels = 0; for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; if ( deviceChannels < ( channels + firstChannel ) ) { free( bufferList ); errorStream_ << "RtApiCore::probeDeviceOpen: the device (" << device << ") does not support the requested channel count."; errorText_ = errorStream_.str(); return FAILURE; } // Look for a single stream meeting our needs. UInt32 firstStream, streamCount = 1, streamChannels = 0, channelOffset = 0; for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; if ( streamChannels >= channels + offsetCounter ) { firstStream = iStream; channelOffset = offsetCounter; foundStream = true; break; } if ( streamChannels > offsetCounter ) break; offsetCounter -= streamChannels; } // If we didn't find a single stream above, then we should be able // to meet the channel specification with multiple streams. if ( foundStream == false ) { monoMode = true; offsetCounter = firstChannel; for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; if ( streamChannels > offsetCounter ) break; offsetCounter -= streamChannels; } firstStream = iStream; channelOffset = offsetCounter; Int32 channelCounter = channels + offsetCounter - streamChannels; if ( streamChannels > 1 ) monoMode = false; while ( channelCounter > 0 ) { streamChannels = bufferList->mBuffers[++iStream].mNumberChannels; if ( streamChannels > 1 ) monoMode = false; channelCounter -= streamChannels; streamCount++; } } free( bufferList ); // Determine the buffer size. AudioValueRange bufferRange; dataSize = sizeof( AudioValueRange ); property.mSelector = kAudioDevicePropertyBufferFrameSizeRange; result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &bufferRange ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting buffer size range for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ( bufferRange.mMinimum > *bufferSize ) *bufferSize = (unsigned long) bufferRange.mMinimum; else if ( bufferRange.mMaximum < *bufferSize ) *bufferSize = (unsigned long) bufferRange.mMaximum; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) *bufferSize = (unsigned long) bufferRange.mMinimum; // Set the buffer size. For multiple streams, I'm assuming we only // need to make this setting for the master channel. UInt32 theSize = (UInt32) *bufferSize; dataSize = sizeof( UInt32 ); property.mSelector = kAudioDevicePropertyBufferFrameSize; result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &theSize ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting the buffer size for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // If attempting to setup a duplex stream, the bufferSize parameter // MUST be the same in both directions! *bufferSize = theSize; if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error setting buffer size for duplex stream on device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.bufferSize = *bufferSize; stream_.nBuffers = 1; // Try to set "hog" mode ... it's not clear to me this is working. if ( options && options->flags & RTAUDIO_HOG_DEVICE ) { pid_t hog_pid; dataSize = sizeof( hog_pid ); property.mSelector = kAudioDevicePropertyHogMode; result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &hog_pid ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting 'hog' state!"; errorText_ = errorStream_.str(); return FAILURE; } if ( hog_pid != getpid() ) { hog_pid = getpid(); result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &hog_pid ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting 'hog' state!"; errorText_ = errorStream_.str(); return FAILURE; } } } // Check and if necessary, change the sample rate for the device. Float64 nominalRate; dataSize = sizeof( Float64 ); property.mSelector = kAudioDevicePropertyNominalSampleRate; result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &nominalRate ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting current sample rate."; errorText_ = errorStream_.str(); return FAILURE; } // Only change the sample rate if off by more than 1 Hz. if ( fabs( nominalRate - (double)sampleRate ) > 1.0 ) { // Set a property listener for the sample rate change Float64 reportedRate = 0.0; AudioObjectPropertyAddress tmp = { kAudioDevicePropertyNominalSampleRate, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; result = AudioObjectAddPropertyListener( id, &tmp, rateListener, (void *) &reportedRate ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate property listener for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } nominalRate = (Float64) sampleRate; result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &nominalRate ); if ( result != noErr ) { AudioObjectRemovePropertyListener( id, &tmp, rateListener, (void *) &reportedRate ); errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Now wait until the reported nominal rate is what we just set. UInt32 microCounter = 0; while ( reportedRate != nominalRate ) { microCounter += 5000; if ( microCounter > 5000000 ) break; usleep( 5000 ); } // Remove the property listener. AudioObjectRemovePropertyListener( id, &tmp, rateListener, (void *) &reportedRate ); if ( microCounter > 5000000 ) { errorStream_ << "RtApiCore::probeDeviceOpen: timeout waiting for sample rate update for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } } // Now set the stream format for all streams. Also, check the // physical format of the device and change that if necessary. AudioStreamBasicDescription description; dataSize = sizeof( AudioStreamBasicDescription ); property.mSelector = kAudioStreamPropertyVirtualFormat; result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Set the sample rate and data format id. However, only make the // change if the sample rate is not within 1.0 of the desired // rate and the format is not linear pcm. bool updateFormat = false; if ( fabs( description.mSampleRate - (Float64)sampleRate ) > 1.0 ) { description.mSampleRate = (Float64) sampleRate; updateFormat = true; } if ( description.mFormatID != kAudioFormatLinearPCM ) { description.mFormatID = kAudioFormatLinearPCM; updateFormat = true; } if ( updateFormat ) { result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate or data format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } } // Now check the physical format. property.mSelector = kAudioStreamPropertyPhysicalFormat; result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream physical format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } //std::cout << "Current physical stream format:" << std::endl; //std::cout << " mBitsPerChan = " << description.mBitsPerChannel << std::endl; //std::cout << " aligned high = " << (description.mFormatFlags & kAudioFormatFlagIsAlignedHigh) << ", isPacked = " << (description.mFormatFlags & kAudioFormatFlagIsPacked) << std::endl; //std::cout << " bytesPerFrame = " << description.mBytesPerFrame << std::endl; //std::cout << " sample rate = " << description.mSampleRate << std::endl; if ( description.mFormatID != kAudioFormatLinearPCM || description.mBitsPerChannel < 16 ) { description.mFormatID = kAudioFormatLinearPCM; //description.mSampleRate = (Float64) sampleRate; AudioStreamBasicDescription testDescription = description; UInt32 formatFlags; // We'll try higher bit rates first and then work our way down. std::vector< std::pair > physicalFormats; formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsFloat) & ~kLinearPCMFormatFlagIsSignedInteger; physicalFormats.push_back( std::pair( 32, formatFlags ) ); formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked) & ~kLinearPCMFormatFlagIsFloat; physicalFormats.push_back( std::pair( 32, formatFlags ) ); physicalFormats.push_back( std::pair( 24, formatFlags ) ); // 24-bit packed formatFlags &= ~( kAudioFormatFlagIsPacked | kAudioFormatFlagIsAlignedHigh ); physicalFormats.push_back( std::pair( 24.2, formatFlags ) ); // 24-bit in 4 bytes, aligned low formatFlags |= kAudioFormatFlagIsAlignedHigh; physicalFormats.push_back( std::pair( 24.4, formatFlags ) ); // 24-bit in 4 bytes, aligned high formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked) & ~kLinearPCMFormatFlagIsFloat; physicalFormats.push_back( std::pair( 16, formatFlags ) ); physicalFormats.push_back( std::pair( 8, formatFlags ) ); bool setPhysicalFormat = false; for( unsigned int i=0; iflags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; stream_.deviceInterleaved[mode] = true; if ( monoMode == true ) stream_.deviceInterleaved[mode] = false; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; if ( streamCount == 1 ) { if ( stream_.nUserChannels[mode] > 1 && stream_.userInterleaved != stream_.deviceInterleaved[mode] ) stream_.doConvertBuffer[mode] = true; } else if ( monoMode && stream_.userInterleaved ) stream_.doConvertBuffer[mode] = true; // Allocate our CoreHandle structure for the stream. CoreHandle *handle = 0; if ( stream_.apiHandle == 0 ) { try { handle = new CoreHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiCore::probeDeviceOpen: error allocating CoreHandle memory."; goto error; } if ( pthread_cond_init( &handle->condition, NULL ) ) { errorText_ = "RtApiCore::probeDeviceOpen: error initializing pthread condition variable."; goto error; } stream_.apiHandle = (void *) handle; } else handle = (CoreHandle *) stream_.apiHandle; handle->iStream[mode] = firstStream; handle->nStreams[mode] = streamCount; handle->id[mode] = id; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); // stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); stream_.userBuffer[mode] = (char *) malloc( bufferBytes * sizeof(char) ); memset( stream_.userBuffer[mode], 0, bufferBytes * sizeof(char) ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiCore::probeDeviceOpen: error allocating user buffer memory."; goto error; } // If possible, we will make use of the CoreAudio stream buffers as // "device buffers". However, we can't do this if using multiple // streams. if ( stream_.doConvertBuffer[mode] && handle->nStreams[mode] > 1 ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiCore::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.sampleRate = sampleRate; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; stream_.callbackInfo.object = (void *) this; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) { if ( streamCount > 1 ) setConvertInfo( mode, 0 ); else setConvertInfo( mode, channelOffset ); } if ( mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] == device ) // Only one callback procedure per device. stream_.mode = DUPLEX; else { #if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) result = AudioDeviceCreateIOProcID( id, callbackHandler, (void *) &stream_.callbackInfo, &handle->procId[mode] ); #else // deprecated in favor of AudioDeviceCreateIOProcID() result = AudioDeviceAddIOProc( id, callbackHandler, (void *) &stream_.callbackInfo ); #endif if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error setting callback for device (" << device << ")."; errorText_ = errorStream_.str(); goto error; } if ( stream_.mode == OUTPUT && mode == INPUT ) stream_.mode = DUPLEX; else stream_.mode = mode; } // Setup the device property listener for over/underload. property.mSelector = kAudioDeviceProcessorOverload; property.mScope = kAudioObjectPropertyScopeGlobal; result = AudioObjectAddPropertyListener( id, &property, xrunListener, (void *) handle ); return SUCCESS; error: if ( handle ) { pthread_cond_destroy( &handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.state = STREAM_CLOSED; return FAILURE; } void RtApiCore :: closeStream( void ) { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiCore::closeStream(): no open stream to close!"; error( RtAudioError::WARNING ); return; } CoreHandle *handle = (CoreHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( stream_.state == STREAM_RUNNING ) AudioDeviceStop( handle->id[0], callbackHandler ); #if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) AudioDeviceDestroyIOProcID( handle->id[0], handle->procId[0] ); #else // deprecated in favor of AudioDeviceDestroyIOProcID() AudioDeviceRemoveIOProc( handle->id[0], callbackHandler ); #endif } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { if ( stream_.state == STREAM_RUNNING ) AudioDeviceStop( handle->id[1], callbackHandler ); #if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) AudioDeviceDestroyIOProcID( handle->id[1], handle->procId[1] ); #else // deprecated in favor of AudioDeviceDestroyIOProcID() AudioDeviceRemoveIOProc( handle->id[1], callbackHandler ); #endif } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } // Destroy pthread condition variable. pthread_cond_destroy( &handle->condition ); delete handle; stream_.apiHandle = 0; stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiCore :: startStream( void ) { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiCore::startStream(): the stream is already running!"; error( RtAudioError::WARNING ); return; } OSStatus result = noErr; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = AudioDeviceStart( handle->id[0], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::startStream: system error (" << getErrorCode( result ) << ") starting callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { result = AudioDeviceStart( handle->id[1], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::startStream: system error starting input callback procedure on device (" << stream_.device[1] << ")."; errorText_ = errorStream_.str(); goto unlock; } } handle->drainCounter = 0; handle->internalDrain = false; stream_.state = STREAM_RUNNING; unlock: if ( result == noErr ) return; error( RtAudioError::SYSTEM_ERROR ); } void RtApiCore :: stopStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiCore::stopStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } OSStatus result = noErr; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 2; pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled } result = AudioDeviceStop( handle->id[0], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { result = AudioDeviceStop( handle->id[1], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping input callback procedure on device (" << stream_.device[1] << ")."; errorText_ = errorStream_.str(); goto unlock; } } stream_.state = STREAM_STOPPED; unlock: if ( result == noErr ) return; error( RtAudioError::SYSTEM_ERROR ); } void RtApiCore :: abortStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiCore::abortStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } CoreHandle *handle = (CoreHandle *) stream_.apiHandle; handle->drainCounter = 2; stopStream(); } // This function will be called by a spawned thread when the user // callback function signals that the stream should be stopped or // aborted. It is better to handle it this way because the // callbackEvent() function probably should return before the AudioDeviceStop() // function is called. static void *coreStopStream( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiCore *object = (RtApiCore *) info->object; object->stopStream(); pthread_exit( NULL ); } bool RtApiCore :: callbackEvent( AudioDeviceID deviceId, const AudioBufferList *inBufferList, const AudioBufferList *outBufferList ) { if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) return SUCCESS; if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiCore::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtAudioError::WARNING ); return FAILURE; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > 3 ) { ThreadHandle threadId; stream_.state = STREAM_STOPPING; if ( handle->internalDrain == true ) pthread_create( &threadId, NULL, coreStopStream, info ); else // external call to stopStream() pthread_cond_signal( &handle->condition ); return SUCCESS; } AudioDeviceID outputDevice = handle->id[0]; // Invoke user callback to get fresh output data UNLESS we are // draining stream or duplex mode AND the input/output devices are // different AND this function is called for the input device. if ( handle->drainCounter == 0 && ( stream_.mode != DUPLEX || deviceId == outputDevice ) ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( cbReturnValue == 2 ) { stream_.state = STREAM_STOPPING; handle->drainCounter = 2; abortStream(); return SUCCESS; } else if ( cbReturnValue == 1 ) { handle->drainCounter = 1; handle->internalDrain = true; } } if ( stream_.mode == OUTPUT || ( stream_.mode == DUPLEX && deviceId == outputDevice ) ) { if ( handle->drainCounter > 1 ) { // write zeros to the output stream if ( handle->nStreams[0] == 1 ) { memset( outBufferList->mBuffers[handle->iStream[0]].mData, 0, outBufferList->mBuffers[handle->iStream[0]].mDataByteSize ); } else { // fill multiple streams with zeros for ( unsigned int i=0; inStreams[0]; i++ ) { memset( outBufferList->mBuffers[handle->iStream[0]+i].mData, 0, outBufferList->mBuffers[handle->iStream[0]+i].mDataByteSize ); } } } else if ( handle->nStreams[0] == 1 ) { if ( stream_.doConvertBuffer[0] ) { // convert directly to CoreAudio stream buffer convertBuffer( (char *) outBufferList->mBuffers[handle->iStream[0]].mData, stream_.userBuffer[0], stream_.convertInfo[0] ); } else { // copy from user buffer memcpy( outBufferList->mBuffers[handle->iStream[0]].mData, stream_.userBuffer[0], outBufferList->mBuffers[handle->iStream[0]].mDataByteSize ); } } else { // fill multiple streams Float32 *inBuffer = (Float32 *) stream_.userBuffer[0]; if ( stream_.doConvertBuffer[0] ) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); inBuffer = (Float32 *) stream_.deviceBuffer; } if ( stream_.deviceInterleaved[0] == false ) { // mono mode UInt32 bufferBytes = outBufferList->mBuffers[handle->iStream[0]].mDataByteSize; for ( unsigned int i=0; imBuffers[handle->iStream[0]+i].mData, (void *)&inBuffer[i*stream_.bufferSize], bufferBytes ); } } else { // fill multiple multi-channel streams with interleaved data UInt32 streamChannels, channelsLeft, inJump, outJump, inOffset; Float32 *out, *in; bool inInterleaved = ( stream_.userInterleaved ) ? true : false; UInt32 inChannels = stream_.nUserChannels[0]; if ( stream_.doConvertBuffer[0] ) { inInterleaved = true; // device buffer will always be interleaved for nStreams > 1 and not mono mode inChannels = stream_.nDeviceChannels[0]; } if ( inInterleaved ) inOffset = 1; else inOffset = stream_.bufferSize; channelsLeft = inChannels; for ( unsigned int i=0; inStreams[0]; i++ ) { in = inBuffer; out = (Float32 *) outBufferList->mBuffers[handle->iStream[0]+i].mData; streamChannels = outBufferList->mBuffers[handle->iStream[0]+i].mNumberChannels; outJump = 0; // Account for possible channel offset in first stream if ( i == 0 && stream_.channelOffset[0] > 0 ) { streamChannels -= stream_.channelOffset[0]; outJump = stream_.channelOffset[0]; out += outJump; } // Account for possible unfilled channels at end of the last stream if ( streamChannels > channelsLeft ) { outJump = streamChannels - channelsLeft; streamChannels = channelsLeft; } // Determine input buffer offsets and skips if ( inInterleaved ) { inJump = inChannels; in += inChannels - channelsLeft; } else { inJump = 1; in += (inChannels - channelsLeft) * inOffset; } for ( unsigned int i=0; idrainCounter ) { handle->drainCounter++; goto unlock; } AudioDeviceID inputDevice; inputDevice = handle->id[1]; if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && deviceId == inputDevice ) ) { if ( handle->nStreams[1] == 1 ) { if ( stream_.doConvertBuffer[1] ) { // convert directly from CoreAudio stream buffer convertBuffer( stream_.userBuffer[1], (char *) inBufferList->mBuffers[handle->iStream[1]].mData, stream_.convertInfo[1] ); } else { // copy to user buffer memcpy( stream_.userBuffer[1], inBufferList->mBuffers[handle->iStream[1]].mData, inBufferList->mBuffers[handle->iStream[1]].mDataByteSize ); } } else { // read from multiple streams Float32 *outBuffer = (Float32 *) stream_.userBuffer[1]; if ( stream_.doConvertBuffer[1] ) outBuffer = (Float32 *) stream_.deviceBuffer; if ( stream_.deviceInterleaved[1] == false ) { // mono mode UInt32 bufferBytes = inBufferList->mBuffers[handle->iStream[1]].mDataByteSize; for ( unsigned int i=0; imBuffers[handle->iStream[1]+i].mData, bufferBytes ); } } else { // read from multiple multi-channel streams UInt32 streamChannels, channelsLeft, inJump, outJump, outOffset; Float32 *out, *in; bool outInterleaved = ( stream_.userInterleaved ) ? true : false; UInt32 outChannels = stream_.nUserChannels[1]; if ( stream_.doConvertBuffer[1] ) { outInterleaved = true; // device buffer will always be interleaved for nStreams > 1 and not mono mode outChannels = stream_.nDeviceChannels[1]; } if ( outInterleaved ) outOffset = 1; else outOffset = stream_.bufferSize; channelsLeft = outChannels; for ( unsigned int i=0; inStreams[1]; i++ ) { out = outBuffer; in = (Float32 *) inBufferList->mBuffers[handle->iStream[1]+i].mData; streamChannels = inBufferList->mBuffers[handle->iStream[1]+i].mNumberChannels; inJump = 0; // Account for possible channel offset in first stream if ( i == 0 && stream_.channelOffset[1] > 0 ) { streamChannels -= stream_.channelOffset[1]; inJump = stream_.channelOffset[1]; in += inJump; } // Account for possible unread channels at end of the last stream if ( streamChannels > channelsLeft ) { inJump = streamChannels - channelsLeft; streamChannels = channelsLeft; } // Determine output buffer offsets and skips if ( outInterleaved ) { outJump = outChannels; out += outChannels - channelsLeft; } else { outJump = 1; out += (outChannels - channelsLeft) * outOffset; } for ( unsigned int i=0; i #include #include // A structure to hold various information related to the Jack API // implementation. struct JackHandle { jack_client_t *client; jack_port_t **ports[2]; std::string deviceName[2]; bool xrun[2]; pthread_cond_t condition; int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. JackHandle() :client(0), drainCounter(0), internalDrain(false) { ports[0] = 0; ports[1] = 0; xrun[0] = false; xrun[1] = false; } }; static void jackSilentError( const char * ) {}; RtApiJack :: RtApiJack() { // Nothing to do here. #if !defined(__RTAUDIO_DEBUG__) // Turn off Jack's internal error reporting. jack_set_error_function( &jackSilentError ); #endif } RtApiJack :: ~RtApiJack() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiJack :: getDeviceCount( void ) { // See if we can become a jack client. jack_options_t options = (jack_options_t) ( JackNoStartServer ); //JackNullOption; jack_status_t *status = NULL; jack_client_t *client = jack_client_open( "RtApiJackCount", options, status ); if ( client == 0 ) return 0; const char **ports; std::string port, previousPort; unsigned int nChannels = 0, nDevices = 0; ports = jack_get_ports( client, NULL, NULL, 0 ); if ( ports ) { // Parse the port names up to the first colon (:). size_t iColon = 0; do { port = (char *) ports[ nChannels ]; iColon = port.find(":"); if ( iColon != std::string::npos ) { port = port.substr( 0, iColon + 1 ); if ( port != previousPort ) { nDevices++; previousPort = port; } } } while ( ports[++nChannels] ); free( ports ); } jack_client_close( client ); return nDevices; } RtAudio::DeviceInfo RtApiJack :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; jack_options_t options = (jack_options_t) ( JackNoStartServer ); //JackNullOption jack_status_t *status = NULL; jack_client_t *client = jack_client_open( "RtApiJackInfo", options, status ); if ( client == 0 ) { errorText_ = "RtApiJack::getDeviceInfo: Jack server not found or connection error!"; error( RtAudioError::WARNING ); return info; } const char **ports; std::string port, previousPort; unsigned int nPorts = 0, nDevices = 0; ports = jack_get_ports( client, NULL, NULL, 0 ); if ( ports ) { // Parse the port names up to the first colon (:). size_t iColon = 0; do { port = (char *) ports[ nPorts ]; iColon = port.find(":"); if ( iColon != std::string::npos ) { port = port.substr( 0, iColon ); if ( port != previousPort ) { if ( nDevices == device ) info.name = port; nDevices++; previousPort = port; } } } while ( ports[++nPorts] ); free( ports ); } if ( device >= nDevices ) { jack_client_close( client ); errorText_ = "RtApiJack::getDeviceInfo: device ID is invalid!"; error( RtAudioError::INVALID_USE ); return info; } // Get the current jack server sample rate. info.sampleRates.clear(); info.sampleRates.push_back( jack_get_sample_rate( client ) ); // Count the available ports containing the client name as device // channels. Jack "input ports" equal RtAudio output channels. unsigned int nChannels = 0; ports = jack_get_ports( client, info.name.c_str(), NULL, JackPortIsInput ); if ( ports ) { while ( ports[ nChannels ] ) nChannels++; free( ports ); info.outputChannels = nChannels; } // Jack "output ports" equal RtAudio input channels. nChannels = 0; ports = jack_get_ports( client, info.name.c_str(), NULL, JackPortIsOutput ); if ( ports ) { while ( ports[ nChannels ] ) nChannels++; free( ports ); info.inputChannels = nChannels; } if ( info.outputChannels == 0 && info.inputChannels == 0 ) { jack_client_close(client); errorText_ = "RtApiJack::getDeviceInfo: error determining Jack input/output channels!"; error( RtAudioError::WARNING ); return info; } // If device opens for both playback and capture, we determine the channels. if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // Jack always uses 32-bit floats. info.nativeFormats = RTAUDIO_FLOAT32; // Jack doesn't provide default devices so we'll use the first available one. if ( device == 0 && info.outputChannels > 0 ) info.isDefaultOutput = true; if ( device == 0 && info.inputChannels > 0 ) info.isDefaultInput = true; jack_client_close(client); info.probed = true; return info; } static int jackCallbackHandler( jack_nframes_t nframes, void *infoPointer ) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiJack *object = (RtApiJack *) info->object; if ( object->callbackEvent( (unsigned long) nframes ) == false ) return 1; return 0; } // This function will be called by a spawned thread when the Jack // server signals that it is shutting down. It is necessary to handle // it this way because the jackShutdown() function must return before // the jack_deactivate() function (in closeStream()) will return. static void *jackCloseStream( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiJack *object = (RtApiJack *) info->object; object->closeStream(); pthread_exit( NULL ); } static void jackShutdown( void *infoPointer ) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiJack *object = (RtApiJack *) info->object; // Check current stream state. If stopped, then we'll assume this // was called as a result of a call to RtApiJack::stopStream (the // deactivation of a client handle causes this function to be called). // If not, we'll assume the Jack server is shutting down or some // other problem occurred and we should close the stream. if ( object->isStreamRunning() == false ) return; ThreadHandle threadId; pthread_create( &threadId, NULL, jackCloseStream, info ); std::cerr << "\nRtApiJack: the Jack server is shutting down this client ... stream stopped and closed!!\n" << std::endl; } static int jackXrun( void *infoPointer ) { JackHandle *handle = (JackHandle *) infoPointer; if ( handle->ports[0] ) handle->xrun[0] = true; if ( handle->ports[1] ) handle->xrun[1] = true; return 0; } bool RtApiJack :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { JackHandle *handle = (JackHandle *) stream_.apiHandle; // Look for jack server and try to become a client (only do once per stream). jack_client_t *client = 0; if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) { jack_options_t jackoptions = (jack_options_t) ( JackNoStartServer ); //JackNullOption; jack_status_t *status = NULL; if ( options && !options->streamName.empty() ) client = jack_client_open( options->streamName.c_str(), jackoptions, status ); else client = jack_client_open( "RtApiJack", jackoptions, status ); if ( client == 0 ) { errorText_ = "RtApiJack::probeDeviceOpen: Jack server not found or connection error!"; error( RtAudioError::WARNING ); return FAILURE; } } else { // The handle must have been created on an earlier pass. client = handle->client; } const char **ports; std::string port, previousPort, deviceName; unsigned int nPorts = 0, nDevices = 0; ports = jack_get_ports( client, NULL, NULL, 0 ); if ( ports ) { // Parse the port names up to the first colon (:). size_t iColon = 0; do { port = (char *) ports[ nPorts ]; iColon = port.find(":"); if ( iColon != std::string::npos ) { port = port.substr( 0, iColon ); if ( port != previousPort ) { if ( nDevices == device ) deviceName = port; nDevices++; previousPort = port; } } } while ( ports[++nPorts] ); free( ports ); } if ( device >= nDevices ) { errorText_ = "RtApiJack::probeDeviceOpen: device ID is invalid!"; return FAILURE; } // Count the available ports containing the client name as device // channels. Jack "input ports" equal RtAudio output channels. unsigned int nChannels = 0; unsigned long flag = JackPortIsInput; if ( mode == INPUT ) flag = JackPortIsOutput; ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); if ( ports ) { while ( ports[ nChannels ] ) nChannels++; free( ports ); } // Compare the jack ports for specified client to the requested number of channels. if ( nChannels < (channels + firstChannel) ) { errorStream_ << "RtApiJack::probeDeviceOpen: requested number of channels (" << channels << ") + offset (" << firstChannel << ") not found for specified device (" << device << ":" << deviceName << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Check the jack server sample rate. unsigned int jackRate = jack_get_sample_rate( client ); if ( sampleRate != jackRate ) { jack_client_close( client ); errorStream_ << "RtApiJack::probeDeviceOpen: the requested sample rate (" << sampleRate << ") is different than the JACK server rate (" << jackRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.sampleRate = jackRate; // Get the latency of the JACK port. ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); if ( ports[ firstChannel ] ) { // Added by Ge Wang jack_latency_callback_mode_t cbmode = (mode == INPUT ? JackCaptureLatency : JackPlaybackLatency); // the range (usually the min and max are equal) jack_latency_range_t latrange; latrange.min = latrange.max = 0; // get the latency range jack_port_get_latency_range( jack_port_by_name( client, ports[firstChannel] ), cbmode, &latrange ); // be optimistic, use the min! stream_.latency[mode] = latrange.min; //stream_.latency[mode] = jack_port_get_latency( jack_port_by_name( client, ports[ firstChannel ] ) ); } free( ports ); // The jack server always uses 32-bit floating-point data. stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; stream_.userFormat = format; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; // Jack always uses non-interleaved buffers. stream_.deviceInterleaved[mode] = false; // Jack always provides host byte-ordered data. stream_.doByteSwap[mode] = false; // Get the buffer size. The buffer size and number of buffers // (periods) is set when the jack server is started. stream_.bufferSize = (int) jack_get_buffer_size( client ); *bufferSize = stream_.bufferSize; stream_.nDeviceChannels[mode] = channels; stream_.nUserChannels[mode] = channels; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate our JackHandle structure for the stream. if ( handle == 0 ) { try { handle = new JackHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating JackHandle memory."; goto error; } if ( pthread_cond_init(&handle->condition, NULL) ) { errorText_ = "RtApiJack::probeDeviceOpen: error initializing pthread condition variable."; goto error; } stream_.apiHandle = (void *) handle; handle->client = client; } handle->deviceName[mode] = deviceName; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; if ( mode == OUTPUT ) bufferBytes = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); else { // mode == INPUT bufferBytes = stream_.nDeviceChannels[1] * formatBytes( stream_.deviceFormat[1] ); if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); if ( bufferBytes < bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } // Allocate memory for the Jack ports (channels) identifiers. handle->ports[mode] = (jack_port_t **) malloc ( sizeof (jack_port_t *) * channels ); if ( handle->ports[mode] == NULL ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating port memory."; goto error; } stream_.device[mode] = device; stream_.channelOffset[mode] = firstChannel; stream_.state = STREAM_STOPPED; stream_.callbackInfo.object = (void *) this; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up the stream for output. stream_.mode = DUPLEX; else { stream_.mode = mode; jack_set_process_callback( handle->client, jackCallbackHandler, (void *) &stream_.callbackInfo ); jack_set_xrun_callback( handle->client, jackXrun, (void *) &handle ); jack_on_shutdown( handle->client, jackShutdown, (void *) &stream_.callbackInfo ); } // Register our ports. char label[64]; if ( mode == OUTPUT ) { for ( unsigned int i=0; iports[0][i] = jack_port_register( handle->client, (const char *)label, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); } } else { for ( unsigned int i=0; iports[1][i] = jack_port_register( handle->client, (const char *)label, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0 ); } } // Setup the buffer conversion information structure. We don't use // buffers to do channel offsets, so we override that parameter // here. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); return SUCCESS; error: if ( handle ) { pthread_cond_destroy( &handle->condition ); jack_client_close( handle->client ); if ( handle->ports[0] ) free( handle->ports[0] ); if ( handle->ports[1] ) free( handle->ports[1] ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiJack :: closeStream( void ) { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiJack::closeStream(): no open stream to close!"; error( RtAudioError::WARNING ); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; if ( handle ) { if ( stream_.state == STREAM_RUNNING ) jack_deactivate( handle->client ); jack_client_close( handle->client ); } if ( handle ) { if ( handle->ports[0] ) free( handle->ports[0] ); if ( handle->ports[1] ) free( handle->ports[1] ); pthread_cond_destroy( &handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiJack :: startStream( void ) { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiJack::startStream(): the stream is already running!"; error( RtAudioError::WARNING ); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; int result = jack_activate( handle->client ); if ( result ) { errorText_ = "RtApiJack::startStream(): unable to activate JACK client!"; goto unlock; } const char **ports; // Get the list of available ports. if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = 1; ports = jack_get_ports( handle->client, handle->deviceName[0].c_str(), NULL, JackPortIsInput); if ( ports == NULL) { errorText_ = "RtApiJack::startStream(): error determining available JACK input ports!"; goto unlock; } // Now make the port connections. Since RtAudio wasn't designed to // allow the user to select particular channels of a device, we'll // just open the first "nChannels" ports with offset. for ( unsigned int i=0; iclient, jack_port_name( handle->ports[0][i] ), ports[ stream_.channelOffset[0] + i ] ); if ( result ) { free( ports ); errorText_ = "RtApiJack::startStream(): error connecting output ports!"; goto unlock; } } free(ports); } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { result = 1; ports = jack_get_ports( handle->client, handle->deviceName[1].c_str(), NULL, JackPortIsOutput ); if ( ports == NULL) { errorText_ = "RtApiJack::startStream(): error determining available JACK output ports!"; goto unlock; } // Now make the port connections. See note above. for ( unsigned int i=0; iclient, ports[ stream_.channelOffset[1] + i ], jack_port_name( handle->ports[1][i] ) ); if ( result ) { free( ports ); errorText_ = "RtApiJack::startStream(): error connecting input ports!"; goto unlock; } } free(ports); } handle->drainCounter = 0; handle->internalDrain = false; stream_.state = STREAM_RUNNING; unlock: if ( result == 0 ) return; error( RtAudioError::SYSTEM_ERROR ); } void RtApiJack :: stopStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiJack::stopStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 2; pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled } } jack_deactivate( handle->client ); stream_.state = STREAM_STOPPED; } void RtApiJack :: abortStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiJack::abortStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; handle->drainCounter = 2; stopStream(); } // This function will be called by a spawned thread when the user // callback function signals that the stream should be stopped or // aborted. It is necessary to handle it this way because the // callbackEvent() function must return before the jack_deactivate() // function will return. static void *jackStopStream( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiJack *object = (RtApiJack *) info->object; object->stopStream(); pthread_exit( NULL ); } bool RtApiJack :: callbackEvent( unsigned long nframes ) { if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) return SUCCESS; if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiCore::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtAudioError::WARNING ); return FAILURE; } if ( stream_.bufferSize != nframes ) { errorText_ = "RtApiCore::callbackEvent(): the JACK buffer size has changed ... cannot process!"; error( RtAudioError::WARNING ); return FAILURE; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; JackHandle *handle = (JackHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > 3 ) { ThreadHandle threadId; stream_.state = STREAM_STOPPING; if ( handle->internalDrain == true ) pthread_create( &threadId, NULL, jackStopStream, info ); else pthread_cond_signal( &handle->condition ); return SUCCESS; } // Invoke user callback first, to get fresh output data. if ( handle->drainCounter == 0 ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( cbReturnValue == 2 ) { stream_.state = STREAM_STOPPING; handle->drainCounter = 2; ThreadHandle id; pthread_create( &id, NULL, jackStopStream, info ); return SUCCESS; } else if ( cbReturnValue == 1 ) { handle->drainCounter = 1; handle->internalDrain = true; } } jack_default_audio_sample_t *jackbuffer; unsigned long bufferBytes = nframes * sizeof( jack_default_audio_sample_t ); if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter > 1 ) { // write zeros to the output stream for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); memset( jackbuffer, 0, bufferBytes ); } } else if ( stream_.doConvertBuffer[0] ) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); memcpy( jackbuffer, &stream_.deviceBuffer[i*bufferBytes], bufferBytes ); } } else { // no buffer conversion for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); memcpy( jackbuffer, &stream_.userBuffer[0][i*bufferBytes], bufferBytes ); } } } // Don't bother draining input if ( handle->drainCounter ) { handle->drainCounter++; goto unlock; } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { if ( stream_.doConvertBuffer[1] ) { for ( unsigned int i=0; iports[1][i], (jack_nframes_t) nframes ); memcpy( &stream_.deviceBuffer[i*bufferBytes], jackbuffer, bufferBytes ); } convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); } else { // no buffer conversion for ( unsigned int i=0; iports[1][i], (jack_nframes_t) nframes ); memcpy( &stream_.userBuffer[1][i*bufferBytes], jackbuffer, bufferBytes ); } } } unlock: RtApi::tickStreamTime(); return SUCCESS; } //******************** End of __UNIX_JACK__ *********************// #endif #if defined(__WINDOWS_ASIO__) // ASIO API on Windows // The ASIO API is designed around a callback scheme, so this // implementation is similar to that used for OS-X CoreAudio and Linux // Jack. The primary constraint with ASIO is that it only allows // access to a single driver at a time. Thus, it is not possible to // have more than one simultaneous RtAudio stream. // // This implementation also requires a number of external ASIO files // and a few global variables. The ASIO callback scheme does not // allow for the passing of user data, so we must create a global // pointer to our callbackInfo structure. // // On unix systems, we make use of a pthread condition variable. // Since there is no equivalent in Windows, I hacked something based // on information found in // http://www.cs.wustl.edu/~schmidt/win32-cv-1.html. #include "asiosys.h" #include "asio.h" #include "iasiothiscallresolver.h" #include "asiodrivers.h" #include static AsioDrivers drivers; static ASIOCallbacks asioCallbacks; static ASIODriverInfo driverInfo; static CallbackInfo *asioCallbackInfo; static bool asioXRun; struct AsioHandle { int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. ASIOBufferInfo *bufferInfos; HANDLE condition; AsioHandle() :drainCounter(0), internalDrain(false), bufferInfos(0) {} }; // Function declarations (definitions at end of section) static const char* getAsioErrorString( ASIOError result ); static void sampleRateChanged( ASIOSampleRate sRate ); static long asioMessages( long selector, long value, void* message, double* opt ); RtApiAsio :: RtApiAsio() { // ASIO cannot run on a multi-threaded appartment. You can call // CoInitialize beforehand, but it must be for appartment threading // (in which case, CoInitilialize will return S_FALSE here). coInitialized_ = false; HRESULT hr = CoInitialize( NULL ); if ( FAILED(hr) ) { errorText_ = "RtApiAsio::ASIO requires a single-threaded appartment. Call CoInitializeEx(0,COINIT_APARTMENTTHREADED)"; error( RtAudioError::WARNING ); } coInitialized_ = true; drivers.removeCurrentDriver(); driverInfo.asioVersion = 2; // See note in DirectSound implementation about GetDesktopWindow(). driverInfo.sysRef = GetForegroundWindow(); } RtApiAsio :: ~RtApiAsio() { if ( stream_.state != STREAM_CLOSED ) closeStream(); if ( coInitialized_ ) CoUninitialize(); } unsigned int RtApiAsio :: getDeviceCount( void ) { return (unsigned int) drivers.asioGetNumDev(); } RtAudio::DeviceInfo RtApiAsio :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; // Get device ID unsigned int nDevices = getDeviceCount(); if ( nDevices == 0 ) { errorText_ = "RtApiAsio::getDeviceInfo: no devices found!"; error( RtAudioError::INVALID_USE ); return info; } if ( device >= nDevices ) { errorText_ = "RtApiAsio::getDeviceInfo: device ID is invalid!"; error( RtAudioError::INVALID_USE ); return info; } // If a stream is already open, we cannot probe other devices. Thus, use the saved results. if ( stream_.state != STREAM_CLOSED ) { if ( device >= devices_.size() ) { errorText_ = "RtApiAsio::getDeviceInfo: device ID was not present before stream was opened."; error( RtAudioError::WARNING ); return info; } return devices_[ device ]; } char driverName[32]; ASIOError result = drivers.asioGetDriverName( (int) device, driverName, 32 ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::getDeviceInfo: unable to get driver name (" << getAsioErrorString( result ) << ")."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } info.name = driverName; if ( !drivers.loadDriver( driverName ) ) { errorStream_ << "RtApiAsio::getDeviceInfo: unable to load driver (" << driverName << ")."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } result = ASIOInit( &driverInfo ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") initializing driver (" << driverName << ")."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // Determine the device channel information. long inputChannels, outputChannels; result = ASIOGetChannels( &inputChannels, &outputChannels ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") getting channel count (" << driverName << ")."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } info.outputChannels = outputChannels; info.inputChannels = inputChannels; if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // Determine the supported sample rates. info.sampleRates.clear(); for ( unsigned int i=0; i 0 ) if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; if ( info.inputChannels > 0 ) if ( getDefaultInputDevice() == device ) info.isDefaultInput = true; info.probed = true; drivers.removeCurrentDriver(); return info; } static void bufferSwitch( long index, ASIOBool /*processNow*/ ) { RtApiAsio *object = (RtApiAsio *) asioCallbackInfo->object; object->callbackEvent( index ); } void RtApiAsio :: saveDeviceInfo( void ) { devices_.clear(); unsigned int nDevices = getDeviceCount(); devices_.resize( nDevices ); for ( unsigned int i=0; isaveDeviceInfo(); if ( !drivers.loadDriver( driverName ) ) { errorStream_ << "RtApiAsio::probeDeviceOpen: unable to load driver (" << driverName << ")."; errorText_ = errorStream_.str(); return FAILURE; } result = ASIOInit( &driverInfo ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::probeDeviceOpen: error (" << getAsioErrorString( result ) << ") initializing driver (" << driverName << ")."; errorText_ = errorStream_.str(); return FAILURE; } } // Check the device channel count. long inputChannels, outputChannels; result = ASIOGetChannels( &inputChannels, &outputChannels ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: error (" << getAsioErrorString( result ) << ") getting channel count (" << driverName << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ( ( mode == OUTPUT && (channels+firstChannel) > (unsigned int) outputChannels) || ( mode == INPUT && (channels+firstChannel) > (unsigned int) inputChannels) ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") does not support requested channel count (" << channels << ") + offset (" << firstChannel << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.nDeviceChannels[mode] = channels; stream_.nUserChannels[mode] = channels; stream_.channelOffset[mode] = firstChannel; // Verify the sample rate is supported. result = ASIOCanSampleRate( (ASIOSampleRate) sampleRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") does not support requested sample rate (" << sampleRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Get the current sample rate ASIOSampleRate currentRate; result = ASIOGetSampleRate( ¤tRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error getting sample rate."; errorText_ = errorStream_.str(); return FAILURE; } // Set the sample rate only if necessary if ( currentRate != sampleRate ) { result = ASIOSetSampleRate( (ASIOSampleRate) sampleRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error setting sample rate (" << sampleRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } } // Determine the driver data type. ASIOChannelInfo channelInfo; channelInfo.channel = 0; if ( mode == OUTPUT ) channelInfo.isInput = false; else channelInfo.isInput = true; result = ASIOGetChannelInfo( &channelInfo ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting data format."; errorText_ = errorStream_.str(); return FAILURE; } // Assuming WINDOWS host is always little-endian. stream_.doByteSwap[mode] = false; stream_.userFormat = format; stream_.deviceFormat[mode] = 0; if ( channelInfo.type == ASIOSTInt16MSB || channelInfo.type == ASIOSTInt16LSB ) { stream_.deviceFormat[mode] = RTAUDIO_SINT16; if ( channelInfo.type == ASIOSTInt16MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTInt32MSB || channelInfo.type == ASIOSTInt32LSB ) { stream_.deviceFormat[mode] = RTAUDIO_SINT32; if ( channelInfo.type == ASIOSTInt32MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTFloat32MSB || channelInfo.type == ASIOSTFloat32LSB ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; if ( channelInfo.type == ASIOSTFloat32MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTFloat64MSB || channelInfo.type == ASIOSTFloat64LSB ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; if ( channelInfo.type == ASIOSTFloat64MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTInt24MSB || channelInfo.type == ASIOSTInt24LSB ) { stream_.deviceFormat[mode] = RTAUDIO_SINT24; if ( channelInfo.type == ASIOSTInt24MSB ) stream_.doByteSwap[mode] = true; } if ( stream_.deviceFormat[mode] == 0 ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") data format not supported by RtAudio."; errorText_ = errorStream_.str(); return FAILURE; } // Set the buffer size. For a duplex stream, this will end up // setting the buffer size based on the input constraints, which // should be ok. long minSize, maxSize, preferSize, granularity; result = ASIOGetBufferSize( &minSize, &maxSize, &preferSize, &granularity ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting buffer size."; errorText_ = errorStream_.str(); return FAILURE; } if ( *bufferSize < (unsigned int) minSize ) *bufferSize = (unsigned int) minSize; else if ( *bufferSize > (unsigned int) maxSize ) *bufferSize = (unsigned int) maxSize; else if ( granularity == -1 ) { // Make sure bufferSize is a power of two. int log2_of_min_size = 0; int log2_of_max_size = 0; for ( unsigned int i = 0; i < sizeof(long) * 8; i++ ) { if ( minSize & ((long)1 << i) ) log2_of_min_size = i; if ( maxSize & ((long)1 << i) ) log2_of_max_size = i; } long min_delta = std::abs( (long)*bufferSize - ((long)1 << log2_of_min_size) ); int min_delta_num = log2_of_min_size; for (int i = log2_of_min_size + 1; i <= log2_of_max_size; i++) { long current_delta = std::abs( (long)*bufferSize - ((long)1 << i) ); if (current_delta < min_delta) { min_delta = current_delta; min_delta_num = i; } } *bufferSize = ( (unsigned int)1 << min_delta_num ); if ( *bufferSize < (unsigned int) minSize ) *bufferSize = (unsigned int) minSize; else if ( *bufferSize > (unsigned int) maxSize ) *bufferSize = (unsigned int) maxSize; } else if ( granularity != 0 ) { // Set to an even multiple of granularity, rounding up. *bufferSize = (*bufferSize + granularity-1) / granularity * granularity; } if ( mode == INPUT && stream_.mode == OUTPUT && stream_.bufferSize != *bufferSize ) { drivers.removeCurrentDriver(); errorText_ = "RtApiAsio::probeDeviceOpen: input/output buffersize discrepancy!"; return FAILURE; } stream_.bufferSize = *bufferSize; stream_.nBuffers = 2; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; // ASIO always uses non-interleaved buffers. stream_.deviceInterleaved[mode] = false; // Allocate, if necessary, our AsioHandle structure for the stream. AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( handle == 0 ) { try { handle = new AsioHandle; } catch ( std::bad_alloc& ) { //if ( handle == NULL ) { drivers.removeCurrentDriver(); errorText_ = "RtApiAsio::probeDeviceOpen: error allocating AsioHandle memory."; return FAILURE; } handle->bufferInfos = 0; // Create a manual-reset event. handle->condition = CreateEvent( NULL, // no security TRUE, // manual-reset FALSE, // non-signaled initially NULL ); // unnamed stream_.apiHandle = (void *) handle; } // Create the ASIO internal buffers. Since RtAudio sets up input // and output separately, we'll have to dispose of previously // created output buffers for a duplex stream. long inputLatency, outputLatency; if ( mode == INPUT && stream_.mode == OUTPUT ) { ASIODisposeBuffers(); if ( handle->bufferInfos ) free( handle->bufferInfos ); } // Allocate, initialize, and save the bufferInfos in our stream callbackInfo structure. bool buffersAllocated = false; unsigned int i, nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; handle->bufferInfos = (ASIOBufferInfo *) malloc( nChannels * sizeof(ASIOBufferInfo) ); if ( handle->bufferInfos == NULL ) { errorStream_ << "RtApiAsio::probeDeviceOpen: error allocating bufferInfo memory for driver (" << driverName << ")."; errorText_ = errorStream_.str(); goto error; } ASIOBufferInfo *infos; infos = handle->bufferInfos; for ( i=0; iisInput = ASIOFalse; infos->channelNum = i + stream_.channelOffset[0]; infos->buffers[0] = infos->buffers[1] = 0; } for ( i=0; iisInput = ASIOTrue; infos->channelNum = i + stream_.channelOffset[1]; infos->buffers[0] = infos->buffers[1] = 0; } // Set up the ASIO callback structure and create the ASIO data buffers. asioCallbacks.bufferSwitch = &bufferSwitch; asioCallbacks.sampleRateDidChange = &sampleRateChanged; asioCallbacks.asioMessage = &asioMessages; asioCallbacks.bufferSwitchTimeInfo = NULL; result = ASIOCreateBuffers( handle->bufferInfos, nChannels, stream_.bufferSize, &asioCallbacks ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") creating buffers."; errorText_ = errorStream_.str(); goto error; } buffersAllocated = true; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiAsio::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiAsio::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.sampleRate = sampleRate; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; asioCallbackInfo = &stream_.callbackInfo; stream_.callbackInfo.object = (void *) this; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up an output stream. stream_.mode = DUPLEX; else stream_.mode = mode; // Determine device latencies result = ASIOGetLatencies( &inputLatency, &outputLatency ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting latency."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING); // warn but don't fail } else { stream_.latency[0] = outputLatency; stream_.latency[1] = inputLatency; } // Setup the buffer conversion information structure. We don't use // buffers to do channel offsets, so we override that parameter // here. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); return SUCCESS; error: if ( buffersAllocated ) ASIODisposeBuffers(); drivers.removeCurrentDriver(); if ( handle ) { CloseHandle( handle->condition ); if ( handle->bufferInfos ) free( handle->bufferInfos ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiAsio :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAsio::closeStream(): no open stream to close!"; error( RtAudioError::WARNING ); return; } if ( stream_.state == STREAM_RUNNING ) { stream_.state = STREAM_STOPPED; ASIOStop(); } ASIODisposeBuffers(); drivers.removeCurrentDriver(); AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( handle ) { CloseHandle( handle->condition ); if ( handle->bufferInfos ) free( handle->bufferInfos ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } bool stopThreadCalled = false; void RtApiAsio :: startStream() { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiAsio::startStream(): the stream is already running!"; error( RtAudioError::WARNING ); return; } AsioHandle *handle = (AsioHandle *) stream_.apiHandle; ASIOError result = ASIOStart(); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::startStream: error (" << getAsioErrorString( result ) << ") starting device."; errorText_ = errorStream_.str(); goto unlock; } handle->drainCounter = 0; handle->internalDrain = false; ResetEvent( handle->condition ); stream_.state = STREAM_RUNNING; asioXRun = false; unlock: stopThreadCalled = false; if ( result == ASE_OK ) return; error( RtAudioError::SYSTEM_ERROR ); } void RtApiAsio :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAsio::stopStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 2; WaitForSingleObject( handle->condition, INFINITE ); // block until signaled } } stream_.state = STREAM_STOPPED; ASIOError result = ASIOStop(); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::stopStream: error (" << getAsioErrorString( result ) << ") stopping device."; errorText_ = errorStream_.str(); } if ( result == ASE_OK ) return; error( RtAudioError::SYSTEM_ERROR ); } void RtApiAsio :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAsio::abortStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } // The following lines were commented-out because some behavior was // noted where the device buffers need to be zeroed to avoid // continuing sound, even when the device buffers are completely // disposed. So now, calling abort is the same as calling stop. // AsioHandle *handle = (AsioHandle *) stream_.apiHandle; // handle->drainCounter = 2; stopStream(); } // This function will be called by a spawned thread when the user // callback function signals that the stream should be stopped or // aborted. It is necessary to handle it this way because the // callbackEvent() function must return before the ASIOStop() // function will return. static unsigned __stdcall asioStopStream( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiAsio *object = (RtApiAsio *) info->object; object->stopStream(); _endthreadex( 0 ); return 0; } bool RtApiAsio :: callbackEvent( long bufferIndex ) { if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) return SUCCESS; if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAsio::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtAudioError::WARNING ); return FAILURE; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; AsioHandle *handle = (AsioHandle *) stream_.apiHandle; // Check if we were draining the stream and signal if finished. if ( handle->drainCounter > 3 ) { stream_.state = STREAM_STOPPING; if ( handle->internalDrain == false ) SetEvent( handle->condition ); else { // spawn a thread to stop the stream unsigned threadId; stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &asioStopStream, &stream_.callbackInfo, 0, &threadId ); } return SUCCESS; } // Invoke user callback to get fresh output data UNLESS we are // draining stream. if ( handle->drainCounter == 0 ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && asioXRun == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; asioXRun = false; } if ( stream_.mode != OUTPUT && asioXRun == true ) { status |= RTAUDIO_INPUT_OVERFLOW; asioXRun = false; } int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( cbReturnValue == 2 ) { stream_.state = STREAM_STOPPING; handle->drainCounter = 2; unsigned threadId; stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &asioStopStream, &stream_.callbackInfo, 0, &threadId ); return SUCCESS; } else if ( cbReturnValue == 1 ) { handle->drainCounter = 1; handle->internalDrain = true; } } unsigned int nChannels, bufferBytes, i, j; nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { bufferBytes = stream_.bufferSize * formatBytes( stream_.deviceFormat[0] ); if ( handle->drainCounter > 1 ) { // write zeros to the output stream for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) memset( handle->bufferInfos[i].buffers[bufferIndex], 0, bufferBytes ); } } else if ( stream_.doConvertBuffer[0] ) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); if ( stream_.doByteSwap[0] ) byteSwapBuffer( stream_.deviceBuffer, stream_.bufferSize * stream_.nDeviceChannels[0], stream_.deviceFormat[0] ); for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) memcpy( handle->bufferInfos[i].buffers[bufferIndex], &stream_.deviceBuffer[j++*bufferBytes], bufferBytes ); } } else { if ( stream_.doByteSwap[0] ) byteSwapBuffer( stream_.userBuffer[0], stream_.bufferSize * stream_.nUserChannels[0], stream_.userFormat ); for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) memcpy( handle->bufferInfos[i].buffers[bufferIndex], &stream_.userBuffer[0][bufferBytes*j++], bufferBytes ); } } } // Don't bother draining input if ( handle->drainCounter ) { handle->drainCounter++; goto unlock; } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { bufferBytes = stream_.bufferSize * formatBytes(stream_.deviceFormat[1]); if (stream_.doConvertBuffer[1]) { // Always interleave ASIO input data. for ( i=0, j=0; ibufferInfos[i].isInput == ASIOTrue ) memcpy( &stream_.deviceBuffer[j++*bufferBytes], handle->bufferInfos[i].buffers[bufferIndex], bufferBytes ); } if ( stream_.doByteSwap[1] ) byteSwapBuffer( stream_.deviceBuffer, stream_.bufferSize * stream_.nDeviceChannels[1], stream_.deviceFormat[1] ); convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); } else { for ( i=0, j=0; ibufferInfos[i].isInput == ASIOTrue ) { memcpy( &stream_.userBuffer[1][bufferBytes*j++], handle->bufferInfos[i].buffers[bufferIndex], bufferBytes ); } } if ( stream_.doByteSwap[1] ) byteSwapBuffer( stream_.userBuffer[1], stream_.bufferSize * stream_.nUserChannels[1], stream_.userFormat ); } } unlock: // The following call was suggested by Malte Clasen. While the API // documentation indicates it should not be required, some device // drivers apparently do not function correctly without it. ASIOOutputReady(); RtApi::tickStreamTime(); return SUCCESS; } static void sampleRateChanged( ASIOSampleRate sRate ) { // The ASIO documentation says that this usually only happens during // external sync. Audio processing is not stopped by the driver, // actual sample rate might not have even changed, maybe only the // sample rate status of an AES/EBU or S/PDIF digital input at the // audio device. RtApi *object = (RtApi *) asioCallbackInfo->object; try { object->stopStream(); } catch ( RtAudioError &exception ) { std::cerr << "\nRtApiAsio: sampleRateChanged() error (" << exception.getMessage() << ")!\n" << std::endl; return; } std::cerr << "\nRtApiAsio: driver reports sample rate changed to " << sRate << " ... stream stopped!!!\n" << std::endl; } static long asioMessages( long selector, long value, void* /*message*/, double* /*opt*/ ) { long ret = 0; switch( selector ) { case kAsioSelectorSupported: if ( value == kAsioResetRequest || value == kAsioEngineVersion || value == kAsioResyncRequest || value == kAsioLatenciesChanged // The following three were added for ASIO 2.0, you don't // necessarily have to support them. || value == kAsioSupportsTimeInfo || value == kAsioSupportsTimeCode || value == kAsioSupportsInputMonitor) ret = 1L; break; case kAsioResetRequest: // Defer the task and perform the reset of the driver during the // next "safe" situation. You cannot reset the driver right now, // as this code is called from the driver. Reset the driver is // done by completely destruct is. I.e. ASIOStop(), // ASIODisposeBuffers(), Destruction Afterwards you initialize the // driver again. std::cerr << "\nRtApiAsio: driver reset requested!!!" << std::endl; ret = 1L; break; case kAsioResyncRequest: // This informs the application that the driver encountered some // non-fatal data loss. It is used for synchronization purposes // of different media. Added mainly to work around the Win16Mutex // problems in Windows 95/98 with the Windows Multimedia system, // which could lose data because the Mutex was held too long by // another thread. However a driver can issue it in other // situations, too. // std::cerr << "\nRtApiAsio: driver resync requested!!!" << std::endl; asioXRun = true; ret = 1L; break; case kAsioLatenciesChanged: // This will inform the host application that the drivers were // latencies changed. Beware, it this does not mean that the // buffer sizes have changed! You might need to update internal // delay data. std::cerr << "\nRtApiAsio: driver latency may have changed!!!" << std::endl; ret = 1L; break; case kAsioEngineVersion: // Return the supported ASIO version of the host application. If // a host application does not implement this selector, ASIO 1.0 // is assumed by the driver. ret = 2L; break; case kAsioSupportsTimeInfo: // Informs the driver whether the // asioCallbacks.bufferSwitchTimeInfo() callback is supported. // For compatibility with ASIO 1.0 drivers the host application // should always support the "old" bufferSwitch method, too. ret = 0; break; case kAsioSupportsTimeCode: // Informs the driver whether application is interested in time // code info. If an application does not need to know about time // code, the driver has less work to do. ret = 0; break; } return ret; } static const char* getAsioErrorString( ASIOError result ) { struct Messages { ASIOError value; const char*message; }; static const Messages m[] = { { ASE_NotPresent, "Hardware input or output is not present or available." }, { ASE_HWMalfunction, "Hardware is malfunctioning." }, { ASE_InvalidParameter, "Invalid input parameter." }, { ASE_InvalidMode, "Invalid mode." }, { ASE_SPNotAdvancing, "Sample position not advancing." }, { ASE_NoClock, "Sample clock or rate cannot be determined or is not present." }, { ASE_NoMemory, "Not enough memory to complete the request." } }; for ( unsigned int i = 0; i < sizeof(m)/sizeof(m[0]); ++i ) if ( m[i].value == result ) return m[i].message; return "Unknown error."; } //******************** End of __WINDOWS_ASIO__ *********************// #endif #if defined(__WINDOWS_WASAPI__) // Windows WASAPI API // Authored by Marcus Tomlinson , April 2014 // - Introduces support for the Windows WASAPI API // - Aims to deliver bit streams to and from hardware at the lowest possible latency, via the absolute minimum buffer sizes required // - Provides flexible stream configuration to an otherwise strict and inflexible WASAPI interface // - Includes automatic internal conversion of sample rate and buffer size between hardware and the user #ifndef INITGUID #define INITGUID #endif #include #include #include #include //============================================================================= #define SAFE_RELEASE( objectPtr )\ if ( objectPtr )\ {\ objectPtr->Release();\ objectPtr = NULL;\ } typedef HANDLE ( __stdcall *TAvSetMmThreadCharacteristicsPtr )( LPCWSTR TaskName, LPDWORD TaskIndex ); //----------------------------------------------------------------------------- // WASAPI dictates stream sample rate, format, channel count, and in some cases, buffer size. // Therefore we must perform all necessary conversions to user buffers in order to satisfy these // requirements. WasapiBuffer ring buffers are used between HwIn->UserIn and UserOut->HwOut to // provide intermediate storage for read / write synchronization. class WasapiBuffer { public: WasapiBuffer() : buffer_( NULL ), bufferSize_( 0 ), inIndex_( 0 ), outIndex_( 0 ) {} ~WasapiBuffer() { delete buffer_; } // sets the length of the internal ring buffer void setBufferSize( unsigned int bufferSize, unsigned int formatBytes ) { delete buffer_; buffer_ = ( char* ) calloc( bufferSize, formatBytes ); bufferSize_ = bufferSize; inIndex_ = 0; outIndex_ = 0; } // attempt to push a buffer into the ring buffer at the current "in" index bool pushBuffer( char* buffer, unsigned int bufferSize, RtAudioFormat format ) { if ( !buffer || // incoming buffer is NULL bufferSize == 0 || // incoming buffer has no data bufferSize > bufferSize_ ) // incoming buffer too large { return false; } unsigned int relOutIndex = outIndex_; unsigned int inIndexEnd = inIndex_ + bufferSize; if ( relOutIndex < inIndex_ && inIndexEnd >= bufferSize_ ) { relOutIndex += bufferSize_; } // "in" index can end on the "out" index but cannot begin at it if ( inIndex_ <= relOutIndex && inIndexEnd > relOutIndex ) { return false; // not enough space between "in" index and "out" index } // copy buffer from external to internal int fromZeroSize = inIndex_ + bufferSize - bufferSize_; fromZeroSize = fromZeroSize < 0 ? 0 : fromZeroSize; int fromInSize = bufferSize - fromZeroSize; switch( format ) { case RTAUDIO_SINT8: memcpy( &( ( char* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( char ) ); memcpy( buffer_, &( ( char* ) buffer )[fromInSize], fromZeroSize * sizeof( char ) ); break; case RTAUDIO_SINT16: memcpy( &( ( short* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( short ) ); memcpy( buffer_, &( ( short* ) buffer )[fromInSize], fromZeroSize * sizeof( short ) ); break; case RTAUDIO_SINT24: memcpy( &( ( S24* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( S24 ) ); memcpy( buffer_, &( ( S24* ) buffer )[fromInSize], fromZeroSize * sizeof( S24 ) ); break; case RTAUDIO_SINT32: memcpy( &( ( int* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( int ) ); memcpy( buffer_, &( ( int* ) buffer )[fromInSize], fromZeroSize * sizeof( int ) ); break; case RTAUDIO_FLOAT32: memcpy( &( ( float* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( float ) ); memcpy( buffer_, &( ( float* ) buffer )[fromInSize], fromZeroSize * sizeof( float ) ); break; case RTAUDIO_FLOAT64: memcpy( &( ( double* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( double ) ); memcpy( buffer_, &( ( double* ) buffer )[fromInSize], fromZeroSize * sizeof( double ) ); break; } // update "in" index inIndex_ += bufferSize; inIndex_ %= bufferSize_; return true; } // attempt to pull a buffer from the ring buffer from the current "out" index bool pullBuffer( char* buffer, unsigned int bufferSize, RtAudioFormat format ) { if ( !buffer || // incoming buffer is NULL bufferSize == 0 || // incoming buffer has no data bufferSize > bufferSize_ ) // incoming buffer too large { return false; } unsigned int relInIndex = inIndex_; unsigned int outIndexEnd = outIndex_ + bufferSize; if ( relInIndex < outIndex_ && outIndexEnd >= bufferSize_ ) { relInIndex += bufferSize_; } // "out" index can begin at and end on the "in" index if ( outIndex_ < relInIndex && outIndexEnd > relInIndex ) { return false; // not enough space between "out" index and "in" index } // copy buffer from internal to external int fromZeroSize = outIndex_ + bufferSize - bufferSize_; fromZeroSize = fromZeroSize < 0 ? 0 : fromZeroSize; int fromOutSize = bufferSize - fromZeroSize; switch( format ) { case RTAUDIO_SINT8: memcpy( buffer, &( ( char* ) buffer_ )[outIndex_], fromOutSize * sizeof( char ) ); memcpy( &( ( char* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( char ) ); break; case RTAUDIO_SINT16: memcpy( buffer, &( ( short* ) buffer_ )[outIndex_], fromOutSize * sizeof( short ) ); memcpy( &( ( short* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( short ) ); break; case RTAUDIO_SINT24: memcpy( buffer, &( ( S24* ) buffer_ )[outIndex_], fromOutSize * sizeof( S24 ) ); memcpy( &( ( S24* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( S24 ) ); break; case RTAUDIO_SINT32: memcpy( buffer, &( ( int* ) buffer_ )[outIndex_], fromOutSize * sizeof( int ) ); memcpy( &( ( int* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( int ) ); break; case RTAUDIO_FLOAT32: memcpy( buffer, &( ( float* ) buffer_ )[outIndex_], fromOutSize * sizeof( float ) ); memcpy( &( ( float* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( float ) ); break; case RTAUDIO_FLOAT64: memcpy( buffer, &( ( double* ) buffer_ )[outIndex_], fromOutSize * sizeof( double ) ); memcpy( &( ( double* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( double ) ); break; } // update "out" index outIndex_ += bufferSize; outIndex_ %= bufferSize_; return true; } private: char* buffer_; unsigned int bufferSize_; unsigned int inIndex_; unsigned int outIndex_; }; //----------------------------------------------------------------------------- // In order to satisfy WASAPI's buffer requirements, we need a means of converting sample rate // between HW and the user. The convertBufferWasapi function is used to perform this conversion // between HwIn->UserIn and UserOut->HwOut during the stream callback loop. // This sample rate converter favors speed over quality, and works best with conversions between // one rate and its multiple. void convertBufferWasapi( char* outBuffer, const char* inBuffer, const unsigned int& channelCount, const unsigned int& inSampleRate, const unsigned int& outSampleRate, const unsigned int& inSampleCount, unsigned int& outSampleCount, const RtAudioFormat& format ) { // calculate the new outSampleCount and relative sampleStep float sampleRatio = ( float ) outSampleRate / inSampleRate; float sampleStep = 1.0f / sampleRatio; float inSampleFraction = 0.0f; outSampleCount = ( unsigned int ) ( inSampleCount * sampleRatio ); // frame-by-frame, copy each relative input sample into it's corresponding output sample for ( unsigned int outSample = 0; outSample < outSampleCount; outSample++ ) { unsigned int inSample = ( unsigned int ) inSampleFraction; switch ( format ) { case RTAUDIO_SINT8: memcpy( &( ( char* ) outBuffer )[ outSample * channelCount ], &( ( char* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( char ) ); break; case RTAUDIO_SINT16: memcpy( &( ( short* ) outBuffer )[ outSample * channelCount ], &( ( short* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( short ) ); break; case RTAUDIO_SINT24: memcpy( &( ( S24* ) outBuffer )[ outSample * channelCount ], &( ( S24* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( S24 ) ); break; case RTAUDIO_SINT32: memcpy( &( ( int* ) outBuffer )[ outSample * channelCount ], &( ( int* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( int ) ); break; case RTAUDIO_FLOAT32: memcpy( &( ( float* ) outBuffer )[ outSample * channelCount ], &( ( float* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( float ) ); break; case RTAUDIO_FLOAT64: memcpy( &( ( double* ) outBuffer )[ outSample * channelCount ], &( ( double* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( double ) ); break; } // jump to next in sample inSampleFraction += sampleStep; } } //----------------------------------------------------------------------------- // A structure to hold various information related to the WASAPI implementation. struct WasapiHandle { IAudioClient* captureAudioClient; IAudioClient* renderAudioClient; IAudioCaptureClient* captureClient; IAudioRenderClient* renderClient; HANDLE captureEvent; HANDLE renderEvent; WasapiHandle() : captureAudioClient( NULL ), renderAudioClient( NULL ), captureClient( NULL ), renderClient( NULL ), captureEvent( NULL ), renderEvent( NULL ) {} }; //============================================================================= RtApiWasapi::RtApiWasapi() : coInitialized_( false ), deviceEnumerator_( NULL ) { // WASAPI can run either apartment or multi-threaded HRESULT hr = CoInitialize( NULL ); if ( !FAILED( hr ) ) coInitialized_ = true; // Instantiate device enumerator hr = CoCreateInstance( __uuidof( MMDeviceEnumerator ), NULL, CLSCTX_ALL, __uuidof( IMMDeviceEnumerator ), ( void** ) &deviceEnumerator_ ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::RtApiWasapi: Unable to instantiate device enumerator"; error( RtAudioError::DRIVER_ERROR ); } } //----------------------------------------------------------------------------- RtApiWasapi::~RtApiWasapi() { if ( stream_.state != STREAM_CLOSED ) closeStream(); SAFE_RELEASE( deviceEnumerator_ ); // If this object previously called CoInitialize() if ( coInitialized_ ) CoUninitialize(); } //============================================================================= unsigned int RtApiWasapi::getDeviceCount( void ) { unsigned int captureDeviceCount = 0; unsigned int renderDeviceCount = 0; IMMDeviceCollection* captureDevices = NULL; IMMDeviceCollection* renderDevices = NULL; // Count capture devices errorText_.clear(); HRESULT hr = deviceEnumerator_->EnumAudioEndpoints( eCapture, DEVICE_STATE_ACTIVE, &captureDevices ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceCount: Unable to retrieve capture device collection."; goto Exit; } hr = captureDevices->GetCount( &captureDeviceCount ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceCount: Unable to retrieve capture device count."; goto Exit; } // Count render devices hr = deviceEnumerator_->EnumAudioEndpoints( eRender, DEVICE_STATE_ACTIVE, &renderDevices ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceCount: Unable to retrieve render device collection."; goto Exit; } hr = renderDevices->GetCount( &renderDeviceCount ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceCount: Unable to retrieve render device count."; goto Exit; } Exit: // release all references SAFE_RELEASE( captureDevices ); SAFE_RELEASE( renderDevices ); if ( errorText_.empty() ) return captureDeviceCount + renderDeviceCount; error( RtAudioError::DRIVER_ERROR ); return 0; } //----------------------------------------------------------------------------- RtAudio::DeviceInfo RtApiWasapi::getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; unsigned int captureDeviceCount = 0; unsigned int renderDeviceCount = 0; std::wstring deviceName; std::string defaultDeviceName; bool isCaptureDevice = false; PROPVARIANT deviceNameProp; PROPVARIANT defaultDeviceNameProp; IMMDeviceCollection* captureDevices = NULL; IMMDeviceCollection* renderDevices = NULL; IMMDevice* devicePtr = NULL; IMMDevice* defaultDevicePtr = NULL; IAudioClient* audioClient = NULL; IPropertyStore* devicePropStore = NULL; IPropertyStore* defaultDevicePropStore = NULL; WAVEFORMATEX* deviceFormat = NULL; WAVEFORMATEX* closestMatchFormat = NULL; // probed info.probed = false; // Count capture devices errorText_.clear(); RtAudioError::Type errorType = RtAudioError::DRIVER_ERROR; HRESULT hr = deviceEnumerator_->EnumAudioEndpoints( eCapture, DEVICE_STATE_ACTIVE, &captureDevices ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve capture device collection."; goto Exit; } hr = captureDevices->GetCount( &captureDeviceCount ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve capture device count."; goto Exit; } // Count render devices hr = deviceEnumerator_->EnumAudioEndpoints( eRender, DEVICE_STATE_ACTIVE, &renderDevices ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve render device collection."; goto Exit; } hr = renderDevices->GetCount( &renderDeviceCount ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve render device count."; goto Exit; } // validate device index if ( device >= captureDeviceCount + renderDeviceCount ) { errorText_ = "RtApiWasapi::getDeviceInfo: Invalid device index."; errorType = RtAudioError::INVALID_USE; goto Exit; } // determine whether index falls within capture or render devices if ( device >= renderDeviceCount ) { hr = captureDevices->Item( device - renderDeviceCount, &devicePtr ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve capture device handle."; goto Exit; } isCaptureDevice = true; } else { hr = renderDevices->Item( device, &devicePtr ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve render device handle."; goto Exit; } isCaptureDevice = false; } // get default device name if ( isCaptureDevice ) { hr = deviceEnumerator_->GetDefaultAudioEndpoint( eCapture, eConsole, &defaultDevicePtr ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve default capture device handle."; goto Exit; } } else { hr = deviceEnumerator_->GetDefaultAudioEndpoint( eRender, eConsole, &defaultDevicePtr ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve default render device handle."; goto Exit; } } hr = defaultDevicePtr->OpenPropertyStore( STGM_READ, &defaultDevicePropStore ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to open default device property store."; goto Exit; } PropVariantInit( &defaultDeviceNameProp ); hr = defaultDevicePropStore->GetValue( PKEY_Device_FriendlyName, &defaultDeviceNameProp ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve default device property: PKEY_Device_FriendlyName."; goto Exit; } deviceName = defaultDeviceNameProp.pwszVal; defaultDeviceName = std::string( deviceName.begin(), deviceName.end() ); // name hr = devicePtr->OpenPropertyStore( STGM_READ, &devicePropStore ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to open device property store."; goto Exit; } PropVariantInit( &deviceNameProp ); hr = devicePropStore->GetValue( PKEY_Device_FriendlyName, &deviceNameProp ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve device property: PKEY_Device_FriendlyName."; goto Exit; } deviceName = deviceNameProp.pwszVal; info.name = std::string( deviceName.begin(), deviceName.end() ); // is default if ( isCaptureDevice ) { info.isDefaultInput = info.name == defaultDeviceName; info.isDefaultOutput = false; } else { info.isDefaultInput = false; info.isDefaultOutput = info.name == defaultDeviceName; } // channel count hr = devicePtr->Activate( __uuidof( IAudioClient ), CLSCTX_ALL, NULL, ( void** ) &audioClient ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve device audio client."; goto Exit; } hr = audioClient->GetMixFormat( &deviceFormat ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve device mix format."; goto Exit; } if ( isCaptureDevice ) { info.inputChannels = deviceFormat->nChannels; info.outputChannels = 0; info.duplexChannels = 0; } else { info.inputChannels = 0; info.outputChannels = deviceFormat->nChannels; info.duplexChannels = 0; } // sample rates info.sampleRates.clear(); // allow support for all sample rates as we have a built-in sample rate converter for ( unsigned int i = 0; i < MAX_SAMPLE_RATES; i++ ) { info.sampleRates.push_back( SAMPLE_RATES[i] ); } // native format info.nativeFormats = 0; if ( deviceFormat->wFormatTag == WAVE_FORMAT_IEEE_FLOAT || ( deviceFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE && ( ( WAVEFORMATEXTENSIBLE* ) deviceFormat )->SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT ) ) { if ( deviceFormat->wBitsPerSample == 32 ) { info.nativeFormats |= RTAUDIO_FLOAT32; } else if ( deviceFormat->wBitsPerSample == 64 ) { info.nativeFormats |= RTAUDIO_FLOAT64; } } else if ( deviceFormat->wFormatTag == WAVE_FORMAT_PCM || ( deviceFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE && ( ( WAVEFORMATEXTENSIBLE* ) deviceFormat )->SubFormat == KSDATAFORMAT_SUBTYPE_PCM ) ) { if ( deviceFormat->wBitsPerSample == 8 ) { info.nativeFormats |= RTAUDIO_SINT8; } else if ( deviceFormat->wBitsPerSample == 16 ) { info.nativeFormats |= RTAUDIO_SINT16; } else if ( deviceFormat->wBitsPerSample == 24 ) { info.nativeFormats |= RTAUDIO_SINT24; } else if ( deviceFormat->wBitsPerSample == 32 ) { info.nativeFormats |= RTAUDIO_SINT32; } } // probed info.probed = true; Exit: // release all references PropVariantClear( &deviceNameProp ); PropVariantClear( &defaultDeviceNameProp ); SAFE_RELEASE( captureDevices ); SAFE_RELEASE( renderDevices ); SAFE_RELEASE( devicePtr ); SAFE_RELEASE( defaultDevicePtr ); SAFE_RELEASE( audioClient ); SAFE_RELEASE( devicePropStore ); SAFE_RELEASE( defaultDevicePropStore ); CoTaskMemFree( deviceFormat ); CoTaskMemFree( closestMatchFormat ); if ( !errorText_.empty() ) error( errorType ); return info; } //----------------------------------------------------------------------------- unsigned int RtApiWasapi::getDefaultOutputDevice( void ) { for ( unsigned int i = 0; i < getDeviceCount(); i++ ) { if ( getDeviceInfo( i ).isDefaultOutput ) { return i; } } return 0; } //----------------------------------------------------------------------------- unsigned int RtApiWasapi::getDefaultInputDevice( void ) { for ( unsigned int i = 0; i < getDeviceCount(); i++ ) { if ( getDeviceInfo( i ).isDefaultInput ) { return i; } } return 0; } //----------------------------------------------------------------------------- void RtApiWasapi::closeStream( void ) { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiWasapi::closeStream: No open stream to close."; error( RtAudioError::WARNING ); return; } if ( stream_.state != STREAM_STOPPED ) stopStream(); // clean up stream memory SAFE_RELEASE( ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient ) SAFE_RELEASE( ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient ) SAFE_RELEASE( ( ( WasapiHandle* ) stream_.apiHandle )->captureClient ) SAFE_RELEASE( ( ( WasapiHandle* ) stream_.apiHandle )->renderClient ) if ( ( ( WasapiHandle* ) stream_.apiHandle )->captureEvent ) CloseHandle( ( ( WasapiHandle* ) stream_.apiHandle )->captureEvent ); if ( ( ( WasapiHandle* ) stream_.apiHandle )->renderEvent ) CloseHandle( ( ( WasapiHandle* ) stream_.apiHandle )->renderEvent ); delete ( WasapiHandle* ) stream_.apiHandle; stream_.apiHandle = NULL; for ( int i = 0; i < 2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } // update stream state stream_.state = STREAM_CLOSED; } //----------------------------------------------------------------------------- void RtApiWasapi::startStream( void ) { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiWasapi::startStream: The stream is already running."; error( RtAudioError::WARNING ); return; } // update stream state stream_.state = STREAM_RUNNING; // create WASAPI stream thread stream_.callbackInfo.thread = ( ThreadHandle ) CreateThread( NULL, 0, runWasapiThread, this, CREATE_SUSPENDED, NULL ); if ( !stream_.callbackInfo.thread ) { errorText_ = "RtApiWasapi::startStream: Unable to instantiate callback thread."; error( RtAudioError::THREAD_ERROR ); } else { SetThreadPriority( ( void* ) stream_.callbackInfo.thread, stream_.callbackInfo.priority ); ResumeThread( ( void* ) stream_.callbackInfo.thread ); } } //----------------------------------------------------------------------------- void RtApiWasapi::stopStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiWasapi::stopStream: The stream is already stopped."; error( RtAudioError::WARNING ); return; } // inform stream thread by setting stream state to STREAM_STOPPING stream_.state = STREAM_STOPPING; // wait until stream thread is stopped while( stream_.state != STREAM_STOPPED ) { Sleep( 1 ); } // Wait for the last buffer to play before stopping. Sleep( 1000 * stream_.bufferSize / stream_.sampleRate ); // stop capture client if applicable if ( ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient ) { HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient->Stop(); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::stopStream: Unable to stop capture stream."; error( RtAudioError::DRIVER_ERROR ); return; } } // stop render client if applicable if ( ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient ) { HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient->Stop(); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::stopStream: Unable to stop render stream."; error( RtAudioError::DRIVER_ERROR ); return; } } // close thread handle if ( stream_.callbackInfo.thread && !CloseHandle( ( void* ) stream_.callbackInfo.thread ) ) { errorText_ = "RtApiWasapi::stopStream: Unable to close callback thread."; error( RtAudioError::THREAD_ERROR ); return; } stream_.callbackInfo.thread = (ThreadHandle) NULL; } //----------------------------------------------------------------------------- void RtApiWasapi::abortStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiWasapi::abortStream: The stream is already stopped."; error( RtAudioError::WARNING ); return; } // inform stream thread by setting stream state to STREAM_STOPPING stream_.state = STREAM_STOPPING; // wait until stream thread is stopped while ( stream_.state != STREAM_STOPPED ) { Sleep( 1 ); } // stop capture client if applicable if ( ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient ) { HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient->Stop(); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::abortStream: Unable to stop capture stream."; error( RtAudioError::DRIVER_ERROR ); return; } } // stop render client if applicable if ( ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient ) { HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient->Stop(); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::abortStream: Unable to stop render stream."; error( RtAudioError::DRIVER_ERROR ); return; } } // close thread handle if ( stream_.callbackInfo.thread && !CloseHandle( ( void* ) stream_.callbackInfo.thread ) ) { errorText_ = "RtApiWasapi::abortStream: Unable to close callback thread."; error( RtAudioError::THREAD_ERROR ); return; } stream_.callbackInfo.thread = (ThreadHandle) NULL; } //----------------------------------------------------------------------------- bool RtApiWasapi::probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int* bufferSize, RtAudio::StreamOptions* options ) { bool methodResult = FAILURE; unsigned int captureDeviceCount = 0; unsigned int renderDeviceCount = 0; IMMDeviceCollection* captureDevices = NULL; IMMDeviceCollection* renderDevices = NULL; IMMDevice* devicePtr = NULL; WAVEFORMATEX* deviceFormat = NULL; unsigned int bufferBytes; stream_.state = STREAM_STOPPED; // create API Handle if not already created if ( !stream_.apiHandle ) stream_.apiHandle = ( void* ) new WasapiHandle(); // Count capture devices errorText_.clear(); RtAudioError::Type errorType = RtAudioError::DRIVER_ERROR; HRESULT hr = deviceEnumerator_->EnumAudioEndpoints( eCapture, DEVICE_STATE_ACTIVE, &captureDevices ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve capture device collection."; goto Exit; } hr = captureDevices->GetCount( &captureDeviceCount ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve capture device count."; goto Exit; } // Count render devices hr = deviceEnumerator_->EnumAudioEndpoints( eRender, DEVICE_STATE_ACTIVE, &renderDevices ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve render device collection."; goto Exit; } hr = renderDevices->GetCount( &renderDeviceCount ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve render device count."; goto Exit; } // validate device index if ( device >= captureDeviceCount + renderDeviceCount ) { errorType = RtAudioError::INVALID_USE; errorText_ = "RtApiWasapi::probeDeviceOpen: Invalid device index."; goto Exit; } // determine whether index falls within capture or render devices if ( device >= renderDeviceCount ) { if ( mode != INPUT ) { errorType = RtAudioError::INVALID_USE; errorText_ = "RtApiWasapi::probeDeviceOpen: Capture device selected as output device."; goto Exit; } // retrieve captureAudioClient from devicePtr IAudioClient*& captureAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient; hr = captureDevices->Item( device - renderDeviceCount, &devicePtr ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve capture device handle."; goto Exit; } hr = devicePtr->Activate( __uuidof( IAudioClient ), CLSCTX_ALL, NULL, ( void** ) &captureAudioClient ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve device audio client."; goto Exit; } hr = captureAudioClient->GetMixFormat( &deviceFormat ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve device mix format."; goto Exit; } stream_.nDeviceChannels[mode] = deviceFormat->nChannels; captureAudioClient->GetStreamLatency( ( long long* ) &stream_.latency[mode] ); } else { if ( mode != OUTPUT ) { errorType = RtAudioError::INVALID_USE; errorText_ = "RtApiWasapi::probeDeviceOpen: Render device selected as input device."; goto Exit; } // retrieve renderAudioClient from devicePtr IAudioClient*& renderAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient; hr = renderDevices->Item( device, &devicePtr ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve render device handle."; goto Exit; } hr = devicePtr->Activate( __uuidof( IAudioClient ), CLSCTX_ALL, NULL, ( void** ) &renderAudioClient ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve device audio client."; goto Exit; } hr = renderAudioClient->GetMixFormat( &deviceFormat ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve device mix format."; goto Exit; } stream_.nDeviceChannels[mode] = deviceFormat->nChannels; renderAudioClient->GetStreamLatency( ( long long* ) &stream_.latency[mode] ); } // fill stream data if ( ( stream_.mode == OUTPUT && mode == INPUT ) || ( stream_.mode == INPUT && mode == OUTPUT ) ) { stream_.mode = DUPLEX; } else { stream_.mode = mode; } stream_.device[mode] = device; stream_.doByteSwap[mode] = false; stream_.sampleRate = sampleRate; stream_.bufferSize = *bufferSize; stream_.nBuffers = 1; stream_.nUserChannels[mode] = channels; stream_.channelOffset[mode] = firstChannel; stream_.userFormat = format; stream_.deviceFormat[mode] = getDeviceInfo( device ).nativeFormats; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; stream_.deviceInterleaved[mode] = true; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] || stream_.nUserChannels != stream_.nDeviceChannels ) stream_.doConvertBuffer[mode] = true; else if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); // Allocate necessary internal buffers bufferBytes = stream_.nUserChannels[mode] * stream_.bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = ( char* ) calloc( bufferBytes, 1 ); if ( !stream_.userBuffer[mode] ) { errorType = RtAudioError::MEMORY_ERROR; errorText_ = "RtApiWasapi::probeDeviceOpen: Error allocating user buffer memory."; goto Exit; } if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) stream_.callbackInfo.priority = 15; else stream_.callbackInfo.priority = 0; ///! TODO: RTAUDIO_MINIMIZE_LATENCY // Provide stream buffers directly to callback ///! TODO: RTAUDIO_HOG_DEVICE // Exclusive mode methodResult = SUCCESS; Exit: //clean up SAFE_RELEASE( captureDevices ); SAFE_RELEASE( renderDevices ); SAFE_RELEASE( devicePtr ); CoTaskMemFree( deviceFormat ); // if method failed, close the stream if ( methodResult == FAILURE ) closeStream(); if ( !errorText_.empty() ) error( errorType ); return methodResult; } //============================================================================= DWORD WINAPI RtApiWasapi::runWasapiThread( void* wasapiPtr ) { if ( wasapiPtr ) ( ( RtApiWasapi* ) wasapiPtr )->wasapiThread(); return 0; } DWORD WINAPI RtApiWasapi::stopWasapiThread( void* wasapiPtr ) { if ( wasapiPtr ) ( ( RtApiWasapi* ) wasapiPtr )->stopStream(); return 0; } DWORD WINAPI RtApiWasapi::abortWasapiThread( void* wasapiPtr ) { if ( wasapiPtr ) ( ( RtApiWasapi* ) wasapiPtr )->abortStream(); return 0; } //----------------------------------------------------------------------------- void RtApiWasapi::wasapiThread() { // as this is a new thread, we must CoInitialize it CoInitialize( NULL ); HRESULT hr; IAudioClient* captureAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient; IAudioClient* renderAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient; IAudioCaptureClient* captureClient = ( ( WasapiHandle* ) stream_.apiHandle )->captureClient; IAudioRenderClient* renderClient = ( ( WasapiHandle* ) stream_.apiHandle )->renderClient; HANDLE captureEvent = ( ( WasapiHandle* ) stream_.apiHandle )->captureEvent; HANDLE renderEvent = ( ( WasapiHandle* ) stream_.apiHandle )->renderEvent; WAVEFORMATEX* captureFormat = NULL; WAVEFORMATEX* renderFormat = NULL; float captureSrRatio = 0.0f; float renderSrRatio = 0.0f; WasapiBuffer captureBuffer; WasapiBuffer renderBuffer; // declare local stream variables RtAudioCallback callback = ( RtAudioCallback ) stream_.callbackInfo.callback; BYTE* streamBuffer = NULL; unsigned long captureFlags = 0; unsigned int bufferFrameCount = 0; unsigned int numFramesPadding = 0; unsigned int convBufferSize = 0; bool callbackPushed = false; bool callbackPulled = false; bool callbackStopped = false; int callbackResult = 0; // convBuffer is used to store converted buffers between WASAPI and the user char* convBuffer = NULL; unsigned int convBuffSize = 0; unsigned int deviceBuffSize = 0; errorText_.clear(); RtAudioError::Type errorType = RtAudioError::DRIVER_ERROR; // Attempt to assign "Pro Audio" characteristic to thread HMODULE AvrtDll = LoadLibrary( (LPCTSTR) "AVRT.dll" ); if ( AvrtDll ) { DWORD taskIndex = 0; TAvSetMmThreadCharacteristicsPtr AvSetMmThreadCharacteristicsPtr = ( TAvSetMmThreadCharacteristicsPtr ) GetProcAddress( AvrtDll, "AvSetMmThreadCharacteristicsW" ); AvSetMmThreadCharacteristicsPtr( L"Pro Audio", &taskIndex ); FreeLibrary( AvrtDll ); } // start capture stream if applicable if ( captureAudioClient ) { hr = captureAudioClient->GetMixFormat( &captureFormat ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve device mix format."; goto Exit; } captureSrRatio = ( ( float ) captureFormat->nSamplesPerSec / stream_.sampleRate ); // initialize capture stream according to desire buffer size float desiredBufferSize = stream_.bufferSize * captureSrRatio; REFERENCE_TIME desiredBufferPeriod = ( REFERENCE_TIME ) ( ( float ) desiredBufferSize * 10000000 / captureFormat->nSamplesPerSec ); if ( !captureClient ) { hr = captureAudioClient->Initialize( AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, desiredBufferPeriod, desiredBufferPeriod, captureFormat, NULL ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to initialize capture audio client."; goto Exit; } hr = captureAudioClient->GetService( __uuidof( IAudioCaptureClient ), ( void** ) &captureClient ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve capture client handle."; goto Exit; } // configure captureEvent to trigger on every available capture buffer captureEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); if ( !captureEvent ) { errorType = RtAudioError::SYSTEM_ERROR; errorText_ = "RtApiWasapi::wasapiThread: Unable to create capture event."; goto Exit; } hr = captureAudioClient->SetEventHandle( captureEvent ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to set capture event handle."; goto Exit; } ( ( WasapiHandle* ) stream_.apiHandle )->captureClient = captureClient; ( ( WasapiHandle* ) stream_.apiHandle )->captureEvent = captureEvent; } unsigned int inBufferSize = 0; hr = captureAudioClient->GetBufferSize( &inBufferSize ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to get capture buffer size."; goto Exit; } // scale outBufferSize according to stream->user sample rate ratio unsigned int outBufferSize = ( unsigned int ) ( stream_.bufferSize * captureSrRatio ) * stream_.nDeviceChannels[INPUT]; inBufferSize *= stream_.nDeviceChannels[INPUT]; // set captureBuffer size captureBuffer.setBufferSize( inBufferSize + outBufferSize, formatBytes( stream_.deviceFormat[INPUT] ) ); // reset the capture stream hr = captureAudioClient->Reset(); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to reset capture stream."; goto Exit; } // start the capture stream hr = captureAudioClient->Start(); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to start capture stream."; goto Exit; } } // start render stream if applicable if ( renderAudioClient ) { hr = renderAudioClient->GetMixFormat( &renderFormat ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve device mix format."; goto Exit; } renderSrRatio = ( ( float ) renderFormat->nSamplesPerSec / stream_.sampleRate ); // initialize render stream according to desire buffer size float desiredBufferSize = stream_.bufferSize * renderSrRatio; REFERENCE_TIME desiredBufferPeriod = ( REFERENCE_TIME ) ( ( float ) desiredBufferSize * 10000000 / renderFormat->nSamplesPerSec ); if ( !renderClient ) { hr = renderAudioClient->Initialize( AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, desiredBufferPeriod, desiredBufferPeriod, renderFormat, NULL ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to initialize render audio client."; goto Exit; } hr = renderAudioClient->GetService( __uuidof( IAudioRenderClient ), ( void** ) &renderClient ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve render client handle."; goto Exit; } // configure renderEvent to trigger on every available render buffer renderEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); if ( !renderEvent ) { errorType = RtAudioError::SYSTEM_ERROR; errorText_ = "RtApiWasapi::wasapiThread: Unable to create render event."; goto Exit; } hr = renderAudioClient->SetEventHandle( renderEvent ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to set render event handle."; goto Exit; } ( ( WasapiHandle* ) stream_.apiHandle )->renderClient = renderClient; ( ( WasapiHandle* ) stream_.apiHandle )->renderEvent = renderEvent; } unsigned int outBufferSize = 0; hr = renderAudioClient->GetBufferSize( &outBufferSize ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to get render buffer size."; goto Exit; } // scale inBufferSize according to user->stream sample rate ratio unsigned int inBufferSize = ( unsigned int ) ( stream_.bufferSize * renderSrRatio ) * stream_.nDeviceChannels[OUTPUT]; outBufferSize *= stream_.nDeviceChannels[OUTPUT]; // set renderBuffer size renderBuffer.setBufferSize( inBufferSize + outBufferSize, formatBytes( stream_.deviceFormat[OUTPUT] ) ); // reset the render stream hr = renderAudioClient->Reset(); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to reset render stream."; goto Exit; } // start the render stream hr = renderAudioClient->Start(); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to start render stream."; goto Exit; } } if ( stream_.mode == INPUT ) { convBuffSize = ( size_t ) ( stream_.bufferSize * captureSrRatio ) * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ); deviceBuffSize = stream_.bufferSize * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ); } else if ( stream_.mode == OUTPUT ) { convBuffSize = ( size_t ) ( stream_.bufferSize * renderSrRatio ) * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ); deviceBuffSize = stream_.bufferSize * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ); } else if ( stream_.mode == DUPLEX ) { convBuffSize = std::max( ( size_t ) ( stream_.bufferSize * captureSrRatio ) * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ), ( size_t ) ( stream_.bufferSize * renderSrRatio ) * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ) ); deviceBuffSize = std::max( stream_.bufferSize * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ), stream_.bufferSize * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ) ); } convBuffer = ( char* ) malloc( convBuffSize ); stream_.deviceBuffer = ( char* ) malloc( deviceBuffSize ); if ( !convBuffer || !stream_.deviceBuffer ) { errorType = RtAudioError::MEMORY_ERROR; errorText_ = "RtApiWasapi::wasapiThread: Error allocating device buffer memory."; goto Exit; } // stream process loop while ( stream_.state != STREAM_STOPPING ) { if ( !callbackPulled ) { // Callback Input // ============== // 1. Pull callback buffer from inputBuffer // 2. If 1. was successful: Convert callback buffer to user sample rate and channel count // Convert callback buffer to user format if ( captureAudioClient ) { // Pull callback buffer from inputBuffer callbackPulled = captureBuffer.pullBuffer( convBuffer, ( unsigned int ) ( stream_.bufferSize * captureSrRatio ) * stream_.nDeviceChannels[INPUT], stream_.deviceFormat[INPUT] ); if ( callbackPulled ) { // Convert callback buffer to user sample rate convertBufferWasapi( stream_.deviceBuffer, convBuffer, stream_.nDeviceChannels[INPUT], captureFormat->nSamplesPerSec, stream_.sampleRate, ( unsigned int ) ( stream_.bufferSize * captureSrRatio ), convBufferSize, stream_.deviceFormat[INPUT] ); if ( stream_.doConvertBuffer[INPUT] ) { // Convert callback buffer to user format convertBuffer( stream_.userBuffer[INPUT], stream_.deviceBuffer, stream_.convertInfo[INPUT] ); } else { // no further conversion, simple copy deviceBuffer to userBuffer memcpy( stream_.userBuffer[INPUT], stream_.deviceBuffer, stream_.bufferSize * stream_.nUserChannels[INPUT] * formatBytes( stream_.userFormat ) ); } } } else { // if there is no capture stream, set callbackPulled flag callbackPulled = true; } // Execute Callback // ================ // 1. Execute user callback method // 2. Handle return value from callback // if callback has not requested the stream to stop if ( callbackPulled && !callbackStopped ) { // Execute user callback method callbackResult = callback( stream_.userBuffer[OUTPUT], stream_.userBuffer[INPUT], stream_.bufferSize, getStreamTime(), captureFlags & AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY ? RTAUDIO_INPUT_OVERFLOW : 0, stream_.callbackInfo.userData ); // Handle return value from callback if ( callbackResult == 1 ) { // instantiate a thread to stop this thread HANDLE threadHandle = CreateThread( NULL, 0, stopWasapiThread, this, 0, NULL ); if ( !threadHandle ) { errorType = RtAudioError::THREAD_ERROR; errorText_ = "RtApiWasapi::wasapiThread: Unable to instantiate stream stop thread."; goto Exit; } else if ( !CloseHandle( threadHandle ) ) { errorType = RtAudioError::THREAD_ERROR; errorText_ = "RtApiWasapi::wasapiThread: Unable to close stream stop thread handle."; goto Exit; } callbackStopped = true; } else if ( callbackResult == 2 ) { // instantiate a thread to stop this thread HANDLE threadHandle = CreateThread( NULL, 0, abortWasapiThread, this, 0, NULL ); if ( !threadHandle ) { errorType = RtAudioError::THREAD_ERROR; errorText_ = "RtApiWasapi::wasapiThread: Unable to instantiate stream abort thread."; goto Exit; } else if ( !CloseHandle( threadHandle ) ) { errorType = RtAudioError::THREAD_ERROR; errorText_ = "RtApiWasapi::wasapiThread: Unable to close stream abort thread handle."; goto Exit; } callbackStopped = true; } } } // Callback Output // =============== // 1. Convert callback buffer to stream format // 2. Convert callback buffer to stream sample rate and channel count // 3. Push callback buffer into outputBuffer if ( renderAudioClient && callbackPulled ) { if ( stream_.doConvertBuffer[OUTPUT] ) { // Convert callback buffer to stream format convertBuffer( stream_.deviceBuffer, stream_.userBuffer[OUTPUT], stream_.convertInfo[OUTPUT] ); } // Convert callback buffer to stream sample rate convertBufferWasapi( convBuffer, stream_.deviceBuffer, stream_.nDeviceChannels[OUTPUT], stream_.sampleRate, renderFormat->nSamplesPerSec, stream_.bufferSize, convBufferSize, stream_.deviceFormat[OUTPUT] ); // Push callback buffer into outputBuffer callbackPushed = renderBuffer.pushBuffer( convBuffer, convBufferSize * stream_.nDeviceChannels[OUTPUT], stream_.deviceFormat[OUTPUT] ); } else { // if there is no render stream, set callbackPushed flag callbackPushed = true; } // Stream Capture // ============== // 1. Get capture buffer from stream // 2. Push capture buffer into inputBuffer // 3. If 2. was successful: Release capture buffer if ( captureAudioClient ) { // if the callback input buffer was not pulled from captureBuffer, wait for next capture event if ( !callbackPulled ) { WaitForSingleObject( captureEvent, INFINITE ); } // Get capture buffer from stream hr = captureClient->GetBuffer( &streamBuffer, &bufferFrameCount, &captureFlags, NULL, NULL ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve capture buffer."; goto Exit; } if ( bufferFrameCount != 0 ) { // Push capture buffer into inputBuffer if ( captureBuffer.pushBuffer( ( char* ) streamBuffer, bufferFrameCount * stream_.nDeviceChannels[INPUT], stream_.deviceFormat[INPUT] ) ) { // Release capture buffer hr = captureClient->ReleaseBuffer( bufferFrameCount ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to release capture buffer."; goto Exit; } } else { // Inform WASAPI that capture was unsuccessful hr = captureClient->ReleaseBuffer( 0 ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to release capture buffer."; goto Exit; } } } else { // Inform WASAPI that capture was unsuccessful hr = captureClient->ReleaseBuffer( 0 ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to release capture buffer."; goto Exit; } } } // Stream Render // ============= // 1. Get render buffer from stream // 2. Pull next buffer from outputBuffer // 3. If 2. was successful: Fill render buffer with next buffer // Release render buffer if ( renderAudioClient ) { // if the callback output buffer was not pushed to renderBuffer, wait for next render event if ( callbackPulled && !callbackPushed ) { WaitForSingleObject( renderEvent, INFINITE ); } // Get render buffer from stream hr = renderAudioClient->GetBufferSize( &bufferFrameCount ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve render buffer size."; goto Exit; } hr = renderAudioClient->GetCurrentPadding( &numFramesPadding ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve render buffer padding."; goto Exit; } bufferFrameCount -= numFramesPadding; if ( bufferFrameCount != 0 ) { hr = renderClient->GetBuffer( bufferFrameCount, &streamBuffer ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve render buffer."; goto Exit; } // Pull next buffer from outputBuffer // Fill render buffer with next buffer if ( renderBuffer.pullBuffer( ( char* ) streamBuffer, bufferFrameCount * stream_.nDeviceChannels[OUTPUT], stream_.deviceFormat[OUTPUT] ) ) { // Release render buffer hr = renderClient->ReleaseBuffer( bufferFrameCount, 0 ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to release render buffer."; goto Exit; } } else { // Inform WASAPI that render was unsuccessful hr = renderClient->ReleaseBuffer( 0, 0 ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to release render buffer."; goto Exit; } } } else { // Inform WASAPI that render was unsuccessful hr = renderClient->ReleaseBuffer( 0, 0 ); if ( FAILED( hr ) ) { errorText_ = "RtApiWasapi::wasapiThread: Unable to release render buffer."; goto Exit; } } } // if the callback buffer was pushed renderBuffer reset callbackPulled flag if ( callbackPushed ) { callbackPulled = false; } // tick stream time RtApi::tickStreamTime(); } Exit: // clean up CoTaskMemFree( captureFormat ); CoTaskMemFree( renderFormat ); free ( convBuffer ); CoUninitialize(); // update stream state stream_.state = STREAM_STOPPED; if ( errorText_.empty() ) return; else error( errorType ); } //******************** End of __WINDOWS_WASAPI__ *********************// #endif #if defined(__WINDOWS_DS__) // Windows DirectSound API // Modified by Robin Davies, October 2005 // - Improvements to DirectX pointer chasing. // - Bug fix for non-power-of-two Asio granularity used by Edirol PCR-A30. // - Auto-call CoInitialize for DSOUND and ASIO platforms. // Various revisions for RtAudio 4.0 by Gary Scavone, April 2007 // Changed device query structure for RtAudio 4.0.7, January 2010 #include #include #include #if defined(__MINGW32__) // missing from latest mingw winapi #define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */ #define WAVE_FORMAT_96S08 0x00020000 /* 96 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_96M16 0x00040000 /* 96 kHz, Mono, 16-bit */ #define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */ #endif #define MINIMUM_DEVICE_BUFFER_SIZE 32768 #ifdef _MSC_VER // if Microsoft Visual C++ #pragma comment( lib, "winmm.lib" ) // then, auto-link winmm.lib. Otherwise, it has to be added manually. #endif static inline DWORD dsPointerBetween( DWORD pointer, DWORD laterPointer, DWORD earlierPointer, DWORD bufferSize ) { if ( pointer > bufferSize ) pointer -= bufferSize; if ( laterPointer < earlierPointer ) laterPointer += bufferSize; if ( pointer < earlierPointer ) pointer += bufferSize; return pointer >= earlierPointer && pointer < laterPointer; } // A structure to hold various information related to the DirectSound // API implementation. struct DsHandle { unsigned int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. void *id[2]; void *buffer[2]; bool xrun[2]; UINT bufferPointer[2]; DWORD dsBufferSize[2]; DWORD dsPointerLeadTime[2]; // the number of bytes ahead of the safe pointer to lead by. HANDLE condition; DsHandle() :drainCounter(0), internalDrain(false) { id[0] = 0; id[1] = 0; buffer[0] = 0; buffer[1] = 0; xrun[0] = false; xrun[1] = false; bufferPointer[0] = 0; bufferPointer[1] = 0; } }; // Declarations for utility functions, callbacks, and structures // specific to the DirectSound implementation. static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext ); static const char* getErrorString( int code ); static unsigned __stdcall callbackHandler( void *ptr ); struct DsDevice { LPGUID id[2]; bool validId[2]; bool found; std::string name; DsDevice() : found(false) { validId[0] = false; validId[1] = false; } }; struct DsProbeData { bool isInput; std::vector* dsDevices; }; RtApiDs :: RtApiDs() { // Dsound will run both-threaded. If CoInitialize fails, then just // accept whatever the mainline chose for a threading model. coInitialized_ = false; HRESULT hr = CoInitialize( NULL ); if ( !FAILED( hr ) ) coInitialized_ = true; } RtApiDs :: ~RtApiDs() { if ( coInitialized_ ) CoUninitialize(); // balanced call. if ( stream_.state != STREAM_CLOSED ) closeStream(); } // The DirectSound default output is always the first device. unsigned int RtApiDs :: getDefaultOutputDevice( void ) { return 0; } // The DirectSound default input is always the first input device, // which is the first capture device enumerated. unsigned int RtApiDs :: getDefaultInputDevice( void ) { return 0; } unsigned int RtApiDs :: getDeviceCount( void ) { // Set query flag for previously found devices to false, so that we // can check for any devices that have disappeared. for ( unsigned int i=0; i indices; for ( unsigned int i=0; i(dsDevices.size()); } RtAudio::DeviceInfo RtApiDs :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; if ( dsDevices.size() == 0 ) { // Force a query of all devices getDeviceCount(); if ( dsDevices.size() == 0 ) { errorText_ = "RtApiDs::getDeviceInfo: no devices found!"; error( RtAudioError::INVALID_USE ); return info; } } if ( device >= dsDevices.size() ) { errorText_ = "RtApiDs::getDeviceInfo: device ID is invalid!"; error( RtAudioError::INVALID_USE ); return info; } HRESULT result; if ( dsDevices[ device ].validId[0] == false ) goto probeInput; LPDIRECTSOUND output; DSCAPS outCaps; result = DirectSoundCreate( dsDevices[ device ].id[0], &output, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") opening output device (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); goto probeInput; } outCaps.dwSize = sizeof( outCaps ); result = output->GetCaps( &outCaps ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") getting capabilities!"; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); goto probeInput; } // Get output channel information. info.outputChannels = ( outCaps.dwFlags & DSCAPS_PRIMARYSTEREO ) ? 2 : 1; // Get sample rate information. info.sampleRates.clear(); for ( unsigned int k=0; k= (unsigned int) outCaps.dwMinSecondarySampleRate && SAMPLE_RATES[k] <= (unsigned int) outCaps.dwMaxSecondarySampleRate ) info.sampleRates.push_back( SAMPLE_RATES[k] ); } // Get format information. if ( outCaps.dwFlags & DSCAPS_PRIMARY16BIT ) info.nativeFormats |= RTAUDIO_SINT16; if ( outCaps.dwFlags & DSCAPS_PRIMARY8BIT ) info.nativeFormats |= RTAUDIO_SINT8; output->Release(); if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; if ( dsDevices[ device ].validId[1] == false ) { info.name = dsDevices[ device ].name; info.probed = true; return info; } probeInput: LPDIRECTSOUNDCAPTURE input; result = DirectSoundCaptureCreate( dsDevices[ device ].id[1], &input, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") opening input device (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } DSCCAPS inCaps; inCaps.dwSize = sizeof( inCaps ); result = input->GetCaps( &inCaps ); if ( FAILED( result ) ) { input->Release(); errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") getting object capabilities (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // Get input channel information. info.inputChannels = inCaps.dwChannels; // Get sample rate and format information. std::vector rates; if ( inCaps.dwChannels >= 2 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_2S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_4S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_96S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_1S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_2S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_4S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_96S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( info.nativeFormats & RTAUDIO_SINT16 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1S16 ) rates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2S16 ) rates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4S16 ) rates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96S16 ) rates.push_back( 96000 ); } else if ( info.nativeFormats & RTAUDIO_SINT8 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1S08 ) rates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2S08 ) rates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4S08 ) rates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96S08 ) rates.push_back( 96000 ); } } else if ( inCaps.dwChannels == 1 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_2M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_4M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_96M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_1M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_2M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_4M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_96M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( info.nativeFormats & RTAUDIO_SINT16 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1M16 ) rates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2M16 ) rates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4M16 ) rates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96M16 ) rates.push_back( 96000 ); } else if ( info.nativeFormats & RTAUDIO_SINT8 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1M08 ) rates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2M08 ) rates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4M08 ) rates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96M08 ) rates.push_back( 96000 ); } } else info.inputChannels = 0; // technically, this would be an error input->Release(); if ( info.inputChannels == 0 ) return info; // Copy the supported rates to the info structure but avoid duplication. bool found; for ( unsigned int i=0; i 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; if ( device == 0 ) info.isDefaultInput = true; // Copy name and return. info.name = dsDevices[ device ].name; info.probed = true; return info; } bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { if ( channels + firstChannel > 2 ) { errorText_ = "RtApiDs::probeDeviceOpen: DirectSound does not support more than 2 channels per device."; return FAILURE; } size_t nDevices = dsDevices.size(); if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiDs::probeDeviceOpen: no devices found!"; return FAILURE; } if ( device >= nDevices ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiDs::probeDeviceOpen: device ID is invalid!"; return FAILURE; } if ( mode == OUTPUT ) { if ( dsDevices[ device ].validId[0] == false ) { errorStream_ << "RtApiDs::probeDeviceOpen: device (" << device << ") does not support output!"; errorText_ = errorStream_.str(); return FAILURE; } } else { // mode == INPUT if ( dsDevices[ device ].validId[1] == false ) { errorStream_ << "RtApiDs::probeDeviceOpen: device (" << device << ") does not support input!"; errorText_ = errorStream_.str(); return FAILURE; } } // According to a note in PortAudio, using GetDesktopWindow() // instead of GetForegroundWindow() is supposed to avoid problems // that occur when the application's window is not the foreground // window. Also, if the application window closes before the // DirectSound buffer, DirectSound can crash. In the past, I had // problems when using GetDesktopWindow() but it seems fine now // (January 2010). I'll leave it commented here. // HWND hWnd = GetForegroundWindow(); HWND hWnd = GetDesktopWindow(); // Check the numberOfBuffers parameter and limit the lowest value to // two. This is a judgement call and a value of two is probably too // low for capture, but it should work for playback. int nBuffers = 0; if ( options ) nBuffers = options->numberOfBuffers; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) nBuffers = 2; if ( nBuffers < 2 ) nBuffers = 3; // Check the lower range of the user-specified buffer size and set // (arbitrarily) to a lower bound of 32. if ( *bufferSize < 32 ) *bufferSize = 32; // Create the wave format structure. The data format setting will // be determined later. WAVEFORMATEX waveFormat; ZeroMemory( &waveFormat, sizeof(WAVEFORMATEX) ); waveFormat.wFormatTag = WAVE_FORMAT_PCM; waveFormat.nChannels = channels + firstChannel; waveFormat.nSamplesPerSec = (unsigned long) sampleRate; // Determine the device buffer size. By default, we'll use the value // defined above (32K), but we will grow it to make allowances for // very large software buffer sizes. DWORD dsBufferSize = MINIMUM_DEVICE_BUFFER_SIZE; DWORD dsPointerLeadTime = 0; void *ohandle = 0, *bhandle = 0; HRESULT result; if ( mode == OUTPUT ) { LPDIRECTSOUND output; result = DirectSoundCreate( dsDevices[ device ].id[0], &output, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") opening output device (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } DSCAPS outCaps; outCaps.dwSize = sizeof( outCaps ); result = output->GetCaps( &outCaps ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting capabilities (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Check channel information. if ( channels + firstChannel == 2 && !( outCaps.dwFlags & DSCAPS_PRIMARYSTEREO ) ) { errorStream_ << "RtApiDs::getDeviceInfo: the output device (" << dsDevices[ device ].name << ") does not support stereo playback."; errorText_ = errorStream_.str(); return FAILURE; } // Check format information. Use 16-bit format unless not // supported or user requests 8-bit. if ( outCaps.dwFlags & DSCAPS_PRIMARY16BIT && !( format == RTAUDIO_SINT8 && outCaps.dwFlags & DSCAPS_PRIMARY8BIT ) ) { waveFormat.wBitsPerSample = 16; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } else { waveFormat.wBitsPerSample = 8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } stream_.userFormat = format; // Update wave format structure and buffer information. waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; dsPointerLeadTime = nBuffers * (*bufferSize) * (waveFormat.wBitsPerSample / 8) * channels; // If the user wants an even bigger buffer, increase the device buffer size accordingly. while ( dsPointerLeadTime * 2U > dsBufferSize ) dsBufferSize *= 2; // Set cooperative level to DSSCL_EXCLUSIVE ... sound stops when window focus changes. // result = output->SetCooperativeLevel( hWnd, DSSCL_EXCLUSIVE ); // Set cooperative level to DSSCL_PRIORITY ... sound remains when window focus changes. result = output->SetCooperativeLevel( hWnd, DSSCL_PRIORITY ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting cooperative level (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Even though we will write to the secondary buffer, we need to // access the primary buffer to set the correct output format // (since the default is 8-bit, 22 kHz!). Setup the DS primary // buffer description. DSBUFFERDESC bufferDescription; ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); bufferDescription.dwSize = sizeof( DSBUFFERDESC ); bufferDescription.dwFlags = DSBCAPS_PRIMARYBUFFER; // Obtain the primary buffer LPDIRECTSOUNDBUFFER buffer; result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") accessing primary buffer (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Set the primary DS buffer sound format. result = buffer->SetFormat( &waveFormat ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting primary buffer format (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Setup the secondary DS buffer description. ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); bufferDescription.dwSize = sizeof( DSBUFFERDESC ); bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCHARDWARE ); // Force hardware mixing bufferDescription.dwBufferBytes = dsBufferSize; bufferDescription.lpwfxFormat = &waveFormat; // Try to create the secondary DS buffer. If that doesn't work, // try to use software mixing. Otherwise, there's a problem. result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCSOFTWARE ); // Force software mixing result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") creating secondary buffer (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } } // Get the buffer size ... might be different from what we specified. DSBCAPS dsbcaps; dsbcaps.dwSize = sizeof( DSBCAPS ); result = buffer->GetCaps( &dsbcaps ); if ( FAILED( result ) ) { output->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting buffer settings (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } dsBufferSize = dsbcaps.dwBufferBytes; // Lock the DS buffer LPVOID audioPtr; DWORD dataLen; result = buffer->Lock( 0, dsBufferSize, &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { output->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") locking buffer (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Zero the DS buffer ZeroMemory( audioPtr, dataLen ); // Unlock the DS buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { output->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") unlocking buffer (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } ohandle = (void *) output; bhandle = (void *) buffer; } if ( mode == INPUT ) { LPDIRECTSOUNDCAPTURE input; result = DirectSoundCaptureCreate( dsDevices[ device ].id[1], &input, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") opening input device (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } DSCCAPS inCaps; inCaps.dwSize = sizeof( inCaps ); result = input->GetCaps( &inCaps ); if ( FAILED( result ) ) { input->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting input capabilities (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Check channel information. if ( inCaps.dwChannels < channels + firstChannel ) { errorText_ = "RtApiDs::getDeviceInfo: the input device does not support requested input channels."; return FAILURE; } // Check format information. Use 16-bit format unless user // requests 8-bit. DWORD deviceFormats; if ( channels + firstChannel == 2 ) { deviceFormats = WAVE_FORMAT_1S08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_96S08; if ( format == RTAUDIO_SINT8 && inCaps.dwFormats & deviceFormats ) { waveFormat.wBitsPerSample = 8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } else { // assume 16-bit is supported waveFormat.wBitsPerSample = 16; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } } else { // channel == 1 deviceFormats = WAVE_FORMAT_1M08 | WAVE_FORMAT_2M08 | WAVE_FORMAT_4M08 | WAVE_FORMAT_96M08; if ( format == RTAUDIO_SINT8 && inCaps.dwFormats & deviceFormats ) { waveFormat.wBitsPerSample = 8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } else { // assume 16-bit is supported waveFormat.wBitsPerSample = 16; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } } stream_.userFormat = format; // Update wave format structure and buffer information. waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; dsPointerLeadTime = nBuffers * (*bufferSize) * (waveFormat.wBitsPerSample / 8) * channels; // If the user wants an even bigger buffer, increase the device buffer size accordingly. while ( dsPointerLeadTime * 2U > dsBufferSize ) dsBufferSize *= 2; // Setup the secondary DS buffer description. DSCBUFFERDESC bufferDescription; ZeroMemory( &bufferDescription, sizeof( DSCBUFFERDESC ) ); bufferDescription.dwSize = sizeof( DSCBUFFERDESC ); bufferDescription.dwFlags = 0; bufferDescription.dwReserved = 0; bufferDescription.dwBufferBytes = dsBufferSize; bufferDescription.lpwfxFormat = &waveFormat; // Create the capture buffer. LPDIRECTSOUNDCAPTUREBUFFER buffer; result = input->CreateCaptureBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { input->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") creating input buffer (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Get the buffer size ... might be different from what we specified. DSCBCAPS dscbcaps; dscbcaps.dwSize = sizeof( DSCBCAPS ); result = buffer->GetCaps( &dscbcaps ); if ( FAILED( result ) ) { input->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting buffer settings (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } dsBufferSize = dscbcaps.dwBufferBytes; // NOTE: We could have a problem here if this is a duplex stream // and the play and capture hardware buffer sizes are different // (I'm actually not sure if that is a problem or not). // Currently, we are not verifying that. // Lock the capture buffer LPVOID audioPtr; DWORD dataLen; result = buffer->Lock( 0, dsBufferSize, &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { input->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") locking input buffer (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Zero the buffer ZeroMemory( audioPtr, dataLen ); // Unlock the buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { input->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") unlocking input buffer (" << dsDevices[ device ].name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } ohandle = (void *) input; bhandle = (void *) buffer; } // Set various stream parameters DsHandle *handle = 0; stream_.nDeviceChannels[mode] = channels + firstChannel; stream_.nUserChannels[mode] = channels; stream_.bufferSize = *bufferSize; stream_.channelOffset[mode] = firstChannel; stream_.deviceInterleaved[mode] = true; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; // Set flag for buffer conversion stream_.doConvertBuffer[mode] = false; if (stream_.nUserChannels[mode] != stream_.nDeviceChannels[mode]) stream_.doConvertBuffer[mode] = true; if (stream_.userFormat != stream_.deviceFormat[mode]) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers long bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiDs::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= (long) bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiDs::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } // Allocate our DsHandle structures for the stream. if ( stream_.apiHandle == 0 ) { try { handle = new DsHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiDs::probeDeviceOpen: error allocating AsioHandle memory."; goto error; } // Create a manual-reset event. handle->condition = CreateEvent( NULL, // no security TRUE, // manual-reset FALSE, // non-signaled initially NULL ); // unnamed stream_.apiHandle = (void *) handle; } else handle = (DsHandle *) stream_.apiHandle; handle->id[mode] = ohandle; handle->buffer[mode] = bhandle; handle->dsBufferSize[mode] = dsBufferSize; handle->dsPointerLeadTime[mode] = dsPointerLeadTime; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up an output stream. stream_.mode = DUPLEX; else stream_.mode = mode; stream_.nBuffers = nBuffers; stream_.sampleRate = sampleRate; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); // Setup the callback thread. if ( stream_.callbackInfo.isRunning == false ) { unsigned threadId; stream_.callbackInfo.isRunning = true; stream_.callbackInfo.object = (void *) this; stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &callbackHandler, &stream_.callbackInfo, 0, &threadId ); if ( stream_.callbackInfo.thread == 0 ) { errorText_ = "RtApiDs::probeDeviceOpen: error creating callback thread!"; goto error; } // Boost DS thread priority SetThreadPriority( (HANDLE) stream_.callbackInfo.thread, THREAD_PRIORITY_HIGHEST ); } return SUCCESS; error: if ( handle ) { if ( handle->buffer[0] ) { // the object pointer can be NULL and valid LPDIRECTSOUND object = (LPDIRECTSOUND) handle->id[0]; LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; if ( buffer ) buffer->Release(); object->Release(); } if ( handle->buffer[1] ) { LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handle->id[1]; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; if ( buffer ) buffer->Release(); object->Release(); } CloseHandle( handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.state = STREAM_CLOSED; return FAILURE; } void RtApiDs :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiDs::closeStream(): no open stream to close!"; error( RtAudioError::WARNING ); return; } // Stop the callback thread. stream_.callbackInfo.isRunning = false; WaitForSingleObject( (HANDLE) stream_.callbackInfo.thread, INFINITE ); CloseHandle( (HANDLE) stream_.callbackInfo.thread ); DsHandle *handle = (DsHandle *) stream_.apiHandle; if ( handle ) { if ( handle->buffer[0] ) { // the object pointer can be NULL and valid LPDIRECTSOUND object = (LPDIRECTSOUND) handle->id[0]; LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; if ( buffer ) { buffer->Stop(); buffer->Release(); } object->Release(); } if ( handle->buffer[1] ) { LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handle->id[1]; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; if ( buffer ) { buffer->Stop(); buffer->Release(); } object->Release(); } CloseHandle( handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiDs :: startStream() { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiDs::startStream(): the stream is already running!"; error( RtAudioError::WARNING ); return; } DsHandle *handle = (DsHandle *) stream_.apiHandle; // Increase scheduler frequency on lesser windows (a side-effect of // increasing timer accuracy). On greater windows (Win2K or later), // this is already in effect. timeBeginPeriod( 1 ); buffersRolling = false; duplexPrerollBytes = 0; if ( stream_.mode == DUPLEX ) { // 0.5 seconds of silence in DUPLEX mode while the devices spin up and synchronize. duplexPrerollBytes = (int) ( 0.5 * stream_.sampleRate * formatBytes( stream_.deviceFormat[1] ) * stream_.nDeviceChannels[1] ); } HRESULT result = 0; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; result = buffer->Play( 0, 0, DSBPLAY_LOOPING ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::startStream: error (" << getErrorString( result ) << ") starting output buffer!"; errorText_ = errorStream_.str(); goto unlock; } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; result = buffer->Start( DSCBSTART_LOOPING ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::startStream: error (" << getErrorString( result ) << ") starting input buffer!"; errorText_ = errorStream_.str(); goto unlock; } } handle->drainCounter = 0; handle->internalDrain = false; ResetEvent( handle->condition ); stream_.state = STREAM_RUNNING; unlock: if ( FAILED( result ) ) error( RtAudioError::SYSTEM_ERROR ); } void RtApiDs :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiDs::stopStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } HRESULT result = 0; LPVOID audioPtr; DWORD dataLen; DsHandle *handle = (DsHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 2; WaitForSingleObject( handle->condition, INFINITE ); // block until signaled } stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); // Stop the buffer and clear memory LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; result = buffer->Stop(); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") stopping output buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Lock the buffer and clear it so that if we start to play again, // we won't have old data playing. result = buffer->Lock( 0, handle->dsBufferSize[0], &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") locking output buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Zero the DS buffer ZeroMemory( audioPtr, dataLen ); // Unlock the DS buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") unlocking output buffer!"; errorText_ = errorStream_.str(); goto unlock; } // If we start playing again, we must begin at beginning of buffer. handle->bufferPointer[0] = 0; } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; audioPtr = NULL; dataLen = 0; stream_.state = STREAM_STOPPED; if ( stream_.mode != DUPLEX ) MUTEX_LOCK( &stream_.mutex ); result = buffer->Stop(); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") stopping input buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Lock the buffer and clear it so that if we start to play again, // we won't have old data playing. result = buffer->Lock( 0, handle->dsBufferSize[1], &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") locking input buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Zero the DS buffer ZeroMemory( audioPtr, dataLen ); // Unlock the DS buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") unlocking input buffer!"; errorText_ = errorStream_.str(); goto unlock; } // If we start recording again, we must begin at beginning of buffer. handle->bufferPointer[1] = 0; } unlock: timeEndPeriod( 1 ); // revert to normal scheduler frequency on lesser windows. MUTEX_UNLOCK( &stream_.mutex ); if ( FAILED( result ) ) error( RtAudioError::SYSTEM_ERROR ); } void RtApiDs :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiDs::abortStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } DsHandle *handle = (DsHandle *) stream_.apiHandle; handle->drainCounter = 2; stopStream(); } void RtApiDs :: callbackEvent() { if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) { Sleep( 50 ); // sleep 50 milliseconds return; } if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiDs::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtAudioError::WARNING ); return; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; DsHandle *handle = (DsHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > stream_.nBuffers + 2 ) { stream_.state = STREAM_STOPPING; if ( handle->internalDrain == false ) SetEvent( handle->condition ); else stopStream(); return; } // Invoke user callback to get fresh output data UNLESS we are // draining stream. if ( handle->drainCounter == 0 ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( cbReturnValue == 2 ) { stream_.state = STREAM_STOPPING; handle->drainCounter = 2; abortStream(); return; } else if ( cbReturnValue == 1 ) { handle->drainCounter = 1; handle->internalDrain = true; } } HRESULT result; DWORD currentWritePointer, safeWritePointer; DWORD currentReadPointer, safeReadPointer; UINT nextWritePointer; LPVOID buffer1 = NULL; LPVOID buffer2 = NULL; DWORD bufferSize1 = 0; DWORD bufferSize2 = 0; char *buffer; long bufferBytes; MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } if ( buffersRolling == false ) { if ( stream_.mode == DUPLEX ) { //assert( handle->dsBufferSize[0] == handle->dsBufferSize[1] ); // It takes a while for the devices to get rolling. As a result, // there's no guarantee that the capture and write device pointers // will move in lockstep. Wait here for both devices to start // rolling, and then set our buffer pointers accordingly. // e.g. Crystal Drivers: the capture buffer starts up 5700 to 9600 // bytes later than the write buffer. // Stub: a serious risk of having a pre-emptive scheduling round // take place between the two GetCurrentPosition calls... but I'm // really not sure how to solve the problem. Temporarily boost to // Realtime priority, maybe; but I'm not sure what priority the // DirectSound service threads run at. We *should* be roughly // within a ms or so of correct. LPDIRECTSOUNDBUFFER dsWriteBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; LPDIRECTSOUNDCAPTUREBUFFER dsCaptureBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; DWORD startSafeWritePointer, startSafeReadPointer; result = dsWriteBuffer->GetCurrentPosition( NULL, &startSafeWritePointer ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } result = dsCaptureBuffer->GetCurrentPosition( NULL, &startSafeReadPointer ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } while ( true ) { result = dsWriteBuffer->GetCurrentPosition( NULL, &safeWritePointer ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } result = dsCaptureBuffer->GetCurrentPosition( NULL, &safeReadPointer ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } if ( safeWritePointer != startSafeWritePointer && safeReadPointer != startSafeReadPointer ) break; Sleep( 1 ); } //assert( handle->dsBufferSize[0] == handle->dsBufferSize[1] ); handle->bufferPointer[0] = safeWritePointer + handle->dsPointerLeadTime[0]; if ( handle->bufferPointer[0] >= handle->dsBufferSize[0] ) handle->bufferPointer[0] -= handle->dsBufferSize[0]; handle->bufferPointer[1] = safeReadPointer; } else if ( stream_.mode == OUTPUT ) { // Set the proper nextWritePosition after initial startup. LPDIRECTSOUNDBUFFER dsWriteBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; result = dsWriteBuffer->GetCurrentPosition( ¤tWritePointer, &safeWritePointer ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } handle->bufferPointer[0] = safeWritePointer + handle->dsPointerLeadTime[0]; if ( handle->bufferPointer[0] >= handle->dsBufferSize[0] ) handle->bufferPointer[0] -= handle->dsBufferSize[0]; } buffersRolling = true; } if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { LPDIRECTSOUNDBUFFER dsBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; if ( handle->drainCounter > 1 ) { // write zeros to the output stream bufferBytes = stream_.bufferSize * stream_.nUserChannels[0]; bufferBytes *= formatBytes( stream_.userFormat ); memset( stream_.userBuffer[0], 0, bufferBytes ); } // Setup parameters and do buffer conversion if necessary. if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); bufferBytes = stream_.bufferSize * stream_.nDeviceChannels[0]; bufferBytes *= formatBytes( stream_.deviceFormat[0] ); } else { buffer = stream_.userBuffer[0]; bufferBytes = stream_.bufferSize * stream_.nUserChannels[0]; bufferBytes *= formatBytes( stream_.userFormat ); } // No byte swapping necessary in DirectSound implementation. // Ahhh ... windoze. 16-bit data is signed but 8-bit data is // unsigned. So, we need to convert our signed 8-bit data here to // unsigned. if ( stream_.deviceFormat[0] == RTAUDIO_SINT8 ) for ( int i=0; idsBufferSize[0]; nextWritePointer = handle->bufferPointer[0]; DWORD endWrite, leadPointer; while ( true ) { // Find out where the read and "safe write" pointers are. result = dsBuffer->GetCurrentPosition( ¤tWritePointer, &safeWritePointer ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } // We will copy our output buffer into the region between // safeWritePointer and leadPointer. If leadPointer is not // beyond the next endWrite position, wait until it is. leadPointer = safeWritePointer + handle->dsPointerLeadTime[0]; //std::cout << "safeWritePointer = " << safeWritePointer << ", leadPointer = " << leadPointer << ", nextWritePointer = " << nextWritePointer << std::endl; if ( leadPointer > dsBufferSize ) leadPointer -= dsBufferSize; if ( leadPointer < nextWritePointer ) leadPointer += dsBufferSize; // unwrap offset endWrite = nextWritePointer + bufferBytes; // Check whether the entire write region is behind the play pointer. if ( leadPointer >= endWrite ) break; // If we are here, then we must wait until the leadPointer advances // beyond the end of our next write region. We use the // Sleep() function to suspend operation until that happens. double millis = ( endWrite - leadPointer ) * 1000.0; millis /= ( formatBytes( stream_.deviceFormat[0]) * stream_.nDeviceChannels[0] * stream_.sampleRate); if ( millis < 1.0 ) millis = 1.0; Sleep( (DWORD) millis ); } if ( dsPointerBetween( nextWritePointer, safeWritePointer, currentWritePointer, dsBufferSize ) || dsPointerBetween( endWrite, safeWritePointer, currentWritePointer, dsBufferSize ) ) { // We've strayed into the forbidden zone ... resync the read pointer. handle->xrun[0] = true; nextWritePointer = safeWritePointer + handle->dsPointerLeadTime[0] - bufferBytes; if ( nextWritePointer >= dsBufferSize ) nextWritePointer -= dsBufferSize; handle->bufferPointer[0] = nextWritePointer; endWrite = nextWritePointer + bufferBytes; } // Lock free space in the buffer result = dsBuffer->Lock( nextWritePointer, bufferBytes, &buffer1, &bufferSize1, &buffer2, &bufferSize2, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") locking buffer during playback!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } // Copy our buffer into the DS buffer CopyMemory( buffer1, buffer, bufferSize1 ); if ( buffer2 != NULL ) CopyMemory( buffer2, buffer+bufferSize1, bufferSize2 ); // Update our buffer offset and unlock sound buffer dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") unlocking buffer during playback!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } nextWritePointer = ( nextWritePointer + bufferSize1 + bufferSize2 ) % dsBufferSize; handle->bufferPointer[0] = nextWritePointer; } // Don't bother draining input if ( handle->drainCounter ) { handle->drainCounter++; goto unlock; } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { // Setup parameters. if ( stream_.doConvertBuffer[1] ) { buffer = stream_.deviceBuffer; bufferBytes = stream_.bufferSize * stream_.nDeviceChannels[1]; bufferBytes *= formatBytes( stream_.deviceFormat[1] ); } else { buffer = stream_.userBuffer[1]; bufferBytes = stream_.bufferSize * stream_.nUserChannels[1]; bufferBytes *= formatBytes( stream_.userFormat ); } LPDIRECTSOUNDCAPTUREBUFFER dsBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; long nextReadPointer = handle->bufferPointer[1]; DWORD dsBufferSize = handle->dsBufferSize[1]; // Find out where the write and "safe read" pointers are. result = dsBuffer->GetCurrentPosition( ¤tReadPointer, &safeReadPointer ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } if ( safeReadPointer < (DWORD)nextReadPointer ) safeReadPointer += dsBufferSize; // unwrap offset DWORD endRead = nextReadPointer + bufferBytes; // Handling depends on whether we are INPUT or DUPLEX. // If we're in INPUT mode then waiting is a good thing. If we're in DUPLEX mode, // then a wait here will drag the write pointers into the forbidden zone. // // In DUPLEX mode, rather than wait, we will back off the read pointer until // it's in a safe position. This causes dropouts, but it seems to be the only // practical way to sync up the read and write pointers reliably, given the // the very complex relationship between phase and increment of the read and write // pointers. // // In order to minimize audible dropouts in DUPLEX mode, we will // provide a pre-roll period of 0.5 seconds in which we return // zeros from the read buffer while the pointers sync up. if ( stream_.mode == DUPLEX ) { if ( safeReadPointer < endRead ) { if ( duplexPrerollBytes <= 0 ) { // Pre-roll time over. Be more agressive. int adjustment = endRead-safeReadPointer; handle->xrun[1] = true; // Two cases: // - large adjustments: we've probably run out of CPU cycles, so just resync exactly, // and perform fine adjustments later. // - small adjustments: back off by twice as much. if ( adjustment >= 2*bufferBytes ) nextReadPointer = safeReadPointer-2*bufferBytes; else nextReadPointer = safeReadPointer-bufferBytes-adjustment; if ( nextReadPointer < 0 ) nextReadPointer += dsBufferSize; } else { // In pre=roll time. Just do it. nextReadPointer = safeReadPointer - bufferBytes; while ( nextReadPointer < 0 ) nextReadPointer += dsBufferSize; } endRead = nextReadPointer + bufferBytes; } } else { // mode == INPUT while ( safeReadPointer < endRead && stream_.callbackInfo.isRunning ) { // See comments for playback. double millis = (endRead - safeReadPointer) * 1000.0; millis /= ( formatBytes(stream_.deviceFormat[1]) * stream_.nDeviceChannels[1] * stream_.sampleRate); if ( millis < 1.0 ) millis = 1.0; Sleep( (DWORD) millis ); // Wake up and find out where we are now. result = dsBuffer->GetCurrentPosition( ¤tReadPointer, &safeReadPointer ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } if ( safeReadPointer < (DWORD)nextReadPointer ) safeReadPointer += dsBufferSize; // unwrap offset } } // Lock free space in the buffer result = dsBuffer->Lock( nextReadPointer, bufferBytes, &buffer1, &bufferSize1, &buffer2, &bufferSize2, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") locking capture buffer!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } if ( duplexPrerollBytes <= 0 ) { // Copy our buffer into the DS buffer CopyMemory( buffer, buffer1, bufferSize1 ); if ( buffer2 != NULL ) CopyMemory( buffer+bufferSize1, buffer2, bufferSize2 ); } else { memset( buffer, 0, bufferSize1 ); if ( buffer2 != NULL ) memset( buffer + bufferSize1, 0, bufferSize2 ); duplexPrerollBytes -= bufferSize1 + bufferSize2; } // Update our buffer offset and unlock sound buffer nextReadPointer = ( nextReadPointer + bufferSize1 + bufferSize2 ) % dsBufferSize; dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") unlocking capture buffer!"; errorText_ = errorStream_.str(); error( RtAudioError::SYSTEM_ERROR ); return; } handle->bufferPointer[1] = nextReadPointer; // No byte swapping necessary in DirectSound implementation. // If necessary, convert 8-bit data from unsigned to signed. if ( stream_.deviceFormat[1] == RTAUDIO_SINT8 ) for ( int j=0; jobject; bool* isRunning = &info->isRunning; while ( *isRunning == true ) { object->callbackEvent(); } _endthreadex( 0 ); return 0; } #include "tchar.h" static std::string convertTChar( LPCTSTR name ) { #if defined( UNICODE ) || defined( _UNICODE ) int length = WideCharToMultiByte(CP_UTF8, 0, name, -1, NULL, 0, NULL, NULL); std::string s( length-1, '\0' ); WideCharToMultiByte(CP_UTF8, 0, name, -1, &s[0], length, NULL, NULL); #else std::string s( name ); #endif return s; } static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, LPCTSTR description, LPCTSTR /*module*/, LPVOID lpContext ) { struct DsProbeData& probeInfo = *(struct DsProbeData*) lpContext; std::vector& dsDevices = *probeInfo.dsDevices; HRESULT hr; bool validDevice = false; if ( probeInfo.isInput == true ) { DSCCAPS caps; LPDIRECTSOUNDCAPTURE object; hr = DirectSoundCaptureCreate( lpguid, &object, NULL ); if ( hr != DS_OK ) return TRUE; caps.dwSize = sizeof(caps); hr = object->GetCaps( &caps ); if ( hr == DS_OK ) { if ( caps.dwChannels > 0 && caps.dwFormats > 0 ) validDevice = true; } object->Release(); } else { DSCAPS caps; LPDIRECTSOUND object; hr = DirectSoundCreate( lpguid, &object, NULL ); if ( hr != DS_OK ) return TRUE; caps.dwSize = sizeof(caps); hr = object->GetCaps( &caps ); if ( hr == DS_OK ) { if ( caps.dwFlags & DSCAPS_PRIMARYMONO || caps.dwFlags & DSCAPS_PRIMARYSTEREO ) validDevice = true; } object->Release(); } // If good device, then save its name and guid. std::string name = convertTChar( description ); //if ( name == "Primary Sound Driver" || name == "Primary Sound Capture Driver" ) if ( lpguid == NULL ) name = "Default Device"; if ( validDevice ) { for ( unsigned int i=0; i #include // A structure to hold various information related to the ALSA API // implementation. struct AlsaHandle { snd_pcm_t *handles[2]; bool synchronized; bool xrun[2]; pthread_cond_t runnable_cv; bool runnable; AlsaHandle() :synchronized(false), runnable(false) { xrun[0] = false; xrun[1] = false; } }; static void *alsaCallbackHandler( void * ptr ); RtApiAlsa :: RtApiAlsa() { // Nothing to do here. } RtApiAlsa :: ~RtApiAlsa() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiAlsa :: getDeviceCount( void ) { unsigned nDevices = 0; int result, subdevice, card; char name[64]; snd_ctl_t *handle; // Count cards and devices card = -1; snd_card_next( &card ); while ( card >= 0 ) { sprintf( name, "hw:%d", card ); result = snd_ctl_open( &handle, name, 0 ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceCount: control open, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); goto nextcard; } subdevice = -1; while( 1 ) { result = snd_ctl_pcm_next_device( handle, &subdevice ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceCount: control next device, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); break; } if ( subdevice < 0 ) break; nDevices++; } nextcard: snd_ctl_close( handle ); snd_card_next( &card ); } result = snd_ctl_open( &handle, "default", 0 ); if (result == 0) { nDevices++; snd_ctl_close( handle ); } return nDevices; } RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; unsigned nDevices = 0; int result, subdevice, card; char name[64]; snd_ctl_t *chandle; // Count cards and devices card = -1; snd_card_next( &card ); while ( card >= 0 ) { sprintf( name, "hw:%d", card ); result = snd_ctl_open( &chandle, name, SND_CTL_NONBLOCK ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: control open, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); goto nextcard; } subdevice = -1; while( 1 ) { result = snd_ctl_pcm_next_device( chandle, &subdevice ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: control next device, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); break; } if ( subdevice < 0 ) break; if ( nDevices == device ) { sprintf( name, "hw:%d,%d", card, subdevice ); goto foundDevice; } nDevices++; } nextcard: snd_ctl_close( chandle ); snd_card_next( &card ); } result = snd_ctl_open( &chandle, "default", SND_CTL_NONBLOCK ); if ( result == 0 ) { if ( nDevices == device ) { strcpy( name, "default" ); goto foundDevice; } nDevices++; } if ( nDevices == 0 ) { errorText_ = "RtApiAlsa::getDeviceInfo: no devices found!"; error( RtAudioError::INVALID_USE ); return info; } if ( device >= nDevices ) { errorText_ = "RtApiAlsa::getDeviceInfo: device ID is invalid!"; error( RtAudioError::INVALID_USE ); return info; } foundDevice: // If a stream is already open, we cannot probe the stream devices. // Thus, use the saved results. if ( stream_.state != STREAM_CLOSED && ( stream_.device[0] == device || stream_.device[1] == device ) ) { snd_ctl_close( chandle ); if ( device >= devices_.size() ) { errorText_ = "RtApiAlsa::getDeviceInfo: device ID was not present before stream was opened."; error( RtAudioError::WARNING ); return info; } return devices_[ device ]; } int openMode = SND_PCM_ASYNC; snd_pcm_stream_t stream; snd_pcm_info_t *pcminfo; snd_pcm_info_alloca( &pcminfo ); snd_pcm_t *phandle; snd_pcm_hw_params_t *params; snd_pcm_hw_params_alloca( ¶ms ); // First try for playback unless default device (which has subdev -1) stream = SND_PCM_STREAM_PLAYBACK; snd_pcm_info_set_stream( pcminfo, stream ); if ( subdevice != -1 ) { snd_pcm_info_set_device( pcminfo, subdevice ); snd_pcm_info_set_subdevice( pcminfo, 0 ); result = snd_ctl_pcm_info( chandle, pcminfo ); if ( result < 0 ) { // Device probably doesn't support playback. goto captureProbe; } } result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); goto captureProbe; } // The device is open ... fill the parameter structure. result = snd_pcm_hw_params_any( phandle, params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); goto captureProbe; } // Get output channel information. unsigned int value; result = snd_pcm_hw_params_get_channels_max( params, &value ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: error getting device (" << name << ") output channels, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); goto captureProbe; } info.outputChannels = value; snd_pcm_close( phandle ); captureProbe: stream = SND_PCM_STREAM_CAPTURE; snd_pcm_info_set_stream( pcminfo, stream ); // Now try for capture unless default device (with subdev = -1) if ( subdevice != -1 ) { result = snd_ctl_pcm_info( chandle, pcminfo ); snd_ctl_close( chandle ); if ( result < 0 ) { // Device probably doesn't support capture. if ( info.outputChannels == 0 ) return info; goto probeParameters; } } else snd_ctl_close( chandle ); result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); if ( info.outputChannels == 0 ) return info; goto probeParameters; } // The device is open ... fill the parameter structure. result = snd_pcm_hw_params_any( phandle, params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); if ( info.outputChannels == 0 ) return info; goto probeParameters; } result = snd_pcm_hw_params_get_channels_max( params, &value ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: error getting device (" << name << ") input channels, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); if ( info.outputChannels == 0 ) return info; goto probeParameters; } info.inputChannels = value; snd_pcm_close( phandle ); // If device opens for both playback and capture, we determine the channels. if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // ALSA doesn't provide default devices so we'll use the first available one. if ( device == 0 && info.outputChannels > 0 ) info.isDefaultOutput = true; if ( device == 0 && info.inputChannels > 0 ) info.isDefaultInput = true; probeParameters: // At this point, we just need to figure out the supported data // formats and sample rates. We'll proceed by opening the device in // the direction with the maximum number of channels, or playback if // they are equal. This might limit our sample rate options, but so // be it. if ( info.outputChannels >= info.inputChannels ) stream = SND_PCM_STREAM_PLAYBACK; else stream = SND_PCM_STREAM_CAPTURE; snd_pcm_info_set_stream( pcminfo, stream ); result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // The device is open ... fill the parameter structure. result = snd_pcm_hw_params_any( phandle, params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // Test our discrete set of sample rate values. info.sampleRates.clear(); for ( unsigned int i=0; i= 0 ) { sprintf( name, "hw:%s,%d", cardname, subdevice ); free( cardname ); } info.name = name; // That's all ... close the device and return snd_pcm_close( phandle ); info.probed = true; return info; } void RtApiAlsa :: saveDeviceInfo( void ) { devices_.clear(); unsigned int nDevices = getDeviceCount(); devices_.resize( nDevices ); for ( unsigned int i=0; iflags & RTAUDIO_ALSA_USE_DEFAULT ) snprintf(name, sizeof(name), "%s", "default"); else { // Count cards and devices card = -1; snd_card_next( &card ); while ( card >= 0 ) { sprintf( name, "hw:%d", card ); result = snd_ctl_open( &chandle, name, SND_CTL_NONBLOCK ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::probeDeviceOpen: control open, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } subdevice = -1; while( 1 ) { result = snd_ctl_pcm_next_device( chandle, &subdevice ); if ( result < 0 ) break; if ( subdevice < 0 ) break; if ( nDevices == device ) { sprintf( name, "hw:%d,%d", card, subdevice ); snd_ctl_close( chandle ); goto foundDevice; } nDevices++; } snd_ctl_close( chandle ); snd_card_next( &card ); } result = snd_ctl_open( &chandle, "default", SND_CTL_NONBLOCK ); if ( result == 0 ) { if ( nDevices == device ) { strcpy( name, "default" ); goto foundDevice; } nDevices++; } if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiAlsa::probeDeviceOpen: no devices found!"; return FAILURE; } if ( device >= nDevices ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiAlsa::probeDeviceOpen: device ID is invalid!"; return FAILURE; } } foundDevice: // The getDeviceInfo() function will not work for a device that is // already open. Thus, we'll probe the system before opening a // stream and save the results for use by getDeviceInfo(). if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) // only do once this->saveDeviceInfo(); snd_pcm_stream_t stream; if ( mode == OUTPUT ) stream = SND_PCM_STREAM_PLAYBACK; else stream = SND_PCM_STREAM_CAPTURE; snd_pcm_t *phandle; int openMode = SND_PCM_ASYNC; result = snd_pcm_open( &phandle, name, stream, openMode ); if ( result < 0 ) { if ( mode == OUTPUT ) errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device (" << name << ") won't open for output."; else errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device (" << name << ") won't open for input."; errorText_ = errorStream_.str(); return FAILURE; } // Fill the parameter structure. snd_pcm_hw_params_t *hw_params; snd_pcm_hw_params_alloca( &hw_params ); result = snd_pcm_hw_params_any( phandle, hw_params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting pcm device (" << name << ") parameters, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf( stderr, "\nRtApiAlsa: dump hardware params just after device open:\n\n" ); snd_pcm_hw_params_dump( hw_params, out ); #endif // Set access ... check user preference. if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) { stream_.userInterleaved = false; result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED ); if ( result < 0 ) { result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ); stream_.deviceInterleaved[mode] = true; } else stream_.deviceInterleaved[mode] = false; } else { stream_.userInterleaved = true; result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ); if ( result < 0 ) { result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED ); stream_.deviceInterleaved[mode] = false; } else stream_.deviceInterleaved[mode] = true; } if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting pcm device (" << name << ") access, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Determine how to set the device format. stream_.userFormat = format; snd_pcm_format_t deviceFormat = SND_PCM_FORMAT_UNKNOWN; if ( format == RTAUDIO_SINT8 ) deviceFormat = SND_PCM_FORMAT_S8; else if ( format == RTAUDIO_SINT16 ) deviceFormat = SND_PCM_FORMAT_S16; else if ( format == RTAUDIO_SINT24 ) deviceFormat = SND_PCM_FORMAT_S24; else if ( format == RTAUDIO_SINT32 ) deviceFormat = SND_PCM_FORMAT_S32; else if ( format == RTAUDIO_FLOAT32 ) deviceFormat = SND_PCM_FORMAT_FLOAT; else if ( format == RTAUDIO_FLOAT64 ) deviceFormat = SND_PCM_FORMAT_FLOAT64; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat) == 0) { stream_.deviceFormat[mode] = format; goto setFormat; } // The user requested format is not natively supported by the device. deviceFormat = SND_PCM_FORMAT_FLOAT64; if ( snd_pcm_hw_params_test_format( phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; goto setFormat; } deviceFormat = SND_PCM_FORMAT_FLOAT; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S32; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT32; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S24; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT24; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S16; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT16; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S8; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT8; goto setFormat; } // If we get here, no supported format was found. snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device " << device << " data format not supported by RtAudio."; errorText_ = errorStream_.str(); return FAILURE; setFormat: result = snd_pcm_hw_params_set_format( phandle, hw_params, deviceFormat ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting pcm device (" << name << ") data format, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Determine whether byte-swaping is necessary. stream_.doByteSwap[mode] = false; if ( deviceFormat != SND_PCM_FORMAT_S8 ) { result = snd_pcm_format_cpu_endian( deviceFormat ); if ( result == 0 ) stream_.doByteSwap[mode] = true; else if (result < 0) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting pcm device (" << name << ") endian-ness, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } } // Set the sample rate. result = snd_pcm_hw_params_set_rate_near( phandle, hw_params, (unsigned int*) &sampleRate, 0 ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting sample rate on device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Determine the number of channels for this device. We support a possible // minimum device channel number > than the value requested by the user. stream_.nUserChannels[mode] = channels; unsigned int value; result = snd_pcm_hw_params_get_channels_max( hw_params, &value ); unsigned int deviceChannels = value; if ( result < 0 || deviceChannels < channels + firstChannel ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: requested channel parameters not supported by device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } result = snd_pcm_hw_params_get_channels_min( hw_params, &value ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting minimum channels for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } deviceChannels = value; if ( deviceChannels < channels + firstChannel ) deviceChannels = channels + firstChannel; stream_.nDeviceChannels[mode] = deviceChannels; // Set the device channels. result = snd_pcm_hw_params_set_channels( phandle, hw_params, deviceChannels ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting channels for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Set the buffer (or period) size. int dir = 0; snd_pcm_uframes_t periodSize = *bufferSize; result = snd_pcm_hw_params_set_period_size_near( phandle, hw_params, &periodSize, &dir ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting period size for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } *bufferSize = periodSize; // Set the buffer number, which in ALSA is referred to as the "period". unsigned int periods = 0; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) periods = 2; if ( options && options->numberOfBuffers > 0 ) periods = options->numberOfBuffers; if ( periods < 2 ) periods = 4; // a fairly safe default value result = snd_pcm_hw_params_set_periods_near( phandle, hw_params, &periods, &dir ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting periods for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // If attempting to setup a duplex stream, the bufferSize parameter // MUST be the same in both directions! if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: system error setting buffer size for duplex stream on device (" << name << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.bufferSize = *bufferSize; // Install the hardware configuration result = snd_pcm_hw_params( phandle, hw_params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error installing hardware configuration on device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtApiAlsa: dump hardware params after installation:\n\n"); snd_pcm_hw_params_dump( hw_params, out ); #endif // Set the software configuration to fill buffers with zeros and prevent device stopping on xruns. snd_pcm_sw_params_t *sw_params = NULL; snd_pcm_sw_params_alloca( &sw_params ); snd_pcm_sw_params_current( phandle, sw_params ); snd_pcm_sw_params_set_start_threshold( phandle, sw_params, *bufferSize ); snd_pcm_sw_params_set_stop_threshold( phandle, sw_params, ULONG_MAX ); snd_pcm_sw_params_set_silence_threshold( phandle, sw_params, 0 ); // The following two settings were suggested by Theo Veenker //snd_pcm_sw_params_set_avail_min( phandle, sw_params, *bufferSize ); //snd_pcm_sw_params_set_xfer_align( phandle, sw_params, 1 ); // here are two options for a fix //snd_pcm_sw_params_set_silence_size( phandle, sw_params, ULONG_MAX ); snd_pcm_uframes_t val; snd_pcm_sw_params_get_boundary( sw_params, &val ); snd_pcm_sw_params_set_silence_size( phandle, sw_params, val ); result = snd_pcm_sw_params( phandle, sw_params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error installing software configuration on device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtApiAlsa: dump software params after installation:\n\n"); snd_pcm_sw_params_dump( sw_params, out ); #endif // Set flags for buffer conversion stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate the ApiHandle if necessary and then save. AlsaHandle *apiInfo = 0; if ( stream_.apiHandle == 0 ) { try { apiInfo = (AlsaHandle *) new AlsaHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating AlsaHandle memory."; goto error; } if ( pthread_cond_init( &apiInfo->runnable_cv, NULL ) ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error initializing pthread condition variable."; goto error; } stream_.apiHandle = (void *) apiInfo; apiInfo->handles[0] = 0; apiInfo->handles[1] = 0; } else { apiInfo = (AlsaHandle *) stream_.apiHandle; } apiInfo->handles[mode] = phandle; phandle = 0; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.sampleRate = sampleRate; stream_.nBuffers = periods; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); // Setup thread if necessary. if ( stream_.mode == OUTPUT && mode == INPUT ) { // We had already set up an output stream. stream_.mode = DUPLEX; // Link the streams if possible. apiInfo->synchronized = false; if ( snd_pcm_link( apiInfo->handles[0], apiInfo->handles[1] ) == 0 ) apiInfo->synchronized = true; else { errorText_ = "RtApiAlsa::probeDeviceOpen: unable to synchronize input and output devices."; error( RtAudioError::WARNING ); } } else { stream_.mode = mode; // Setup callback thread. stream_.callbackInfo.object = (void *) this; // Set the thread attributes for joinable and realtime scheduling // priority (optional). The higher priority will only take affect // if the program is run as root or suid. Note, under Linux // processes with CAP_SYS_NICE privilege, a user can change // scheduling policy and priority (thus need not be root). See // POSIX "capabilities". pthread_attr_t attr; pthread_attr_init( &attr ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); #ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) { // We previously attempted to increase the audio callback priority // to SCHED_RR here via the attributes. However, while no errors // were reported in doing so, it did not work. So, now this is // done in the alsaCallbackHandler function. stream_.callbackInfo.doRealtime = true; int priority = options->priority; int min = sched_get_priority_min( SCHED_RR ); int max = sched_get_priority_max( SCHED_RR ); if ( priority < min ) priority = min; else if ( priority > max ) priority = max; stream_.callbackInfo.priority = priority; } #endif stream_.callbackInfo.isRunning = true; result = pthread_create( &stream_.callbackInfo.thread, &attr, alsaCallbackHandler, &stream_.callbackInfo ); pthread_attr_destroy( &attr ); if ( result ) { stream_.callbackInfo.isRunning = false; errorText_ = "RtApiAlsa::error creating callback thread!"; goto error; } } return SUCCESS; error: if ( apiInfo ) { pthread_cond_destroy( &apiInfo->runnable_cv ); if ( apiInfo->handles[0] ) snd_pcm_close( apiInfo->handles[0] ); if ( apiInfo->handles[1] ) snd_pcm_close( apiInfo->handles[1] ); delete apiInfo; stream_.apiHandle = 0; } if ( phandle) snd_pcm_close( phandle ); for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.state = STREAM_CLOSED; return FAILURE; } void RtApiAlsa :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAlsa::closeStream(): no open stream to close!"; error( RtAudioError::WARNING ); return; } AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; stream_.callbackInfo.isRunning = false; MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) { apiInfo->runnable = true; pthread_cond_signal( &apiInfo->runnable_cv ); } MUTEX_UNLOCK( &stream_.mutex ); pthread_join( stream_.callbackInfo.thread, NULL ); if ( stream_.state == STREAM_RUNNING ) { stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) snd_pcm_drop( apiInfo->handles[0] ); if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) snd_pcm_drop( apiInfo->handles[1] ); } if ( apiInfo ) { pthread_cond_destroy( &apiInfo->runnable_cv ); if ( apiInfo->handles[0] ) snd_pcm_close( apiInfo->handles[0] ); if ( apiInfo->handles[1] ) snd_pcm_close( apiInfo->handles[1] ); delete apiInfo; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiAlsa :: startStream() { // This method calls snd_pcm_prepare if the device isn't already in that state. verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiAlsa::startStream(): the stream is already running!"; error( RtAudioError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); int result = 0; snd_pcm_state_t state; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { state = snd_pcm_state( handle[0] ); if ( state != SND_PCM_STATE_PREPARED ) { result = snd_pcm_prepare( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::startStream: error preparing output pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } } if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { result = snd_pcm_drop(handle[1]); // fix to remove stale data received since device has been open state = snd_pcm_state( handle[1] ); if ( state != SND_PCM_STATE_PREPARED ) { result = snd_pcm_prepare( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::startStream: error preparing input pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } } stream_.state = STREAM_RUNNING; unlock: apiInfo->runnable = true; pthread_cond_signal( &apiInfo->runnable_cv ); MUTEX_UNLOCK( &stream_.mutex ); if ( result >= 0 ) return; error( RtAudioError::SYSTEM_ERROR ); } void RtApiAlsa :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAlsa::stopStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); int result = 0; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( apiInfo->synchronized ) result = snd_pcm_drop( handle[0] ); else result = snd_pcm_drain( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::stopStream: error draining output pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { result = snd_pcm_drop( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::stopStream: error stopping input pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } unlock: apiInfo->runnable = false; // fixes high CPU usage when stopped MUTEX_UNLOCK( &stream_.mutex ); if ( result >= 0 ) return; error( RtAudioError::SYSTEM_ERROR ); } void RtApiAlsa :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAlsa::abortStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); int result = 0; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = snd_pcm_drop( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::abortStream: error aborting output pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { result = snd_pcm_drop( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::abortStream: error aborting input pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } unlock: apiInfo->runnable = false; // fixes high CPU usage when stopped MUTEX_UNLOCK( &stream_.mutex ); if ( result >= 0 ) return; error( RtAudioError::SYSTEM_ERROR ); } void RtApiAlsa :: callbackEvent() { AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; if ( stream_.state == STREAM_STOPPED ) { MUTEX_LOCK( &stream_.mutex ); while ( !apiInfo->runnable ) pthread_cond_wait( &apiInfo->runnable_cv, &stream_.mutex ); if ( stream_.state != STREAM_RUNNING ) { MUTEX_UNLOCK( &stream_.mutex ); return; } MUTEX_UNLOCK( &stream_.mutex ); } if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAlsa::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtAudioError::WARNING ); return; } int doStopStream = 0; RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && apiInfo->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; apiInfo->xrun[0] = false; } if ( stream_.mode != OUTPUT && apiInfo->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; apiInfo->xrun[1] = false; } doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); if ( doStopStream == 2 ) { abortStream(); return; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) goto unlock; int result; char *buffer; int channels; snd_pcm_t **handle; snd_pcm_sframes_t frames; RtAudioFormat format; handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { // Setup parameters. if ( stream_.doConvertBuffer[1] ) { buffer = stream_.deviceBuffer; channels = stream_.nDeviceChannels[1]; format = stream_.deviceFormat[1]; } else { buffer = stream_.userBuffer[1]; channels = stream_.nUserChannels[1]; format = stream_.userFormat; } // Read samples from device in interleaved/non-interleaved format. if ( stream_.deviceInterleaved[1] ) result = snd_pcm_readi( handle[1], buffer, stream_.bufferSize ); else { void *bufs[channels]; size_t offset = stream_.bufferSize * formatBytes( format ); for ( int i=0; ixrun[1] = true; result = snd_pcm_prepare( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::callbackEvent: error preparing device after overrun, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: error, current state is " << snd_pcm_state_name( state ) << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: audio read error, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } error( RtAudioError::WARNING ); goto tryOutput; } // Do byte swapping if necessary. if ( stream_.doByteSwap[1] ) byteSwapBuffer( buffer, stream_.bufferSize * channels, format ); // Do buffer conversion if necessary. if ( stream_.doConvertBuffer[1] ) convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); // Check stream latency result = snd_pcm_delay( handle[1], &frames ); if ( result == 0 && frames > 0 ) stream_.latency[1] = frames; } tryOutput: if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { // Setup parameters and do buffer conversion if necessary. if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); channels = stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { buffer = stream_.userBuffer[0]; channels = stream_.nUserChannels[0]; format = stream_.userFormat; } // Do byte swapping if necessary. if ( stream_.doByteSwap[0] ) byteSwapBuffer(buffer, stream_.bufferSize * channels, format); // Write samples to device in interleaved/non-interleaved format. if ( stream_.deviceInterleaved[0] ) result = snd_pcm_writei( handle[0], buffer, stream_.bufferSize ); else { void *bufs[channels]; size_t offset = stream_.bufferSize * formatBytes( format ); for ( int i=0; ixrun[0] = true; result = snd_pcm_prepare( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::callbackEvent: error preparing device after underrun, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: error, current state is " << snd_pcm_state_name( state ) << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: audio write error, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } error( RtAudioError::WARNING ); goto unlock; } // Check stream latency result = snd_pcm_delay( handle[0], &frames ); if ( result == 0 && frames > 0 ) stream_.latency[0] = frames; } unlock: MUTEX_UNLOCK( &stream_.mutex ); RtApi::tickStreamTime(); if ( doStopStream == 1 ) this->stopStream(); } static void *alsaCallbackHandler( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiAlsa *object = (RtApiAlsa *) info->object; bool *isRunning = &info->isRunning; #ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) if ( &info->doRealtime ) { pthread_t tID = pthread_self(); // ID of this thread sched_param prio = { info->priority }; // scheduling priority of thread pthread_setschedparam( tID, SCHED_RR, &prio ); } #endif while ( *isRunning == true ) { pthread_testcancel(); object->callbackEvent(); } pthread_exit( NULL ); } //******************** End of __LINUX_ALSA__ *********************// #endif #if defined(__LINUX_PULSE__) // Code written by Peter Meerwald, pmeerw@pmeerw.net // and Tristan Matthews. #include #include #include static const unsigned int SUPPORTED_SAMPLERATES[] = { 8000, 16000, 22050, 32000, 44100, 48000, 96000, 0}; struct rtaudio_pa_format_mapping_t { RtAudioFormat rtaudio_format; pa_sample_format_t pa_format; }; static const rtaudio_pa_format_mapping_t supported_sampleformats[] = { {RTAUDIO_SINT16, PA_SAMPLE_S16LE}, {RTAUDIO_SINT32, PA_SAMPLE_S32LE}, {RTAUDIO_FLOAT32, PA_SAMPLE_FLOAT32LE}, {0, PA_SAMPLE_INVALID}}; struct PulseAudioHandle { pa_simple *s_play; pa_simple *s_rec; pthread_t thread; pthread_cond_t runnable_cv; bool runnable; PulseAudioHandle() : s_play(0), s_rec(0), runnable(false) { } }; RtApiPulse::~RtApiPulse() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiPulse::getDeviceCount( void ) { return 1; } RtAudio::DeviceInfo RtApiPulse::getDeviceInfo( unsigned int /*device*/ ) { RtAudio::DeviceInfo info; info.probed = true; info.name = "PulseAudio"; info.outputChannels = 2; info.inputChannels = 2; info.duplexChannels = 2; info.isDefaultOutput = true; info.isDefaultInput = true; for ( const unsigned int *sr = SUPPORTED_SAMPLERATES; *sr; ++sr ) info.sampleRates.push_back( *sr ); info.nativeFormats = RTAUDIO_SINT16 | RTAUDIO_SINT32 | RTAUDIO_FLOAT32; return info; } static void *pulseaudio_callback( void * user ) { CallbackInfo *cbi = static_cast( user ); RtApiPulse *context = static_cast( cbi->object ); volatile bool *isRunning = &cbi->isRunning; while ( *isRunning ) { pthread_testcancel(); context->callbackEvent(); } pthread_exit( NULL ); } void RtApiPulse::closeStream( void ) { PulseAudioHandle *pah = static_cast( stream_.apiHandle ); stream_.callbackInfo.isRunning = false; if ( pah ) { MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) { pah->runnable = true; pthread_cond_signal( &pah->runnable_cv ); } MUTEX_UNLOCK( &stream_.mutex ); pthread_join( pah->thread, 0 ); if ( pah->s_play ) { pa_simple_flush( pah->s_play, NULL ); pa_simple_free( pah->s_play ); } if ( pah->s_rec ) pa_simple_free( pah->s_rec ); pthread_cond_destroy( &pah->runnable_cv ); delete pah; stream_.apiHandle = 0; } if ( stream_.userBuffer[0] ) { free( stream_.userBuffer[0] ); stream_.userBuffer[0] = 0; } if ( stream_.userBuffer[1] ) { free( stream_.userBuffer[1] ); stream_.userBuffer[1] = 0; } stream_.state = STREAM_CLOSED; stream_.mode = UNINITIALIZED; } void RtApiPulse::callbackEvent( void ) { PulseAudioHandle *pah = static_cast( stream_.apiHandle ); if ( stream_.state == STREAM_STOPPED ) { MUTEX_LOCK( &stream_.mutex ); while ( !pah->runnable ) pthread_cond_wait( &pah->runnable_cv, &stream_.mutex ); if ( stream_.state != STREAM_RUNNING ) { MUTEX_UNLOCK( &stream_.mutex ); return; } MUTEX_UNLOCK( &stream_.mutex ); } if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiPulse::callbackEvent(): the stream is closed ... " "this shouldn't happen!"; error( RtAudioError::WARNING ); return; } RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; int doStopStream = callback( stream_.userBuffer[OUTPUT], stream_.userBuffer[INPUT], stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); if ( doStopStream == 2 ) { abortStream(); return; } MUTEX_LOCK( &stream_.mutex ); void *pulse_in = stream_.doConvertBuffer[INPUT] ? stream_.deviceBuffer : stream_.userBuffer[INPUT]; void *pulse_out = stream_.doConvertBuffer[OUTPUT] ? stream_.deviceBuffer : stream_.userBuffer[OUTPUT]; if ( stream_.state != STREAM_RUNNING ) goto unlock; int pa_error; size_t bytes; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( stream_.doConvertBuffer[OUTPUT] ) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer[OUTPUT], stream_.convertInfo[OUTPUT] ); bytes = stream_.nDeviceChannels[OUTPUT] * stream_.bufferSize * formatBytes( stream_.deviceFormat[OUTPUT] ); } else bytes = stream_.nUserChannels[OUTPUT] * stream_.bufferSize * formatBytes( stream_.userFormat ); if ( pa_simple_write( pah->s_play, pulse_out, bytes, &pa_error ) < 0 ) { errorStream_ << "RtApiPulse::callbackEvent: audio write error, " << pa_strerror( pa_error ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX) { if ( stream_.doConvertBuffer[INPUT] ) bytes = stream_.nDeviceChannels[INPUT] * stream_.bufferSize * formatBytes( stream_.deviceFormat[INPUT] ); else bytes = stream_.nUserChannels[INPUT] * stream_.bufferSize * formatBytes( stream_.userFormat ); if ( pa_simple_read( pah->s_rec, pulse_in, bytes, &pa_error ) < 0 ) { errorStream_ << "RtApiPulse::callbackEvent: audio read error, " << pa_strerror( pa_error ) << "."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); } if ( stream_.doConvertBuffer[INPUT] ) { convertBuffer( stream_.userBuffer[INPUT], stream_.deviceBuffer, stream_.convertInfo[INPUT] ); } } unlock: MUTEX_UNLOCK( &stream_.mutex ); RtApi::tickStreamTime(); if ( doStopStream == 1 ) stopStream(); } void RtApiPulse::startStream( void ) { PulseAudioHandle *pah = static_cast( stream_.apiHandle ); if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiPulse::startStream(): the stream is not open!"; error( RtAudioError::INVALID_USE ); return; } if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiPulse::startStream(): the stream is already running!"; error( RtAudioError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); stream_.state = STREAM_RUNNING; pah->runnable = true; pthread_cond_signal( &pah->runnable_cv ); MUTEX_UNLOCK( &stream_.mutex ); } void RtApiPulse::stopStream( void ) { PulseAudioHandle *pah = static_cast( stream_.apiHandle ); if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiPulse::stopStream(): the stream is not open!"; error( RtAudioError::INVALID_USE ); return; } if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiPulse::stopStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); if ( pah && pah->s_play ) { int pa_error; if ( pa_simple_drain( pah->s_play, &pa_error ) < 0 ) { errorStream_ << "RtApiPulse::stopStream: error draining output device, " << pa_strerror( pa_error ) << "."; errorText_ = errorStream_.str(); MUTEX_UNLOCK( &stream_.mutex ); error( RtAudioError::SYSTEM_ERROR ); return; } } stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); } void RtApiPulse::abortStream( void ) { PulseAudioHandle *pah = static_cast( stream_.apiHandle ); if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiPulse::abortStream(): the stream is not open!"; error( RtAudioError::INVALID_USE ); return; } if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiPulse::abortStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); if ( pah && pah->s_play ) { int pa_error; if ( pa_simple_flush( pah->s_play, &pa_error ) < 0 ) { errorStream_ << "RtApiPulse::abortStream: error flushing output device, " << pa_strerror( pa_error ) << "."; errorText_ = errorStream_.str(); MUTEX_UNLOCK( &stream_.mutex ); error( RtAudioError::SYSTEM_ERROR ); return; } } stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); } bool RtApiPulse::probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { PulseAudioHandle *pah = 0; unsigned long bufferBytes = 0; pa_sample_spec ss; if ( device != 0 ) return false; if ( mode != INPUT && mode != OUTPUT ) return false; if ( channels != 1 && channels != 2 ) { errorText_ = "RtApiPulse::probeDeviceOpen: unsupported number of channels."; return false; } ss.channels = channels; if ( firstChannel != 0 ) return false; bool sr_found = false; for ( const unsigned int *sr = SUPPORTED_SAMPLERATES; *sr; ++sr ) { if ( sampleRate == *sr ) { sr_found = true; stream_.sampleRate = sampleRate; ss.rate = sampleRate; break; } } if ( !sr_found ) { errorText_ = "RtApiPulse::probeDeviceOpen: unsupported sample rate."; return false; } bool sf_found = 0; for ( const rtaudio_pa_format_mapping_t *sf = supported_sampleformats; sf->rtaudio_format && sf->pa_format != PA_SAMPLE_INVALID; ++sf ) { if ( format == sf->rtaudio_format ) { sf_found = true; stream_.userFormat = sf->rtaudio_format; stream_.deviceFormat[mode] = stream_.userFormat; ss.format = sf->pa_format; break; } } if ( !sf_found ) { // Use internal data format conversion. stream_.userFormat = format; stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; ss.format = PA_SAMPLE_FLOAT32LE; } // Set other stream parameters. if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; stream_.deviceInterleaved[mode] = true; stream_.nBuffers = 1; stream_.doByteSwap[mode] = false; stream_.nUserChannels[mode] = channels; stream_.nDeviceChannels[mode] = channels + firstChannel; stream_.channelOffset[mode] = 0; std::string streamName = "RtAudio"; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers. bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiPulse::probeDeviceOpen: error allocating user buffer memory."; goto error; } stream_.bufferSize = *bufferSize; if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiPulse::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.device[mode] = device; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); if ( !stream_.apiHandle ) { PulseAudioHandle *pah = new PulseAudioHandle; if ( !pah ) { errorText_ = "RtApiPulse::probeDeviceOpen: error allocating memory for handle."; goto error; } stream_.apiHandle = pah; if ( pthread_cond_init( &pah->runnable_cv, NULL ) != 0 ) { errorText_ = "RtApiPulse::probeDeviceOpen: error creating condition variable."; goto error; } } pah = static_cast( stream_.apiHandle ); int error; if ( !options->streamName.empty() ) streamName = options->streamName; switch ( mode ) { case INPUT: pa_buffer_attr buffer_attr; buffer_attr.fragsize = bufferBytes; buffer_attr.maxlength = -1; pah->s_rec = pa_simple_new( NULL, streamName.c_str(), PA_STREAM_RECORD, NULL, "Record", &ss, NULL, &buffer_attr, &error ); if ( !pah->s_rec ) { errorText_ = "RtApiPulse::probeDeviceOpen: error connecting input to PulseAudio server."; goto error; } break; case OUTPUT: pah->s_play = pa_simple_new( NULL, "RtAudio", PA_STREAM_PLAYBACK, NULL, "Playback", &ss, NULL, NULL, &error ); if ( !pah->s_play ) { errorText_ = "RtApiPulse::probeDeviceOpen: error connecting output to PulseAudio server."; goto error; } break; default: goto error; } if ( stream_.mode == UNINITIALIZED ) stream_.mode = mode; else if ( stream_.mode == mode ) goto error; else stream_.mode = DUPLEX; if ( !stream_.callbackInfo.isRunning ) { stream_.callbackInfo.object = this; stream_.callbackInfo.isRunning = true; if ( pthread_create( &pah->thread, NULL, pulseaudio_callback, (void *)&stream_.callbackInfo) != 0 ) { errorText_ = "RtApiPulse::probeDeviceOpen: error creating thread."; goto error; } } stream_.state = STREAM_STOPPED; return true; error: if ( pah && stream_.callbackInfo.isRunning ) { pthread_cond_destroy( &pah->runnable_cv ); delete pah; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } //******************** End of __LINUX_PULSE__ *********************// #endif #if defined(__LINUX_OSS__) #include #include #include #include #include #include #include static void *ossCallbackHandler(void * ptr); // A structure to hold various information related to the OSS API // implementation. struct OssHandle { int id[2]; // device ids bool xrun[2]; bool triggered; pthread_cond_t runnable; OssHandle() :triggered(false) { id[0] = 0; id[1] = 0; xrun[0] = false; xrun[1] = false; } }; RtApiOss :: RtApiOss() { // Nothing to do here. } RtApiOss :: ~RtApiOss() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiOss :: getDeviceCount( void ) { int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); if ( mixerfd == -1 ) { errorText_ = "RtApiOss::getDeviceCount: error opening '/dev/mixer'."; error( RtAudioError::WARNING ); return 0; } oss_sysinfo sysinfo; if ( ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ) == -1 ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceCount: error getting sysinfo, OSS version >= 4.0 is required."; error( RtAudioError::WARNING ); return 0; } close( mixerfd ); return sysinfo.numaudios; } RtAudio::DeviceInfo RtApiOss :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); if ( mixerfd == -1 ) { errorText_ = "RtApiOss::getDeviceInfo: error opening '/dev/mixer'."; error( RtAudioError::WARNING ); return info; } oss_sysinfo sysinfo; int result = ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ); if ( result == -1 ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceInfo: error getting sysinfo, OSS version >= 4.0 is required."; error( RtAudioError::WARNING ); return info; } unsigned nDevices = sysinfo.numaudios; if ( nDevices == 0 ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceInfo: no devices found!"; error( RtAudioError::INVALID_USE ); return info; } if ( device >= nDevices ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceInfo: device ID is invalid!"; error( RtAudioError::INVALID_USE ); return info; } oss_audioinfo ainfo; ainfo.dev = device; result = ioctl( mixerfd, SNDCTL_AUDIOINFO, &ainfo ); close( mixerfd ); if ( result == -1 ) { errorStream_ << "RtApiOss::getDeviceInfo: error getting device (" << ainfo.name << ") info."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // Probe channels if ( ainfo.caps & PCM_CAP_OUTPUT ) info.outputChannels = ainfo.max_channels; if ( ainfo.caps & PCM_CAP_INPUT ) info.inputChannels = ainfo.max_channels; if ( ainfo.caps & PCM_CAP_DUPLEX ) { if ( info.outputChannels > 0 && info.inputChannels > 0 && ainfo.caps & PCM_CAP_DUPLEX ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; } // Probe data formats ... do for input unsigned long mask = ainfo.iformats; if ( mask & AFMT_S16_LE || mask & AFMT_S16_BE ) info.nativeFormats |= RTAUDIO_SINT16; if ( mask & AFMT_S8 ) info.nativeFormats |= RTAUDIO_SINT8; if ( mask & AFMT_S32_LE || mask & AFMT_S32_BE ) info.nativeFormats |= RTAUDIO_SINT32; if ( mask & AFMT_FLOAT ) info.nativeFormats |= RTAUDIO_FLOAT32; if ( mask & AFMT_S24_LE || mask & AFMT_S24_BE ) info.nativeFormats |= RTAUDIO_SINT24; // Check that we have at least one supported format if ( info.nativeFormats == 0 ) { errorStream_ << "RtApiOss::getDeviceInfo: device (" << ainfo.name << ") data format not supported by RtAudio."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); return info; } // Probe the supported sample rates. info.sampleRates.clear(); if ( ainfo.nrates ) { for ( unsigned int i=0; i= (int) SAMPLE_RATES[k] ) info.sampleRates.push_back( SAMPLE_RATES[k] ); } } if ( info.sampleRates.size() == 0 ) { errorStream_ << "RtApiOss::getDeviceInfo: no supported sample rates found for device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); error( RtAudioError::WARNING ); } else { info.probed = true; info.name = ainfo.name; } return info; } bool RtApiOss :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); if ( mixerfd == -1 ) { errorText_ = "RtApiOss::probeDeviceOpen: error opening '/dev/mixer'."; return FAILURE; } oss_sysinfo sysinfo; int result = ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ); if ( result == -1 ) { close( mixerfd ); errorText_ = "RtApiOss::probeDeviceOpen: error getting sysinfo, OSS version >= 4.0 is required."; return FAILURE; } unsigned nDevices = sysinfo.numaudios; if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. close( mixerfd ); errorText_ = "RtApiOss::probeDeviceOpen: no devices found!"; return FAILURE; } if ( device >= nDevices ) { // This should not happen because a check is made before this function is called. close( mixerfd ); errorText_ = "RtApiOss::probeDeviceOpen: device ID is invalid!"; return FAILURE; } oss_audioinfo ainfo; ainfo.dev = device; result = ioctl( mixerfd, SNDCTL_AUDIOINFO, &ainfo ); close( mixerfd ); if ( result == -1 ) { errorStream_ << "RtApiOss::getDeviceInfo: error getting device (" << ainfo.name << ") info."; errorText_ = errorStream_.str(); return FAILURE; } // Check if device supports input or output if ( ( mode == OUTPUT && !( ainfo.caps & PCM_CAP_OUTPUT ) ) || ( mode == INPUT && !( ainfo.caps & PCM_CAP_INPUT ) ) ) { if ( mode == OUTPUT ) errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support output."; else errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support input."; errorText_ = errorStream_.str(); return FAILURE; } int flags = 0; OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( mode == OUTPUT ) flags |= O_WRONLY; else { // mode == INPUT if (stream_.mode == OUTPUT && stream_.device[0] == device) { // We just set the same device for playback ... close and reopen for duplex (OSS only). close( handle->id[0] ); handle->id[0] = 0; if ( !( ainfo.caps & PCM_CAP_DUPLEX ) ) { errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support duplex mode."; errorText_ = errorStream_.str(); return FAILURE; } // Check that the number previously set channels is the same. if ( stream_.nUserChannels[0] != channels ) { errorStream_ << "RtApiOss::probeDeviceOpen: input/output channels must be equal for OSS duplex device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } flags |= O_RDWR; } else flags |= O_RDONLY; } // Set exclusive access if specified. if ( options && options->flags & RTAUDIO_HOG_DEVICE ) flags |= O_EXCL; // Try to open the device. int fd; fd = open( ainfo.devnode, flags, 0 ); if ( fd == -1 ) { if ( errno == EBUSY ) errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") is busy."; else errorStream_ << "RtApiOss::probeDeviceOpen: error opening device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } // For duplex operation, specifically set this mode (this doesn't seem to work). /* if ( flags | O_RDWR ) { result = ioctl( fd, SNDCTL_DSP_SETDUPLEX, NULL ); if ( result == -1) { errorStream_ << "RtApiOss::probeDeviceOpen: error setting duplex mode for device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } } */ // Check the device channel support. stream_.nUserChannels[mode] = channels; if ( ainfo.max_channels < (int)(channels + firstChannel) ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: the device (" << ainfo.name << ") does not support requested channel parameters."; errorText_ = errorStream_.str(); return FAILURE; } // Set the number of channels. int deviceChannels = channels + firstChannel; result = ioctl( fd, SNDCTL_DSP_CHANNELS, &deviceChannels ); if ( result == -1 || deviceChannels < (int)(channels + firstChannel) ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting channel parameters on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.nDeviceChannels[mode] = deviceChannels; // Get the data format mask int mask; result = ioctl( fd, SNDCTL_DSP_GETFMTS, &mask ); if ( result == -1 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error getting device (" << ainfo.name << ") data formats."; errorText_ = errorStream_.str(); return FAILURE; } // Determine how to set the device format. stream_.userFormat = format; int deviceFormat = -1; stream_.doByteSwap[mode] = false; if ( format == RTAUDIO_SINT8 ) { if ( mask & AFMT_S8 ) { deviceFormat = AFMT_S8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } } else if ( format == RTAUDIO_SINT16 ) { if ( mask & AFMT_S16_NE ) { deviceFormat = AFMT_S16_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } else if ( mask & AFMT_S16_OE ) { deviceFormat = AFMT_S16_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.doByteSwap[mode] = true; } } else if ( format == RTAUDIO_SINT24 ) { if ( mask & AFMT_S24_NE ) { deviceFormat = AFMT_S24_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; } else if ( mask & AFMT_S24_OE ) { deviceFormat = AFMT_S24_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; stream_.doByteSwap[mode] = true; } } else if ( format == RTAUDIO_SINT32 ) { if ( mask & AFMT_S32_NE ) { deviceFormat = AFMT_S32_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; } else if ( mask & AFMT_S32_OE ) { deviceFormat = AFMT_S32_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; stream_.doByteSwap[mode] = true; } } if ( deviceFormat == -1 ) { // The user requested format is not natively supported by the device. if ( mask & AFMT_S16_NE ) { deviceFormat = AFMT_S16_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } else if ( mask & AFMT_S32_NE ) { deviceFormat = AFMT_S32_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; } else if ( mask & AFMT_S24_NE ) { deviceFormat = AFMT_S24_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; } else if ( mask & AFMT_S16_OE ) { deviceFormat = AFMT_S16_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.doByteSwap[mode] = true; } else if ( mask & AFMT_S32_OE ) { deviceFormat = AFMT_S32_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; stream_.doByteSwap[mode] = true; } else if ( mask & AFMT_S24_OE ) { deviceFormat = AFMT_S24_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; stream_.doByteSwap[mode] = true; } else if ( mask & AFMT_S8) { deviceFormat = AFMT_S8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } } if ( stream_.deviceFormat[mode] == 0 ) { // This really shouldn't happen ... close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") data format not supported by RtAudio."; errorText_ = errorStream_.str(); return FAILURE; } // Set the data format. int temp = deviceFormat; result = ioctl( fd, SNDCTL_DSP_SETFMT, &deviceFormat ); if ( result == -1 || deviceFormat != temp ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting data format on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Attempt to set the buffer size. According to OSS, the minimum // number of buffers is two. The supposed minimum buffer size is 16 // bytes, so that will be our lower bound. The argument to this // call is in the form 0xMMMMSSSS (hex), where the buffer size (in // bytes) is given as 2^SSSS and the number of buffers as 2^MMMM. // We'll check the actual value used near the end of the setup // procedure. int ossBufferBytes = *bufferSize * formatBytes( stream_.deviceFormat[mode] ) * deviceChannels; if ( ossBufferBytes < 16 ) ossBufferBytes = 16; int buffers = 0; if ( options ) buffers = options->numberOfBuffers; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) buffers = 2; if ( buffers < 2 ) buffers = 3; temp = ((int) buffers << 16) + (int)( log10( (double)ossBufferBytes ) / log10( 2.0 ) ); result = ioctl( fd, SNDCTL_DSP_SETFRAGMENT, &temp ); if ( result == -1 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting buffer size on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.nBuffers = buffers; // Save buffer size (in sample frames). *bufferSize = ossBufferBytes / ( formatBytes(stream_.deviceFormat[mode]) * deviceChannels ); stream_.bufferSize = *bufferSize; // Set the sample rate. int srate = sampleRate; result = ioctl( fd, SNDCTL_DSP_SPEED, &srate ); if ( result == -1 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting sample rate (" << sampleRate << ") on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Verify the sample rate setup worked. if ( abs( srate - sampleRate ) > 100 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support sample rate (" << sampleRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.sampleRate = sampleRate; if ( mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] == device) { // We're doing duplex setup here. stream_.deviceFormat[0] = stream_.deviceFormat[1]; stream_.nDeviceChannels[0] = deviceChannels; } // Set interleaving parameters. stream_.userInterleaved = true; stream_.deviceInterleaved[mode] = true; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; // Set flags for buffer conversion stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate the stream handles if necessary and then save. if ( stream_.apiHandle == 0 ) { try { handle = new OssHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiOss::probeDeviceOpen: error allocating OssHandle memory."; goto error; } if ( pthread_cond_init( &handle->runnable, NULL ) ) { errorText_ = "RtApiOss::probeDeviceOpen: error initializing pthread condition variable."; goto error; } stream_.apiHandle = (void *) handle; } else { handle = (OssHandle *) stream_.apiHandle; } handle->id[mode] = fd; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiOss::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiOss::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.device[mode] = device; stream_.state = STREAM_STOPPED; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); // Setup thread if necessary. if ( stream_.mode == OUTPUT && mode == INPUT ) { // We had already set up an output stream. stream_.mode = DUPLEX; if ( stream_.device[0] == device ) handle->id[0] = fd; } else { stream_.mode = mode; // Setup callback thread. stream_.callbackInfo.object = (void *) this; // Set the thread attributes for joinable and realtime scheduling // priority. The higher priority will only take affect if the // program is run as root or suid. pthread_attr_t attr; pthread_attr_init( &attr ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); #ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) { struct sched_param param; int priority = options->priority; int min = sched_get_priority_min( SCHED_RR ); int max = sched_get_priority_max( SCHED_RR ); if ( priority < min ) priority = min; else if ( priority > max ) priority = max; param.sched_priority = priority; pthread_attr_setschedparam( &attr, ¶m ); pthread_attr_setschedpolicy( &attr, SCHED_RR ); } else pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); #else pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); #endif stream_.callbackInfo.isRunning = true; result = pthread_create( &stream_.callbackInfo.thread, &attr, ossCallbackHandler, &stream_.callbackInfo ); pthread_attr_destroy( &attr ); if ( result ) { stream_.callbackInfo.isRunning = false; errorText_ = "RtApiOss::error creating callback thread!"; goto error; } } return SUCCESS; error: if ( handle ) { pthread_cond_destroy( &handle->runnable ); if ( handle->id[0] ) close( handle->id[0] ); if ( handle->id[1] ) close( handle->id[1] ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiOss :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiOss::closeStream(): no open stream to close!"; error( RtAudioError::WARNING ); return; } OssHandle *handle = (OssHandle *) stream_.apiHandle; stream_.callbackInfo.isRunning = false; MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) pthread_cond_signal( &handle->runnable ); MUTEX_UNLOCK( &stream_.mutex ); pthread_join( stream_.callbackInfo.thread, NULL ); if ( stream_.state == STREAM_RUNNING ) { if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); else ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); stream_.state = STREAM_STOPPED; } if ( handle ) { pthread_cond_destroy( &handle->runnable ); if ( handle->id[0] ) close( handle->id[0] ); if ( handle->id[1] ) close( handle->id[1] ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiOss :: startStream() { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiOss::startStream(): the stream is already running!"; error( RtAudioError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); stream_.state = STREAM_RUNNING; // No need to do anything else here ... OSS automatically starts // when fed samples. MUTEX_UNLOCK( &stream_.mutex ); OssHandle *handle = (OssHandle *) stream_.apiHandle; pthread_cond_signal( &handle->runnable ); } void RtApiOss :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiOss::stopStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } int result = 0; OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { // Flush the output with zeros a few times. char *buffer; int samples; RtAudioFormat format; if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; samples = stream_.bufferSize * stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { buffer = stream_.userBuffer[0]; samples = stream_.bufferSize * stream_.nUserChannels[0]; format = stream_.userFormat; } memset( buffer, 0, samples * formatBytes(format) ); for ( unsigned int i=0; iid[0], buffer, samples * formatBytes(format) ); if ( result == -1 ) { errorText_ = "RtApiOss::stopStream: audio write error."; error( RtAudioError::WARNING ); } } result = ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::stopStream: system error stopping callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } handle->triggered = false; } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && handle->id[0] != handle->id[1] ) ) { result = ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::stopStream: system error stopping input callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } unlock: stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); if ( result != -1 ) return; error( RtAudioError::SYSTEM_ERROR ); } void RtApiOss :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiOss::abortStream(): the stream is already stopped!"; error( RtAudioError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } int result = 0; OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::abortStream: system error stopping callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } handle->triggered = false; } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && handle->id[0] != handle->id[1] ) ) { result = ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::abortStream: system error stopping input callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } unlock: stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); if ( result != -1 ) return; error( RtAudioError::SYSTEM_ERROR ); } void RtApiOss :: callbackEvent() { OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( stream_.state == STREAM_STOPPED ) { MUTEX_LOCK( &stream_.mutex ); pthread_cond_wait( &handle->runnable, &stream_.mutex ); if ( stream_.state != STREAM_RUNNING ) { MUTEX_UNLOCK( &stream_.mutex ); return; } MUTEX_UNLOCK( &stream_.mutex ); } if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiOss::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtAudioError::WARNING ); return; } // Invoke user callback to get fresh output data. int doStopStream = 0; RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); if ( doStopStream == 2 ) { this->abortStream(); return; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) goto unlock; int result; char *buffer; int samples; RtAudioFormat format; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { // Setup parameters and do buffer conversion if necessary. if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); samples = stream_.bufferSize * stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { buffer = stream_.userBuffer[0]; samples = stream_.bufferSize * stream_.nUserChannels[0]; format = stream_.userFormat; } // Do byte swapping if necessary. if ( stream_.doByteSwap[0] ) byteSwapBuffer( buffer, samples, format ); if ( stream_.mode == DUPLEX && handle->triggered == false ) { int trig = 0; ioctl( handle->id[0], SNDCTL_DSP_SETTRIGGER, &trig ); result = write( handle->id[0], buffer, samples * formatBytes(format) ); trig = PCM_ENABLE_INPUT|PCM_ENABLE_OUTPUT; ioctl( handle->id[0], SNDCTL_DSP_SETTRIGGER, &trig ); handle->triggered = true; } else // Write samples to device. result = write( handle->id[0], buffer, samples * formatBytes(format) ); if ( result == -1 ) { // We'll assume this is an underrun, though there isn't a // specific means for determining that. handle->xrun[0] = true; errorText_ = "RtApiOss::callbackEvent: audio write error."; error( RtAudioError::WARNING ); // Continue on to input section. } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { // Setup parameters. if ( stream_.doConvertBuffer[1] ) { buffer = stream_.deviceBuffer; samples = stream_.bufferSize * stream_.nDeviceChannels[1]; format = stream_.deviceFormat[1]; } else { buffer = stream_.userBuffer[1]; samples = stream_.bufferSize * stream_.nUserChannels[1]; format = stream_.userFormat; } // Read samples from device. result = read( handle->id[1], buffer, samples * formatBytes(format) ); if ( result == -1 ) { // We'll assume this is an overrun, though there isn't a // specific means for determining that. handle->xrun[1] = true; errorText_ = "RtApiOss::callbackEvent: audio read error."; error( RtAudioError::WARNING ); goto unlock; } // Do byte swapping if necessary. if ( stream_.doByteSwap[1] ) byteSwapBuffer( buffer, samples, format ); // Do buffer conversion if necessary. if ( stream_.doConvertBuffer[1] ) convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); } unlock: MUTEX_UNLOCK( &stream_.mutex ); RtApi::tickStreamTime(); if ( doStopStream == 1 ) this->stopStream(); } static void *ossCallbackHandler( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiOss *object = (RtApiOss *) info->object; bool *isRunning = &info->isRunning; while ( *isRunning == true ) { pthread_testcancel(); object->callbackEvent(); } pthread_exit( NULL ); } //******************** End of __LINUX_OSS__ *********************// #endif // *************************************************** // // // Protected common (OS-independent) RtAudio methods. // // *************************************************** // // This method can be modified to control the behavior of error // message printing. void RtApi :: error( RtAudioError::Type type ) { errorStream_.str(""); // clear the ostringstream RtAudioErrorCallback errorCallback = (RtAudioErrorCallback) stream_.callbackInfo.errorCallback; if ( errorCallback ) { // abortStream() can generate new error messages. Ignore them. Just keep original one. if ( firstErrorOccurred_ ) return; firstErrorOccurred_ = true; const std::string errorMessage = errorText_; if ( type != RtAudioError::WARNING && stream_.state != STREAM_STOPPED) { stream_.callbackInfo.isRunning = false; // exit from the thread abortStream(); } errorCallback( type, errorMessage ); firstErrorOccurred_ = false; return; } if ( type == RtAudioError::WARNING && showWarnings_ == true ) std::cerr << '\n' << errorText_ << "\n\n"; else if ( type != RtAudioError::WARNING ) throw( RtAudioError( errorText_, type ) ); } void RtApi :: verifyStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApi:: a stream is not open!"; error( RtAudioError::INVALID_USE ); } } void RtApi :: clearStreamInfo() { stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; stream_.sampleRate = 0; stream_.bufferSize = 0; stream_.nBuffers = 0; stream_.userFormat = 0; stream_.userInterleaved = true; stream_.streamTime = 0.0; stream_.apiHandle = 0; stream_.deviceBuffer = 0; stream_.callbackInfo.callback = 0; stream_.callbackInfo.userData = 0; stream_.callbackInfo.isRunning = false; stream_.callbackInfo.errorCallback = 0; for ( int i=0; i<2; i++ ) { stream_.device[i] = 11111; stream_.doConvertBuffer[i] = false; stream_.deviceInterleaved[i] = true; stream_.doByteSwap[i] = false; stream_.nUserChannels[i] = 0; stream_.nDeviceChannels[i] = 0; stream_.channelOffset[i] = 0; stream_.deviceFormat[i] = 0; stream_.latency[i] = 0; stream_.userBuffer[i] = 0; stream_.convertInfo[i].channels = 0; stream_.convertInfo[i].inJump = 0; stream_.convertInfo[i].outJump = 0; stream_.convertInfo[i].inFormat = 0; stream_.convertInfo[i].outFormat = 0; stream_.convertInfo[i].inOffset.clear(); stream_.convertInfo[i].outOffset.clear(); } } unsigned int RtApi :: formatBytes( RtAudioFormat format ) { if ( format == RTAUDIO_SINT16 ) return 2; else if ( format == RTAUDIO_SINT32 || format == RTAUDIO_FLOAT32 ) return 4; else if ( format == RTAUDIO_FLOAT64 ) return 8; else if ( format == RTAUDIO_SINT24 ) return 3; else if ( format == RTAUDIO_SINT8 ) return 1; errorText_ = "RtApi::formatBytes: undefined format."; error( RtAudioError::WARNING ); return 0; } void RtApi :: setConvertInfo( StreamMode mode, unsigned int firstChannel ) { if ( mode == INPUT ) { // convert device to user buffer stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; stream_.convertInfo[mode].outFormat = stream_.userFormat; } else { // convert user to device buffer stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; stream_.convertInfo[mode].inFormat = stream_.userFormat; stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; } if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; else stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; // Set up the interleave/deinterleave offsets. if ( stream_.deviceInterleaved[mode] != stream_.userInterleaved ) { if ( ( mode == OUTPUT && stream_.deviceInterleaved[mode] ) || ( mode == INPUT && stream_.userInterleaved ) ) { for ( int k=0; k 0 ) { if ( stream_.deviceInterleaved[mode] ) { if ( mode == OUTPUT ) { for ( int k=0; k> 8); //out[info.outOffset[j]] >>= 8; } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i> 8); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT32) { Int32 *in = (Int32 *)inBuffer; for (unsigned int i=0; i> 16) & 0x0000ffff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i> 8) & 0x00ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT24) { Int24 *in = (Int24 *)inBuffer; for (unsigned int i=0; i> 16); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT32) { Int32 *in = (Int32 *)inBuffer; for (unsigned int i=0; i> 24) & 0x000000ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i>8) | (x<<8); } //static inline uint32_t bswap_32(uint32_t x) { return (bswap_16(x&0xffff)<<16) | (bswap_16(x>>16)); } //static inline uint64_t bswap_64(uint64_t x) { return (((unsigned long long)bswap_32(x&0xffffffffull))<<32) | (bswap_32(x>>32)); } void RtApi :: byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format ) { register char val; register char *ptr; ptr = buffer; if ( format == RTAUDIO_SINT16 ) { for ( unsigned int i=0; i //*********************************************************************// // RtMidi Definitions //*********************************************************************// RtMidi :: RtMidi() : rtapi_(0) { } RtMidi :: ~RtMidi() { if ( rtapi_ ) delete rtapi_; rtapi_ = 0; } std::string RtMidi :: getVersion( void ) throw() { return std::string( RTMIDI_VERSION ); } void RtMidi :: getCompiledApi( std::vector &apis ) throw() { apis.clear(); // The order here will control the order of RtMidi's API search in // the constructor. #if defined(__MACOSX_CORE__) apis.push_back( MACOSX_CORE ); #endif #if defined(__LINUX_ALSA__) apis.push_back( LINUX_ALSA ); #endif #if defined(__UNIX_JACK__) apis.push_back( UNIX_JACK ); #endif #if defined(__WINDOWS_MM__) apis.push_back( WINDOWS_MM ); #endif #if defined(__RTMIDI_DUMMY__) apis.push_back( RTMIDI_DUMMY ); #endif } //*********************************************************************// // RtMidiIn Definitions //*********************************************************************// void RtMidiIn :: openMidiApi( RtMidi::Api api, const std::string clientName, unsigned int queueSizeLimit ) { if ( rtapi_ ) delete rtapi_; rtapi_ = 0; #if defined(__UNIX_JACK__) if ( api == UNIX_JACK ) rtapi_ = new MidiInJack( clientName, queueSizeLimit ); #endif #if defined(__LINUX_ALSA__) if ( api == LINUX_ALSA ) rtapi_ = new MidiInAlsa( clientName, queueSizeLimit ); #endif #if defined(__WINDOWS_MM__) if ( api == WINDOWS_MM ) rtapi_ = new MidiInWinMM( clientName, queueSizeLimit ); #endif #if defined(__MACOSX_CORE__) if ( api == MACOSX_CORE ) rtapi_ = new MidiInCore( clientName, queueSizeLimit ); #endif #if defined(__RTMIDI_DUMMY__) if ( api == RTMIDI_DUMMY ) rtapi_ = new MidiInDummy( clientName, queueSizeLimit ); #endif } RtMidiIn :: RtMidiIn( RtMidi::Api api, const std::string clientName, unsigned int queueSizeLimit ) : RtMidi() { if ( api != UNSPECIFIED ) { // Attempt to open the specified API. openMidiApi( api, clientName, queueSizeLimit ); if ( rtapi_ ) return; // No compiled support for specified API value. Issue a warning // and continue as if no API was specified. std::cerr << "\nRtMidiIn: no compiled support for specified API argument!\n\n" << std::endl; } // Iterate through the compiled APIs and return as soon as we find // one with at least one port or we reach the end of the list. std::vector< RtMidi::Api > apis; getCompiledApi( apis ); for ( unsigned int i=0; igetPortCount() ) break; } if ( rtapi_ ) return; // It should not be possible to get here because the preprocessor // definition __RTMIDI_DUMMY__ is automatically defined if no // API-specific definitions are passed to the compiler. But just in // case something weird happens, we'll throw an error. std::string errorText = "RtMidiIn: no compiled API support found ... critical error!!"; throw( RtMidiError( errorText, RtMidiError::UNSPECIFIED ) ); } RtMidiIn :: ~RtMidiIn() throw() { } //*********************************************************************// // RtMidiOut Definitions //*********************************************************************// void RtMidiOut :: openMidiApi( RtMidi::Api api, const std::string clientName ) { if ( rtapi_ ) delete rtapi_; rtapi_ = 0; #if defined(__UNIX_JACK__) if ( api == UNIX_JACK ) rtapi_ = new MidiOutJack( clientName ); #endif #if defined(__LINUX_ALSA__) if ( api == LINUX_ALSA ) rtapi_ = new MidiOutAlsa( clientName ); #endif #if defined(__WINDOWS_MM__) if ( api == WINDOWS_MM ) rtapi_ = new MidiOutWinMM( clientName ); #endif #if defined(__MACOSX_CORE__) if ( api == MACOSX_CORE ) rtapi_ = new MidiOutCore( clientName ); #endif #if defined(__RTMIDI_DUMMY__) if ( api == RTMIDI_DUMMY ) rtapi_ = new MidiOutDummy( clientName ); #endif } RtMidiOut :: RtMidiOut( RtMidi::Api api, const std::string clientName ) { if ( api != UNSPECIFIED ) { // Attempt to open the specified API. openMidiApi( api, clientName ); if ( rtapi_ ) return; // No compiled support for specified API value. Issue a warning // and continue as if no API was specified. std::cerr << "\nRtMidiOut: no compiled support for specified API argument!\n\n" << std::endl; } // Iterate through the compiled APIs and return as soon as we find // one with at least one port or we reach the end of the list. std::vector< RtMidi::Api > apis; getCompiledApi( apis ); for ( unsigned int i=0; igetPortCount() ) break; } if ( rtapi_ ) return; // It should not be possible to get here because the preprocessor // definition __RTMIDI_DUMMY__ is automatically defined if no // API-specific definitions are passed to the compiler. But just in // case something weird happens, we'll thrown an error. std::string errorText = "RtMidiOut: no compiled API support found ... critical error!!"; throw( RtMidiError( errorText, RtMidiError::UNSPECIFIED ) ); } RtMidiOut :: ~RtMidiOut() throw() { } //*********************************************************************// // Common MidiApi Definitions //*********************************************************************// MidiApi :: MidiApi( void ) : apiData_( 0 ), connected_( false ), errorCallback_(0) { } MidiApi :: ~MidiApi( void ) { } void MidiApi :: setErrorCallback( RtMidiErrorCallback errorCallback ) { errorCallback_ = errorCallback; } void MidiApi :: error( RtMidiError::Type type, std::string errorString ) { if ( errorCallback_ ) { static bool firstErrorOccured = false; if ( firstErrorOccured ) return; firstErrorOccured = true; const std::string errorMessage = errorString; errorCallback_( type, errorMessage ); firstErrorOccured = false; return; } if ( type == RtMidiError::WARNING ) { std::cerr << '\n' << errorString << "\n\n"; } else if ( type == RtMidiError::DEBUG_WARNING ) { #if defined(__RTMIDI_DEBUG__) std::cerr << '\n' << errorString << "\n\n"; #endif } else { std::cerr << '\n' << errorString << "\n\n"; throw RtMidiError( errorString, type ); } } //*********************************************************************// // Common MidiInApi Definitions //*********************************************************************// MidiInApi :: MidiInApi( unsigned int queueSizeLimit ) : MidiApi() { // Allocate the MIDI queue. inputData_.queue.ringSize = queueSizeLimit; if ( inputData_.queue.ringSize > 0 ) inputData_.queue.ring = new MidiMessage[ inputData_.queue.ringSize ]; } MidiInApi :: ~MidiInApi( void ) { // Delete the MIDI queue. if ( inputData_.queue.ringSize > 0 ) delete [] inputData_.queue.ring; } void MidiInApi :: setCallback( RtMidiIn::RtMidiCallback callback, void *userData ) { if ( inputData_.usingCallback ) { errorString_ = "MidiInApi::setCallback: a callback function is already set!"; error( RtMidiError::WARNING, errorString_ ); return; } if ( !callback ) { errorString_ = "RtMidiIn::setCallback: callback function value is invalid!"; error( RtMidiError::WARNING, errorString_ ); return; } inputData_.userCallback = callback; inputData_.userData = userData; inputData_.usingCallback = true; } void MidiInApi :: cancelCallback() { if ( !inputData_.usingCallback ) { errorString_ = "RtMidiIn::cancelCallback: no callback function was set!"; error( RtMidiError::WARNING, errorString_ ); return; } inputData_.userCallback = 0; inputData_.userData = 0; inputData_.usingCallback = false; } void MidiInApi :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { inputData_.ignoreFlags = 0; if ( midiSysex ) inputData_.ignoreFlags = 0x01; if ( midiTime ) inputData_.ignoreFlags |= 0x02; if ( midiSense ) inputData_.ignoreFlags |= 0x04; } double MidiInApi :: getMessage( std::vector *message ) { message->clear(); if ( inputData_.usingCallback ) { errorString_ = "RtMidiIn::getNextMessage: a user callback is currently set for this port."; error( RtMidiError::WARNING, errorString_ ); return 0.0; } if ( inputData_.queue.size == 0 ) return 0.0; // Copy queued message to the vector pointer argument and then "pop" it. std::vector *bytes = &(inputData_.queue.ring[inputData_.queue.front].bytes); message->assign( bytes->begin(), bytes->end() ); double deltaTime = inputData_.queue.ring[inputData_.queue.front].timeStamp; inputData_.queue.size--; inputData_.queue.front++; if ( inputData_.queue.front == inputData_.queue.ringSize ) inputData_.queue.front = 0; return deltaTime; } //*********************************************************************// // Common MidiOutApi Definitions //*********************************************************************// MidiOutApi :: MidiOutApi( void ) : MidiApi() { } MidiOutApi :: ~MidiOutApi( void ) { } // *************************************************** // // // OS/API-specific methods. // // *************************************************** // #if defined(__MACOSX_CORE__) // The CoreMIDI API is based on the use of a callback function for // MIDI input. We convert the system specific time stamps to delta // time values. // OS-X CoreMIDI header files. #include #include #include // A structure to hold variables related to the CoreMIDI API // implementation. struct CoreMidiData { MIDIClientRef client; MIDIPortRef port; MIDIEndpointRef endpoint; MIDIEndpointRef destinationId; unsigned long long lastTime; MIDISysexSendRequest sysexreq; }; //*********************************************************************// // API: OS-X // Class Definitions: MidiInCore //*********************************************************************// static void midiInputCallback( const MIDIPacketList *list, void *procRef, void */*srcRef*/ ) { MidiInApi::RtMidiInData *data = static_cast (procRef); CoreMidiData *apiData = static_cast (data->apiData); unsigned char status; unsigned short nBytes, iByte, size; unsigned long long time; bool& continueSysex = data->continueSysex; MidiInApi::MidiMessage& message = data->message; const MIDIPacket *packet = &list->packet[0]; for ( unsigned int i=0; inumPackets; ++i ) { // My interpretation of the CoreMIDI documentation: all message // types, except sysex, are complete within a packet and there may // be several of them in a single packet. Sysex messages can be // broken across multiple packets and PacketLists but are bundled // alone within each packet (these packets do not contain other // message types). If sysex messages are split across multiple // MIDIPacketLists, they must be handled by multiple calls to this // function. nBytes = packet->length; if ( nBytes == 0 ) continue; // Calculate time stamp. if ( data->firstMessage ) { message.timeStamp = 0.0; data->firstMessage = false; } else { time = packet->timeStamp; if ( time == 0 ) { // this happens when receiving asynchronous sysex messages time = AudioGetCurrentHostTime(); } time -= apiData->lastTime; time = AudioConvertHostTimeToNanos( time ); if ( !continueSysex ) message.timeStamp = time * 0.000000001; } apiData->lastTime = packet->timeStamp; if ( apiData->lastTime == 0 ) { // this happens when receiving asynchronous sysex messages apiData->lastTime = AudioGetCurrentHostTime(); } //std::cout << "TimeStamp = " << packet->timeStamp << std::endl; iByte = 0; if ( continueSysex ) { // We have a continuing, segmented sysex message. if ( !( data->ignoreFlags & 0x01 ) ) { // If we're not ignoring sysex messages, copy the entire packet. for ( unsigned int j=0; jdata[j] ); } continueSysex = packet->data[nBytes-1] != 0xF7; if ( !( data->ignoreFlags & 0x01 ) && !continueSysex ) { // If not a continuing sysex message, invoke the user callback function or queue the message. if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queue.size < data->queue.ringSize ) { data->queue.ring[data->queue.back++] = message; if ( data->queue.back == data->queue.ringSize ) data->queue.back = 0; data->queue.size++; } else std::cerr << "\nMidiInCore: message queue limit reached!!\n\n"; } message.bytes.clear(); } } else { while ( iByte < nBytes ) { size = 0; // We are expecting that the next byte in the packet is a status byte. status = packet->data[iByte]; if ( !(status & 0x80) ) break; // Determine the number of bytes in the MIDI message. if ( status < 0xC0 ) size = 3; else if ( status < 0xE0 ) size = 2; else if ( status < 0xF0 ) size = 3; else if ( status == 0xF0 ) { // A MIDI sysex if ( data->ignoreFlags & 0x01 ) { size = 0; iByte = nBytes; } else size = nBytes - iByte; continueSysex = packet->data[nBytes-1] != 0xF7; } else if ( status == 0xF1 ) { // A MIDI time code message if ( data->ignoreFlags & 0x02 ) { size = 0; iByte += 2; } else size = 2; } else if ( status == 0xF2 ) size = 3; else if ( status == 0xF3 ) size = 2; else if ( status == 0xF8 && ( data->ignoreFlags & 0x02 ) ) { // A MIDI timing tick message and we're ignoring it. size = 0; iByte += 1; } else if ( status == 0xFE && ( data->ignoreFlags & 0x04 ) ) { // A MIDI active sensing message and we're ignoring it. size = 0; iByte += 1; } else size = 1; // Copy the MIDI data to our vector. if ( size ) { message.bytes.assign( &packet->data[iByte], &packet->data[iByte+size] ); if ( !continueSysex ) { // If not a continuing sysex message, invoke the user callback function or queue the message. if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queue.size < data->queue.ringSize ) { data->queue.ring[data->queue.back++] = message; if ( data->queue.back == data->queue.ringSize ) data->queue.back = 0; data->queue.size++; } else std::cerr << "\nMidiInCore: message queue limit reached!!\n\n"; } message.bytes.clear(); } iByte += size; } } } packet = MIDIPacketNext(packet); } } MidiInCore :: MidiInCore( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { initialize( clientName ); } MidiInCore :: ~MidiInCore( void ) { // Close a connection if it exists. closePort(); // Cleanup. CoreMidiData *data = static_cast (apiData_); MIDIClientDispose( data->client ); if ( data->endpoint ) MIDIEndpointDispose( data->endpoint ); delete data; } void MidiInCore :: initialize( const std::string& clientName ) { // Set up our client. MIDIClientRef client; OSStatus result = MIDIClientCreate( CFStringCreateWithCString( NULL, clientName.c_str(), kCFStringEncodingASCII ), NULL, NULL, &client ); if ( result != noErr ) { errorString_ = "MidiInCore::initialize: error creating OS-X MIDI client object."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific connection information. CoreMidiData *data = (CoreMidiData *) new CoreMidiData; data->client = client; data->endpoint = 0; apiData_ = (void *) data; inputData_.apiData = (void *) data; } void MidiInCore :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "MidiInCore::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false ); unsigned int nSrc = MIDIGetNumberOfSources(); if (nSrc < 1) { errorString_ = "MidiInCore::openPort: no MIDI input sources found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } if ( portNumber >= nSrc ) { std::ostringstream ost; ost << "MidiInCore::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } MIDIPortRef port; CoreMidiData *data = static_cast (apiData_); OSStatus result = MIDIInputPortCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), midiInputCallback, (void *)&inputData_, &port ); if ( result != noErr ) { MIDIClientDispose( data->client ); errorString_ = "MidiInCore::openPort: error creating OS-X MIDI input port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Get the desired input source identifier. MIDIEndpointRef endpoint = MIDIGetSource( portNumber ); if ( endpoint == 0 ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "MidiInCore::openPort: error getting MIDI input source reference."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Make the connection. result = MIDIPortConnectSource( port, endpoint, NULL ); if ( result != noErr ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "MidiInCore::openPort: error connecting OS-X MIDI input port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific port information. data->port = port; connected_ = true; } void MidiInCore :: openVirtualPort( const std::string portName ) { CoreMidiData *data = static_cast (apiData_); // Create a virtual MIDI input destination. MIDIEndpointRef endpoint; OSStatus result = MIDIDestinationCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), midiInputCallback, (void *)&inputData_, &endpoint ); if ( result != noErr ) { errorString_ = "MidiInCore::openVirtualPort: error creating virtual OS-X MIDI destination."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific connection information. data->endpoint = endpoint; } void MidiInCore :: closePort( void ) { if ( connected_ ) { CoreMidiData *data = static_cast (apiData_); MIDIPortDispose( data->port ); connected_ = false; } } unsigned int MidiInCore :: getPortCount() { CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false ); return MIDIGetNumberOfSources(); } // This function was submitted by Douglas Casey Tucker and apparently // derived largely from PortMidi. CFStringRef EndpointName( MIDIEndpointRef endpoint, bool isExternal ) { CFMutableStringRef result = CFStringCreateMutable( NULL, 0 ); CFStringRef str; // Begin with the endpoint's name. str = NULL; MIDIObjectGetStringProperty( endpoint, kMIDIPropertyName, &str ); if ( str != NULL ) { CFStringAppend( result, str ); CFRelease( str ); } MIDIEntityRef entity = 0; MIDIEndpointGetEntity( endpoint, &entity ); if ( entity == 0 ) // probably virtual return result; if ( CFStringGetLength( result ) == 0 ) { // endpoint name has zero length -- try the entity str = NULL; MIDIObjectGetStringProperty( entity, kMIDIPropertyName, &str ); if ( str != NULL ) { CFStringAppend( result, str ); CFRelease( str ); } } // now consider the device's name MIDIDeviceRef device = 0; MIDIEntityGetDevice( entity, &device ); if ( device == 0 ) return result; str = NULL; MIDIObjectGetStringProperty( device, kMIDIPropertyName, &str ); if ( CFStringGetLength( result ) == 0 ) { CFRelease( result ); return str; } if ( str != NULL ) { // if an external device has only one entity, throw away // the endpoint name and just use the device name if ( isExternal && MIDIDeviceGetNumberOfEntities( device ) < 2 ) { CFRelease( result ); return str; } else { if ( CFStringGetLength( str ) == 0 ) { CFRelease( str ); return result; } // does the entity name already start with the device name? // (some drivers do this though they shouldn't) // if so, do not prepend if ( CFStringCompareWithOptions( result, /* endpoint name */ str /* device name */, CFRangeMake(0, CFStringGetLength( str ) ), 0 ) != kCFCompareEqualTo ) { // prepend the device name to the entity name if ( CFStringGetLength( result ) > 0 ) CFStringInsert( result, 0, CFSTR(" ") ); CFStringInsert( result, 0, str ); } CFRelease( str ); } } return result; } // This function was submitted by Douglas Casey Tucker and apparently // derived largely from PortMidi. static CFStringRef ConnectedEndpointName( MIDIEndpointRef endpoint ) { CFMutableStringRef result = CFStringCreateMutable( NULL, 0 ); CFStringRef str; OSStatus err; int i; // Does the endpoint have connections? CFDataRef connections = NULL; int nConnected = 0; bool anyStrings = false; err = MIDIObjectGetDataProperty( endpoint, kMIDIPropertyConnectionUniqueID, &connections ); if ( connections != NULL ) { // It has connections, follow them // Concatenate the names of all connected devices nConnected = CFDataGetLength( connections ) / sizeof(MIDIUniqueID); if ( nConnected ) { const SInt32 *pid = (const SInt32 *)(CFDataGetBytePtr(connections)); for ( i=0; i= MIDIGetNumberOfSources() ) { std::ostringstream ost; ost << "MidiInCore::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); return stringName; } portRef = MIDIGetSource( portNumber ); nameRef = ConnectedEndpointName(portRef); CFStringGetCString( nameRef, name, sizeof(name), CFStringGetSystemEncoding()); CFRelease( nameRef ); return stringName = name; } //*********************************************************************// // API: OS-X // Class Definitions: MidiOutCore //*********************************************************************// MidiOutCore :: MidiOutCore( const std::string clientName ) : MidiOutApi() { initialize( clientName ); } MidiOutCore :: ~MidiOutCore( void ) { // Close a connection if it exists. closePort(); // Cleanup. CoreMidiData *data = static_cast (apiData_); MIDIClientDispose( data->client ); if ( data->endpoint ) MIDIEndpointDispose( data->endpoint ); delete data; } void MidiOutCore :: initialize( const std::string& clientName ) { // Set up our client. MIDIClientRef client; OSStatus result = MIDIClientCreate( CFStringCreateWithCString( NULL, clientName.c_str(), kCFStringEncodingASCII ), NULL, NULL, &client ); if ( result != noErr ) { errorString_ = "MidiOutCore::initialize: error creating OS-X MIDI client object."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific connection information. CoreMidiData *data = (CoreMidiData *) new CoreMidiData; data->client = client; data->endpoint = 0; apiData_ = (void *) data; } unsigned int MidiOutCore :: getPortCount() { CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false ); return MIDIGetNumberOfDestinations(); } std::string MidiOutCore :: getPortName( unsigned int portNumber ) { CFStringRef nameRef; MIDIEndpointRef portRef; char name[128]; std::string stringName; CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false ); if ( portNumber >= MIDIGetNumberOfDestinations() ) { std::ostringstream ost; ost << "MidiOutCore::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); return stringName; } portRef = MIDIGetDestination( portNumber ); nameRef = ConnectedEndpointName(portRef); CFStringGetCString( nameRef, name, sizeof(name), CFStringGetSystemEncoding()); CFRelease( nameRef ); return stringName = name; } void MidiOutCore :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "MidiOutCore::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0, false ); unsigned int nDest = MIDIGetNumberOfDestinations(); if (nDest < 1) { errorString_ = "MidiOutCore::openPort: no MIDI output destinations found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } if ( portNumber >= nDest ) { std::ostringstream ost; ost << "MidiOutCore::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } MIDIPortRef port; CoreMidiData *data = static_cast (apiData_); OSStatus result = MIDIOutputPortCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), &port ); if ( result != noErr ) { MIDIClientDispose( data->client ); errorString_ = "MidiOutCore::openPort: error creating OS-X MIDI output port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Get the desired output port identifier. MIDIEndpointRef destination = MIDIGetDestination( portNumber ); if ( destination == 0 ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "MidiOutCore::openPort: error getting MIDI output destination reference."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific connection information. data->port = port; data->destinationId = destination; connected_ = true; } void MidiOutCore :: closePort( void ) { if ( connected_ ) { CoreMidiData *data = static_cast (apiData_); MIDIPortDispose( data->port ); connected_ = false; } } void MidiOutCore :: openVirtualPort( std::string portName ) { CoreMidiData *data = static_cast (apiData_); if ( data->endpoint ) { errorString_ = "MidiOutCore::openVirtualPort: a virtual output port already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } // Create a virtual MIDI output source. MIDIEndpointRef endpoint; OSStatus result = MIDISourceCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), &endpoint ); if ( result != noErr ) { errorString_ = "MidiOutCore::initialize: error creating OS-X virtual MIDI source."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Save our api-specific connection information. data->endpoint = endpoint; } // Not necessary if we don't treat sysex messages any differently than // normal messages ... see below. //static void sysexCompletionProc( MIDISysexSendRequest *sreq ) //{ // free( sreq ); //} void MidiOutCore :: sendMessage( std::vector *message ) { // We use the MIDISendSysex() function to asynchronously send sysex // messages. Otherwise, we use a single CoreMidi MIDIPacket. unsigned int nBytes = message->size(); if ( nBytes == 0 ) { errorString_ = "MidiOutCore::sendMessage: no data in message argument!"; error( RtMidiError::WARNING, errorString_ ); return; } // unsigned int packetBytes, bytesLeft = nBytes; // unsigned int messageIndex = 0; MIDITimeStamp timeStamp = AudioGetCurrentHostTime(); CoreMidiData *data = static_cast (apiData_); OSStatus result; /* // I don't think this code is necessary. We can send sysex // messages through the normal mechanism. In addition, this avoids // the problem of virtual ports not receiving sysex messages. if ( message->at(0) == 0xF0 ) { // Apple's fantastic API requires us to free the allocated data in // the completion callback but trashes the pointer and size before // we get a chance to free it!! This is a somewhat ugly hack // submitted by ptarabbia that puts the sysex buffer data right at // the end of the MIDISysexSendRequest structure. This solution // does not require that we wait for a previous sysex buffer to be // sent before sending a new one, which was the old way we did it. MIDISysexSendRequest *newRequest = (MIDISysexSendRequest *) malloc(sizeof(struct MIDISysexSendRequest) + nBytes); char * sysexBuffer = ((char *) newRequest) + sizeof(struct MIDISysexSendRequest); // Copy data to buffer. for ( unsigned int i=0; iat(i); newRequest->destination = data->destinationId; newRequest->data = (Byte *)sysexBuffer; newRequest->bytesToSend = nBytes; newRequest->complete = 0; newRequest->completionProc = sysexCompletionProc; newRequest->completionRefCon = newRequest; result = MIDISendSysex(newRequest); if ( result != noErr ) { free( newRequest ); errorString_ = "MidiOutCore::sendMessage: error sending MIDI to virtual destinations."; error( RtMidiError::WARNING, errorString_ ); return; } return; } else if ( nBytes > 3 ) { errorString_ = "MidiOutCore::sendMessage: message format problem ... not sysex but > 3 bytes?"; error( RtMidiError::WARNING, errorString_ ); return; } */ MIDIPacketList packetList; MIDIPacket *packet = MIDIPacketListInit( &packetList ); packet = MIDIPacketListAdd( &packetList, sizeof(packetList), packet, timeStamp, nBytes, (const Byte *) &message->at( 0 ) ); if ( !packet ) { errorString_ = "MidiOutCore::sendMessage: could not allocate packet list"; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Send to any destinations that may have connected to us. if ( data->endpoint ) { result = MIDIReceived( data->endpoint, &packetList ); if ( result != noErr ) { errorString_ = "MidiOutCore::sendMessage: error sending MIDI to virtual destinations."; error( RtMidiError::WARNING, errorString_ ); } } // And send to an explicit destination port if we're connected. if ( connected_ ) { result = MIDISend( data->port, data->destinationId, &packetList ); if ( result != noErr ) { errorString_ = "MidiOutCore::sendMessage: error sending MIDI message to port."; error( RtMidiError::WARNING, errorString_ ); } } } #endif // __MACOSX_CORE__ //*********************************************************************// // API: LINUX ALSA SEQUENCER //*********************************************************************// // API information found at: // - http://www.alsa-project.org/documentation.php#Library #if defined(__LINUX_ALSA__) // The ALSA Sequencer API is based on the use of a callback function for // MIDI input. // // Thanks to Pedro Lopez-Cabanillas for help with the ALSA sequencer // time stamps and other assorted fixes!!! // If you don't need timestamping for incoming MIDI events, define the // preprocessor definition AVOID_TIMESTAMPING to save resources // associated with the ALSA sequencer queues. #include #include // ALSA header file. #include // A structure to hold variables related to the ALSA API // implementation. struct AlsaMidiData { snd_seq_t *seq; unsigned int portNum; int vport; snd_seq_port_subscribe_t *subscription; snd_midi_event_t *coder; unsigned int bufferSize; unsigned char *buffer; pthread_t thread; pthread_t dummy_thread_id; unsigned long long lastTime; int queue_id; // an input queue is needed to get timestamped events int trigger_fds[2]; }; #define PORT_TYPE( pinfo, bits ) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) //*********************************************************************// // API: LINUX ALSA // Class Definitions: MidiInAlsa //*********************************************************************// static void *alsaMidiHandler( void *ptr ) { MidiInApi::RtMidiInData *data = static_cast (ptr); AlsaMidiData *apiData = static_cast (data->apiData); long nBytes; unsigned long long time, lastTime; bool continueSysex = false; bool doDecode = false; MidiInApi::MidiMessage message; int poll_fd_count; struct pollfd *poll_fds; snd_seq_event_t *ev; int result; apiData->bufferSize = 32; result = snd_midi_event_new( 0, &apiData->coder ); if ( result < 0 ) { data->doInput = false; std::cerr << "\nMidiInAlsa::alsaMidiHandler: error initializing MIDI event parser!\n\n"; return 0; } unsigned char *buffer = (unsigned char *) malloc( apiData->bufferSize ); if ( buffer == NULL ) { data->doInput = false; snd_midi_event_free( apiData->coder ); apiData->coder = 0; std::cerr << "\nMidiInAlsa::alsaMidiHandler: error initializing buffer memory!\n\n"; return 0; } snd_midi_event_init( apiData->coder ); snd_midi_event_no_status( apiData->coder, 1 ); // suppress running status messages poll_fd_count = snd_seq_poll_descriptors_count( apiData->seq, POLLIN ) + 1; poll_fds = (struct pollfd*)alloca( poll_fd_count * sizeof( struct pollfd )); snd_seq_poll_descriptors( apiData->seq, poll_fds + 1, poll_fd_count - 1, POLLIN ); poll_fds[0].fd = apiData->trigger_fds[0]; poll_fds[0].events = POLLIN; while ( data->doInput ) { if ( snd_seq_event_input_pending( apiData->seq, 1 ) == 0 ) { // No data pending if ( poll( poll_fds, poll_fd_count, -1) >= 0 ) { if ( poll_fds[0].revents & POLLIN ) { bool dummy; int res = read( poll_fds[0].fd, &dummy, sizeof(dummy) ); (void) res; } } continue; } // If here, there should be data. result = snd_seq_event_input( apiData->seq, &ev ); if ( result == -ENOSPC ) { std::cerr << "\nMidiInAlsa::alsaMidiHandler: MIDI input buffer overrun!\n\n"; continue; } else if ( result <= 0 ) { std::cerr << "\nMidiInAlsa::alsaMidiHandler: unknown MIDI input error!\n"; perror("System reports"); continue; } // This is a bit weird, but we now have to decode an ALSA MIDI // event (back) into MIDI bytes. We'll ignore non-MIDI types. if ( !continueSysex ) message.bytes.clear(); doDecode = false; switch ( ev->type ) { case SND_SEQ_EVENT_PORT_SUBSCRIBED: #if defined(__RTMIDI_DEBUG__) std::cout << "MidiInAlsa::alsaMidiHandler: port connection made!\n"; #endif break; case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: #if defined(__RTMIDI_DEBUG__) std::cerr << "MidiInAlsa::alsaMidiHandler: port connection has closed!\n"; std::cout << "sender = " << (int) ev->data.connect.sender.client << ":" << (int) ev->data.connect.sender.port << ", dest = " << (int) ev->data.connect.dest.client << ":" << (int) ev->data.connect.dest.port << std::endl; #endif break; case SND_SEQ_EVENT_QFRAME: // MIDI time code if ( !( data->ignoreFlags & 0x02 ) ) doDecode = true; break; case SND_SEQ_EVENT_TICK: // 0xF9 ... MIDI timing tick if ( !( data->ignoreFlags & 0x02 ) ) doDecode = true; break; case SND_SEQ_EVENT_CLOCK: // 0xF8 ... MIDI timing (clock) tick if ( !( data->ignoreFlags & 0x02 ) ) doDecode = true; break; case SND_SEQ_EVENT_SENSING: // Active sensing if ( !( data->ignoreFlags & 0x04 ) ) doDecode = true; break; case SND_SEQ_EVENT_SYSEX: if ( (data->ignoreFlags & 0x01) ) break; if ( ev->data.ext.len > apiData->bufferSize ) { apiData->bufferSize = ev->data.ext.len; free( buffer ); buffer = (unsigned char *) malloc( apiData->bufferSize ); if ( buffer == NULL ) { data->doInput = false; std::cerr << "\nMidiInAlsa::alsaMidiHandler: error resizing buffer memory!\n\n"; break; } } default: doDecode = true; } if ( doDecode ) { nBytes = snd_midi_event_decode( apiData->coder, buffer, apiData->bufferSize, ev ); if ( nBytes > 0 ) { // The ALSA sequencer has a maximum buffer size for MIDI sysex // events of 256 bytes. If a device sends sysex messages larger // than this, they are segmented into 256 byte chunks. So, // we'll watch for this and concatenate sysex chunks into a // single sysex message if necessary. if ( !continueSysex ) message.bytes.assign( buffer, &buffer[nBytes] ); else message.bytes.insert( message.bytes.end(), buffer, &buffer[nBytes] ); continueSysex = ( ( ev->type == SND_SEQ_EVENT_SYSEX ) && ( message.bytes.back() != 0xF7 ) ); if ( !continueSysex ) { // Calculate the time stamp: message.timeStamp = 0.0; // Method 1: Use the system time. //(void)gettimeofday(&tv, (struct timezone *)NULL); //time = (tv.tv_sec * 1000000) + tv.tv_usec; // Method 2: Use the ALSA sequencer event time data. // (thanks to Pedro Lopez-Cabanillas!). time = ( ev->time.time.tv_sec * 1000000 ) + ( ev->time.time.tv_nsec/1000 ); lastTime = time; time -= apiData->lastTime; apiData->lastTime = lastTime; if ( data->firstMessage == true ) data->firstMessage = false; else message.timeStamp = time * 0.000001; } else { #if defined(__RTMIDI_DEBUG__) std::cerr << "\nMidiInAlsa::alsaMidiHandler: event parsing error or not a MIDI event!\n\n"; #endif } } } snd_seq_free_event( ev ); if ( message.bytes.size() == 0 || continueSysex ) continue; if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queue.size < data->queue.ringSize ) { data->queue.ring[data->queue.back++] = message; if ( data->queue.back == data->queue.ringSize ) data->queue.back = 0; data->queue.size++; } else std::cerr << "\nMidiInAlsa: message queue limit reached!!\n\n"; } } if ( buffer ) free( buffer ); snd_midi_event_free( apiData->coder ); apiData->coder = 0; apiData->thread = apiData->dummy_thread_id; return 0; } MidiInAlsa :: MidiInAlsa( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { initialize( clientName ); } MidiInAlsa :: ~MidiInAlsa() { // Close a connection if it exists. closePort(); // Shutdown the input thread. AlsaMidiData *data = static_cast (apiData_); if ( inputData_.doInput ) { inputData_.doInput = false; int res = write( data->trigger_fds[1], &inputData_.doInput, sizeof(inputData_.doInput) ); (void) res; if ( !pthread_equal(data->thread, data->dummy_thread_id) ) pthread_join( data->thread, NULL ); } // Cleanup. close ( data->trigger_fds[0] ); close ( data->trigger_fds[1] ); if ( data->vport >= 0 ) snd_seq_delete_port( data->seq, data->vport ); #ifndef AVOID_TIMESTAMPING snd_seq_free_queue( data->seq, data->queue_id ); #endif snd_seq_close( data->seq ); delete data; } void MidiInAlsa :: initialize( const std::string& clientName ) { // Set up the ALSA sequencer client. snd_seq_t *seq; int result = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK); if ( result < 0 ) { errorString_ = "MidiInAlsa::initialize: error creating ALSA sequencer client object."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Set client name. snd_seq_set_client_name( seq, clientName.c_str() ); // Save our api-specific connection information. AlsaMidiData *data = (AlsaMidiData *) new AlsaMidiData; data->seq = seq; data->portNum = -1; data->vport = -1; data->subscription = 0; data->dummy_thread_id = pthread_self(); data->thread = data->dummy_thread_id; data->trigger_fds[0] = -1; data->trigger_fds[1] = -1; apiData_ = (void *) data; inputData_.apiData = (void *) data; if ( pipe(data->trigger_fds) == -1 ) { errorString_ = "MidiInAlsa::initialize: error creating pipe objects."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Create the input queue #ifndef AVOID_TIMESTAMPING data->queue_id = snd_seq_alloc_named_queue(seq, "RtMidi Queue"); // Set arbitrary tempo (mm=100) and resolution (240) snd_seq_queue_tempo_t *qtempo; snd_seq_queue_tempo_alloca(&qtempo); snd_seq_queue_tempo_set_tempo(qtempo, 600000); snd_seq_queue_tempo_set_ppq(qtempo, 240); snd_seq_set_queue_tempo(data->seq, data->queue_id, qtempo); snd_seq_drain_output(data->seq); #endif } // This function is used to count or get the pinfo structure for a given port number. unsigned int portInfo( snd_seq_t *seq, snd_seq_port_info_t *pinfo, unsigned int type, int portNumber ) { snd_seq_client_info_t *cinfo; int client; int count = 0; snd_seq_client_info_alloca( &cinfo ); snd_seq_client_info_set_client( cinfo, -1 ); while ( snd_seq_query_next_client( seq, cinfo ) >= 0 ) { client = snd_seq_client_info_get_client( cinfo ); if ( client == 0 ) continue; // Reset query info snd_seq_port_info_set_client( pinfo, client ); snd_seq_port_info_set_port( pinfo, -1 ); while ( snd_seq_query_next_port( seq, pinfo ) >= 0 ) { unsigned int atyp = snd_seq_port_info_get_type( pinfo ); if ( ( atyp & SND_SEQ_PORT_TYPE_MIDI_GENERIC ) == 0 ) continue; unsigned int caps = snd_seq_port_info_get_capability( pinfo ); if ( ( caps & type ) != type ) continue; if ( count == portNumber ) return 1; ++count; } } // If a negative portNumber was used, return the port count. if ( portNumber < 0 ) return count; return 0; } unsigned int MidiInAlsa :: getPortCount() { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); return portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, -1 ); } std::string MidiInAlsa :: getPortName( unsigned int portNumber ) { snd_seq_client_info_t *cinfo; snd_seq_port_info_t *pinfo; snd_seq_client_info_alloca( &cinfo ); snd_seq_port_info_alloca( &pinfo ); std::string stringName; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) ) { int cnum = snd_seq_port_info_get_client( pinfo ); snd_seq_get_any_client_info( data->seq, cnum, cinfo ); std::ostringstream os; os << snd_seq_client_info_get_name( cinfo ); os << " "; // These lines added to make sure devices are listed os << snd_seq_port_info_get_client( pinfo ); // with full portnames added to ensure individual device names os << ":"; os << snd_seq_port_info_get_port( pinfo ); stringName = os.str(); return stringName; } // If we get here, we didn't find a match. errorString_ = "MidiInAlsa::getPortName: error looking for port name!"; error( RtMidiError::WARNING, errorString_ ); return stringName; } void MidiInAlsa :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "MidiInAlsa::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } unsigned int nSrc = this->getPortCount(); if ( nSrc < 1 ) { errorString_ = "MidiInAlsa::openPort: no MIDI input sources found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } snd_seq_port_info_t *src_pinfo; snd_seq_port_info_alloca( &src_pinfo ); AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, src_pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) == 0 ) { std::ostringstream ost; ost << "MidiInAlsa::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } snd_seq_addr_t sender, receiver; sender.client = snd_seq_port_info_get_client( src_pinfo ); sender.port = snd_seq_port_info_get_port( src_pinfo ); snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); if ( data->vport < 0 ) { snd_seq_port_info_set_client( pinfo, 0 ); snd_seq_port_info_set_port( pinfo, 0 ); snd_seq_port_info_set_capability( pinfo, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ); snd_seq_port_info_set_type( pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); snd_seq_port_info_set_midi_channels(pinfo, 16); #ifndef AVOID_TIMESTAMPING snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_real(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, data->queue_id); #endif snd_seq_port_info_set_name(pinfo, portName.c_str() ); data->vport = snd_seq_create_port(data->seq, pinfo); if ( data->vport < 0 ) { errorString_ = "MidiInAlsa::openPort: ALSA error creating input port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } data->vport = snd_seq_port_info_get_port(pinfo); } receiver.client = snd_seq_port_info_get_client( pinfo ); receiver.port = data->vport; if ( !data->subscription ) { // Make subscription if (snd_seq_port_subscribe_malloc( &data->subscription ) < 0) { errorString_ = "MidiInAlsa::openPort: ALSA error allocation port subscription."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } snd_seq_port_subscribe_set_sender(data->subscription, &sender); snd_seq_port_subscribe_set_dest(data->subscription, &receiver); if ( snd_seq_subscribe_port(data->seq, data->subscription) ) { snd_seq_port_subscribe_free( data->subscription ); data->subscription = 0; errorString_ = "MidiInAlsa::openPort: ALSA error making port connection."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } } if ( inputData_.doInput == false ) { // Start the input queue #ifndef AVOID_TIMESTAMPING snd_seq_start_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); #endif // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_OTHER); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, alsaMidiHandler, &inputData_); pthread_attr_destroy(&attr); if ( err ) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); data->subscription = 0; inputData_.doInput = false; errorString_ = "MidiInAlsa::openPort: error starting MIDI input thread!"; error( RtMidiError::THREAD_ERROR, errorString_ ); return; } } connected_ = true; } void MidiInAlsa :: openVirtualPort( std::string portName ) { AlsaMidiData *data = static_cast (apiData_); if ( data->vport < 0 ) { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); snd_seq_port_info_set_capability( pinfo, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ); snd_seq_port_info_set_type( pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); snd_seq_port_info_set_midi_channels(pinfo, 16); #ifndef AVOID_TIMESTAMPING snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_real(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, data->queue_id); #endif snd_seq_port_info_set_name(pinfo, portName.c_str()); data->vport = snd_seq_create_port(data->seq, pinfo); if ( data->vport < 0 ) { errorString_ = "MidiInAlsa::openVirtualPort: ALSA error creating virtual port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } data->vport = snd_seq_port_info_get_port(pinfo); } if ( inputData_.doInput == false ) { // Wait for old thread to stop, if still running if ( !pthread_equal(data->thread, data->dummy_thread_id) ) pthread_join( data->thread, NULL ); // Start the input queue #ifndef AVOID_TIMESTAMPING snd_seq_start_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); #endif // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_OTHER); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, alsaMidiHandler, &inputData_); pthread_attr_destroy(&attr); if ( err ) { if ( data->subscription ) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); data->subscription = 0; } inputData_.doInput = false; errorString_ = "MidiInAlsa::openPort: error starting MIDI input thread!"; error( RtMidiError::THREAD_ERROR, errorString_ ); return; } } } void MidiInAlsa :: closePort( void ) { AlsaMidiData *data = static_cast (apiData_); if ( connected_ ) { if ( data->subscription ) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); data->subscription = 0; } // Stop the input queue #ifndef AVOID_TIMESTAMPING snd_seq_stop_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); #endif connected_ = false; } // Stop thread to avoid triggering the callback, while the port is intended to be closed if ( inputData_.doInput ) { inputData_.doInput = false; int res = write( data->trigger_fds[1], &inputData_.doInput, sizeof(inputData_.doInput) ); (void) res; if ( !pthread_equal(data->thread, data->dummy_thread_id) ) pthread_join( data->thread, NULL ); } } //*********************************************************************// // API: LINUX ALSA // Class Definitions: MidiOutAlsa //*********************************************************************// MidiOutAlsa :: MidiOutAlsa( const std::string clientName ) : MidiOutApi() { initialize( clientName ); } MidiOutAlsa :: ~MidiOutAlsa() { // Close a connection if it exists. closePort(); // Cleanup. AlsaMidiData *data = static_cast (apiData_); if ( data->vport >= 0 ) snd_seq_delete_port( data->seq, data->vport ); if ( data->coder ) snd_midi_event_free( data->coder ); if ( data->buffer ) free( data->buffer ); snd_seq_close( data->seq ); delete data; } void MidiOutAlsa :: initialize( const std::string& clientName ) { // Set up the ALSA sequencer client. snd_seq_t *seq; int result1 = snd_seq_open( &seq, "default", SND_SEQ_OPEN_OUTPUT, SND_SEQ_NONBLOCK ); if ( result1 < 0 ) { errorString_ = "MidiOutAlsa::initialize: error creating ALSA sequencer client object."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Set client name. snd_seq_set_client_name( seq, clientName.c_str() ); // Save our api-specific connection information. AlsaMidiData *data = (AlsaMidiData *) new AlsaMidiData; data->seq = seq; data->portNum = -1; data->vport = -1; data->bufferSize = 32; data->coder = 0; data->buffer = 0; int result = snd_midi_event_new( data->bufferSize, &data->coder ); if ( result < 0 ) { delete data; errorString_ = "MidiOutAlsa::initialize: error initializing MIDI event parser!\n\n"; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } data->buffer = (unsigned char *) malloc( data->bufferSize ); if ( data->buffer == NULL ) { delete data; errorString_ = "MidiOutAlsa::initialize: error allocating buffer memory!\n\n"; error( RtMidiError::MEMORY_ERROR, errorString_ ); return; } snd_midi_event_init( data->coder ); apiData_ = (void *) data; } unsigned int MidiOutAlsa :: getPortCount() { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); return portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, -1 ); } std::string MidiOutAlsa :: getPortName( unsigned int portNumber ) { snd_seq_client_info_t *cinfo; snd_seq_port_info_t *pinfo; snd_seq_client_info_alloca( &cinfo ); snd_seq_port_info_alloca( &pinfo ); std::string stringName; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) ) { int cnum = snd_seq_port_info_get_client(pinfo); snd_seq_get_any_client_info( data->seq, cnum, cinfo ); std::ostringstream os; os << snd_seq_client_info_get_name(cinfo); os << " "; // These lines added to make sure devices are listed os << snd_seq_port_info_get_client( pinfo ); // with full portnames added to ensure individual device names os << ":"; os << snd_seq_port_info_get_port(pinfo); stringName = os.str(); return stringName; } // If we get here, we didn't find a match. errorString_ = "MidiOutAlsa::getPortName: error looking for port name!"; error( RtMidiError::WARNING, errorString_ ); return stringName; } void MidiOutAlsa :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "MidiOutAlsa::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } unsigned int nSrc = this->getPortCount(); if (nSrc < 1) { errorString_ = "MidiOutAlsa::openPort: no MIDI output sources found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) == 0 ) { std::ostringstream ost; ost << "MidiOutAlsa::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } snd_seq_addr_t sender, receiver; receiver.client = snd_seq_port_info_get_client( pinfo ); receiver.port = snd_seq_port_info_get_port( pinfo ); sender.client = snd_seq_client_id( data->seq ); if ( data->vport < 0 ) { data->vport = snd_seq_create_simple_port( data->seq, portName.c_str(), SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION ); if ( data->vport < 0 ) { errorString_ = "MidiOutAlsa::openPort: ALSA error creating output port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } } sender.port = data->vport; // Make subscription if (snd_seq_port_subscribe_malloc( &data->subscription ) < 0) { snd_seq_port_subscribe_free( data->subscription ); errorString_ = "MidiOutAlsa::openPort: error allocating port subscription."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } snd_seq_port_subscribe_set_sender(data->subscription, &sender); snd_seq_port_subscribe_set_dest(data->subscription, &receiver); snd_seq_port_subscribe_set_time_update(data->subscription, 1); snd_seq_port_subscribe_set_time_real(data->subscription, 1); if ( snd_seq_subscribe_port(data->seq, data->subscription) ) { snd_seq_port_subscribe_free( data->subscription ); errorString_ = "MidiOutAlsa::openPort: ALSA error making port connection."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } connected_ = true; } void MidiOutAlsa :: closePort( void ) { if ( connected_ ) { AlsaMidiData *data = static_cast (apiData_); snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); connected_ = false; } } void MidiOutAlsa :: openVirtualPort( std::string portName ) { AlsaMidiData *data = static_cast (apiData_); if ( data->vport < 0 ) { data->vport = snd_seq_create_simple_port( data->seq, portName.c_str(), SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION ); if ( data->vport < 0 ) { errorString_ = "MidiOutAlsa::openVirtualPort: ALSA error creating virtual port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); } } } void MidiOutAlsa :: sendMessage( std::vector *message ) { int result; AlsaMidiData *data = static_cast (apiData_); unsigned int nBytes = message->size(); if ( nBytes > data->bufferSize ) { data->bufferSize = nBytes; result = snd_midi_event_resize_buffer ( data->coder, nBytes); if ( result != 0 ) { errorString_ = "MidiOutAlsa::sendMessage: ALSA error resizing MIDI event buffer."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } free (data->buffer); data->buffer = (unsigned char *) malloc( data->bufferSize ); if ( data->buffer == NULL ) { errorString_ = "MidiOutAlsa::initialize: error allocating buffer memory!\n\n"; error( RtMidiError::MEMORY_ERROR, errorString_ ); return; } } snd_seq_event_t ev; snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, data->vport); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); for ( unsigned int i=0; ibuffer[i] = message->at(i); result = snd_midi_event_encode( data->coder, data->buffer, (long)nBytes, &ev ); if ( result < (int)nBytes ) { errorString_ = "MidiOutAlsa::sendMessage: event parsing error!"; error( RtMidiError::WARNING, errorString_ ); return; } // Send the event. result = snd_seq_event_output(data->seq, &ev); if ( result < 0 ) { errorString_ = "MidiOutAlsa::sendMessage: error sending MIDI message to port."; error( RtMidiError::WARNING, errorString_ ); return; } snd_seq_drain_output(data->seq); } #endif // __LINUX_ALSA__ //*********************************************************************// // API: Windows Multimedia Library (MM) //*********************************************************************// // API information deciphered from: // - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_midi_reference.asp // Thanks to Jean-Baptiste Berruchon for the sysex code. #if defined(__WINDOWS_MM__) // The Windows MM API is based on the use of a callback function for // MIDI input. We convert the system specific time stamps to delta // time values. // Windows MM MIDI header files. #include #include #define RT_SYSEX_BUFFER_SIZE 1024 #define RT_SYSEX_BUFFER_COUNT 4 // A structure to hold variables related to the CoreMIDI API // implementation. struct WinMidiData { HMIDIIN inHandle; // Handle to Midi Input Device HMIDIOUT outHandle; // Handle to Midi Output Device DWORD lastTime; MidiInApi::MidiMessage message; LPMIDIHDR sysexBuffer[RT_SYSEX_BUFFER_COUNT]; CRITICAL_SECTION _mutex; // [Patrice] see https://groups.google.com/forum/#!topic/mididev/6OUjHutMpEo }; //*********************************************************************// // API: Windows MM // Class Definitions: MidiInWinMM //*********************************************************************// static void CALLBACK midiInputCallback( HMIDIIN /*hmin*/, UINT inputStatus, DWORD_PTR instancePtr, DWORD_PTR midiMessage, DWORD timestamp ) { if ( inputStatus != MIM_DATA && inputStatus != MIM_LONGDATA && inputStatus != MIM_LONGERROR ) return; //MidiInApi::RtMidiInData *data = static_cast (instancePtr); MidiInApi::RtMidiInData *data = (MidiInApi::RtMidiInData *)instancePtr; WinMidiData *apiData = static_cast (data->apiData); // Calculate time stamp. if ( data->firstMessage == true ) { apiData->message.timeStamp = 0.0; data->firstMessage = false; } else apiData->message.timeStamp = (double) ( timestamp - apiData->lastTime ) * 0.001; apiData->lastTime = timestamp; if ( inputStatus == MIM_DATA ) { // Channel or system message // Make sure the first byte is a status byte. unsigned char status = (unsigned char) (midiMessage & 0x000000FF); if ( !(status & 0x80) ) return; // Determine the number of bytes in the MIDI message. unsigned short nBytes = 1; if ( status < 0xC0 ) nBytes = 3; else if ( status < 0xE0 ) nBytes = 2; else if ( status < 0xF0 ) nBytes = 3; else if ( status == 0xF1 ) { if ( data->ignoreFlags & 0x02 ) return; else nBytes = 2; } else if ( status == 0xF2 ) nBytes = 3; else if ( status == 0xF3 ) nBytes = 2; else if ( status == 0xF8 && (data->ignoreFlags & 0x02) ) { // A MIDI timing tick message and we're ignoring it. return; } else if ( status == 0xFE && (data->ignoreFlags & 0x04) ) { // A MIDI active sensing message and we're ignoring it. return; } // Copy bytes to our MIDI message. unsigned char *ptr = (unsigned char *) &midiMessage; for ( int i=0; imessage.bytes.push_back( *ptr++ ); } else { // Sysex message ( MIM_LONGDATA or MIM_LONGERROR ) MIDIHDR *sysex = ( MIDIHDR *) midiMessage; if ( !( data->ignoreFlags & 0x01 ) && inputStatus != MIM_LONGERROR ) { // Sysex message and we're not ignoring it for ( int i=0; i<(int)sysex->dwBytesRecorded; ++i ) apiData->message.bytes.push_back( sysex->lpData[i] ); } // The WinMM API requires that the sysex buffer be requeued after // input of each sysex message. Even if we are ignoring sysex // messages, we still need to requeue the buffer in case the user // decides to not ignore sysex messages in the future. However, // it seems that WinMM calls this function with an empty sysex // buffer when an application closes and in this case, we should // avoid requeueing it, else the computer suddenly reboots after // one or two minutes. if ( apiData->sysexBuffer[sysex->dwUser]->dwBytesRecorded > 0 ) { //if ( sysex->dwBytesRecorded > 0 ) { EnterCriticalSection( &(apiData->_mutex) ); MMRESULT result = midiInAddBuffer( apiData->inHandle, apiData->sysexBuffer[sysex->dwUser], sizeof(MIDIHDR) ); LeaveCriticalSection( &(apiData->_mutex) ); if ( result != MMSYSERR_NOERROR ) std::cerr << "\nRtMidiIn::midiInputCallback: error sending sysex to Midi device!!\n\n"; if ( data->ignoreFlags & 0x01 ) return; } else return; } if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( apiData->message.timeStamp, &apiData->message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queue.size < data->queue.ringSize ) { data->queue.ring[data->queue.back++] = apiData->message; if ( data->queue.back == data->queue.ringSize ) data->queue.back = 0; data->queue.size++; } else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } // Clear the vector for the next input message. apiData->message.bytes.clear(); } MidiInWinMM :: MidiInWinMM( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { initialize( clientName ); } MidiInWinMM :: ~MidiInWinMM() { // Close a connection if it exists. closePort(); WinMidiData *data = static_cast (apiData_); DeleteCriticalSection( &(data->_mutex) ); // Cleanup. delete data; } void MidiInWinMM :: initialize( const std::string& /*clientName*/ ) { // We'll issue a warning here if no devices are available but not // throw an error since the user can plugin something later. unsigned int nDevices = midiInGetNumDevs(); if ( nDevices == 0 ) { errorString_ = "MidiInWinMM::initialize: no MIDI input devices currently available."; error( RtMidiError::WARNING, errorString_ ); } // Save our api-specific connection information. WinMidiData *data = (WinMidiData *) new WinMidiData; apiData_ = (void *) data; inputData_.apiData = (void *) data; data->message.bytes.clear(); // needs to be empty for first input message if ( !InitializeCriticalSectionAndSpinCount(&(data->_mutex), 0x00000400) ) { errorString_ = "MidiInWinMM::initialize: InitializeCriticalSectionAndSpinCount failed."; error( RtMidiError::WARNING, errorString_ ); } } void MidiInWinMM :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { if ( connected_ ) { errorString_ = "MidiInWinMM::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } unsigned int nDevices = midiInGetNumDevs(); if (nDevices == 0) { errorString_ = "MidiInWinMM::openPort: no MIDI input sources found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "MidiInWinMM::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } WinMidiData *data = static_cast (apiData_); MMRESULT result = midiInOpen( &data->inHandle, portNumber, (DWORD_PTR)&midiInputCallback, (DWORD_PTR)&inputData_, CALLBACK_FUNCTION ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "MidiInWinMM::openPort: error creating Windows MM MIDI input port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Allocate and init the sysex buffers. for ( int i=0; isysexBuffer[i] = (MIDIHDR*) new char[ sizeof(MIDIHDR) ]; data->sysexBuffer[i]->lpData = new char[ RT_SYSEX_BUFFER_SIZE ]; data->sysexBuffer[i]->dwBufferLength = RT_SYSEX_BUFFER_SIZE; data->sysexBuffer[i]->dwUser = i; // We use the dwUser parameter as buffer indicator data->sysexBuffer[i]->dwFlags = 0; result = midiInPrepareHeader( data->inHandle, data->sysexBuffer[i], sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "MidiInWinMM::openPort: error starting Windows MM MIDI input port (PrepareHeader)."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Register the buffer. result = midiInAddBuffer( data->inHandle, data->sysexBuffer[i], sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "MidiInWinMM::openPort: error starting Windows MM MIDI input port (AddBuffer)."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } } result = midiInStart( data->inHandle ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "MidiInWinMM::openPort: error starting Windows MM MIDI input port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } connected_ = true; } void MidiInWinMM :: openVirtualPort( std::string /*portName*/ ) { // This function cannot be implemented for the Windows MM MIDI API. errorString_ = "MidiInWinMM::openVirtualPort: cannot be implemented in Windows MM MIDI API!"; error( RtMidiError::WARNING, errorString_ ); } void MidiInWinMM :: closePort( void ) { if ( connected_ ) { WinMidiData *data = static_cast (apiData_); EnterCriticalSection( &(data->_mutex) ); midiInReset( data->inHandle ); midiInStop( data->inHandle ); for ( int i=0; iinHandle, data->sysexBuffer[i], sizeof(MIDIHDR)); delete [] data->sysexBuffer[i]->lpData; delete [] data->sysexBuffer[i]; if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "MidiInWinMM::openPort: error closing Windows MM MIDI input port (midiInUnprepareHeader)."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } } midiInClose( data->inHandle ); connected_ = false; LeaveCriticalSection( &(data->_mutex) ); } } unsigned int MidiInWinMM :: getPortCount() { return midiInGetNumDevs(); } std::string MidiInWinMM :: getPortName( unsigned int portNumber ) { std::string stringName; unsigned int nDevices = midiInGetNumDevs(); if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "MidiInWinMM::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); return stringName; } MIDIINCAPS deviceCaps; midiInGetDevCaps( portNumber, &deviceCaps, sizeof(MIDIINCAPS)); #if defined( UNICODE ) || defined( _UNICODE ) int length = WideCharToMultiByte(CP_UTF8, 0, deviceCaps.szPname, -1, NULL, 0, NULL, NULL) - 1; stringName.assign( length, 0 ); length = WideCharToMultiByte(CP_UTF8, 0, deviceCaps.szPname, static_cast(wcslen(deviceCaps.szPname)), &stringName[0], length, NULL, NULL); #else stringName = std::string( deviceCaps.szPname ); #endif // Next lines added to add the portNumber to the name so that // the device's names are sure to be listed with individual names // even when they have the same brand name std::ostringstream os; os << " "; os << portNumber; stringName += os.str(); return stringName; } //*********************************************************************// // API: Windows MM // Class Definitions: MidiOutWinMM //*********************************************************************// MidiOutWinMM :: MidiOutWinMM( const std::string clientName ) : MidiOutApi() { initialize( clientName ); } MidiOutWinMM :: ~MidiOutWinMM() { // Close a connection if it exists. closePort(); // Cleanup. WinMidiData *data = static_cast (apiData_); delete data; } void MidiOutWinMM :: initialize( const std::string& /*clientName*/ ) { // We'll issue a warning here if no devices are available but not // throw an error since the user can plug something in later. unsigned int nDevices = midiOutGetNumDevs(); if ( nDevices == 0 ) { errorString_ = "MidiOutWinMM::initialize: no MIDI output devices currently available."; error( RtMidiError::WARNING, errorString_ ); } // Save our api-specific connection information. WinMidiData *data = (WinMidiData *) new WinMidiData; apiData_ = (void *) data; } unsigned int MidiOutWinMM :: getPortCount() { return midiOutGetNumDevs(); } std::string MidiOutWinMM :: getPortName( unsigned int portNumber ) { std::string stringName; unsigned int nDevices = midiOutGetNumDevs(); if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "MidiOutWinMM::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); return stringName; } MIDIOUTCAPS deviceCaps; midiOutGetDevCaps( portNumber, &deviceCaps, sizeof(MIDIOUTCAPS)); #if defined( UNICODE ) || defined( _UNICODE ) int length = WideCharToMultiByte(CP_UTF8, 0, deviceCaps.szPname, -1, NULL, 0, NULL, NULL) - 1; stringName.assign( length, 0 ); length = WideCharToMultiByte(CP_UTF8, 0, deviceCaps.szPname, static_cast(wcslen(deviceCaps.szPname)), &stringName[0], length, NULL, NULL); #else stringName = std::string( deviceCaps.szPname ); #endif return stringName; } void MidiOutWinMM :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { if ( connected_ ) { errorString_ = "MidiOutWinMM::openPort: a valid connection already exists!"; error( RtMidiError::WARNING, errorString_ ); return; } unsigned int nDevices = midiOutGetNumDevs(); if (nDevices < 1) { errorString_ = "MidiOutWinMM::openPort: no MIDI output destinations found!"; error( RtMidiError::NO_DEVICES_FOUND, errorString_ ); return; } if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "MidiOutWinMM::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::INVALID_PARAMETER, errorString_ ); return; } WinMidiData *data = static_cast (apiData_); MMRESULT result = midiOutOpen( &data->outHandle, portNumber, (DWORD)NULL, (DWORD)NULL, CALLBACK_NULL ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "MidiOutWinMM::openPort: error creating Windows MM MIDI output port."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } connected_ = true; } void MidiOutWinMM :: closePort( void ) { if ( connected_ ) { WinMidiData *data = static_cast (apiData_); midiOutReset( data->outHandle ); midiOutClose( data->outHandle ); connected_ = false; } } void MidiOutWinMM :: openVirtualPort( std::string /*portName*/ ) { // This function cannot be implemented for the Windows MM MIDI API. errorString_ = "MidiOutWinMM::openVirtualPort: cannot be implemented in Windows MM MIDI API!"; error( RtMidiError::WARNING, errorString_ ); } void MidiOutWinMM :: sendMessage( std::vector *message ) { if ( !connected_ ) return; unsigned int nBytes = static_cast(message->size()); if ( nBytes == 0 ) { errorString_ = "MidiOutWinMM::sendMessage: message argument is empty!"; error( RtMidiError::WARNING, errorString_ ); return; } MMRESULT result; WinMidiData *data = static_cast (apiData_); if ( message->at(0) == 0xF0 ) { // Sysex message // Allocate buffer for sysex data. char *buffer = (char *) malloc( nBytes ); if ( buffer == NULL ) { errorString_ = "MidiOutWinMM::sendMessage: error allocating sysex message memory!"; error( RtMidiError::MEMORY_ERROR, errorString_ ); return; } // Copy data to buffer. for ( unsigned int i=0; iat(i); // Create and prepare MIDIHDR structure. MIDIHDR sysex; sysex.lpData = (LPSTR) buffer; sysex.dwBufferLength = nBytes; sysex.dwFlags = 0; result = midiOutPrepareHeader( data->outHandle, &sysex, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { free( buffer ); errorString_ = "MidiOutWinMM::sendMessage: error preparing sysex header."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Send the message. result = midiOutLongMsg( data->outHandle, &sysex, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { free( buffer ); errorString_ = "MidiOutWinMM::sendMessage: error sending sysex message."; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Unprepare the buffer and MIDIHDR. while ( MIDIERR_STILLPLAYING == midiOutUnprepareHeader( data->outHandle, &sysex, sizeof (MIDIHDR) ) ) Sleep( 1 ); free( buffer ); } else { // Channel or system message. // Make sure the message size isn't too big. if ( nBytes > 3 ) { errorString_ = "MidiOutWinMM::sendMessage: message size is greater than 3 bytes (and not sysex)!"; error( RtMidiError::WARNING, errorString_ ); return; } // Pack MIDI bytes into double word. DWORD packet; unsigned char *ptr = (unsigned char *) &packet; for ( unsigned int i=0; iat(i); ++ptr; } // Send the message immediately. result = midiOutShortMsg( data->outHandle, packet ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "MidiOutWinMM::sendMessage: error sending MIDI message."; error( RtMidiError::DRIVER_ERROR, errorString_ ); } } } #endif // __WINDOWS_MM__ //*********************************************************************// // API: UNIX JACK // // Written primarily by Alexander Svetalkin, with updates for delta // time by Gary Scavone, April 2011. // // *********************************************************************// #if defined(__UNIX_JACK__) // JACK header files #include #include #include #define JACK_RINGBUFFER_SIZE 16384 // Default size for ringbuffer struct JackMidiData { jack_client_t *client; jack_port_t *port; jack_ringbuffer_t *buffSize; jack_ringbuffer_t *buffMessage; jack_time_t lastTime; MidiInApi :: RtMidiInData *rtMidiIn; }; //*********************************************************************// // API: JACK // Class Definitions: MidiInJack //*********************************************************************// static int jackProcessIn( jack_nframes_t nframes, void *arg ) { JackMidiData *jData = (JackMidiData *) arg; MidiInApi :: RtMidiInData *rtData = jData->rtMidiIn; jack_midi_event_t event; jack_time_t time; // Is port created? if ( jData->port == NULL ) return 0; void *buff = jack_port_get_buffer( jData->port, nframes ); // We have midi events in buffer int evCount = jack_midi_get_event_count( buff ); for (int j = 0; j < evCount; j++) { MidiInApi::MidiMessage message; message.bytes.clear(); jack_midi_event_get( &event, buff, j ); for ( unsigned int i = 0; i < event.size; i++ ) message.bytes.push_back( event.buffer[i] ); // Compute the delta time. time = jack_get_time(); if ( rtData->firstMessage == true ) rtData->firstMessage = false; else message.timeStamp = ( time - jData->lastTime ) * 0.000001; jData->lastTime = time; if ( !rtData->continueSysex ) { if ( rtData->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) rtData->userCallback; callback( message.timeStamp, &message.bytes, rtData->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( rtData->queue.size < rtData->queue.ringSize ) { rtData->queue.ring[rtData->queue.back++] = message; if ( rtData->queue.back == rtData->queue.ringSize ) rtData->queue.back = 0; rtData->queue.size++; } else std::cerr << "\nMidiInJack: message queue limit reached!!\n\n"; } } } return 0; } MidiInJack :: MidiInJack( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { initialize( clientName ); } void MidiInJack :: initialize( const std::string& clientName ) { JackMidiData *data = new JackMidiData; apiData_ = (void *) data; data->rtMidiIn = &inputData_; data->port = NULL; data->client = NULL; this->clientName = clientName; connect(); } void MidiInJack :: connect() { JackMidiData *data = static_cast (apiData_); if ( data->client ) return; // Initialize JACK client if (( data->client = jack_client_open( clientName.c_str(), JackNoStartServer, NULL )) == 0) { errorString_ = "MidiInJack::initialize: JACK server not running?"; error( RtMidiError::WARNING, errorString_ ); return; } jack_set_process_callback( data->client, jackProcessIn, data ); jack_activate( data->client ); } MidiInJack :: ~MidiInJack() { JackMidiData *data = static_cast (apiData_); closePort(); if ( data->client ) jack_client_close( data->client ); delete data; } void MidiInJack :: openPort( unsigned int portNumber, const std::string portName ) { JackMidiData *data = static_cast (apiData_); connect(); // Creating new port if ( data->port == NULL) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0 ); if ( data->port == NULL) { errorString_ = "MidiInJack::openPort: JACK error creating port"; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Connecting to the output std::string name = getPortName( portNumber ); jack_connect( data->client, name.c_str(), jack_port_name( data->port ) ); } void MidiInJack :: openVirtualPort( const std::string portName ) { JackMidiData *data = static_cast (apiData_); connect(); if ( data->port == NULL ) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0 ); if ( data->port == NULL ) { errorString_ = "MidiInJack::openVirtualPort: JACK error creating virtual port"; error( RtMidiError::DRIVER_ERROR, errorString_ ); } } unsigned int MidiInJack :: getPortCount() { int count = 0; JackMidiData *data = static_cast (apiData_); connect(); if ( !data->client ) return 0; // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput ); if ( ports == NULL ) return 0; while ( ports[count] != NULL ) count++; free( ports ); return count; } std::string MidiInJack :: getPortName( unsigned int portNumber ) { JackMidiData *data = static_cast (apiData_); std::string retStr(""); connect(); // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput ); // Check port validity if ( ports == NULL ) { errorString_ = "MidiInJack::getPortName: no ports available!"; error( RtMidiError::WARNING, errorString_ ); return retStr; } if ( ports[portNumber] == NULL ) { std::ostringstream ost; ost << "MidiInJack::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); } else retStr.assign( ports[portNumber] ); free( ports ); return retStr; } void MidiInJack :: closePort() { JackMidiData *data = static_cast (apiData_); if ( data->port == NULL ) return; jack_port_unregister( data->client, data->port ); data->port = NULL; } //*********************************************************************// // API: JACK // Class Definitions: MidiOutJack //*********************************************************************// // Jack process callback static int jackProcessOut( jack_nframes_t nframes, void *arg ) { JackMidiData *data = (JackMidiData *) arg; jack_midi_data_t *midiData; int space; // Is port created? if ( data->port == NULL ) return 0; void *buff = jack_port_get_buffer( data->port, nframes ); jack_midi_clear_buffer( buff ); while ( jack_ringbuffer_read_space( data->buffSize ) > 0 ) { jack_ringbuffer_read( data->buffSize, (char *) &space, (size_t) sizeof(space) ); midiData = jack_midi_event_reserve( buff, 0, space ); jack_ringbuffer_read( data->buffMessage, (char *) midiData, (size_t) space ); } return 0; } MidiOutJack :: MidiOutJack( const std::string clientName ) : MidiOutApi() { initialize( clientName ); } void MidiOutJack :: initialize( const std::string& clientName ) { JackMidiData *data = new JackMidiData; apiData_ = (void *) data; data->port = NULL; data->client = NULL; this->clientName = clientName; connect(); } void MidiOutJack :: connect() { JackMidiData *data = static_cast (apiData_); if ( data->client ) return; // Initialize JACK client if (( data->client = jack_client_open( clientName.c_str(), JackNoStartServer, NULL )) == 0) { errorString_ = "MidiOutJack::initialize: JACK server not running?"; error( RtMidiError::WARNING, errorString_ ); return; } jack_set_process_callback( data->client, jackProcessOut, data ); data->buffSize = jack_ringbuffer_create( JACK_RINGBUFFER_SIZE ); data->buffMessage = jack_ringbuffer_create( JACK_RINGBUFFER_SIZE ); jack_activate( data->client ); } MidiOutJack :: ~MidiOutJack() { JackMidiData *data = static_cast (apiData_); closePort(); if ( data->client ) { // Cleanup jack_client_close( data->client ); jack_ringbuffer_free( data->buffSize ); jack_ringbuffer_free( data->buffMessage ); } delete data; } void MidiOutJack :: openPort( unsigned int portNumber, const std::string portName ) { JackMidiData *data = static_cast (apiData_); connect(); // Creating new port if ( data->port == NULL ) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0 ); if ( data->port == NULL ) { errorString_ = "MidiOutJack::openPort: JACK error creating port"; error( RtMidiError::DRIVER_ERROR, errorString_ ); return; } // Connecting to the output std::string name = getPortName( portNumber ); jack_connect( data->client, jack_port_name( data->port ), name.c_str() ); } void MidiOutJack :: openVirtualPort( const std::string portName ) { JackMidiData *data = static_cast (apiData_); connect(); if ( data->port == NULL ) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0 ); if ( data->port == NULL ) { errorString_ = "MidiOutJack::openVirtualPort: JACK error creating virtual port"; error( RtMidiError::DRIVER_ERROR, errorString_ ); } } unsigned int MidiOutJack :: getPortCount() { int count = 0; JackMidiData *data = static_cast (apiData_); connect(); if ( !data->client ) return 0; // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput ); if ( ports == NULL ) return 0; while ( ports[count] != NULL ) count++; free( ports ); return count; } std::string MidiOutJack :: getPortName( unsigned int portNumber ) { JackMidiData *data = static_cast (apiData_); std::string retStr(""); connect(); // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput ); // Check port validity if ( ports == NULL) { errorString_ = "MidiOutJack::getPortName: no ports available!"; error( RtMidiError::WARNING, errorString_ ); return retStr; } if ( ports[portNumber] == NULL) { std::ostringstream ost; ost << "MidiOutJack::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtMidiError::WARNING, errorString_ ); } else retStr.assign( ports[portNumber] ); free( ports ); return retStr; } void MidiOutJack :: closePort() { JackMidiData *data = static_cast (apiData_); if ( data->port == NULL ) return; jack_port_unregister( data->client, data->port ); data->port = NULL; } void MidiOutJack :: sendMessage( std::vector *message ) { int nBytes = message->size(); JackMidiData *data = static_cast (apiData_); // Write full message to buffer jack_ringbuffer_write( data->buffMessage, ( const char * ) &( *message )[0], message->size() ); jack_ringbuffer_write( data->buffSize, ( char * ) &nBytes, sizeof( nBytes ) ); } #endif // __UNIX_JACK__ stk-4.5.0/src/RtWvIn.cpp0000644000076600007660000001333512327014024012624 0ustar gary/***************************************************/ /*! \class RtWvIn \brief STK realtime audio (blocking) input class. This class provides a simplified interface to RtAudio for realtime audio input. It is a subclass of WvIn. This class makes use of RtAudio's callback functionality by creating a large ring-buffer from which data is read. This class should not be used when low-latency is desired. RtWvIn supports multi-channel data in both interleaved and non-interleaved formats. It is important to distinguish the tick() method that computes a single frame (and returns only the specified sample of a multi-channel frame) from the overloaded one that takes an StkFrames object for multi-channel and/or multi-frame data. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "RtWvIn.h" #include namespace stk { // This function is automatically called by RtAudio to supply input audio data. int read( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *dataPointer ) { ( (RtWvIn *) dataPointer )->fillBuffer( inputBuffer, nBufferFrames ); return 0; } // This function does not block. If the user does not read the buffer // data fast enough, unread data will be overwritten (data overrun). void RtWvIn :: fillBuffer( void *buffer, unsigned int nFrames ) { StkFloat *samples = (StkFloat *) buffer; unsigned int counter, iStart, nSamples = nFrames * data_.channels(); while ( nSamples > 0 ) { // I'm assuming that both the RtAudio and StkFrames buffers // contain interleaved data. iStart = writeIndex_ * data_.channels(); counter = nSamples; // Pre-increment write pointer and check bounds. writeIndex_ += nSamples / data_.channels(); if ( writeIndex_ >= data_.frames() ) { writeIndex_ = 0; counter = data_.size() - iStart; } // Copy data to the StkFrames container. for ( unsigned int i=0; i data_.frames() ) { framesFilled_ = data_.frames(); oStream_ << "RtWvIn: audio buffer overrun!"; handleError( StkError::WARNING ); } } RtWvIn :: RtWvIn( unsigned int nChannels, StkFloat sampleRate, int device, int bufferFrames, int nBuffers ) : stopped_( true ), readIndex_( 0 ), writeIndex_( 0 ), framesFilled_( 0 ) { // We'll let RtAudio deal with channel and sample rate limitations. RtAudio::StreamParameters parameters; if ( device == 0 ) parameters.deviceId = adc_.getDefaultInputDevice(); else parameters.deviceId = device - 1; parameters.nChannels = nChannels; unsigned int size = bufferFrames; RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32; try { adc_.openStream( NULL, ¶meters, format, (unsigned int)Stk::sampleRate(), &size, &read, (void *)this ); } catch ( RtAudioError &error ) { handleError( error.what(), StkError::AUDIO_SYSTEM ); } data_.resize( size * nBuffers, nChannels ); lastFrame_.resize( 1, nChannels ); } RtWvIn :: ~RtWvIn() { if ( !stopped_ ) adc_.stopStream(); adc_.closeStream(); } void RtWvIn :: start() { if ( stopped_ ) { adc_.startStream(); stopped_ = false; } } void RtWvIn :: stop() { if ( !stopped_ ) { adc_.stopStream(); stopped_ = true; for ( unsigned int i=0; i= data_.channels() ) { oStream_ << "RtWvIn::tick(): channel argument is incompatible with streamed channels!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif if ( stopped_ ) this->start(); // Block until at least one frame is available. while ( framesFilled_ == 0 ) Stk::sleep( 1 ); unsigned long index = readIndex_ * lastFrame_.channels(); for ( unsigned int i=0; i= data_.frames() ) readIndex_ = 0; return lastFrame_[channel]; } StkFrames& RtWvIn :: tick( StkFrames& frames ) { unsigned int nChannels = lastFrame_.channels(); #if defined(_STK_DEBUG_) if ( nChannels != frames.channels() ) { oStream_ << "RtWvIn::tick(): StkFrames argument is incompatible with adc channels!"; handleError( StkError::FUNCTION_ARGUMENT ); } #endif if ( stopped_ ) this->start(); // See how much space we have and fill as much as we can ... if we // still have space left in the frames object, then wait and repeat. unsigned int nFrames, bytes, framesRead = 0; while ( framesRead < frames.frames() ) { // Block until we have some input data. while ( framesFilled_ == 0 ) Stk::sleep( 1 ); // Copy data in one chunk up to the end of the data buffer. nFrames = framesFilled_; if ( readIndex_ + nFrames > data_.frames() ) nFrames = data_.frames() - readIndex_; if ( nFrames > frames.frames() - framesRead ) nFrames = frames.frames() - framesRead; bytes = nFrames * nChannels * sizeof( StkFloat ); StkFloat *samples = &data_[readIndex_ * nChannels]; memcpy( &frames[framesRead * nChannels], samples, bytes ); readIndex_ += nFrames; if ( readIndex_ == data_.frames() ) readIndex_ = 0; framesRead += nFrames; mutex_.lock(); framesFilled_ -= nFrames; mutex_.unlock(); } unsigned long index = (frames.frames() - 1) * nChannels; for ( unsigned int i=0; i namespace stk { // Streaming status states. enum { RUNNING, EMPTYING, FINISHED }; // This function is automatically called by RtAudio to get audio data for output. int write( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *dataPointer ) { return ( (RtWvOut *) dataPointer )->readBuffer( outputBuffer, nBufferFrames ); } // This function does not block. If the user does not write output // data to the buffer fast enough, previous data will be re-output // (data underrun). int RtWvOut :: readBuffer( void *buffer, unsigned int frameCount ) { unsigned int nSamples, nChannels = data_.channels(); unsigned int nFrames = frameCount; StkFloat *input = (StkFloat *) &data_[ readIndex_ * nChannels ]; StkFloat *output = (StkFloat *) buffer; long counter; while ( nFrames > 0 ) { // I'm assuming that both the RtAudio and StkFrames buffers // contain interleaved data. counter = nFrames; // Pre-increment read pointer and check bounds. readIndex_ += nFrames; if ( readIndex_ >= data_.frames() ) { counter -= readIndex_ - data_.frames(); readIndex_ = 0; } // Copy data from the StkFrames container. if ( status_ == EMPTYING && framesFilled_ <= counter ) { nSamples = framesFilled_ * nChannels; unsigned int i; for ( i=0; istart(); // Block until we have room for at least one frame of output data. while ( framesFilled_ == (long) data_.frames() ) Stk::sleep( 1 ); unsigned int nChannels = data_.channels(); StkFloat input = sample; clipTest( input ); unsigned long index = writeIndex_ * nChannels; for ( unsigned int j=0; jstart(); // See how much space we have and fill as much as we can ... if we // still have samples left in the frames object, then wait and // repeat. unsigned int framesEmpty, nFrames, bytes, framesWritten = 0; unsigned int nChannels = data_.channels(); while ( framesWritten < frames.frames() ) { // Block until we have some room for output data. while ( framesFilled_ == (long) data_.frames() ) Stk::sleep( 1 ); framesEmpty = data_.frames() - framesFilled_; // Copy data in one chunk up to the end of the data buffer. nFrames = framesEmpty; if ( writeIndex_ + nFrames > data_.frames() ) nFrames = data_.frames() - writeIndex_; if ( nFrames > frames.frames() - framesWritten ) nFrames = frames.frames() - framesWritten; bytes = nFrames * nChannels * sizeof( StkFloat ); StkFloat *samples = &data_[writeIndex_ * nChannels]; StkFrames *ins = (StkFrames *) &frames; memcpy( samples, &(*ins)[framesWritten * nChannels], bytes ); for ( unsigned int i=0; ireset(); // Start the envelope. adsr_.keyOn(); } void Sampler :: keyOff( void ) { adsr_.keyOff(); } void Sampler :: noteOff( StkFloat amplitude ) { this->keyOff(); } } // stk namespace stk-4.5.0/src/Saxofony.cpp0000644000076600007660000001206512327014024013240 0ustar gary/***************************************************/ /*! \class Saxofony \brief STK faux conical bore reed instrument class. This class implements a "hybrid" digital waveguide instrument that can generate a variety of wind-like sounds. It has also been referred to as the "blowed string" model. The waveguide section is essentially that of a string, with one rigid and one lossy termination. The non-linear function is a reed table. The string can be "blown" at any point between the terminations, though just as with strings, it is impossible to excite the system at either end. If the excitation is placed at the string mid-point, the sound is that of a clarinet. At points closer to the "bridge", the sound is closer to that of a saxophone. See Scavone (2002) for more details. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Reed Stiffness = 2 - Reed Aperture = 26 - Noise Gain = 4 - Blow Position = 11 - Vibrato Frequency = 29 - Vibrato Gain = 1 - Breath Pressure = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Saxofony.h" #include "SKINI.msg" namespace stk { Saxofony :: Saxofony( StkFloat lowestFrequency ) { if ( lowestFrequency <= 0.0 ) { oStream_ << "Saxofony::Saxofony: argument is less than or equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } unsigned long nDelays = (unsigned long) ( Stk::sampleRate() / lowestFrequency ); delays_[0].setMaximumDelay( nDelays + 1 ); delays_[1].setMaximumDelay( nDelays + 1 ); // Initialize blowing position to 0.2 of length. position_ = 0.2; reedTable_.setOffset( 0.7 ); reedTable_.setSlope( 0.3 ); vibrato_.setFrequency( 5.735 ); outputGain_ = 0.3; noiseGain_ = 0.2; vibratoGain_ = 0.1; this->setFrequency( 220.0 ); this->clear(); } Saxofony :: ~Saxofony( void ) { } void Saxofony :: clear( void ) { delays_[0].clear(); delays_[1].clear(); filter_.clear(); } void Saxofony :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Saxofony::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif // Account for filter delay and one sample "lastOut" delay. StkFloat delay = ( Stk::sampleRate() / frequency ) - filter_.phaseDelay( frequency ) - 1.0; delays_[0].setDelay( (1.0-position_) * delay ); delays_[1].setDelay( position_ * delay ); } void Saxofony :: setBlowPosition( StkFloat position ) { if ( position_ == position ) return; if ( position < 0.0 ) position_ = 0.0; else if ( position > 1.0 ) position_ = 1.0; else position_ = position; StkFloat totalDelay = delays_[0].getDelay(); totalDelay += delays_[1].getDelay(); delays_[0].setDelay( (1.0-position_) * totalDelay ); delays_[1].setDelay( position_ * totalDelay ); } void Saxofony :: startBlowing( StkFloat amplitude, StkFloat rate ) { if ( amplitude <= 0.0 || rate <= 0.0 ) { oStream_ << "Saxofony::startBlowing: one or more arguments is less than or equal to zero!"; handleError( StkError::WARNING ); return; } envelope_.setRate( rate ); envelope_.setTarget( amplitude ); } void Saxofony :: stopBlowing( StkFloat rate ) { if ( rate <= 0.0 ) { oStream_ << "Saxofony::stopBlowing: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } envelope_.setRate( rate ); envelope_.setTarget( 0.0 ); } void Saxofony :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); this->startBlowing( 0.55 + (amplitude * 0.30), amplitude * 0.005 ); outputGain_ = amplitude + 0.001; } void Saxofony :: noteOff( StkFloat amplitude ) { this->stopBlowing( amplitude * 0.01 ); } void Saxofony :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Saxofony::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_ReedStiffness_) // 2 reedTable_.setSlope( 0.1 + (0.4 * normalizedValue) ); else if (number == __SK_NoiseLevel_) // 4 noiseGain_ = ( normalizedValue * 0.4 ); else if (number == 29) // 29 vibrato_.setFrequency( normalizedValue * 12.0 ); else if (number == __SK_ModWheel_) // 1 vibratoGain_ = ( normalizedValue * 0.5 ); else if (number == __SK_AfterTouch_Cont_) // 128 envelope_.setValue( normalizedValue ); else if (number == 11) // 11 this->setBlowPosition( normalizedValue ); else if (number == 26) // reed table offset reedTable_.setOffset(0.4 + ( normalizedValue * 0.6)); #if defined(_STK_DEBUG_) else { oStream_ << "Saxofony::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Shakers.cpp0000644000076600007660000006561312327014024013041 0ustar gary/***************************************************/ /*! \class Shakers \brief PhISEM and PhOLIES class. PhISEM (Physically Informed Stochastic Event Modeling) is an algorithmic approach for simulating collisions of multiple independent sound producing objects. This class is a meta-model that can simulate a Maraca, Sekere, Cabasa, Bamboo Wind Chimes, Water Drops, Tambourine, Sleighbells, and a Guiro. PhOLIES (Physically-Oriented Library of Imitated Environmental Sounds) is a similar approach for the synthesis of environmental sounds. This class implements simulations of breaking sticks, crunchy snow (or not), a wrench, sandpaper, and more. Control Change Numbers: - Shake Energy = 2 - System Decay = 4 - Number Of Objects = 11 - Resonance Frequency = 1 - Shake Energy = 128 - Instrument Selection = 1071 - Maraca = 0 - Cabasa = 1 - Sekere = 2 - Tambourine = 3 - Sleigh Bells = 4 - Bamboo Chimes = 5 - Sand Paper = 6 - Coke Can = 7 - Sticks = 8 - Crunch = 9 - Big Rocks = 10 - Little Rocks = 11 - Next Mug = 12 - Penny + Mug = 13 - Nickle + Mug = 14 - Dime + Mug = 15 - Quarter + Mug = 16 - Franc + Mug = 17 - Peso + Mug = 18 - Guiro = 19 - Wrench = 20 - Water Drops = 21 - Tuned Bamboo Chimes = 22 by Perry R. Cook with updates by Gary Scavone, 1995--2014. */ /***************************************************/ #include "Shakers.h" #include "SKINI.msg" namespace stk { // Maraca const StkFloat MARACA_SOUND_DECAY = 0.95; const StkFloat MARACA_SYSTEM_DECAY = 0.999; const StkFloat MARACA_GAIN = 4.0; const StkFloat MARACA_NUM_BEANS = 25; const int MARACA_RESONANCES = 1; const StkFloat MARACA_FREQUENCIES[MARACA_RESONANCES] = { 3200 }; const StkFloat MARACA_RADII[MARACA_RESONANCES] = { 0.96 }; const StkFloat MARACA_GAINS[MARACA_RESONANCES] = { 1.0 }; // Cabasa const StkFloat CABASA_SOUND_DECAY = 0.96; const StkFloat CABASA_SYSTEM_DECAY = 0.997; const StkFloat CABASA_GAIN = 8.0; const StkFloat CABASA_NUM_BEADS = 512; const int CABASA_RESONANCES = 1; const StkFloat CABASA_FREQUENCIES[CABASA_RESONANCES] = { 3000 }; const StkFloat CABASA_RADII[CABASA_RESONANCES] = { 0.7 }; const StkFloat CABASA_GAINS[CABASA_RESONANCES] = { 1.0 }; // Sekere const StkFloat SEKERE_SOUND_DECAY = 0.96; const StkFloat SEKERE_SYSTEM_DECAY = 0.999; const StkFloat SEKERE_GAIN = 4.0; const StkFloat SEKERE_NUM_BEANS = 64; const int SEKERE_RESONANCES = 1; const StkFloat SEKERE_FREQUENCIES[SEKERE_RESONANCES] = { 5500 }; const StkFloat SEKERE_RADII[SEKERE_RESONANCES] = { 0.6 }; const StkFloat SEKERE_GAINS[SEKERE_RESONANCES] = { 1.0 }; // Bamboo Wind Chimes const StkFloat BAMBOO_SOUND_DECAY = 0.9; const StkFloat BAMBOO_SYSTEM_DECAY = 0.9999; const StkFloat BAMBOO_GAIN = 0.4; const StkFloat BAMBOO_NUM_TUBES = 1.2; const int BAMBOO_RESONANCES = 3; const StkFloat BAMBOO_FREQUENCIES[BAMBOO_RESONANCES] = { 2800, 0.8 * 2800.0, 1.2 * 2800.0 }; const StkFloat BAMBOO_RADII[BAMBOO_RESONANCES] = { 0.995, 0.995, 0.995 }; const StkFloat BAMBOO_GAINS[BAMBOO_RESONANCES] = { 1.0, 1.0, 1.0 }; // Tambourine const StkFloat TAMBOURINE_SOUND_DECAY = 0.95; const StkFloat TAMBOURINE_SYSTEM_DECAY = 0.9985; const StkFloat TAMBOURINE_GAIN = 1.0; const StkFloat TAMBOURINE_NUM_TIMBRELS = 32; const int TAMBOURINE_RESONANCES = 3; // Fixed shell + 2 moving cymbal resonances const StkFloat TAMBOURINE_FREQUENCIES[TAMBOURINE_RESONANCES] = { 2300, 5600, 8100 }; const StkFloat TAMBOURINE_RADII[TAMBOURINE_RESONANCES] = { 0.96, 0.99, 0.99 }; const StkFloat TAMBOURINE_GAINS[TAMBOURINE_RESONANCES] = { 0.1, 0.8, 1.0 }; // Sleighbells const StkFloat SLEIGH_SOUND_DECAY = 0.97; const StkFloat SLEIGH_SYSTEM_DECAY = 0.9994; const StkFloat SLEIGH_GAIN = 1.0; const StkFloat SLEIGH_NUM_BELLS = 32; const int SLEIGH_RESONANCES = 5; const StkFloat SLEIGH_FREQUENCIES[SLEIGH_RESONANCES] = { 2500, 5300, 6500, 8300, 9800 }; const StkFloat SLEIGH_RADII[SLEIGH_RESONANCES] = { 0.99, 0.99, 0.99, 0.99, 0.99 }; const StkFloat SLEIGH_GAINS[SLEIGH_RESONANCES] = { 1.0, 1.0, 1.0, 0.5, 0.3 }; // Sandpaper const StkFloat SANDPAPER_SOUND_DECAY = 0.999; const StkFloat SANDPAPER_SYSTEM_DECAY = 0.999; const StkFloat SANDPAPER_GAIN = 0.5; const StkFloat SANDPAPER_NUM_GRAINS = 128; const int SANDPAPER_RESONANCES = 1; const StkFloat SANDPAPER_FREQUENCIES[SANDPAPER_RESONANCES] = { 4500 }; const StkFloat SANDPAPER_RADII[SANDPAPER_RESONANCES] = { 0.6 }; const StkFloat SANDPAPER_GAINS[SANDPAPER_RESONANCES] = { 1.0 }; // Cokecan const StkFloat COKECAN_SOUND_DECAY = 0.97; const StkFloat COKECAN_SYSTEM_DECAY = 0.999; const StkFloat COKECAN_GAIN = 0.5; const StkFloat COKECAN_NUM_PARTS = 48; const int COKECAN_RESONANCES = 5; // Helmholtz + 4 metal resonances const StkFloat COKECAN_FREQUENCIES[COKECAN_RESONANCES] = { 370, 1025, 1424, 2149, 3596 }; const StkFloat COKECAN_RADII[COKECAN_RESONANCES] = { 0.99, 0.992, 0.992, 0.992, 0.992 }; const StkFloat COKECAN_GAINS[COKECAN_RESONANCES] = { 1.0, 1.8, 1.8, 1.8, 1.8 }; // Tuned Bamboo Wind Chimes (Angklung) const StkFloat ANGKLUNG_SOUND_DECAY = 0.95; const StkFloat ANGKLUNG_SYSTEM_DECAY = 0.9999; const StkFloat ANGKLUNG_GAIN = 0.5; const StkFloat ANGKLUNG_NUM_TUBES = 1.2; const int ANGKLUNG_RESONANCES = 7; const StkFloat ANGKLUNG_FREQUENCIES[ANGKLUNG_RESONANCES] = { 1046.6, 1174.8, 1397.0, 1568, 1760, 2093.3, 2350 }; const StkFloat ANGKLUNG_RADII[ANGKLUNG_RESONANCES] = { 0.996, 0.996, 0.996, 0.996, 0.996, 0.996, 0.996 }; const StkFloat ANGKLUNG_GAINS[ANGKLUNG_RESONANCES] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; // Guiro const StkFloat GUIRO_SOUND_DECAY = 0.95; const StkFloat GUIRO_GAIN = 0.4; const StkFloat GUIRO_NUM_PARTS = 128; const int GUIRO_RESONANCES = 2; const StkFloat GUIRO_FREQUENCIES[GUIRO_RESONANCES] = { 2500, 4000 }; const StkFloat GUIRO_RADII[GUIRO_RESONANCES] = { 0.97, 0.97 }; const StkFloat GUIRO_GAINS[GUIRO_RESONANCES] = { 1.0, 1.0 }; // Wrench const StkFloat WRENCH_SOUND_DECAY = 0.95; const StkFloat WRENCH_GAIN = 0.4; const StkFloat WRENCH_NUM_PARTS = 128; const int WRENCH_RESONANCES = 2; const StkFloat WRENCH_FREQUENCIES[WRENCH_RESONANCES] = { 3200, 8000 }; const StkFloat WRENCH_RADII[WRENCH_RESONANCES] = { 0.99, 0.992 }; const StkFloat WRENCH_GAINS[WRENCH_RESONANCES] = { 1.0, 1.0 }; // Water Drops const StkFloat WATER_SOUND_DECAY = 0.95; const StkFloat WATER_SYSTEM_DECAY = 0.996; const StkFloat WATER_GAIN = 1.0; const StkFloat WATER_NUM_SOURCES = 10; const int WATER_RESONANCES = 3; const StkFloat WATER_FREQUENCIES[WATER_RESONANCES] = { 450, 600, 750 }; const StkFloat WATER_RADII[WATER_RESONANCES] = { 0.9985, 0.9985, 0.9985 }; const StkFloat WATER_GAINS[WATER_RESONANCES] = { 1.0, 1.0, 1.0 }; // PhOLIES (Physically-Oriented Library of Imitated Environmental // Sounds), Perry Cook, 1997-8 // Stix1 const StkFloat STIX1_SOUND_DECAY = 0.96; const StkFloat STIX1_SYSTEM_DECAY = 0.998; const StkFloat STIX1_GAIN = 6.0; const StkFloat STIX1_NUM_BEANS = 2; const int STIX1_RESONANCES = 1; const StkFloat STIX1_FREQUENCIES[STIX1_RESONANCES] = { 5500 }; const StkFloat STIX1_RADII[STIX1_RESONANCES] = { 0.6 }; const StkFloat STIX1_GAINS[STIX1_RESONANCES] = { 1.0 }; // Crunch1 const StkFloat CRUNCH1_SOUND_DECAY = 0.95; const StkFloat CRUNCH1_SYSTEM_DECAY = 0.99806; const StkFloat CRUNCH1_GAIN = 4.0; const StkFloat CRUNCH1_NUM_BEADS = 7; const int CRUNCH1_RESONANCES = 1; const StkFloat CRUNCH1_FREQUENCIES[CRUNCH1_RESONANCES] = { 800 }; const StkFloat CRUNCH1_RADII[CRUNCH1_RESONANCES] = { 0.95 }; const StkFloat CRUNCH1_GAINS[CRUNCH1_RESONANCES] = { 1.0 }; // Nextmug + Coins const StkFloat NEXTMUG_SOUND_DECAY = 0.97; const StkFloat NEXTMUG_SYSTEM_DECAY = 0.9995; const StkFloat NEXTMUG_GAIN = 0.8; const StkFloat NEXTMUG_NUM_PARTS = 3; const int NEXTMUG_RESONANCES = 4; const StkFloat NEXTMUG_FREQUENCIES[NEXTMUG_RESONANCES] = { 2123, 4518, 8856, 10753 }; const StkFloat NEXTMUG_RADII[NEXTMUG_RESONANCES] = { 0.997, 0.997, 0.997, 0.997 }; const StkFloat NEXTMUG_GAINS[NEXTMUG_RESONANCES] = { 1.0, 0.8, 0.6, 0.4 }; const int COIN_RESONANCES = 3; const StkFloat PENNY_FREQUENCIES[COIN_RESONANCES] = { 11000, 5200, 3835 }; const StkFloat PENNY_RADII[COIN_RESONANCES] = { 0.999, 0.999, 0.999 }; const StkFloat PENNY_GAINS[COIN_RESONANCES] = { 1.0, 0.8, 0.5 }; const StkFloat NICKEL_FREQUENCIES[COIN_RESONANCES] = { 5583, 9255, 9805 }; const StkFloat NICKEL_RADII[COIN_RESONANCES] = { 0.9992, 0.9992, 0.9992 }; const StkFloat NICKEL_GAINS[COIN_RESONANCES] = { 1.0, 0.8, 0.5 }; const StkFloat DIME_FREQUENCIES[COIN_RESONANCES] = { 4450, 4974, 9945 }; const StkFloat DIME_RADII[COIN_RESONANCES] = { 0.9993, 0.9993, 0.9993 }; const StkFloat DIME_GAINS[COIN_RESONANCES] = { 1.0, 0.8, 0.5 }; const StkFloat QUARTER_FREQUENCIES[COIN_RESONANCES] = { 1708, 8863, 9045 }; const StkFloat QUARTER_RADII[COIN_RESONANCES] = { 0.9995, 0.9995, 0.9995 }; const StkFloat QUARTER_GAINS[COIN_RESONANCES] = { 1.0, 0.8, 0.5 }; const StkFloat FRANC_FREQUENCIES[COIN_RESONANCES] = { 5583, 11010, 1917 }; const StkFloat FRANC_RADII[COIN_RESONANCES] = { 0.9995, 0.9995, 0.9995 }; const StkFloat FRANC_GAINS[COIN_RESONANCES] = { 0.7, 0.4, 0.3 }; const StkFloat PESO_FREQUENCIES[COIN_RESONANCES] = { 7250, 8150, 10060 }; const StkFloat PESO_RADII[COIN_RESONANCES] = { 0.9996, 0.9996, 0.9996 }; const StkFloat PESO_GAINS[COIN_RESONANCES] = { 1.0, 1.2, 0.7 }; // Big Gravel const StkFloat BIGROCKS_SOUND_DECAY = 0.98; const StkFloat BIGROCKS_SYSTEM_DECAY = 0.9965; const StkFloat BIGROCKS_GAIN = 4.0; const StkFloat BIGROCKS_NUM_PARTS = 23; const int BIGROCKS_RESONANCES = 1; const StkFloat BIGROCKS_FREQUENCIES[BIGROCKS_RESONANCES] = { 6460 }; const StkFloat BIGROCKS_RADII[BIGROCKS_RESONANCES] = { 0.932 }; const StkFloat BIGROCKS_GAINS[BIGROCKS_RESONANCES] = { 1.0 }; // Little Gravel const StkFloat LITTLEROCKS_SOUND_DECAY = 0.98; const StkFloat LITTLEROCKS_SYSTEM_DECAY = 0.99586; const StkFloat LITTLEROCKS_GAIN = 4.0; const StkFloat LITTLEROCKS_NUM_PARTS = 1600; const int LITTLEROCKS_RESONANCES = 1; const StkFloat LITTLEROCKS_FREQUENCIES[LITTLEROCKS_RESONANCES] = { 9000 }; const StkFloat LITTLEROCKS_RADII[LITTLEROCKS_RESONANCES] = { 0.843 }; const StkFloat LITTLEROCKS_GAINS[LITTLEROCKS_RESONANCES] = { 1.0 }; Shakers :: Shakers( int type ) { shakerType_ = -1; this->setType( type ); } void Shakers :: setType( int type ) { if ( shakerType_ == type ) return; varyFactor_ = 0.0; shakerType_ = type; if ( type == 1 ) { // Cabasa nResonances_ = CABASA_RESONANCES; filters_.resize( nResonances_ ); baseFrequencies_.resize( nResonances_ ); baseRadii_.resize( nResonances_ ); doVaryFrequency_.resize( nResonances_ ); baseObjects_ = CABASA_NUM_BEADS; for ( unsigned int i=0; i 11 && type < 19 ) { // Nextmug nResonances_ = NEXTMUG_RESONANCES; if ( type > 12 ) // mug + coin nResonances_ += COIN_RESONANCES; filters_.resize( nResonances_ ); baseFrequencies_.resize( nResonances_ ); baseRadii_.resize( nResonances_ ); doVaryFrequency_.resize( nResonances_ ); baseObjects_ = NEXTMUG_NUM_PARTS; for ( int i=0; isetType( noteNumber ); shakeEnergy_ += amplitude * MAX_SHAKE * 0.1; if ( shakeEnergy_ > MAX_SHAKE ) shakeEnergy_ = MAX_SHAKE; if ( shakerType_==19 || shakerType_==20 ) ratchetCount_ += 1; } void Shakers :: noteOff( StkFloat amplitude ) { shakeEnergy_ = 0.0; if ( shakerType_==19 || shakerType_==20 ) ratchetCount_ = 0; } void Shakers :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Shakers::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if ( number == __SK_Breath_ || number == __SK_AfterTouch_Cont_ ) { // 2 or 128 ... energy if ( shakerType_ == 19 || shakerType_ == 20 ) { if ( lastRatchetValue_ < 0.0 ) ratchetCount_++; else ratchetCount_ = (int) fabs(value - lastRatchetValue_); ratchetDelta_ = baseRatchetDelta_ * ratchetCount_; lastRatchetValue_ = (int) value; } else { shakeEnergy_ += normalizedValue * MAX_SHAKE * 0.1; if ( shakeEnergy_ > MAX_SHAKE ) shakeEnergy_ = MAX_SHAKE; } } else if ( number == __SK_ModFrequency_ ) { // 4 ... decay systemDecay_ = baseDecay_ + ( 2.0 * (normalizedValue - 0.5) * decayScale_ * (1.0 - baseDecay_) ); } else if ( number == __SK_FootControl_ ) { // 11 ... number of objects nObjects_ = (StkFloat) ( 2.0 * normalizedValue * baseObjects_ ) + 1.1; currentGain_ = log( nObjects_ ) * baseGain_ / nObjects_; } else if ( number == __SK_ModWheel_ ) { // 1 ... resonance frequency for ( unsigned int i=0; isetType( type ); } #if defined(_STK_DEBUG_) else { oStream_ << "Shakers::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Simple.cpp0000644000076600007660000000506112327014024012661 0ustar gary/***************************************************/ /*! \class Simple \brief STK wavetable/noise instrument. This class combines a looped wave, a noise source, a biquad resonance filter, a one-pole filter, and an ADSR envelope to create some interesting sounds. Control Change Numbers: - Filter Pole Position = 2 - Noise/Pitched Cross-Fade = 4 - Envelope Rate = 11 - Gain = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Simple.h" #include "SKINI.msg" namespace stk { Simple :: Simple( void ) { // Concatenate the STK rawwave path to the rawwave file loop_ = new FileLoop( (Stk::rawwavePath() + "impuls10.raw").c_str(), true ); filter_.setPole( 0.5 ); baseFrequency_ = 440.0; setFrequency( baseFrequency_ ); loopGain_ = 0.5; } Simple :: ~Simple( void ) { delete loop_; } void Simple :: keyOn( void ) { adsr_.keyOn(); } void Simple :: keyOff( void ) { adsr_.keyOff(); } void Simple :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->keyOn(); this->setFrequency( frequency ); filter_.setGain( amplitude ); } void Simple :: noteOff( StkFloat amplitude ) { this->keyOff(); } void Simple :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Simple::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif biquad_.setResonance( frequency, 0.98, true ); loop_->setFrequency( frequency ); } void Simple :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Simple::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_Breath_) // 2 filter_.setPole( 0.99 * (1.0 - (normalizedValue * 2.0)) ); else if (number == __SK_NoiseLevel_) // 4 loopGain_ = normalizedValue; else if (number == __SK_ModFrequency_) { // 11 normalizedValue /= 0.2 * Stk::sampleRate(); adsr_.setAttackRate( normalizedValue ); adsr_.setDecayRate( normalizedValue ); adsr_.setReleaseRate( normalizedValue ); } else if (number == __SK_AfterTouch_Cont_) // 128 adsr_.setTarget( normalizedValue ); #if defined(_STK_DEBUG_) else { oStream_ << "Simple::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/SineWave.cpp0000644000076600007660000000353012327014024013150 0ustar gary/***************************************************/ /*! \class SineWave \brief STK sinusoid oscillator class. This class computes and saves a static sine "table" that can be shared by multiple instances. It has an interface similar to the WaveLoop class but inherits from the Generator class. Output values are computed using linear interpolation. The "table" length, set in SineWave.h, is 2048 samples by default. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "SineWave.h" #include namespace stk { StkFrames SineWave :: table_; SineWave :: SineWave( void ) : time_(0.0), rate_(1.0), phaseOffset_(0.0) { if ( table_.empty() ) { table_.resize( TABLE_SIZE + 1, 1 ); StkFloat temp = 1.0 / TABLE_SIZE; for ( unsigned long i=0; i<=TABLE_SIZE; i++ ) table_[i] = sin( TWO_PI * i * temp ); } Stk::addSampleRateAlert( this ); } SineWave :: ~SineWave() { Stk::removeSampleRateAlert( this ); } void SineWave :: sampleRateChanged( StkFloat newRate, StkFloat oldRate ) { if ( !ignoreSampleRateChange_ ) this->setRate( oldRate * rate_ / newRate ); } void SineWave :: reset( void ) { time_ = 0.0; lastFrame_[0] = 0; } void SineWave :: setFrequency( StkFloat frequency ) { // This is a looping frequency. this->setRate( TABLE_SIZE * frequency / Stk::sampleRate() ); } void SineWave :: addTime( StkFloat time ) { // Add an absolute time in samples. time_ += time; } void SineWave :: addPhase( StkFloat phase ) { // Add a time in cycles (one cycle = TABLE_SIZE). time_ += TABLE_SIZE * phase; } void SineWave :: addPhaseOffset( StkFloat phaseOffset ) { // Add a phase offset relative to any previous offset value. time_ += ( phaseOffset - phaseOffset_ ) * TABLE_SIZE; phaseOffset_ = phaseOffset; } } // stk namespace stk-4.5.0/src/SingWave.cpp0000644000076600007660000000251412327014024013153 0ustar gary/***************************************************/ /*! \class SingWave \brief STK "singing" looped soundfile class. This class loops a specified soundfile and modulates it both periodically and randomly to produce a pitched musical sound, like a simple voice or violin. In general, it is not be used alone because of "munchkinification" effects from pitch shifting. Within STK, it is used as an excitation source for other instruments. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "SingWave.h" namespace stk { SingWave :: SingWave( std::string fileName, bool raw ) { // An exception could be thrown here. wave_.openFile( fileName, raw ); rate_ = 1.0; sweepRate_ = 0.001; modulator_.setVibratoRate( 6.0 ); modulator_.setVibratoGain( 0.04 ); modulator_.setRandomGain( 0.005 ); this->setFrequency( 75.0 ); pitchEnvelope_.setRate( 1.0 ); this->tick(); this->tick(); pitchEnvelope_.setRate( sweepRate_ * rate_ ); } SingWave :: ~SingWave() { } void SingWave :: setFrequency( StkFloat frequency ) { StkFloat temp = rate_; rate_ = wave_.getSize() * frequency / Stk::sampleRate(); temp -= rate_; if ( temp < 0) temp = -temp; pitchEnvelope_.setTarget( rate_ ); pitchEnvelope_.setRate( sweepRate_ * temp ); } } // stk namespace stk-4.5.0/src/Sitar.cpp0000644000076600007660000000431212327014024012510 0ustar gary/***************************************************/ /*! \class Sitar \brief STK sitar string model class. This class implements a sitar plucked string physical model based on the Karplus-Strong algorithm. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. There exist at least two patents, assigned to Stanford, bearing the names of Karplus and/or Strong. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Sitar.h" namespace stk { Sitar :: Sitar( StkFloat lowestFrequency ) { if ( lowestFrequency <= 0.0 ) { oStream_ << "Sitar::Sitar: argument is less than or equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } unsigned long length = (unsigned long) ( Stk::sampleRate() / lowestFrequency + 1 ); delayLine_.setMaximumDelay( length ); delay_ = 0.5 * length; delayLine_.setDelay( delay_ ); targetDelay_ = delay_; loopFilter_.setZero( 0.01 ); loopGain_ = 0.999; envelope_.setAllTimes( 0.001, 0.04, 0.0, 0.5 ); this->clear(); } Sitar :: ~Sitar( void ) { } void Sitar :: clear( void ) { delayLine_.clear(); loopFilter_.clear(); } void Sitar :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Sitar::setFrequency: parameter is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif targetDelay_ = (Stk::sampleRate() / frequency); delay_ = targetDelay_ * (1.0 + (0.05 * noise_.tick())); delayLine_.setDelay( delay_ ); loopGain_ = 0.995 + (frequency * 0.0000005); if ( loopGain_ > 0.9995 ) loopGain_ = 0.9995; } void Sitar :: pluck( StkFloat amplitude ) { envelope_.keyOn(); } void Sitar :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); this->pluck( amplitude ); amGain_ = 0.1 * amplitude; } void Sitar :: noteOff( StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "Sitar::noteOff: amplitude is out of range!"; handleError( StkError::WARNING ); return; } loopGain_ = (StkFloat) 1.0 - amplitude; } } // stk namespace stk-4.5.0/src/Skini.cpp0000644000076600007660000001355712327014024012516 0ustar gary/***************************************************/ /*! \class Skini \brief STK SKINI parsing class This class parses SKINI formatted text messages. It can be used to parse individual messages or it can be passed an entire file. The SKINI specification is Perry's and his alone, but it's all text so it shouldn't be too hard to figure out. SKINI (Synthesis toolKit Instrument Network Interface) is like MIDI, but allows for floating-point control changes, note numbers, etc. The following example causes a sharp middle C to be played with a velocity of 111.132: noteOn 60.01 111.132 See also SKINI.txt. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Skini.h" #include "SKINI.tbl" #include #include namespace stk { Skini :: Skini() { } Skini :: ~Skini() { } bool Skini :: setFile( std::string fileName ) { if ( file_.is_open() ) { oStream_ << "Skini::setFile: already reaading a file!"; handleError( StkError::WARNING ); return false; } file_.open( fileName.c_str() ); if ( !file_ ) { oStream_ << "Skini::setFile: unable to open file (" << fileName << ")"; handleError( StkError::WARNING ); return false; } return true; } long Skini :: nextMessage( Message& message ) { if ( !file_.is_open() ) return 0; std::string line; bool done = false; while ( !done ) { // Read a line from the file and skip over invalid messages. if ( std::getline( file_, line ).eof() ) { oStream_ << "// End of Score. Thanks for using SKINI!!"; handleError( StkError::STATUS ); file_.close(); message.type = 0; done = true; } else if ( parseString( line, message ) > 0 ) done = true; } return message.type; } void Skini :: tokenize( const std::string& str, std::vector& tokens, const std::string& delimiters ) { // Skip delimiters at beginning. std::string::size_type lastPos = str.find_first_not_of(delimiters, 0); // Find first "non-delimiter". std::string::size_type pos = str.find_first_of(delimiters, lastPos); while (std::string::npos != pos || std::string::npos != lastPos) { // Found a token, add it to the vector. tokens.push_back(str.substr(lastPos, pos - lastPos)); // Skip delimiters. Note the "not_of" lastPos = str.find_first_not_of(delimiters, pos); // Find next "non-delimiter" pos = str.find_first_of(delimiters, lastPos); } } long Skini :: parseString( std::string& line, Message& message ) { message.type = 0; if ( line.empty() ) return message.type; // Check for comment lines. std::string::size_type lastPos = line.find_first_not_of(" ,\t", 0); std::string::size_type pos = line.find_first_of("/", lastPos); if ( std::string::npos != pos ) { oStream_ << "// Comment Line: " << line; handleError( StkError::STATUS ); return message.type; } // Tokenize the string. std::vector tokens; this->tokenize( line, tokens, " ,\t"); // Valid SKINI messages must have at least three fields (type, time, // and channel). if ( tokens.size() < 3 ) return message.type; // Determine message type. int iSkini = 0; while ( iSkini < __SK_MaxMsgTypes_ ) { if ( tokens[0] == skini_msgs[iSkini].messageString ) break; iSkini++; } if ( iSkini >= __SK_MaxMsgTypes_ ) { oStream_ << "Skini::parseString: couldn't parse this line:\n " << line; handleError( StkError::WARNING ); return message.type; } // Found the type. message.type = skini_msgs[iSkini].type; // Parse time field. if ( tokens[1][0] == '=' ) { tokens[1].erase( tokens[1].begin() ); if ( tokens[1].empty() ) { oStream_ << "Skini::parseString: couldn't parse time field in line:\n " << line; handleError( StkError::WARNING ); return message.type = 0; } message.time = (StkFloat) -atof( tokens[1].c_str() ); } else message.time = (StkFloat) atof( tokens[1].c_str() ); // Parse the channel field. message.channel = atoi( tokens[2].c_str() ); // Parse the remaining fields (maximum of 2 more). int iValue = 0; long dataType = skini_msgs[iSkini].data2; while ( dataType != NOPE ) { if ( tokens.size() <= (unsigned int) (iValue+3) ) { oStream_ << "Skini::parseString: inconsistency between type table and parsed line:\n " << line; handleError( StkError::WARNING ); return message.type = 0; } switch ( dataType ) { case SK_INT: message.intValues[iValue] = atoi( tokens[iValue+3].c_str() ); message.floatValues[iValue] = (StkFloat) message.intValues[iValue]; break; case SK_DBL: message.floatValues[iValue] = atof( tokens[iValue+3].c_str() ); message.intValues[iValue] = (long) message.floatValues[iValue]; break; case SK_STR: // Must be the last field. message.remainder = tokens[iValue+3]; return message.type; default: // MIDI extension message message.intValues[iValue] = dataType; message.floatValues[iValue] = (StkFloat) message.intValues[iValue]; iValue--; } if ( ++iValue == 1 ) dataType = skini_msgs[iSkini].data3; else dataType = NOPE; } return message.type; } std::string Skini :: whatsThisType(long type) { std::string typeString; for ( int i=0; i<__SK_MaxMsgTypes_; i++ ) { if ( type == skini_msgs[i].type ) { typeString = skini_msgs[i].messageString; break; } } return typeString; } std::string Skini :: whatsThisController( long number ) { std::string controller; for ( int i=0; i<__SK_MaxMsgTypes_; i++) { if ( skini_msgs[i].type == __SK_ControlChange_ && number == skini_msgs[i].data2) { controller = skini_msgs[i].messageString; break; } } return controller; } } // stk namespace stk-4.5.0/src/Socket.cpp0000644000076600007660000000314412327014024012660 0ustar gary/***************************************************/ /*! \class Socket \brief STK internet socket abstract base class. This class provides common functionality for TCP and UDP internet socket server and client subclasses. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Socket.h" namespace stk { Socket :: Socket() { soket_ = -1; port_ = -1; } Socket :: ~Socket() { this->close( soket_ ); #if defined(__OS_WINDOWS__) WSACleanup(); #endif } void Socket :: close( int socket ) { if ( !isValid( socket ) ) return; #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) ::close( socket ); #elif defined(__OS_WINDOWS__) ::closesocket( socket ); #endif } void Socket :: setBlocking( int socket, bool enable ) { if ( !isValid( socket ) ) return; #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) int tmp = ::fcntl( socket, F_GETFL, 0 ); if ( tmp >= 0 ) tmp = ::fcntl( socket, F_SETFL, enable ? (tmp &~ O_NONBLOCK) : (tmp | O_NONBLOCK) ); #elif defined(__OS_WINDOWS__) unsigned long non_block = !enable; ioctlsocket( socket, FIONBIO, &non_block ); #endif } int Socket :: writeBuffer(int socket, const void *buffer, long bufferSize, int flags ) { if ( !isValid( socket ) ) return -1; return send( socket, (const char *)buffer, bufferSize, flags ); } int Socket :: readBuffer(int socket, void *buffer, long bufferSize, int flags ) { if ( !isValid( socket ) ) return -1; return recv( socket, (char *)buffer, bufferSize, flags ); } } // stk namespace stk-4.5.0/src/Sphere.cpp0000644000076600007660000000243612327014024012661 0ustar gary/***************************************************/ /*! \class Sphere \brief STK sphere class. This class implements a spherical ball with radius, mass, position, and velocity parameters. by Perry R. Cook, 1995--2014. */ /***************************************************/ #include "Sphere.h" #include namespace stk { Vector3D* Sphere::getRelativePosition( Vector3D* position ) { workingVector_.setXYZ(position->getX() - position_.getX(), position->getY() - position_.getY(), position->getZ() - position_.getZ()); return &workingVector_; }; StkFloat Sphere::getVelocity( Vector3D* velocity ) { velocity->setXYZ( velocity_.getX(), velocity_.getY(), velocity_.getZ() ); return velocity_.getLength(); }; StkFloat Sphere::isInside( Vector3D *position ) { // Return directed distance from aPosition to spherical boundary ( < // 0 if inside). StkFloat distance; Vector3D *tempVector; tempVector = this->getRelativePosition( position ); distance = tempVector->getLength(); return distance - radius_; }; void Sphere::addVelocity(StkFloat x, StkFloat y, StkFloat z) { velocity_.setX(velocity_.getX() + x); velocity_.setY(velocity_.getY() + y); velocity_.setZ(velocity_.getZ() + z); } } // stk namespace stk-4.5.0/src/StifKarp.cpp0000644000076600007660000001176612327014024013164 0ustar gary/***************************************************/ /*! \class StifKarp \brief STK plucked stiff string instrument. This class implements a simple plucked string algorithm (Karplus Strong) with enhancements (Jaffe-Smith, Smith, and others), including string stiffness and pluck position controls. The stiffness is modeled with allpass filters. This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. Control Change Numbers: - Pickup Position = 4 - String Sustain = 11 - String Stretch = 1 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "StifKarp.h" #include "SKINI.msg" #include namespace stk { StifKarp :: StifKarp( StkFloat lowestFrequency ) { if ( lowestFrequency <= 0.0 ) { oStream_ << "StifKarp::StifKarp: argument is less than or equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } unsigned long nDelays = (unsigned long) ( Stk::sampleRate() / lowestFrequency ); delayLine_.setMaximumDelay( nDelays + 1 ); combDelay_.setMaximumDelay( nDelays + 1 ); pluckAmplitude_ = 0.3; pickupPosition_ = 0.4; stretching_ = 0.9999; baseLoopGain_ = 0.995; loopGain_ = 0.999; this->clear(); this->setFrequency( 220.0 ); } StifKarp :: ~StifKarp( void ) { } void StifKarp :: clear( void ) { delayLine_.clear(); combDelay_.clear(); filter_.clear(); } void StifKarp :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "StifKarp::setFrequency: parameter is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif lastFrequency_ = frequency; lastLength_ = Stk::sampleRate() / lastFrequency_; StkFloat delay = lastLength_ - 0.5; delayLine_.setDelay( delay ); loopGain_ = baseLoopGain_ + (frequency * 0.000005); if (loopGain_ >= 1.0) loopGain_ = 0.99999; setStretch(stretching_); combDelay_.setDelay( 0.5 * pickupPosition_ * lastLength_ ); } void StifKarp :: setStretch( StkFloat stretch ) { stretching_ = stretch; StkFloat coefficient; StkFloat freq = lastFrequency_ * 2.0; StkFloat dFreq = ( (0.5 * Stk::sampleRate()) - freq ) * 0.25; StkFloat temp = 0.5 + (stretch * 0.5); if ( temp > 0.9999 ) temp = 0.9999; for ( int i=0; i<4; i++ ) { coefficient = temp * temp; biquad_[i].setA2( coefficient ); biquad_[i].setB0( coefficient ); biquad_[i].setB2( 1.0 ); coefficient = -2.0 * temp * cos(TWO_PI * freq / Stk::sampleRate()); biquad_[i].setA1( coefficient ); biquad_[i].setB1( coefficient ); freq += dFreq; } } void StifKarp :: setPickupPosition( StkFloat position ) { if ( position < 0.0 || position > 1.0 ) { oStream_ << "StifKarp::setPickupPosition: parameter is out of range!"; handleError( StkError::WARNING ); return; } // Set the pick position, which puts zeroes at position * length. pickupPosition_ = position; combDelay_.setDelay( 0.5 * pickupPosition_ * lastLength_ ); } void StifKarp :: setBaseLoopGain( StkFloat aGain ) { baseLoopGain_ = aGain; loopGain_ = baseLoopGain_ + (lastFrequency_ * 0.000005); if ( loopGain_ > 0.99999 ) loopGain_ = (StkFloat) 0.99999; } void StifKarp :: pluck( StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "StifKarp::pluck: amplitude is out of range!"; handleError( StkError::WARNING ); return; } pluckAmplitude_ = amplitude; for ( unsigned long i=0; itick() * pluckAmplitude_) ); } } void StifKarp :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); this->pluck( amplitude ); } void StifKarp :: noteOff( StkFloat amplitude ) { if ( amplitude < 0.0 || amplitude > 1.0 ) { oStream_ << "StifKarp::noteOff: amplitude is out of range!"; handleError( StkError::WARNING ); return; } loopGain_ = (1.0 - amplitude) * 0.5; } void StifKarp :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Clarinet::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_PickPosition_) // 4 this->setPickupPosition( normalizedValue ); else if (number == __SK_StringDamping_) // 11 this->setBaseLoopGain( 0.97 + (normalizedValue * 0.03) ); else if (number == __SK_StringDetune_) // 1 this->setStretch( 0.9 + (0.1 * (1.0 - normalizedValue)) ); #if defined(_STK_DEBUG_) else { oStream_ << "StifKarp::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Stk.cpp0000644000076600007660000002246412327014024012177 0ustar gary/***************************************************/ /*! \class Stk \brief STK base class Nearly all STK classes inherit from this class. The global sample rate can be queried and modified via Stk. In addition, this class provides error handling and byte-swapping functions. 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. 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. STK WWW site: http://ccrma.stanford.edu/software/stk/ The Synthesis ToolKit in C++ (STK) Copyright (c) 1995--2014 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 "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /***************************************************/ #include "Stk.h" #include namespace stk { StkFloat Stk :: srate_ = (StkFloat) SRATE; std::string Stk :: rawwavepath_ = RAWWAVE_PATH; const Stk::StkFormat Stk :: STK_SINT8 = 0x1; const Stk::StkFormat Stk :: STK_SINT16 = 0x2; const Stk::StkFormat Stk :: STK_SINT24 = 0x4; const Stk::StkFormat Stk :: STK_SINT32 = 0x8; const Stk::StkFormat Stk :: STK_FLOAT32 = 0x10; const Stk::StkFormat Stk :: STK_FLOAT64 = 0x20; bool Stk :: showWarnings_ = true; bool Stk :: printErrors_ = true; std::vector Stk :: alertList_; std::ostringstream Stk :: oStream_; Stk :: Stk( void ) : ignoreSampleRateChange_(false) { } Stk :: ~Stk( void ) { } void Stk :: setSampleRate( StkFloat rate ) { if ( rate > 0.0 && rate != srate_ ) { StkFloat oldRate = srate_; srate_ = rate; for ( unsigned int i=0; isampleRateChanged( srate_, oldRate ); } } void Stk :: sampleRateChanged( StkFloat /*newRate*/, StkFloat /*oldRate*/ ) { // This function should be reimplemented in classes that need to // make internal variable adjustments in response to a global sample // rate change. } void Stk :: addSampleRateAlert( Stk *ptr ) { for ( unsigned int i=0; i #elif defined(__OS_WINDOWS__) #include #endif void Stk :: sleep(unsigned long milliseconds) { #if defined(__OS_WINDOWS__) Sleep((DWORD) milliseconds); #elif (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) usleep( (unsigned long) (milliseconds * 1000.0) ); #endif } void Stk :: handleError( StkError::Type type ) const { handleError( oStream_.str(), type ); oStream_.str( std::string() ); // reset the ostringstream buffer } void Stk :: handleError( const char *message, StkError::Type type ) { std::string msg( message ); handleError( msg, type ); } void Stk :: handleError( std::string message, StkError::Type type ) { if ( type == StkError::WARNING || type == StkError::STATUS ) { if ( !showWarnings_ ) return; std::cerr << '\n' << message << '\n' << std::endl; } else if (type == StkError::DEBUG_PRINT) { #if defined(_STK_DEBUG_) std::cerr << '\n' << message << '\n' << std::endl; #endif } else { if ( printErrors_ ) { // Print error message before throwing. std::cerr << '\n' << message << '\n' << std::endl; } throw StkError(message, type); } } // // StkFrames definitions // StkFrames :: StkFrames( unsigned int nFrames, unsigned int nChannels ) : data_( 0 ), nFrames_( nFrames ), nChannels_( nChannels ) { size_ = nFrames_ * nChannels_; bufferSize_ = size_; if ( size_ > 0 ) { data_ = (StkFloat *) calloc( size_, sizeof( StkFloat ) ); #if defined(_STK_DEBUG_) if ( data_ == NULL ) { std::string error = "StkFrames: memory allocation error in constructor!"; Stk::handleError( error, StkError::MEMORY_ALLOCATION ); } #endif } dataRate_ = Stk::sampleRate(); } StkFrames :: StkFrames( const StkFloat& value, unsigned int nFrames, unsigned int nChannels ) : data_( 0 ), nFrames_( nFrames ), nChannels_( nChannels ) { size_ = nFrames_ * nChannels_; bufferSize_ = size_; if ( size_ > 0 ) { data_ = (StkFloat *) malloc( size_ * sizeof( StkFloat ) ); #if defined(_STK_DEBUG_) if ( data_ == NULL ) { std::string error = "StkFrames: memory allocation error in constructor!"; Stk::handleError( error, StkError::MEMORY_ALLOCATION ); } #endif for ( long i=0; i<(long)size_; i++ ) data_[i] = value; } dataRate_ = Stk::sampleRate(); } StkFrames :: ~StkFrames() { if ( data_ ) free( data_ ); } StkFrames :: StkFrames( const StkFrames& f ) : data_(0), size_(0), bufferSize_(0) { resize( f.frames(), f.channels() ); dataRate_ = Stk::sampleRate(); for ( unsigned int i=0; i bufferSize_ ) { if ( data_ ) free( data_ ); data_ = (StkFloat *) malloc( size_ * sizeof( StkFloat ) ); #if defined(_STK_DEBUG_) if ( data_ == NULL ) { std::string error = "StkFrames::resize: memory allocation error!"; Stk::handleError( error, StkError::MEMORY_ALLOCATION ); } #endif bufferSize_ = size_; } } void StkFrames :: resize( size_t nFrames, unsigned int nChannels, StkFloat value ) { this->resize( nFrames, nChannels ); for ( size_t i=0; i (StkFloat) ( nFrames_ - 1 ) || channel >= nChannels_ ) { std::ostringstream error; error << "StkFrames::interpolate: invalid frame (" << frame << ") or channel (" << channel << ") value!"; Stk::handleError( error.str(), StkError::MEMORY_ACCESS ); } #endif size_t iIndex = ( size_t ) frame; // integer part of index StkFloat output, alpha = frame - (StkFloat) iIndex; // fractional part of index iIndex = iIndex * nChannels_ + channel; output = data_[ iIndex ]; if ( alpha > 0.0 ) output += ( alpha * ( data_[ iIndex + nChannels_ ] - output ) ); return output; } } // stk namespace stk-4.5.0/src/TapDelay.cpp0000644000076600007660000000512412327014024013133 0ustar gary/***************************************************/ /*! \class TapDelay \brief STK non-interpolating tapped delay line class. This class implements a non-interpolating digital delay-line with an arbitrary number of output "taps". If the maximum length and tap delays are not specified during instantiation, a fixed maximum length of 4095 and a single tap delay of zero is set. A non-interpolating delay line is typically used in fixed delay-length applications, such as for reverberation. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "TapDelay.h" namespace stk { TapDelay :: TapDelay( std::vector taps, unsigned long maxDelay ) { // Writing before reading allows delays from 0 to length-1. // If we want to allow a delay of maxDelay, we need a // delayline of length = maxDelay+1. if ( maxDelay < 1 ) { oStream_ << "TapDelay::TapDelay: maxDelay must be > 0!\n"; handleError( StkError::FUNCTION_ARGUMENT ); } for ( unsigned int i=0; i maxDelay ) { oStream_ << "TapDelay::TapDelay: maxDelay must be > than all tap delay values!\n"; handleError( StkError::FUNCTION_ARGUMENT ); } } if ( ( maxDelay + 1 ) > inputs_.size() ) inputs_.resize( maxDelay + 1, 1, 0.0 ); inPoint_ = 0; this->setTapDelays( taps ); } TapDelay :: ~TapDelay() { } void TapDelay :: setMaximumDelay( unsigned long delay ) { if ( delay < inputs_.size() ) return; for ( unsigned int i=0; i taps ) { for ( unsigned int i=0; i inputs_.size() - 1 ) { // The value is too big. oStream_ << "TapDelay::setTapDelay: argument (" << taps[i] << ") greater than maximum!\n"; handleError( StkError::WARNING ); return; } } if ( taps.size() != outPoint_.size() ) { outPoint_.resize( taps.size() ); delays_.resize( taps.size() ); lastFrame_.resize( 1, (unsigned int)taps.size(), 0.0 ); } for ( unsigned int i=0; i= taps[i] ) outPoint_[i] = inPoint_ - taps[i]; else outPoint_[i] = inputs_.size() + inPoint_ - taps[i]; delays_[i] = taps[i]; } } } // stk namespace stk-4.5.0/src/TcpClient.cpp0000644000076600007660000000632112327014024013315 0ustar gary/***************************************************/ /*! \class TcpClient \brief STK TCP socket client class. This class provides a uniform cross-platform TCP socket client interface. Methods are provided for reading or writing data buffers to/from connections. TCP sockets are reliable and connection-oriented. A TCP socket client must be connected to a TCP server before data can be sent or received. Data delivery is guaranteed in order, without loss, error, or duplication. That said, TCP transmissions tend to be slower than those using the UDP protocol and data sent with multiple \e write() calls can be arbitrarily combined by the underlying system. The user is responsible for checking the values returned by the read/write methods. Values less than or equal to zero indicate a closed or lost connection or the occurence of an error. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "TcpClient.h" #include #include namespace stk { TcpClient :: TcpClient( int port, std::string hostname ) { #if defined(__OS_WINDOWS__) // windoze-only stuff WSADATA wsaData; WORD wVersionRequested = MAKEWORD(1,1); WSAStartup( wVersionRequested, &wsaData ); if ( wsaData.wVersion != wVersionRequested ) { oStream_ << "TcpClient: Incompatible Windows socket library version!"; handleError( StkError::PROCESS_SOCKET ); } #endif // Create a socket client connection. connect( port, hostname ); } TcpClient :: ~TcpClient( void ) { } int TcpClient :: connect( int port, std::string hostname ) { // Close any existing connections. this->close( soket_ ); // Create the client-side socket soket_ = ::socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( soket_ < 0 ) { oStream_ << "TcpClient: Couldn't create socket client!"; handleError( StkError::PROCESS_SOCKET ); } int flag = 1; int result = setsockopt( soket_, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int) ); if ( result < 0 ) { oStream_ << "TcpClient: Error setting socket options!"; handleError( StkError::PROCESS_SOCKET ); } struct hostent *hostp; if ( ( hostp = gethostbyname( hostname.c_str() ) ) == 0 ) { oStream_ << "TcpClient: unknown host (" << hostname << ")!"; handleError( StkError::PROCESS_SOCKET_IPADDR ); } // Fill in the address structure struct sockaddr_in server_address; server_address.sin_family = AF_INET; memcpy( (void *)&server_address.sin_addr, hostp->h_addr, hostp->h_length ); server_address.sin_port = htons(port); // Connect to the server if ( ::connect( soket_, (struct sockaddr *)&server_address, sizeof(server_address) ) < 0 ) { oStream_ << "TcpClient: Couldn't connect to socket server!"; handleError( StkError::PROCESS_SOCKET ); } return soket_; } int TcpClient :: writeBuffer( const void *buffer, long bufferSize, int flags ) { if ( !isValid( soket_ ) ) return -1; return send( soket_, (const char *)buffer, bufferSize, flags ); } int TcpClient :: readBuffer( void *buffer, long bufferSize, int flags ) { if ( !isValid( soket_ ) ) return -1; return recv( soket_, (char *)buffer, bufferSize, flags ); } } // stk namespace stk-4.5.0/src/TcpServer.cpp0000644000076600007660000000571112327014024013347 0ustar gary/***************************************************/ /*! \class TcpServer \brief STK TCP socket server class. This class provides a uniform cross-platform TCP socket server interface. Methods are provided for reading or writing data buffers to/from connections. TCP sockets are reliable and connection-oriented. A TCP socket server must accept a connection from a TCP client before data can be sent or received. Data delivery is guaranteed in order, without loss, error, or duplication. That said, TCP transmissions tend to be slower than those using the UDP protocol and data sent with multiple \e write() calls can be arbitrarily combined by the underlying system. The user is responsible for checking the values returned by the read/write methods. Values less than or equal to zero indicate a closed or lost connection or the occurence of an error. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "TcpServer.h" namespace stk { TcpServer :: TcpServer( int port ) { // Create a socket server. #if defined(__OS_WINDOWS__) // windoze-only stuff WSADATA wsaData; WORD wVersionRequested = MAKEWORD(1,1); WSAStartup(wVersionRequested, &wsaData); if (wsaData.wVersion != wVersionRequested) { oStream_ << "TcpServer: Incompatible Windows socket library version!"; handleError( StkError::PROCESS_SOCKET ); } #endif // Create the server-side socket soket_ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (soket_ < 0) { oStream_ << "TcpServer: Couldn't create socket server!"; handleError( StkError::PROCESS_SOCKET ); } int flag = 1; int result = setsockopt( soket_, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int) ); if (result < 0) { oStream_ << "TcpServer: Error setting socket options!"; handleError( StkError::PROCESS_SOCKET ); } struct sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons( port ); // Bind socket to the appropriate port and interface (INADDR_ANY) if ( bind( soket_, (struct sockaddr *)&address, sizeof(address) ) < 0 ) { oStream_ << "TcpServer: Couldn't bind socket!"; handleError( StkError::PROCESS_SOCKET ); } // Listen for incoming connection(s) if ( listen( soket_, 1 ) < 0 ) { oStream_ << "TcpServer: Couldn't start server listening!"; handleError( StkError::PROCESS_SOCKET ); } port_ = port; } TcpServer :: ~TcpServer() { } int TcpServer :: accept( void ) { return ::accept( soket_, NULL, NULL ); } int TcpServer :: writeBuffer(const void *buffer, long bufferSize, int flags ) { if ( !isValid( soket_ ) ) return -1; return send( soket_, (const char *)buffer, bufferSize, flags ); } int TcpServer :: readBuffer(void *buffer, long bufferSize, int flags ) { if ( !isValid( soket_ ) ) return -1; return recv( soket_, (char *)buffer, bufferSize, flags ); } } // stk namespace stk-4.5.0/src/Thread.cpp0000644000076600007660000000442212327014024012637 0ustar gary/***************************************************/ /*! \class Thread \brief STK thread class. This class provides a uniform interface for cross-platform threads. On unix systems, the pthread library is used. Under Windows, the C runtime threadex functions are used. Each instance of the Thread class can be used to control a single thread process. Routines are provided to signal cancelation and/or joining with a thread, though it is not possible for this class to know the running status of a thread once it is started. For cross-platform compatability, thread functions should be declared as follows: THREAD_RETURN THREAD_TYPE thread_function(void *ptr) by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Thread.h" namespace stk { Thread :: Thread() { thread_ = 0; } Thread :: ~Thread() { } bool Thread :: start( THREAD_FUNCTION routine, void * ptr ) { if ( thread_ ) { oStream_ << "Thread:: a thread is already running!"; handleError( StkError::WARNING ); return false; } #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) if ( pthread_create(&thread_, NULL, *routine, ptr) == 0 ) return true; #elif defined(__OS_WINDOWS__) unsigned thread_id; thread_ = _beginthreadex(NULL, 0, routine, ptr, 0, &thread_id); if ( thread_ ) return true; #endif return false; } bool Thread :: cancel() { #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) if ( pthread_cancel(thread_) == 0 ) { return true; } #elif defined(__OS_WINDOWS__) TerminateThread((HANDLE)thread_, 0); return true; #endif return false; } bool Thread :: wait() { #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) if ( pthread_join(thread_, NULL) == 0 ) { thread_ = 0; return true; } #elif defined(__OS_WINDOWS__) long retval = WaitForSingleObject( (HANDLE)thread_, INFINITE ); if ( retval == WAIT_OBJECT_0 ) { CloseHandle( (HANDLE)thread_ ); thread_ = 0; return true; } #endif return false; } void Thread :: testCancel(void) { #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__)) pthread_testcancel(); #endif } } // stk namespace stk-4.5.0/src/TubeBell.cpp0000644000076600007660000000407212327014024013127 0ustar gary/***************************************************/ /*! \class TubeBell \brief STK tubular bell (orchestral chime) FM synthesis instrument. This class implements two simple FM Pairs summed together, also referred to as algorithm 5 of the TX81Z. \code Algorithm 5 is : 4->3--\ + --> Out 2->1--/ \endcode Control Change Numbers: - Modulator Index One = 2 - Crossfade of Outputs = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "TubeBell.h" namespace stk { TubeBell :: TubeBell( void ) : FM() { // Concatenate the STK rawwave path to the rawwave files for ( unsigned int i=0; i<3; i++ ) waves_[i] = new FileLoop( (Stk::rawwavePath() + "sinewave.raw").c_str(), true ); waves_[3] = new FileLoop( (Stk::rawwavePath() + "fwavblnk.raw").c_str(), true ); this->setRatio(0, 1.0 * 0.995); this->setRatio(1, 1.414 * 0.995); this->setRatio(2, 1.0 * 1.005); this->setRatio(3, 1.414 * 1.000); gains_[0] = fmGains_[94]; gains_[1] = fmGains_[76]; gains_[2] = fmGains_[99]; gains_[3] = fmGains_[71]; adsr_[0]->setAllTimes( 0.005, 4.0, 0.0, 0.04); adsr_[1]->setAllTimes( 0.005, 4.0, 0.0, 0.04); adsr_[2]->setAllTimes( 0.001, 2.0, 0.0, 0.04); adsr_[3]->setAllTimes( 0.004, 4.0, 0.0, 0.04); twozero_.setGain( 0.5 ); vibrato_.setFrequency( 2.0 ); } TubeBell :: ~TubeBell( void ) { } void TubeBell :: noteOn( StkFloat frequency, StkFloat amplitude ) { gains_[0] = amplitude * fmGains_[94]; gains_[1] = amplitude * fmGains_[76]; gains_[2] = amplitude * fmGains_[99]; gains_[3] = amplitude * fmGains_[71]; this->setFrequency( frequency ); this->keyOn(); } } // stk namespace stk-4.5.0/src/Twang.cpp0000644000076600007660000000546312327014024012516 0ustar gary/***************************************************/ /*! \class Twang \brief STK enhanced plucked string class. This class implements an enhanced plucked-string physical model, a la Jaffe-Smith, Smith, Karjalainen and others. It includes a comb filter to simulate pluck position. The tick() function takes an input sample, which is added to the delayline input. This can be used to implement commuted synthesis (if the input samples are derived from the impulse response of a body filter) or feedback (as in an electric guitar model). This is a digital waveguide model, making its use possibly subject to patents held by Stanford University, Yamaha, and others. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Twang.h" namespace stk { Twang :: Twang( StkFloat lowestFrequency ) { if ( lowestFrequency <= 0.0 ) { oStream_ << "Twang::Twang: argument is less than or equal to zero!"; handleError( StkError::FUNCTION_ARGUMENT ); } this->setLowestFrequency( lowestFrequency ); std::vector coefficients( 2, 0.5 ); loopFilter_.setCoefficients( coefficients ); loopGain_ = 0.995; pluckPosition_ = 0.4; this->setFrequency( 220.0 ); } void Twang :: clear( void ) { delayLine_.clear(); combDelay_.clear(); loopFilter_.clear(); lastOutput_ = 0.0; } void Twang :: setLowestFrequency( StkFloat frequency ) { unsigned long nDelays = (unsigned long) ( Stk::sampleRate() / frequency ); delayLine_.setMaximumDelay( nDelays + 1 ); combDelay_.setMaximumDelay( nDelays + 1 ); } void Twang :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Twang::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif // Delay = length - filter delay. StkFloat delay = ( Stk::sampleRate() / frequency ) - loopFilter_.phaseDelay( frequency ); delayLine_.setDelay( delay ); this->setLoopGain( loopGain_ ); // Set the pluck position, which puts zeroes at position * length. combDelay_.setDelay( 0.5 * pluckPosition_ * delay ); } void Twang :: setLoopGain( StkFloat loopGain ) { if ( loopGain < 0.0 || loopGain >= 1.0 ) { oStream_ << "Twang::setLoopGain: parameter is out of range!"; handleError( StkError::WARNING ); return; } loopGain_ = loopGain; StkFloat gain = loopGain_ + (frequency_ * 0.000005); if ( gain >= 1.0 ) gain = 0.99999; loopFilter_.setGain( gain ); } void Twang :: setPluckPosition( StkFloat position ) { if ( position < 0.0 || position > 1.0 ) { oStream_ << "Twang::setPluckPosition: argument (" << position << ") is out of range!"; handleError( StkError::WARNING ); return; } pluckPosition_ = position; } } // stk namespace stk-4.5.0/src/TwoPole.cpp0000644000076600007660000000411412327014024013017 0ustar gary/***************************************************/ /*! \class TwoPole \brief STK two-pole filter class. This class implements a two-pole digital filter. A method is provided for creating a resonance in the frequency response while maintaining a nearly constant filter gain. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "TwoPole.h" #include namespace stk { TwoPole :: TwoPole( void ) { b_.resize( 1 ); a_.resize( 3 ); inputs_.resize( 1, 1, 0.0 ); outputs_.resize( 3, 1, 0.0 ); b_[0] = 1.0; a_[0] = 1.0; Stk::addSampleRateAlert( this ); } TwoPole :: ~TwoPole() { Stk::removeSampleRateAlert( this ); } void TwoPole :: sampleRateChanged( StkFloat newRate, StkFloat oldRate ) { if ( !ignoreSampleRateChange_ ) { oStream_ << "TwoPole::sampleRateChanged: you may need to recompute filter coefficients!"; handleError( StkError::WARNING ); } } void TwoPole :: setResonance( StkFloat frequency, StkFloat radius, bool normalize ) { #if defined(_STK_DEBUG_) if ( frequency < 0.0 || frequency > 0.5 * Stk::sampleRate() ) { oStream_ << "TwoPole::setResonance: frequency argument (" << frequency << ") is out of range!"; handleError( StkError::WARNING ); return; } if ( radius < 0.0 || radius >= 1.0 ) { oStream_ << "TwoPole::setResonance: radius argument (" << radius << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif a_[2] = radius * radius; a_[1] = (StkFloat) -2.0 * radius * cos(TWO_PI * frequency / Stk::sampleRate()); if ( normalize ) { // Normalize the filter gain ... not terribly efficient. StkFloat real = 1 - radius + (a_[2] - radius) * cos(TWO_PI * 2 * frequency / Stk::sampleRate()); StkFloat imag = (a_[2] - radius) * sin(TWO_PI * 2 * frequency / Stk::sampleRate()); b_[0] = sqrt( pow(real, 2) + pow(imag, 2) ); } } void TwoPole :: setCoefficients( StkFloat b0, StkFloat a1, StkFloat a2, bool clearState ) { b_[0] = b0; a_[1] = a1; a_[2] = a2; if ( clearState ) this->clear(); } } // stk namespace stk-4.5.0/src/TwoZero.cpp0000644000076600007660000000356312327014024013046 0ustar gary/***************************************************/ /*! \class TwoZero \brief STK two-zero filter class. This class implements a two-zero digital filter. A method is provided for creating a "notch" in the frequency response while maintaining a constant filter gain. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "TwoZero.h" #include namespace stk { TwoZero :: TwoZero( void ) { b_.resize( 3, 0.0 ); inputs_.resize( 3, 1, 0.0 ); b_[0] = 1.0; Stk::addSampleRateAlert( this ); } TwoZero :: ~TwoZero() { Stk::removeSampleRateAlert( this ); } void TwoZero :: sampleRateChanged( StkFloat newRate, StkFloat oldRate ) { if ( !ignoreSampleRateChange_ ) { oStream_ << "TwoZero::sampleRateChanged: you may need to recompute filter coefficients!"; handleError( StkError::WARNING ); } } void TwoZero :: setCoefficients( StkFloat b0, StkFloat b1, StkFloat b2, bool clearState ) { b_[0] = b0; b_[1] = b1; b_[2] = b2; if ( clearState ) this->clear(); } void TwoZero :: setNotch( StkFloat frequency, StkFloat radius ) { #if defined(_STK_DEBUG_) if ( frequency < 0.0 || frequency > 0.5 * Stk::sampleRate() ) { oStream_ << "TwoZero::setNotch: frequency argument (" << frequency << ") is out of range!"; handleError( StkError::WARNING ); return; } if ( radius < 0.0 ) { oStream_ << "TwoZero::setNotch: radius argument (" << radius << ") is negative!"; handleError( StkError::WARNING ); return; } #endif b_[2] = radius * radius; b_[1] = -2.0 * radius * cos(TWO_PI * frequency / Stk::sampleRate()); // Normalize the filter gain. if ( b_[1] > 0.0 ) // Maximum at z = 0. b_[0] = 1.0 / ( 1.0 + b_[1] + b_[2] ); else // Maximum at z = -1. b_[0] = 1.0 / ( 1.0 - b_[1] + b_[2] ); b_[1] *= b_[0]; b_[2] *= b_[0]; } } // stk namespace stk-4.5.0/src/UdpSocket.cpp0000644000076600007660000000700112327014024013325 0ustar gary/***************************************************/ /*! \class UdpSocket \brief STK UDP socket server/client class. This class provides a uniform cross-platform UDP socket server/client interface. Methods are provided for reading or writing data buffers. The constructor creates a UDP socket and binds it to the specified port. Note that only one socket can be bound to a given port on the same machine. UDP sockets provide unreliable, connection-less service. Messages can be lost, duplicated, or received out of order. That said, data transmission tends to be faster than with TCP connections and datagrams are not potentially combined by the underlying system. The user is responsible for checking the values returned by the read/write methods. Values less than or equal to zero indicate the occurence of an error. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "UdpSocket.h" #include #include namespace stk { UdpSocket :: UdpSocket(int port ) { validAddress_ = false; #if defined(__OS_WINDOWS__) // windoze-only stuff WSADATA wsaData; WORD wVersionRequested = MAKEWORD(1,1); WSAStartup(wVersionRequested, &wsaData); if (wsaData.wVersion != wVersionRequested) { oStream_ << "UdpSocket: Incompatible Windows socket library version!"; handleError( StkError::PROCESS_SOCKET ); } #endif // Create the UDP socket soket_ = ::socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); if ( soket_ < 0 ) { oStream_ << "UdpSocket: Couldn't create UDP socket!"; handleError( StkError::PROCESS_SOCKET ); } struct sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons( port ); // Bind socket to the appropriate port and interface (INADDR_ANY) if ( bind(soket_, (struct sockaddr *)&address, sizeof(address)) < 0 ) { oStream_ << "UdpSocket: Couldn't bind socket in constructor!"; handleError( StkError::PROCESS_SOCKET ); } port_ = port; } UdpSocket :: ~UdpSocket() { } void UdpSocket :: setDestination( int port, std::string hostname ) { this->setAddress( &address_, port, hostname ); validAddress_ = true; } void UdpSocket :: setAddress( struct sockaddr_in *address, int port, std::string hostname ) { struct hostent *hostp; if ( (hostp = gethostbyname( hostname.c_str() )) == 0 ) { oStream_ << "UdpSocket::setAddress: unknown host (" << hostname << ")!"; handleError( StkError::PROCESS_SOCKET_IPADDR ); } // Fill in the address structure address->sin_family = AF_INET; memcpy((void *)&address->sin_addr, hostp->h_addr, hostp->h_length); address->sin_port = htons( port ); } int UdpSocket :: writeBuffer( const void *buffer, long bufferSize, int flags ) { if ( !isValid( soket_ ) || !validAddress_ ) return -1; return sendto( soket_, (const char *)buffer, bufferSize, flags, (struct sockaddr *)&address_, sizeof(address_) ); } int UdpSocket :: readBuffer( void *buffer, long bufferSize, int flags ) { if ( !isValid( soket_ ) ) return -1; return recvfrom( soket_, (char *)buffer, bufferSize, flags, NULL, NULL ); } int UdpSocket :: writeBufferTo( const void *buffer, long bufferSize, int port, std::string hostname, int flags ) { if ( !isValid( soket_ ) ) return -1; struct sockaddr_in address; this->setAddress( &address, port, hostname ); return sendto( soket_, (const char *)buffer, bufferSize, flags, (struct sockaddr *)&address, sizeof(address) ); } } // stk namespace stk-4.5.0/src/Voicer.cpp0000644000076600007660000001535612327014024012667 0ustar gary/***************************************************/ /*! \class Voicer \brief STK voice manager class. This class can be used to manage a group of STK instrument classes. Individual voices can be controlled via unique note tags. Instrument groups can be controlled by group number. A previously constructed STK instrument class is linked with a voice manager using the addInstrument() function. An optional group number argument can be specified to the addInstrument() function as well (default group = 0). The voice manager does not delete any instrument instances ... it is the responsibility of the user to allocate and deallocate all instruments. The tick() function returns the mix of all sounding voices. Each noteOn returns a unique tag (credits to the NeXT MusicKit), so you can send control changes to specific voices within an ensemble. Alternately, control changes can be sent to all voices in a given group. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Voicer.h" #include namespace stk { Voicer :: Voicer( StkFloat decayTime ) { if ( decayTime < 0.0 ) { oStream_ << "Voicer::Voicer: argument (" << decayTime << ") must be positive!"; handleError( StkError::FUNCTION_ARGUMENT ); } tags_ = 23456; muteTime_ = (int) ( decayTime * Stk::sampleRate() ); lastFrame_.resize( 1, 1, 0.0 ); } void Voicer :: addInstrument( Instrmnt *instrument, int group ) { Voicer::Voice voice; voice.instrument = instrument; voice.group = group; voice.noteNumber = -1; voices_.push_back( voice ); // Check output channels and resize lastFrame_ if necessary. if ( instrument->channelsOut() > lastFrame_.channels() ) { unsigned int startChannel = lastFrame_.channels(); lastFrame_.resize( 1, instrument->channelsOut() ); for ( unsigned int i=startChannel; i::iterator i; for ( i=voices_.begin(); i!=voices_.end(); ++i ) { if ( (*i).instrument != instrument ) continue; voices_.erase( i ); found = true; break; } if ( found ) { // Check output channels and resize lastFrame_ if necessary. unsigned int maxChannels = 1; for ( i=voices_.begin(); i!=voices_.end(); ++i ) { if ( (*i).instrument->channelsOut() > maxChannels ) maxChannels = (*i).instrument->channelsOut(); } if ( maxChannels < lastFrame_.channels() ) lastFrame_.resize( 1, maxChannels ); } else { oStream_ << "Voicer::removeInstrument: instrument pointer not found in current voices!"; handleError( StkError::WARNING ); } } long Voicer :: noteOn(StkFloat noteNumber, StkFloat amplitude, int group ) { unsigned int i; StkFloat frequency = (StkFloat) 220.0 * pow( 2.0, (noteNumber - 57.0) / 12.0 ); for ( i=0; inoteOn( frequency, amplitude * ONE_OVER_128 ); voices_[i].sounding = 1; return voices_[i].tag; } } // All voices are sounding, so interrupt the oldest voice. int voice = -1; for ( i=0; i= 0 ) { voices_[voice].tag = tags_++; voices_[voice].group = group; voices_[voice].noteNumber = noteNumber; voices_[voice].frequency = frequency; voices_[voice].instrument->noteOn( frequency, amplitude * ONE_OVER_128 ); voices_[voice].sounding = 1; return voices_[voice].tag; } return -1; } void Voicer :: noteOff( StkFloat noteNumber, StkFloat amplitude, int group ) { for ( unsigned int i=0; inoteOff( amplitude * ONE_OVER_128 ); voices_[i].sounding = -muteTime_; } } } void Voicer :: noteOff( long tag, StkFloat amplitude ) { for ( unsigned int i=0; inoteOff( amplitude * ONE_OVER_128 ); voices_[i].sounding = -muteTime_; break; } } } void Voicer :: setFrequency( StkFloat noteNumber, int group ) { StkFloat frequency = (StkFloat) 220.0 * pow( 2.0, (noteNumber - 57.0) / 12.0 ); for ( unsigned int i=0; isetFrequency( frequency ); } } } void Voicer :: setFrequency( long tag, StkFloat noteNumber ) { StkFloat frequency = (StkFloat) 220.0 * pow( 2.0, (noteNumber - 57.0) / 12.0 ); for ( unsigned int i=0; isetFrequency( frequency ); break; } } } void Voicer :: pitchBend( StkFloat value, int group ) { StkFloat pitchScaler; if ( value < 8192.0 ) pitchScaler = pow( 0.5, (8192.0-value) / 8192.0 ); else pitchScaler = pow( 2.0, (value-8192.0) / 8192.0 ); for ( unsigned int i=0; isetFrequency( (StkFloat) (voices_[i].frequency * pitchScaler) ); } } void Voicer :: pitchBend( long tag, StkFloat value ) { StkFloat pitchScaler; if ( value < 8192.0 ) pitchScaler = pow( 0.5, (8192.0-value) / 8192.0 ); else pitchScaler = pow( 2.0, (value-8192.0) / 8192.0 ); for ( unsigned int i=0; isetFrequency( (StkFloat) (voices_[i].frequency * pitchScaler) ); break; } } } void Voicer :: controlChange( int number, StkFloat value, int group ) { for ( unsigned int i=0; icontrolChange( number, value ); } } void Voicer :: controlChange( long tag, int number, StkFloat value ) { for ( unsigned int i=0; icontrolChange( number, value ); break; } } } void Voicer :: silence( void ) { for ( unsigned int i=0; i 0 ) voices_[i].instrument->noteOff( 0.5 ); } } } // stk namespace stk-4.5.0/src/VoicForm.cpp0000644000076600007660000001314212327014024013153 0ustar gary/***************************************************/ /*! \class VoicForm \brief Four formant synthesis instrument. This instrument contains an excitation singing wavetable (looping wave with random and periodic vibrato, smoothing on frequency, etc.), excitation noise, and four sweepable complex resonances. Measured formant data is included, and enough data is there to support either parallel or cascade synthesis. In the floating point case cascade synthesis is the most natural so that's what you'll find here. Control Change Numbers: - Voiced/Unvoiced Mix = 2 - Vowel/Phoneme Selection = 4 - Vibrato Frequency = 11 - Vibrato Gain = 1 - Loudness (Spectral Tilt) = 128 by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "VoicForm.h" #include "Phonemes.h" #include "SKINI.msg" #include #include namespace stk { VoicForm :: VoicForm( void ) : Instrmnt() { // Concatenate the STK rawwave path to the rawwave file voiced_ = new SingWave( (Stk::rawwavePath() + "impuls20.raw").c_str(), true ); voiced_->setGainRate( 0.001 ); voiced_->setGainTarget( 0.0 ); for ( int i=0; i<4; i++ ) filters_[i].setSweepRate( 0.001 ); onezero_.setZero( -0.9 ); onepole_.setPole( 0.9 ); noiseEnv_.setRate( 0.001 ); noiseEnv_.setTarget( 0.0 ); this->setPhoneme( "eee" ); this->clear(); } VoicForm :: ~VoicForm( void ) { delete voiced_; } void VoicForm :: clear( void ) { onezero_.clear(); onepole_.clear(); for ( int i=0; i<4; i++ ) { filters_[i].clear(); } } void VoicForm :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "VoicForm::setFrequency: parameter is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif voiced_->setFrequency( frequency ); } bool VoicForm :: setPhoneme( const char *phoneme ) { bool found = false; unsigned int i = 0; while( i < 32 && !found ) { if ( !strcmp( Phonemes::name(i), phoneme ) ) { found = true; filters_[0].setTargets( Phonemes::formantFrequency(i, 0), Phonemes::formantRadius(i, 0), pow(10.0, Phonemes::formantGain(i, 0 ) / 20.0) ); filters_[1].setTargets( Phonemes::formantFrequency(i, 1), Phonemes::formantRadius(i, 1), pow(10.0, Phonemes::formantGain(i, 1 ) / 20.0) ); filters_[2].setTargets( Phonemes::formantFrequency(i, 2), Phonemes::formantRadius(i, 2), pow(10.0, Phonemes::formantGain(i, 2 ) / 20.0) ); filters_[3].setTargets( Phonemes::formantFrequency(i, 3), Phonemes::formantRadius(i, 3), pow(10.0, Phonemes::formantGain(i, 3 ) / 20.0) ); this->setVoiced( Phonemes::voiceGain( i ) ); this->setUnVoiced( Phonemes::noiseGain( i ) ); } i++; } if ( !found ) { oStream_ << "VoicForm::setPhoneme: phoneme " << phoneme << " not found!"; handleError( StkError::WARNING ); } return found; } void VoicForm :: setFilterSweepRate( unsigned int whichOne, StkFloat rate ) { if ( whichOne > 3 ) { oStream_ << "VoicForm::setFilterSweepRate: filter select argument outside range 0-3!"; handleError( StkError::WARNING ); return; } filters_[whichOne].setSweepRate(rate); } void VoicForm :: quiet( void ) { voiced_->noteOff(); noiseEnv_.setTarget( 0.0 ); } void VoicForm :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); voiced_->setGainTarget( amplitude ); onepole_.setPole( 0.97 - (amplitude * 0.2) ); } void VoicForm :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Clarinet::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if (number == __SK_Breath_) { // 2 this->setVoiced( 1.0 - normalizedValue ); this->setUnVoiced( 0.01 * normalizedValue ); } else if (number == __SK_FootControl_) { // 4 StkFloat temp = 0.0; unsigned int i = (int) value; if (i < 32) { temp = 0.9; } else if (i < 64) { i -= 32; temp = 1.0; } else if (i < 96) { i -= 64; temp = 1.1; } else if (i < 128) { i -= 96; temp = 1.2; } else if (i == 128) { i = 0; temp = 1.4; } filters_[0].setTargets( temp * Phonemes::formantFrequency(i, 0), Phonemes::formantRadius(i, 0), pow(10.0, Phonemes::formantGain(i, 0 ) / 20.0) ); filters_[1].setTargets( temp * Phonemes::formantFrequency(i, 1), Phonemes::formantRadius(i, 1), pow(10.0, Phonemes::formantGain(i, 1 ) / 20.0) ); filters_[2].setTargets( temp * Phonemes::formantFrequency(i, 2), Phonemes::formantRadius(i, 2), pow(10.0, Phonemes::formantGain(i, 2 ) / 20.0) ); filters_[3].setTargets( temp * Phonemes::formantFrequency(i, 3), Phonemes::formantRadius(i, 3), pow(10.0, Phonemes::formantGain(i, 3 ) / 20.0) ); this->setVoiced( Phonemes::voiceGain( i ) ); this->setUnVoiced( Phonemes::noiseGain( i ) ); } else if (number == __SK_ModFrequency_) // 11 voiced_->setVibratoRate( normalizedValue * 12.0); // 0 to 12 Hz else if (number == __SK_ModWheel_) // 1 voiced_->setVibratoGain( normalizedValue * 0.2); else if (number == __SK_AfterTouch_Cont_) { // 128 this->setVoiced( normalizedValue ); onepole_.setPole( 0.97 - ( normalizedValue * 0.2) ); } #if defined(_STK_DEBUG_) else { oStream_ << "VoicForm::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Whistle.cpp0000644000076600007660000001626612327014024013060 0ustar gary/***************************************************/ /*! \Class Whistle \brief STK police/referee whistle instrument class. This class implements a hybrid physical/spectral model of a police whistle (a la Cook). Control Change Numbers: - Noise Gain = 4 - Fipple Modulation Frequency = 11 - Fipple Modulation Gain = 1 - Blowing Frequency Modulation = 2 - Volume = 128 by Perry R. Cook 1995--2014. */ /***************************************************/ #include "Whistle.h" #include "SKINI.msg" #include namespace stk { const int CAN_RADIUS = 100; const int PEA_RADIUS = 30; const int BUMP_RADIUS = 5; const StkFloat NORM_CAN_LOSS = 0.97; //const StkFloat SLOW_CAN_LOSS = 0.90; const StkFloat GRAVITY = 20.0; const StkFloat NORM_TICK_SIZE = 0.004; //const StkFloat SLOW_TICK_SIZE = 0.0001; const StkFloat ENV_RATE = 0.001; Whistle :: Whistle( void ) { sine_.setFrequency( 2800.0 ); can_.setRadius( CAN_RADIUS ); can_.setPosition(0, 0, 0); // set can location can_.setVelocity(0, 0, 0); // and the velocity onepole_.setPole(0.95); // 0.99 bumper_.setRadius( BUMP_RADIUS ); bumper_.setPosition(0.0, CAN_RADIUS-BUMP_RADIUS, 0); bumper_.setPosition(0.0, CAN_RADIUS-BUMP_RADIUS, 0); pea_.setRadius( PEA_RADIUS ); pea_.setPosition(0, CAN_RADIUS/2, 0); pea_.setVelocity(35, 15, 0); envelope_.setRate( ENV_RATE ); envelope_.keyOn(); fippleFreqMod_ = 0.5; fippleGainMod_ = 0.5; blowFreqMod_ = 0.25; noiseGain_ = 0.125; baseFrequency_ = 2000; tickSize_ = NORM_TICK_SIZE; canLoss_ = NORM_CAN_LOSS; subSample_ = 1; subSampCount_ = subSample_; } Whistle :: ~Whistle( void ) { #ifdef WHISTLE_ANIMATION printf("Exit, Whistle bye bye!!\n"); #endif } void Whistle :: clear( void ) { } void Whistle :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Whistle::setFrequency: parameter is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif baseFrequency_ = frequency * 4; // the whistle is a transposing instrument } void Whistle :: startBlowing( StkFloat amplitude, StkFloat rate ) { if ( amplitude <= 0.0 || rate <= 0.0 ) { oStream_ << "Whistle::startBlowing: one or more arguments is less than or equal to zero!"; handleError( StkError::WARNING ); return; } envelope_.setRate( ENV_RATE ); envelope_.setTarget( amplitude ); } void Whistle :: stopBlowing( StkFloat rate ) { if ( rate <= 0.0 ) { oStream_ << "Whistle::stopBlowing: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } envelope_.setRate( rate ); envelope_.keyOff(); } void Whistle :: noteOn( StkFloat frequency, StkFloat amplitude ) { this->setFrequency( frequency ); this->startBlowing( amplitude*2.0 ,amplitude * 0.2 ); } void Whistle :: noteOff( StkFloat amplitude ) { this->stopBlowing( amplitude * 0.02 ); } int frameCount = 0; StkFloat Whistle :: tick( unsigned int ) { StkFloat soundMix, tempFreq; StkFloat envOut = 0, temp, temp1, temp2, tempX, tempY; double phi, cosphi, sinphi; double gain = 0.5, mod = 0.0; if ( --subSampCount_ <= 0 ) { tempVectorP_ = pea_.getPosition(); subSampCount_ = subSample_; temp = bumper_.isInside( tempVectorP_ ); #ifdef WHISTLE_ANIMATION frameCount += 1; if ( frameCount >= (1470 / subSample_) ) { frameCount = 0; printf("%f %f %f\n",tempVectorP_->getX(),tempVectorP_->getY(),envOut); fflush(stdout); } #endif envOut = envelope_.tick(); if (temp < (BUMP_RADIUS + PEA_RADIUS)) { tempX = envOut * tickSize_ * 2000 * noise_.tick(); tempY = -envOut * tickSize_ * 1000 * (1.0 + noise_.tick()); pea_.addVelocity( tempX, tempY, 0 ); pea_.tick( tickSize_ ); } mod = exp(-temp * 0.01); // exp. distance falloff of fipple/pea effect temp = onepole_.tick(mod); // smooth it a little gain = (1.0 - (fippleGainMod_*0.5)) + (2.0 * fippleGainMod_ * temp); gain *= gain; // squared distance/gain // tempFreq = 1.0 // Normalized Base Freq // + (fippleFreqMod_ * 0.25) - (fippleFreqMod_ * temp) // fippleModulation // - (blowFreqMod_) + (blowFreqMod_ * envOut); // blowingModulation // short form of above tempFreq = 1.0 + fippleFreqMod_*(0.25-temp) + blowFreqMod_*(envOut-1.0); tempFreq *= baseFrequency_; sine_.setFrequency(tempFreq); tempVectorP_ = pea_.getPosition(); temp = can_.isInside(tempVectorP_); temp = -temp; // We know (hope) it's inside, just how much?? if (temp < (PEA_RADIUS * 1.25)) { pea_.getVelocity( &tempVector_ ); // This is the can/pea collision tempX = tempVectorP_->getX(); // calculation. Could probably tempY = tempVectorP_->getY(); // simplify using tables, etc. phi = -atan2(tempY,tempX); cosphi = cos(phi); sinphi = sin(phi); temp1 = (cosphi*tempVector_.getX()) - (sinphi*tempVector_.getY()); temp2 = (sinphi*tempVector_.getX()) + (cosphi*tempVector_.getY()); temp1 = -temp1; tempX = (cosphi*temp1) + (sinphi*temp2); tempY = (-sinphi*temp1) + (cosphi*temp2); pea_.setVelocity(tempX, tempY, 0); pea_.tick(tickSize_); pea_.setVelocity( tempX*canLoss_, tempY*canLoss_, 0 ); pea_.tick(tickSize_); } temp = tempVectorP_->getLength(); if (temp > 0.01) { tempX = tempVectorP_->getX(); tempY = tempVectorP_->getY(); phi = atan2( tempY, tempX ); phi += 0.3 * temp / CAN_RADIUS; cosphi = cos(phi); sinphi = sin(phi); tempX = 3.0 * temp * cosphi; tempY = 3.0 * temp * sinphi; } else { tempX = 0.0; tempY = 0.0; } temp = (0.9 + 0.1*subSample_*noise_.tick()) * envOut * 0.6 * tickSize_; pea_.addVelocity( temp * tempX, (temp*tempY) - (GRAVITY*tickSize_), 0 ); pea_.tick( tickSize_ ); // bumper_.tick(0.0); } temp = envOut * envOut * gain / 2; soundMix = temp * ( sine_.tick() + ( noiseGain_*noise_.tick() ) ); lastFrame_[0] = 0.20 * soundMix; // should probably do one-zero filter here return lastFrame_[0]; } void Whistle :: controlChange( int number, StkFloat value ) { #if defined(_STK_DEBUG_) if ( Stk::inRange( value, 0.0, 128.0 ) == false ) { oStream_ << "Whistle::controlChange: value (" << value << ") is out of range!"; handleError( StkError::WARNING ); return; } #endif StkFloat normalizedValue = value * ONE_OVER_128; if ( number == __SK_NoiseLevel_ ) // 4 noiseGain_ = 0.25 * normalizedValue; else if ( number == __SK_ModFrequency_ ) // 11 fippleFreqMod_ = normalizedValue; else if ( number == __SK_ModWheel_ ) // 1 fippleGainMod_ = normalizedValue; else if ( number == __SK_AfterTouch_Cont_ ) // 128 envelope_.setTarget( normalizedValue * 2.0 ); else if ( number == __SK_Breath_ ) // 2 blowFreqMod_ = normalizedValue * 0.5; else if ( number == __SK_Sustain_ ) { // 64 subSample_ = (int) value; if ( subSample_ < 1.0 ) subSample_ = 1; envelope_.setRate( ENV_RATE / subSample_ ); } #if defined(_STK_DEBUG_) else { oStream_ << "Whistle::controlChange: undefined control number (" << number << ")!"; handleError( StkError::WARNING ); } #endif } } // stk namespace stk-4.5.0/src/Wurley.cpp0000644000076600007660000000500212327014024012712 0ustar gary/***************************************************/ /*! \class Wurley \brief STK Wurlitzer electric piano FM synthesis instrument. This class implements two simple FM Pairs summed together, also referred to as algorithm 5 of the TX81Z. \code Algorithm 5 is : 4->3--\ + --> Out 2->1--/ \endcode Control Change Numbers: - Modulator Index One = 2 - Crossfade of Outputs = 4 - LFO Speed = 11 - LFO Depth = 1 - ADSR 2 & 4 Target = 128 The basic Chowning/Stanford FM patent expired in 1995, but there exist follow-on patents, mostly assigned to Yamaha. If you are of the type who should worry about this (making money) worry away. by Perry R. Cook and Gary P. Scavone, 1995--2014. */ /***************************************************/ #include "Wurley.h" namespace stk { Wurley :: Wurley( void ) : FM() { // Concatenate the STK rawwave path to the rawwave files for ( unsigned int i=0; i<3; i++ ) waves_[i] = new FileLoop( (Stk::rawwavePath() + "sinewave.raw").c_str(), true ); waves_[3] = new FileLoop( (Stk::rawwavePath() + "fwavblnk.raw").c_str(), true ); this->setRatio(0, 1.0); this->setRatio(1, 4.0); this->setRatio(2, -510.0); this->setRatio(3, -510.0); gains_[0] = fmGains_[99]; gains_[1] = fmGains_[82]; gains_[2] = fmGains_[92]; gains_[3] = fmGains_[68]; adsr_[0]->setAllTimes( 0.001, 1.50, 0.0, 0.04); adsr_[1]->setAllTimes( 0.001, 1.50, 0.0, 0.04); adsr_[2]->setAllTimes( 0.001, 0.25, 0.0, 0.04); adsr_[3]->setAllTimes( 0.001, 0.15, 0.0, 0.04); twozero_.setGain( 2.0 ); vibrato_.setFrequency( 8.0 ); } Wurley :: ~Wurley( void ) { } void Wurley :: setFrequency( StkFloat frequency ) { #if defined(_STK_DEBUG_) if ( frequency <= 0.0 ) { oStream_ << "Wurley::setFrequency: argument is less than or equal to zero!"; handleError( StkError::WARNING ); return; } #endif baseFrequency_ = frequency; waves_[0]->setFrequency( baseFrequency_ * ratios_[0]); waves_[1]->setFrequency( baseFrequency_ * ratios_[1]); waves_[2]->setFrequency( ratios_[2] ); // Note here a 'fixed resonance'. waves_[3]->setFrequency( ratios_[3] ); } void Wurley :: noteOn( StkFloat frequency, StkFloat amplitude ) { gains_[0] = amplitude * fmGains_[99]; gains_[1] = amplitude * fmGains_[82]; gains_[2] = amplitude * fmGains_[82]; gains_[3] = amplitude * fmGains_[68]; this->setFrequency( frequency ); this->keyOn(); } } // stk namespace