stk-4.5.2/000077500000000000000000000000001233421753700123325ustar00rootroot00000000000000stk-4.5.2/INSTALL.md000066400000000000000000000060061233421753700137640ustar00rootroot00000000000000% 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.2/LICENSE000066400000000000000000000025251233421753700133430ustar00rootroot00000000000000The 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.2/Makefile.in000066400000000000000000000020111233421753700143710ustar00rootroot00000000000000### 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.2/README.md000066400000000000000000000226761233421753700136260ustar00rootroot00000000000000# 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.2/bin/000077500000000000000000000000001233421753700131025ustar00rootroot00000000000000stk-4.5.2/bin/treesed000077500000000000000000000070751233421753700144740ustar00rootroot00000000000000#!/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.2/config/000077500000000000000000000000001233421753700135775ustar00rootroot00000000000000stk-4.5.2/config/config.guess000077500000000000000000001146171233421753700161310ustar00rootroot00000000000000#! /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.2/config/config.sub000066400000000000000000000657121233421753700155720ustar00rootroot00000000000000#! /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.2/config/install.sh000066400000000000000000000000001233421753700155670ustar00rootroot00000000000000stk-4.5.2/configure.ac000066400000000000000000000162531233421753700146270ustar00rootroot00000000000000# 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.2/doc/000077500000000000000000000000001233421753700130775ustar00rootroot00000000000000stk-4.5.2/doc/README-Linux.txt000066400000000000000000000027721233421753700157020ustar00rootroot00000000000000The 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.2/doc/README-MacOSX.txt000066400000000000000000000017501233421753700156700ustar00rootroot00000000000000The 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.2/doc/README-SGI.txt000066400000000000000000000006471233421753700152240ustar00rootroot00000000000000The 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.2/doc/README-Win.txt000066400000000000000000000063041233421753700153330ustar00rootroot00000000000000The 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.2/doc/ReleaseNotes.txt000066400000000000000000000335751233421753700162460ustar00rootroot00000000000000The 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.2/doc/SKINI.txt000066400000000000000000000450311233421753700145200ustar00rootroot00000000000000This 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.2/doc/doxygen/000077500000000000000000000000001233421753700145545ustar00rootroot00000000000000stk-4.5.2/doc/doxygen/Doxyfile000066400000000000000000002013701233421753700162650ustar00rootroot00000000000000# 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.2/doc/doxygen/classes.txt000066400000000000000000000005001233421753700167450ustar00rootroot00000000000000/*! \page classes Class Documentation */stk-4.5.2/doc/doxygen/compile.txt000066400000000000000000000173021233421753700167500ustar00rootroot00000000000000/*! \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.2/doc/doxygen/control.txt000066400000000000000000000077531233421753700170110ustar00rootroot00000000000000/*! \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.2/doc/doxygen/crealtime.txt000066400000000000000000000076401233421753700172710ustar00rootroot00000000000000/*! \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.2/doc/doxygen/download.txt000066400000000000000000000423451233421753700171340ustar00rootroot00000000000000/*! \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.2/doc/doxygen/faq.txt000066400000000000000000000107321233421753700160670ustar00rootroot00000000000000/*! \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.2/doc/doxygen/filtering.txt000066400000000000000000000074211233421753700173040ustar00rootroot00000000000000/*! \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.2/doc/doxygen/footer.html000066400000000000000000000003711233421753700167410ustar00rootroot00000000000000
The Synthesis ToolKit in C++ (STK)
©1995--2014 Perry R. Cook and Gary P. Scavone. All Rights Reserved.
stk-4.5.2/doc/doxygen/fundamentals.txt000066400000000000000000000104751233421753700200050ustar00rootroot00000000000000/*! \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.2/doc/doxygen/header.html000066400000000000000000000014741233421753700167000ustar00rootroot00000000000000 The Synthesis ToolKit in C++ (STK)
   

Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


stk-4.5.2/doc/doxygen/header.tex000066400000000000000000000016101233421753700165240ustar00rootroot00000000000000\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.2/doc/doxygen/hello.txt000066400000000000000000000074411233421753700164260ustar00rootroot00000000000000/*! \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.2/doc/doxygen/images/000077500000000000000000000000001233421753700160215ustar00rootroot00000000000000stk-4.5.2/doc/doxygen/images/ccrma.gif000066400000000000000000000201611233421753700175750ustar00rootroot00000000000000GIF87aá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.2/doc/doxygen/images/princeton.gif000066400000000000000000000125441233421753700205170ustar00rootroot00000000000000GIF87aá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.2/doc/doxygen/index.txt000066400000000000000000000036571233421753700164370ustar00rootroot00000000000000/*! \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.2/doc/doxygen/information.txt000066400000000000000000000237451233421753700176550ustar00rootroot00000000000000/*! \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.2/doc/doxygen/instruments.txt000066400000000000000000000024011233421753700177050ustar00rootroot00000000000000/*! \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.2/doc/doxygen/links.txt000066400000000000000000000024431233421753700164400ustar00rootroot00000000000000/*! \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.2/doc/doxygen/maillist.txt000066400000000000000000000013771233421753700171430ustar00rootroot00000000000000/*! \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.2/doc/doxygen/multichannel.txt000066400000000000000000000040501233421753700177770ustar00rootroot00000000000000/*! \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.2/doc/doxygen/polyvoices.txt000066400000000000000000000041031233421753700175070ustar00rootroot00000000000000/*! \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.2/doc/doxygen/realtime.txt000066400000000000000000000053041233421753700171210ustar00rootroot00000000000000/*! \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.2/doc/doxygen/skini.txt000066400000000000000000000434661233421753700164470ustar00rootroot00000000000000/*! \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.2/doc/doxygen/system.txt000066400000000000000000000050031233421753700166370ustar00rootroot00000000000000/*! \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.2/doc/doxygen/tutorial.txt000066400000000000000000000022141233421753700171570ustar00rootroot00000000000000/*! \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.2/doc/doxygen/usage.txt000066400000000000000000000357001233421753700164260ustar00rootroot00000000000000/*! \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.2/doc/hierarchy.txt000066400000000000000000000216411233421753700156220ustar00rootroot00000000000000STK: 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.2/doc/treesed.html000066400000000000000000000127611233421753700154270ustar00rootroot00000000000000 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.2/iOS/000077500000000000000000000000001233421753700130245ustar00rootroot00000000000000stk-4.5.2/iOS/README-iOS.md000066400000000000000000000077111233421753700150010ustar00rootroot00000000000000This file contains instructions for integrating the STK in Xcode projects and solutions to common integration issues. ##Setup ###If you have [Cocoapods](http://cocoapods.org/) 1. Add `pod 'STK', '~> 4.5'` to your Podfile. 1. Run `pod install` ###If you don't have Cocoapods 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*. If that doesn't solve it: Install Cocoapods and use it to install the STK. It takes one minute and will make your life easier. Visit the [Cocoapods website](http://cocoapods.org/) for installation instructions. ###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 make sure that the STK's raw wave files are copied into your bundle and that the STK knows where they are. You'll know you need to if you get this runtime error: `FileRead::open: could not open or find file (../../rawwaves/filename.raw)!` ####If you're using Cocoapods Add this code before using a class that needs the raw waves: ```objective-c stk::Stk::setRawwavePath([[[NSBundle mainBundle] pathForResource:@"rawwaves" ofType:@"bundle"] UTF8String]); ``` ####If you're not using Cocoapods 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.2/iOS/STK.xcodeproj/000077500000000000000000000000001233421753700154615ustar00rootroot00000000000000stk-4.5.2/iOS/STK.xcodeproj/project.pbxproj000066400000000000000000002362041233421753700205440ustar00rootroot00000000000000// !$*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 /* SKINImsg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SKINImsg.h; path = ../include/SKINImsg.h; sourceTree = ""; }; B08F60E218BA9B1800C14A90 /* SKINItbl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SKINItbl.h; path = ../include/SKINItbl.h; 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 /* SKINImsg.h */, B08F60E218BA9B1800C14A90 /* SKINItbl.h */, ); 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.2/iOS/STK.xcodeproj/project.xcworkspace/000077500000000000000000000000001233421753700214575ustar00rootroot00000000000000stk-4.5.2/iOS/STK.xcodeproj/project.xcworkspace/contents.xcworkspacedata000066400000000000000000000002341233421753700264200ustar00rootroot00000000000000 stk-4.5.2/iOS/demo/000077500000000000000000000000001233421753700137505ustar00rootroot00000000000000stk-4.5.2/iOS/demo/README.MD000066400000000000000000000012711233421753700151300ustar00rootroot00000000000000##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.2/iOS/demo/iOS Demo.xcodeproj/000077500000000000000000000000001233421753700173035ustar00rootroot00000000000000stk-4.5.2/iOS/demo/iOS Demo.xcodeproj/project.pbxproj000066400000000000000000000523201233421753700223610ustar00rootroot00000000000000// !$*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.2/iOS/demo/iOS Demo.xcodeproj/project.xcworkspace/000077500000000000000000000000001233421753700233015ustar00rootroot00000000000000stk-4.5.2/iOS/demo/iOS Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata000066400000000000000000000002311233421753700302370ustar00rootroot00000000000000 stk-4.5.2/iOS/demo/iOS Demo.xcodeproj/project.xcworkspace/xcshareddata/000077500000000000000000000000001233421753700257345ustar00rootroot00000000000000stk-4.5.2/iOS/demo/iOS Demo.xcodeproj/project.xcworkspace/xcshareddata/iOS Demo.xccheckout000066400000000000000000000027151233421753700313620ustar00rootroot00000000000000 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.2/iOS/demo/iOS Demo/000077500000000000000000000000001233421753700153075ustar00rootroot00000000000000stk-4.5.2/iOS/demo/iOS Demo/AppDelegate.h000066400000000000000000000003401233421753700176300ustar00rootroot00000000000000// // 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.2/iOS/demo/iOS Demo/AppDelegate.m000066400000000000000000000010601233421753700176350ustar00rootroot00000000000000// // 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.2/iOS/demo/iOS Demo/Images.xcassets/000077500000000000000000000000001233421753700203505ustar00rootroot00000000000000stk-4.5.2/iOS/demo/iOS Demo/Images.xcassets/AppIcon.appiconset/000077500000000000000000000000001233421753700240455ustar00rootroot00000000000000stk-4.5.2/iOS/demo/iOS Demo/Images.xcassets/AppIcon.appiconset/Contents.json000066400000000000000000000005151233421753700265360ustar00rootroot00000000000000{ "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.2/iOS/demo/iOS Demo/Images.xcassets/LaunchImage.launchimage/000077500000000000000000000000001233421753700250015ustar00rootroot00000000000000stk-4.5.2/iOS/demo/iOS Demo/Images.xcassets/LaunchImage.launchimage/Contents.json000066400000000000000000000006721233421753700274760ustar00rootroot00000000000000{ "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.2/iOS/demo/iOS Demo/ViewController.h000066400000000000000000000002421233421753700204340ustar00rootroot00000000000000// // ViewController.h // iOS Demo // // Created by Ariel Elkin on 03/03/2014. // #import @interface ViewController : UIViewController @end stk-4.5.2/iOS/demo/iOS Demo/ViewController.mm000066400000000000000000000061601233421753700206230ustar00rootroot00000000000000// // 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.2/iOS/demo/iOS Demo/en.lproj/000077500000000000000000000000001233421753700170365ustar00rootroot00000000000000stk-4.5.2/iOS/demo/iOS Demo/en.lproj/InfoPlist.strings000066400000000000000000000000551233421753700223600ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ stk-4.5.2/iOS/demo/iOS Demo/iOS Demo-Info.plist000066400000000000000000000022101233421753700206070ustar00rootroot00000000000000 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.2/iOS/demo/iOS Demo/iOS Demo-Prefix.pch000066400000000000000000000005301233421753700205730ustar00rootroot00000000000000// // 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.2/iOS/demo/iOS Demo/main.m000066400000000000000000000005251233421753700164130ustar00rootroot00000000000000// // 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.2/iOS/demo/iOS DemoTests/000077500000000000000000000000001233421753700163325ustar00rootroot00000000000000stk-4.5.2/iOS/demo/iOS DemoTests/en.lproj/000077500000000000000000000000001233421753700200615ustar00rootroot00000000000000stk-4.5.2/iOS/demo/iOS DemoTests/en.lproj/InfoPlist.strings000066400000000000000000000000551233421753700234030ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ stk-4.5.2/iOS/demo/iOS DemoTests/iOS DemoTests-Info.plist000066400000000000000000000012531233421753700226630ustar00rootroot00000000000000 CFBundleDevelopmentRegion en CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier stk.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 stk-4.5.2/iOS/demo/iOS DemoTests/iOS_DemoTests.m000066400000000000000000000012031233421753700211650ustar00rootroot00000000000000// // 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.2/include/000077500000000000000000000000001233421753700137555ustar00rootroot00000000000000stk-4.5.2/include/ADSR.h000066400000000000000000000111561233421753700146630ustar00rootroot00000000000000#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 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.2/include/Bowed.h000066400000000000000000000111321233421753700151640ustar00rootroot00000000000000#ifndef STK_BOWED_H #define STK_BOWED_H #include "Instrmnt.h" #include "DelayL.h" #include "BowTable.h" #include "OnePole.h" #include "BiQuad.h" #include "SineWave.h" #include "ADSR.h" namespace stk { /***************************************************/ /*! \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. */ /***************************************************/ class Bowed : public Instrmnt { public: //! Class constructor, taking the lowest desired playing frequency. Bowed( StkFloat lowestFrequency = 8.0 ); //! Class destructor. ~Bowed( void ); //! Reset and clear all internal state. void clear( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Set vibrato gain. void setVibrato( StkFloat gain ) { vibratoGain_ = gain; }; //! Apply breath pressure to instrument with given amplitude and rate of increase. void startBowing( StkFloat amplitude, StkFloat rate ); //! Decrease breath pressure with given rate of decrease. void stopBowing( 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 neckDelay_; DelayL bridgeDelay_; BowTable bowTable_; OnePole stringFilter_; BiQuad bodyFilters_[6]; SineWave vibrato_; ADSR adsr_; bool bowDown_; StkFloat maxVelocity_; StkFloat baseDelay_; StkFloat vibratoGain_; StkFloat betaRatio_; }; inline StkFloat Bowed :: tick( unsigned int ) { StkFloat bowVelocity = maxVelocity_ * adsr_.tick(); StkFloat bridgeReflection = -stringFilter_.tick( bridgeDelay_.lastOut() ); StkFloat nutReflection = -neckDelay_.lastOut(); StkFloat stringVelocity = bridgeReflection + nutReflection; StkFloat deltaV = bowVelocity - stringVelocity; // Differential velocity StkFloat newVelocity = 0.0; if ( bowDown_ ) newVelocity = deltaV * bowTable_.tick( deltaV ); // Non-Linear bow function neckDelay_.tick( bridgeReflection + newVelocity); // Do string propagations bridgeDelay_.tick(nutReflection + newVelocity); if ( vibratoGain_ > 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 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.2/include/Envelope.h000066400000000000000000000063171233421753700157120ustar00rootroot00000000000000#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; 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.2/include/FMVoices.h000066400000000000000000000075151233421753700156110ustar00rootroot00000000000000#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; 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.2/include/FileRead.h000066400000000000000000000114571233421753700156110ustar00rootroot00000000000000#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.2/include/FileWrite.h000066400000000000000000000066351233421753700160320ustar00rootroot00000000000000#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.2/include/FileWvIn.h000066400000000000000000000153271233421753700156210ustar00rootroot00000000000000#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.2/include/FileWvOut.h000066400000000000000000000056761233421753700160300ustar00rootroot00000000000000#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.2/include/Filter.h000066400000000000000000000070411233421753700153550ustar00rootroot00000000000000#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.2/include/Flute.h000066400000000000000000000114411233421753700152060ustar00rootroot00000000000000#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= 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.2/include/Function.h000066400000000000000000000015451233421753700157200ustar00rootroot00000000000000#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.2/include/Generator.h000066400000000000000000000027511233421753700160610ustar00rootroot00000000000000#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.2/include/Granulate.h000066400000000000000000000155741233421753700160640ustar00rootroot00000000000000#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.2/include/InetWvIn.h000066400000000000000000000126171233421753700156400ustar00rootroot00000000000000#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.2/include/InetWvOut.h000066400000000000000000000065141233421753700160400ustar00rootroot00000000000000#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.2/include/Instrmnt.h000066400000000000000000000064651233421753700157570ustar00rootroot00000000000000#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.2/include/JCRev.h000066400000000000000000000131341233421753700151010ustar00rootroot00000000000000#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.2/include/JetTable.h000066400000000000000000000072171233421753700156270ustar00rootroot00000000000000#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.2/include/LentPitShift.h000066400000000000000000000212401233421753700165020ustar00rootroot00000000000000#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.2/include/MidiFileIn.h000066400000000000000000000121531233421753700161010ustar00rootroot00000000000000#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.2/include/Modal.h000066400000000000000000000103151233421753700151620ustar00rootroot00000000000000#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.2/include/NRev.h000066400000000000000000000124311233421753700150010ustar00rootroot00000000000000#ifndef STK_NREV_H #define STK_NREV_H #include "Effect.h" #include "Delay.h" namespace stk { /***************************************************/ /*! \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. */ /***************************************************/ class NRev : public Effect { public: //! Class constructor taking a T60 decay time argument (one second default value). NRev( 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_[8]; Delay combDelays_[6]; StkFloat allpassCoefficient_; StkFloat combCoefficient_[6]; StkFloat lowpassState_; }; inline StkFloat NRev :: lastOut( unsigned int channel ) { #if defined(_STK_DEBUG_) if ( channel > 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.2/include/Noise.h000066400000000000000000000044341233421753700152100ustar00rootroot00000000000000#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= 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; 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.2/include/PercFlut.h000066400000000000000000000070261233421753700156570ustar00rootroot00000000000000#ifndef STK_PERCFLUT_H #define STK_PERCFLUT_H #include "FM.h" namespace stk { /***************************************************/ /*! \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. */ /***************************************************/ 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.2/include/Plucked.h000066400000000000000000000062631233421753700155240ustar00rootroot00000000000000#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, 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.2/include/Resonate.h000066400000000000000000000066151233421753700157160ustar00rootroot00000000000000#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.2/include/RtMidi.h000066400000000000000000000701561233421753700153270ustar00rootroot00000000000000/**********************************************************************/ /*! \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.2/include/RtWvIn.h000066400000000000000000000103251233421753700153200ustar00rootroot00000000000000#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.2/include/RtWvOut.h000066400000000000000000000056271233421753700155320ustar00rootroot00000000000000#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.2/include/SKINImsg.h000066400000000000000000000105601233421753700155140ustar00rootroot00000000000000/*********************************************************/ /* 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.2/include/SKINItbl.h000066400000000000000000000207131233421753700155100ustar00rootroot00000000000000 #include "SKINImsg.h" 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.2/include/Sampler.h000066400000000000000000000040401233421753700155270ustar00rootroot00000000000000#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.2/include/Saxofony.h000066400000000000000000000116321233421753700157370ustar00rootroot00000000000000#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.2/include/SingWave.h000066400000000000000000000076331233421753700156620ustar00rootroot00000000000000#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.2/include/Socket.h000066400000000000000000000045551233421753700153670ustar00rootroot00000000000000#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.2/include/Sphere.h000066400000000000000000000044121233421753700153550ustar00rootroot00000000000000#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.2/include/StifKarp.h000066400000000000000000000103401233421753700156470ustar00rootroot00000000000000#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.2/include/TubeBell.h000066400000000000000000000065361233421753700156360ustar00rootroot00000000000000#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.2/include/VoicForm.h000066400000000000000000000111441233421753700156530ustar00rootroot00000000000000#ifndef STK_VOICFORM_H #define STK_VOICFORM_H #include "Instrmnt.h" #include "Envelope.h" #include "Noise.h" #include "SingWave.h" #include "FormSwep.h" #include "OnePole.h" #include "OneZero.h" namespace stk { /***************************************************/ /*! \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. */ /***************************************************/ class VoicForm : public Instrmnt { public: //! Class constructor. /*! An StkError will be thrown if the rawwave path is incorrectly set. */ VoicForm( void ); //! Class destructor. ~VoicForm( void ); //! Reset and clear all internal state. void clear( void ); //! Set instrument parameters for a particular frequency. void setFrequency( StkFloat frequency ); //! Set instrument parameters for the given phoneme. Returns false if phoneme not found. bool setPhoneme( const char* phoneme ); //! Set the voiced component gain. void setVoiced( StkFloat vGain ) { voiced_->setGainTarget(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 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; 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.2/projects/000077500000000000000000000000001233421753700141635ustar00rootroot00000000000000stk-4.5.2/projects/demo/000077500000000000000000000000001233421753700151075ustar00rootroot00000000000000stk-4.5.2/projects/demo/Banded000077500000000000000000000000551233421753700162120ustar00rootroot00000000000000wish < tcl/Banded.tcl | demo BandedWG -or -ipstk-4.5.2/projects/demo/Banded.bat000077500000000000000000000000551233421753700167570ustar00rootroot00000000000000wish < tcl/Banded.tcl | demo BandedWG -or -ipstk-4.5.2/projects/demo/Drums000077500000000000000000000000551233421753700161270ustar00rootroot00000000000000wish < tcl/Drums.tcl | ./demo Drummer -or -ipstk-4.5.2/projects/demo/Drums.bat000077500000000000000000000000531233421753700166720ustar00rootroot00000000000000wish < tcl/Drums.tcl | demo Drummer -or -ipstk-4.5.2/projects/demo/Makefile.in000066400000000000000000000051361233421753700171610ustar00rootroot00000000000000### 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.2/projects/demo/Md2Skini.cpp000066400000000000000000000154741233421753700172460ustar00rootroot00000000000000/***************************************************/ /* 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.2/projects/demo/Md2Skini.dsp000077500000000000000000000111251233421753700172420ustar00rootroot00000000000000# 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.2/projects/demo/Modal000077500000000000000000000000561233421753700160720ustar00rootroot00000000000000wish < tcl/Modal.tcl | ./demo ModalBar -or -ipstk-4.5.2/projects/demo/Modal.bat000077500000000000000000000000541233421753700166350ustar00rootroot00000000000000wish < tcl/Modal.tcl | demo ModalBar -or -ipstk-4.5.2/projects/demo/Physical000077500000000000000000000000611233421753700166060ustar00rootroot00000000000000wish < tcl/Physical.tcl | ./demo Clarinet -or -ipstk-4.5.2/projects/demo/Physical.bat000077500000000000000000000000571233421753700173600ustar00rootroot00000000000000wish < tcl/Physical.tcl | demo Clarinet -or -ipstk-4.5.2/projects/demo/Shakers000077500000000000000000000000571233421753700164370ustar00rootroot00000000000000wish < tcl/Shakers.tcl | ./demo Shakers -or -ipstk-4.5.2/projects/demo/Shakers.bat000077500000000000000000000000551233421753700172020ustar00rootroot00000000000000wish < tcl/Shakers.tcl | demo Shakers -or -ipstk-4.5.2/projects/demo/StkDemo000077500000000000000000000000561233421753700164040ustar00rootroot00000000000000wish < tcl/Demo.tcl | ./demo Clarinet -or -ip stk-4.5.2/projects/demo/StkDemo.bat000077500000000000000000000000541233421753700171470ustar00rootroot00000000000000wish < tcl/Demo.tcl | demo Clarinet -or -ip stk-4.5.2/projects/demo/Voice000077500000000000000000000000561233421753700161030ustar00rootroot00000000000000wish < tcl/Voice.tcl | ./demo FMVoices -or -ipstk-4.5.2/projects/demo/Voice.bat000077500000000000000000000000541233421753700166460ustar00rootroot00000000000000wish < tcl/Voice.tcl | demo FMVoices -or -ipstk-4.5.2/projects/demo/demo.cpp000066400000000000000000000223031233421753700165370ustar00rootroot00000000000000// 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.2/projects/demo/demo.dsw000077500000000000000000000013261233421753700165570ustar00rootroot00000000000000Microsoft 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.2/projects/demo/scores/000077500000000000000000000000001233421753700164055ustar00rootroot00000000000000stk-4.5.2/projects/demo/scores/README000066400000000000000000000007011233421753700172630ustar00rootroot00000000000000Suggested 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.2/projects/demo/scores/bachfugue.ski000066400000000000000000001522521233421753700210550ustar00rootroot00000000000000///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.2/projects/demo/scores/bookert.ski000066400000000000000000000070521233421753700205660ustar00rootroot00000000000000/* 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.2/projects/demo/scores/chords.ski000066400000000000000000000044711233421753700204050ustar00rootroot00000000000000/* 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.2/projects/demo/scores/doogie.ski000066400000000000000000000024241233421753700203650ustar00rootroot00000000000000/* 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.2/projects/demo/scores/drumfunk.ski000066400000000000000000000114351233421753700207540ustar00rootroot00000000000000/* 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.2/projects/demo/scores/drumtest.ski000066400000000000000000000035521233421753700207710ustar00rootroot00000000000000/* 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.2/projects/demo/scores/duelingb.ski000066400000000000000000000017251233421753700207130ustar00rootroot00000000000000/* 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.2/projects/demo/scores/fiddle.ski000066400000000000000000000106331233421753700203470ustar00rootroot00000000000000/* 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.2/projects/demo/scores/flutbach.ski000066400000000000000000000061551233421753700207140ustar00rootroot00000000000000/* 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.2/projects/demo/scores/funicula.ski000066400000000000000000000133321233421753700207250ustar00rootroot00000000000000NoteOn 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.2/projects/demo/scores/funskini.ski000066400000000000000000000063641233421753700207540ustar00rootroot00000000000000/* 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.2/projects/demo/scores/lacrymos.ski000066400000000000000000000025271233421753700207540ustar00rootroot00000000000000/* 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.2/projects/demo/scores/mandtune.ski000066400000000000000000000027231233421753700207340ustar00rootroot00000000000000/* 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.2/projects/demo/scores/marimba2.ski000066400000000000000000000071101233421753700206060ustar00rootroot00000000000000/* 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.2/projects/demo/scores/marimtst.ski000066400000000000000000000033331233421753700207570ustar00rootroot00000000000000/* 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.2/projects/demo/scores/misacrio.ski000066400000000000000000000044721233421753700207320ustar00rootroot00000000000000/* 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.2/projects/demo/scores/morazbel.ski000066400000000000000000000065211233421753700207340ustar00rootroot00000000000000/* 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.2/projects/demo/scores/muneira.ski000066400000000000000000017317141233421753700205730ustar00rootroot00000000000000/* 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.2/projects/demo/scores/organs.ski000066400000000000000000000161431233421753700204130ustar00rootroot00000000000000/* 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.2/projects/demo/scores/pickdamp.ski000066400000000000000000000052261233421753700207120ustar00rootroot00000000000000/* 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.2/projects/demo/scores/pictures.ski000066400000000000000000000023131233421753700207520ustar00rootroot00000000000000/* 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.2/projects/demo/scores/riderson.ski000066400000000000000000000047631233421753700207540ustar00rootroot00000000000000/* 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.2/projects/demo/scores/scales.ski000066400000000000000000000037061233421753700203750ustar00rootroot00000000000000/* 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.2/projects/demo/scores/shaktest.ski000066400000000000000000000036341233421753700207510ustar00rootroot00000000000000/* 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.2/projects/demo/scores/simplgft.ski000066400000000000000000000035731233421753700207520ustar00rootroot00000000000000/* 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.2/projects/demo/scores/spain.ski000066400000000000000000000016561233421753700202370ustar00rootroot00000000000000/* 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.2/projects/demo/scores/streetsf.ski000066400000000000000000000043511233421753700207570ustar00rootroot00000000000000/* 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.2/projects/demo/scores/test.ski000066400000000000000000000001601233421753700200710ustar00rootroot00000000000000/* Howdy!! SKINI File, Perry Cook */ NoteOn 0.2 1 60 127.000000 NoteOff 0.6 1 60 63.500000 stk-4.5.2/projects/demo/scores/thecars.ski000066400000000000000000000030201233421753700205410ustar00rootroot00000000000000/* 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.2/projects/demo/scores/tubebell.ski000066400000000000000000000014161233421753700207150ustar00rootroot00000000000000/* 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.2/projects/demo/scores/vocaliz.ski000066400000000000000000000141471233421753700205730ustar00rootroot00000000000000/* 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.2/projects/demo/tcl/000077500000000000000000000000001233421753700156715ustar00rootroot00000000000000stk-4.5.2/projects/demo/tcl/Banded.tcl000066400000000000000000000127561233421753700175650ustar00rootroot00000000000000# 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.2/projects/demo/tcl/Demo.tcl000066400000000000000000001057151233421753700172720ustar00rootroot00000000000000# 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.2/projects/demo/tcl/Drums.tcl000066400000000000000000000070501233421753700174710ustar00rootroot00000000000000# 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.2/projects/demo/tcl/Modal.tcl000066400000000000000000000147631233421753700174440ustar00rootroot00000000000000set 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.2/projects/demo/tcl/Physical.tcl000066400000000000000000000372731233421753700201650ustar00rootroot00000000000000# 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.2/projects/demo/tcl/Shakers.tcl000066400000000000000000000205261233421753700200020ustar00rootroot00000000000000# 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.2/projects/demo/tcl/Voice.tcl000066400000000000000000000120471233421753700174460ustar00rootroot00000000000000# 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.2/projects/demo/tcl/bitmaps/000077500000000000000000000000001233421753700173305ustar00rootroot00000000000000stk-4.5.2/projects/demo/tcl/bitmaps/KFMod.xbm000066400000000000000000000214031233421753700210000ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/KFiddl.xbm000066400000000000000000000214061233421753700212000ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/KFloot.xbm000066400000000000000000000214061233421753700212410ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/KHose.xbm000066400000000000000000000214031233421753700210510ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/KModal.xbm000066400000000000000000000214061233421753700212120ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/KPluk.xbm000066400000000000000000000214031233421753700210660ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/KVoicForm.xbm000066400000000000000000000214171233421753700217040ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/KVoiceFM.xbm000066400000000000000000000214141233421753700214450ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/Klar.xbm000066400000000000000000000214001233421753700207260ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/bamboo.xbm000066400000000000000000000245121233421753700213030ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/cabasa.xbm000066400000000000000000000245121233421753700212560ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/cokecan.xbm000066400000000000000000000122141233421753700214430ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/guiro.xbm000066400000000000000000000245071233421753700211750ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/kasm.xbm000066400000000000000000000214001233421753700207700ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/maraca.xbm000066400000000000000000000245121233421753700212700ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/phism.xbm000066400000000000000000000152731233421753700211700ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/prc.xbm000066400000000000000000000167421233421753700206360ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/prcFunny.xbm000066400000000000000000000106061233421753700216470ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/rachet.xbm000066400000000000000000000245121233421753700213120ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/sleighbell.xbm000066400000000000000000000245261233421753700221630ustar00rootroot00000000000000#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.2/projects/demo/tcl/bitmaps/tambourine.xbm000066400000000000000000000245261233421753700222160ustar00rootroot00000000000000#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.2/projects/demo/utilities.cpp000066400000000000000000000226751233421753700176420ustar00rootroot00000000000000// 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.2/projects/demo/utilities.h000066400000000000000000000007601233421753700172760ustar00rootroot00000000000000// 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.2/projects/effects/000077500000000000000000000000001233421753700156025ustar00rootroot00000000000000stk-4.5.2/projects/effects/Makefile.in000066400000000000000000000033471233421753700176560ustar00rootroot00000000000000### 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.2/projects/effects/README-effects.txt000066400000000000000000000017751233421753700207270ustar00rootroot00000000000000The 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.2/projects/effects/StkEffects000077500000000000000000000000471233421753700175720ustar00rootroot00000000000000wish < tcl/Effects.tcl | ./effects -ip stk-4.5.2/projects/effects/StkEffects.bat000077500000000000000000000000451233421753700203350ustar00rootroot00000000000000wish < tcl/Effects.tcl | effects -ip stk-4.5.2/projects/effects/effects.cpp000066400000000000000000000207011233421753700177250ustar00rootroot00000000000000/************** 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.2/projects/effects/effects.dsw000066400000000000000000000010311233421753700177330ustar00rootroot00000000000000Microsoft 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.2/projects/effects/tcl/000077500000000000000000000000001233421753700163645ustar00rootroot00000000000000stk-4.5.2/projects/effects/tcl/Effects.tcl000066400000000000000000000224171233421753700204550ustar00rootroot00000000000000set 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.2/projects/eguitar/000077500000000000000000000000001233421753700156235ustar00rootroot00000000000000stk-4.5.2/projects/eguitar/ElectricGuitar000077500000000000000000000000531233421753700204550ustar00rootroot00000000000000wish < tcl/Eguitar.tcl | ./eguitar -or -ip stk-4.5.2/projects/eguitar/ElectricGuitar.bat000077500000000000000000000000511233421753700212200ustar00rootroot00000000000000wish < tcl/EGuitar.tcl | eguitar -or -ip stk-4.5.2/projects/eguitar/Makefile.in000066400000000000000000000035171233421753700176760ustar00rootroot00000000000000### 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.2/projects/eguitar/README-eguitar.txt000066400000000000000000000035421233421753700207630ustar00rootroot00000000000000This 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.2/projects/eguitar/eguitar.cpp000066400000000000000000000274751233421753700200060ustar00rootroot00000000000000// 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.2/projects/eguitar/eguitar.dsp000066400000000000000000000164111233421753700177760ustar00rootroot00000000000000# 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.2/projects/eguitar/eguitar.dsw000066400000000000000000000010311233421753700177750ustar00rootroot00000000000000Microsoft 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.2/projects/eguitar/scores/000077500000000000000000000000001233421753700171215ustar00rootroot00000000000000stk-4.5.2/projects/eguitar/scores/test.ski000066400000000000000000000016071233421753700206140ustar00rootroot00000000000000/* 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.2/projects/eguitar/tcl/000077500000000000000000000000001233421753700164055ustar00rootroot00000000000000stk-4.5.2/projects/eguitar/tcl/EGuitar.tcl000066400000000000000000000201561233421753700204550ustar00rootroot00000000000000# 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.2/projects/eguitar/utilities.cpp000066400000000000000000000130601233421753700203420ustar00rootroot00000000000000// 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.2/projects/eguitar/utilities.h000066400000000000000000000004651233421753700200140ustar00rootroot00000000000000// 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.2/projects/examples/000077500000000000000000000000001233421753700160015ustar00rootroot00000000000000stk-4.5.2/projects/examples/Makefile.in000066400000000000000000000145141233421753700200530ustar00rootroot00000000000000### 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.2/projects/examples/audioprobe.cpp000066400000000000000000000057171233421753700206500ustar00rootroot00000000000000/******************************************/ /* 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.2/projects/examples/bethree.cpp000066400000000000000000000047641233421753700201360ustar00rootroot00000000000000// 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.2/projects/examples/bethree.dsp000077500000000000000000000146061233421753700201410ustar00rootroot00000000000000# 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.2/projects/examples/controlbee.cpp000066400000000000000000000106501233421753700206430ustar00rootroot00000000000000// 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.2/projects/examples/controlbee.dsp000077500000000000000000000157601233421753700206610ustar00rootroot00000000000000# 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.2/projects/examples/crtsine.cpp000066400000000000000000000032771233421753700201650ustar00rootroot00000000000000// 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.2/projects/examples/crtsine.dsp000077500000000000000000000112211233421753700201600ustar00rootroot00000000000000# 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.2/projects/examples/duplex.cpp000066400000000000000000000075641233421753700200220ustar00rootroot00000000000000/******************************************/ /* 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.2/projects/examples/duplex.dsp000077500000000000000000000130621233421753700200170ustar00rootroot00000000000000# 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.2/projects/examples/examples.dsw000077500000000000000000000070131233421753700203420ustar00rootroot00000000000000Microsoft 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.2/projects/examples/foursine.cpp000066400000000000000000000016361233421753700203450ustar00rootroot00000000000000// 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.2/projects/examples/foursine.dsp000077500000000000000000000120501233421753700203440ustar00rootroot00000000000000# 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.2/projects/examples/grains.cpp000066400000000000000000000065071233421753700200000ustar00rootroot00000000000000// 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.2/projects/examples/grains.dsp000077500000000000000000000117551233421753700200100ustar00rootroot00000000000000# 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.2/projects/examples/inetIn.cpp000066400000000000000000000046331233421753700177410ustar00rootroot00000000000000/******************************************/ /* 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.2/projects/examples/inetIn.dsp000077500000000000000000000125521233421753700177470ustar00rootroot00000000000000# 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.2/projects/examples/inetOut.cpp000066400000000000000000000044301233421753700201350ustar00rootroot00000000000000/******************************************/ /* 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.2/projects/examples/inetOut.dsp000077500000000000000000000122261233421753700201460ustar00rootroot00000000000000# 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.2/projects/examples/libMakefile.in000066400000000000000000000051041233421753700205350ustar00rootroot00000000000000### 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.2/projects/examples/midifiles/000077500000000000000000000000001233421753700177465ustar00rootroot00000000000000stk-4.5.2/projects/examples/midifiles/bwv772.mid000066400000000000000000000107311233421753700215010ustar00rootroot00000000000000MThd€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.2/projects/examples/midifiles/jesu.mid000066400000000000000000000422031233421753700214100ustar00rootroot00000000000000MThd à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.2/projects/examples/midifiles/tango.mid000066400000000000000000000277621233421753700215670ustar00rootroot00000000000000MThd€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.2/projects/examples/midiprobe.cpp000066400000000000000000000027001233421753700204560ustar00rootroot00000000000000// 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.2/projects/examples/midiprobe.dsp000077500000000000000000000105351233421753700204720ustar00rootroot00000000000000# 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.2/projects/examples/play.cpp000066400000000000000000000067721233421753700174660ustar00rootroot00000000000000/******************************************/ /* 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.2/projects/examples/play.dsp000077500000000000000000000112261233421753700174630ustar00rootroot00000000000000# 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.2/projects/examples/playsmf.cpp000066400000000000000000000063371233421753700201710ustar00rootroot00000000000000// 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.2/projects/examples/playsmf.dsp000077500000000000000000000112251233421753700201700ustar00rootroot00000000000000# 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.2/projects/examples/rawwaves/000077500000000000000000000000001233421753700176405ustar00rootroot00000000000000stk-4.5.2/projects/examples/rawwaves/sinewave.raw000066400000000000000000000010001233421753700221630ustar00rootroot00000000000000$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.2/projects/examples/record.dsp000077500000000000000000000121471233421753700177770ustar00rootroot00000000000000# 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.2/projects/examples/rtsine.cpp000066400000000000000000000016261233421753700200160ustar00rootroot00000000000000// 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.2/projects/examples/rtsine.dsp000077500000000000000000000117101233421753700200200ustar00rootroot00000000000000# 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.2/projects/examples/scores/000077500000000000000000000000001233421753700172775ustar00rootroot00000000000000stk-4.5.2/projects/examples/scores/bachfugue.ski000066400000000000000000001522521233421753700217470ustar00rootroot00000000000000///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.2/projects/examples/scores/bookert.ski000066400000000000000000000070351233421753700214610ustar00rootroot00000000000000/* 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.2/projects/examples/simple.tcl000066400000000000000000000041371233421753700200030ustar00rootroot00000000000000# 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.2/projects/examples/sine.cpp000066400000000000000000000044541233421753700174520ustar00rootroot00000000000000/******************************************/ /* 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.2/projects/examples/sineosc.cpp000066400000000000000000000017301233421753700201510ustar00rootroot00000000000000// 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.2/projects/examples/threebees.cpp000066400000000000000000000106201233421753700204520ustar00rootroot00000000000000// 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.2/projects/examples/threebees.dsp000077500000000000000000000161211233421753700204630ustar00rootroot00000000000000# 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.2/projects/ragamatic/000077500000000000000000000000001233421753700161135ustar00rootroot00000000000000stk-4.5.2/projects/ragamatic/Drone.cpp000066400000000000000000000041131233421753700176650ustar00rootroot00000000000000/***************************************************/ /*! \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.2/projects/ragamatic/Drone.h000066400000000000000000000062671233421753700173460ustar00rootroot00000000000000#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 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.2/projects/ragamatic/Raga000077500000000000000000000000441233421753700167110ustar00rootroot00000000000000wish < tcl/Raga.tcl | ./ragamat -ip stk-4.5.2/projects/ragamatic/Raga.bat000077500000000000000000000000421233421753700174540ustar00rootroot00000000000000wish < tcl/Raga.tcl | ragamat -ip stk-4.5.2/projects/ragamatic/Tabla.cpp000066400000000000000000000066441233421753700176540ustar00rootroot00000000000000/***************************************************/ /*! \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; i 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 #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.2/projects/ragamatic/ragamatic.dsw000066400000000000000000000010331233421753700205570ustar00rootroot00000000000000Microsoft 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.2/projects/ragamatic/rawwaves/000077500000000000000000000000001233421753700177525ustar00rootroot00000000000000stk-4.5.2/projects/ragamatic/rawwaves/DrDoi1.raw000066400000000000000000000464501233421753700215600ustar00rootroot000000000000000ÿ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.2/projects/ragamatic/rawwaves/DrDoi2.raw000066400000000000000000000464501233421753700215610ustar00rootroot00000000000000;{þ›û$ý‰ÑýØÿ€>Ýü(ÿ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.2/projects/ragamatic/rawwaves/DrTak1.raw000066400000000000000000000231001233421753700215470ustar00rootroot00000000000000øØøŒùùéù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.2/projects/ragamatic/rawwaves/DrTak2.raw000066400000000000000000000231001233421753700215500ustar00rootroot00000000000000úÄ[ö€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.2/projects/ragamatic/rawwaves/Drdak2.raw000066400000000000000000000046061233421753700216020ustar00rootroot00000000000000ùœû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.2/projects/ragamatic/rawwaves/Drdak3.raw000066400000000000000000000111421233421753700215740ustar00rootroot00000000000000ÿÿí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.2/projects/ragamatic/rawwaves/Drdak4.raw000066400000000000000000000073061233421753700216040ustar00rootroot00000000000000ïãò^ô²õú÷‡ùøü}û¥ùù™ý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.2/projects/ragamatic/rawwaves/Drddak1.raw000066400000000000000000000122561233421753700217450ustar00rootroot00000000000000õ ö‚ø@û~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.2/projects/ragamatic/rawwaves/Drdee1.raw000066400000000000000000000220321233421753700215700ustar00rootroot00000000000000ü…û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.2/projects/ragamatic/rawwaves/Drdee2.raw000066400000000000000000000221561233421753700216000ustar00rootroot00000000000000ù|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.2/projects/ragamatic/rawwaves/Drdoo1.raw000066400000000000000000000037421233421753700216230ustar00rootroot00000000000000ü~ þ*½æ=ú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.2/projects/ragamatic/rawwaves/Drdoo2.raw000066400000000000000000000053261233421753700216240ustar00rootroot00000000000000ù§ýßÄþÆ}ò.à· ‰Ò ?Ôܺ·áÞ$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.2/projects/ragamatic/rawwaves/Drdoo3.raw000066400000000000000000000162161233421753700216250ustar00rootroot00000000000000¤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.2/projects/ragamatic/rawwaves/Drjun1.raw000066400000000000000000000106721233421753700216360ustar00rootroot00000000000000ß·]ÿ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.2/projects/ragamatic/rawwaves/Drjun2.raw000066400000000000000000000112661233421753700216370ustar00rootroot00000000000000û(üšýüŸûìý‡ÿİØ•ÿùþøýÍý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.2/projects/ragamatic/rawwaves/bee1.raw000066400000000000000000000101401233421753700212750ustar00rootroot00000000000000ý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.2/projects/ragamatic/rawwaves/dee1.raw000066400000000000000000000110521233421753700213020ustar00rootroot00000000000000ý)ý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.2/projects/ragamatic/rawwaves/dee2.raw000066400000000000000000000211401233421753700213020ustar00rootroot00000000000000þ_þ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.2/projects/ragamatic/rawwaves/din1.raw000066400000000000000000000071061233421753700213240ustar00rootroot00000000000000_ÿŒÿ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.2/projects/ragamatic/rawwaves/gun1.raw000066400000000000000000000100701233421753700213350ustar00rootroot00000000000000ý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.2/projects/ragamatic/rawwaves/jun1.raw000066400000000000000000000346701233421753700213540ustar00rootroot00000000000000ÿ`þÊþÙþ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.2/projects/ragamatic/rawwaves/jun2.raw000066400000000000000000000130161233421753700213440ustar00rootroot00000000000000 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.2/projects/ragamatic/rawwaves/tak1.raw000066400000000000000000000113201233421753700213220ustar00rootroot00000000000000Á^±Ö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.2/projects/ragamatic/rawwaves/tak2.raw000066400000000000000000000076221233421753700213350ustar00rootroot00000000000000þ¶ÿù¬…ë§< à 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.2/projects/ragamatic/rawwaves/tak3.raw000066400000000000000000000164601233421753700213360ustar00rootroot00000000000000ö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.2/projects/ragamatic/rawwaves/tak4.raw000066400000000000000000000167261233421753700213440ustar00rootroot00000000000000fyEùÓš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.2/projects/ragamatic/tcl/000077500000000000000000000000001233421753700166755ustar00rootroot00000000000000stk-4.5.2/projects/ragamatic/tcl/Raga.tcl000066400000000000000000000162221233421753700202560ustar00rootroot00000000000000# Tcl/Tk GUI for the RagaMatic # by Perry R. Cook # Set initial control values set cont1 10.0 set cont2 7.0 set cont4 0.0 set cont11 10.0 set cont7 3.0 # Configure main window wm title . "STK RagaMatic Controller" wm iconname . "raga" . config -bg grey20 # Configure bitmap display if {[file isdirectory bitmaps]} { set bitmappath bitmaps } else { set bitmappath tcl/bitmaps } frame .banner -bg black button .banner.top -bitmap @$bitmappath/ragamat2.xbm \ -background white -foreground black frame .banner.bottom -bg black label .banner.bottom.ragamat -text " * * RagaMatic * *\n\n \ by Perry R. Cook\n for Ken's Birthday\n \ January, 1999\n\n (thanks also to\n \ Brad for rough\n riff inspirations)" \ -background black -foreground white -relief groove \ -width 20 -height 10 # Bind an X windows "close" event with the Exit routine bind . +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.2/projects/ragamatic/tcl/bitmaps/000077500000000000000000000000001233421753700203345ustar00rootroot00000000000000stk-4.5.2/projects/ragamatic/tcl/bitmaps/prc.xbm000066400000000000000000000165751233421753700216460ustar00rootroot00000000000000#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.2/projects/ragamatic/tcl/bitmaps/prcFunny.xbm000066400000000000000000000105121233421753700226470ustar00rootroot00000000000000#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.2/projects/ragamatic/tcl/bitmaps/ragamat.bmp000066400000000000000000002627161233421753700224660ustar00rootroot00000000000000BMÎe6("6˜a„„€€€€€€€€€€€€@€€@@ÿ€€@ÿ@@€ÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿÿ€ÿ€€€ÿ@€ÿÀÜÀðʦ)„9Þ„ZµœcÞ­ŒÎ¥sÖB)Zk)œ„k”œŒ¥„9­„RœkZsZ)k­9Î{”ÞZÿΌޜs¥„9”ÎsÞœJ¥¥¥k1kB)B)!)„R{µŒ­Z)J9!ZBBZîÍÅ1sZRµZ9”B!ÆŒsÎsJ„)ç”kœŒ„ç„R­J÷¥{Þ¥„÷µŒÖÎÆJB9J9 ZJ)œ„R1)½½µ­­Z„„s{{ZssBœ­c‹œR­½{¥µsµÆ„Z{)s{kRk99B1‹´j„µ{JŒB9­1Bç9JRJ 1 JÖRJ­R{΄”ZÞk{R!R{Z9bA¥!c)R½k”´œ!{9R¥k”9­JZÖ„!ÖkRŒk{œ‹)Rµ„µÖÆ”Z!{Z!½„Zœ„¤½´!91!RB!¥{!cR)„{{ÎÆ..çÿÿÍÕÕ1ÎÎRÆÆs„„Abb9µÆ½÷ÿ9s{)ckƒæö)RZ¾èð)s„ÕöÿZ{„bÍîRÎ÷9ƒœ9”µ)AJ )sµÎ1ÆÿA¬Õ{Ïè9µïÖçï{Œ”9JRRµç9œÎZ¥Î1¥ç{´µÞ÷R”½)9R„¥Z‹Ab¶ÎלµÆ ƒÍsµç9{­”ÿJ¥ï‹ÿ1kœ{ÞZckb¬î1„Ö{ö{”­1b!R„ÅÕæ­½Î {Þ)kµZ­B{)Z”bÍkŒµRŒÖ9Rs1RJ­bæBœJ”¥Æ÷ AsJZsAj¬JÆ1kÎ)s Z1‹1Z­k{œ11­B1Æ)J´1JœRcœ!œk{½„”ÏZs眤Í s9RÖRc½‹k{ï!)k)1œ19ÖRRïÖÖïkkÞŒŒÎæææÇÇǨ¨¨‰‰‰jjj                                                                                                                                                                                                                         ÎÔ¸¯ÂÉÉÐ          ׺Ö˺̶ëÄ         ªÔËËϾ™É_É«·Ä³Ö¾ß­      ÇËËÜ´´É­îУïÎ;     ÜھǾÎ È ¶³³­àòŸ         àÏÎÝ´ºØ û u­¢º        ×ÌÛÝÇ´ ý·X’'쟾ºu‹ÇîÚ•ÿ‘©‘•‘'       ޠ躾Π Ø·šªÄŸ±×Ÿu·Ç‰š&©â‘‘œœâS      ××Û´ÌÒݱ™ý§âš™µÚÄýµÄÒÚ•œ•â•ý     ̾××´Ç …ÈÚ°È—±ÐÉßųÚÄš‰•œœœ       µÔ¾Î¾Í ÉØ ¶¶•´…ÓãX•ý룖ÿþ_‘•’       ÇÇ ةҶû—ýýŸß¢É ©ï–П©&      ÍÙ …¹¢Èȯ­ ²îî ôý©œš       µ´ßµÉ¶ÉÈå'³¢–ÄýÞ³}˜ÿŽ        ÇàÓÅß…“·Þ£ÈØ`£}¹ã¢¢…îµXšý¡œ        ͪßååȶÉããÉûØ•”¶·–¢ØýîÍÙÄ–7         ÙÚãß²¶…Ɇu‹È‘î “&¢…ý¥Å¢Ò©•;        ͵µÙÓ™£É å}°³‰£ì°åý¦“ï~î–†g      ´ÅßôôØÉ·¬åÄû¶€‡³ÄØÅ­…Äåî•’²g           ÙÍßÓµý­¹øßÚû›—Óý³€ôå­ø·¢ãý•a’       µÇ²ÞÓ¶ü™åÒüɰ墨©Û߇¶¶²XŠÄ¡g’@           ´ÅÙÓ¡š™É¨à’¨¶°Åî¶£u͘ɶãå³}š¢Àg        ÍÍ×ÒÅÇÅÓ×Ú¨ ŽµµºÈɦÓɪ¢²ÄÐ'¡@a         Ù×ÅÇŵŵôå”¶¶ÐÙ£}›Í¢ØÉ—ßıӕœ©gg‡        ÙßµÙµµßÞÙß¹·É“ßɦ™Íî™ßÓÄ‹ØÓÙ•ýxº™£Ð£}ø·¨                           '˜˜Ò˜&˜Ä ”ˆ~’°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††ãå| ÀÒÚÇ–šÙ 4%ƒ“\ÿI÷þòBñ ñÃðäîãíúñøâü ¨ý#.k= óýKð'ç£â`ânè¢ðCö­üTÿOÿн»ý¸ ° ü]0 ÿ0óCííóhü[‹$–=РжŒú= Î^“ýúû%ûPùš M B kÿ…(stk-4.5.2/rawwaves/bassdrum.raw000066400000000000000000000103001233421753700165160ustar00rootroot00000000000000(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.2/rawwaves/britestk.raw000066400000000000000000000100001233421753700165220ustar00rootroot00000000000000bô;ÿ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.2/rawwaves/cowbell1.raw000066400000000000000000000144461233421753700164250ustar00rootroot00000000000000u í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.2/rawwaves/crashcym.raw000066400000000000000000001175101233421753700165220ustar00rootroot00000000000000@<<>;;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.2/rawwaves/dope.raw000066400000000000000000000500001233421753700156260ustar00rootroot00000000000000 "'#$!)ÿúÿöÿðÿóÿóÿàÿÍÿÕÿÜÿÖÿÖÿÇÿÂÿ¹ÿ¸ÿÆ&þþýÌý’úîù‚û"ùŸøãø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.2/rawwaves/eee.raw000066400000000000000000000002701233421753700154410ustar00rootroot00000000000000þ1ê)@&=QÁ#=•M½ ¦ > Ã%ÊÿpúÉú3÷¢ôùôNñÃî‚î$îÎíCê]éìKëÃæ!ë!ôîÃê÷öý‹ôû¾ AØþ¿F ª}LÑcÝPÍ]†ž¶ ­Êiüøüëø2êÖæmëårÜ´áá£ÕÕvâ6Þ£Ô×ÜÚã~Þ£ãçì±ësëÃóÕû/ýƒþwþ1stk-4.5.2/rawwaves/fwavblnk.raw000066400000000000000000000010001233421753700165050ustar00rootroot00000000000000G ‹Çø%'+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.2/rawwaves/impuls10.raw000066400000000000000000000010001233421753700163450ustar00rootroot00000000000000þ~„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.2/rawwaves/impuls20.raw000066400000000000000000000010001233421753700163460ustar00rootroot00000000000000þ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.2/rawwaves/impuls40.raw000066400000000000000000000010001233421753700163500ustar00rootroot00000000000000þ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.2/rawwaves/makefunc.c000066400000000000000000000026271233421753700161350ustar00rootroot00000000000000/**********************************************/ /** 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.2/rawwaves/makemidi.c000066400000000000000000000016041233421753700161160ustar00rootroot00000000000000/**********************************************/ /** 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.2/rawwaves/makewavs.c000066400000000000000000000056441233421753700161640ustar00rootroot00000000000000/**********************************************/ /** 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.2/rawwaves/mand11.raw000066400000000000000000000040001233421753700157570ustar00rootroot00000000000000ÿ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.2/rawwaves/mand12.raw000066400000000000000000000040001233421753700157600ustar00rootroot00000000000000æü¹øãúõ¥ó´ûƒ’æ ÂÌÿúÿÞþÅû‚"¯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.2/rawwaves/mand2.raw000066400000000000000000000040001233421753700156770ustar00rootroot00000000000000ÿ¿ü³ø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.2/rawwaves/mand3.raw000066400000000000000000000040001233421753700157000ustar00rootroot00000000000000ÿ\ýüþ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.2/rawwaves/mand4.raw000066400000000000000000000040001233421753700157010ustar00rootroot00000000000000ÿ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.2/rawwaves/mand5.raw000066400000000000000000000040001233421753700157020ustar00rootroot00000000000000ø«õ‡õð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.2/rawwaves/mand6.raw000066400000000000000000000040001233421753700157030ustar00rootroot00000000000000ø{íÇæüâ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.2/rawwaves/mand7.raw000066400000000000000000000040001233421753700157040ustar00rootroot00000000000000ÿéþ«ýüÛýþ²ÿó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.2/rawwaves/mand8.raw000066400000000000000000000040001233421753700157050ustar00rootroot00000000000000ÿÜÿþ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.2/rawwaves/mand9.raw000066400000000000000000000040001233421753700157060ustar00rootroot00000000000000(ý®ùëú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.2/rawwaves/mandpluk.raw000066400000000000000000000213041233421753700165170ustar00rootroot00000000000000 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.2/rawwaves/marmstk1.raw000066400000000000000000000010001233421753700164320ustar00rootroot00000000000000ÿ û- –ãý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.2/rawwaves/ooo.raw000066400000000000000000000002701233421753700154770ustar00rootroot00000000000000ÿaÜÿ.üdýý³üûÌû;úµûÊý;ü[úù/úÿü[ù÷öÕ÷TöÓíèáIÝKä£êBå<åAú«D rÝ,7'Mé=÷!ß ý Íqæü‹óö—îzÛ£ÑÔÑoÓqÕ£Õ…Ø.âÇíCðñöjúÛýÙòÕ: ­ þþSM-ÿ…øtùäý€ùñäò;ö€öòáóÛùÃþ/ý›ý;’stk-4.5.2/rawwaves/peksblnk.raw000066400000000000000000000010001233421753700165040ustar00rootroot00000000000000'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.2/rawwaves/ppksblnk.raw000066400000000000000000000010001233421753700165170ustar00rootroot00000000000000'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.2/rawwaves/ridecymb.raw000066400000000000000000000772121233421753700165130ustar00rootroot00000000000000ÿÿÿ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.2/rawwaves/silence.raw000066400000000000000000000007001233421753700163230ustar00rootroot00000000000000stk-4.5.2/rawwaves/sine.c000066400000000000000000000006561233421753700153020ustar00rootroot00000000000000// 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.2/rawwaves/snglpeak.raw000066400000000000000000000010001233421753700164770ustar00rootroot00000000000000 '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.2/rawwaves/tambourn.raw000066400000000000000000000220301233421753700165300ustar00rootroot00000000000000/ù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.2/rawwaves/tomhidrm.raw000066400000000000000000000657721233421753700165500ustar00rootroot00000000000000ÿ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.2/rawwaves/tomlowdr.raw000066400000000000000000001144401233421753700165570ustar00rootroot00000000000000ÿ–ÿ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.2/rawwaves/tommiddr.raw000066400000000000000000000672041233421753700165340ustar00rootroot00000000000000êÀ¤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.2/rawwaves/twopeaks.raw000066400000000000000000000010001233421753700165300ustar00rootroot00000000000000 '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.2/src/000077500000000000000000000000001233421753700131215ustar00rootroot00000000000000stk-4.5.2/src/ADSR.cpp000066400000000000000000000103561233421753700143630ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Asymp.cpp000066400000000000000000000051471233421753700147250ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/BandedWG.cpp000066400000000000000000000227321233421753700152460ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" #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.2/src/BeeThree.cpp000066400000000000000000000040561233421753700153150ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/BiQuad.cpp000066400000000000000000000053341233421753700147770ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Blit.cpp000066400000000000000000000040551233421753700145230ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/BlitSaw.cpp000066400000000000000000000052721233421753700152000ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/BlitSquare.cpp000066400000000000000000000060151233421753700157020ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/BlowBotl.cpp000066400000000000000000000057341233421753700153620ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/BlowHole.cpp000066400000000000000000000150541233421753700153450ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" #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.2/src/Bowed.cpp000066400000000000000000000123751233421753700146750ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/Brass.cpp000066400000000000000000000100361233421753700146770ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" #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.2/src/Chorus.cpp000066400000000000000000000026141233421753700150730ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Clarinet.cpp000066400000000000000000000073261233421753700153760ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/Delay.cpp000066400000000000000000000052501233421753700146650ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/DelayL.cpp000066400000000000000000000053311233421753700150010ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Drummer.cpp000066400000000000000000000102251233421753700152400ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Envelope.cpp000066400000000000000000000033751233421753700154120ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/FM.cpp000066400000000000000000000104421233421753700141300ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/FMVoices.cpp000066400000000000000000000105441233421753700153040ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" #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.2/src/FileLoop.cpp000066400000000000000000000142541233421753700153440ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Fir.cpp000066400000000000000000000035171233421753700143530ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Flute.cpp000066400000000000000000000106621233421753700147110ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/FormSwep.cpp000066400000000000000000000071001233421753700153650ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/FreeVerb.cpp000066400000000000000000000141501233421753700153260ustar00rootroot00000000000000/***********************************************************************/ /*! \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.2/src/Guitar.cpp000066400000000000000000000166561233421753700150760ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" #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.2/src/HevyMetl.cpp000066400000000000000000000040051233421753700153610ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Iir.cpp000066400000000000000000000066471233421753700143650ustar00rootroot00000000000000/***************************************************/ /*! \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 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.2/src/JCRev.cpp000066400000000000000000000075151233421753700146060ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Mesh2D.cpp000066400000000000000000000216071233421753700147150ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/Messager.cpp000066400000000000000000000313471233421753700154030ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/MidiFileIn.cpp000066400000000000000000000271471233421753700156110ustar00rootroot00000000000000/**********************************************************************/ /*! \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.2/src/Modal.cpp000066400000000000000000000101231233421753700146560ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/ModalBar.cpp000066400000000000000000000126411233421753700153120ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" #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.2/src/Modulate.cpp000066400000000000000000000020671233421753700154040ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Moog.cpp000066400000000000000000000062751233421753700145400ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/Mutex.cpp000066400000000000000000000040341233421753700147300ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/NRev.cpp000066400000000000000000000067261233421753700145120ustar00rootroot00000000000000/***************************************************/ /*! \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; i 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.2/src/OnePole.cpp000066400000000000000000000026301233421753700151670ustar00rootroot00000000000000/***************************************************/ /*! \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. */ /***************************************************/ #include "OnePole.h" namespace stk { OnePole :: OnePole( StkFloat thePole ) { b_.resize( 1 ); a_.resize( 2 ); a_[0] = 1.0; inputs_.resize( 1, 1, 0.0 ); outputs_.resize( 2, 1, 0.0 ); this->setPole( 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.2/src/OneZero.cpp000066400000000000000000000020131233421753700152020ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/PRCRev.cpp000066400000000000000000000065441233421753700147370ustar00rootroot00000000000000/***************************************************/ /*! \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; 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. */ /***************************************************/ #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.2/src/Phonemes.cpp000066400000000000000000000201241233421753700154020ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/PitShift.cpp000066400000000000000000000042461233421753700153650ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/PoleZero.cpp000066400000000000000000000033401233421753700153640ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Resonate.cpp000066400000000000000000000060721233421753700154120ustar00rootroot00000000000000/***************************************************/ /*! \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. */ /***************************************************/ #include "Resonate.h" #include "SKINImsg.h" namespace stk { Resonate :: Resonate( void ) { poleFrequency_ = 4000.0; poleRadius_ = 0.95; // Set the filter parameters. filter_.setResonance( poleFrequency_, poleRadius_, true ); zeroFrequency_ = 0.0; zeroRadius_ = 0.0; } Resonate :: ~Resonate( void ) { } void Resonate :: noteOn( StkFloat frequency, StkFloat amplitude ) { adsr_.setTarget( amplitude ); this->keyOn(); 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.2/src/Rhodey.cpp000066400000000000000000000045571233421753700150720ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/RtAudio.cpp000066400000000000000000013112571233421753700152060ustar00rootroot00000000000000/************************************************************************/ /*! \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.2/src/RtWvIn.cpp000066400000000000000000000133351233421753700150230ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Saxofony.cpp000066400000000000000000000120661233421753700154400ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/Shakers.cpp000066400000000000000000000656141233421753700152410ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/Simple.cpp000066400000000000000000000050621233421753700150610ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" 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.2/src/SineWave.cpp000066400000000000000000000035301233421753700153470ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/SingWave.cpp000066400000000000000000000025141233421753700153520ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Sitar.cpp000066400000000000000000000043121233421753700147070ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Skini.cpp000066400000000000000000000135601233421753700147070ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINItbl.h" #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.2/src/Socket.cpp000066400000000000000000000031441233421753700150570ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Sphere.cpp000066400000000000000000000024361233421753700150600ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/StifKarp.cpp000066400000000000000000000117671233421753700153640ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" #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.2/src/Stk.cpp000066400000000000000000000224641233421753700143760ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/TapDelay.cpp000066400000000000000000000051241233421753700153320ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/TcpClient.cpp000066400000000000000000000063211233421753700155140ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/TcpServer.cpp000066400000000000000000000057111233421753700155460ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Thread.cpp000066400000000000000000000044221233421753700150360ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/TubeBell.cpp000066400000000000000000000040721233421753700153260ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Twang.cpp000066400000000000000000000054631233421753700147150ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/TwoPole.cpp000066400000000000000000000041141233421753700152160ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/TwoZero.cpp000066400000000000000000000035631233421753700152450ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/UdpSocket.cpp000066400000000000000000000070011233421753700155240ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/VoicForm.cpp000066400000000000000000000131431233421753700153530ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" #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.2/src/Voicer.cpp000066400000000000000000000153561233421753700150660ustar00rootroot00000000000000/***************************************************/ /*! \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.2/src/Whistle.cpp000066400000000000000000000162671233421753700152600ustar00rootroot00000000000000/***************************************************/ /*! \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 "SKINImsg.h" #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.2/src/Wurley.cpp000066400000000000000000000050021233421753700151110ustar00rootroot00000000000000/***************************************************/ /*! \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 stk-4.5.2/src/include/000077500000000000000000000000001233421753700145445ustar00rootroot00000000000000stk-4.5.2/src/include/FunctionDiscoveryKeys_devpkey.h000066400000000000000000000443621233421753700227660ustar00rootroot00000000000000#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.2/src/include/dsound.h000066400000000000000000003235431233421753700162230ustar00rootroot00000000000000/*==========================================================================; * * 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.2/src/include/ginclude.h000066400000000000000000000011741233421753700165120ustar00rootroot00000000000000#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.2/src/include/soundcard.h000066400000000000000000002011011233421753700166720ustar00rootroot00000000000000/* * 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