From 732b57875d53cad9de5b18158c2e31c8c5f56f46 Mon Sep 17 00:00:00 2001 From: yomguy <> Date: Wed, 20 Aug 2008 22:13:18 +0000 Subject: [PATCH] * Remove/add audiolab * Install audiolab with setup.py * Cleanup * Audiolab waveform is default view --- setup.py | 6 +- telemeta/util/audiolab/COPYING.txt | 504 +++++++ telemeta/util/audiolab/Changelog | 139 ++ telemeta/util/audiolab/FLAC_SUPPORT.txt | 28 + telemeta/util/audiolab/INSTALL.txt | 36 + telemeta/util/audiolab/MANIFEST.in | 7 + telemeta/util/audiolab/Makefile | 114 ++ telemeta/util/audiolab/README.txt | 22 + telemeta/util/audiolab/TODO | 28 + .../audiolab/build/lib/scikits/__init__.py | 1 + .../build/lib/scikits/audiolab/__init__.py | 35 + .../build/lib/scikits/audiolab/info.py | 2 + .../build/lib/scikits/audiolab/matapi.py | 148 +++ .../build/lib/scikits/audiolab/pyaudioio.py | 68 + .../build/lib/scikits/audiolab/pysndfile.py | 992 ++++++++++++++ .../lib/scikits/audiolab/tests/__init__.py | 2 + .../lib/scikits/audiolab/tests/test_matapi.py | 164 +++ .../scikits/audiolab/tests/test_pysndfile.py | 396 ++++++ .../lib/scikits/audiolab/tests/testcommon.py | 20 + telemeta/util/audiolab/generate.sh | 4 + telemeta/util/audiolab/generate_const.py | 54 + telemeta/util/audiolab/generate_const.pyc | Bin 0 -> 1321 bytes telemeta/util/audiolab/header_parser.py | 50 + telemeta/util/audiolab/header_parser.pyc | Bin 0 -> 1819 bytes .../scikits.audiolab.egg-info/PKG-INFO | 31 + .../scikits.audiolab.egg-info/SOURCES.txt | 27 + .../dependency_links.txt | 1 + .../namespace_packages.txt | 1 + .../scikits.audiolab.egg-info/requires.txt | 1 + .../scikits.audiolab.egg-info/top_level.txt | 1 + .../scikits.audiolab.egg-info/zip-safe | 1 + telemeta/util/audiolab/scikits/__init__.py | 1 + telemeta/util/audiolab/scikits/__init__.pyc | Bin 0 -> 217 bytes .../audiolab/scikits/audiolab/__init__.py | 35 + .../audiolab/scikits/audiolab/__init__.pyc | Bin 0 -> 1595 bytes .../audiolab/scikits/audiolab/docs/Makefile | 54 + .../scikits/audiolab/docs/audiolab1.png | Bin 0 -> 19591 bytes .../audiolab/scikits/audiolab/docs/base.tex | 1182 +++++++++++++++++ .../scikits/audiolab/docs/examples/format1.py | 7 + .../scikits/audiolab/docs/examples/format2.py | 6 + .../scikits/audiolab/docs/examples/matlab1.py | 20 + .../scikits/audiolab/docs/examples/quick1.py | 5 + .../scikits/audiolab/docs/examples/usage1.py | 6 + .../scikits/audiolab/docs/examples/usage2.py | 12 + .../scikits/audiolab/docs/examples/write1.py | 34 + .../audiolab/scikits/audiolab/docs/index.txt | 264 ++++ .../audiolab/scikits/audiolab/docs/user.tex | 64 + .../util/audiolab/scikits/audiolab/info.py | 2 + .../util/audiolab/scikits/audiolab/info.pyc | Bin 0 -> 193 bytes .../util/audiolab/scikits/audiolab/matapi.py | 148 +++ .../util/audiolab/scikits/audiolab/matapi.pyc | Bin 0 -> 4893 bytes .../audiolab/scikits/audiolab/misc/Makefile | 23 + .../audiolab/scikits/audiolab/misc/Sconstruct | 5 + .../audiolab/scikits/audiolab/misc/badflac.c | 37 + .../scikits/audiolab/misc/badflac.flac | Bin 0 -> 38385 bytes .../scikits/audiolab/misc/winfdopen.c | 82 ++ .../audiolab/scikits/audiolab/pyaudioio.py | 68 + .../audiolab/scikits/audiolab/pysndfile.py | 992 ++++++++++++++ .../audiolab/scikits/audiolab/pysndfile.py.in | 886 ++++++++++++ .../audiolab/scikits/audiolab/pysndfile.pyc | Bin 0 -> 30913 bytes .../scikits/audiolab/soundio/SConstruct | 2 + .../scikits/audiolab/soundio/_alsa.pyx | 198 +++ .../audiolab/scikits/audiolab/soundio/alsa.py | 35 + .../scikits/audiolab/soundio/alsa_ctypes.py | 440 ++++++ .../scikits/audiolab/soundio/setup.py | 12 + .../scikits/audiolab/soundio/simple.c | 74 ++ .../scikits/audiolab/soundio/simple2.c | 80 ++ .../scikits/audiolab/test_data/original.aif | Bin 0 -> 131776 bytes .../scikits/audiolab/test_data/test.aiff | Bin 0 -> 90376 bytes .../scikits/audiolab/test_data/test.au | Bin 0 -> 90346 bytes .../scikits/audiolab/test_data/test.flac | Bin 0 -> 56733 bytes .../scikits/audiolab/test_data/test.raw | Bin 0 -> 22580 bytes .../scikits/audiolab/test_data/test.sdif | Bin 0 -> 91346 bytes .../scikits/audiolab/test_data/test.wav | Bin 0 -> 90366 bytes .../scikits/audiolab/tests/__init__.py | 2 + .../scikits/audiolab/tests/test_matapi.py | 164 +++ .../scikits/audiolab/tests/test_pysndfile.py | 396 ++++++ .../scikits/audiolab/tests/testcommon.py | 20 + telemeta/util/audiolab/setup.cfg | 4 + telemeta/util/audiolab/setup.py | 222 ++++ telemeta/util/audiolab/site.cfg.win32 | 5 + telemeta/util/audiolab/site.cfg_noflac | 8 + telemeta/util/audiolab/tester.py | 13 + telemeta/visualization/octave_core.py | 4 +- telemeta/visualization/spectrogram3.py | 3 - telemeta/visualization/waveform3.py | 5 - telemeta/web/base.py | 11 +- 87 files changed, 8493 insertions(+), 21 deletions(-) create mode 100644 telemeta/util/audiolab/COPYING.txt create mode 100644 telemeta/util/audiolab/Changelog create mode 100644 telemeta/util/audiolab/FLAC_SUPPORT.txt create mode 100644 telemeta/util/audiolab/INSTALL.txt create mode 100644 telemeta/util/audiolab/MANIFEST.in create mode 100644 telemeta/util/audiolab/Makefile create mode 100644 telemeta/util/audiolab/README.txt create mode 100644 telemeta/util/audiolab/TODO create mode 100644 telemeta/util/audiolab/build/lib/scikits/__init__.py create mode 100644 telemeta/util/audiolab/build/lib/scikits/audiolab/__init__.py create mode 100644 telemeta/util/audiolab/build/lib/scikits/audiolab/info.py create mode 100644 telemeta/util/audiolab/build/lib/scikits/audiolab/matapi.py create mode 100644 telemeta/util/audiolab/build/lib/scikits/audiolab/pyaudioio.py create mode 100644 telemeta/util/audiolab/build/lib/scikits/audiolab/pysndfile.py create mode 100644 telemeta/util/audiolab/build/lib/scikits/audiolab/tests/__init__.py create mode 100644 telemeta/util/audiolab/build/lib/scikits/audiolab/tests/test_matapi.py create mode 100644 telemeta/util/audiolab/build/lib/scikits/audiolab/tests/test_pysndfile.py create mode 100644 telemeta/util/audiolab/build/lib/scikits/audiolab/tests/testcommon.py create mode 100644 telemeta/util/audiolab/generate.sh create mode 100644 telemeta/util/audiolab/generate_const.py create mode 100644 telemeta/util/audiolab/generate_const.pyc create mode 100644 telemeta/util/audiolab/header_parser.py create mode 100644 telemeta/util/audiolab/header_parser.pyc create mode 100644 telemeta/util/audiolab/scikits.audiolab.egg-info/PKG-INFO create mode 100644 telemeta/util/audiolab/scikits.audiolab.egg-info/SOURCES.txt create mode 100644 telemeta/util/audiolab/scikits.audiolab.egg-info/dependency_links.txt create mode 100644 telemeta/util/audiolab/scikits.audiolab.egg-info/namespace_packages.txt create mode 100644 telemeta/util/audiolab/scikits.audiolab.egg-info/requires.txt create mode 100644 telemeta/util/audiolab/scikits.audiolab.egg-info/top_level.txt create mode 100644 telemeta/util/audiolab/scikits.audiolab.egg-info/zip-safe create mode 100644 telemeta/util/audiolab/scikits/__init__.py create mode 100644 telemeta/util/audiolab/scikits/__init__.pyc create mode 100644 telemeta/util/audiolab/scikits/audiolab/__init__.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/__init__.pyc create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/Makefile create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/audiolab1.png create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/base.tex create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/examples/format1.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/examples/format2.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/examples/matlab1.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/examples/quick1.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/examples/usage1.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/examples/usage2.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/examples/write1.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/index.txt create mode 100644 telemeta/util/audiolab/scikits/audiolab/docs/user.tex create mode 100644 telemeta/util/audiolab/scikits/audiolab/info.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/info.pyc create mode 100644 telemeta/util/audiolab/scikits/audiolab/matapi.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/matapi.pyc create mode 100644 telemeta/util/audiolab/scikits/audiolab/misc/Makefile create mode 100644 telemeta/util/audiolab/scikits/audiolab/misc/Sconstruct create mode 100644 telemeta/util/audiolab/scikits/audiolab/misc/badflac.c create mode 100644 telemeta/util/audiolab/scikits/audiolab/misc/badflac.flac create mode 100644 telemeta/util/audiolab/scikits/audiolab/misc/winfdopen.c create mode 100644 telemeta/util/audiolab/scikits/audiolab/pyaudioio.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/pysndfile.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/pysndfile.py.in create mode 100644 telemeta/util/audiolab/scikits/audiolab/pysndfile.pyc create mode 100644 telemeta/util/audiolab/scikits/audiolab/soundio/SConstruct create mode 100644 telemeta/util/audiolab/scikits/audiolab/soundio/_alsa.pyx create mode 100644 telemeta/util/audiolab/scikits/audiolab/soundio/alsa.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/soundio/alsa_ctypes.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/soundio/setup.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/soundio/simple.c create mode 100644 telemeta/util/audiolab/scikits/audiolab/soundio/simple2.c create mode 100644 telemeta/util/audiolab/scikits/audiolab/test_data/original.aif create mode 100644 telemeta/util/audiolab/scikits/audiolab/test_data/test.aiff create mode 100644 telemeta/util/audiolab/scikits/audiolab/test_data/test.au create mode 100644 telemeta/util/audiolab/scikits/audiolab/test_data/test.flac create mode 100644 telemeta/util/audiolab/scikits/audiolab/test_data/test.raw create mode 100644 telemeta/util/audiolab/scikits/audiolab/test_data/test.sdif create mode 100644 telemeta/util/audiolab/scikits/audiolab/test_data/test.wav create mode 100644 telemeta/util/audiolab/scikits/audiolab/tests/__init__.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/tests/test_matapi.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/tests/test_pysndfile.py create mode 100644 telemeta/util/audiolab/scikits/audiolab/tests/testcommon.py create mode 100644 telemeta/util/audiolab/setup.cfg create mode 100644 telemeta/util/audiolab/setup.py create mode 100644 telemeta/util/audiolab/site.cfg.win32 create mode 100644 telemeta/util/audiolab/site.cfg_noflac create mode 100644 telemeta/util/audiolab/tester.py diff --git a/setup.py b/setup.py index bc5b867a..5a7ab860 100644 --- a/setup.py +++ b/setup.py @@ -48,7 +48,7 @@ setup( url = "/http://svn.parisson.org/telemeta", description = "web frontend to backup, transcode and tag any audio content with metadata", author = ["Guillaume Pellerin, Olivier Guilyardi"], - author_email = ["pellerin@parisson.com"], + author_email = ["pellerin@parisson.com","olivier@samalyse.com"], version = version, packages = packages, data_files = data_files, @@ -82,3 +82,7 @@ See http://svn.parisson.org/telemeta/ for more informations. """ ) +# Install audiolab +os.chdir('telemeta/util/audiolab/') +os.system('python setup.py install') + diff --git a/telemeta/util/audiolab/COPYING.txt b/telemeta/util/audiolab/COPYING.txt new file mode 100644 index 00000000..5ab7695a --- /dev/null +++ b/telemeta/util/audiolab/COPYING.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/telemeta/util/audiolab/Changelog b/telemeta/util/audiolab/Changelog new file mode 100644 index 00000000..58d64a75 --- /dev/null +++ b/telemeta/util/audiolab/Changelog @@ -0,0 +1,139 @@ +audiolab (0.7) Sun, 09 Sep 2007 20:10:27 +0900 + + * More robust wrapping of libsndfile: sf_file are objects pointers, + the destructor checks that the handle already exists, and NULL + pointers are better detected. + * Add preliminary alsa version (not enabled yet). + * Opening non existing files now throws meaningful exception. + +audiolab (0.7dev) Tue, 17 Jul 2007 12:03:41 +0900 + + * Rename pyaudiolab to audiolab. + +pyaudiolab (0.7dev) Fri, 25 May 2007 16:00:24 +0900 + + * Add the possibility to open an audio file from file descriptor + +pyaudiolab (0.7dev) Thu, 24 May 2007 13:34:11 +0900 + + * Support for read and write seek + * Set correct location of pysndfile.py in setup.py, so that it is + correctly removed during setup. + +pyaudiolab (0.7dev) Tue, 22 May 2007 10:50:53 +0900 + + * Relicense under the LGPL + * Add data files with distutils instead of setuptools because of + setuptools bug with sdist targets + +pyaudiolab (0.7dev) Mon, 21 May 2007 11:09:32 +0900 + + * Convert the layout to scikits convention + setuptools + +pyaudiolab (0.6.7) Mon, 19 Mar 2007 15:19:10 +0900 + + * Add some meta-data for setup.py + +pyaudiolab (0.6.7) Mon, 12 Mar 2007 15:48:12 +0900 + + * Mainly Bug fixes for win32 and libsndfile without FLAC support. + * Add a site.cfg.win32 + instructions in the doc to show how to use with + win32. + * Replace all remove functions in tests for temp files (Does not work + under win32) + * If FLAC is not supported, set flacread and flacwrite functions to None + and catch exceptions related to unavailable FLAC support to avoid tests + failing. + * Replace non FLAC tests using FLAC files to WAV files. + +pyaudiolab (0.6.6dev) Mon, 05 Feb 2007 20:37:49 +0900 + + * Add reader/writer factory to matlab-like API. + * Generate au/wav/aiff/sdif/flac read/write functions + with Matlab-like behaviour. + * disable seek support for FLAC files by default, because of problems + when using sf_seek(offset, SEEK_SET) with some FLAC versions. + +pyaudiolab (0.6.6dev) Mon, 05 Feb 2007 12:06:10 +0900 + + * Change system to detect sndfile shared library file (based on + sys.plaform instead of so_ext which does not seem to work on darwin at + least). + +pyaudiolab (0.6.5) Fri, 02 Feb 2007 14:53:01 +0900 + + * bump to 0.6.5 + * Add mechanism to automatic release+upload + * release 0.6.5 + +pyaudiolab (0.6.5dev) Fri, 02 Feb 2007 14:53:01 +0900 + + * Put a proper LICENSE in COPYING.txt, and note in the README.txt + that pyaudiolab depends on LGPL package + +pyaudiolab (0.6.5dev) Thu, 01 Feb 2007 15:06:51 +0900 + + * Add int and short support for reading/writing + * fix write and read such as float arguments for number of frames is + possible + test. + * Whenever a long long is expected by libsndfile, check that the number + given by user is valid. + * Give more meaningful error messages when bad parameters are given for + opening a file for writing. + * Give more meaningful error messages when trying to read a file opened + only for writing. + * Add examples scripts into doc/examples. Run them in test.sh + +pyaudiolab (0.6.1) Wed, 31 Jan 2007 16:03:02 +0900 + + * Bump to 0.6.1 + * Change the name to pyaudiolab to avoid clashes with existing pyaudio + toolboxes. + +pyaudio (0.6) Wed, 31 Jan 2007 14:32:41 +0900 + + * Bump to 0.6. + * Add support for seeking. + * Add sync to sndfile to force flushing OS IO buffers to file without need + to close. + * read takes dtype argument instead of read_*_float, read_*_double. + * wavread, wavwrite are working and similar to matlab's ones. + +pyaudio (0.5) Tue, 30 Jan 2007 14:40:36 +0900 + + * Bump to 0.5 + * More explicit import error when used with bad ctypes + * Add matlab-like functions wavread, wavwrite, aiffread, aiffwrite + * Add API to have useful strings from format in sndfile class + +pyaudio (0.4) Mon, 06 Nov 2006 12:56:55 +0900 + + * Bump to 0.4 + * replace c_longlong with c_int64; if ctypes does not support 64 bits + integer, it will result in an import error instead of having c_longlong + silently converted to 32 bits integer, which would result in difficult + to trace bugs + * add support for raw files (which requires a format, even for reading) + +pyaudio (0.3.1) Mon, 06 Nov 2006 12:56:55 +0900 + + * Bump to 0.3.1 + * Check that samplerate and number of channels are int. If not, + warn the user about potential unsafe conversion. + * Move functions used to parse enum in header files into + a other module, for easier sharing with other packages. + +pyaudio (0.3) Tue, 31 Oct 2006 21:38:46 +0900 + + * Bump to 0.3 + * Added a class format, which can be used to open + file for writing. The class hides all internal representation + used by libsndfile, for a much saner API. + * Various Bug fixes + +pyaudio (0.2) Mon, 30 Oct 2006 17:45:14 +0900 + + * Bump to 0.2 + * Added a sndfile_info in setup.py for an automatic detection + of sndfile under the installed system + * mode is now a simple string in sndfile class ctor diff --git a/telemeta/util/audiolab/FLAC_SUPPORT.txt b/telemeta/util/audiolab/FLAC_SUPPORT.txt new file mode 100644 index 00000000..1f96d274 --- /dev/null +++ b/telemeta/util/audiolab/FLAC_SUPPORT.txt @@ -0,0 +1,28 @@ +ABOUT SEEK AND FLAC SUPPORT: + + audiolab supports flac, because libsndfile does. Unfortunately, some FLAC +libraries seem buggy (at least the one with ubuntu Dapper is) with respect to +their seek implementation. That's why by default, seeking in flac support is +NOT enabled. If you want to test whether you FLAC library has the problem, +compile the file badflac.c in the misc directory, eg on Linux: + +gcc -W -Wall badflac.c -lsndfile -o badflac + +and try running ./badflac ./badflac.flac. If the program looks locked up, this +means you should NOT enable flac support. If it works OK, then you can enable +seek support in audiolab by commenting the following lines in +pysndfile.py.in (take care to modify the pysndfile.py.in, and not the +pysndfile.py file), in sndfile.__init__ (around line 500): + +if self.get_file_format() == 'flac': + def SeekNotEnabled(self, *args): + raise FlacUnsupported("seek not supported on Flac by default, because"\ + "\n some version of FLAC libraries are buggy. Read FLAC_SUPPORT.txt") + self.seek = SeekNotEnabled + +Then install the package. + +The pre releases version 1.0.18pre7 of libsndfile is known to work, libsndfile +1.0.17 and 1.0.16 known NOT to work (those version rely on an installed FLAC +library, whether starting from 1.0.18, libsndfile will include the FLAC library +instead of using an externally supplied one). diff --git a/telemeta/util/audiolab/INSTALL.txt b/telemeta/util/audiolab/INSTALL.txt new file mode 100644 index 00000000..b812afac --- /dev/null +++ b/telemeta/util/audiolab/INSTALL.txt @@ -0,0 +1,36 @@ +Suported platforms: +------------------- + +audiolab has been successfully run and tested on the following platforms: + + - windows + - mac OS X (intel and ppc) + - linux (intel and ppc). + +This may work on other platforms: in particular, I expect the package to work +on most recent Unices. + +Requirements +------------ + +To run correctly, audiolab requires the following softwares: + + - python (> 2.3): http://www.python.org + - setuptools: + http://peak.telecommunity.com/DevCenter/setuptools#installing-setuptools + - ctypes (included in python starting from version 2.5) + - numpy: http://www.scipy.org/Numpy + - libsndfile: http://www.mega-nerd.com/libsndfile/ + +On Ubuntu, you can ensure to get the necessary packages by doing apt-get +install python python-setuptools libsndfile-dev python-numpy + +Installing +---------- + +Installing is easy: once in the audiolab directory, simply do: python setup.py +install. If the installation failed because libsndfile was not found, check +that you have correctly installed libsndfile, including its headers +(sndfile.h). On windows, as there is no standard for 3rd party libraries and +header location, you can put them wherever you want, as long as the +corresponding directories are in site.cfg (see site.cfg.win32 for an example). diff --git a/telemeta/util/audiolab/MANIFEST.in b/telemeta/util/audiolab/MANIFEST.in new file mode 100644 index 00000000..2288cf92 --- /dev/null +++ b/telemeta/util/audiolab/MANIFEST.in @@ -0,0 +1,7 @@ +include scikits/audiolab/pysndfile.py.in +include site.cfg +include site.cfg.win32 +include COPYING.txt +include FLAC_SUPPORT.txt +include header_parser.py +include generate_const.py diff --git a/telemeta/util/audiolab/Makefile b/telemeta/util/audiolab/Makefile new file mode 100644 index 00000000..94b2f8a1 --- /dev/null +++ b/telemeta/util/audiolab/Makefile @@ -0,0 +1,114 @@ +# Last Change: Tue Jul 17 11:00 AM 2007 J +# +# This makefile is used to do all the "tricky things" before a release, +# including updating the doc, installing and testing the package, uploading the +# release to the website, etc... +# +# TODO: not fake dependencies.... + +PKG_VER = $(shell cat scikits/audiolab/info.py | grep __version__ | tr -s " " | cut -f 3 -d" " \ + | cut -f 2 -d\') + +BASEPATH = $(PWD) +DATAPATH = $(PWD)/scikits/audiolab/test_data/ +DOCPATH = $(PWD)/scikits/audiolab/docs/ +EXAMPATH = $(DOCPATH)/examples + +SCIPYPATH = $(HOME)/local/lib/python2.5/site-packages +TMPPATH = $(CURDIR)/../tmp + +PYTHONCMD = PYTHONPATH=$(TMPPATH)/lib/python2.5/site-packages:$(SCIPYPATH) python -c +PYTHONRUN = PYTHONPATH=$(TMPPATH)/lib/python2.5/site-packages:$(SCIPYPATH) python + +RELEASELOC = $(WWWHOMEDIR)/archives/audiolab/releases + +do_release: clean src examples tests + +release: do_release upload_release + +upload_release: dist/audiolab-$(PKG_VER).tar.gz \ + dist/audiolab-$(PKG_VER).tar.bz2 \ + dist/audiolab-$(PKG_VER).zip + @echo "Uploading version $(PKG_VER) ..." + @read n + rcp dist/audiolab-$(PKG_VER).tar.gz $(RELEASELOC) + rcp dist/audiolab-$(PKG_VER).tar.bz2 $(RELEASELOC) + rcp dist/audiolab-$(PKG_VER).zip $(RELEASELOC) + +src: build_src + +build_src: dist/audiolab-$(PKG_VER).tar.gz \ + dist/audiolab-$(PKG_VER).tar.bz2 \ + dist/audiolab-$(PKG_VER).zip + +dist/audiolab-$(PKG_VER).tar.gz: doc + python setup.py sdist --format=gztar + +dist/audiolab-$(PKG_VER).zip: doc + python setup.py sdist --format=zip + +dist/audiolab-$(PKG_VER).tar.bz2: doc + python setup.py sdist --format=bztar + +#======================================================= +# Code related to building audiolab in a tmp directory +#======================================================= +# Install the package in a tmp directory +$(TMPPATH): build_test + +build_test: + $(PYTHONRUN) setup.py install --prefix=$(TMPPATH) + +# Clean the tmp dir +clean_before_run: + rm -rf $(TMPPATH) + +#=========================== +# Code related to examples +#=========================== +examples: run_examples + +# Run examples in docs/examples +run_examples: $(TMPPATH) + #for i in $(BASEPATH)/docs/examples/*.py; do\ + # echo "========== runing example $$i ==========";\ + # $(PYTHONRUN) $$i; \ + #done; + # Why when using the above loop, Make does not stop when one script fails ? + @echo "---------- runing example quick1.py ----------"; + cd $(DATAPATH) && $(PYTHONRUN) $(EXAMPATH)/quick1.py + @echo "---------- runing example usage1.py ----------"; + cd $(DATAPATH) && $(PYTHONRUN) $(EXAMPATH)/usage1.py + @echo "---------- runing example usage2.py ----------"; + cd $(DATAPATH) && $(PYTHONRUN) $(EXAMPATH)/usage2.py + @echo "---------- runing example format1.py ----------"; + cd $(DATAPATH) && $(PYTHONRUN) $(EXAMPATH)/format1.py + @echo "---------- runing example format2.py ----------"; + cd $(DATAPATH) && $(PYTHONRUN) $(EXAMPATH)/format2.py + @echo "---------- runing example write1.py ----------"; + cd $(DATAPATH) && $(PYTHONRUN) $(EXAMPATH)/write1.py + @echo "---------- runing example matlab1.py ----------"; + cd $(DATAPATH) && $(PYTHONRUN) $(EXAMPATH)/matlab1.py + +#===================== +# Code related to test +#===================== +tests: run_tests examples + @echo "==================================" + @echo " RELEASE $(PKG_VER) IS OK !" + @echo "==================================" + +# Run all tests +run_tests: $(TMPPATH) + @echo "=============== running test ============" + cd .. && $(PYTHONCMD) "import scikits.audiolab as audiolab; print audiolab; audiolab.test()" + @echo "=============== Done ============" + +#===================== +# Code related to doc +#===================== +doc: + cd $(DOCPATH) && $(MAKE) + +clean: clean_before_run + cd $(DOCPATH) && $(MAKE) clean diff --git a/telemeta/util/audiolab/README.txt b/telemeta/util/audiolab/README.txt new file mode 100644 index 00000000..7c6a3f43 --- /dev/null +++ b/telemeta/util/audiolab/README.txt @@ -0,0 +1,22 @@ +audiolab: a small toolbox to read, write and play audio to and from +numpy arrays. + +audiolab provides two API: + - one similar to matlab: this gives you wavread/wavwrite/auread/auwrite + functions similar to matlab's ones. + - a more complete API, which can be used to read, write to many audio files + (including wav, aiff, flac, au, IRCAM, htk, etc...), with IO capabilities + not available to matlab (seek, append data, etc...) + +It is a thin wrapper around libsndfile from Erik Castro Lopo. + +See the docs directory for more details + +LICENSE: + +audiolab itself is licensed under the LGPL license +(see COPYING.txt in main source directory) + +audiolab depends on libsndfile to work; libsndfile is licensed under LGPL. + +See http://www.mega-nerd.com/libsndfile/ for details. diff --git a/telemeta/util/audiolab/TODO b/telemeta/util/audiolab/TODO new file mode 100644 index 00000000..8dd984a7 --- /dev/null +++ b/telemeta/util/audiolab/TODO @@ -0,0 +1,28 @@ +.. vim:syntax=rest + +Things to do before a release +----------------------------- + - better error reporting (support error logging of sndfile ?): the + exceptions launched are pretty random... + - add inout argument in read method to avoid recreating a buffer. + - more tests + - add an audio player for at least linux/windows/mac os x (0.8-0.9) -> This + will be done in a different branch + +Pending issues +-------------- + - There is no check for supported format, the way get_supported_format is + implemented now it totally broken. Instead of using values from the + header, should use sf_command + - removing most warning from pylint + - handling in audiolab when first is not 0 (now, we have seek :)) + +Maybe ? +------- + - change array layout convention to numpy's ones (eg row major, not column + major), and add an axis argument. -> this is a bit tricky, actually, as + sndfile only supports interleaved data, where F order actually make sense. + Not sure what to do + - ogg vorbis support ? libsndfile does not support ogg (yet). Maybe use the + reference lib, but this may be a bit complicated to support both library + at the same time. diff --git a/telemeta/util/audiolab/build/lib/scikits/__init__.py b/telemeta/util/audiolab/build/lib/scikits/__init__.py new file mode 100644 index 00000000..de40ea7c --- /dev/null +++ b/telemeta/util/audiolab/build/lib/scikits/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/telemeta/util/audiolab/build/lib/scikits/audiolab/__init__.py b/telemeta/util/audiolab/build/lib/scikits/audiolab/__init__.py new file mode 100644 index 00000000..12911595 --- /dev/null +++ b/telemeta/util/audiolab/build/lib/scikits/audiolab/__init__.py @@ -0,0 +1,35 @@ +#! /usr/bin/env python +# Last Change: Mon Sep 10 07:00 PM 2007 J +""" +audiolab: a small toolbox to read, write and play audio to and from +numpy arrays. + +audiolab provides two API: + - one similar to matlab: this gives you wavread, wavwrite functions really + similar to matlab's functions. + - a more complete API, which can be used to read, write to many audio file + (including wav, aiff, flac, au, IRCAM, htk, etc...), with IO capabilities + not available to matlab (seek, append data, etc...) + +It is a thin wrapper around libsndfile from Erik Castro Lopo. + +Copyright (C) 2006-2007 Cournapeau David + +LICENSE: audiolab is licensed under the LGPL, as is libsndfile itself. See +COPYING.txt for details. """ + +from info import VERSION +__version__ = VERSION + +from pysndfile import formatinfo, sndfile +from pysndfile import supported_format, supported_endianness, \ + supported_encoding +#from scikits.audiolab.matapi import wavread, aiffread, flacread, auread, \ +# sdifread, wavwrite, aiffwrite, flacwrite, auwrite, sdifwrite +from matapi import * + +__all__ = filter(lambda s:not s.startswith('_'),dir()) + +from numpy.testing import NumpyTest +def test(): + return NumpyTest().test() diff --git a/telemeta/util/audiolab/build/lib/scikits/audiolab/info.py b/telemeta/util/audiolab/build/lib/scikits/audiolab/info.py new file mode 100644 index 00000000..47dd67f6 --- /dev/null +++ b/telemeta/util/audiolab/build/lib/scikits/audiolab/info.py @@ -0,0 +1,2 @@ +VERSION = '0.8dev' +ignore = False diff --git a/telemeta/util/audiolab/build/lib/scikits/audiolab/matapi.py b/telemeta/util/audiolab/build/lib/scikits/audiolab/matapi.py new file mode 100644 index 00000000..1568fe9c --- /dev/null +++ b/telemeta/util/audiolab/build/lib/scikits/audiolab/matapi.py @@ -0,0 +1,148 @@ +#! /usr/bin/env python +# Last Change: Mon Sep 10 07:00 PM 2007 J + +# Copyright (C) 2006-2007 Cournapeau David +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +"""This module implements functions to read and write to audio files easily +(ala matlab: wavread, etc...).""" + +import numpy as N + +from pysndfile import formatinfo, sndfile +from pysndfile import PyaudioException, FlacUnsupported + +__all__ = [] +_MATAPI_FORMAT = ['wav', 'aiff', 'au', 'sdif', 'flac'] +for i in _MATAPI_FORMAT: + __all__.extend(['%sread' % i, '%swrite' % i]) + +# writer function factory +def _writer_factory(name, format, def_fs, descr): + """ Create a writer function with fileformat described by format, default + sampling rate def_fs, and docstring descr.""" + def basic_writer(data, filename, fs = def_fs, enc = format.get_encoding()): + """Common "template" to all write functions.""" + if N.ndim(data) <= 1: + nc = 1 + nframes = N.size(data) + elif N.ndim(data) == 2: + nc = data.shape[1] + nframes = data.shape[0] + else: + RuntimeError("Only rank 0, 1, and 2 arrays supported as audio data") + + hdl = sndfile(filename, 'write', format, nc, fs) + try: + hdl.write_frames(data, nframes) + finally: + hdl.close() + doc = \ + """ wrapper around pysndfile to write %s file, + in a similar manner to matlab's wavwrite/auwrite and the likes. + + OVERWRITES EXISTING FILE ! + + Args: + - data: a rank 0, 1 (mono) or 2 (one channel per col) numpy array + - filename: a string for the audio file name + - fs: the sampling rate in Hz (%d Hz by default). + - enc: a string for the encoding such as 'pcm16', etc...(%s by + default). Not supported yet ! + + For a total control over options, such as endianness, append data to an + existing file, etc... you should use sndfile class instances instead""" \ + % (str(descr), def_fs, format.get_encoding()) + basic_writer.__doc__ = doc + basic_writer.__name__ = name + return basic_writer + +# template for reader functions +def _reader_factory(name, filetype, descr): + """Factory for reader functions ala matlab.""" + def basic_reader(filename, last = None, first = 0): + """Common "template" to all read functions.""" + hdl = sndfile(filename, 'read') + try: + if not hdl.get_file_format() == filetype: + raise PyaudioException("%s is not a %s file (is %s)" \ + % (filename, filetype, hdl.get_file_format())) + + fs = hdl.get_samplerate() + enc = hdl.get_encoding() + # Set the pointer to start position + nf = hdl.seek(first, 1) + if not nf == first: + raise IOError("Error while seeking at starting position") + + if last is None: + nframes = hdl.get_nframes() - first + data = hdl.read_frames(nframes) + else: + data = hdl.read_frames(last) + finally: + hdl.close() + + return data, fs, enc + doc = \ + """ wrapper around pysndfile to read a %s file in float64, + in a similar manner to matlab wavread/auread/etc... + + Returns a tuple (data, fs, enc), where : + - data are the read data (one column per channel) + - fs, the sampling rate + - enc, a string which is the encoding of the file, such as 'pcm16', + 'float32', etc... + + For a total control over options, such as output's dtype, etc..., + you should use sndfile class instances instead""" % (str(descr),) + basic_reader.__doc__ = doc + basic_reader.__name__ = name + return basic_reader + +wavread = _reader_factory('wavread', 'wav', + formatinfo('wav', 'pcm16').get_major_str()) +auread = _reader_factory('auread', 'au', + formatinfo('au', 'pcm16').get_major_str()) +aiffread = _reader_factory('aiffread', 'aiff', + formatinfo('aiff', 'pcm16').get_major_str()) +sdifread = _reader_factory('sdifread', 'ircam', + formatinfo('ircam', 'pcm16').get_major_str()) + +_f1 = formatinfo('wav', 'pcm16') +wavwrite = _writer_factory('wavwrite', _f1, 8000, _f1.get_major_str()) + +_f2 = formatinfo('au', 'ulaw') +auwrite = _writer_factory('auwrite', _f2, 8000, _f2.get_major_str()) + +_f3 = formatinfo('aiff', 'pcm16') +aiffwrite = _writer_factory('aiffwrite', _f3, 8000, _f3.get_major_str()) + +_f4 = formatinfo('ircam', 'pcm16') +sdifwrite = _writer_factory('sdifwrite', _f4, 44100, _f4.get_major_str()) + +try: + flacread = _reader_factory('flacread', 'flac', + formatinfo('flac', 'pcm16').get_major_str()) + _f5 = formatinfo('flac', 'pcm16') + flacwrite = _writer_factory('flacwrite', _f5, 44100, _f5.get_major_str()) +except FlacUnsupported,e: + print e + print "Matlab API for FLAC is disabled" + def missing_flacread(*args): + raise UnimplementedError("Matlab API for FLAC is disabled on your "\ + "installation") + flacread = missing_flacread + flacwrite = missing_flacread diff --git a/telemeta/util/audiolab/build/lib/scikits/audiolab/pyaudioio.py b/telemeta/util/audiolab/build/lib/scikits/audiolab/pyaudioio.py new file mode 100644 index 00000000..94c1e9fc --- /dev/null +++ b/telemeta/util/audiolab/build/lib/scikits/audiolab/pyaudioio.py @@ -0,0 +1,68 @@ +#! /usr/bin/env python +# Last Change: Tue May 22 10:00 AM 2007 J + +# Copyright (C) 2006-2007 Cournapeau David +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) any +# later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this library; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# TODO: +# - find out why finally does not work with KeyboardInterrupt instances + +from tempfile import mkstemp +from os import remove, popen + +from pysndfile import sndfile, formatinfo as format + +def play(input, sr = 22050): + """play(input, sr = 22050): "play" a numpy array input + to the audio device using aplay command, @ sampling rate + sr. + + Warning: This is really crude, as it copies the numpy array + into an audio file before writing: I am too lazy to write + interfaces to also, windows and co...""" + # Check inputs are OK + if input.ndim == 1: + nc = 1 + nframes = input.size + else: + (nframes, nc) = input.shape + + # Create tmp file + fd, filename = mkstemp('py_player') + + # Copy the data into it + b = sndfile(filename, 'write', format('wav', 'pcm16'), nc, sr) + b.write_frames(input, nframes) + b.close() + + # Play using an audio command + try: + cmd = "aplay %s" % filename + popen(cmd) + remove(filename) + except KeyboardInterrupt, inst: + remove(filename) + raise inst + +if __name__ == '__main__': + # Read the content of a file into numpy array, and play the numpy + # array using the play command + import numpy as N + sr = 22050 + # Play a really small noise to avoid screaming in loudspeakers + # or headphones. + noise = 0.0001 * N.random.randn((sr)) + play(noise, sr) diff --git a/telemeta/util/audiolab/build/lib/scikits/audiolab/pysndfile.py b/telemeta/util/audiolab/build/lib/scikits/audiolab/pysndfile.py new file mode 100644 index 00000000..2fea1fef --- /dev/null +++ b/telemeta/util/audiolab/build/lib/scikits/audiolab/pysndfile.py @@ -0,0 +1,992 @@ +#! /usr/bin/env python +# Last Change: Wed Oct 03 05:00 PM 2007 J + +# Copyright (C) 2006-2007 Cournapeau David +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# vim:syntax=python + +# TODO: +# - import format classes so that we get meaningful information from an +# existing format +# - better API for reader/writer, including integer formats and partial +# reading +# - ability to get log of sndfile ? +# - check how to play sound under windows, OS X and other UNIX + +"""This module implements the wrappers around libsndfile.""" + +__docformat__ = 'restructuredtext' + +#__all__ = ['sndfile', 'formatinfo'] + +import copy +import warnings + +#================ +# Load libsndfile +#================ +import ctypes +from ctypes import cdll, Structure, c_int, pointer, POINTER, \ + create_string_buffer, c_char_p, sizeof, string_at +try: + from ctypes import c_int64 +except ImportError, e: + print "Cannot import c_int64 from ctypes: if you are on ubuntu/debian," +\ + " this is likely because ctypes was compiled with libffi. see" +\ + " https://launchpad.net/ubuntu/+source/python2.5/+bug/71914" + raise e + +from numpy.ctypeslib import ndpointer +CTYPES_MAJOR = int(ctypes.__version__.split('.')[0]) +CTYPES_MINOR = int(ctypes.__version__.split('.')[1]) +CTYPES_MICRO = int(ctypes.__version__.split('.')[2]) +if CTYPES_MAJOR < 1 or (CTYPES_MINOR == 0 and CTYPES_MICRO < 1): + raise ImportError("version of ctypes is %s, expected at least %s" \ + % (ctypes.__version__, '1.0.1')) +import numpy as N + +_SND = cdll.LoadLibrary('/usr/lib/libsndfile.so.1') + +#========================= +# Definition of constants +#========================= +# READ/WRITE Mode +SFM = { + 'SFM_WRITE' : 0x20, + 'SFM_RDWR' : 0x30, + 'SFM_READ' : 0x10 +} + +# SF BOOL +SF_BOOL = { + 'SF_TRUE' : 1, + 'SF_FALSE' : 0 +} + +# Format +SF_FORMAT = { + 'SF_FORMAT_VOX_ADPCM' : 0x0021, + 'SF_FORMAT_FLOAT' : 0x0006, + 'SF_FORMAT_PCM_S8' : 0x0001, + 'SF_FORMAT_IMA_ADPCM' : 0x0012, + 'SF_FORMAT_SVX' : 0x060000, + 'SF_FORMAT_VOC' : 0x080000, + 'SF_FORMAT_PCM_U8' : 0x0005, + 'SF_FORMAT_ALAW' : 0x0011, + 'SF_FORMAT_G721_32' : 0x0030, + 'SF_FORMAT_DWVW_N' : 0x0043, + 'SF_FORMAT_WAV' : 0x010000, + 'SF_FORMAT_SD2' : 0x160000, + 'SF_FORMAT_HTK' : 0x100000, + 'SF_FORMAT_ENDMASK' : 0x30000000, + 'SF_FORMAT_DPCM_16' : 0x0051, + 'SF_FORMAT_DWVW_24' : 0x0042, + 'SF_FORMAT_PCM_32' : 0x0004, + 'SF_FORMAT_WAVEX' : 0x130000, + 'SF_FORMAT_DOUBLE' : 0x0007, + 'SF_FORMAT_NIST' : 0x070000, + 'SF_FORMAT_PCM_16' : 0x0002, + 'SF_FORMAT_RAW' : 0x040000, + 'SF_FORMAT_W64' : 0x0B0000, + 'SF_FORMAT_PVF' : 0x0E0000, + 'SF_FORMAT_AU' : 0x030000, + 'SF_FORMAT_GSM610' : 0x0020, + 'SF_FORMAT_CAF' : 0x180000, + 'SF_FORMAT_PAF' : 0x050000, + 'SF_FORMAT_ULAW' : 0x0010, + 'SF_FORMAT_MAT4' : 0x0C0000, + 'SF_FORMAT_MAT5' : 0x0D0000, + 'SF_FORMAT_XI' : 0x0F0000, + 'SF_FORMAT_SUBMASK' : 0x0000FFFF, + 'SF_FORMAT_DPCM_8' : 0x0050, + 'SF_FORMAT_G723_24' : 0x0031, + 'SF_FORMAT_G723_40' : 0x0032, + 'SF_FORMAT_DWVW_16' : 0x0041, + 'SF_FORMAT_AIFF' : 0x020000, + 'SF_FORMAT_DWVW_12' : 0x0040, + 'SF_FORMAT_TYPEMASK' : 0x0FFF0000, + 'SF_FORMAT_FLAC' : 0x170000, + 'SF_FORMAT_PCM_24' : 0x0003, + 'SF_FORMAT_SDS' : 0x110000, + 'SF_FORMAT_IRCAM' : 0x0A0000, + 'SF_FORMAT_MS_ADPCM' : 0x0013, + 'SF_FORMAT_AVR' : 0x120000 +} + +# ENDIANESS +SF_ENDIAN = { + 'SF_ENDIAN_BIG' : 0x20000000, + 'SF_ENDIAN_FILE' : 0x00000000, + 'SF_ENDIAN_LITTLE' : 0x10000000, + 'SF_ENDIAN_CPU' : 0x30000000 +} + +# Commands +SF_COMMAND = { + 'SFC_GET_LIB_VERSION' : 0x1000, + 'SFC_CALC_SIGNAL_MAX' : 0x1040, + 'SFC_GET_DITHER_INFO' : 0x10A3, + 'SFC_GET_LOG_INFO' : 0x1001, + 'SFC_GET_FORMAT_SUBTYPE_COUNT' : 0x1032, + 'SFC_FILE_TRUNCATE' : 0x1080, + 'SFC_GET_INSTRUMENT' : 0x10D0, + 'SFC_UPDATE_HEADER_NOW' : 0x1060, + 'SFC_SET_DITHER_ON_WRITE' : 0x10A0, + 'SFC_SET_NORM_DOUBLE' : 0x1012, + 'SFC_GET_CLIPPING' : 0x10C1, + 'SFC_SET_RAW_START_OFFSET' : 0x1090, + 'SFC_CALC_NORM_MAX_ALL_CHANNELS' : 0x1043, + 'SFC_SET_NORM_FLOAT' : 0x1013, + 'SFC_SET_ADD_DITHER_ON_WRITE' : 0x1070, + 'SFC_GET_NORM_FLOAT' : 0x1011, + 'SFC_GET_SIGNAL_MAX' : 0x1044, + 'SFC_GET_MAX_ALL_CHANNELS' : 0x1045, + 'SFC_GET_FORMAT_MAJOR' : 0x1031, + 'SFC_SET_INSTRUMENT' : 0x10D1, + 'SFC_CALC_MAX_ALL_CHANNELS' : 0x1042, + 'SFC_GET_DITHER_INFO_COUNT' : 0x10A2, + 'SFC_SET_BROADCAST_INFO' : 0x10F1, + 'SFC_SET_DITHER_ON_READ' : 0x10A1, + 'SFC_GET_FORMAT_MAJOR_COUNT' : 0x1030, + 'SFC_GET_FORMAT_INFO' : 0x1028, + 'SFC_GET_SIMPLE_FORMAT_COUNT' : 0x1020, + 'SFC_CALC_NORM_SIGNAL_MAX' : 0x1041, + 'SFC_GET_LOOP_INFO' : 0x10E0, + 'SFC_SET_ADD_PEAK_CHUNK' : 0x1050, + 'SFC_SET_ADD_DITHER_ON_READ' : 0x1071, + 'SFC_SET_SCALE_FLOAT_INT_READ' : 0x1014, + 'SFC_GET_FORMAT_SUBTYPE' : 0x1033, + 'SFC_TEST_IEEE_FLOAT_REPLACE' : 0x6001, + 'SFC_SET_UPDATE_HEADER_AUTO' : 0x1061, + 'SFC_GET_SIMPLE_FORMAT' : 0x1021, + 'SFC_SET_CLIPPING' : 0x10C0, + 'SFC_GET_EMBED_FILE_INFO' : 0x10B0, + 'SFC_GET_BROADCAST_INFO' : 0x10F0, + 'SFC_GET_NORM_DOUBLE' : 0x1010 +} + +SF_ERRORS = { + 'SF_ERR_UNRECOGNISED_FORMAT' : 1, + 'SF_ERR_NO_ERROR' : 0, + 'SF_ERR_SYSTEM' : 2, + 'SF_ERR_UNSUPPORTED_ENCODING' : 4, + 'SF_ERR_MALFORMED_FILE' : 3 +} + +# format equivalence: dic used to create internally +# the right enum values from user friendly strings +py_to_snd_encoding_dic = { + 'pcms8' : SF_FORMAT['SF_FORMAT_PCM_S8'], + 'pcm16' : SF_FORMAT['SF_FORMAT_PCM_16'], + 'pcm24' : SF_FORMAT['SF_FORMAT_PCM_24'], + 'pcm32' : SF_FORMAT['SF_FORMAT_PCM_32'], + + 'pcmu8' : SF_FORMAT['SF_FORMAT_PCM_U8'], + + 'float32' : SF_FORMAT['SF_FORMAT_FLOAT'], + 'float64' : SF_FORMAT['SF_FORMAT_DOUBLE'], + + 'ulaw' : SF_FORMAT['SF_FORMAT_ULAW'], + 'alaw' : SF_FORMAT['SF_FORMAT_ALAW'], + 'ima_adpcm' : SF_FORMAT['SF_FORMAT_IMA_ADPCM'], + 'ms_adpcm' : SF_FORMAT['SF_FORMAT_MS_ADPCM'], + + 'gsm610' : SF_FORMAT['SF_FORMAT_GSM610'], + 'vox_adpcm' : SF_FORMAT['SF_FORMAT_VOX_ADPCM'], + + 'g721_32' : SF_FORMAT['SF_FORMAT_G721_32'], + 'g723_24' : SF_FORMAT['SF_FORMAT_G723_24'], + 'g723_40' : SF_FORMAT['SF_FORMAT_G723_40'], + + 'dww12' : SF_FORMAT['SF_FORMAT_DWVW_12'], + 'dww16' : SF_FORMAT['SF_FORMAT_DWVW_16'], + 'dww24' : SF_FORMAT['SF_FORMAT_DWVW_24'], + 'dwwN' : SF_FORMAT['SF_FORMAT_DWVW_N'], + + 'dpcm8' : SF_FORMAT['SF_FORMAT_DPCM_8'], + 'dpcm16': SF_FORMAT['SF_FORMAT_DPCM_16'] +} + +py_to_snd_file_format_dic = { + 'wav' : SF_FORMAT['SF_FORMAT_WAV'], + 'aiff' : SF_FORMAT['SF_FORMAT_AIFF'], + 'au' : SF_FORMAT['SF_FORMAT_AU'], + 'raw' : SF_FORMAT['SF_FORMAT_RAW'], + 'paf' : SF_FORMAT['SF_FORMAT_PAF'], + 'svx' : SF_FORMAT['SF_FORMAT_SVX'], + 'nist' : SF_FORMAT['SF_FORMAT_NIST'], + 'voc' : SF_FORMAT['SF_FORMAT_VOC'], + 'ircam' : SF_FORMAT['SF_FORMAT_IRCAM'], + 'wav64' : SF_FORMAT['SF_FORMAT_W64'], + 'mat4' : SF_FORMAT['SF_FORMAT_MAT4'], + 'mat5' : SF_FORMAT['SF_FORMAT_MAT5'], + 'pvf' : SF_FORMAT['SF_FORMAT_PVF'], + 'xi' : SF_FORMAT['SF_FORMAT_XI'], + 'htk' : SF_FORMAT['SF_FORMAT_HTK'], + 'sds' : SF_FORMAT['SF_FORMAT_SDS'], + 'avr' : SF_FORMAT['SF_FORMAT_AVR'], + 'wavex' : SF_FORMAT['SF_FORMAT_WAVEX'], + 'sd2' : SF_FORMAT['SF_FORMAT_SD2'], + 'flac' : SF_FORMAT['SF_FORMAT_FLAC'], + 'caf' : SF_FORMAT['SF_FORMAT_CAF'] +} + +py_to_snd_endianness_dic = { + 'file' : SF_ENDIAN['SF_ENDIAN_FILE'], + 'little' : SF_ENDIAN['SF_ENDIAN_LITTLE'], + 'big' : SF_ENDIAN['SF_ENDIAN_BIG'], + 'cpu' : SF_ENDIAN['SF_ENDIAN_CPU'] +} + +# Those following dic are used internally to get user-friendly values from +# sndfile enum +SND_TO_PY_ENCODING = \ + dict([(i, j) for j, i in py_to_snd_encoding_dic.items()]) +SND_TO_PY_FILE_FORMAT = \ + dict([(i, j) for j, i in py_to_snd_file_format_dic.items()]) +SND_TO_PY_ENDIANNESS = \ + dict([(i, j) for j, i in py_to_snd_endianness_dic.items()]) + +#========================================== +# Check that libsndfile is expected version +#========================================== +def get_libsndfile_version(): + nverbuff = 256 + verbuff = create_string_buffer(nverbuff) + n = _SND.sf_command(c_int(0), c_int(SF_COMMAND['SFC_GET_LIB_VERSION']), + verbuff, nverbuff) + if n < 1: + raise Exception("Error while getting version of libsndfile") + + # Transform the buffer into a string + ver = "" + for i in range(n): + ver += verbuff[i] + + # Get major, minor and micro from version + version = ver.split('-')[1] + prerelease = 0 + major, minor, micro = [i for i in version.split('.')] + try: + micro = int(micro) + except ValueError,e: + print "micro is " + str(micro) + micro, prerelease = micro.split('pre') + + return int(major), int(minor), int(micro), prerelease + +MAJOR, MINOR, MICRO, PRERELEASE = get_libsndfile_version() +if not(MAJOR == 1): + raise Exception("audiolab expects major version %d of libsndfile" % 1) +if not(MICRO == 17): + if PRERELEASE == 0: + prestr = "No" + else: + prestr = "%s" % PRERELEASE + print "WARNING libsndfile-%d.%d.%d (prerelease: %s) "\ + "this has only been tested with libsndfile 1.0.17 for now, "\ + "use at your own risk !" % (MAJOR, MINOR, MICRO, prestr) + +#================ +# Python wrappers +#================ + +#+++++++++++++++++ +# Public exception +#+++++++++++++++++ +class PyaudioException(Exception): + pass + +class InvalidFormat(PyaudioException): + pass + +class PyaudioIOError(PyaudioException, IOError): + pass + +class WrappingError(PyaudioException): + pass + +class FlacUnsupported(RuntimeError, PyaudioException): + pass + +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# Private classes/function (Should not be used outside this file) +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +class _sf_info(Structure): + """Structure representing C structure SF_INFO""" + _fields_ = [('frames', c_int64), + ('samplerate', c_int), + ('channels', c_int), + ('format', c_int), + ('sections', c_int), + ('seekable', c_int)] + def __str__(self): + return "%d frames, sr = %d Hz, %d channels, format is %d" % \ + (self.frames, self.samplerate, self.channels, self.format) + +class _sf_format_info(Structure): + """Structure representing C structure SF_FORMAT_INFO (useful for + sf_command )""" + _fields_ = [('format', c_int), + ('name', c_char_p), + ('extension', c_char_p)] + def __str__(self): + return "format hex is %#010x, name is %s, extension is %s" % \ + (self.format, self.name, self.extension) + + def __repr__(self): + print self.__str__() + +class _sndfile(Structure): + pass + +sf_info_p = POINTER(_sf_info) +sndfile_p = POINTER(_sndfile) + +# functions args +# TODO: is there a way to ensure that arg1 is the right kind of pointer ? +arg1 = c_char_p +arg2 = c_int +arg3 = sf_info_p +_SND.sf_open.argtypes = [arg1, arg2, arg3] +_SND.sf_open.restype = sndfile_p + +arg1 = sndfile_p +_SND.sf_close.argtypes = [arg1] +_SND.sf_close.restype = c_int + +arg1 = c_int +arg2 = c_int +arg3 = sf_info_p +arg4 = c_int +_SND.sf_open_fd.argtypes = [arg1, arg2, arg3, arg4] +_SND.sf_open_fd.restype = sndfile_p + +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.float64) +arg3 = c_int64 + +# double function +_SND.sf_readf_double.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_double.restype = c_int64 + +_SND.sf_writef_double.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_double.restype = c_int64 + +# float function +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.float32) +arg3 = c_int64 +_SND.sf_readf_float.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_float.restype = c_int64 + +_SND.sf_writef_float.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_float.restype = c_int64 + +# int function +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.int32) +arg3 = c_int64 +_SND.sf_readf_int.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_int.restype = c_int64 + +_SND.sf_writef_int.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_int.restype = c_int64 + +# short function +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.int16) +arg3 = c_int64 +_SND.sf_readf_short.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_short.restype = c_int64 + +_SND.sf_writef_short.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_short.restype = c_int64 + +# Error functions +arg1 = sndfile_p +_SND.sf_strerror.argtypes = [arg1] +_SND.sf_strerror.restype = c_char_p + +# Function to sync data to file +arg1 = sndfile_p +_SND.sf_write_sync.argtypes = [arg1] + +# Function to seek +arg1 = sndfile_p +arg2 = c_int64 +arg3 = c_int +_SND.sf_seek.argtypes = [arg1, arg2, arg3] +_SND.sf_seek.restype = c_int64 + +# To pass when a C function needs a NULL arg +_cNULL = POINTER(c_int)() + +class _format_from_internal: + """Class to handle audio format with sndfile. + + DO NOT USE THIS CLASS OUTSIDE pysndfile.py MODULE: YOU MAY CRASH YOUR + INTERPRETER ! + + Basically, we have 3 classes of parameters: + - the main format: (major format), like wav, aiff, etc... + - the subtype format: pcm, bits resolution + - endianness: little, big, as the cpu, default of the format + + This class encapsulates those parameters, and can build a representation of + them from the format integer of sf_info. This should *NOT* be used, use + format instead, which inherits this class to build a valid format from user + friendly arguments. """ + def __init__(self, format_integer): + # Get the internal values which corresponds to the values libsndfile + # can understand + self._int_type = format_integer & SF_FORMAT['SF_FORMAT_TYPEMASK'] + self._int_encoding = format_integer & SF_FORMAT['SF_FORMAT_SUBMASK'] + self._int_endianness = format_integer & SF_FORMAT['SF_FORMAT_ENDMASK'] + + assert format_integer == self._int_type | self._int_encoding |\ + self._int_endianness + self._format = format_integer + + # Now, we need to test if the combination of format, encoding and + # endianness is valid. sf_format_check needs also samplerate and + # channel information, so just give a fake samplerate and channel + # number. Looking at sndfile.c, it looks like samplerate is never + # actually checked, and that when channels is checked, it is only + # checked against values different than 1 or 2, so giving a value of + # 1 to channel should be ok. + self._sfinfo = _sf_info() + self._sfinfo.channels = 1 + self._sfinfo.samplerate = 8000 + self._sfinfo.format = self._format + + ret = _SND.sf_format_check(pointer(self._sfinfo)) + if ret is not SF_BOOL['SF_TRUE']: + raise InvalidFormat() + + # Get the sndfile string description of the format type + blop = _sf_format_info() + blop.format = self._int_type + st = _SND.sf_command(_cNULL, SF_COMMAND['SFC_GET_FORMAT_INFO'], \ + pointer(blop), sizeof(blop)) + if st is not 0: + if SND_TO_PY_FILE_FORMAT[self._int_type] == 'flac': + raise FlacUnsupported("Flac is not supported by your version"\ + " of libsndfile") + else: + raise WrappingError("Could not get format string for format "\ + "%d, " % blop.format + "please report this problem "\ + "to the maintainer") + + self.format_str = blop.name + + # Get the sndfile string description of the format subtype + blop.format = self._int_encoding + st = _SND.sf_command(_cNULL, SF_COMMAND['SFC_GET_FORMAT_INFO'], \ + pointer(blop), sizeof(blop)) + if st is not 0: + raise WrappingError() + + self.encoding_str = blop.name + + def get_format_raw(self): + """Do not use this function !""" + return self._format + + def get_major_str(self): + """Do not use this function !""" + return self.format_str + + def get_encoding_str(self): + """Do not use this function !""" + return self.encoding_str + + def get_file_format(self): + """return user friendly file format string""" + return SND_TO_PY_FILE_FORMAT[self._int_type] + + def get_encoding(self): + """return user friendly encoding string""" + return SND_TO_PY_ENCODING[self._int_encoding] + + def get_endianness(self): + """return user friendly file format string""" + return SND_TO_PY_ENDIANNESS[self._int_endianness] + + # Various function + def is_type(self, t): + return (self._format & SF_FORMAT['SF_FORMAT_TYPEMASK']) \ + == py_to_snd_file_format_dic[t] + + # Syntactic sugar + def __str__(self): + return "Major Format: %s, Encoding Format: %s" % \ + (self.format_str, self.encoding_str) + + def __repr__(self): + return self.__str__() + +#+++++++++++ +# Public API +#+++++++++++ + +class formatinfo(_format_from_internal): + def __init__(self, type = 'wav', encoding = 'pcm16', endianness = 'file'): + """Build a valid format usable by the sndfile class when opening an + audio file for writing. + + Blah blah + + :Parameters: + type : string + represents the major file format (wav, etc...). + encoding : string + represents the encoding (pcm16, etc..). + endianness : string + represents the endianess. + + Notes + ----- + + Valid type strings are listed by file_format_dic.keys() Valid encoding + strings are listed by encoding_dic.keys() Valid endianness strings are + listed by endianness_dic.keys() """ + # Keep the arguments + self.type = type + self.encoding = encoding + self.endianness = endianness + + # Get the internal values which corresponds to the values libsndfile + # can understand + self._int_type = py_to_snd_file_format_dic[type] + self._int_encoding = py_to_snd_encoding_dic[encoding] + self._int_endianness = py_to_snd_endianness_dic[endianness] + + # Build the internal integer from parameters, and pass it to the super + # class, which will do all the work + format = self._int_type | self._int_encoding | self._int_endianness + + _format_from_internal.__init__(self, format) + +class sndfile: + """Main class to open, read and write audio files""" + def __init__(self, filename, mode = 'read', format = None, channels = 0, \ + samplerate = 0): + """Create an instance of sndfile. + + :Parameters: + filename : string or int + name of the file to open (string), or file descriptor (integer) + mode : string + 'read' for read, 'write' for write, or 'rwrite' for read and + write. + format : formatinfo + when opening a new file for writing, give the format to write + in. + channels : int + number of channels. + samplerate : int + sampling rate. + + :Returns: + sndfile: a valid sndfile object + + Notes + ----- + + format, channels and samplerate need to be given only in the write + modes and for raw files. """ + # Check the mode is one of the expected values + if mode == 'read': + sfmode = SFM['SFM_READ'] + elif mode == 'write': + sfmode = SFM['SFM_WRITE'] + if format == None: + raise Exception("For write mode, you should provide"\ + "a format argument !") + elif mode == 'rwrite': + sfmode = SFM['SFM_RDWR'] + if format == None: + raise Exception("For write mode, you should provide"\ + "a format argument !") + else: + raise Exception("mode %s not recognized" % str(mode)) + + sfinfo = _sf_info() + sfinfo_p = pointer(sfinfo) + + # Fill the sfinfo struct + sfinfo.frames = c_int64(0) + if type(channels) is not int: + print "Warning, channels is converted to int, was %s" % \ + str(type(channels)) + sfinfo.channels = int(channels) + else: + sfinfo.channels = channels + + if type(samplerate) is not int: + print "Warning, sampling rate is converted to int, was %s" % \ + str(type(samplerate)) + sfinfo.samplerate = int(samplerate) + else: + sfinfo.samplerate = samplerate + + sfinfo.sections = 0 + sfinfo.seekable = False + if mode == 'read' and format == None: + sfinfo.format = 0 + else: + if sfinfo.channels > 256 or sfinfo.channels < 1: + msg = "number of channels is %d, expected " \ + "between 1 and 256" % sfinfo.channels + raise RuntimeError(msg) + sfinfo.format = format.get_format_raw() + if not _SND.sf_format_check(sfinfo_p): + msg = "unknown error in format specification ?" +\ + " Please report this to the author" + raise WrappingError() + + sfinfo_p = pointer(sfinfo) + self._sfmode = sfmode + self.hdl = 0 + + if type(filename) == int: + res = _SND.sf_open_fd(filename, self._sfmode, sfinfo_p, + SF_BOOL['SF_FALSE']) + self._byfd = True + self.fd = filename + self.filename = "" + else: + res = _SND.sf_open(filename, self._sfmode, sfinfo_p) + self._byfd = False + self.filename = filename + + try: + # If res is NULL, this statement will raise a ValueError exception + a = res[0] + except ValueError: + if self._byfd: + msg = "error while opening file descriptor %d\n\t->" % self.fd + else: + msg = "error while opening file %s\n\t-> " % self.filename + msg += _SND.sf_strerror(res) + if self._byfd: + msg += """ +(Check that the mode argument passed to sndfile is the same than the one used +when getting the file descriptor, eg do not pass 'read' to sndfile if you +passed 'write' to open to get the file descriptor. If you are on win32, you are +out of luck, because its implementation of POSIX open is broken)""" + raise IOError("error while opening %s\n\t->%s" % (filename, msg)) + + if mode == 'read': + tmp = _format_from_internal(sfinfo.format) + self._format = formatinfo(tmp.get_file_format(), \ + tmp.get_encoding(), tmp.get_endianness()) + else: + self._format = format + + self._sfinfo = sfinfo + self.hdl = res + + if self.get_file_format() == 'flac': + def SeekNotEnabled(self, *args): + raise FlacUnsupported("seek not supported on Flac by default,"\ + " because\n some version of FLAC libraries are buggy."\ + " Read FLAC_SUPPORT.txt") + self.seek = SeekNotEnabled + else: + self.seek = self._seek + + def __del__(self, close_func = _SND.sf_close): + # Stupid python needs the close_func, otherwise + # it may clean ctypes before calling here + if hasattr(self,'hdl'): + if not(self.hdl == 0): + close_func(self.hdl) + self.hdl = 0 + + def close(self): + """close the file.""" + self.__del__() + + def sync(self): + """call the operating system's function to force the writing of all + file cache buffers to disk the file. + + No effect if file is open as read""" + _SND.sf_write_sync(self.hdl) + + def _seek(self, offset, whence = 0, mode = 'rw'): + """similar to python seek function, taking only in account audio data. + + :Parameters: + offset : int + the number of frames (eg two samples for stereo files) to move + relatively to position set by whence. + whence : int + only 0 (beginning), 1 (current) and 2 (end of the file) are + valid. + mode : string + If set to 'rw', both read and write pointers are updated. If + 'r' is given, only read pointer is updated, if 'w', only the + write one is (this may of course make sense only if you open + the file in a certain mode). + + Notes + ----- + + - one only takes into accound audio data. + - if an invalid seek is given (beyond or before the file), a + PyaudioIOError is launched.""" + c_offset = _num2int64(offset) + if mode == 'rw': + # Update both read and write pointers + st = _SND.sf_seek(self.hdl, c_offset, whence) + elif mode == 'r': + whence = whence | SFM['SFM_READ'] + st = _SND.sf_seek(self.hdl, c_offset, whence) + elif mode == 'w': + whence = whence | SFM['SFM_WRITE'] + st = _SND.sf_seek(self.hdl, c_offset, whence) + else: + raise ValueError("mode should be one of 'r', 'w' or 'rw' only") + + if st == -1: + msg = "Error while seeking, libsndfile error is %s" \ + % (_SND.sf_strerror(self.hdl)) + raise PyaudioIOError(msg) + return st + + # Functions to get informations about the file + def get_nframes(self): + """ Return the number of frames of the file""" + if self._sfmode == SFM['SFM_READ']: + # XXX: is this reliable for any file (think pipe and co ?) + return self._sfinfo.frames + else: + # In write/rwrite mode, the only reliable way to get the number of + # frames is to use seek. + raise NotImplementedError("Sorry, getting the current number of" + "frames in write modes is not supported yet") + + def get_samplerate(self): + """ Return the samplerate in Hz of the file""" + return self._sfinfo.samplerate + + def get_channels(self): + """ Return the number of channels of the file""" + return self._sfinfo.channels + + def get_file_format(self): + """return user friendly file format string""" + return SND_TO_PY_FILE_FORMAT[self._format._int_type] + + def get_encoding(self): + """return user friendly encoding string""" + return SND_TO_PY_ENCODING[self._format._int_encoding] + + def get_endianness(self): + """return user friendly file format string""" + return SND_TO_PY_ENDIANNESS[self._format._int_endianness] + + #------------------ + # Functions to read + #------------------ + def read_frames(self, nframes, dtype = N.float64): + """Read nframes frames of the file. + + :Parameters: + nframes : int + number of frames to read. + dtype : numpy dtype + dtype of the returned array containing read data (see note). + + Notes + ----- + + - read_frames updates the read pointer. + - One column is one channel. + - if float are requested when the file contains integer data, you will + get normalized data (that is the max possible integer will be 1.0, + and the minimal possible value -1.0). + - if integers are requested when the file contains floating point data, + it may give wrong results because there is an ambiguity: if the + floating data are normalized, you can get a file with only 0 ! + Getting integer data from files encoded in normalized floating point + is not supported (yet: sndfile supports it).""" + c_nframes = _num2int64(nframes) + if c_nframes < 0: + raise ValueError("number of frames has to be >= 0") + + # XXX: inout argument + if self._sfinfo.channels > 1: + y = N.zeros((nframes, self._sfinfo.channels), dtype) + else: + y = N.zeros(nframes, dtype) + + if dtype == N.float64: + res = _SND.sf_readf_double(self.hdl, y, c_nframes) + elif dtype == N.float32: + res = _SND.sf_readf_float(self.hdl, y, c_nframes) + elif dtype == N.int32: + res = _SND.sf_readf_int(self.hdl, y, c_nframes) + elif dtype == N.int16: + res = _SND.sf_readf_short(self.hdl, y, c_nframes) + else: + RuntimeError("Sorry, only float, double, int and short read " + \ + "supported for now") + + if not(res == nframes): + msg = "Read %d frames, expected to read %d" % (res, nframes) + msg += ", libsndfile last msg is \n\t%s" \ + % _SND.sf_strerror(self.hdl) + raise IOError(msg) + + return y + + #------------------- + # Functions to write + #------------------- + # TODO: Think about overflow vs type of input, etc... + def write_frames(self, input, nframes = -1): + """write data to file. + + :Parameters: + input : ndarray + array containing data to write. + nframes : int + number of frames to write. + + Notes + ----- + + - one channel is one column + - updates the write pointer. + - if float are given when the file contains integer data, you should + put normalized data (that is the range [-1..1] will be written as the + maximum range allowed by the integer bitwidth).""" + # First, get the number of channels and frames from input + if input.ndim == 1: + nc = 1 + else: + if input.ndim > 2: + raise Exception("Expect array of rank <= 2, got %d" \ + % input.ndim) + nc = input.shape[1] + + if nframes == -1: + nframes = N.size(input) + # Number of channels should be the one expected + if not(nc == self._sfinfo.channels): + raise Exception("Expected %d channels, got %d" % \ + (self._sfinfo.channels, nc)) + + # Writing to the file + c_nframes = _num2int64(nframes) + if c_nframes < 0: + raise ValueError("number of frames has to be >= 0") + + input = N.require(input, requirements = 'C') + + if input.dtype == N.float32: + if self._check_overflow(input): + warnings.warn("Warning, overflow detected when writing.") + res = _SND.sf_writef_float(self.hdl, input, c_nframes) + elif input.dtype == N.float64: + self._check_overflow(input) + if self._check_overflow(input): + warnings.warn("Warning, overflow detected when writing.") + res = _SND.sf_writef_double(self.hdl, input, c_nframes) + elif input.dtype == N.int32: + res = _SND.sf_writef_int(self.hdl, input, c_nframes) + elif input.dtype == N.int16: + res = _SND.sf_writef_short(self.hdl, input, c_nframes) + else: + raise Exception("type of input not understood: input should" + " be float64 or float32""") + + if not(res == nframes): + raise IOError("write %d frames, expected to write %d" \ + % res, nframes) + + def _check_overflow(self, data): + if N.max(data ** 2) >= 1.: + return True + return False + + # Syntactic sugar + def __repr__(self): + return self.__str__() + + def __str__(self): + repstr = "----------------------------------------\n" + if self._byfd: + repstr += "File : %d (opened by file descriptor)\n" % self.fd + else: + repstr += "File : %s\n" % self.filename + repstr += "Channels : %d\n" % self._sfinfo.channels + repstr += "Sample rate : %d\n" % self._sfinfo.samplerate + repstr += "Frames : %d\n" % self._sfinfo.frames + repstr += "Raw Format : %#010x -> %s\n" % \ + (self._format.get_format_raw(), self._format.get_major_str()) + repstr += "File format : %s\n" % self.get_file_format() + repstr += "Encoding : %s\n" % self.get_encoding() + repstr += "Endianness : %s\n" % self.get_endianness() + repstr += "Sections : %d\n" % self._sfinfo.sections + if self._sfinfo.seekable: + seek = 'True' + else: + seek = 'False' + repstr += "Seekable : %s\n" % seek + repstr += "Duration : %s\n" % self._generate_duration_str() + return repstr + + def _generate_duration_str(self): + if self._sfinfo.samplerate < 1: + return None + tsec = self._sfinfo.frames / self._sfinfo.samplerate + hrs = tsec / 60 / 60 + tsec = tsec % (60 ** 2) + mins = tsec / 60 + tsec = tsec % 60 + secs = tsec + ms = 1000 * self._sfinfo.frames / self._sfinfo.samplerate % 1000 + + return "%02d:%02d:%02d.%3d" % (hrs, mins, secs, ms) + +def supported_format(): + # XXX: broken + return py_to_snd_file_format_dic.keys() + +def supported_endianness(): + # XXX: broken + return py_to_snd_endianness_dic.keys() + +def supported_encoding(): + # XXX: broken + return py_to_snd_encoding_dic.keys() + +def _num2int64(value): + """ Convert a python objet to a c_int64, safely.""" + if not (type(value) == int or type(value) == long): + value = long(value) + print "Warning, converting %s to long" % str(value) + c_value = c_int64(value) + if not c_value.value == value: + raise RuntimeError("Error while converting %s to a c_int64"\ + ", maybe %s is too big ?" % str(value)) + return c_value diff --git a/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/__init__.py b/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/__init__.py new file mode 100644 index 00000000..7f2fbc0c --- /dev/null +++ b/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/__init__.py @@ -0,0 +1,2 @@ +#! /usr/bin/env python +# Last Change: Mon May 21 12:00 PM 2007 J diff --git a/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/test_matapi.py b/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/test_matapi.py new file mode 100644 index 00000000..fe17b8e9 --- /dev/null +++ b/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/test_matapi.py @@ -0,0 +1,164 @@ +#! /usr/bin/env python +# Last Change: Tue Jul 17 11:00 AM 2007 J +from os.path import join, dirname +from os import remove +from tempfile import mkstemp + +from numpy.testing import * +import numpy as N + +set_package_path() +from audiolab.matapi import wavread, auread, aiffread, sdifread, flacread +from audiolab.matapi import wavwrite, auwrite, aiffwrite, sdifwrite, flacwrite +from audiolab.pysndfile import PyaudioException, sndfile, formatinfo as audio_format +from audiolab.pysndfile import FlacUnsupported +restore_path() + +#Optional: +set_local_path() +# import modules that are located in the same directory as this file. +from testcommon import open_tmp_file, close_tmp_file +restore_path() + +class test_audiolab(NumpyTestCase): + def _test_read(self, func, format, filext): + # Create a tmp audio file, write some random data into it, and check it + # is the expected data when read from a function from the matapi. + rfd, fd, cfilename = open_tmp_file('pysndfiletest.' + filext) + try: + nbuff = 22050 + noise = 0.1 * N.random.randn(nbuff) + + # Open the copy file for writing + b = sndfile(cfilename, 'write', format, 1, nbuff) + b.write_frames(noise, nbuff) + b.close() + + # Reread the data + b = sndfile(cfilename, 'read') + rcnoise = b.read_frames(nbuff) + b.close() + + rnoise = func(cfilename)[0] + + assert_array_equal(rnoise, rcnoise) + finally: + close_tmp_file(rfd, cfilename) + + def test_wavread(self): + """ Check wavread """ + self._test_read(wavread, audio_format('wav', 'pcm16', 'file'), 'wav') + + def test_flacread(self): + """ Check flacread """ + try: + self._test_read(flacread, audio_format('flac', 'pcm16', 'file'), 'flac') + except FlacUnsupported: + print "Flac unsupported, flacread not tested" + + def test_auread(self): + """ Check auread """ + self._test_read(auread, audio_format('au', 'ulaw', 'file'), 'au') + + def test_aiffread(self): + """ Check aiffread """ + self._test_read(aiffread, audio_format('aiff', 'pcm16', 'file'), 'aiff') + + def test_sdifread(self): + """ Check sdifread (ircam format) """ + self._test_read(sdifread, audio_format('ircam', 'pcm16', 'file'), 'sdif') + + def test_bad_wavread(self): + """ Check wavread on bad file""" + # Create a tmp audio file with non wav format, write some random data into it, + # and check it can not be opened by wavread + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nbuff = 22050 + noise = 0.1 * N.random.randn(nbuff) + + # Open the copy file for writing + format = audio_format('aiff', 'pcm16') + b = sndfile(cfilename, 'write', format, 1, nbuff) + + b.write_frames(noise, nbuff) + + b.close() + + b = sndfile(cfilename, 'read') + rcnoise = b.read_frames(nbuff) + b.close() + + try: + rnoise = wavread(cfilename)[0] + raise Exception("wavread on non wav file succeded, expected to fail") + except PyaudioException, e: + pass + #print str(e) + ", as expected" + + finally: + close_tmp_file(rfd, cfilename) + + def _test_write(self, func, format, filext): + """ Check *write functions from matpi """ + rfd1, fd1, cfilename1 = open_tmp_file('pysndfiletest.' + filext) + rfd2, fd2, cfilename2 = open_tmp_file('pysndfiletest.' + filext) + try: + nbuff = 22050 + fs = nbuff + noise = 0.1 * N.random.randn(nbuff) + + # Open the first file for writing with sndfile + b = sndfile(cfilename1, 'write', format, 1, fs) + + b.write_frames(noise, nbuff) + + b.close() + + # Write same data with wavwrite + func(noise, cfilename2, fs) + + # Compare if both files have same hash + f1 = open(cfilename1) + f2 = open(cfilename2) + + import md5 + + m1 = md5.new() + m2 = md5.new() + + m1.update(f1.read()) + m2.update(f2.read()) + + f1.close() + f2.close() + assert m1.hexdigest() == m2.hexdigest() + finally: + close_tmp_file(rfd1, cfilename1) + close_tmp_file(rfd2, cfilename2) + + def test_wavwrite(self): + """ Check wavwrite """ + self._test_write(wavwrite, audio_format('wav', 'pcm16', 'file'), 'wav') + + def test_aiffwrite(self): + """ Check aiffwrite """ + self._test_write(aiffwrite, audio_format('aiff', 'pcm16', 'file'), 'aiff') + + def test_auwrite(self): + """ Check wavwrite """ + self._test_write(auwrite, audio_format('au', 'ulaw', 'file'), 'au') + + def test_sdifwrite(self): + """ Check wavwrite """ + self._test_write(sdifwrite, audio_format('ircam', 'pcm16', 'file'), 'sdif') + + def test_flacwrite(self): + """ Check flacwrite """ + try: + self._test_write(flacwrite, audio_format('flac', 'pcm16', 'file'), 'flac') + except FlacUnsupported: + print "Flac unsupported, flacwrite not tested" + +if __name__ == "__main__": + NumpyTest().run() diff --git a/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/test_pysndfile.py b/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/test_pysndfile.py new file mode 100644 index 00000000..632a4bc8 --- /dev/null +++ b/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/test_pysndfile.py @@ -0,0 +1,396 @@ +#! /usr/bin/env python +# Last Change: Tue Jul 17 11:00 AM 2007 J +"""Test for the sndfile class.""" +from os.path import join, dirname +import os +import sys + +from numpy.testing import NumpyTestCase, assert_array_equal, NumpyTest, \ + assert_array_almost_equal, set_package_path, restore_path, set_local_path +import numpy as N + +set_package_path() +from audiolab import pysndfile +from audiolab.pysndfile import sndfile, formatinfo as audio_format +restore_path() + +set_local_path() +from testcommon import open_tmp_file, close_tmp_file +restore_path() + +# XXX: there is a lot to refactor here +class test_pysndfile(NumpyTestCase): + def test_basic_io(self): + """ Check open, close and basic read/write""" + # dirty ! + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nbuff = 22050 + + # Open the test file for reading + a = sndfile(ofilename, 'read') + nframes = a.get_nframes() + + # Open the copy file for writing + format = audio_format('wav', 'pcm16') + b = sndfile(fd, 'write', format, a.get_channels(), + a.get_samplerate()) + + # Copy the data + for i in range(nframes / nbuff): + tmpa = a.read_frames(nbuff) + assert tmpa.dtype == N.float + b.write_frames(tmpa, nbuff) + nrem = nframes % nbuff + tmpa = a.read_frames(nrem) + assert tmpa.dtype == N.float + b.write_frames(tmpa, nrem) + + a.close() + b.close() + finally: + close_tmp_file(rfd, cfilename) + + + def test_basic_io_fd(self): + """ Check open from fd works""" + # dirty ! + if sys.platform == 'win32': + print "Not testing opening by fd because does not work on win32" + else: + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + fd = os.open(ofilename, os.O_RDONLY) + hdl = sndfile(fd, 'read') + hdl.close() + + def test_raw(self): + rawname = join(dirname(pysndfile.__file__), 'test_data', 'test.raw') + format = audio_format('raw', 'pcm16', 'little') + a = sndfile(rawname, 'read', format, 1, 11025) + assert a.get_nframes() == 11290 + a.close() + + def test_float64(self): + """Check float64 write/read works""" + # dirty ! + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nbuff = 22050 + + # Open the test file for reading + a = sndfile(ofilename, 'read') + nframes = a.get_nframes() + + # Open the copy file for writing + format = audio_format('wav', 'float64') + b = sndfile(fd, 'write', format, a.get_channels(), + a.get_samplerate()) + + # Copy the data in the wav file + for i in range(nframes / nbuff): + tmpa = a.read_frames(nbuff, dtype = N.float64) + assert tmpa.dtype == N.float64 + b.write_frames(tmpa, nbuff) + nrem = nframes % nbuff + tmpa = a.read_frames(nrem) + b.write_frames(tmpa, nrem) + + a.close() + b.close() + + # Now, reopen both files in for reading, and check data are + # the same + a = sndfile(ofilename, 'read') + b = sndfile(cfilename, 'read') + for i in range(nframes / nbuff): + tmpa = a.read_frames(nbuff, dtype = N.float64) + tmpb = b.read_frames(nbuff, dtype = N.float64) + assert_array_equal(tmpa, tmpb) + + a.close() + b.close() + + finally: + close_tmp_file(rfd, cfilename) + + def test_float32(self): + """Check float write/read works""" + # dirty ! + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nbuff = 22050 + + # Open the test file for reading + a = sndfile(ofilename, 'read') + nframes = a.get_nframes() + + # Open the copy file for writing + format = audio_format('wav', 'float32') + b = sndfile(fd, 'write', format, a.get_channels(), + a.get_samplerate()) + + # Copy the data in the wav file + for i in range(nframes / nbuff): + tmpa = a.read_frames(nbuff, dtype = N.float32) + assert tmpa.dtype == N.float32 + b.write_frames(tmpa, nbuff) + nrem = nframes % nbuff + tmpa = a.read_frames(nrem) + b.write_frames(tmpa, nrem) + + a.close() + b.close() + + # Now, reopen both files in for reading, and check data are + # the same + a = sndfile(ofilename, 'read') + b = sndfile(cfilename, 'read') + for i in range(nframes / nbuff): + tmpa = a.read_frames(nbuff, dtype = N.float32) + tmpb = b.read_frames(nbuff, dtype = N.float32) + assert_array_equal(tmpa, tmpb) + + a.close() + b.close() + + finally: + close_tmp_file(rfd, cfilename) + + def test_supported_features(self): + msg = "\nsupported file format are : this test is broken FIXME" + #for i in pysndfile.supported_format(): + # msg += str(i) + ', ' + #print msg + #msg = "supported encoding format are : " + #for i in pysndfile.supported_encoding(): + # msg += str(i) + ', ' + #print msg + #msg = "supported endianness are : " + #for i in pysndfile.supported_endianness(): + # msg += str(i) + ', ' + print msg + + def test_short_io(self): + # TODO: check if neg or pos value is the highest in abs + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nb = 2 ** 14 + nbuff = 22050 + fs = 22050 + a = N.random.random_integers(-nb, nb, nbuff) + a = a.astype(N.short) + + # Open the file for writing + format = audio_format('wav', 'pcm16') + b = sndfile(fd, 'write', format, 1, fs) + + b.write_frames(a, nbuff) + b.close() + + b = sndfile(cfilename, 'read') + + read_a = b.read_frames(nbuff, dtype = N.short) + b.close() + + assert_array_equal(a, read_a) + + finally: + close_tmp_file(rfd, cfilename) + + def test_int_io(self): + # TODO: check if neg or pos value is the highest in abs + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nb = 2 ** 25 + nbuff = 22050 + fs = 22050 + a = N.random.random_integers(-nb, nb, nbuff) + a = a.astype(N.int32) + + # Open the file for writing + format = audio_format('wav', 'pcm32') + b = sndfile(fd, 'write', format, 1, fs) + + b.write_frames(a, nbuff) + b.close() + + b = sndfile(cfilename, 'read') + + read_a = b.read_frames(nbuff, dtype = N.int32) + b.close() + + assert_array_equal(a, read_a) + + finally: + close_tmp_file(rfd, cfilename) + + def test_mismatch(self): + # This test open a file for writing, but with bad args (channels and + # nframes inverted) + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + # Open the file for writing + format = audio_format('wav', 'pcm16') + try: + b = sndfile(fd, 'write', \ + format, channels = 22000, samplerate = 1) + raise Exception("Try to open a file with more than 256 "\ + "channels, this should not succeed !") + except RuntimeError, e: + #print "Gave %d channels, error detected is \"%s\"" % (22000, e) + pass + + finally: + close_tmp_file(rfd, cfilename) + + def test_bigframes(self): + """ Try to seek really far""" + rawname = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + a = sndfile(rawname, 'read') + try: + try: + a.seek(2 ** 60) + raise Exception("Seek really succeded ! This should not happen") + except pysndfile.PyaudioIOError, e: + pass + finally: + a.close() + + def test_float_frames(self): + """ Check nframes can be a float""" + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + # Open the file for writing + format = audio_format('wav', 'pcm16') + a = sndfile(fd, 'rwrite', format, channels = 1, + samplerate = 22050) + tmp = N.random.random_integers(-100, 100, 1000) + tmp = tmp.astype(N.short) + a.write_frames(tmp, tmp.size) + a.seek(0) + a.sync() + ctmp = a.read_frames(1e2, dtype = N.short) + a.close() + + finally: + close_tmp_file(rfd, cfilename) + + def test_nofile(self): + """ Check the failure when opening a non existing file.""" + try: + f = sndfile("floupi.wav", "read") + raise AssertionError("call to non existing file should not succeed") + except IOError: + pass + except Exception, e: + raise AssertionError("opening non existing file should raise a IOError exception, got %s instead" % e.__class__) + +class test_seek(NumpyTestCase): + def test_simple(self): + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + # Open the test file for reading + a = sndfile(ofilename, 'read') + nframes = a.get_nframes() + + buffsize = 1024 + buffsize = min(nframes, buffsize) + + # First, read some frames, go back, and compare buffers + buff = a.read_frames(buffsize) + a.seek(0) + buff2 = a.read_frames(buffsize) + assert_array_equal(buff, buff2) + + a.close() + + # Now, read some frames, go back, and compare buffers + # (check whence == 1 == SEEK_CUR) + a = sndfile(ofilename, 'read') + a.read_frames(buffsize) + buff = a.read_frames(buffsize) + a.seek(-buffsize, 1) + buff2 = a.read_frames(buffsize) + assert_array_equal(buff, buff2) + + a.close() + + # Now, read some frames, go back, and compare buffers + # (check whence == 2 == SEEK_END) + a = sndfile(ofilename, 'read') + buff = a.read_frames(nframes) + a.seek(-buffsize, 2) + buff2 = a.read_frames(buffsize) + assert_array_equal(buff[-buffsize:], buff2) + + def test_rw(self): + """Test read/write pointers for seek.""" + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + rfd, fd, cfilename = open_tmp_file('rwseektest.wav') + try: + ref = sndfile(ofilename, 'read') + test = sndfile(fd, 'rwrite', format = ref._format, channels = + ref.get_channels(), samplerate = ref.get_samplerate()) + n = 1024 + + rbuff = ref.read_frames(n, dtype = N.int16) + test.write_frames(rbuff) + tbuff = test.read_frames(n, dtype = N.int16) + + assert_array_equal(rbuff, tbuff) + + # Test seeking both read and write pointers + test.seek(0, 0) + test.write_frames(rbuff) + tbuff = test.read_frames(n, dtype = N.int16) + assert_array_equal(rbuff, tbuff) + + # Test seeking only read pointer + rbuff1 = rbuff.copy() + rbuff2 = rbuff1 * 2 + 1 + rbuff2.clip(-30000, 30000) + test.seek(0, 0, 'r') + test.write_frames(rbuff2) + tbuff1 = test.read_frames(n, dtype = N.int16) + try: + tbuff2 = test.read_frames(n, dtype = N.int16) + except IOError, e: + msg = "write pointer was updated in read seek !" + msg += "\n(msg is %s)" % e + raise AssertionError(msg) + + assert_array_equal(rbuff1, tbuff1) + assert_array_equal(rbuff2, tbuff2) + if N.all(rbuff2 == tbuff1): + raise AssertionError("write pointer was updated"\ + " in read seek !") + + # Test seeking only write pointer + rbuff3 = rbuff1 * 2 - 1 + rbuff3.clip(-30000, 30000) + test.seek(0, 0, 'rw') + test.seek(n, 0, 'w') + test.write_frames(rbuff3) + tbuff1 = test.read_frames(n, N.int16) + try: + assert_array_equal(tbuff1, rbuff1) + except AssertionError: + raise AssertionError("read pointer was updated in write seek !") + + try: + tbuff3 = test.read_frames(n, N.int16) + except IOError, e: + msg = "read pointer was updated in write seek !" + msg += "\n(msg is %s)" % e + raise AssertionError(msg) + + assert_array_equal(tbuff3, rbuff3) + test.close() + + finally: + close_tmp_file(rfd, cfilename) + +if __name__ == "__main__": + NumpyTest().run() diff --git a/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/testcommon.py b/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/testcommon.py new file mode 100644 index 00000000..dd8c4a42 --- /dev/null +++ b/telemeta/util/audiolab/build/lib/scikits/audiolab/tests/testcommon.py @@ -0,0 +1,20 @@ +import os +from tempfile import mkstemp +import sys + +def open_tmp_file(name): + """On any sane platforms, return a fd on a tmp file. On windows, returns + the filename, and as such, is not secure (someone else can reopen the file + in between).""" + fd, cfilename = mkstemp('pysndfiletest.wav') + if sys.platform == 'win32': + return fd, cfilename, cfilename + else: + return fd, fd, cfilename + +def close_tmp_file(fd, filename): + """On any sane platforms, remove the file . On windows, only close the + file.""" + os.close(fd) + os.remove(filename) + diff --git a/telemeta/util/audiolab/generate.sh b/telemeta/util/audiolab/generate.sh new file mode 100644 index 00000000..e89b0114 --- /dev/null +++ b/telemeta/util/audiolab/generate.sh @@ -0,0 +1,4 @@ +#! /bin/sh +# Last Change: Fri May 25 10:00 AM 2007 J +EPYDOCOPTS="--latex -v --no-private --exclude test_*" +PYTHONPATH=/home/david/local/lib/python2.5/site-packages/ /home/david/local/bin/epydoc $EPYDOCOPTS scikits/pyaudiolab/ diff --git a/telemeta/util/audiolab/generate_const.py b/telemeta/util/audiolab/generate_const.py new file mode 100644 index 00000000..eb174313 --- /dev/null +++ b/telemeta/util/audiolab/generate_const.py @@ -0,0 +1,54 @@ +#! /usr/bin/env python +# Last Change: Thu May 24 02:00 PM 2007 J + +# David Cournapeau 2006 + +# TODO: +# args with the header file to extract info from + +from header_parser import get_dict, put_dict_file + +def generate_enum_dicts(header = '/usr/include/sndfile.h'): + # Open the file and get the content, without trailing '\n' + hdct = [i.split('\n')[0] for i in open(header, 'r').readlines()] + + # Get sf boolean + sf_bool = {} + nameregex = '(SF_FALSE)' + sf = get_dict(hdct, nameregex) + sf_bool['SF_FALSE'] = sf['SF_FALSE'] + nameregex = '(SF_TRUE)' + sf = get_dict(hdct, nameregex) + sf_bool['SF_TRUE'] = sf['SF_TRUE'] + + # Get mode constants + nameregex = '(SFM_[\S]*)' + sfm = get_dict(hdct, nameregex) + + # Get format constants + nameregex = '(SF_FORMAT_[\S]*)' + sf_format = get_dict(hdct, nameregex) + + # Get endianness + nameregex = '(SF_ENDIAN_[\S]*)' + sf_endian = get_dict(hdct, nameregex) + + # Get command constants + nameregex = '(SFC_[\S]*)' + sf_command = get_dict(hdct, nameregex) + + # Get (public) errors + nameregex = '(SF_ERR_[\S]*)' + sf_errors = get_dict(hdct, nameregex) + + # Replace dict: + repdict = { + '%SFM%' : put_dict_file(sfm, 'SFM'), + '%SF_BOOL%' : put_dict_file(sf_bool, 'SF_BOOL'), + '%SF_FORMAT%' : put_dict_file(sf_format, 'SF_FORMAT'), + '%SF_ENDIAN%' : put_dict_file(sf_endian, 'SF_ENDIAN'), + '%SF_COMMAND%' : put_dict_file(sf_command, 'SF_COMMAND'), + '%SF_ERR%' : put_dict_file(sf_errors, 'SF_ERRORS') + } + + return repdict diff --git a/telemeta/util/audiolab/generate_const.pyc b/telemeta/util/audiolab/generate_const.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28f8b90e5f6acf27b857d76604a68a29db580a6d GIT binary patch literal 1321 zcmbVM+iuf95S_JiX_K_27YZ%UK`9Tlka!G;(2G>5NhGK6P^c_7yGbm33Em9?$>yc} z5kJ5;@dGfkYo`(sFWBDk&Y9Vn*R`!x>v6a~kJ!AF3Q!8L=> zf@=#Hw}9L59U&Wd1xB4Jx(2`T>R32aYbd5dc{~^^wSmffVH9r?ghK8k;w)t91o1dr zaN)?9li_$aW@w@XbsQ%+ySHK4F)(Y4p(iK&K45M!lS&MH%S0l)E%ODR51e0wWWT!wd)2>1G3Ix+UG{}B| zG=V=d$Ybc{Ey!Bf#sjSQKv54;NwN{30NFs%8J&CQz01+rk?wA($@Ri^<-SD|wGBp_Ip=3MMZ(W2uhkU)3&pFHsRM zBKb~^{9Rdrk literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/header_parser.py b/telemeta/util/audiolab/header_parser.py new file mode 100644 index 00000000..5640422d --- /dev/null +++ b/telemeta/util/audiolab/header_parser.py @@ -0,0 +1,50 @@ +#! /usr/bin/env python +# Last Change: Thu Nov 02 12:00 PM 2006 J + +# Small module to parse header files, and other tools to use libraries with ctype +# David Cournapeau 2006 + +import re + +def get_dict(content, nameregex, valueregex = '([ABCDEF\dx]*)'): + """Read the content of a header file, parse for a regex nameregex, + and get the corresponding value (HEX values 0x by default) + + This is useful to parse enumerations in header files""" + sf_dict = {} + regex = re.compile(nameregex + '[\s]*= ' + valueregex) + for i in content: + m = regex.search(i) + if m: + sf_dict[m.group(1)] = m.group(2) + return sf_dict + +def put_dict_file(dict, name): + items = dict.items() + string = name + ' = {\n\t' + '\'' + items[0][0] + '\'\t: ' + items[0][1] + for i in range(1, len(items)): + #print "Putting key %s, value %s" % (items[i][0], items[i][1]) + string += ',\n\t\'' + items[i][0] + '\'\t: ' + items[i][1] + string += '\n}' + return string + +# Functions used to substitute values in File. +# Kind of like config.h and autotools +import re +def do_subst_in_file(sourcefile, targetfile, dict): + """Replace all instances of the keys of dict with their values. + For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'}, + then all instances of %VERSION% in the file will be replaced with 1.2345 etc. + """ + #print "sourcefile is %s, target is %s" % (sourcefile, targetfile) + f = open(sourcefile, 'rb') + contents = f.read() + f.close() + + for (k,v) in dict.items(): + contents = re.sub(k, v, contents) + + f = open(targetfile, 'wb') + f.write(contents) + f.close() + diff --git a/telemeta/util/audiolab/header_parser.pyc b/telemeta/util/audiolab/header_parser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36fd4acf5bdad95b94aab3ca1fc46a912afd1c8c GIT binary patch literal 1819 zcmbVMUvC>l5TEtgPVL$R@zAJm3ugVD6HHO`T zi11f*LG%)n3Pm2hQS?$#RHZjC!t%C5O^hCIIqlZ5J^mZN6Z-+C-B(Ya9ULAVpGEWY zorfWxvVl>aEPLhhr(=B;B!$u4Z;pO0r&fPD z*TWkfnNd(A?xAcK@zW%>8vnwYQITkut&TNmfwKY^XDQaxw==Vr@q2Y<&v%|^fFY;> zXRgh$nj6O+VK$wi5XbjnO^}BZ$Doh%teAD#VdW+Dy9NyF`dky56d~n`qa6*RICK)D zv?@5oj^(rqK_V>6{v?~4{xq9r{m5MPgCdHvBpCKfdNB{FAVKZKxK zU2Ulis;f=4p&qD^i{jMRocR?BI1v-wf;r$r$r%uUd4r3;&tnT@UF$XI;Mn|tka1LF zq~HpI+*ZJ?9uo}=i9jhVRR0@5bPn((B3ynaT#7b`HDMK3abg)~{Y1ZRHY{V(L3SvJ zZ>7`N(_r>W>opr4%Oy3JT@N2YGFLh)v!|y=V*CE)$2=Q%mgUQU(CNErtb=ev zb50C4azVO7gC|C^kILlAGqiDGnOfP{L-||}Ps;vfI%G4vUOdV1b_s#PB(o($e3(h7 zWQ(D!UFRTLxtUwsWi_bMTRh4JNXfcE zoC@VW;bcC7p!z0A*Q~UurS4ZYRa?osCYAVivF@{%uOa?D|NTjC?;ybbG>eMFe8q2} N7+RH9yK%Rr{sAe@j;H_t literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits.audiolab.egg-info/PKG-INFO b/telemeta/util/audiolab/scikits.audiolab.egg-info/PKG-INFO new file mode 100644 index 00000000..f3e9e52a --- /dev/null +++ b/telemeta/util/audiolab/scikits.audiolab.egg-info/PKG-INFO @@ -0,0 +1,31 @@ +Metadata-Version: 1.0 +Name: scikits.audiolab +Version: 0.8dev.dev +Summary: A python module to make noise from numpy arrays +Home-page: http://www.ar.media.kyoto-u.ac.jp/members/david/softwares/audiolab +Author: David Cournapeau +Author-email: david@ar.media.kyoto-u.ac.jp +License: LGPL +Download-URL: http://www.ar.media.kyoto-u.ac.jp/members/david/softwares/audiolab +Description: audiolab is a small python package to import data from audio + files to numpy arrays and export data from numpy arrays to audio files. It uses + libsndfile from Erik Castro de Lopo for the underlying IO, which supports many + different audio formats: http://www.mega-nerd.com/libsndfile/ + + For now, the python api for audio IO should be stable; a matlab-like API is + also available for quick read/write (ala wavread, wavwrite, etc...). For 1.0 + release, I hope to add support for simple read/write to soundcard, to be able + to record and listen to data in numpy arrays. + + 2006-2007, David Cournapeau + + LICENSE: audiolab is licensed under the LGPL, as is libsndfile itself. See + COPYING.txt for details. +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Science/Research +Classifier: License :: OSI Approved :: LGPL License +Classifier: Topic :: Multimedia :: Sound/Audio +Classifier: Topic :: Scientific/Engineering diff --git a/telemeta/util/audiolab/scikits.audiolab.egg-info/SOURCES.txt b/telemeta/util/audiolab/scikits.audiolab.egg-info/SOURCES.txt new file mode 100644 index 00000000..a155f472 --- /dev/null +++ b/telemeta/util/audiolab/scikits.audiolab.egg-info/SOURCES.txt @@ -0,0 +1,27 @@ +COPYING.txt +FLAC_SUPPORT.txt +MANIFEST.in +README.txt +generate_const.py +header_parser.py +setup.cfg +setup.py +site.cfg.win32 +scikits/__init__.py +scikits.audiolab.egg-info/PKG-INFO +scikits.audiolab.egg-info/SOURCES.txt +scikits.audiolab.egg-info/dependency_links.txt +scikits.audiolab.egg-info/namespace_packages.txt +scikits.audiolab.egg-info/requires.txt +scikits.audiolab.egg-info/top_level.txt +scikits.audiolab.egg-info/zip-safe +scikits/audiolab/__init__.py +scikits/audiolab/info.py +scikits/audiolab/matapi.py +scikits/audiolab/pyaudioio.py +scikits/audiolab/pysndfile.py +scikits/audiolab/pysndfile.py.in +scikits/audiolab/tests/__init__.py +scikits/audiolab/tests/test_matapi.py +scikits/audiolab/tests/test_pysndfile.py +scikits/audiolab/tests/testcommon.py \ No newline at end of file diff --git a/telemeta/util/audiolab/scikits.audiolab.egg-info/dependency_links.txt b/telemeta/util/audiolab/scikits.audiolab.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/telemeta/util/audiolab/scikits.audiolab.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/telemeta/util/audiolab/scikits.audiolab.egg-info/namespace_packages.txt b/telemeta/util/audiolab/scikits.audiolab.egg-info/namespace_packages.txt new file mode 100644 index 00000000..4fc9b05a --- /dev/null +++ b/telemeta/util/audiolab/scikits.audiolab.egg-info/namespace_packages.txt @@ -0,0 +1 @@ +scikits diff --git a/telemeta/util/audiolab/scikits.audiolab.egg-info/requires.txt b/telemeta/util/audiolab/scikits.audiolab.egg-info/requires.txt new file mode 100644 index 00000000..296d6545 --- /dev/null +++ b/telemeta/util/audiolab/scikits.audiolab.egg-info/requires.txt @@ -0,0 +1 @@ +numpy \ No newline at end of file diff --git a/telemeta/util/audiolab/scikits.audiolab.egg-info/top_level.txt b/telemeta/util/audiolab/scikits.audiolab.egg-info/top_level.txt new file mode 100644 index 00000000..4fc9b05a --- /dev/null +++ b/telemeta/util/audiolab/scikits.audiolab.egg-info/top_level.txt @@ -0,0 +1 @@ +scikits diff --git a/telemeta/util/audiolab/scikits.audiolab.egg-info/zip-safe b/telemeta/util/audiolab/scikits.audiolab.egg-info/zip-safe new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/telemeta/util/audiolab/scikits.audiolab.egg-info/zip-safe @@ -0,0 +1 @@ + diff --git a/telemeta/util/audiolab/scikits/__init__.py b/telemeta/util/audiolab/scikits/__init__.py new file mode 100644 index 00000000..de40ea7c --- /dev/null +++ b/telemeta/util/audiolab/scikits/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/telemeta/util/audiolab/scikits/__init__.pyc b/telemeta/util/audiolab/scikits/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68749afc8c2aa4e6ade605eae86f78cf507ce0ab GIT binary patch literal 217 zcmYLCK?(vf3{2OHEO_wb7ZwEj0TE9gy$D`IZG)EGZp)@Cc=ky?z?b+5UtlVNftk#N zVe)v->eutQv+$cr_Ex|PAp&p!cLiPnRYfSL;Lwy%o(ZM)j015T2TQzfCgolWA^MQw zkP-7-tRvf*fv`7$I2lWM`VAG2*ocNd@lve5#6UX45VfPLHly>gGbhc~w?4C$2fdg2 SRl0HMT8HSyjy6g(3*ZA(LNo6G literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits/audiolab/__init__.py b/telemeta/util/audiolab/scikits/audiolab/__init__.py new file mode 100644 index 00000000..12911595 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/__init__.py @@ -0,0 +1,35 @@ +#! /usr/bin/env python +# Last Change: Mon Sep 10 07:00 PM 2007 J +""" +audiolab: a small toolbox to read, write and play audio to and from +numpy arrays. + +audiolab provides two API: + - one similar to matlab: this gives you wavread, wavwrite functions really + similar to matlab's functions. + - a more complete API, which can be used to read, write to many audio file + (including wav, aiff, flac, au, IRCAM, htk, etc...), with IO capabilities + not available to matlab (seek, append data, etc...) + +It is a thin wrapper around libsndfile from Erik Castro Lopo. + +Copyright (C) 2006-2007 Cournapeau David + +LICENSE: audiolab is licensed under the LGPL, as is libsndfile itself. See +COPYING.txt for details. """ + +from info import VERSION +__version__ = VERSION + +from pysndfile import formatinfo, sndfile +from pysndfile import supported_format, supported_endianness, \ + supported_encoding +#from scikits.audiolab.matapi import wavread, aiffread, flacread, auread, \ +# sdifread, wavwrite, aiffwrite, flacwrite, auwrite, sdifwrite +from matapi import * + +__all__ = filter(lambda s:not s.startswith('_'),dir()) + +from numpy.testing import NumpyTest +def test(): + return NumpyTest().test() diff --git a/telemeta/util/audiolab/scikits/audiolab/__init__.pyc b/telemeta/util/audiolab/scikits/audiolab/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31e6dca19bdd303d1d94a64d4ec91cb84e1acb33 GIT binary patch literal 1595 zcmb_c&2Aev5T2E7+1}WRoBo`NcF;?eKv@Mv&;mhVBv9QzfGZnPP@uXjs9nk;#9b~( zt{efmIj6oyo*>WEL$7^-c80sL(Dc|6;BYWAocZR5eE;Wh{Kr?n|CB+y_UU|1+x$wPLS@vY8Uh#%=SQcVb+C+ZFhroA7=ZY4`6lx`VeM^jcyNC zF}#v@An(Fk0C@yA05|0DI5^yg)m_l{V0Mqp57=UM0{J0Kdog2r*8zw{ohzfo{3!}_ zh0q$kF?w!Z(}`A!ypPvbd5NOTvC?9L;Rb72vaqIz%etsYZmrn3B))Ztl{IUXONaj2 z;ET)A(->(zLQ_g~s!&>3_EQKS0QjYHc%{~KVPk5%7V9>?ST_(Bb(wi(O2@#o-UN5} zZ&%+syfsbQm;wu9C1$3mw4`(h4rR7f*%C8R;#^|wWd3o|0bTha=Y`U;joDLWrm1x0 z731uqP>V$$7g}V**L@sKhA)2Z|bd4Ikilj~{>kh{z8(G_@^7B}I)t3hE+0%Ua3vtAcPQRLRpg zJ|7Lw#?v#Jo_3BHkye>3xtauo5c#FV^Ou+Bl!j~6x6qV#QZEvmN*NC?E`J@3Unc&w z$Az(&OHXlJf~fwY)r)9mJwK>l&L-2*#kfb~3!W#LtZ9Z+xiCTB=H1(2{Rt6QSCz3| z=4oT;Kl_J}Dyu|UO6UCjj})2V7B`_e{=FRf>zT-i1peIVqJYY@J#g!80chr|QU|0`)1I#igv*7EdIisyJHyPcD$ O+xa5;ayRaLPW<0hxuU@U literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/Makefile b/telemeta/util/audiolab/scikits/audiolab/docs/Makefile new file mode 100644 index 00000000..5ea6c555 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/Makefile @@ -0,0 +1,54 @@ +py2tex = PYTHONPATH=/home/david/local/lib/python2.5/site-packages pygmentize -l python -f tex +rst2tex = PYTHONPATH=/home/david/local/lib/python2.5/site-packages rst2newlatex.py \ + --stylesheet-path base.tex --user-stylesheet user.tex + +pytexfiles = audiolab.tex quick1.tex \ + usage1.tex \ + usage2.tex \ + format1.tex \ + format2.tex \ + write1.tex \ + matlab1.tex + +SOURCEPATH = $(PWD) + +EXTTOCLEAN=.chk .dvi .log .aux .bbl .blg .blig .ilg .toc .lof .lot .idx .ind .out .bak .ps .pdf .bm + +audiolab.pdf: $(pytexfiles) + pdflatex $< + pdflatex $< + pdflatex $< + +audiolab.tex: index.txt + $(rst2tex) $< > $@ + +quick1.tex: examples/quick1.py + $(py2tex) $< > $@ + +usage1.tex: examples/usage1.py + $(py2tex) $< > $@ + +usage2.tex: examples/usage2.py + $(py2tex) $< > $@ + +format1.tex: examples/format1.py + $(py2tex) $< > $@ + +format2.tex: examples/format2.py + $(py2tex) $< > $@ + +write1.tex: examples/write1.py + $(py2tex) $< > $@ + +matlab1.tex: examples/matlab1.py + $(py2tex) $< > $@ + +clean: + for i in $(pytexfiles); do \ + rm -f `echo $$i`; \ + done; + for i in $(SOURCEPATH); do \ + for j in $(EXTTOCLEAN); do \ + rm -f `echo $$i/*$$j`; \ + done; \ + done; diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/audiolab1.png b/telemeta/util/audiolab/scikits/audiolab/docs/audiolab1.png new file mode 100644 index 0000000000000000000000000000000000000000..c88e46f5413b0b0fba8e6690696d7c0ed57e76c0 GIT binary patch literal 19591 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 LtDnm{r-UW|a>zf3 literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/base.tex b/telemeta/util/audiolab/scikits/audiolab/docs/base.tex new file mode 100644 index 00000000..b10ea72c --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/base.tex @@ -0,0 +1,1182 @@ +% System stylesheet for the new LaTeX writer, newlatex2e. + +% Major parts of the rendering are done in this stylesheet and not in the +% Python module. + +% For development notes, see notes.txt. + +% User documentation (in the stylesheet for now; that may change though): + +% Naming conventions: +% All uppercase letters in macro names have a specific meaning. +% \D...: All macros introduced by the Docutils LaTeX writer start with "D". +% \DS: Setup function (called at the bottom of this stylesheet). +% \DN{}: Handler for Docutils document tree node `node`; called by +% the Python module. +% \DEV: External variable, set by the Python module. +% \DEC: External command. It is called by the Python module and must be +% defined in this stylesheet. +% \DNA{}{}{}{}{}: +% Attribute handler for `attribute` set on nodes of type `nodename`. +% See below for a discussion of attribute handlers. +% \DA{}{}{}{}{}: +% Attribute handler for all `attribute`. Called only when no specific +% \DNA handler is defined. +% \DNC{}: +% Handler for `class`, when set on nodes of type `nodename`. +% \DC{}: +% Handler for `class`. Called only when no specific \DNC +% handler is defined. +% \D: Generic variable or function. + +% Attribute handlers: +% TODO + +% --------------------------------------------------------------------------- + +% Having to intersperse code with \makeatletter-\makeatother pairs is very +% annoying, so we call \makeatletter at the top and \makeatother at the +% bottom. Just be aware that you cannot use "@" as a text character inside +% this stylesheet. +\makeatletter + +% Print-mode (as opposed to online mode e.g. with Adobe Reader). +% This causes for example blue hyperlinks. +\providecommand{\Dprinting}{false} + +% \DSearly is called right after \documentclass. +\providecommand{\DSearly}{} +% \DSlate is called at the end of the stylesheet (right before the document +% tree). +\providecommand{\DSlate}{} + +% Use the KOMA script article class. +\providecommand{\Ddocumentclass}{scrartcl} +\providecommand{\Ddocumentoptions}{a4paper} +\providecommand{\DSdocumentclass}{ + \documentclass[\Ddocumentoptions]{\Ddocumentclass} } + +% Todo: This should be movable to the bottom, but it isn't as long as +% we use \usepackage commands at the top level of this stylesheet +% (which we shouldn't). +\DSdocumentclass + +\providecommand{\DSpackages}{ + % Load miscellaneous packages. + % Note 1: Many of the packages loaded here are used throughout this stylesheet. + % If one of these packages does not work on your system or in your scenario, + % please let us know, so we can consider making the package optional. + % Note 2: It would appear cleaner to load packages where they are used. + % However, since using a wrong package loading order can lead to *very* + % subtle bugs, we centralize the loading of most packages here. + \DSfontencoding % load font encoding packages + \DSlanguage % load babel + % Using \ifthenelse conditionals. + \usepackage{ifthen} % before hyperref (really!) + % There is not support for *not* using hyperref because it's used in many + % places. If this is a problem (e.g. because hyperref doesn't work on your + % system), please let us know. + \usepackage[colorlinks=false,pdfborder={0 0 0}]{hyperref} + % Get color, e.g. for links and system messages. + \usepackage{color} + % Get \textnhtt macro (non-hyphenating type writer). + \usepackage{hyphenat} + % For sidebars. + \usepackage{picins} + % We use longtable to create tables. + \usepackage{longtable} + % Images. + \usepackage{graphicx} + % These packages might be useful (some just add magic pixie dust), so + % evaluate them: + %\usepackage{fixmath} + %\usepackage{amsmath} + % Add some missing symbols like \textonehalf. + \usepackage{textcomp} +} + +\providecommand{\DSfontencoding}{ + % Set up font encoding. Called by \DSpackages. + % AE is a T1 emulation. It provides mostly the same characters and + % features as T1-encoded fonts but doesn't use bitmap fonts (which are + % unsuitable for online reading and subtle for printers). + \usepackage{ae} + % Provide the characters not contained in AE from EC bitmap fonts. + \usepackage{aecompl} + % Guillemets ("<<", ">>") in AE. + \usepackage{aeguill} +} + +\providecommand{\DSsymbols}{% + % Fix up symbols. + % The Euro symbol in Computer Modern looks, um, funny. Let's get a + % proper Euro symbol. + \usepackage{eurosym}% + \renewcommand{\texteuro}{\euro}% +} + +% Taken from +% +% and modified. Used with permission. +\providecommand{\Dprovidelength}[2]{% + \begingroup% + \escapechar\m@ne% + \xdef\@gtempa{{\string#1}}% + \endgroup% + \expandafter\@ifundefined\@gtempa% + {\newlength{#1}\setlength{#1}{#2}}% + {}% +} + +\providecommand{\Dprovidecounter}[2]{% + % Like \newcounter except that it doesn't crash if the counter + % already exists. + \@ifundefined{c@#1}{\newcounter{#1}\setcounter{#1}{#2}}{} +} + +\Dprovidelength{\Dboxparindent}{\parindent} + +\providecommand{\Dmakebox}[1]{% + % Make a centered, frameless box. Useful e.g. for block quotes. + % Do not use minipages here, but create pseudo-lists to allow + % page-breaking. (Don't use KOMA-script's addmargin environment + % because it messes up bullet lists.) + \Dmakelistenvironment{}{}{% + \setlength{\parskip}{0pt}% + \setlength{\parindent}{\Dboxparindent}% + \item{#1}% + }% +} + +\providecommand{\Dmakefbox}[1]{% + % Make a centered, framed box. Useful e.g. for admonitions. + \vspace{0.4\baselineskip}% + \begin{center}% + \fbox{% + \begin{minipage}[t]{0.9\linewidth}% + \setlength{\parindent}{\Dboxparindent}% + #1% + \end{minipage}% + }% + \end{center}% + \vspace{0.4\baselineskip}% +} + +% We do not currently recognize the difference between an end-sentence and a +% mid-sentence period (". " vs. ". " in plain text). So \frenchspacing is +% appropriate. +\providecommand{\DSfrenchspacing}{\frenchspacing} + + +\Dprovidelength{\Dblocklevelvspace}{% + % Space between block-level elements other than paragraphs. + 0.7\baselineskip plus 0.3\baselineskip minus 0.2\baselineskip% +} +\providecommand{\DECauxiliaryspace}{% + \ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}% + \par\noindent% +} +\providecommand{\DECparagraphspace}{\par} +\providecommand{\Dneedvspace}{true} + +\providecommand{\DSlanguage}{% + % Set up babel. + \usepackage[\DEVlanguagebabel]{babel} +} + +\providecommand{\Difdefined}[3]{\@ifundefined{#1}{#3}{#2}} + +% Handler for 'classes' attribute (called for each class attribute). +\providecommand{\DAclasses}[5]{% + % Dispatch to \DNC. + \Difdefined{DN#4C#3}{% + % Pass only contents, nothing else! + \csname DN#4C#3\endcsname{#5}% + }{% + % Otherwise, dispatch to \DC. + \Difdefined{DC#3}{% + \csname DC#3\endcsname{#5}% + }{% + #5% + }% + }% +} + +\providecommand{\DECattr}[5]{% + % Global attribute dispatcher, called inside the document tree. + % Parameters: + % 1. Attribute number. + % 2. Attribute name. + % 3. Attribute value. + % 4. Node name. + % 5. Node contents. + \Difdefined{DN#4A#2}{% + % Dispatch to \DNA. + \csname DN#4A#2\endcsname{#1}{#2}{#3}{#4}{#5}% + }{\Difdefined{DA#2}{% + % Otherwise dispatch to \DA. + \csname DA#2\endcsname{#1}{#2}{#3}{#4}{#5}% + }{% + % Otherwise simply run the contents without calling a handler. + #5% + }}% +} + +% ---------- Link handling ---------- +% Targets and references. + +\providecommand{\Draisedlink}[1]{% + % Anchors are placed on the base line by default. This is a bad thing for + % inline context, so we raise the anchor (normally by \baselineskip). + \Hy@raisedlink{#1}% +} + +% References. +% We're assuming here that the "refid" and "refuri" attributes occur +% only in inline context (in TextElements). +\providecommand{\DArefid}[5]{% + \ifthenelse{\equal{#4}{reference}}{% + \Dexplicitreference{\##3}{#5}% + }{% + % If this is not a target node (targets with refids are + % uninteresting and should be silently dropped). + \ifthenelse{\not\equal{#4}{target}}{% + % If this is a footnote reference, call special macro. + \ifthenelse{\equal{#4}{footnotereference}}{% + \Dimplicitfootnotereference{\##3}{#5}% + }{% + \ifthenelse{\equal{#4}{citationreference}}{% + \Dimplicitcitationreference{\##3}{#5}% + }{% + \Dimplicitreference{\##3}{#5}% + }% + }% + }{}% + }% +} +\providecommand{\DArefuri}[5]{% + \ifthenelse{\equal{#4}{target}}{% + % The node name is 'target', so this is a hyperlink target, like this: + % .. _mytarget: URI + % Hyperlink targets are ignored because they are invisible. + }{% + % If a non-target node has a refuri attribute, it must be an explicit URI + % reference (i.e. node name is 'reference'). + \Durireference{#3}{#5}% + }% +} +% Targets. +\providecommand{\DAids}[5]{% + \label{#3}% + \ifthenelse{\equal{#4}{footnotereference}}{% + {% + \renewcommand{\HyperRaiseLinkDefault}{% + % Dirty hack to make backrefs to footnote references work. + % For some reason, \baselineskip is 0pt in fn references. + 0.5\Doriginalbaselineskip% + }% + \Draisedlink{\hypertarget{#3}{}}#5% + }% + }{% + \Draisedlink{\hypertarget{#3}{}}#5% + }% +} +\providecommand{\Dimplicitreference}[2]{% + % Create implicit reference to ID. Implicit references occur + % e.g. in TOC-backlinks of section titles. Parameters: + % 1. Target. + % 2. Link text. + \href{#1}{#2}% +} +\providecommand{\Dimplicitfootnotereference}[2]{% + % Ditto, but for the special case of footnotes. + % We want them to be rendered like explicit references. + \Dexplicitreference{#1}{#2}% +} +\providecommand{\Dimplicitcitationreference}[2]{% + % Ditto for citation references. + \Dimplicitfootnotereference{#1}{#2}% +} +\providecommand{\Dcolorexplicitreference}{% + \ifthenelse{\equal{\Dprinting}{true}}{\color{black}}{\color{blue}}% +} +\providecommand{\Dexplicitreference}[2]{% + % Create explicit reference to ID, e.g. created with "foo_". + % Parameters: + % 1. Target. + % 2. Link text. + \href{#1}{{\Dcolorexplicitreference#2}}% +} +\providecommand{\Dcolorurireference}{\Dcolorexplicitreference} +\providecommand{\Durireference}[2]{% + % Create reference to URI. Parameters: + % 1. Target. + % 2. Link text. + \href{#1}{{\Dcolorurireference#2}}% +} + +\Dprovidecounter{Dpdfbookmarkid}{0}% +\providecommand{\Dpdfbookmark}[1]{% + % Temporarily decrement Desctionlevel counter. + \addtocounter{Dsectionlevel}{-1}% + %\typeout{\arabic{Dsectionlevel}}% + %\typeout{#1}% + %\typeout{docutils\roman{Dpdfbookmarkid}}% + %\typeout{}% + \pdfbookmark[\arabic{Dsectionlevel}]{#1}{docutils\arabic{Dpdfbookmarkid}}% + \addtocounter{Dsectionlevel}{1}% + \addtocounter{Dpdfbookmarkid}{1}% +} +% ---------- End of Link Handling ---------- + +\providecommand{\DNparagraph}[1]{% + \ifthenelse{\equal{\DEVparagraphindented}{true}}{\indent}{\noindent}% + #1% +} +\providecommand{\Dformatboxtitle}[1]{{\Large\textbf{#1}}} +\providecommand{\Dformatboxsubtitle}[1]{{\large\textbf{#1}}} +\providecommand{\Dtopictitle}[1]{% + \Difinsidetoc{\vspace{1em}\par}{}% + \noindent\Dformatboxtitle{#1}% + \ifthenelse{\equal{\DEVhassubtitle}{false}}{\vspace{1em}}{\vspace{0.5em}}% + \par% +} +\providecommand{\Dadmonitiontitle}[1]{% + \Dtopictitle{#1}% +} +\providecommand{\Dtopicsubtitle}[1]{% + \noindent\Dformatboxsubtitle{#1}% + \vspace{1em}% + \par% +} +\providecommand{\Dsidebartitle}[1]{\Dtopictitle{#1}} +\providecommand{\Dsidebarsubtitle}[1]{\Dtopicsubtitle{#1}} +\providecommand{\Ddocumenttitle}[1]{% + \begin{center}{\Huge#1}\end{center}% + \ifthenelse{\equal{\DEVhassubtitle}{true}}{\vspace{0.1cm}}{\vspace{1cm}}% +} +\providecommand{\Ddocumentsubtitle}[1]{% + \begin{center}{\huge#1}\end{center}% + \vspace{1cm}% +} +% Can be overwritten by user stylesheet. +\providecommand{\Dformatsectiontitle}[1]{#1} +\providecommand{\Dformatsectionsubtitle}[1]{\Dformatsectiontitle{#1}} +\providecommand{\Dbookmarksectiontitle}[1]{% + % Return text suitable for use in \section*, \subsection*, etc., + % containing a PDF bookmark. Parameter: The title (as node tree). + \Draisedlink{\Dpdfbookmark{\DEVtitleastext}}% + #1% +} +\providecommand{\Dsectiontitlehook}[1]{#1} +\providecommand{\Dsectiontitle}[1]{% + \Dsectiontitlehook{% + \Ddispatchsectiontitle{\Dbookmarksectiontitle{\Dformatsectiontitle{#1}}}% + }% +} +\providecommand{\Ddispatchsectiontitle}[1]{% + \@ifundefined{Dsectiontitle\roman{Dsectionlevel}}{% + \Ddeepsectiontitle{#1}% + }{% + \csname Dsectiontitle\roman{Dsectionlevel}\endcsname{#1}% + }% +} +\providecommand{\Ddispatchsectionsubtitle}[1]{% + \Ddispatchsectiontitle{#1}% +} +\providecommand{\Dsectiontitlei}[1]{\section*{#1}} +\providecommand{\Dsectiontitleii}[1]{\subsection*{#1}} +\providecommand{\Ddeepsectiontitle}[1]{% + % Anything below \subsubsection (like \paragraph or \subparagraph) + % is useless because it uses the same font. The only way to + % (visually) distinguish such deeply nested sections is to use + % section numbering. + \subsubsection*{#1}% +} +\providecommand{\Dsectionsubtitlehook}[1]{#1} +\Dprovidelength{\Dsectionsubtitleraisedistance}{0.7em} +\providecommand{\Dsectionsubtitlescaling}{0.85} +\providecommand{\Dsectionsubtitle}[1]{% + \Dsectionsubtitlehook{% + % Move the subtitle nearer to the title. + \vspace{-\Dsectionsubtitleraisedistance}% + % Don't create a PDF bookmark. + \Ddispatchsectionsubtitle{% + \Dformatsectionsubtitle{\scalebox{\Dsectionsubtitlescaling}{#1}}% + }% + }% +} +\providecommand{\DNtitle}[1]{% + % Dispatch to \Dtitle. + \csname D\DEVparent title\endcsname{#1}% +} +\providecommand{\DNsubtitle}[1]{% + % Dispatch to \Dsubtitle. + \csname D\DEVparent subtitle\endcsname{#1}% +} + +\providecommand{\DNliteralblock}[1]{% + \Dmakelistenvironment{}{% + \ifthenelse{\equal{\Dinsidetabular}{true}}{% + \setlength{\leftmargin}{0pt}% + }{}% + \setlength{\rightmargin}{0pt}% + }{% + \raggedright\item\noindent\nohyphens{\textnhtt{#1\Dfinalstrut}}% + }% +} +\providecommand{\DNdoctestblock}[1]{\DNliteralblock{#1}} +\providecommand{\DNliteral}[1]{\textnhtt{#1}} +\providecommand{\DNemphasis}[1]{\emph{#1}} +\providecommand{\DNstrong}[1]{\textbf{#1}} +\providecommand{\DECvisitdocument}{\begin{document}\noindent} +\providecommand{\DECdepartdocument}{\end{document}} +\providecommand{\DNtopic}[1]{% + \ifthenelse{\equal{\DEVcurrentNtopicAcontents}{1}}{% + \addtocounter{Dtoclevel}{1}% + \par\noindent% + #1% + \addtocounter{Dtoclevel}{-1}% + }{% + \par\noindent% + \Dmakebox{#1}% + }% +} +\providecommand{\DNadmonition}[1]{% + \DNtopic{#1}% +} +\providecommand{\Dformatrubric}[1]{\textbf{#1}} +\Dprovidelength{\Dprerubricspace}{0.3em} +\providecommand{\DNrubric}[1]{% + \vspace{\Dprerubricspace}\par\noindent\Dformatrubric{#1}\par% +} + +\providecommand{\Dbullet}{} +\providecommand{\DECsetbullet}[1]{\renewcommand{\Dbullet}{#1}} +\providecommand{\DNbulletlist}[1]{% + \Difinsidetoc{% + \Dtocbulletlist{#1}% + }{% + \Dmakelistenvironment{\Dbullet}{}{#1}% + }% +} +% Todo: So what on earth is @pnumwidth? +\renewcommand{\@pnumwidth}{2.2em} +\providecommand{\DNlistitem}[1]{% + \Difinsidetoc{% + \ifthenelse{\equal{\theDtoclevel}{1}\and\equal{\Dlocaltoc}{false}}{% + {% + \par\addvspace{1em}\noindent% + \sectfont% + #1\hfill\pageref{\DEVcurrentNlistitemAtocrefid}% + }% + }{% + \@dottedtocline{0}{\Dtocindent}{0em}{#1}{% + \pageref{\DEVcurrentNlistitemAtocrefid}% + }% + }% + }{% + \item{#1}% + }% +} +\providecommand{\DNenumeratedlist}[1]{#1} +\Dprovidecounter{Dsectionlevel}{0} +\providecommand{\Dvisitsectionhook}{} +\providecommand{\Ddepartsectionhook}{} +\providecommand{\DECvisitsection}{% + \addtocounter{Dsectionlevel}{1}% + \Dvisitsectionhook% +} +\providecommand{\DECdepartsection}{% + \Ddepartsectionhook% + \addtocounter{Dsectionlevel}{-1}% +} + +% Using \_ will cause hyphenation after _ even in \textnhtt-typewriter +% because the hyphenat package redefines \_. So we use +% \textunderscore here. +\providecommand{\DECtextunderscore}{\textunderscore} + +\providecommand{\Dtextinlineliteralfirstspace}{{ }} +\providecommand{\Dtextinlineliteralsecondspace}{{~}} + +\Dprovidelength{\Dlistspacing}{0.8\baselineskip} + +\providecommand{\Dsetlistrightmargin}{% + \ifthenelse{\lengthtest{\linewidth>12em}}{% + % Equal margins. + \setlength{\rightmargin}{\leftmargin}% + }{% + % If the line is narrower than 10em, we don't remove any further + % space from the right. + \setlength{\rightmargin}{0pt}% + }% +} +\providecommand{\Dresetlistdepth}{false} +\Dprovidelength{\Doriginallabelsep}{\labelsep} +\providecommand{\Dmakelistenvironment}[3]{% + % Make list environment with support for unlimited nesting and with + % reasonable default lengths. Parameters: + % 1. Label (same as in list environment). + % 2. Spacing (same as in list environment). + % 3. List contents (contents of list environment). + \ifthenelse{\equal{\Dinsidetabular}{true}}{% + % Unfortunately, vertical spacing doesn't work correctly when + % using lists inside tabular environments, so we use a minipage. + \begin{minipage}[t]{\linewidth}% + }{}% + {% + \renewcommand{\Dneedvspace}{false}% + % \parsep0.5\baselineskip + \renewcommand{\Dresetlistdepth}{false}% + \ifnum \@listdepth>5% + \protect\renewcommand{\Dresetlistdepth}{true}% + \@listdepth=5% + \fi% + \begin{list}{% + #1% + }{% + \setlength{\itemsep}{0pt}% + \setlength{\partopsep}{0pt}% + \setlength{\topsep}{0pt}% + % List should take 90% of total width. + \setlength{\leftmargin}{0.05\linewidth}% + \ifthenelse{\lengthtest{\leftmargin<1.8em}}{% + \setlength{\leftmargin}{1.8em}% + }{}% + \setlength{\labelsep}{\Doriginallabelsep}% + \Dsetlistrightmargin% + #2% + }{% + #3% + }% + \end{list}% + \ifthenelse{\equal{\Dresetlistdepth}{true}}{\@listdepth=5}{}% + }% + \ifthenelse{\equal{\Dinsidetabular}{true}}{\end{minipage}}{}% +} +\providecommand{\Dfinalstrut}{\@finalstrut\@arstrutbox} +\providecommand{\DAlastitem}[5]{#5\Dfinalstrut} + +\Dprovidelength{\Ditemsep}{0pt} +\providecommand{\DECmakeenumeratedlist}[6]{% + % Make enumerated list. + % Parameters: + % - prefix + % - type (\arabic, \roman, ...) + % - suffix + % - suggested counter name + % - start number - 1 + % - list contents + \newcounter{#4}% + \Dmakelistenvironment{#1#2{#4}#3}{% + % Use as much space as needed for the label. + \setlength{\labelwidth}{10em}% + % Reserve enough space so that the label doesn't go beyond the + % left margin of preceding paragraphs. Like that: + % + % A paragraph. + % + % 1. First item. + \setlength{\leftmargin}{2.5em}% + \Dsetlistrightmargin% + \setlength{\itemsep}{\Ditemsep}% + % Use counter recommended by Python module. + \usecounter{#4}% + % Set start value. + \addtocounter{#4}{#5}% + }{% + % The list contents. + #6% + }% +} + + +% Single quote in literal mode. \textquotesingle from package +% textcomp has wrong width when using package ae, so we use a normal +% single curly quote here. +\providecommand{\DECtextliteralsinglequote}{'} + + +% "Tabular lists" are field lists and options lists (not definition +% lists because there the term always appears on its own line). We'll +% use the terminology of field lists now ("field", "field name", +% "field body"), but the same is also analogously applicable to option +% lists. +% +% We want these lists to be breakable across pages. We cannot +% automatically get the narrowest possible size for the left column +% (i.e. the field names or option groups) because tabularx does not +% support multi-page tables, ltxtable needs to have the table in an +% external file and we don't want to clutter the user's directories +% with auxiliary files created by the filecontents environment, and +% ltablex is not included in teTeX. +% +% Thus we set a fixed length for the left column and use list +% environments. This also has the nice side effect that breaking is +% now possible anywhere, not just between fields. +% +% Note that we are creating a distinct list environment for each +% field. There is no macro for a whole tabular list! +\Dprovidelength{\Dtabularlistfieldnamewidth}{6em} +\Dprovidelength{\Dtabularlistfieldnamesep}{0.5em} +\providecommand{\Dinsidetabular}{false} +\providecommand{\Dsavefieldname}{} +\providecommand{\Dsavefieldbody}{} +\Dprovidelength{\Dusedfieldnamewidth}{0pt} +\Dprovidelength{\Drealfieldnamewidth}{0pt} +\providecommand{\Dtabularlistfieldname}[1]{\renewcommand{\Dsavefieldname}{#1}} +\providecommand{\Dtabularlistfieldbody}[1]{\renewcommand{\Dsavefieldbody}{#1}} +\Dprovidelength{\Dparskiptemp}{0pt} +\providecommand{\Dtabularlistfield}[1]{% + {% + % This only saves field name and field body in \Dsavefieldname and + % \Dsavefieldbody, resp. It does not insert any text into the + % document. + #1% + % Recalculate the real field name width everytime we encounter a + % tabular list field because it may have been changed using a + % "raw" node. + \setlength{\Drealfieldnamewidth}{\Dtabularlistfieldnamewidth}% + \addtolength{\Drealfieldnamewidth}{\Dtabularlistfieldnamesep}% + \Dmakelistenvironment{% + \makebox[\Drealfieldnamewidth][l]{\Dsavefieldname}% + }{% + \setlength{\labelwidth}{\Drealfieldnamewidth}% + \setlength{\leftmargin}{\Drealfieldnamewidth}% + \setlength{\rightmargin}{0pt}% + \setlength{\labelsep}{0pt}% + }{% + \item% + \settowidth{\Dusedfieldnamewidth}{\Dsavefieldname}% + \setlength{\Dparskiptemp}{\parskip}% + \ifthenelse{% + \lengthtest{\Dusedfieldnamewidth>\Dtabularlistfieldnamewidth}% + }{% + \mbox{}\par% + \setlength{\parskip}{0pt}% + }{}% + \Dsavefieldbody% + \setlength{\parskip}{\Dparskiptemp}% + %XXX Why did we need this? + %\@finalstrut\@arstrutbox% + }% + \par% + }% +} + +\providecommand{\Dformatfieldname}[1]{\textbf{#1:}} +\providecommand{\DNfieldlist}[1]{#1} +\providecommand{\DNfield}[1]{\Dtabularlistfield{#1}} +\providecommand{\DNfieldname}[1]{% + \Dtabularlistfieldname{% + \Dformatfieldname{#1}% + }% +} +\providecommand{\DNfieldbody}[1]{\Dtabularlistfieldbody{#1}} + +\providecommand{\Dformatoptiongroup}[1]{% + % Format option group, e.g. "-f file, --input file". + \texttt{#1}% +} +\providecommand{\Dformatoption}[1]{% + % Format option, e.g. "-f file". + % Put into mbox to avoid line-breaking at spaces. + \mbox{#1}% +} +\providecommand{\Dformatoptionstring}[1]{% + % Format option string, e.g. "-f". + #1% +} +\providecommand{\Dformatoptionargument}[1]{% + % Format option argument, e.g. "file". + \textsl{#1}% +} +\providecommand{\Dformatoptiondescription}[1]{% + % Format option description, e.g. + % "\DNparagraph{Read input data from file.}" + #1% +} +\providecommand{\DNoptionlist}[1]{#1} +\providecommand{\Doptiongroupjoiner}{,{ }} +\providecommand{\Disfirstoption}{% + % Auxiliary macro indicating if a given option is the first child + % of its option group (if it's not, it has to preceded by + % \Doptiongroupjoiner). + false% +} +\providecommand{\DNoptionlistitem}[1]{% + \Dtabularlistfield{#1}% +} +\providecommand{\DNoptiongroup}[1]{% + \renewcommand{\Disfirstoption}{true}% + \Dtabularlistfieldname{\Dformatoptiongroup{#1}}% +} +\providecommand{\DNoption}[1]{% + % If this is not the first option in this option group, add a + % joiner. + \ifthenelse{\equal{\Disfirstoption}{true}}{% + \renewcommand{\Disfirstoption}{false}% + }{% + \Doptiongroupjoiner% + }% + \Dformatoption{#1}% +} +\providecommand{\DNoptionstring}[1]{\Dformatoptionstring{#1}} +\providecommand{\DNoptionargument}[1]{{ }\Dformatoptionargument{#1}} +\providecommand{\DNdescription}[1]{% + \Dtabularlistfieldbody{\Dformatoptiondescription{#1}}% +} + +\providecommand{\DNdefinitionlist}[1]{% + \begin{description}% + \parskip0pt% + #1% + \end{description}% +} +\providecommand{\DNdefinitionlistitem}[1]{% + % LaTeX expects the label in square brackets; we provide an empty + % label. + \item[]#1% +} +\providecommand{\Dformatterm}[1]{#1} +\providecommand{\DNterm}[1]{\hspace{-5pt}\Dformatterm{#1}} +% I'm still not sure what's the best rendering for classifiers. The +% colon syntax is used by reStructuredText, so it's at least WYSIWYG. +% Use slanted text because italic would cause too much emphasis. +\providecommand{\Dformatclassifier}[1]{\textsl{#1}} +\providecommand{\DNclassifier}[1]{~:~\Dformatclassifier{#1}} +\providecommand{\Dformatdefinition}[1]{#1} +\providecommand{\DNdefinition}[1]{\par\Dformatdefinition{#1}} + +\providecommand{\Dlineblockindentation}{2.5em} +\providecommand{\DNlineblock}[1]{% + \Dmakelistenvironment{}{% + \ifthenelse{\equal{\DEVparent}{lineblock}}{% + % Parent is a line block, so indent. + \setlength{\leftmargin}{\Dlineblockindentation}% + }{% + % At top level; don't indent. + \setlength{\leftmargin}{0pt}% + }% + \setlength{\rightmargin}{0pt}% + \setlength{\parsep}{0pt}% + }{% + #1% + }% +} +\providecommand{\DNline}[1]{\item#1} + +\providecommand{\DNtransition}{% + \raisebox{0.25em}{\parbox{\linewidth}{\hspace*{\fill}\hrulefill\hrulefill\hspace*{\fill}}}% +} + +\providecommand{\Dformatblockquote}[1]{% + % Format contents of block quote. + % This occurs in block-level context, so we cannot use \textsl. + {\slshape#1}% +} +\providecommand{\Dformatattribution}[1]{---\textup{#1}} +\providecommand{\DNblockquote}[1]{% + \Dmakebox{% + \Dformatblockquote{#1} + }% +} +\providecommand{\DNattribution}[1]{% + \par% + \begin{flushright}\Dformatattribution{#1}\end{flushright}% +} + + +% Sidebars: +% Vertical and horizontal margins. +\Dprovidelength{\Dsidebarvmargin}{0.5em} +\Dprovidelength{\Dsidebarhmargin}{1em} +% Padding (space between contents and frame). +\Dprovidelength{\Dsidebarpadding}{1em} +% Frame width. +\Dprovidelength{\Dsidebarframewidth}{2\fboxrule} +% Position ("l" or "r"). +\providecommand{\Dsidebarposition}{r} +% Width. +\Dprovidelength{\Dsidebarwidth}{0.45\linewidth} +\providecommand{\DNsidebar}[1]{ + \parpic[\Dsidebarposition]{% + \begin{minipage}[t]{\Dsidebarwidth}% + % Doing this with nested minipages is ugly, but I haven't found + % another way to place vertical space before and after the fbox. + \vspace{\Dsidebarvmargin}% + {% + \setlength{\fboxrule}{\Dsidebarframewidth}% + \setlength{\fboxsep}{\Dsidebarpadding}% + \fbox{% + \begin{minipage}[t]{\linewidth}% + \setlength{\parindent}{\Dboxparindent}% + #1% + \end{minipage}% + }% + }% + \vspace{\Dsidebarvmargin}% + \end{minipage}% + }% +} + + +% Citations and footnotes. +\providecommand{\Dformatfootnote}[1]{% + % Format footnote. + {% + \footnotesize#1% + % \par is necessary for LaTeX to adjust baselineskip to the + % changed font size. + \par% + }% +} +\providecommand{\Dformatcitation}[1]{\Dformatfootnote{#1}} +\Dprovidelength{\Doriginalbaselineskip}{0pt} +\providecommand{\DNfootnotereference}[1]{% + {% + % \baselineskip is 0pt in \textsuperscript, so we save it here. + \setlength{\Doriginalbaselineskip}{\baselineskip}% + \textsuperscript{#1}% + }% +} +\providecommand{\DNcitationreference}[1]{{[}#1{]}} +\Dprovidelength{\Dfootnotesep}{3.5pt} +\providecommand{\Dsetfootnotespacing}{% + % Spacing commands executed at the beginning of footnotes. + \setlength{\parindent}{0pt}% + \hspace{1em}% +} +\providecommand{\DNfootnote}[1]{% + % See ltfloat.dtx for details. + {% + \insert\footins{% + % BUG: This is too small if the user adds + % \onehalfspacing or \doublespace. + \vspace{\Dfootnotesep}% + \Dsetfootnotespacing% + \Dformatfootnote{#1}% + }% + }% +} +\providecommand{\DNcitation}[1]{\DNfootnote{#1}} +\providecommand{\Dformatfootnotelabel}[1]{% + % Keep \footnotesize in footnote labels (\textsuperscript would + % reduce the font size even more). + \textsuperscript{\footnotesize#1{ }}% +} +\providecommand{\Dformatcitationlabel}[1]{{[}#1{]}{ }} +\providecommand{\Dformatmultiplebackrefs}[1]{% + % If in printing mode, do not write out multiple backrefs. + \ifthenelse{\equal{\Dprinting}{true}}{}{\textsl{#1}}% +} +\providecommand{\Dthislabel}{} +\providecommand{\DNlabel}[1]{% + % Footnote or citatation label. + \renewcommand{\Dthislabel}{#1}% + \ifthenelse{\not\equal{\DEVsinglebackref}{}}{% + \let\Doriginallabel=\Dthislabel% + \def\Dthislabel{% + \Dsinglefootnotebacklink{\DEVsinglebackref}{\Doriginallabel}% + }% + }{}% + \ifthenelse{\equal{\DEVparent}{footnote}}{% + % Footnote label. + \Dformatfootnotelabel{\Dthislabel}% + }{% + \ifthenelse{\equal{\DEVparent}{citation}}{% + % Citation label. + \Dformatcitationlabel{\Dthislabel}% + }{}% + }% + % If there are multiple backrefs, add them now. + \Dformatmultiplebackrefs{\DEVmultiplebackrefs}% +} +\providecommand{\Dsinglefootnotebacklink}[2]{% + % Create normal backlink of a footnote label. Parameters: + % 1. ID. + % 2. Link text. + % Treat like a footnote reference. + \Dimplicitfootnotereference{\##1}{#2}% +} +\providecommand{\DECmultifootnotebacklink}[2]{% + % Create generated backlink, as in (1, 2). Parameters: + % 1. ID. + % 2. Link text. + % Treat like a footnote reference. + \Dimplicitfootnotereference{\##1}{#2}% +} +\providecommand{\Dsinglecitationbacklink}[2]{\Dsinglefootnotebacklink{#1}{#2}} +\providecommand{\DECmulticitationbacklink}[2]{\DECmultifootnotebacklink{#1}{#2}} + + +\providecommand{\DECmaketable}[2]{% + % Make table. Parameters: + % 1. Table spec (like "|p|p|"). + % 2. Table contents. + {% + \ifthenelse{\equal{\Dinsidetabular}{true}}{% + % Inside longtable; we cannot have nested longtables. + \begin{tabular}{#1}% + \hline% + #2% + \end{tabular}% + }{% + \renewcommand{\Dinsidetabular}{true}% + \begin{longtable}{#1}% + \hline% + #2% + \end{longtable}% + }% + }% +} +\providecommand{\DNthead}[1]{% + #1% + \endhead% +} +\providecommand{\DNrow}[1]{% + #1\tabularnewline% + \hline% +} +\providecommand{\Dinsidemulticolumn}{false} +\providecommand{\Dcompensatingmulticol}[3]{% + \multicolumn{#1}{#2}{% + {% + \renewcommand{\Dinsidemulticolumn}{true}% + % Compensate for weird missing vertical space at top of paragraph. + \raisebox{-2.5pt}{#3}% + }% + }% +} +\providecommand{\DECcolspan}[2]{% + % Take care of the morecols attribute (but incremented by 1). + &% + \Dcompensatingmulticol{#1}{l|}{#2}% +} +\providecommand{\DECcolspanleft}[2]{% + % Like \Dmorecols, but called for the leftmost entries in a table + % row. + \Dcompensatingmulticol{#1}{|l|}{#2}% +} +\providecommand{\DECsubsequententry}[1]{% + % +} +\providecommand{\DNentry}[1]{% + % The following sequence adds minimal vertical space above the top + % lines of the first cell paragraph, so that vertical space is + % balanced at the top and bottom of table cells. + \ifthenelse{\equal{\Dinsidemulticolumn}{false}}{% + \vspace{-1em}\vspace{-\parskip}\par% + }{}% + #1% + % No need to add an ampersand ("&"); that's done by \DECsubsequententry. +} +\providecommand{\DAtableheaderentry}[5]{\Dformattableheaderentry{#5}} +\providecommand{\Dformattableheaderentry}[1]{{\bfseries#1}} + + +\providecommand{\DNsystemmessage}[1]{% + {% + \ifthenelse{\equal{\Dprinting}{false}}{\color{red}}{}% + \bfseries% + #1% + }% +} + + +\providecommand{\Dinsidehalign}{false} +\newsavebox{\Dalignedimagebox} +\Dprovidelength{\Dalignedimagewidth}{0pt} +\providecommand{\Dhalign}[2]{% + % Horizontally align the contents to the left or right so that the + % text flows around it. + % Parameters: + % 1. l or r + % 2. Contents. + \renewcommand{\Dinsidehalign}{true}% + % For some obscure reason \parpic consumes some vertical space. + \vspace{-3pt}% + % Now we do something *really* ugly, but this enables us to wrap the + % image in a minipage while still allowing tight frames when + % class=border (see \DNimageCborder). + \sbox{\Dalignedimagebox}{#2}% + \settowidth{\Dalignedimagewidth}{\usebox{\Dalignedimagebox}}% + \parpic[#1]{% + \begin{minipage}[b]{\Dalignedimagewidth}% + % Compensate for previously added space, but not entirely. + \vspace*{2.0pt}% + \vspace*{\Dfloatimagetopmargin}% + \usebox{\Dalignedimagebox}% + \vspace*{1.5pt}% + \vspace*{\Dfloatimagebottommargin}% + \end{minipage}% + }% + \renewcommand{\Dinsidehalign}{false}% +} + + +% Maximum width of an image. +\providecommand{\Dimagemaxwidth}{\linewidth} +\providecommand{\Dfloatimagemaxwidth}{0.5\linewidth} +% Auxiliary variable. +\Dprovidelength{\Dcurrentimagewidth}{0pt} +\providecommand{\DNimageAalign}[5]{% + \ifthenelse{\equal{#3}{left}}{% + \Dhalign{l}{#5}% + }{% + \ifthenelse{\equal{#3}{right}}{% + \Dhalign{r}{#5}% + }{% + \ifthenelse{\equal{#3}{center}}{% + % Text floating around centered figures is a bad idea. Thus + % we use a center environment. Note that no extra space is + % added by the writer, so the space added by the center + % environment is fine. + \begin{center}#5\end{center}% + }{% + #5% + }% + }% + }% +} +% Base path for images. +\providecommand{\Dimagebase}{} +% Auxiliary command. Current image path. +\providecommand{\Dimagepath}{} +\providecommand{\DNimageAuri}[5]{% + % Insert image. We treat the URI like a path here. + \renewcommand{\Dimagepath}{\Dimagebase#3}% + \Difdefined{DcurrentNimageAwidth}{% + \Dwidthimage{\DEVcurrentNimageAwidth}{\Dimagepath}% + }{% + \Dsimpleimage{\Dimagepath}% + }% +} +\Dprovidelength{\Dfloatimagevmargin}{0pt} +\providecommand{\Dfloatimagetopmargin}{\Dfloatimagevmargin} +\providecommand{\Dfloatimagebottommargin}{\Dfloatimagevmargin} +\providecommand{\Dwidthimage}[2]{% + % Image with specified width. + % Parameters: + % 1. Image width. + % 2. Image path. + % Need to make bottom-alignment dependent on align attribute (add + % functional test first). Need to observe height attribute. + %\begin{minipage}[b]{#1}% + \includegraphics[width=#1,height=\textheight,keepaspectratio]{#2}% + %\end{minipage}% +} +\providecommand{\Dcurrentimagemaxwidth}{} +\providecommand{\Dsimpleimage}[1]{% + % Insert image, without much parametrization. + \settowidth{\Dcurrentimagewidth}{\includegraphics{#1}}% + \ifthenelse{\equal{\Dinsidehalign}{true}}{% + \renewcommand{\Dcurrentimagemaxwidth}{\Dfloatimagemaxwidth}% + }{% + \renewcommand{\Dcurrentimagemaxwidth}{\Dimagemaxwidth}% + }% + \ifthenelse{\lengthtest{\Dcurrentimagewidth>\Dcurrentimagemaxwidth}}{% + \Dwidthimage{\Dcurrentimagemaxwidth}{#1}% + }{% + \Dwidthimage{\Dcurrentimagewidth}{#1}% + }% +} +\providecommand{\Dwidthimage}[2]{% + % Image with specified width. + % Parameters: + % 1. Image width. + % 2. Image path. + \Dwidthimage{#1}{#2}% +} + +% Figures. +\providecommand{\DNfigureAalign}[5]{% + % Hack to make it work Right Now. + %\def\DEVcurrentNimageAwidth{\DEVcurrentNfigureAwidth}% + % + %\def\DEVcurrentNimageAwidth{\linewidth}% + \DNimageAalign{#1}{#2}{#3}{#4}{% + \begin{minipage}[b]{0.4\linewidth}#5\end{minipage}}% + %\let\DEVcurrentNimageAwidth=\relax% + % + %\let\DEVcurrentNimageAwidth=\relax% +} +\providecommand{\DNcaption}[1]{\par\noindent{\slshape#1}} +\providecommand{\DNlegend}[1]{\DECauxiliaryspace#1} + +\providecommand{\DCborder}[1]{\fbox{#1}} +% No padding between image and border. +\providecommand{\DNimageCborder}[1]{\frame{#1}} + + +% Need to replace with language-specific stuff. Maybe look at +% csquotes.sty and ask the author for permission to use parts of it. +\providecommand{\DECtextleftdblquote}{``} +\providecommand{\DECtextrightdblquote}{''} + +% Table of contents: +\Dprovidelength{\Dtocininitialsectnumwidth}{2.4em} +\Dprovidelength{\Dtocadditionalsectnumwidth}{0.7em} +% Level inside a table of contents. While this is at -1, we are not +% inside a TOC. +\Dprovidecounter{Dtoclevel}{-1}% +\providecommand{\Dlocaltoc}{false}% +\providecommand{\DNtopicClocal}[1]{% + \renewcommand{\Dlocaltoc}{true}% + \addtolength{\Dtocsectnumwidth}{2\Dtocadditionalsectnumwidth}% + \addtolength{\Dtocindent}{-2\Dtocadditionalsectnumwidth}% + #1% + \addtolength{\Dtocindent}{2\Dtocadditionalsectnumwidth}% + \addtolength{\Dtocsectnumwidth}{-2\Dtocadditionalsectnumwidth}% + \renewcommand{\Dlocaltoc}{false}% +} +\Dprovidelength{\Dtocindent}{0pt}% +\Dprovidelength{\Dtocsectnumwidth}{\Dtocininitialsectnumwidth} +% Compensate for one additional TOC indentation space so that the +% top-level is unindented. +\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth} +\addtolength{\Dtocindent}{-\Dtocsectnumwidth} +\providecommand{\Difinsidetoc}[2]{% + \ifthenelse{\not\equal{\theDtoclevel}{-1}}{#1}{#2}% +} +\providecommand{\DNgeneratedCsectnum}[1]{% + \Difinsidetoc{% + % Section number inside TOC. + \makebox[\Dtocsectnumwidth][l]{#1}% + }{% + % Section number inside section title. + #1\quad% + }% +} +\providecommand{\Dtocbulletlist}[1]{% + \addtocounter{Dtoclevel}{1}% + \addtolength{\Dtocindent}{\Dtocsectnumwidth}% + \addtolength{\Dtocsectnumwidth}{\Dtocadditionalsectnumwidth}% + #1% + \addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}% + \addtolength{\Dtocindent}{-\Dtocsectnumwidth}% + \addtocounter{Dtoclevel}{-1}% +} + + +% For \DECpixelunit, the length value is pre-multiplied with 0.75, so by +% specifying "pt" we get the same notion of "pixel" as graphicx. +\providecommand{\DECpixelunit}{pt} +% Normally lengths are relative to the current linewidth. +\providecommand{\DECrelativeunit}{\linewidth} + + +% ACTION: These commands actually *do* something. +% Ultimately, everything should be done here, and no active content should be +% above (not even \usepackage). + +\DSearly +\DSpackages +\DSfrenchspacing +\DSsymbols +\DSlate + +\makeatother + + \usepackage{fancyvrb} diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/examples/format1.py b/telemeta/util/audiolab/scikits/audiolab/docs/examples/format1.py new file mode 100644 index 00000000..f9166f98 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/examples/format1.py @@ -0,0 +1,7 @@ +from scikits.audiolab import formatinfo as format + +f = format('aiff', 'ulaw') +print f + +f = format('ircam', 'float32') +print f diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/examples/format2.py b/telemeta/util/audiolab/scikits/audiolab/docs/examples/format2.py new file mode 100644 index 00000000..6b176a65 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/examples/format2.py @@ -0,0 +1,6 @@ +from scikits.audiolab import supported_format, supported_encoding, \ + supported_endianness + +print supported_format() +print supported_encoding() +print supported_endianness() diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/examples/matlab1.py b/telemeta/util/audiolab/scikits/audiolab/docs/examples/matlab1.py new file mode 100644 index 00000000..fe1e8fac --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/examples/matlab1.py @@ -0,0 +1,20 @@ +from tempfile import mkstemp +from os.path import join, dirname +from os import remove + +from scikits.audiolab import wavread, wavwrite + +(tmp, fs, enc) = wavread('test.wav') +if tmp.ndim < 2: + nc = 1 +else: + nc = tmp.shape[1] + +print "The file has %d frames, %d channel(s)" % (tmp.shape[0], nc) +print "FS is %f, encoding is %s" % (fs, enc) + +fd, cfilename = mkstemp('pysndfiletest.wav') +try: + wavwrite(tmp, cfilename, fs = 16000, enc = 'pcm24') +finally: + remove(cfilename) diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/examples/quick1.py b/telemeta/util/audiolab/scikits/audiolab/docs/examples/quick1.py new file mode 100644 index 00000000..1d3c4739 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/examples/quick1.py @@ -0,0 +1,5 @@ +import scikits.audiolab as audiolab + +a = audiolab.sndfile('test.flac', 'read') +data = a.read_frames(1000) +a.close() diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/examples/usage1.py b/telemeta/util/audiolab/scikits/audiolab/docs/examples/usage1.py new file mode 100644 index 00000000..a689a01f --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/examples/usage1.py @@ -0,0 +1,6 @@ +import scikits.audiolab as audiolab + +filename = 'test.flac' +a = audiolab.sndfile(filename, 'read') + +print a diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/examples/usage2.py b/telemeta/util/audiolab/scikits/audiolab/docs/examples/usage2.py new file mode 100644 index 00000000..0117e264 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/examples/usage2.py @@ -0,0 +1,12 @@ +import numpy as N + +import scikits.audiolab as audiolab + +filename = 'test.flac' +a = audiolab.sndfile(filename, 'read') + +tmp = a.read_frames(1e4) +float_tmp = a.read_frames(1e4, dtype = N.float32) + +import pylab as P +P.plot(tmp[:]) diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/examples/write1.py b/telemeta/util/audiolab/scikits/audiolab/docs/examples/write1.py new file mode 100644 index 00000000..b0fd1368 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/examples/write1.py @@ -0,0 +1,34 @@ +from tempfile import mkstemp +from os import remove + +import numpy as N +from scikits.audiolab import formatinfo as format +import scikits.audiolab as audiolab + +# Create a temp file in the system temporary dir, and always remove +# it at the end +cd, filename = mkstemp('tmptest.wav') +try: + fmt = format('wav', 'pcm24') + nchannels = 2 + fs = 44100 + + afile = audiolab.sndfile(filename, 'write', fmt, nchannels, fs) + + # Create a stereo white noise, with Gaussian distribution + tmp = 0.1 * N.random.randn(1000, nchannels) + + # Write the first 500 frames of the signal + # Note that the write_frames method uses tmp's numpy dtype to determine how + # to write to the file; sndfile also converts the data on the fly if necessary + afile.write_frames(tmp, 500) + + afile.close() + + # Let's check that the written file has the expected meta data + afile = audiolab.sndfile(filename, 'read') + assert(afile.get_samplerate() == fs) + assert(afile.get_channels() == nchannels) + assert(afile.get_nframes() == 500) +finally: + remove(filename) diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/index.txt b/telemeta/util/audiolab/scikits/audiolab/docs/index.txt new file mode 100644 index 00000000..54110172 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/index.txt @@ -0,0 +1,264 @@ +.. + restindex + page-title: audiolab + crumb: audiolab + link-title: audiolab + encoding: utf-8 + output-encoding: None + file: audiolab1.png + file: quick1.py + file: usage1.py + file: usage2.py + file: format1.py + file: format2.py + file: write1.py + file: matlab1.py + file: audiolab.pdf + /restindex + +.. vim:syntax=rest +.. Last Change: Tue Jul 17 11:00 AM 2007 J + +=============================================================== + Pyaudiolab, a python package to make noise with numpy arrays +=============================================================== + +Introduction +============ + +.. _scipy: http://www.scipy.org +.. _libsndfile: http://www.mega-nerd.com/libsndfile/ + +For people doing audio processing, it is useful to be able to import data from +audio files, and export them back, as well as listening to the results of some +processing; matlab have functions such as wavread, wavwrite, soundsc, etc... +for that purposes. The goal of audiolab is to give those capabilities to the +`scipy`_ environment by wrapping the excellent library `libsndfile`_ from Erik +Castro de Lopo. Pyaudio supports all format supported by libsndfile, including +wav, aiff, ircam files, and flac (an open source lossless compressed format); +see `here `_ for a complete +list. + + **Note**: The library is still in beta stage: reading and writing + data is possible, but only in frames, not per item. + Also, the ability to play data on the system's soundcard is not there yet. + I have never encountered any data corruption, except when using the buggy + ctypes included in Ubuntu's python 2.5 (bug which was solved recently). + + **Note**: The online version of this document is not always up to date. The + pdf included in the package is the reference, and always in sync with the + package. If something does not work, please refer first to the pdf included in + the package. + +.. contents:: Tables of contents + +Download and installation +========================= + +Download +-------- + +audiolab is part of scikits: its source can be downloaded directly from the +scikits svn repository: svn co http://svn.scipy.org/svn/scikits/trunk/audiolab + +Requirements +------------ + +audiolab requires the following softwares: + + - a python interpreter. + - libsndfile (including the header sndfile.h, which means linux users should + download the libsndfile-dev package). + - numpy (any version >= 1.0 should work). + - ctypes (version >= 1.0.1) + +Starting with version 2.5, python include ctypes in its standart library, so you +don't need to install ctypes separately in this case. + +It has been run succesfully on the following platforms: + + - linux ubuntu (32 and 64 bits) + - windows XP + +I would be interested to hear anyone who succeesfully used it on other +plateforms (Mac Os X, solaris, etc...). + + **Note**: the ctypes used in python2.5 package in ubuntu (and maybe debian + as well) *had* a nasty bug which makes it impossible to use 64 bits integers. You + should NOT use this package with audiolab (importing audiolab should fail, + but if the version is not correctly detected, you will have file corruption when + writing data to audio files). Run the test to check everything is working (a + test case tests this issue). + + ``_ + + +Installation +------------ + +For unix users, if libsndfile is installed in standart location (eg /usr/lib, +/usr/local/lib), the installer should be able to find them automatically, and +you only need to do a "python setup.py install". In other cases, you need to +create a file site.cfg to set the location of libsndfile and its header (there +are site.cfg examples which should give you an idea how to use them on your +platform). + +For windows users: the library distributed by Erik Castro de Lopo cannot be +used directly; you need to follow the instructions given in libsndfile +distribution in the file README-precompiled-dll.txt. See also site.cfg.win32. + +License +------- + +audiolab is released under the LGPL, which forces you to release back the +modifications you may make in the version of audiolab you are distributing, +but you can still use it in closed softwares. + +Quick view +========== + +The following code shows you how to open a file for read, reading the first +1000 frames, and closing it: + +.. raw:: html + + {mycolorize;input/softwares/audiolab/quick1.py} + +.. raw:: latex + + \input{quick1.tex} + +Usage +===== + +Opening a file and getting its parameters +----------------------------------------- + +Once imported, audiolab gives you access the sndfile class, which is the +class of audiolab use to open audio files. +You create a sndfile instance when you want +to open a file for reading or writing (the file test.flac is included +in the audiolab package, in the test_data directory): + +.. raw:: html + + {mycolorize;input/softwares/audiolab/usage1.py} + +.. raw:: latex + + \input{usage1.tex} + +Prints you the informations related to the file, like its sampling rate, +the number of frames, etc... You can of course get each parameter +individually by using the corresponding sndfile.get* accessors. + +Importing audio data +-------------------- + +Now that we've opened a file, we would like to read its audio content, +right ? For now, you can only import the data as floating point data, +float (32 bits) or double (64 bits). The function +sndfile.read_frames read n frames, +where a frame contains a sample of each channel (one in mono, 2 in stereo, +etc...): + +.. raw:: html + + {mycolorize;input/softwares/audiolab/usage2.py} + +.. raw:: latex + + \input{usage2.tex} + +The above code import 10000 frames, and plot the first channel using matplotlib +(see below). A frame holds one sample from each channel: 1000 frames of a stereo +file is 2000 samples. Each channel is one column of the numpy array. The read +functions follow numpy conventions, that is by default, the data are read as +double, but you can give a dtype argument to the function. + +.. image:: audiolab1.png + :width: 500 + :height: 400 + +The format class +---------------- + +When opening a file for writing, you need to give various parameters related to +the format such as the file format, the encoding. The format class is used to +create valid formats from those parameters By default, the format class creates +a format object with file type wav, and 16 bits pcm encoding: + +.. raw:: html + + {mycolorize;input/softwares/audiolab/format1.py} + +.. raw:: latex + + \input{format1.tex} + +prints back "Major Format: AIFF (Apple/SGI), Encoding Format: U-Law" +and "Major Format: SF (Berkeley/IRCAM/CARL), Encoding Format: 32 bit float". + +To get a list of all possible file format and encoding, the function +supported_* are available: + +.. raw:: html + + {mycolorize;input/softwares/audiolab/format2.py} + +.. raw:: latex + + \input{format2.tex} + + **Note**: not all combination of encoding, endianness and format are possible. + If you try to create a format with incompatible values, you will get an error + while creating an instance of format. + +Writing data to a file +---------------------- + +Opening a file for writing is a bit more complicated than reading; you need to +say which format you are requesting, the number of channels and the sampling +rate (in Hz) you are requesting; all thoses information are mandatory ! The +class format is used to build a format understable by libsndfile from +'user-friendly' values. Let's see how it works. + +.. raw:: html + + {mycolorize;input/softwares/audiolab/write1.py} + +.. raw:: latex + + \input{write1.tex} + +Matlab-like API +--------------- + +audiolab also have a matlab-like API for audio IO. Its usage is as similar as it +can get using python: + +.. raw:: html + + {mycolorize;input/softwares/audiolab/matlab1.py} + +.. raw:: latex + + \input{matlab1.tex} + +Known bugs: +=========== + + - there seems to be a problem when using libsndfile fseek facilities with flac + files (which are necessary for the functions flacread/flacwrite). The + problem seems to be with libFLAC; for this reason, seek in flac files is not + enabled by default for now. See FLAC_SUPPORT.txt for more informations. + +TODO +==== + +audiolab is still in early stages. Before a release, I would like to implement the +follwings: + + - support (at least some) meta-data embedded in some audio files format. + - support the libsndfile's error system + - player on all major plateforms (at least linux/windows/max OS X) diff --git a/telemeta/util/audiolab/scikits/audiolab/docs/user.tex b/telemeta/util/audiolab/scikits/audiolab/docs/user.tex new file mode 100644 index 00000000..6ea70994 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/docs/user.tex @@ -0,0 +1,64 @@ +% Last Change: Wed Jan 31 08:00 PM 2007 J +% vim:syntax=tex + +\newcommand\at{@} +\newcommand\lb{[} +\newcommand\rb{]} +\newcommand\Cba[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} +\newcommand\Caz[1]{\textcolor[rgb]{0.00,0.25,0.82}{#1}} +\newcommand\Cay[1]{\textcolor[rgb]{0.67,0.13,1.00}{#1}} +\newcommand\Cax[1]{\textcolor[rgb]{0.00,0.63,0.00}{#1}} +\newcommand\Cbc[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} +\newcommand\Cas[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} +\newcommand\Car[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} +\newcommand\Caq[1]{\textcolor[rgb]{0.73,0.27,0.27}{\textit{#1}}} +\newcommand\Cap[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} +\newcommand\Caw[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} +\newcommand\Cav[1]{\textcolor[rgb]{0.60,0.60,0.60}{\textbf{#1}}} +\newcommand\Cau[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} +\newcommand\Cat[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} +\newcommand\Cak[1]{\textbf{#1}} +\newcommand\Caj[1]{\textcolor[rgb]{0.73,0.40,0.53}{#1}} +\newcommand\Cai[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} +\newcommand\Cah[1]{\textcolor[rgb]{0.63,0.63,0.00}{#1}} +\newcommand\Cao[1]{\textcolor[rgb]{0.53,0.00,0.00}{#1}} +\newcommand\Can[1]{\textcolor[rgb]{0.00,0.50,0.00}{#1}} +\newcommand\Cam[1]{\textcolor[rgb]{0.73,0.40,0.13}{\textbf{#1}}} +\newcommand\Cal[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} +\newcommand\Cac[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} +\newcommand\Cab[1]{\textit{#1}} +\newcommand\Caa[1]{\textcolor[rgb]{0.50,0.50,0.50}{#1}} +\newcommand\Cag[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} +\newcommand\Caf[1]{\textcolor[rgb]{0.00,0.53,0.00}{\textit{#1}}} +\newcommand\Cae[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} +\newcommand\Cad[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} +\newcommand\Cbb[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} +\newcommand\CaZ[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} +\newcommand\CaY[1]{\textcolor[rgb]{0.00,0.00,0.50}{\textbf{#1}}} +\newcommand\CaX[1]{\textcolor[rgb]{0.00,0.50,0.00}{\textbf{#1}}} +\newcommand\Cbd[1]{\textcolor[rgb]{0.73,0.40,0.53}{\textbf{#1}}} +\newcommand\Cbe[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} +\newcommand\CaS[1]{\textcolor[rgb]{0.50,0.00,0.50}{\textbf{#1}}} +\newcommand\CaR[1]{\textcolor[rgb]{0.00,0.53,0.00}{\textit{#1}}} +\newcommand\CaQ[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} +\newcommand\CaP[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} +\newcommand\CaW[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} +\newcommand\CaV[1]{\textcolor[rgb]{0.67,0.13,1.00}{#1}} +\newcommand\CaU[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} +\newcommand\CaT[1]{\textcolor[rgb]{0.00,0.00,1.00}{\textbf{#1}}} +\newcommand\CaK[1]{\textcolor[rgb]{0.67,0.13,1.00}{#1}} +\newcommand\CaJ[1]{\textcolor[rgb]{0.00,0.63,0.00}{#1}} +\newcommand\CaI[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} +\newcommand\CaH[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} +\newcommand\CaO[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} +\newcommand\CaN[1]{\textcolor[rgb]{0.00,0.00,0.50}{\textbf{#1}}} +\newcommand\CaM[1]{\textcolor[rgb]{0.00,0.00,1.00}{#1}} +\newcommand\CaL[1]{\textcolor[rgb]{0.00,0.53,0.00}{#1}} +\newcommand\CaC[1]{\textcolor[rgb]{0.00,0.53,0.00}{\textit{#1}}} +\newcommand\CaB[1]{\textcolor[rgb]{0.82,0.25,0.23}{\textbf{#1}}} +\newcommand\CaA[1]{\textcolor[rgb]{0.67,0.13,1.00}{#1}} +\newcommand\CaG[1]{\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{#1}} +\newcommand\CaF[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} +\newcommand\CaE[1]{\textcolor[rgb]{1.00,0.00,0.00}{#1}} +\newcommand\CaD[1]{\textcolor[rgb]{0.63,0.00,0.00}{#1}} + diff --git a/telemeta/util/audiolab/scikits/audiolab/info.py b/telemeta/util/audiolab/scikits/audiolab/info.py new file mode 100644 index 00000000..47dd67f6 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/info.py @@ -0,0 +1,2 @@ +VERSION = '0.8dev' +ignore = False diff --git a/telemeta/util/audiolab/scikits/audiolab/info.pyc b/telemeta/util/audiolab/scikits/audiolab/info.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08186b2aeeb449725efa8508b6c9f88eacf3ec5e GIT binary patch literal 193 zcmdn|iI+?2&SSS^1}I&`7#V^!m_RaYK*B)JA| +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +"""This module implements functions to read and write to audio files easily +(ala matlab: wavread, etc...).""" + +import numpy as N + +from pysndfile import formatinfo, sndfile +from pysndfile import PyaudioException, FlacUnsupported + +__all__ = [] +_MATAPI_FORMAT = ['wav', 'aiff', 'au', 'sdif', 'flac'] +for i in _MATAPI_FORMAT: + __all__.extend(['%sread' % i, '%swrite' % i]) + +# writer function factory +def _writer_factory(name, format, def_fs, descr): + """ Create a writer function with fileformat described by format, default + sampling rate def_fs, and docstring descr.""" + def basic_writer(data, filename, fs = def_fs, enc = format.get_encoding()): + """Common "template" to all write functions.""" + if N.ndim(data) <= 1: + nc = 1 + nframes = N.size(data) + elif N.ndim(data) == 2: + nc = data.shape[1] + nframes = data.shape[0] + else: + RuntimeError("Only rank 0, 1, and 2 arrays supported as audio data") + + hdl = sndfile(filename, 'write', format, nc, fs) + try: + hdl.write_frames(data, nframes) + finally: + hdl.close() + doc = \ + """ wrapper around pysndfile to write %s file, + in a similar manner to matlab's wavwrite/auwrite and the likes. + + OVERWRITES EXISTING FILE ! + + Args: + - data: a rank 0, 1 (mono) or 2 (one channel per col) numpy array + - filename: a string for the audio file name + - fs: the sampling rate in Hz (%d Hz by default). + - enc: a string for the encoding such as 'pcm16', etc...(%s by + default). Not supported yet ! + + For a total control over options, such as endianness, append data to an + existing file, etc... you should use sndfile class instances instead""" \ + % (str(descr), def_fs, format.get_encoding()) + basic_writer.__doc__ = doc + basic_writer.__name__ = name + return basic_writer + +# template for reader functions +def _reader_factory(name, filetype, descr): + """Factory for reader functions ala matlab.""" + def basic_reader(filename, last = None, first = 0): + """Common "template" to all read functions.""" + hdl = sndfile(filename, 'read') + try: + if not hdl.get_file_format() == filetype: + raise PyaudioException("%s is not a %s file (is %s)" \ + % (filename, filetype, hdl.get_file_format())) + + fs = hdl.get_samplerate() + enc = hdl.get_encoding() + # Set the pointer to start position + nf = hdl.seek(first, 1) + if not nf == first: + raise IOError("Error while seeking at starting position") + + if last is None: + nframes = hdl.get_nframes() - first + data = hdl.read_frames(nframes) + else: + data = hdl.read_frames(last) + finally: + hdl.close() + + return data, fs, enc + doc = \ + """ wrapper around pysndfile to read a %s file in float64, + in a similar manner to matlab wavread/auread/etc... + + Returns a tuple (data, fs, enc), where : + - data are the read data (one column per channel) + - fs, the sampling rate + - enc, a string which is the encoding of the file, such as 'pcm16', + 'float32', etc... + + For a total control over options, such as output's dtype, etc..., + you should use sndfile class instances instead""" % (str(descr),) + basic_reader.__doc__ = doc + basic_reader.__name__ = name + return basic_reader + +wavread = _reader_factory('wavread', 'wav', + formatinfo('wav', 'pcm16').get_major_str()) +auread = _reader_factory('auread', 'au', + formatinfo('au', 'pcm16').get_major_str()) +aiffread = _reader_factory('aiffread', 'aiff', + formatinfo('aiff', 'pcm16').get_major_str()) +sdifread = _reader_factory('sdifread', 'ircam', + formatinfo('ircam', 'pcm16').get_major_str()) + +_f1 = formatinfo('wav', 'pcm16') +wavwrite = _writer_factory('wavwrite', _f1, 8000, _f1.get_major_str()) + +_f2 = formatinfo('au', 'ulaw') +auwrite = _writer_factory('auwrite', _f2, 8000, _f2.get_major_str()) + +_f3 = formatinfo('aiff', 'pcm16') +aiffwrite = _writer_factory('aiffwrite', _f3, 8000, _f3.get_major_str()) + +_f4 = formatinfo('ircam', 'pcm16') +sdifwrite = _writer_factory('sdifwrite', _f4, 44100, _f4.get_major_str()) + +try: + flacread = _reader_factory('flacread', 'flac', + formatinfo('flac', 'pcm16').get_major_str()) + _f5 = formatinfo('flac', 'pcm16') + flacwrite = _writer_factory('flacwrite', _f5, 44100, _f5.get_major_str()) +except FlacUnsupported,e: + print e + print "Matlab API for FLAC is disabled" + def missing_flacread(*args): + raise UnimplementedError("Matlab API for FLAC is disabled on your "\ + "installation") + flacread = missing_flacread + flacwrite = missing_flacread diff --git a/telemeta/util/audiolab/scikits/audiolab/matapi.pyc b/telemeta/util/audiolab/scikits/audiolab/matapi.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1abc0b126f9eac75d5423ddd46ddc50ab92af4e GIT binary patch literal 4893 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 literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits/audiolab/misc/Makefile b/telemeta/util/audiolab/scikits/audiolab/misc/Makefile new file mode 100644 index 00000000..2fcbde26 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/misc/Makefile @@ -0,0 +1,23 @@ +CC = colorgcc +LD = gcc + +CFLAGS = -Wall -W + +winfdopen: winfdopen.o + $(LD) $< -o $@ -lsndfile + +winfdopen.o: winfdopen.c + $(CC) $(CFLAGS) -c $< -o $@ + +badflac: badflac.o + $(LD) $< -o $@ -lsndfile + +badflac.o: badflac.c + $(CC) $(CFLAGS) -c $< -o $@ + +test_badflac: badflac badflac.flac + ./badflac badflac.flac + +clean: + rm -f *.o + rm -f badflac diff --git a/telemeta/util/audiolab/scikits/audiolab/misc/Sconstruct b/telemeta/util/audiolab/scikits/audiolab/misc/Sconstruct new file mode 100644 index 00000000..6c29ab33 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/misc/Sconstruct @@ -0,0 +1,5 @@ +# vim:syntax=python +# Last Change: Fri Jun 01 12:00 PM 2007 J +# +mainobj = Object('winfdopen.c') +winfd = Program(mainobj, LIBS = ['sndfile']) diff --git a/telemeta/util/audiolab/scikits/audiolab/misc/badflac.c b/telemeta/util/audiolab/scikits/audiolab/misc/badflac.c new file mode 100644 index 00000000..906ad44f --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/misc/badflac.c @@ -0,0 +1,37 @@ +#include +#include + +#include + +int main(int argc, char *argv[]) +{ + SF_INFO info; + SNDFILE* file; + sf_count_t nf; + + char buffer [2048] ; + if (argc < 2) { + fprintf(stderr, "usage: badflac filename \n"); + exit(EXIT_FAILURE); + } + + info.format = 0; + file = sf_open(argv[1], SFM_READ, &info); + if (file == NULL) { + fprintf(stderr, "%s:%s failed opening file %s\n", __FILE__, __func__, argv[1]); + sf_command (file, SFC_GET_LOG_INFO, buffer, sizeof (buffer)) ; + fprintf(stderr, "sndfile error is %s:\n", buffer); + exit(EXIT_FAILURE); + } + + fprintf(stderr, "Values of seek are on this platform: SET %d, CUR %d, END %d\n", + SEEK_SET, SEEK_CUR, SEEK_END); + + fprintf(stderr, "trying to seek %lld frames\n", (long long)1); + nf = sf_seek(file, 1, SEEK_CUR); + fprintf(stderr, "seeked through %lld frames\n", nf); + + sf_close(file); + + return 0; +} diff --git a/telemeta/util/audiolab/scikits/audiolab/misc/badflac.flac b/telemeta/util/audiolab/scikits/audiolab/misc/badflac.flac new file mode 100644 index 0000000000000000000000000000000000000000..70d0a657092c55b85f36faabf54a6f1a62f2a41b GIT binary patch literal 38385 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�G<2-Bs?@fSjRKfcPc`{ZX9$wB-;F`K5)AfZ}YiJ@tsUfngbK)L~f(iuX z2s+eg)g130nRL-N(zIQXZ#BS;GOjU z?EWt^!zO#yqCk*-Jfy$Ru^%ylqsaGLGIW!1cN4U#btcZ~3(|-X2_D$CU6dKJ^aQw~ z*Ggmz^c_FpPY}57Q?@7Rpr`^zC*~nTRuJU0SKsIj-N2+->(kJ%++j+XK3b&&O2`c+ z8^u_*3F=5A9R||jv*Xp1NgSN=n;)f;(7*LLaVWj(B_;UgF!Z`<|v!%EN zyC+|q7A=@lquhtDwOMt9a&Wrpq5py)xS6?-fRR=`xMrZ=}@M~LXh1uLwjQ#?&-p;oIOo3a5|@7G?>`k2LlW@lq8Xyadc|z=tJ8`4#wct#CE4^1W5{$PpNh%fd zNip+gVUnNVUZQAu&8H%byj-Y@x@Wk+|kVsx_9s|5Z1!lUy>?6pd5Pj(rM!U@je z_0z#8`-iymYm}c)M^PA +#include +#include + +#include + +#ifdef _MSC_VER +#define __func__ __FUNCTION__ +#else +#include +#endif + +int test(const char* filename, int byfd); + +int main(int argc, char *argv[]) +{ + int st; + + if (argc < 2) { + fprintf(stderr, "usage: %s filename \n", argv[0]); + exit(EXIT_FAILURE); + } + + st = test(argv[1], 0); + if (st) { + fprintf(stderr, "Error while opening directly\n"); + } else { + fprintf(stderr, "Opening directly is fine\n"); + } + + st = test(argv[1], 1); + if (st) { + fprintf(stderr, "Error while opening by fd\n"); + } else { + fprintf(stderr, "Opening by fd is fine\n"); + } + + return 0; +} + +/* If byfd is true, try to open the file with sf_open_fd */ +int test(const char* filename, int byfd) +{ + SF_INFO info; + SNDFILE* file; + int fid, flags, st; + char buffer [2048]; + + st = 0; + + flags = O_RDONLY; +#if (defined (WIN32) || defined (_WIN32)) + flags |= O_BINARY; +#endif + + info.format = 0; + if (byfd) { + fid = open(filename, flags); + if (fid < 0) { + fprintf(stderr, "%s:%s failed opening file %s\n", __FILE__, __func__, filename); + return -1; + } + + file = sf_open_fd(fid, SFM_READ, &info, SF_TRUE); + } else { + file = sf_open(filename, SFM_READ, &info); + } + + if (file == NULL) { + fprintf(stderr, "%s:%s failed opening file %s\n", __FILE__, __func__, filename); + sf_command (file, SFC_GET_LOG_INFO, buffer, sizeof (buffer)) ; + fprintf(stderr, "sndfile error is %s:\n", buffer); + close(fid); + exit(EXIT_FAILURE); + } else { + fprintf(stderr, "%s:%s file %s has %d frames \n", __FILE__, __func__, filename, info.frames); + } + + sf_close(file); + + return st; +} diff --git a/telemeta/util/audiolab/scikits/audiolab/pyaudioio.py b/telemeta/util/audiolab/scikits/audiolab/pyaudioio.py new file mode 100644 index 00000000..94c1e9fc --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/pyaudioio.py @@ -0,0 +1,68 @@ +#! /usr/bin/env python +# Last Change: Tue May 22 10:00 AM 2007 J + +# Copyright (C) 2006-2007 Cournapeau David +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) any +# later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this library; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# TODO: +# - find out why finally does not work with KeyboardInterrupt instances + +from tempfile import mkstemp +from os import remove, popen + +from pysndfile import sndfile, formatinfo as format + +def play(input, sr = 22050): + """play(input, sr = 22050): "play" a numpy array input + to the audio device using aplay command, @ sampling rate + sr. + + Warning: This is really crude, as it copies the numpy array + into an audio file before writing: I am too lazy to write + interfaces to also, windows and co...""" + # Check inputs are OK + if input.ndim == 1: + nc = 1 + nframes = input.size + else: + (nframes, nc) = input.shape + + # Create tmp file + fd, filename = mkstemp('py_player') + + # Copy the data into it + b = sndfile(filename, 'write', format('wav', 'pcm16'), nc, sr) + b.write_frames(input, nframes) + b.close() + + # Play using an audio command + try: + cmd = "aplay %s" % filename + popen(cmd) + remove(filename) + except KeyboardInterrupt, inst: + remove(filename) + raise inst + +if __name__ == '__main__': + # Read the content of a file into numpy array, and play the numpy + # array using the play command + import numpy as N + sr = 22050 + # Play a really small noise to avoid screaming in loudspeakers + # or headphones. + noise = 0.0001 * N.random.randn((sr)) + play(noise, sr) diff --git a/telemeta/util/audiolab/scikits/audiolab/pysndfile.py b/telemeta/util/audiolab/scikits/audiolab/pysndfile.py new file mode 100644 index 00000000..2fea1fef --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/pysndfile.py @@ -0,0 +1,992 @@ +#! /usr/bin/env python +# Last Change: Wed Oct 03 05:00 PM 2007 J + +# Copyright (C) 2006-2007 Cournapeau David +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# vim:syntax=python + +# TODO: +# - import format classes so that we get meaningful information from an +# existing format +# - better API for reader/writer, including integer formats and partial +# reading +# - ability to get log of sndfile ? +# - check how to play sound under windows, OS X and other UNIX + +"""This module implements the wrappers around libsndfile.""" + +__docformat__ = 'restructuredtext' + +#__all__ = ['sndfile', 'formatinfo'] + +import copy +import warnings + +#================ +# Load libsndfile +#================ +import ctypes +from ctypes import cdll, Structure, c_int, pointer, POINTER, \ + create_string_buffer, c_char_p, sizeof, string_at +try: + from ctypes import c_int64 +except ImportError, e: + print "Cannot import c_int64 from ctypes: if you are on ubuntu/debian," +\ + " this is likely because ctypes was compiled with libffi. see" +\ + " https://launchpad.net/ubuntu/+source/python2.5/+bug/71914" + raise e + +from numpy.ctypeslib import ndpointer +CTYPES_MAJOR = int(ctypes.__version__.split('.')[0]) +CTYPES_MINOR = int(ctypes.__version__.split('.')[1]) +CTYPES_MICRO = int(ctypes.__version__.split('.')[2]) +if CTYPES_MAJOR < 1 or (CTYPES_MINOR == 0 and CTYPES_MICRO < 1): + raise ImportError("version of ctypes is %s, expected at least %s" \ + % (ctypes.__version__, '1.0.1')) +import numpy as N + +_SND = cdll.LoadLibrary('/usr/lib/libsndfile.so.1') + +#========================= +# Definition of constants +#========================= +# READ/WRITE Mode +SFM = { + 'SFM_WRITE' : 0x20, + 'SFM_RDWR' : 0x30, + 'SFM_READ' : 0x10 +} + +# SF BOOL +SF_BOOL = { + 'SF_TRUE' : 1, + 'SF_FALSE' : 0 +} + +# Format +SF_FORMAT = { + 'SF_FORMAT_VOX_ADPCM' : 0x0021, + 'SF_FORMAT_FLOAT' : 0x0006, + 'SF_FORMAT_PCM_S8' : 0x0001, + 'SF_FORMAT_IMA_ADPCM' : 0x0012, + 'SF_FORMAT_SVX' : 0x060000, + 'SF_FORMAT_VOC' : 0x080000, + 'SF_FORMAT_PCM_U8' : 0x0005, + 'SF_FORMAT_ALAW' : 0x0011, + 'SF_FORMAT_G721_32' : 0x0030, + 'SF_FORMAT_DWVW_N' : 0x0043, + 'SF_FORMAT_WAV' : 0x010000, + 'SF_FORMAT_SD2' : 0x160000, + 'SF_FORMAT_HTK' : 0x100000, + 'SF_FORMAT_ENDMASK' : 0x30000000, + 'SF_FORMAT_DPCM_16' : 0x0051, + 'SF_FORMAT_DWVW_24' : 0x0042, + 'SF_FORMAT_PCM_32' : 0x0004, + 'SF_FORMAT_WAVEX' : 0x130000, + 'SF_FORMAT_DOUBLE' : 0x0007, + 'SF_FORMAT_NIST' : 0x070000, + 'SF_FORMAT_PCM_16' : 0x0002, + 'SF_FORMAT_RAW' : 0x040000, + 'SF_FORMAT_W64' : 0x0B0000, + 'SF_FORMAT_PVF' : 0x0E0000, + 'SF_FORMAT_AU' : 0x030000, + 'SF_FORMAT_GSM610' : 0x0020, + 'SF_FORMAT_CAF' : 0x180000, + 'SF_FORMAT_PAF' : 0x050000, + 'SF_FORMAT_ULAW' : 0x0010, + 'SF_FORMAT_MAT4' : 0x0C0000, + 'SF_FORMAT_MAT5' : 0x0D0000, + 'SF_FORMAT_XI' : 0x0F0000, + 'SF_FORMAT_SUBMASK' : 0x0000FFFF, + 'SF_FORMAT_DPCM_8' : 0x0050, + 'SF_FORMAT_G723_24' : 0x0031, + 'SF_FORMAT_G723_40' : 0x0032, + 'SF_FORMAT_DWVW_16' : 0x0041, + 'SF_FORMAT_AIFF' : 0x020000, + 'SF_FORMAT_DWVW_12' : 0x0040, + 'SF_FORMAT_TYPEMASK' : 0x0FFF0000, + 'SF_FORMAT_FLAC' : 0x170000, + 'SF_FORMAT_PCM_24' : 0x0003, + 'SF_FORMAT_SDS' : 0x110000, + 'SF_FORMAT_IRCAM' : 0x0A0000, + 'SF_FORMAT_MS_ADPCM' : 0x0013, + 'SF_FORMAT_AVR' : 0x120000 +} + +# ENDIANESS +SF_ENDIAN = { + 'SF_ENDIAN_BIG' : 0x20000000, + 'SF_ENDIAN_FILE' : 0x00000000, + 'SF_ENDIAN_LITTLE' : 0x10000000, + 'SF_ENDIAN_CPU' : 0x30000000 +} + +# Commands +SF_COMMAND = { + 'SFC_GET_LIB_VERSION' : 0x1000, + 'SFC_CALC_SIGNAL_MAX' : 0x1040, + 'SFC_GET_DITHER_INFO' : 0x10A3, + 'SFC_GET_LOG_INFO' : 0x1001, + 'SFC_GET_FORMAT_SUBTYPE_COUNT' : 0x1032, + 'SFC_FILE_TRUNCATE' : 0x1080, + 'SFC_GET_INSTRUMENT' : 0x10D0, + 'SFC_UPDATE_HEADER_NOW' : 0x1060, + 'SFC_SET_DITHER_ON_WRITE' : 0x10A0, + 'SFC_SET_NORM_DOUBLE' : 0x1012, + 'SFC_GET_CLIPPING' : 0x10C1, + 'SFC_SET_RAW_START_OFFSET' : 0x1090, + 'SFC_CALC_NORM_MAX_ALL_CHANNELS' : 0x1043, + 'SFC_SET_NORM_FLOAT' : 0x1013, + 'SFC_SET_ADD_DITHER_ON_WRITE' : 0x1070, + 'SFC_GET_NORM_FLOAT' : 0x1011, + 'SFC_GET_SIGNAL_MAX' : 0x1044, + 'SFC_GET_MAX_ALL_CHANNELS' : 0x1045, + 'SFC_GET_FORMAT_MAJOR' : 0x1031, + 'SFC_SET_INSTRUMENT' : 0x10D1, + 'SFC_CALC_MAX_ALL_CHANNELS' : 0x1042, + 'SFC_GET_DITHER_INFO_COUNT' : 0x10A2, + 'SFC_SET_BROADCAST_INFO' : 0x10F1, + 'SFC_SET_DITHER_ON_READ' : 0x10A1, + 'SFC_GET_FORMAT_MAJOR_COUNT' : 0x1030, + 'SFC_GET_FORMAT_INFO' : 0x1028, + 'SFC_GET_SIMPLE_FORMAT_COUNT' : 0x1020, + 'SFC_CALC_NORM_SIGNAL_MAX' : 0x1041, + 'SFC_GET_LOOP_INFO' : 0x10E0, + 'SFC_SET_ADD_PEAK_CHUNK' : 0x1050, + 'SFC_SET_ADD_DITHER_ON_READ' : 0x1071, + 'SFC_SET_SCALE_FLOAT_INT_READ' : 0x1014, + 'SFC_GET_FORMAT_SUBTYPE' : 0x1033, + 'SFC_TEST_IEEE_FLOAT_REPLACE' : 0x6001, + 'SFC_SET_UPDATE_HEADER_AUTO' : 0x1061, + 'SFC_GET_SIMPLE_FORMAT' : 0x1021, + 'SFC_SET_CLIPPING' : 0x10C0, + 'SFC_GET_EMBED_FILE_INFO' : 0x10B0, + 'SFC_GET_BROADCAST_INFO' : 0x10F0, + 'SFC_GET_NORM_DOUBLE' : 0x1010 +} + +SF_ERRORS = { + 'SF_ERR_UNRECOGNISED_FORMAT' : 1, + 'SF_ERR_NO_ERROR' : 0, + 'SF_ERR_SYSTEM' : 2, + 'SF_ERR_UNSUPPORTED_ENCODING' : 4, + 'SF_ERR_MALFORMED_FILE' : 3 +} + +# format equivalence: dic used to create internally +# the right enum values from user friendly strings +py_to_snd_encoding_dic = { + 'pcms8' : SF_FORMAT['SF_FORMAT_PCM_S8'], + 'pcm16' : SF_FORMAT['SF_FORMAT_PCM_16'], + 'pcm24' : SF_FORMAT['SF_FORMAT_PCM_24'], + 'pcm32' : SF_FORMAT['SF_FORMAT_PCM_32'], + + 'pcmu8' : SF_FORMAT['SF_FORMAT_PCM_U8'], + + 'float32' : SF_FORMAT['SF_FORMAT_FLOAT'], + 'float64' : SF_FORMAT['SF_FORMAT_DOUBLE'], + + 'ulaw' : SF_FORMAT['SF_FORMAT_ULAW'], + 'alaw' : SF_FORMAT['SF_FORMAT_ALAW'], + 'ima_adpcm' : SF_FORMAT['SF_FORMAT_IMA_ADPCM'], + 'ms_adpcm' : SF_FORMAT['SF_FORMAT_MS_ADPCM'], + + 'gsm610' : SF_FORMAT['SF_FORMAT_GSM610'], + 'vox_adpcm' : SF_FORMAT['SF_FORMAT_VOX_ADPCM'], + + 'g721_32' : SF_FORMAT['SF_FORMAT_G721_32'], + 'g723_24' : SF_FORMAT['SF_FORMAT_G723_24'], + 'g723_40' : SF_FORMAT['SF_FORMAT_G723_40'], + + 'dww12' : SF_FORMAT['SF_FORMAT_DWVW_12'], + 'dww16' : SF_FORMAT['SF_FORMAT_DWVW_16'], + 'dww24' : SF_FORMAT['SF_FORMAT_DWVW_24'], + 'dwwN' : SF_FORMAT['SF_FORMAT_DWVW_N'], + + 'dpcm8' : SF_FORMAT['SF_FORMAT_DPCM_8'], + 'dpcm16': SF_FORMAT['SF_FORMAT_DPCM_16'] +} + +py_to_snd_file_format_dic = { + 'wav' : SF_FORMAT['SF_FORMAT_WAV'], + 'aiff' : SF_FORMAT['SF_FORMAT_AIFF'], + 'au' : SF_FORMAT['SF_FORMAT_AU'], + 'raw' : SF_FORMAT['SF_FORMAT_RAW'], + 'paf' : SF_FORMAT['SF_FORMAT_PAF'], + 'svx' : SF_FORMAT['SF_FORMAT_SVX'], + 'nist' : SF_FORMAT['SF_FORMAT_NIST'], + 'voc' : SF_FORMAT['SF_FORMAT_VOC'], + 'ircam' : SF_FORMAT['SF_FORMAT_IRCAM'], + 'wav64' : SF_FORMAT['SF_FORMAT_W64'], + 'mat4' : SF_FORMAT['SF_FORMAT_MAT4'], + 'mat5' : SF_FORMAT['SF_FORMAT_MAT5'], + 'pvf' : SF_FORMAT['SF_FORMAT_PVF'], + 'xi' : SF_FORMAT['SF_FORMAT_XI'], + 'htk' : SF_FORMAT['SF_FORMAT_HTK'], + 'sds' : SF_FORMAT['SF_FORMAT_SDS'], + 'avr' : SF_FORMAT['SF_FORMAT_AVR'], + 'wavex' : SF_FORMAT['SF_FORMAT_WAVEX'], + 'sd2' : SF_FORMAT['SF_FORMAT_SD2'], + 'flac' : SF_FORMAT['SF_FORMAT_FLAC'], + 'caf' : SF_FORMAT['SF_FORMAT_CAF'] +} + +py_to_snd_endianness_dic = { + 'file' : SF_ENDIAN['SF_ENDIAN_FILE'], + 'little' : SF_ENDIAN['SF_ENDIAN_LITTLE'], + 'big' : SF_ENDIAN['SF_ENDIAN_BIG'], + 'cpu' : SF_ENDIAN['SF_ENDIAN_CPU'] +} + +# Those following dic are used internally to get user-friendly values from +# sndfile enum +SND_TO_PY_ENCODING = \ + dict([(i, j) for j, i in py_to_snd_encoding_dic.items()]) +SND_TO_PY_FILE_FORMAT = \ + dict([(i, j) for j, i in py_to_snd_file_format_dic.items()]) +SND_TO_PY_ENDIANNESS = \ + dict([(i, j) for j, i in py_to_snd_endianness_dic.items()]) + +#========================================== +# Check that libsndfile is expected version +#========================================== +def get_libsndfile_version(): + nverbuff = 256 + verbuff = create_string_buffer(nverbuff) + n = _SND.sf_command(c_int(0), c_int(SF_COMMAND['SFC_GET_LIB_VERSION']), + verbuff, nverbuff) + if n < 1: + raise Exception("Error while getting version of libsndfile") + + # Transform the buffer into a string + ver = "" + for i in range(n): + ver += verbuff[i] + + # Get major, minor and micro from version + version = ver.split('-')[1] + prerelease = 0 + major, minor, micro = [i for i in version.split('.')] + try: + micro = int(micro) + except ValueError,e: + print "micro is " + str(micro) + micro, prerelease = micro.split('pre') + + return int(major), int(minor), int(micro), prerelease + +MAJOR, MINOR, MICRO, PRERELEASE = get_libsndfile_version() +if not(MAJOR == 1): + raise Exception("audiolab expects major version %d of libsndfile" % 1) +if not(MICRO == 17): + if PRERELEASE == 0: + prestr = "No" + else: + prestr = "%s" % PRERELEASE + print "WARNING libsndfile-%d.%d.%d (prerelease: %s) "\ + "this has only been tested with libsndfile 1.0.17 for now, "\ + "use at your own risk !" % (MAJOR, MINOR, MICRO, prestr) + +#================ +# Python wrappers +#================ + +#+++++++++++++++++ +# Public exception +#+++++++++++++++++ +class PyaudioException(Exception): + pass + +class InvalidFormat(PyaudioException): + pass + +class PyaudioIOError(PyaudioException, IOError): + pass + +class WrappingError(PyaudioException): + pass + +class FlacUnsupported(RuntimeError, PyaudioException): + pass + +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# Private classes/function (Should not be used outside this file) +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +class _sf_info(Structure): + """Structure representing C structure SF_INFO""" + _fields_ = [('frames', c_int64), + ('samplerate', c_int), + ('channels', c_int), + ('format', c_int), + ('sections', c_int), + ('seekable', c_int)] + def __str__(self): + return "%d frames, sr = %d Hz, %d channels, format is %d" % \ + (self.frames, self.samplerate, self.channels, self.format) + +class _sf_format_info(Structure): + """Structure representing C structure SF_FORMAT_INFO (useful for + sf_command )""" + _fields_ = [('format', c_int), + ('name', c_char_p), + ('extension', c_char_p)] + def __str__(self): + return "format hex is %#010x, name is %s, extension is %s" % \ + (self.format, self.name, self.extension) + + def __repr__(self): + print self.__str__() + +class _sndfile(Structure): + pass + +sf_info_p = POINTER(_sf_info) +sndfile_p = POINTER(_sndfile) + +# functions args +# TODO: is there a way to ensure that arg1 is the right kind of pointer ? +arg1 = c_char_p +arg2 = c_int +arg3 = sf_info_p +_SND.sf_open.argtypes = [arg1, arg2, arg3] +_SND.sf_open.restype = sndfile_p + +arg1 = sndfile_p +_SND.sf_close.argtypes = [arg1] +_SND.sf_close.restype = c_int + +arg1 = c_int +arg2 = c_int +arg3 = sf_info_p +arg4 = c_int +_SND.sf_open_fd.argtypes = [arg1, arg2, arg3, arg4] +_SND.sf_open_fd.restype = sndfile_p + +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.float64) +arg3 = c_int64 + +# double function +_SND.sf_readf_double.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_double.restype = c_int64 + +_SND.sf_writef_double.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_double.restype = c_int64 + +# float function +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.float32) +arg3 = c_int64 +_SND.sf_readf_float.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_float.restype = c_int64 + +_SND.sf_writef_float.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_float.restype = c_int64 + +# int function +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.int32) +arg3 = c_int64 +_SND.sf_readf_int.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_int.restype = c_int64 + +_SND.sf_writef_int.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_int.restype = c_int64 + +# short function +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.int16) +arg3 = c_int64 +_SND.sf_readf_short.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_short.restype = c_int64 + +_SND.sf_writef_short.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_short.restype = c_int64 + +# Error functions +arg1 = sndfile_p +_SND.sf_strerror.argtypes = [arg1] +_SND.sf_strerror.restype = c_char_p + +# Function to sync data to file +arg1 = sndfile_p +_SND.sf_write_sync.argtypes = [arg1] + +# Function to seek +arg1 = sndfile_p +arg2 = c_int64 +arg3 = c_int +_SND.sf_seek.argtypes = [arg1, arg2, arg3] +_SND.sf_seek.restype = c_int64 + +# To pass when a C function needs a NULL arg +_cNULL = POINTER(c_int)() + +class _format_from_internal: + """Class to handle audio format with sndfile. + + DO NOT USE THIS CLASS OUTSIDE pysndfile.py MODULE: YOU MAY CRASH YOUR + INTERPRETER ! + + Basically, we have 3 classes of parameters: + - the main format: (major format), like wav, aiff, etc... + - the subtype format: pcm, bits resolution + - endianness: little, big, as the cpu, default of the format + + This class encapsulates those parameters, and can build a representation of + them from the format integer of sf_info. This should *NOT* be used, use + format instead, which inherits this class to build a valid format from user + friendly arguments. """ + def __init__(self, format_integer): + # Get the internal values which corresponds to the values libsndfile + # can understand + self._int_type = format_integer & SF_FORMAT['SF_FORMAT_TYPEMASK'] + self._int_encoding = format_integer & SF_FORMAT['SF_FORMAT_SUBMASK'] + self._int_endianness = format_integer & SF_FORMAT['SF_FORMAT_ENDMASK'] + + assert format_integer == self._int_type | self._int_encoding |\ + self._int_endianness + self._format = format_integer + + # Now, we need to test if the combination of format, encoding and + # endianness is valid. sf_format_check needs also samplerate and + # channel information, so just give a fake samplerate and channel + # number. Looking at sndfile.c, it looks like samplerate is never + # actually checked, and that when channels is checked, it is only + # checked against values different than 1 or 2, so giving a value of + # 1 to channel should be ok. + self._sfinfo = _sf_info() + self._sfinfo.channels = 1 + self._sfinfo.samplerate = 8000 + self._sfinfo.format = self._format + + ret = _SND.sf_format_check(pointer(self._sfinfo)) + if ret is not SF_BOOL['SF_TRUE']: + raise InvalidFormat() + + # Get the sndfile string description of the format type + blop = _sf_format_info() + blop.format = self._int_type + st = _SND.sf_command(_cNULL, SF_COMMAND['SFC_GET_FORMAT_INFO'], \ + pointer(blop), sizeof(blop)) + if st is not 0: + if SND_TO_PY_FILE_FORMAT[self._int_type] == 'flac': + raise FlacUnsupported("Flac is not supported by your version"\ + " of libsndfile") + else: + raise WrappingError("Could not get format string for format "\ + "%d, " % blop.format + "please report this problem "\ + "to the maintainer") + + self.format_str = blop.name + + # Get the sndfile string description of the format subtype + blop.format = self._int_encoding + st = _SND.sf_command(_cNULL, SF_COMMAND['SFC_GET_FORMAT_INFO'], \ + pointer(blop), sizeof(blop)) + if st is not 0: + raise WrappingError() + + self.encoding_str = blop.name + + def get_format_raw(self): + """Do not use this function !""" + return self._format + + def get_major_str(self): + """Do not use this function !""" + return self.format_str + + def get_encoding_str(self): + """Do not use this function !""" + return self.encoding_str + + def get_file_format(self): + """return user friendly file format string""" + return SND_TO_PY_FILE_FORMAT[self._int_type] + + def get_encoding(self): + """return user friendly encoding string""" + return SND_TO_PY_ENCODING[self._int_encoding] + + def get_endianness(self): + """return user friendly file format string""" + return SND_TO_PY_ENDIANNESS[self._int_endianness] + + # Various function + def is_type(self, t): + return (self._format & SF_FORMAT['SF_FORMAT_TYPEMASK']) \ + == py_to_snd_file_format_dic[t] + + # Syntactic sugar + def __str__(self): + return "Major Format: %s, Encoding Format: %s" % \ + (self.format_str, self.encoding_str) + + def __repr__(self): + return self.__str__() + +#+++++++++++ +# Public API +#+++++++++++ + +class formatinfo(_format_from_internal): + def __init__(self, type = 'wav', encoding = 'pcm16', endianness = 'file'): + """Build a valid format usable by the sndfile class when opening an + audio file for writing. + + Blah blah + + :Parameters: + type : string + represents the major file format (wav, etc...). + encoding : string + represents the encoding (pcm16, etc..). + endianness : string + represents the endianess. + + Notes + ----- + + Valid type strings are listed by file_format_dic.keys() Valid encoding + strings are listed by encoding_dic.keys() Valid endianness strings are + listed by endianness_dic.keys() """ + # Keep the arguments + self.type = type + self.encoding = encoding + self.endianness = endianness + + # Get the internal values which corresponds to the values libsndfile + # can understand + self._int_type = py_to_snd_file_format_dic[type] + self._int_encoding = py_to_snd_encoding_dic[encoding] + self._int_endianness = py_to_snd_endianness_dic[endianness] + + # Build the internal integer from parameters, and pass it to the super + # class, which will do all the work + format = self._int_type | self._int_encoding | self._int_endianness + + _format_from_internal.__init__(self, format) + +class sndfile: + """Main class to open, read and write audio files""" + def __init__(self, filename, mode = 'read', format = None, channels = 0, \ + samplerate = 0): + """Create an instance of sndfile. + + :Parameters: + filename : string or int + name of the file to open (string), or file descriptor (integer) + mode : string + 'read' for read, 'write' for write, or 'rwrite' for read and + write. + format : formatinfo + when opening a new file for writing, give the format to write + in. + channels : int + number of channels. + samplerate : int + sampling rate. + + :Returns: + sndfile: a valid sndfile object + + Notes + ----- + + format, channels and samplerate need to be given only in the write + modes and for raw files. """ + # Check the mode is one of the expected values + if mode == 'read': + sfmode = SFM['SFM_READ'] + elif mode == 'write': + sfmode = SFM['SFM_WRITE'] + if format == None: + raise Exception("For write mode, you should provide"\ + "a format argument !") + elif mode == 'rwrite': + sfmode = SFM['SFM_RDWR'] + if format == None: + raise Exception("For write mode, you should provide"\ + "a format argument !") + else: + raise Exception("mode %s not recognized" % str(mode)) + + sfinfo = _sf_info() + sfinfo_p = pointer(sfinfo) + + # Fill the sfinfo struct + sfinfo.frames = c_int64(0) + if type(channels) is not int: + print "Warning, channels is converted to int, was %s" % \ + str(type(channels)) + sfinfo.channels = int(channels) + else: + sfinfo.channels = channels + + if type(samplerate) is not int: + print "Warning, sampling rate is converted to int, was %s" % \ + str(type(samplerate)) + sfinfo.samplerate = int(samplerate) + else: + sfinfo.samplerate = samplerate + + sfinfo.sections = 0 + sfinfo.seekable = False + if mode == 'read' and format == None: + sfinfo.format = 0 + else: + if sfinfo.channels > 256 or sfinfo.channels < 1: + msg = "number of channels is %d, expected " \ + "between 1 and 256" % sfinfo.channels + raise RuntimeError(msg) + sfinfo.format = format.get_format_raw() + if not _SND.sf_format_check(sfinfo_p): + msg = "unknown error in format specification ?" +\ + " Please report this to the author" + raise WrappingError() + + sfinfo_p = pointer(sfinfo) + self._sfmode = sfmode + self.hdl = 0 + + if type(filename) == int: + res = _SND.sf_open_fd(filename, self._sfmode, sfinfo_p, + SF_BOOL['SF_FALSE']) + self._byfd = True + self.fd = filename + self.filename = "" + else: + res = _SND.sf_open(filename, self._sfmode, sfinfo_p) + self._byfd = False + self.filename = filename + + try: + # If res is NULL, this statement will raise a ValueError exception + a = res[0] + except ValueError: + if self._byfd: + msg = "error while opening file descriptor %d\n\t->" % self.fd + else: + msg = "error while opening file %s\n\t-> " % self.filename + msg += _SND.sf_strerror(res) + if self._byfd: + msg += """ +(Check that the mode argument passed to sndfile is the same than the one used +when getting the file descriptor, eg do not pass 'read' to sndfile if you +passed 'write' to open to get the file descriptor. If you are on win32, you are +out of luck, because its implementation of POSIX open is broken)""" + raise IOError("error while opening %s\n\t->%s" % (filename, msg)) + + if mode == 'read': + tmp = _format_from_internal(sfinfo.format) + self._format = formatinfo(tmp.get_file_format(), \ + tmp.get_encoding(), tmp.get_endianness()) + else: + self._format = format + + self._sfinfo = sfinfo + self.hdl = res + + if self.get_file_format() == 'flac': + def SeekNotEnabled(self, *args): + raise FlacUnsupported("seek not supported on Flac by default,"\ + " because\n some version of FLAC libraries are buggy."\ + " Read FLAC_SUPPORT.txt") + self.seek = SeekNotEnabled + else: + self.seek = self._seek + + def __del__(self, close_func = _SND.sf_close): + # Stupid python needs the close_func, otherwise + # it may clean ctypes before calling here + if hasattr(self,'hdl'): + if not(self.hdl == 0): + close_func(self.hdl) + self.hdl = 0 + + def close(self): + """close the file.""" + self.__del__() + + def sync(self): + """call the operating system's function to force the writing of all + file cache buffers to disk the file. + + No effect if file is open as read""" + _SND.sf_write_sync(self.hdl) + + def _seek(self, offset, whence = 0, mode = 'rw'): + """similar to python seek function, taking only in account audio data. + + :Parameters: + offset : int + the number of frames (eg two samples for stereo files) to move + relatively to position set by whence. + whence : int + only 0 (beginning), 1 (current) and 2 (end of the file) are + valid. + mode : string + If set to 'rw', both read and write pointers are updated. If + 'r' is given, only read pointer is updated, if 'w', only the + write one is (this may of course make sense only if you open + the file in a certain mode). + + Notes + ----- + + - one only takes into accound audio data. + - if an invalid seek is given (beyond or before the file), a + PyaudioIOError is launched.""" + c_offset = _num2int64(offset) + if mode == 'rw': + # Update both read and write pointers + st = _SND.sf_seek(self.hdl, c_offset, whence) + elif mode == 'r': + whence = whence | SFM['SFM_READ'] + st = _SND.sf_seek(self.hdl, c_offset, whence) + elif mode == 'w': + whence = whence | SFM['SFM_WRITE'] + st = _SND.sf_seek(self.hdl, c_offset, whence) + else: + raise ValueError("mode should be one of 'r', 'w' or 'rw' only") + + if st == -1: + msg = "Error while seeking, libsndfile error is %s" \ + % (_SND.sf_strerror(self.hdl)) + raise PyaudioIOError(msg) + return st + + # Functions to get informations about the file + def get_nframes(self): + """ Return the number of frames of the file""" + if self._sfmode == SFM['SFM_READ']: + # XXX: is this reliable for any file (think pipe and co ?) + return self._sfinfo.frames + else: + # In write/rwrite mode, the only reliable way to get the number of + # frames is to use seek. + raise NotImplementedError("Sorry, getting the current number of" + "frames in write modes is not supported yet") + + def get_samplerate(self): + """ Return the samplerate in Hz of the file""" + return self._sfinfo.samplerate + + def get_channels(self): + """ Return the number of channels of the file""" + return self._sfinfo.channels + + def get_file_format(self): + """return user friendly file format string""" + return SND_TO_PY_FILE_FORMAT[self._format._int_type] + + def get_encoding(self): + """return user friendly encoding string""" + return SND_TO_PY_ENCODING[self._format._int_encoding] + + def get_endianness(self): + """return user friendly file format string""" + return SND_TO_PY_ENDIANNESS[self._format._int_endianness] + + #------------------ + # Functions to read + #------------------ + def read_frames(self, nframes, dtype = N.float64): + """Read nframes frames of the file. + + :Parameters: + nframes : int + number of frames to read. + dtype : numpy dtype + dtype of the returned array containing read data (see note). + + Notes + ----- + + - read_frames updates the read pointer. + - One column is one channel. + - if float are requested when the file contains integer data, you will + get normalized data (that is the max possible integer will be 1.0, + and the minimal possible value -1.0). + - if integers are requested when the file contains floating point data, + it may give wrong results because there is an ambiguity: if the + floating data are normalized, you can get a file with only 0 ! + Getting integer data from files encoded in normalized floating point + is not supported (yet: sndfile supports it).""" + c_nframes = _num2int64(nframes) + if c_nframes < 0: + raise ValueError("number of frames has to be >= 0") + + # XXX: inout argument + if self._sfinfo.channels > 1: + y = N.zeros((nframes, self._sfinfo.channels), dtype) + else: + y = N.zeros(nframes, dtype) + + if dtype == N.float64: + res = _SND.sf_readf_double(self.hdl, y, c_nframes) + elif dtype == N.float32: + res = _SND.sf_readf_float(self.hdl, y, c_nframes) + elif dtype == N.int32: + res = _SND.sf_readf_int(self.hdl, y, c_nframes) + elif dtype == N.int16: + res = _SND.sf_readf_short(self.hdl, y, c_nframes) + else: + RuntimeError("Sorry, only float, double, int and short read " + \ + "supported for now") + + if not(res == nframes): + msg = "Read %d frames, expected to read %d" % (res, nframes) + msg += ", libsndfile last msg is \n\t%s" \ + % _SND.sf_strerror(self.hdl) + raise IOError(msg) + + return y + + #------------------- + # Functions to write + #------------------- + # TODO: Think about overflow vs type of input, etc... + def write_frames(self, input, nframes = -1): + """write data to file. + + :Parameters: + input : ndarray + array containing data to write. + nframes : int + number of frames to write. + + Notes + ----- + + - one channel is one column + - updates the write pointer. + - if float are given when the file contains integer data, you should + put normalized data (that is the range [-1..1] will be written as the + maximum range allowed by the integer bitwidth).""" + # First, get the number of channels and frames from input + if input.ndim == 1: + nc = 1 + else: + if input.ndim > 2: + raise Exception("Expect array of rank <= 2, got %d" \ + % input.ndim) + nc = input.shape[1] + + if nframes == -1: + nframes = N.size(input) + # Number of channels should be the one expected + if not(nc == self._sfinfo.channels): + raise Exception("Expected %d channels, got %d" % \ + (self._sfinfo.channels, nc)) + + # Writing to the file + c_nframes = _num2int64(nframes) + if c_nframes < 0: + raise ValueError("number of frames has to be >= 0") + + input = N.require(input, requirements = 'C') + + if input.dtype == N.float32: + if self._check_overflow(input): + warnings.warn("Warning, overflow detected when writing.") + res = _SND.sf_writef_float(self.hdl, input, c_nframes) + elif input.dtype == N.float64: + self._check_overflow(input) + if self._check_overflow(input): + warnings.warn("Warning, overflow detected when writing.") + res = _SND.sf_writef_double(self.hdl, input, c_nframes) + elif input.dtype == N.int32: + res = _SND.sf_writef_int(self.hdl, input, c_nframes) + elif input.dtype == N.int16: + res = _SND.sf_writef_short(self.hdl, input, c_nframes) + else: + raise Exception("type of input not understood: input should" + " be float64 or float32""") + + if not(res == nframes): + raise IOError("write %d frames, expected to write %d" \ + % res, nframes) + + def _check_overflow(self, data): + if N.max(data ** 2) >= 1.: + return True + return False + + # Syntactic sugar + def __repr__(self): + return self.__str__() + + def __str__(self): + repstr = "----------------------------------------\n" + if self._byfd: + repstr += "File : %d (opened by file descriptor)\n" % self.fd + else: + repstr += "File : %s\n" % self.filename + repstr += "Channels : %d\n" % self._sfinfo.channels + repstr += "Sample rate : %d\n" % self._sfinfo.samplerate + repstr += "Frames : %d\n" % self._sfinfo.frames + repstr += "Raw Format : %#010x -> %s\n" % \ + (self._format.get_format_raw(), self._format.get_major_str()) + repstr += "File format : %s\n" % self.get_file_format() + repstr += "Encoding : %s\n" % self.get_encoding() + repstr += "Endianness : %s\n" % self.get_endianness() + repstr += "Sections : %d\n" % self._sfinfo.sections + if self._sfinfo.seekable: + seek = 'True' + else: + seek = 'False' + repstr += "Seekable : %s\n" % seek + repstr += "Duration : %s\n" % self._generate_duration_str() + return repstr + + def _generate_duration_str(self): + if self._sfinfo.samplerate < 1: + return None + tsec = self._sfinfo.frames / self._sfinfo.samplerate + hrs = tsec / 60 / 60 + tsec = tsec % (60 ** 2) + mins = tsec / 60 + tsec = tsec % 60 + secs = tsec + ms = 1000 * self._sfinfo.frames / self._sfinfo.samplerate % 1000 + + return "%02d:%02d:%02d.%3d" % (hrs, mins, secs, ms) + +def supported_format(): + # XXX: broken + return py_to_snd_file_format_dic.keys() + +def supported_endianness(): + # XXX: broken + return py_to_snd_endianness_dic.keys() + +def supported_encoding(): + # XXX: broken + return py_to_snd_encoding_dic.keys() + +def _num2int64(value): + """ Convert a python objet to a c_int64, safely.""" + if not (type(value) == int or type(value) == long): + value = long(value) + print "Warning, converting %s to long" % str(value) + c_value = c_int64(value) + if not c_value.value == value: + raise RuntimeError("Error while converting %s to a c_int64"\ + ", maybe %s is too big ?" % str(value)) + return c_value diff --git a/telemeta/util/audiolab/scikits/audiolab/pysndfile.py.in b/telemeta/util/audiolab/scikits/audiolab/pysndfile.py.in new file mode 100644 index 00000000..574e5bb1 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/pysndfile.py.in @@ -0,0 +1,886 @@ +#! /usr/bin/env python +# Last Change: Wed Oct 03 05:00 PM 2007 J + +# Copyright (C) 2006-2007 Cournapeau David +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# vim:syntax=python + +# TODO: +# - import format classes so that we get meaningful information from an +# existing format +# - better API for reader/writer, including integer formats and partial +# reading +# - ability to get log of sndfile ? +# - check how to play sound under windows, OS X and other UNIX + +"""This module implements the wrappers around libsndfile.""" + +__docformat__ = 'restructuredtext' + +#__all__ = ['sndfile', 'formatinfo'] + +import copy +import warnings + +#================ +# Load libsndfile +#================ +import ctypes +from ctypes import cdll, Structure, c_int, pointer, POINTER, \ + create_string_buffer, c_char_p, sizeof, string_at +try: + from ctypes import c_int64 +except ImportError, e: + print "Cannot import c_int64 from ctypes: if you are on ubuntu/debian," +\ + " this is likely because ctypes was compiled with libffi. see" +\ + " https://launchpad.net/ubuntu/+source/python2.5/+bug/71914" + raise e + +from numpy.ctypeslib import ndpointer +CTYPES_MAJOR = int(ctypes.__version__.split('.')[0]) +CTYPES_MINOR = int(ctypes.__version__.split('.')[1]) +CTYPES_MICRO = int(ctypes.__version__.split('.')[2]) +if CTYPES_MAJOR < 1 or (CTYPES_MINOR == 0 and CTYPES_MICRO < 1): + raise ImportError("version of ctypes is %s, expected at least %s" \ + % (ctypes.__version__, '1.0.1')) +import numpy as N + +_SND = cdll.LoadLibrary('%SHARED_LOCATION%') + +#========================= +# Definition of constants +#========================= +# READ/WRITE Mode +%SFM% + +# SF BOOL +%SF_BOOL% + +# Format +%SF_FORMAT% + +# ENDIANESS +%SF_ENDIAN% + +# Commands +%SF_COMMAND% + +%SF_ERR% + +# format equivalence: dic used to create internally +# the right enum values from user friendly strings +py_to_snd_encoding_dic = { + 'pcms8' : SF_FORMAT['SF_FORMAT_PCM_S8'], + 'pcm16' : SF_FORMAT['SF_FORMAT_PCM_16'], + 'pcm24' : SF_FORMAT['SF_FORMAT_PCM_24'], + 'pcm32' : SF_FORMAT['SF_FORMAT_PCM_32'], + + 'pcmu8' : SF_FORMAT['SF_FORMAT_PCM_U8'], + + 'float32' : SF_FORMAT['SF_FORMAT_FLOAT'], + 'float64' : SF_FORMAT['SF_FORMAT_DOUBLE'], + + 'ulaw' : SF_FORMAT['SF_FORMAT_ULAW'], + 'alaw' : SF_FORMAT['SF_FORMAT_ALAW'], + 'ima_adpcm' : SF_FORMAT['SF_FORMAT_IMA_ADPCM'], + 'ms_adpcm' : SF_FORMAT['SF_FORMAT_MS_ADPCM'], + + 'gsm610' : SF_FORMAT['SF_FORMAT_GSM610'], + 'vox_adpcm' : SF_FORMAT['SF_FORMAT_VOX_ADPCM'], + + 'g721_32' : SF_FORMAT['SF_FORMAT_G721_32'], + 'g723_24' : SF_FORMAT['SF_FORMAT_G723_24'], + 'g723_40' : SF_FORMAT['SF_FORMAT_G723_40'], + + 'dww12' : SF_FORMAT['SF_FORMAT_DWVW_12'], + 'dww16' : SF_FORMAT['SF_FORMAT_DWVW_16'], + 'dww24' : SF_FORMAT['SF_FORMAT_DWVW_24'], + 'dwwN' : SF_FORMAT['SF_FORMAT_DWVW_N'], + + 'dpcm8' : SF_FORMAT['SF_FORMAT_DPCM_8'], + 'dpcm16': SF_FORMAT['SF_FORMAT_DPCM_16'] +} + +py_to_snd_file_format_dic = { + 'wav' : SF_FORMAT['SF_FORMAT_WAV'], + 'aiff' : SF_FORMAT['SF_FORMAT_AIFF'], + 'au' : SF_FORMAT['SF_FORMAT_AU'], + 'raw' : SF_FORMAT['SF_FORMAT_RAW'], + 'paf' : SF_FORMAT['SF_FORMAT_PAF'], + 'svx' : SF_FORMAT['SF_FORMAT_SVX'], + 'nist' : SF_FORMAT['SF_FORMAT_NIST'], + 'voc' : SF_FORMAT['SF_FORMAT_VOC'], + 'ircam' : SF_FORMAT['SF_FORMAT_IRCAM'], + 'wav64' : SF_FORMAT['SF_FORMAT_W64'], + 'mat4' : SF_FORMAT['SF_FORMAT_MAT4'], + 'mat5' : SF_FORMAT['SF_FORMAT_MAT5'], + 'pvf' : SF_FORMAT['SF_FORMAT_PVF'], + 'xi' : SF_FORMAT['SF_FORMAT_XI'], + 'htk' : SF_FORMAT['SF_FORMAT_HTK'], + 'sds' : SF_FORMAT['SF_FORMAT_SDS'], + 'avr' : SF_FORMAT['SF_FORMAT_AVR'], + 'wavex' : SF_FORMAT['SF_FORMAT_WAVEX'], + 'sd2' : SF_FORMAT['SF_FORMAT_SD2'], + 'flac' : SF_FORMAT['SF_FORMAT_FLAC'], + 'caf' : SF_FORMAT['SF_FORMAT_CAF'] +} + +py_to_snd_endianness_dic = { + 'file' : SF_ENDIAN['SF_ENDIAN_FILE'], + 'little' : SF_ENDIAN['SF_ENDIAN_LITTLE'], + 'big' : SF_ENDIAN['SF_ENDIAN_BIG'], + 'cpu' : SF_ENDIAN['SF_ENDIAN_CPU'] +} + +# Those following dic are used internally to get user-friendly values from +# sndfile enum +SND_TO_PY_ENCODING = \ + dict([(i, j) for j, i in py_to_snd_encoding_dic.items()]) +SND_TO_PY_FILE_FORMAT = \ + dict([(i, j) for j, i in py_to_snd_file_format_dic.items()]) +SND_TO_PY_ENDIANNESS = \ + dict([(i, j) for j, i in py_to_snd_endianness_dic.items()]) + +#========================================== +# Check that libsndfile is expected version +#========================================== +def get_libsndfile_version(): + nverbuff = 256 + verbuff = create_string_buffer(nverbuff) + n = _SND.sf_command(c_int(0), c_int(SF_COMMAND['SFC_GET_LIB_VERSION']), + verbuff, nverbuff) + if n < 1: + raise Exception("Error while getting version of libsndfile") + + # Transform the buffer into a string + ver = "" + for i in range(n): + ver += verbuff[i] + + # Get major, minor and micro from version + version = ver.split('-')[1] + prerelease = 0 + major, minor, micro = [i for i in version.split('.')] + try: + micro = int(micro) + except ValueError,e: + print "micro is " + str(micro) + micro, prerelease = micro.split('pre') + + return int(major), int(minor), int(micro), prerelease + +MAJOR, MINOR, MICRO, PRERELEASE = get_libsndfile_version() +if not(MAJOR == 1): + raise Exception("audiolab expects major version %d of libsndfile" % 1) +if not(MICRO == 17): + if PRERELEASE == 0: + prestr = "No" + else: + prestr = "%s" % PRERELEASE + print "WARNING libsndfile-%d.%d.%d (prerelease: %s) "\ + "this has only been tested with libsndfile 1.0.17 for now, "\ + "use at your own risk !" % (MAJOR, MINOR, MICRO, prestr) + +#================ +# Python wrappers +#================ + +#+++++++++++++++++ +# Public exception +#+++++++++++++++++ +class PyaudioException(Exception): + pass + +class InvalidFormat(PyaudioException): + pass + +class PyaudioIOError(PyaudioException, IOError): + pass + +class WrappingError(PyaudioException): + pass + +class FlacUnsupported(RuntimeError, PyaudioException): + pass + +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# Private classes/function (Should not be used outside this file) +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +class _sf_info(Structure): + """Structure representing C structure SF_INFO""" + _fields_ = [('frames', c_int64), + ('samplerate', c_int), + ('channels', c_int), + ('format', c_int), + ('sections', c_int), + ('seekable', c_int)] + def __str__(self): + return "%d frames, sr = %d Hz, %d channels, format is %d" % \ + (self.frames, self.samplerate, self.channels, self.format) + +class _sf_format_info(Structure): + """Structure representing C structure SF_FORMAT_INFO (useful for + sf_command )""" + _fields_ = [('format', c_int), + ('name', c_char_p), + ('extension', c_char_p)] + def __str__(self): + return "format hex is %#010x, name is %s, extension is %s" % \ + (self.format, self.name, self.extension) + + def __repr__(self): + print self.__str__() + +class _sndfile(Structure): + pass + +sf_info_p = POINTER(_sf_info) +sndfile_p = POINTER(_sndfile) + +# functions args +# TODO: is there a way to ensure that arg1 is the right kind of pointer ? +arg1 = c_char_p +arg2 = c_int +arg3 = sf_info_p +_SND.sf_open.argtypes = [arg1, arg2, arg3] +_SND.sf_open.restype = sndfile_p + +arg1 = sndfile_p +_SND.sf_close.argtypes = [arg1] +_SND.sf_close.restype = c_int + +arg1 = c_int +arg2 = c_int +arg3 = sf_info_p +arg4 = c_int +_SND.sf_open_fd.argtypes = [arg1, arg2, arg3, arg4] +_SND.sf_open_fd.restype = sndfile_p + +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.float64) +arg3 = c_int64 + +# double function +_SND.sf_readf_double.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_double.restype = c_int64 + +_SND.sf_writef_double.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_double.restype = c_int64 + +# float function +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.float32) +arg3 = c_int64 +_SND.sf_readf_float.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_float.restype = c_int64 + +_SND.sf_writef_float.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_float.restype = c_int64 + +# int function +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.int32) +arg3 = c_int64 +_SND.sf_readf_int.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_int.restype = c_int64 + +_SND.sf_writef_int.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_int.restype = c_int64 + +# short function +arg1 = sndfile_p +arg2 = ndpointer(dtype=N.int16) +arg3 = c_int64 +_SND.sf_readf_short.argtypes = [arg1, arg2, arg3] +_SND.sf_readf_short.restype = c_int64 + +_SND.sf_writef_short.argtypes = [arg1, arg2, arg3] +_SND.sf_writef_short.restype = c_int64 + +# Error functions +arg1 = sndfile_p +_SND.sf_strerror.argtypes = [arg1] +_SND.sf_strerror.restype = c_char_p + +# Function to sync data to file +arg1 = sndfile_p +_SND.sf_write_sync.argtypes = [arg1] + +# Function to seek +arg1 = sndfile_p +arg2 = c_int64 +arg3 = c_int +_SND.sf_seek.argtypes = [arg1, arg2, arg3] +_SND.sf_seek.restype = c_int64 + +# To pass when a C function needs a NULL arg +_cNULL = POINTER(c_int)() + +class _format_from_internal: + """Class to handle audio format with sndfile. + + DO NOT USE THIS CLASS OUTSIDE pysndfile.py MODULE: YOU MAY CRASH YOUR + INTERPRETER ! + + Basically, we have 3 classes of parameters: + - the main format: (major format), like wav, aiff, etc... + - the subtype format: pcm, bits resolution + - endianness: little, big, as the cpu, default of the format + + This class encapsulates those parameters, and can build a representation of + them from the format integer of sf_info. This should *NOT* be used, use + format instead, which inherits this class to build a valid format from user + friendly arguments. """ + def __init__(self, format_integer): + # Get the internal values which corresponds to the values libsndfile + # can understand + self._int_type = format_integer & SF_FORMAT['SF_FORMAT_TYPEMASK'] + self._int_encoding = format_integer & SF_FORMAT['SF_FORMAT_SUBMASK'] + self._int_endianness = format_integer & SF_FORMAT['SF_FORMAT_ENDMASK'] + + assert format_integer == self._int_type | self._int_encoding |\ + self._int_endianness + self._format = format_integer + + # Now, we need to test if the combination of format, encoding and + # endianness is valid. sf_format_check needs also samplerate and + # channel information, so just give a fake samplerate and channel + # number. Looking at sndfile.c, it looks like samplerate is never + # actually checked, and that when channels is checked, it is only + # checked against values different than 1 or 2, so giving a value of + # 1 to channel should be ok. + self._sfinfo = _sf_info() + self._sfinfo.channels = 1 + self._sfinfo.samplerate = 8000 + self._sfinfo.format = self._format + + ret = _SND.sf_format_check(pointer(self._sfinfo)) + if ret is not SF_BOOL['SF_TRUE']: + raise InvalidFormat() + + # Get the sndfile string description of the format type + blop = _sf_format_info() + blop.format = self._int_type + st = _SND.sf_command(_cNULL, SF_COMMAND['SFC_GET_FORMAT_INFO'], \ + pointer(blop), sizeof(blop)) + if st is not 0: + if SND_TO_PY_FILE_FORMAT[self._int_type] == 'flac': + raise FlacUnsupported("Flac is not supported by your version"\ + " of libsndfile") + else: + raise WrappingError("Could not get format string for format "\ + "%d, " % blop.format + "please report this problem "\ + "to the maintainer") + + self.format_str = blop.name + + # Get the sndfile string description of the format subtype + blop.format = self._int_encoding + st = _SND.sf_command(_cNULL, SF_COMMAND['SFC_GET_FORMAT_INFO'], \ + pointer(blop), sizeof(blop)) + if st is not 0: + raise WrappingError() + + self.encoding_str = blop.name + + def get_format_raw(self): + """Do not use this function !""" + return self._format + + def get_major_str(self): + """Do not use this function !""" + return self.format_str + + def get_encoding_str(self): + """Do not use this function !""" + return self.encoding_str + + def get_file_format(self): + """return user friendly file format string""" + return SND_TO_PY_FILE_FORMAT[self._int_type] + + def get_encoding(self): + """return user friendly encoding string""" + return SND_TO_PY_ENCODING[self._int_encoding] + + def get_endianness(self): + """return user friendly file format string""" + return SND_TO_PY_ENDIANNESS[self._int_endianness] + + # Various function + def is_type(self, t): + return (self._format & SF_FORMAT['SF_FORMAT_TYPEMASK']) \ + == py_to_snd_file_format_dic[t] + + # Syntactic sugar + def __str__(self): + return "Major Format: %s, Encoding Format: %s" % \ + (self.format_str, self.encoding_str) + + def __repr__(self): + return self.__str__() + +#+++++++++++ +# Public API +#+++++++++++ + +class formatinfo(_format_from_internal): + def __init__(self, type = 'wav', encoding = 'pcm16', endianness = 'file'): + """Build a valid format usable by the sndfile class when opening an + audio file for writing. + + Blah blah + + :Parameters: + type : string + represents the major file format (wav, etc...). + encoding : string + represents the encoding (pcm16, etc..). + endianness : string + represents the endianess. + + Notes + ----- + + Valid type strings are listed by file_format_dic.keys() Valid encoding + strings are listed by encoding_dic.keys() Valid endianness strings are + listed by endianness_dic.keys() """ + # Keep the arguments + self.type = type + self.encoding = encoding + self.endianness = endianness + + # Get the internal values which corresponds to the values libsndfile + # can understand + self._int_type = py_to_snd_file_format_dic[type] + self._int_encoding = py_to_snd_encoding_dic[encoding] + self._int_endianness = py_to_snd_endianness_dic[endianness] + + # Build the internal integer from parameters, and pass it to the super + # class, which will do all the work + format = self._int_type | self._int_encoding | self._int_endianness + + _format_from_internal.__init__(self, format) + +class sndfile: + """Main class to open, read and write audio files""" + def __init__(self, filename, mode = 'read', format = None, channels = 0, \ + samplerate = 0): + """Create an instance of sndfile. + + :Parameters: + filename : string or int + name of the file to open (string), or file descriptor (integer) + mode : string + 'read' for read, 'write' for write, or 'rwrite' for read and + write. + format : formatinfo + when opening a new file for writing, give the format to write + in. + channels : int + number of channels. + samplerate : int + sampling rate. + + :Returns: + sndfile: a valid sndfile object + + Notes + ----- + + format, channels and samplerate need to be given only in the write + modes and for raw files. """ + # Check the mode is one of the expected values + if mode == 'read': + sfmode = SFM['SFM_READ'] + elif mode == 'write': + sfmode = SFM['SFM_WRITE'] + if format == None: + raise Exception("For write mode, you should provide"\ + "a format argument !") + elif mode == 'rwrite': + sfmode = SFM['SFM_RDWR'] + if format == None: + raise Exception("For write mode, you should provide"\ + "a format argument !") + else: + raise Exception("mode %s not recognized" % str(mode)) + + sfinfo = _sf_info() + sfinfo_p = pointer(sfinfo) + + # Fill the sfinfo struct + sfinfo.frames = c_int64(0) + if type(channels) is not int: + print "Warning, channels is converted to int, was %s" % \ + str(type(channels)) + sfinfo.channels = int(channels) + else: + sfinfo.channels = channels + + if type(samplerate) is not int: + print "Warning, sampling rate is converted to int, was %s" % \ + str(type(samplerate)) + sfinfo.samplerate = int(samplerate) + else: + sfinfo.samplerate = samplerate + + sfinfo.sections = 0 + sfinfo.seekable = False + if mode == 'read' and format == None: + sfinfo.format = 0 + else: + if sfinfo.channels > 256 or sfinfo.channels < 1: + msg = "number of channels is %d, expected " \ + "between 1 and 256" % sfinfo.channels + raise RuntimeError(msg) + sfinfo.format = format.get_format_raw() + if not _SND.sf_format_check(sfinfo_p): + msg = "unknown error in format specification ?" +\ + " Please report this to the author" + raise WrappingError() + + sfinfo_p = pointer(sfinfo) + self._sfmode = sfmode + self.hdl = 0 + + if type(filename) == int: + res = _SND.sf_open_fd(filename, self._sfmode, sfinfo_p, + SF_BOOL['SF_FALSE']) + self._byfd = True + self.fd = filename + self.filename = "" + else: + res = _SND.sf_open(filename, self._sfmode, sfinfo_p) + self._byfd = False + self.filename = filename + + try: + # If res is NULL, this statement will raise a ValueError exception + a = res[0] + except ValueError: + if self._byfd: + msg = "error while opening file descriptor %d\n\t->" % self.fd + else: + msg = "error while opening file %s\n\t-> " % self.filename + msg += _SND.sf_strerror(res) + if self._byfd: + msg += """ +(Check that the mode argument passed to sndfile is the same than the one used +when getting the file descriptor, eg do not pass 'read' to sndfile if you +passed 'write' to open to get the file descriptor. If you are on win32, you are +out of luck, because its implementation of POSIX open is broken)""" + raise IOError("error while opening %s\n\t->%s" % (filename, msg)) + + if mode == 'read': + tmp = _format_from_internal(sfinfo.format) + self._format = formatinfo(tmp.get_file_format(), \ + tmp.get_encoding(), tmp.get_endianness()) + else: + self._format = format + + self._sfinfo = sfinfo + self.hdl = res + + if self.get_file_format() == 'flac': + def SeekNotEnabled(self, *args): + raise FlacUnsupported("seek not supported on Flac by default,"\ + " because\n some version of FLAC libraries are buggy."\ + " Read FLAC_SUPPORT.txt") + self.seek = SeekNotEnabled + else: + self.seek = self._seek + + def __del__(self, close_func = _SND.sf_close): + # Stupid python needs the close_func, otherwise + # it may clean ctypes before calling here + if hasattr(self,'hdl'): + if not(self.hdl == 0): + close_func(self.hdl) + self.hdl = 0 + + def close(self): + """close the file.""" + self.__del__() + + def sync(self): + """call the operating system's function to force the writing of all + file cache buffers to disk the file. + + No effect if file is open as read""" + _SND.sf_write_sync(self.hdl) + + def _seek(self, offset, whence = 0, mode = 'rw'): + """similar to python seek function, taking only in account audio data. + + :Parameters: + offset : int + the number of frames (eg two samples for stereo files) to move + relatively to position set by whence. + whence : int + only 0 (beginning), 1 (current) and 2 (end of the file) are + valid. + mode : string + If set to 'rw', both read and write pointers are updated. If + 'r' is given, only read pointer is updated, if 'w', only the + write one is (this may of course make sense only if you open + the file in a certain mode). + + Notes + ----- + + - one only takes into accound audio data. + - if an invalid seek is given (beyond or before the file), a + PyaudioIOError is launched.""" + c_offset = _num2int64(offset) + if mode == 'rw': + # Update both read and write pointers + st = _SND.sf_seek(self.hdl, c_offset, whence) + elif mode == 'r': + whence = whence | SFM['SFM_READ'] + st = _SND.sf_seek(self.hdl, c_offset, whence) + elif mode == 'w': + whence = whence | SFM['SFM_WRITE'] + st = _SND.sf_seek(self.hdl, c_offset, whence) + else: + raise ValueError("mode should be one of 'r', 'w' or 'rw' only") + + if st == -1: + msg = "Error while seeking, libsndfile error is %s" \ + % (_SND.sf_strerror(self.hdl)) + raise PyaudioIOError(msg) + return st + + # Functions to get informations about the file + def get_nframes(self): + """ Return the number of frames of the file""" + if self._sfmode == SFM['SFM_READ']: + # XXX: is this reliable for any file (think pipe and co ?) + return self._sfinfo.frames + else: + # In write/rwrite mode, the only reliable way to get the number of + # frames is to use seek. + raise NotImplementedError("Sorry, getting the current number of" + "frames in write modes is not supported yet") + + def get_samplerate(self): + """ Return the samplerate in Hz of the file""" + return self._sfinfo.samplerate + + def get_channels(self): + """ Return the number of channels of the file""" + return self._sfinfo.channels + + def get_file_format(self): + """return user friendly file format string""" + return SND_TO_PY_FILE_FORMAT[self._format._int_type] + + def get_encoding(self): + """return user friendly encoding string""" + return SND_TO_PY_ENCODING[self._format._int_encoding] + + def get_endianness(self): + """return user friendly file format string""" + return SND_TO_PY_ENDIANNESS[self._format._int_endianness] + + #------------------ + # Functions to read + #------------------ + def read_frames(self, nframes, dtype = N.float64): + """Read nframes frames of the file. + + :Parameters: + nframes : int + number of frames to read. + dtype : numpy dtype + dtype of the returned array containing read data (see note). + + Notes + ----- + + - read_frames updates the read pointer. + - One column is one channel. + - if float are requested when the file contains integer data, you will + get normalized data (that is the max possible integer will be 1.0, + and the minimal possible value -1.0). + - if integers are requested when the file contains floating point data, + it may give wrong results because there is an ambiguity: if the + floating data are normalized, you can get a file with only 0 ! + Getting integer data from files encoded in normalized floating point + is not supported (yet: sndfile supports it).""" + c_nframes = _num2int64(nframes) + if c_nframes < 0: + raise ValueError("number of frames has to be >= 0") + + # XXX: inout argument + if self._sfinfo.channels > 1: + y = N.zeros((nframes, self._sfinfo.channels), dtype) + else: + y = N.zeros(nframes, dtype) + + if dtype == N.float64: + res = _SND.sf_readf_double(self.hdl, y, c_nframes) + elif dtype == N.float32: + res = _SND.sf_readf_float(self.hdl, y, c_nframes) + elif dtype == N.int32: + res = _SND.sf_readf_int(self.hdl, y, c_nframes) + elif dtype == N.int16: + res = _SND.sf_readf_short(self.hdl, y, c_nframes) + else: + RuntimeError("Sorry, only float, double, int and short read " + \ + "supported for now") + + if not(res == nframes): + msg = "Read %d frames, expected to read %d" % (res, nframes) + msg += ", libsndfile last msg is \n\t%s" \ + % _SND.sf_strerror(self.hdl) + raise IOError(msg) + + return y + + #------------------- + # Functions to write + #------------------- + # TODO: Think about overflow vs type of input, etc... + def write_frames(self, input, nframes = -1): + """write data to file. + + :Parameters: + input : ndarray + array containing data to write. + nframes : int + number of frames to write. + + Notes + ----- + + - one channel is one column + - updates the write pointer. + - if float are given when the file contains integer data, you should + put normalized data (that is the range [-1..1] will be written as the + maximum range allowed by the integer bitwidth).""" + # First, get the number of channels and frames from input + if input.ndim == 1: + nc = 1 + else: + if input.ndim > 2: + raise Exception("Expect array of rank <= 2, got %d" \ + % input.ndim) + nc = input.shape[1] + + if nframes == -1: + nframes = N.size(input) + # Number of channels should be the one expected + if not(nc == self._sfinfo.channels): + raise Exception("Expected %d channels, got %d" % \ + (self._sfinfo.channels, nc)) + + # Writing to the file + c_nframes = _num2int64(nframes) + if c_nframes < 0: + raise ValueError("number of frames has to be >= 0") + + input = N.require(input, requirements = 'C') + + if input.dtype == N.float32: + if self._check_overflow(input): + warnings.warn("Warning, overflow detected when writing.") + res = _SND.sf_writef_float(self.hdl, input, c_nframes) + elif input.dtype == N.float64: + self._check_overflow(input) + if self._check_overflow(input): + warnings.warn("Warning, overflow detected when writing.") + res = _SND.sf_writef_double(self.hdl, input, c_nframes) + elif input.dtype == N.int32: + res = _SND.sf_writef_int(self.hdl, input, c_nframes) + elif input.dtype == N.int16: + res = _SND.sf_writef_short(self.hdl, input, c_nframes) + else: + raise Exception("type of input not understood: input should" + " be float64 or float32""") + + if not(res == nframes): + raise IOError("write %d frames, expected to write %d" \ + % res, nframes) + + def _check_overflow(self, data): + if N.max(data ** 2) >= 1.: + return True + return False + + # Syntactic sugar + def __repr__(self): + return self.__str__() + + def __str__(self): + repstr = "----------------------------------------\n" + if self._byfd: + repstr += "File : %d (opened by file descriptor)\n" % self.fd + else: + repstr += "File : %s\n" % self.filename + repstr += "Channels : %d\n" % self._sfinfo.channels + repstr += "Sample rate : %d\n" % self._sfinfo.samplerate + repstr += "Frames : %d\n" % self._sfinfo.frames + repstr += "Raw Format : %#010x -> %s\n" % \ + (self._format.get_format_raw(), self._format.get_major_str()) + repstr += "File format : %s\n" % self.get_file_format() + repstr += "Encoding : %s\n" % self.get_encoding() + repstr += "Endianness : %s\n" % self.get_endianness() + repstr += "Sections : %d\n" % self._sfinfo.sections + if self._sfinfo.seekable: + seek = 'True' + else: + seek = 'False' + repstr += "Seekable : %s\n" % seek + repstr += "Duration : %s\n" % self._generate_duration_str() + return repstr + + def _generate_duration_str(self): + if self._sfinfo.samplerate < 1: + return None + tsec = self._sfinfo.frames / self._sfinfo.samplerate + hrs = tsec / 60 / 60 + tsec = tsec % (60 ** 2) + mins = tsec / 60 + tsec = tsec % 60 + secs = tsec + ms = 1000 * self._sfinfo.frames / self._sfinfo.samplerate % 1000 + + return "%02d:%02d:%02d.%3d" % (hrs, mins, secs, ms) + +def supported_format(): + # XXX: broken + return py_to_snd_file_format_dic.keys() + +def supported_endianness(): + # XXX: broken + return py_to_snd_endianness_dic.keys() + +def supported_encoding(): + # XXX: broken + return py_to_snd_encoding_dic.keys() + +def _num2int64(value): + """ Convert a python objet to a c_int64, safely.""" + if not (type(value) == int or type(value) == long): + value = long(value) + print "Warning, converting %s to long" % str(value) + c_value = c_int64(value) + if not c_value.value == value: + raise RuntimeError("Error while converting %s to a c_int64"\ + ", maybe %s is too big ?" % str(value)) + return c_value diff --git a/telemeta/util/audiolab/scikits/audiolab/pysndfile.pyc b/telemeta/util/audiolab/scikits/audiolab/pysndfile.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a162db43f18e5179c5a1b11c47e215815d665864 GIT binary patch literal 30913 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.data + cdef int16_t* buff = NULL + #cdef int n = input.dimensions[0] + cdef int n = input.dimensions[0] + cdef int nb = n / 1024 / 16 + cdef snd_pcm_uframes_t bufsz = 1024 * 16 + + assert self.format == SND_PCM_FORMAT_S16 + assert self.access == SND_PCM_ACCESS_RW_INTERLEAVED + + for i from 0 <= i < nb: + st = snd_pcm_writei(self.pcm.pcmhdl, &p[i * bufsz], bufsz) + if not st == bufsz: + print "Error while writing to device", st + print snd_strerror(st) + + snd_pcm_drain(self.pcm.pcmhdl) + + def _get_name(self): + return self.pcm.name + name = property(_get_name) diff --git a/telemeta/util/audiolab/scikits/audiolab/soundio/alsa.py b/telemeta/util/audiolab/scikits/audiolab/soundio/alsa.py new file mode 100644 index 00000000..15754deb --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/soundio/alsa.py @@ -0,0 +1,35 @@ +import numpy as np + +from _alsa import card_name, card_indexes, asoundlib_version +from _alsa import Device, AlsaException + +def play(input, samplerate = 48000): + if input.ndim == 1: + n = input.size + nc = 1 + elif input.ndim == 2: + n, nc = input.shape + else: + raise ValueError("Only ndim 1 or 2 supported") + + if not input.dtype in (np.float32, np.float64): + raise ValueError("input should be array of float32 or float64 !") + + try: + dev = Device(samplerate = samplerate, channels = nc) + dev.play_short((16384 * input).astype(np.int16)) + except AlsaException, e: + raise IOError(str(e)) + +if __name__ == '__main__': + print "Asoundlib version is", asoundlib_version() + for i in card_indexes(): + print card_name(i) + + dev = Device() + print "Device name:", dev.name + + a = 0.2 * np.random.randn(4e4) + play(a, 16000) + play(a, 8000) + play(a, 22050) diff --git a/telemeta/util/audiolab/scikits/audiolab/soundio/alsa_ctypes.py b/telemeta/util/audiolab/scikits/audiolab/soundio/alsa_ctypes.py new file mode 100644 index 00000000..d1c65fc8 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/soundio/alsa_ctypes.py @@ -0,0 +1,440 @@ +#! /usr/bin/env python +# Last Change: Fri Sep 07 02:00 PM 2007 J + +# Copyright (C) 2006-2007 Cournapeau David +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# vim:syntax=python + +"""This is a small module to wrap basic functionalities of alsa: it uses ctypes +for the wrapping.""" + +__docformat__ = 'restructuredtext' + +__all__ = ['asoundlib_version', 'asoundlib_version_numbers', 'card_indexes', \ + 'card_name', 'card_longname'] +#================ +# Load alsa lib +#================ +import ctypes +from ctypes import cdll, Structure, c_int, pointer, POINTER, c_uint,\ + create_string_buffer, c_char_p, sizeof, byref, string_at, c_size_t,\ + c_void_p, c_ulong, c_uint16, c_long, c_uint8, c_int16, c_float +try: + from ctypes import c_int64 +except ImportError, e: + print "Cannot import c_int64 from ctypes: if you are on ubuntu/debian," +\ + " this is likely because ctypes was compiled with libffi. see" +\ + " https://launchpad.net/ubuntu/+source/python2.5/+bug/71914" + raise e + +from numpy.ctypeslib import ndpointer +CTYPES_MAJOR = int(ctypes.__version__.split('.')[0]) +CTYPES_MINOR = int(ctypes.__version__.split('.')[1]) +CTYPES_MICRO = int(ctypes.__version__.split('.')[2]) +if CTYPES_MAJOR < 1 or (CTYPES_MINOR == 0 and CTYPES_MICRO < 1): + raise ImportError("version of ctypes is %s, expected at least %s" \ + % (ctypes.__version__, '1.0.1')) +import numpy as N + +ALSALOC = 'libasound.so.2' +_ALSA = cdll.LoadLibrary(ALSALOC) +# XXX: alsa means linux, normally. How to locate the glibc ? +_C = cdll.LoadLibrary("libc.so.6") + +# Check version +_ALSA.snd_asoundlib_version.args = [] +_ALSA.snd_asoundlib_version.restype = c_char_p + +def asoundlib_version(): + """Return the version of asoundlib as a string""" + version = _ALSA.snd_asoundlib_version() + return version + +def asoundlib_version_numbers(): + """Return the version of asoundlib as a tuple(major, minor, micro).""" + version = asoundlib_version() + return tuple(int(i) for i in version.split('.')) + +major, minor, micro = asoundlib_version_numbers() +if not (major == 1 and minor == 0): + raise RuntimeError("Expected 1.0.x version, got %s instead" % asoundlib_version()) + +# Define pointers to opaque structures +class snd_pcm_t(Structure): + pass + +class snd_pcm_hw_params_t(Structure): + pass + +class snd_pcm_sw_params_t(Structure): + pass + +class snd_output_t(Structure): + pass + +snd_pcm_t_p = POINTER(snd_pcm_t) +snd_pcm_hw_params_t_p = POINTER(snd_pcm_hw_params_t) +snd_pcm_sw_params_t_p = POINTER(snd_pcm_sw_params_t) +snd_output_t_p = POINTER(snd_output_t) + +#------------ +# Define enum +#------------ +SND_PCM_STREAM = {'SND_PCM_STREAM_PLAYBACK' : 0, + 'SND_PCM_STREAM_CAPTURE' : 1} + +#----------------------------------------------- +# Define all the function we need from asoundlib +#----------------------------------------------- +arg1 = c_int +arg2 = POINTER(c_char_p) +_ALSA.snd_card_get_name.argtypes = [arg1, arg2] +_ALSA.snd_card_get_name.restype = c_int + +arg1 = c_int +arg2 = POINTER(c_char_p) +_ALSA.snd_card_get_longname.argtypes = [arg1, arg2] +_ALSA.snd_card_get_longname.restype = c_int + +arg1 = POINTER(c_int) +_ALSA.snd_card_next.argtypes = [arg1] +_ALSA.snd_card_next.restype = c_int + +arg1 = c_int +_ALSA.snd_strerror.argtypes = [arg1] +_ALSA.snd_strerror.restype = c_char_p + +# output related functions +arg1 = POINTER(snd_output_t_p) +_ALSA.snd_output_buffer_open.argtypes = [arg1] +_ALSA.snd_output_buffer_open.restype = c_int + +arg1 = snd_output_t_p +_ALSA.snd_output_close.argtypes = [arg1] +_ALSA.snd_output_close.restype = c_int + +arg1 = snd_output_t_p +arg2 = POINTER(c_char_p) +_ALSA.snd_output_buffer_string.argtypes = [arg1, arg2] +_ALSA.snd_output_buffer_string.restype = c_size_t + +arg1 = snd_pcm_t_p +arg2 = snd_output_t_p +_ALSA.snd_pcm_dump.argtypes = [arg1, arg2] +_ALSA.snd_pcm_dump.restype = c_int + +# pcm related functions +arg1 = POINTER(POINTER(snd_pcm_t)) +arg2 = c_char_p +arg3 = c_int +arg4 = c_int +_ALSA.snd_pcm_open.argtypes = [arg1, arg2, arg3, arg4] +_ALSA.snd_pcm_open.restype = c_int + +arg1 = POINTER(snd_pcm_t) +_ALSA.snd_pcm_close.argtypes = [arg1] +_ALSA.snd_pcm_close.restype = c_int + +arg1 = POINTER(snd_pcm_t) +_ALSA.snd_pcm_reset.argtypes = [arg1] +_ALSA.snd_pcm_reset.restype = c_int + +arg1 = POINTER(snd_pcm_t) +_ALSA.snd_pcm_drain.argtypes = [arg1] +_ALSA.snd_pcm_drain.restype = c_int + +arg1 = POINTER(snd_pcm_hw_params_t_p) +_ALSA.snd_pcm_hw_params_malloc.argtypes = [arg1] +_ALSA.snd_pcm_hw_params_malloc.restype = c_int + +arg1 = snd_pcm_hw_params_t_p +_ALSA.snd_pcm_hw_params_free.argtypes = [arg1] +_ALSA.snd_pcm_hw_params_free.restype = c_int + +arg1 = snd_pcm_t_p +arg2 = snd_pcm_hw_params_t_p +_ALSA.snd_pcm_hw_params_any.argtypes = [arg1, arg2] +_ALSA.snd_pcm_hw_params_any.restype = c_int + +arg1 = snd_pcm_t_p +arg2 = snd_pcm_hw_params_t_p +_ALSA.snd_pcm_hw_params.argtypes = [arg1, arg2] +_ALSA.snd_pcm_hw_params.restype = c_int + +arg1 = snd_pcm_t_p +arg2 = snd_pcm_hw_params_t_p +arg3 = c_int +_ALSA.snd_pcm_hw_params_set_access.argtypes = [arg1, arg2, arg3] +_ALSA.snd_pcm_hw_params_set_access.restype = c_int + +arg1 = snd_pcm_t_p +arg2 = snd_pcm_hw_params_t_p +arg3 = POINTER(c_uint) +arg4 = c_int +_ALSA.snd_pcm_hw_params_set_rate_near.argtypes = [arg1, arg2, arg3, arg4] +_ALSA.snd_pcm_hw_params_set_rate_near.restype = c_int + +arg1 = snd_pcm_t_p +arg2 = snd_pcm_hw_params_t_p +arg3 = c_uint +_ALSA.snd_pcm_hw_params_set_channels.argtypes = [arg1, arg2, arg3] +_ALSA.snd_pcm_hw_params_set_channels.restype = c_int + +arg1 = snd_pcm_t_p +arg2 = snd_pcm_hw_params_t_p +arg3 = c_int +_ALSA.snd_pcm_hw_params_set_format.argtypes = [arg1, arg2, arg3] +_ALSA.snd_pcm_hw_params_set_format.restype = c_int + +arg1 = snd_pcm_t_p +arg2 = snd_pcm_hw_params_t_p +arg3 = POINTER(c_ulong) +_ALSA.snd_pcm_hw_params_set_buffer_size_near.argtypes = [arg1, arg2, arg3] +_ALSA.snd_pcm_hw_params_set_buffer_size_near.restype = c_int + +arg1 = snd_pcm_t_p +arg2 = snd_pcm_hw_params_t_p +arg3 = POINTER(c_ulong) +arg4 = c_int +_ALSA.snd_pcm_hw_params_set_period_size_near.argtypes = [arg1, arg2, arg3, arg4] +_ALSA.snd_pcm_hw_params_set_period_size_near.restype = c_int + +# write +arg1 = snd_pcm_t_p +arg2 = c_void_p +arg3 = c_ulong +_ALSA.snd_pcm_writei.argtypes = [arg1, arg2, arg3] +_ALSA.snd_pcm_writei.restype = c_ulong + +#================== +# General functions +#================== +class AlsaException(Exception): + pass + +class OutputBuffer(): + def __init__(self): + ohdl = snd_output_t_p() + st = _ALSA.snd_output_buffer_open(byref(ohdl)) + if st: + raise AlsaException("Error creating output buffer") + self._hdl = ohdl + + def __del__(self, close_func = _ALSA.snd_output_close): + if hasattr(self, '_hdl'): + if not(self._hdl == 0): + close_func(self._hdl) + self._hdl = 0 + + +OHDL = OutputBuffer() + +#======================== +# Cards related functions +#======================== +def card_indexes(): + """Returns a list containing index of cards recognized by alsa.""" + cards = [] + cur = c_int(-1) + while 1: + st = _ALSA.snd_card_next(byref(cur)) + if st < 0: + raise AlsaException("Could not get next card") + if cur.value < 0: + break + cards.append(cur.value) + return tuple(cards) + +def card_name(index): + """Get the name of the card corresponding to the given index.""" + sptr = c_char_p(0) + st = _ALSA.snd_card_get_name(index, byref(sptr)) + if st < 0: + raise AlsaException("Error while getting card name %d: alsa error "\ + "was %s" % (index, _ALSA.snd_strerror(st))) + cardname = string_at(sptr) + _C.free(sptr) + return cardname + +def card_longname(index): + """Get the long name of the card corresponding to the given index.""" + sptr = c_char_p(0) + st = _ALSA.snd_card_get_longname(index, byref(sptr)) + if st < 0: + raise AlsaException("Error while getting card longname %d: alsa error "\ + "was %s" % (index, _ALSA.snd_strerror(st))) + cardname = string_at(sptr) + _C.free(sptr) + return cardname + +#======================= +# Pcm related functions +#======================= +class _HwParams: + """Small class to assure that the hw parmas are always freed.""" + def __init__(self): + self._hdl = snd_pcm_hw_params_t_p() + st = _ALSA.snd_pcm_hw_params_malloc(byref(self._hdl)) + if st: + raise AlsaException("error while creating hw params %s" \ + % _ALSA.snd_strerror(st)) + + def __del__(self, close_func = _ALSA.snd_pcm_hw_params_free): + if hasattr(self, '_hdl'): + if not(self._hdl == 0): + close_func(self._hdl) + self._hdl = 0 + +class Pcm: + def __init__(self, device = 'default', samplerate = 48000, channels = 1): + self._pcmhdl = POINTER(snd_pcm_t)() + + # Open the pcm device + st = _ALSA.snd_pcm_open(byref(self._pcmhdl), device, + SND_PCM_STREAM['SND_PCM_STREAM_PLAYBACK'], 0) + if st: + raise AlsaException("error while opening pcm device %s; alsa error is %s"\ + % (device, _ALSA.snd_strerror(st))) + + # Set hw params + self._set_hw_params(samplerate, channels) + + # Reset the pcm device + st = _ALSA.snd_pcm_reset(self._pcmhdl) + if st: + raise AlsaException("error while resetting pcm : %s" \ + % _ALSA.snd_strerror(st)) + + self.nc = channels + self.samplerate = samplerate + + def _set_hw_params(self, samplerate, channels): + # XXX: Parameters copied from sndfile-play.c from libsndfile. Check the + # meaning + alsa_period_size = c_ulong(1024) + alsa_buffer_frames = c_ulong(alsa_period_size.value * 4) + + hw = _HwParams() + hwhdl = hw._hdl + st = _ALSA.snd_pcm_hw_params_any(self._pcmhdl, hwhdl) + if st < 0: + raise AlsaException("cannot initialize hw st: %s" \ + % _ALSA.snd_strerror(st)) + + st = _ALSA.snd_pcm_hw_params_set_access(self._pcmhdl, hwhdl, 3) + if st < 0: + raise AlsaException("cannot initialize hw st: %s" \ + % _ALSA.snd_strerror(st)) + + rrate = c_uint(samplerate) + st = _ALSA.snd_pcm_hw_params_set_rate_near(self._pcmhdl, hwhdl, byref(rrate), 0) + if st < 0: + raise AlsaException("cannot set samplerate : %s" \ + % _ALSA.snd_strerror(st)) + + st = _ALSA.snd_pcm_hw_params_set_format(self._pcmhdl, hwhdl, 14) + if st < 0: + raise AlsaException("cannot set format : %s" \ + % _ALSA.snd_strerror(st)) + + st = _ALSA.snd_pcm_hw_params_set_channels(self._pcmhdl, hwhdl, channels) + if st < 0: + raise AlsaException("cannot set number of channels : %s" \ + % _ALSA.snd_strerror(st)) + + st = _ALSA.snd_pcm_hw_params_set_buffer_size_near(self._pcmhdl, hwhdl, + byref(alsa_buffer_frames)) + if st < 0: + raise AlsaException("cannot set buffer size: %s" \ + % _ALSA.snd_strerror(st)) + + st = _ALSA.snd_pcm_hw_params_set_period_size_near(self._pcmhdl, hwhdl, + byref(alsa_period_size), 0) + if st < 0: + raise AlsaException("cannot set period size: %s" \ + % _ALSA.snd_strerror(st)) + + st = _ALSA.snd_pcm_hw_params(self._pcmhdl, hwhdl) + if st < 0: + raise AlsaException("cannot set params : %s" \ + % _ALSA.snd_strerror(st)) + + def __del__(self, close_func = _ALSA.snd_pcm_close): + if hasattr(self, '_pcmhdl'): + try: + self._pcmhdl[0] + close_func(self._pcmhdl) + self._pcmhdl = POINTER(snd_pcm_t)() + except ValueError: + pass + + def __str__(self): + buf = c_char_p() + msg = "Pcm device: " + if self._pcmhdl > 0: + msg += " Opened\n" + # XXX error checking + st = _ALSA.snd_pcm_dump(self._pcmhdl, OHDL._hdl) + st = _ALSA.snd_output_buffer_string(OHDL._hdl, byref(buf)) + if st > 0: + msg += string_at(buf) + return msg + + def __repr__(self): + return self.__str__() + + def write_float(self, data): + bufsz = 1024 * 2 + nb = data.size / bufsz / self.nc + for i in range(nb): + b = a[i * bufsz: (i+1) * bufsz] + st = _ALSA.snd_pcm_writei(self._pcmhdl, + b.ctypes.data_as(POINTER(c_float)), bufsz) + if not st == bufsz: + print "Error while writing to device" + b = a[nb * bufsz: -1] + reframes = b.size / self.nc + st = _ALSA.snd_pcm_writei(self._pcmhdl, + b.ctypes.data_as(POINTER(c_float)), reframes) + if not st == reframes: + print "Error while writing to device" + + _ALSA.snd_pcm_drain(self._pcmhdl) +#class AlsaPlayer: +# def __init__(self, device = "default"): +# pcm = _Pcm(device) +# hw = _HwParams() +# err = _ALSA.snd_pcm_hw_params_any(pcm.pcmhdl, hw.hwparamshdl) +# if err: +# raise AlsaException(" + +if __name__ == '__main__': + print card_indexes() + print [card_name(i) for i in card_indexes()] + print [card_longname(i) for i in card_indexes()] + print asoundlib_version() + print asoundlib_version_numbers() + from scikits.audiolab import wavread + a, fs = wavread('test.wav')[:2] + if a.ndim > 1: + nc = a.shape[1] + else: + nc = 1 + a = a.astype(N.float32) + pcm = Pcm("default:1", 22050, channels = nc) + print pcm + pcm.write_float(a) diff --git a/telemeta/util/audiolab/scikits/audiolab/soundio/setup.py b/telemeta/util/audiolab/scikits/audiolab/soundio/setup.py new file mode 100644 index 00000000..a2234513 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/soundio/setup.py @@ -0,0 +1,12 @@ +from distutils.core import setup +from distutils.extension import Extension +from Cython.Distutils import build_ext +from numpy.distutils.misc_util import get_numpy_include_dirs + +setup(name = "PyrexGuide", + ext_modules=[ + Extension("_alsa", ["_alsa.pyx"], + libraries = ['asound'], + include_dirs = get_numpy_include_dirs())], + cmdclass = {'build_ext': build_ext}) + diff --git a/telemeta/util/audiolab/scikits/audiolab/soundio/simple.c b/telemeta/util/audiolab/scikits/audiolab/soundio/simple.c new file mode 100644 index 00000000..96e1c37f --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/soundio/simple.c @@ -0,0 +1,74 @@ +#include + +#include + +int main() +{ + snd_pcm_t *pcm; + snd_pcm_hw_params_t *hw; + + int st; + unsigned int rrate = 44100; + snd_output_t *output; + + st = snd_pcm_open(&pcm, "default", SND_PCM_STREAM_PLAYBACK, 0); + if (st) { + fprintf(stderr, "Error opening pcm\n"); + return -1; + } + + st = snd_pcm_hw_params_malloc(&hw); + if (st) { + fprintf(stderr, "Error while allocating hw\n"); + return -1; + } + + st = snd_pcm_hw_params_any(pcm, hw); + if (st) { + fprintf(stderr, "Error while allocating hw\n"); + return -1; + } + + st = snd_pcm_hw_params_set_access(pcm, hw, SND_PCM_ACCESS_RW_INTERLEAVED); + if (st) { + fprintf(stderr, "Error while allocating hw\n"); + return -1; + } + + st = snd_pcm_hw_params_set_rate_near(pcm, hw, &rrate, 0); + if (st) { + fprintf(stderr, "Error while allocating hw\n"); + return -1; + } + fprintf(stdout, "rate is %d\n", rrate); + + st = snd_pcm_hw_params(pcm, hw); + if (st) { + fprintf(stderr, "Error while allocating hw\n"); + return -1; + } + + //st = snd_output_stdio_attach(&output, stdout, 0); + //if (st < 0) { + // printf("Output failed: %s\n", snd_strerror(st)); + // return 0; + //} + st = snd_output_buffer_open(&output); + if (st < 0) { + printf("Output buffer open failed: %s\n", snd_strerror(st)); + return 0; + } + char* buf; + snd_pcm_dump(pcm, output); + st = snd_output_buffer_string(output, &buf); + fprintf(stdout, "%d chars\n", st); + fprintf(stdout, "%s", buf); + + //snd_output_close(output); + //snd_pcm_hw_params_free(hw); + snd_pcm_close(pcm); + + snd_config_update_free_global(); + + return 0; +} diff --git a/telemeta/util/audiolab/scikits/audiolab/soundio/simple2.c b/telemeta/util/audiolab/scikits/audiolab/soundio/simple2.c new file mode 100644 index 00000000..401d78dd --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/soundio/simple2.c @@ -0,0 +1,80 @@ +#include +#include + +#include + +int play(snd_pcm_t *pcm) +{ + int16_t buff[1024 * 16]; + int i, j; + snd_pcm_uframes_t frames; + + for (i = 0; i < 4; ++i) { + for (j = 0; j < 1024 * 16; ++j) { + buff[j] = random() & 0xff; + } + frames = snd_pcm_writei(pcm, buff, 1024 * 16); + fprintf(stderr, "%lu\n", frames); + } + + return 0; +} + +int set(snd_pcm_t *pcm, snd_pcm_format_t format, snd_pcm_access_t access, + unsigned int channels, unsigned int samplerate) +{ + int st; + + st = snd_pcm_set_params(pcm, format, access, channels, samplerate, + 1, 1000000); + if (st < 0) { + printf("Output failed: %s\n", snd_strerror(st)); + return st; + } + + return 0; +} + +int main() +{ + snd_pcm_t *pcm; + snd_pcm_hw_params_t *hw; + + int st; + unsigned int rrate = 48000; + unsigned int nc = 1; + snd_output_t *output; + + int i, j; + snd_pcm_sframes_t frames; + + st = snd_pcm_open(&pcm, "default", SND_PCM_STREAM_PLAYBACK, 0); + if (st) { + fprintf(stderr, "Error opening pcm\n"); + return -1; + } + + st = snd_output_stdio_attach(&output, stdout, 0); + if (st < 0) { + printf("Output failed: %s\n", snd_strerror(st)); + return -1; + } + + set(pcm, SND_PCM_FORMAT_S16, SND_PCM_ACCESS_RW_INTERLEAVED, 1, 44100); + + play(pcm); + snd_pcm_drain(pcm); + + set(pcm, SND_PCM_FORMAT_S16, SND_PCM_ACCESS_RW_INTERLEAVED, 1, 8000); + + play(pcm); + + //snd_pcm_dump(pcm, output); + + snd_output_close(output); + snd_pcm_close(pcm); + + snd_config_update_free_global(); + + return 0; +} diff --git a/telemeta/util/audiolab/scikits/audiolab/test_data/original.aif b/telemeta/util/audiolab/scikits/audiolab/test_data/original.aif new file mode 100644 index 0000000000000000000000000000000000000000..457a12c8b85e342c0ca671ed9722bfe8756054c6 GIT binary patch literal 131776 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 z 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℘U3WcK0oNq=1TETAOKae6qa0HkXa(JF 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 +sy6QHwiRPCz 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 literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits/audiolab/test_data/test.aiff b/telemeta/util/audiolab/scikits/audiolab/test_data/test.aiff new file mode 100644 index 0000000000000000000000000000000000000000..93bc793c4f44a5f77766529aa4cc1a8761f53189 GIT binary patch literal 90376 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 literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits/audiolab/test_data/test.au b/telemeta/util/audiolab/scikits/audiolab/test_data/test.au new file mode 100644 index 0000000000000000000000000000000000000000..8311e3876166111d34b6d6c0c1fbd71583de4520 GIT binary patch literal 90346 zcmdSAg--Iexn^f}c6Ku%v(G&D{oLcfbL(ml2*d<|mp20?6a;#g3Y1_V|Nr+74f_8Q28043 zLAd{G`LB)v5)#NLpyj`s4RA#N-|>Gv|9Af1{r~m)@A%*Si2t{*4bbzyYyXx1tD}Gt z0c6zwB?Jfyl>ha?0vYpveg6BD|Jwc=!+$OR_4x03|4aYt_g@|Re^>vz_rLtVk^T2v z5|ID*JS@=qzyAOGJ~kj<&}>i!aO8m4pa4)Hh-e)Hk*y|cgVh28Sp^`lb<8TX@~lNb zn;IzltzWE{tvS|K>o4meYXN9Cs0b8d?lca83z14wu-d^aMTA**m~LC0tk)qw&=sgQ z!?kfaq?O7VEBBPT(xKFboe{4%=u@X)Z!n zG7>3|^&eGFkyqHAMCY-G(t7?3$VXwmhq4kZq-@q%s)-V5C$S1 z>Tm8h9|HMUxyEoUNw>pz&$wJaO~1g{VE$o=GA}g-7^a&pSvP~Sz-16PXdILcz5#g% znFR?0byyv(qvpBe*GKNDud6%8ZfcikR%-T}5Fj&5hOxm+g`EOFfay^&2r+yM{4?|% zaQ6=DCgWA@2hAysPWMuGbX+pd(_Yhk)phH?7=${JcA4JC7-(!Y9X6ja|FlF{nye`6 zD(hBIEQA2v4ZDF@gL-B21oH>mL?DupGz>$^-p%oGTlYEojC%;Hpk#aR9B88INpNva9lR$`Ti%pB36S*>cK?px+lm7{yo1RT> zqs~7ZhB&phB<2bFGRj}lal8s6N7E5UVYk687M^LcezC@9boNM);;SrE+$TCLWDOk@ z#14Gqg?1}DMIEti(^~wRf*RJ>v+G24PiteUXH;m)_7&eL&M7`nbhY?f$J$&ZrJu z$EWti9k+U>aQ(RJ`h59CLvQ$=eP?=W`$`9eg8hOO{3C;=!GwMsFNC+8cbr$%zh-cc zAVnB3Tq&uR4$F~>_aly@)5pvjm5yt;V0vyn200AVAZaMA&0Fkhyf5J)v6d{PZDU+v zwb&Z%>5dDWKe@KK$9wGXeCXBUQ|V_4&;;d$90)rR;T!ok`fKd&cxJ-o1XJRqq-QB9 zDW+6u`e24`!j*|9GxtwAHH9>_cG}!&<1-%4Y@InUbIAeWFp}b4sGLx_ySF~QjPZwod$QU_vrDFM5R=|So~0! z%-_+M)5Gnm?E2o#@5$-$?oxHmXsc(i|cMRerq8#*45mr@GAdSai(m4 zf#A2kNM2?sJ5+e^S5N-&-#_ytKiczE#d*cM3xi91D%aJhYlCV%>JasUrn$|$_DMZ) z-Iv?nbRzpu{Gfr7f%ii@B~;}{jhCU?avT~2&xaIRcYz(@&Njh>Nu-6O6XXq46Z?hZ zOQ#4sC2I?FE~}Zd-*J=EsEfZxen3O$p5Q3~NBm#<#`~arr~3u^KJ>lq>+f?m;Gd8` z!M6hM2ek%o4U`1N1$^+`<+a$G&!T)|MDaHgj7fv3 zcBz+B(W&ON7wL@?3p4qd3o{Xu5~f|4^KOCd0_wu$OI()qt|YF+EdROOe!1UrdSR z`nUI;8B7&=3~wIBi|&Yy2v-gf_y-234rKTD^yTrc_CDg4_Ncm>x>k02b)4_`r^BP& zrEO{J$Cf|M!_A`{>%H@ zTY;`3RI#ea)$3~_YOYqdRo<(7RI|D+vjN}O-R#o(vMs$C))?8)S9iX8S;f)v@#=Z? z&+Dhu6jWDL*p(Q|BFh(-jg(fDS^t8{?pI>#{2LP++gsAQn)=m4!Gi8Vc>mJDqXPGV zJ-yet*ZcMk6!eewW%lI{yzCF`jqTBOEol4QX6#zjQP6y{(Ytv;yRNgpYfVoO???ag z-c>!=9%=99-m>0ry>t7v3)Tp~2+xT;h6BV;rQhXymHS4HYK{8TsA@c3vt0)@*qIiYkDGg}3&7rx6zFRB zN#t$R4s?{wD;$V0jW~hiMy{i!F=VVG>ZiSgd;rS|&i8SDPpUE#6BJS>z}iv5iSO|{a8bBy+h5Lps4$Tn8hzLTF@RIPDXruV7G+a_7-Z6|5rU;t&vj&>`|Mp?H=XzXv zj&U1!n|MFC`Q5v_mUP8;Kj#e&eCU7Er|4VC`_%VjfHoi<%oyA{*u@VJToEo1#SUMR ztdh1%ze;J+m9iv7h~m4( z9TQ4LBa(mR^OSo=Qbs+;3|gw*&hW?d!}1dF2w#D7q0itCkh_4@As$nK6BEhgtyCE! z&o;^)Y+uL`*q?WLPB?E=vwWj@*sPB@+kFq=Mm{X-EEg^sp~bDzs`NmbDUb8 zLL9{Q8Fp9MXBc0oO=Jm8jmGNwAFD3(*C$HcPX z)xs>n<3Zj)PJdNDg7<(c;Ig>kz3^Tau6NJeo{XN(o}r$Y9%Rqq9u3!t`=s{=&zqOp z`;EJV>&V^8{mhN*fp?8{C3c}YC0+KNdpp*5AUgayqdG@A8#-Qg1a;2n3I^WyoQ^x~ zFWahGlbTO9-D=3HJ6@Mmf3%6(;?#1ab#Xhk<7g+pTgNTz{mc8-H?>bYux0S~z@omz z{n){DK|23ne^Y3(-F`^cZvXOV&Ys?;s~&q3}AyL->1W3p5OBffYkbA@NoD9xE&k>_k%BnPlpd7?j!#}j-p&q*{B-S2b3o& z2_?3fiQR=ehC7G7f~mqrU~6&R1TINR`AR)b?W5PQj@XuSR&uU!w%Q+ZSncTIoZ(XC z66=C=k-CXI?|M_bzIrG7)dUs>X@iSH#9?P5+@lUe-->(~CJeh7VILt6PY*sGFwy^2 zKy@J4Z_vld8|ih_bE^B0TefSG%W{`^rf1=9dc|nL*q8A|<7dVnYNWdJ`qzf(hC<^Z(+=}J3)}Ju z1O_jIe1S3Gw~$a2@Jpb1Hpgw&*zB{ZwXtIMVm)y&ct5w6nLZWp}XWu-CGaSyilU%!v$V`fK`Kx`lC{F~sO%hB5P*Cm0Lp^JyPx;k3oH z3VIIn4f`d#nDvO+$E;>bnGcwOY(KkxJ9qXfwu*DuVW&d^hifOdmpPqqI^l4Z6JtAz zb&N5K@{lluQ{n@NbBMv%aMXRoLD&#rP}qnBl;=&rMhl)^fFx8v8NLSjy$9+@c~6U;);>M`6r8mq zEBuN0Nzs!zkH0@=J{oxpew6db%cdGZ{NJTk(>5@>4%m1B^%0I|C%eNS6--2 ztvOv=RJXT2t!aImP5ac27v1}M*}QFif&B*uO#I1$^}-#)GRdHHyEId_L;+UPm7A3B zRRikhqo2o&T05QA2s5v?NI)7GfP_#|n@5;ooHw3F%pyBdM6`Cs7Unqnwe2sv@Aiuw zr#Z*C{OkJFz0B)_Ppco;zck1>gc3S4Y*YA>2!0ed+8VPxW`E4CnEKdFaW@khk|Ze( zDdx1e48#OWX3r$cWcXz6w2oO%=RI2VXQ_7i&y@kI=C6LS_WK6##wQzdHm=-wW>d^& z;^v$!Yq!$3uH90<`NQT3o1-`V-S}|5e%*_;%+Hj5NIOGwraq)>Cbbd^ zh@tpPSZ|wo=+|f*@+aagA`$)+_5ntL9)&!IAixVinHGylWBk|f%fQe>G`GgcBVSaf zlxO7wG7kx57%ajHT?7dOqkX!*DBkftWdGxSYd^bhVn2SsBv?4~Qg}n86SvFU6h~A! zBPHr7>OsI>yJ{cmrs}kYB*T6~h9OF?)GyMnFxVO0O{>g%Ew+|y>v2#h=n&`$*cXC< zIzZ`=PtY_N7&Z?!51xY1p(<@?HZn{J_7AR_FqPO(>Lm|TA+!UGL>8RwV#~72;gs3` zbv)}F@3P9x$77FIvNzm2*Eh}Yxc{|)H-RUEHV01*NeuN29S`G&4@SgByo}6<9E$3W zJ{x@^8XoNwV;4)0JrL^}vmja(^C-434japh<;F^5WwE2Nrnty>LOdn5Hx?N?JI*QY zWL#RDbKLs44B*<6n3vK2L`O%}MX16_p?^c`!w*JG311zm3#EnzhtvkQ1m^}{4^;RE z`u^~{=zlxFClDV{6%Z0g43dUu!>)u!hjoQkh5QX61*Zqi2~79T^R@Fz@R;cK!)21g z6FVyFKH~({LdN4eFl$kn@Sl)_<|h5=@j>+@#dpcXp;v>C`ipo$J&QVDv`=kKY<6mB ztm~*EFh_Zu^Y>IQxU*!-w~+xs~rK-}b-h zdV_q;dNuDA_T|r)l;^UXGub}RBA?#Q(q`sNrJs#Fb_g~O^$7ciabme_o#L0WO{r65j?hL)fNvbF(dbd z04fB11ouE&5UWtP(23~Tm}7+ZwM-Z*(>Bz$(l*xiJm-Of%4s#= zKM9=ox;%9|QF2xORN$ll-?LH7gq`d9kx z@V)GF$E(s~k6WtC59e=AZya6h2kal&`*Q+qU$cHO3G^4VbJRqViEtHn3G)H{6?q1} z1!4e^%$JN!hQs;?x&jS%eA?Lg(TO81BRJJpRlKrPxlX~Acgx`7Rif3xJwvznl7Y_t z>3!L};okdPNcXdD*RI)}cRKfU#&@3Rn%A|cb8g3)_KNne9f_Tw4)4~NEzZr&P5Q?2 z#-~m9n@d`zwz#(hH;bC%n%T`BO@^kB#!pT3W=KmnVD&3I`a8~b61xVt+jz_RBKyDb z1;P)a@nNg@jbxofBHb%HEdQeXHgay%X>7w->A0IFMdzot7@7@(My=%lXcl-bxD_%H zN`PwMM1(Uk2o-~_z%0Oa<4O1s0-ki6l1#lwA7qxYzi~(oPo46et*(yl&R)xWX@1WG z@PRLbN`nod>0#F*=0)>~F@CP%J~niAa-1C2TqxivByuo#Dtn*;v|;P~_XbN%l7&i8ragY~-L zvEO~MJKL?^4eg?Iad!UTRPOl5(azzGy~f^=vxg(Jzi;niS8nUWn#!o8^XX^lKWIHv zU-C8LE&OdDiL(E7|mCSD!6>7XNJ3Gkn&sCy$;CWgU8w^%(Q$!{d2? z$B^(i=CR+C+^6TBUC!Q~Z36nQ%X$60;6?n4uP^+br#!#ycWCz zz2Eb3%ja2NKY#!F^WCq{e~OC_ms^b25*2m&^G2muUV~8M38#ytW6_XrGj9Zi7nfOmq zOUlR8y(xJqzfwP^Rivvjj%C=S=S~R7+?ZLO3C;AL#GZU(YQQwoG@ohpGfvE$JagBq zxwBu)IWcGb?6g@MX6>HkFze^68#7iM*k%HX0FQ$-fvHxR<%lUze?yx*K6P}}$a7VI0xEqVVGK(}Z-q&M+k?Lb zy!+z09X$@+xUQs*XKhDY?l(8Ju$$jCHr2=1xztUsOQ>C1t*z2l9jwZ$x>$)UA207N z|53iG{BXt0%J@oa<;#kV<*nt~@~ZOr<&w(mYJBzX>eDs&n#$Vwwa@FY^+y`tx5Tv? z+upS!+IMwq>P+kG?aJu7-+i;^BX?UbtCz+7!j0zIar=99Jbs_D-!jlSs1d9msurq- zmx|X)$N-b_NBQqatorEa;jxUd(Q%bFMz>2}W^^?9nM~&I);ZuH2no6Yz6^QSCITCU z6B2%to>6+~p3E3lw{00m?XcG|*D1%j+ttNwv3sp2%!}#mdjG-E_>fzr)#Vw}UNU{$$LdZ>Q?XB}9K* z8|ICT7mACd!%UE$pi`DTrVit;s)U8KbkWIT9cGb{` zd|wg#_jB3alEI>y!m|Yr{=EMK$^V?E{h9Tn{Cmx}A7A%<7JqvCvE!r5hnw$q z`!?YX1+WO2uM=Ngc{v&I1QM=djfsz_xNR&{Zrgi|ED2O?_|@S zUw(P>Rl=*?udCjc=FWTn@?+}fE8o`tB;@7fFZy%2aJ=Mc*`4yal|?m(I&ec$Q+12J zjn=-uQ_(ZOH@(kyU^>4^IAz#Rf|ilxjmi%r9_pmA6`EPvfAvhmBjagPrumYkACv-a zhO|R3!Rd%A$aCmt7%r}l=sE3I6=lY%W z_X;={>>heJEH>OFq9N*Q%&gcgao6HQLFrT$FamU=$zP+DKw zy42iMOByjXFEuNLmx4*&nRGExo%kye6u%qr6-BYMn4svc=(|yp$dZT&;gqn2p`#&x zgNg%s{RFxktrHS{2a23l*8 zo9`I2^nZ1pn$2UE)gvQr3YC0@^qx3Rq#7C%Jm)_jyf$#We@@?V-o;-39(hk#52u^o z9ndwUb5h6Y4r2Slwr_1Qt(RMxTW~EIEji8ao8C0VH&!%mXmkN`bL02M?F~EX57mR} zKGsocvjDb#X&s{OcHQUNky`f}bxmH)$C`aL>9w|XS@pvD;W}R3qLlZ2+eyunK2G{DscrK1$^DbJPKHc+lKCSO zJW&ng=@V!fLFvQkr_%1Eu1G;8eN8aO|Bas;M~X>^9Eu1Cj||-#ygx9`f3|OiH_k)i zcFX0Rv!~+&4v!r|@1brdzaZJ-zhicy>|q@ci1m_ruR*Tu9xGGN9dT1lRP2-%i2a0* z1^EJwz=kgweATb(TiUDbox#1`)8D(RBL)rRWs z>Ss&+%t%USQtSJpC_h-u1lcd8_l5Z{Z0NI@tcyr;n%BQ<@uoeu>8*70l%rgk@-LJkN$@KZv1olkGz0W@TE{%)KPr4 z#I58{>Cdv-^0!r(>cSdp9ki~d!KW#=bzA$xPEB_QcOfsSKY6fm$X|F()F!?vg~%z& z-6K(>_ccr)j>|W^GA%b3SVW*RkngZv@Cw8uBo(#V29GJl&BF)be-YLaF9S@%EovW4 zM*o*VW@uS_J3Qxu{b`2_>TpQ1l9yS58fJV30(%P z1V4b^Z8YLf6fEjsG&uTo3^JxEc5xgeeq*9%l3NlPm^~8{|0EqrK9jOOMVp$LdLosY zayI2RU|E)?WvA^+`<(8P9-O`>U7Uf-*f(L%#KjYDOuRX9%S6&dkBQ4BrcG#>5Rs9Y zj!&DN7N3@yI+_Yf(j)}N{S)UJ=NOwBy*qMqcxQM>I3jFMNPp0(fOY<5{sdopZ;0n6 z_ZBx77f;8joKv=1TLkM4V;z-C{z_sI%JII~jTk4J$pB+t3u}ii19O2$beB;Ku%*Ge z&D!nb+%cB=qUyEskfL1vLWYt|7rTkn06PE^s08G}tp4A;&%Jis?OgYsCEdkLK@9@}?Dy^#D_)uNBqat|ivQRIjS)tHxD-s=ig#Rh3=EtE#Iy zS9Ph%Tz#?zQ?saMR?WRyV(p3AmRfb4b3LoRseX06SDm^(qQRzNHgJZhtF4pO->Ns& znQC2X&ed+I3#~g_=T>{Ac4cj3&0y``x)h*y5zzB%Lwe)MruWU~S`aNyTQ%(+otL`q zb^p_|ox8O6cptn!bztwHNbpn`B3e8=Lwrt}DtA@XC{-hC)TXiPn!~!?hRr67*=Q{Q zdqFOAV2;Wo#8u}6m&*QdpA zg8#CBS3wJd2SZ)M&H{7ed*sfj;3!Q@aBNQ8<@kFEX$cDx4gu>7Bq=rNa8g#%-lT0w zo01xnmnCN>bCZuG=caU|o=BOHbS!C8vO|hX%8e9OGB{~!(s=UgWK{|{g`GT>RG(Ou z*qPXr2#)^|*Ba*&doLCnvo$6z`eoEVk-H+Eh3^Vm6Z$HoELafyHaI6ZA*djT5y%Lj z`||=Y{@eU!_-6S=`n3AI^O^1K;knG6;hOAX>zv_4v+uB*!)7sKX%dPvv5r8*ox@}z zc`z%q7E%CuY0fol)wYZe0N4YjER@3}z2e29@}aeS&H$Ciy)BB4>79_y zobI%qhrI)R)q}wTw;_SZEVjrX@?qsFmETCy7)R5o&ori(be49|VXzOl2+|J=fn~vc z5dR>@(2h17%o%Jh&K@@nA5R!1Eh6d3N2oM<2ID-_hPjzFmo2f=*nf72aj0|(aX#Wa z4Dj<5R~``Ik-9(k2=?6S73xj%{^EVXYryNB&sx99e%pNi_@41Q;J@GB&9BnW+4qj` zA3u)YUcayY(f)CM7Qa7!Bwwu0e4okQW^a41yI!}wI=z~_=6lX?|K+yB^@hu57qs(d zXQtC_rwGT@4m5jT&H~$CtOn*T1|4AV&r^~}-wD;Ya;zVw2h(G74i$|^fJegiL)Sr0 z1B~Djh&Ln++yMR!ZU;XCYat`hU$6++MA$~yLD*r~B-l~ddl&|q4_yjf44nu$0?r0y z0g9tGYm;?_#oqMCw9<6bc+#-akgi{@tt2S?Mdh!>U!3x>CEkX*R`l?Pp7c!MEAKKL{Ba^ zqIViEf`{jkcz64r^qU554tyEh#7AcRvYJ-l1vOh4dZMwSxAjjW4XfqfG?tr?$mcSn&1jucu zICKqW3)U683fqW>5({A>P9O4~n9FIC-ohQ4jb&YlHcCB%}?dIT)^6>P;cqlxwJvO_K zxWD$8;OXt@u z1W%I3kjG??MIIF%CGK@@Lbsc47uz%vB73dJHX`Vx>$V-zU8xog-(G1BhSn%dlH9rI^E*%@{KJAPS2( z1jj;^kX(?=^1@VWxS~6*_0(({lc*o6kaE6kOnOw3EDjMp6^0LG2uk_42E;&g5#RTw zZ$+OyuZ$Pmd!GBdr=$BuS8>xz;kbWkn0Qd27>~#v2XNM&HKLCIq11iERpPyw;#-Sl)nc zsB0W(I?(jJDX-~s)3fG;7O$3Ht-IQ0wiDXFbiD24b`5lY2V$BFd;aCl=zYL@)pxG{ z?f`3G+MqihEbtQ^8{RB7NM1`WN%Q4rV7;V~SK4l)atg$Y%ia=ArKcRH!9jFS{4}XmyA_2(5d^9rND69_V*6Cszt zC61DhQAxC9S|fcny`8avIiG1{!C5!iTw9IZDZ3jS3g?ggU55z{HumT2=iA3~?s8Uh zc=oaO3+&-`pKUkUKCw%)OR`O8Z)ERdFJNtDyr!qqeSm0{nueeT1Cifi5`@r)|AM=P zi^L`4F5w!mYRn6pp8(rmhmJ=X070Waq7$(gfq-8F^kS>woNYtTrN%~Mv9Z_q+!$g^H10Ph7`hA@ z`c?zY@WL2xoNZX7|3}Z#`{)M^>ww6^dHrGi1wBo7NB3SAto73T_wLRZ$B&&HEgD6s z?M7l$Jk@|ot~vuCUA0oHe6I{t{8r3U%uzy=pH&!@D-dB^HX>4k)iczlQLoX$u@B>} z<2GaFanxAxm;$IT8-J%kYY^kFfG3w|Xye7>e&ZSAxf-S>UmK}iq5Y<<(;m`BXq~kf zt)tdXb7Q=7yjinPyFlBcwHvpLS7>syt-42gH(;#8hSi3AV+3GF)|oxcT+0|Bq5S}U z4E2XSfF~kSk>AmmF(Ftt91ZslXT@g|mJ`N_FGy3#Qz*qWGToJakO5_SFcqu`tbFzf z+wFF1?Q|S6$AuHXiR9d{=h$zv2T&@&T|_tvoz6KsJJ-1+yBu(lxh`@2>H5p{uInk+ zt8OSaAJ;0^<*rGthh6u(db(0w1TIfp4gs;-eJ*fkmeVh%&5oUpHBO;UiGUrr;z)6* zbEtE~IFcM`4&Ur=aC$hkoGTm`yT5iM+xhHM>=1SgtByrt&SB1A9%Z^ShM6cvALBiv zhw+qthxV6NOTSEiK>LT%P1#D(Q$AAaC{Cmn(k$X7!WiKJ0fOh?&f#d-A6Q4s5satJ zMD#IKKC%Sy1u-9S6P^oILuP|Ffts!PmKA2G$=`V0@LSK*z1M!%(lmE9k2TAIs3>Pt zI(l<7U43&T2Z$ldm6w%h#Xk9M*;i?eL?UhwbqJG&_6u};;b2n#hrVBZ(Y&(WFWkd` zazWgq?Y49ccHZb1>kxK~c6@7BwEu12-lhN$?Bdpst+bYnEiizEZf~w=UfFcD@p&Vw zVXSdh<5<(?rsGYIo1x7=o6XJ5&3VngTgWYsTCuI`+d|tOw8=Zf-NijSxqiI#KA*nU ze)-^b0cGeP;RVrdF;Y?~mCB)tH07BQvU>UGo^iNlnRbV6nl4-KtuHmi7$*Z3Bg*{7 zTx`Kv9Y86d&!8MoE;t)P19yX4z~vB62o)&rf&YcjArm0)p>EJM(4Ek&&|X*oED^RH z9t|IY^AK)`*MJhC9MOxsgF1!2Vv}K0fQiCP!wdpmMw$GFh2Vp0#j3FOm^n5}(TC8XC=0R$ zUJr|g@WIoq5^I1Z+9WXkGSGDIv^83s#&&F(`teAHDn%(&o={Abt&oOEPfHI;43drF zli~&9>0%%8MDYgkQ;8c8vppu!itmU&O14N&OH*ZbvYqk}1wnC2aZORLv{A?uZVG#) zw^E|28*x|FtEQ{sRWp%hWGF+GNTriZJTb6-d~?(z!-$aqs9+Ljp>Z(nW@xVYCR2}2g!gy!Pg)M zpwZAs=nSYm^dYPa9s$_PPp~4`AnX*h6j}h|Ky#r!Pzq!KvKNvG@dtkgS3@X}`A|6Y z1)z@J4b{Np2oB;i5`mnDOhvY$H)CK}XY5TJ11H0OAnYTClO~YQQQlJcR1h_b#-Mf5 zUos{#gv?yl9o9HY$kMT~Yz8}qjc0ve-3HEXv%j+^vO(peXNEH*j4H-S##zR7#tMcXy`O%Qew==XzK^D(!Kq8BE>tjuOIbl7k%ivxYk{Us^r>0Uvs4&V!iXFKRm`9Jv zvq(JBY+^YvmQY7nhBxDn<74n3+!X9ZECRF8W*Yhc+5=U96eGsrDmVca2VD-C1$GDF zEmzE5rf_43UaI?{oihG@?BQs;`sql7vR)A;E0-RToDm-$z9Bj%3>ZohEa8{&XAJHe zSlgf6m&|+1JI9;RJJh>?dz4GzBDpc#EUuzAu-CQMvv&)R!^`X~=uPB~aI3gIy>EEi zc^7y^ee?S?{r?WQ4Ez|}J!s*3@ptegf*pb{0^U%<(C?vkAxk(U@)iY)W{L)e|BC&^ z6U1@i4Dnv^JMmUAW7sro6qk!f#P`Gv60`&*?hth4$AFP9*<>1+nG{_~$El3%30gMfM4QIlu5xR|N+b+5W~lrlO2hy%EdT^Tz&wr%Xr z_)1_s2WjFot2FmC$2C(l54C7*kS1TVP%{T;TRE;8cN$9@y*}!p{-};u`>PkICy%@U zbeLCELnHgt?tq#kbu@R(1&A!-#}{crwP$p<0cBVifMFyivsqy!S#N@VfsN3Gu+Q-K zh!u!ZWDe>CI?^WC<`0H|xsDme9>gJW+we~K3;50Wt9UtK8PStCkLXD#B`hH9B6Jbg z6SIi9#BsnPA0vT*F++bYyxlFS6*Y zZ)|t=A6q9|SKH0DFKp{=O}4GJ7i>@4p0d4XJDZ&csGugX_po!=W$dTy39M3<8&l34 zW-es(GrgIKOctYyF^hqsi|P3Q^L&H8pMHTp&bZCo&ic$g#cF5L85bGtOek{|a|?4f z)0NT5$Y(re>|(?-Vi+L$Gdh9xnKqv)pe9qOWCm#}@e09&AIGi1uELbsd_eC-Y7qax z^Wip70pvC~!fLR(Sg5A`Mmzm)-8~&tdsLG*UOw(QssVUQsB%;pptuF7LEp(tvduDY zS-30+u=@TIzLYHul#(O^l53J5(nHc}=>&;P`j1p0!^&pK_Q}4>Eb?gi8u>!`DtVT| zLorEVCoh&4$Xn$?MSxiQa$~+Bn&K!en7RvHxHPaGp2`-b838o+kb!#gazIoxq$Z zr#_%X(E8~g7?+tT%x_FJE0R^jj%0tcU2JQxquRyUt+)HYVR2kJGdcS>2RREkes+KC zGVNB|?X#P2`-H7zA7#h0GgundRi>56W4>VqFv=NJKpnS$?n+b8=25>;v#6UXpU7WG zCQ=6}omfoFAbcR$;8St)G0$zh(Wg7>90DF*5TBln>tZ~-$)?#3nQxqr!vQ_!Z>VPV<UrIBh396^8=fyb+dZFp9`{V}Xz{RkqCG(# zT92#lTKDVj>)m&|F9XtE_p`vAo`9zOqsKvy)gG%n)_Yt6>X$t3d2I85xwpF4y7S!g z-E|&B_XhV;_ebts?lSix_Z;^`w|=)h5Bdo5w&q%=TfSO|<~wGp>5kE4oM~tUs?HbCMZj3gXs=hcvdOYcW8H9cWU?5?%p2HoqGRL4NN1=L^s_rdz%L>8!U3`Bx@CDCrAO_4~c?QLJvdRVR5iw_-RBYLWO(* zta*5JFj{I;gxQ02!DiunaXkD9d>_FbKpvjNdeS}e9C8mOijqrRNPSB^Kz&SO(;R?# zN}z9`=h9cxH`03<35+d_^FUnlHscSI2COAN8G9Lr7^fJ=7|($E9mWa95yldRH^ZHg z%*bE_F~S*v^ddT*wuy$P-lQf{>6A<4esTcmISEZ%PY@C2;=kivaksD%Y&_-)#?_|6 zW)eCVy$L-9^&I7fJb~aMrov0$(Xdm1((x;F0)!7)0j>lu0rtxs1Nm7;tyxxQ%MnYA zg>8OhPB#^q)|xJvwwqAKi^hG%LgRbm7NfHfYqU3d7?&Fl8)1f0Bhnx;v>W;j5`)4Z zH#!)n7>^mVj64(4s4`X?pBc{^&l&F+cNu3J*BR#-4;uNVd8S-bgXyv<(e%M&Fw@O* z%xsg@oNSq8#aKcuegOLzVp(n3Z^^QJw&Yrr7J;S7(rVFIMlF|seR|GjzWKfRwfT_Q z0T|y^(?*lOiC_u`KJS@vv5^9d=7fQ&m+2+?CVip)ul}xnuAT$%DRw%m&ZsNb73+HR zVEuaieSLtQpm)+$>e}>y`UCoG{Zsur{U3v)VXfgj@J(<4J9EbP%2*AoPeGlyg}?h z%tpk(b@1D8Iy@1c0k?%G!QUz*uz%DPjnTL1e>k z!=!K+Oawa%I}T$&JE8la-jEg`HUJ0j1F+m*kefBra^B)(t_S8c!nE1=*SN}HFznD* z1NQTfRaQufT=h&d(gI96UU@b8z7Re_(&Vy8mb& zAHaCK`%d;P1DNK1UN^6hSK3GH3+{{VOX`d5Bl7zDR`*r+RrIO)S^Zl8?ZC=`_k#|D zdk1Uy9R3M@3tuXT7UT^b6Z#5o0;~FZQPD7Fc>XX?d`%KADV0V^FG+>6QhACzMt)B* zS8+$7RNhwVRX;~kN6OT0>blYIW3$J}00ODgGPIkupLLt{Vfq@wNrTq-%CyzgX5M2- zv-Dc81G}{gz$YO=5E1kc3;}xukAVvia}a#w6I3XG#{$q5HuG%?F{zlhSUmO(ZaK~f zV2LIIgRqkDlbA+4NxV*kg{G1$3sv}(_O(8Lfe~1SNX2NYk4&fl-1YteC0>1?BjT^*0 zz-_?A0s50F>`CloEE%H*Hnx}Ah-{|VOh&h&ub|hWWT<0+k9ZInh{y(f#F>EZ+y`0! zJp|Fm z1NdP2SlL+OsAhDZI$J$cy%A8Y{xh;<1PfRDmN=VloZ8?;;JG@J|KS}PnRiWIkJfWYCR~WNLm2(sk2xl zJ|qqt9vLnl-a3pGwTM27&WK_~3}J!ro^YxVG$a_>ID`-k3&et-g6o2nf;a)3U&nvL zf5!jDf69N$KhEF7zsau+=&!L29bETXpQZu@*r00v4hh;H6?F+6VBBojs;>c7L_0t+mp%S)>=nQ|Y19rQv8t8Iy^0U=aXCwt3~-B3iMJR$ zoG5A(Dum3TaKSABntz&49Gp8)F+lFW0i>CIO?}e7uD-W@ynb9isXw*+>*#O?s6q>*Gu&PuAJEa`OVap`**NQRdV zOaC8^t^zKKy^Bun&d%=AAP9f4D`-s^a*zJ*dkMR?yTDH6Qa|^RXai96&I1??nKHPe* zoj!lu*H}7PN<0si3GwY~`NiLI>){q_?O-)pvdmBU^5)TQKIS50r0J^1Y>!}z$e-fM zm?pZ_a(7w&;`^Bf8=G)TP3sK#oSVgNISL*i%;+@xxsUMZZ~n!`7zUVoxqWmSZ92df z8Gl>8S`YD!xUSrIF303D=a?PbQML!WfU9E~Xq?9GX1c?3c4i(UkN?gLLL7R@uuN6< z4eLeZ=yNDfrV5ow4x=j|$M>WaVRG0N) zbe+7_7pc#HzO7RJD1Y>u#1yTPa!&22oz`n8nQQb=M`5E=OV`=dxGtmgLit`yh`rblU%o) zF59irb+*rrsSaP8q13DNwj;=O$Yrz_*`1i}(Ax2rtFGbCnELbyDh}DwU1kECY?x};VBBl? zi!Cs{Iq9mx!^<028UXQP#GWyViMb?v^(EZZl~a<;GbK0*hR2&NoMJ=eV2PapOqz zJT5TA!w0Q1)MQT4BE5p95E*vSgQ&Tr2ic75gb0yOMw0#Yd8$Q;QZ^zp9WTd7;m9)j z2sOlU!kGW&a)_eX%$ec1>2wJn#D;>w^;J0I`s94%Y~)zrusL;y%f8)F!`awz#cs6q zu$Q&pu-CCQ0BTdme#E}h=5K3jOR?>B1evm3KhOIciDaO^@MXrRK#kJxpaGgwd`0xB+ew}%@IRLzMs5#X9)ZChn z;D_cxTvT$T4(g<}m^6BG$p|pwg+4bR650SxKdlf2eQF9%cw#m%2k&p!-o@ znGp6a^O9PKM^dR()G*lSHmVgBMqQ%%k(bEcX(l6HM%ps zgH8uVevrCAen6-2H>Nx8MWb`L9_>SqU`YBnwU=JR+@sydHB<#?@h@N%dVwwKLi(cq zDIqQqX+%7*^`ZJU-K_sZj05)dm-a?$uFoPC5Vwfa#6e;au@v9=FHD%pAlH+V;m561 zZ(wVw#iia5f2EH z_E;;?KND4SonZ8*dLnU{EQjvYT%rc?l+>wOWFGa09*s{+LJ1H<+0HFR6+26MGswrcJkZbfcO-R8OZSv{-)cx0?4*WBKG%93oYVtHx4#K-Z! z%|`w!UyQtCws|Bfv~K1R=0kjW(<5}jr1J(-p6Md&@tA3+$;^%6=5VJue|*A<+(+X( z!$LzJSl=PTd{jMQ>>C4%s>h%Cz-(j7v(=bk^dfo#9Y@chZd046DU=(TNj5|+^9@Ie z*7pHxoT}|qf2g&`#r4qD*+siJXQ^u*d{BSK04L{2LVxouClAfRNvFl>=TMyEoOhg2 zjvVJFVWBX`S;aBkRn>LG)zLK*8ibLqjjm*&vltN1^aWa`ny7WcM5tH9S;9}hLG&c&Q`4xwNTf7WMd}^>h6$sGQ91Nd zXcy}msFPE2^1Y#nbMWIf`>xCOgy!@2!}+91`<=6=_syn7Y5_HOwe z^*naEe|I0?-VeFmR=0oMN4gJiTVqYKp0U1hv!a6Ni5g-U|~JU6J%fF81WZoXZ6*86AUqrsH3mbYwJ_>Raz-nu@~A!?T~g- z8=`*KnrfY3HI3A5>P5AOT2Ae*u2lQ0Q`IP?1f43))y?W$HAuBUEfT2YD~A-5(jK_u zJ^8u(OxEQ`a=g+_Ss`ZtjiKZ@V5E7)pm@p}P^q=@4tWY@NS&8cWQVdCNcb%Ii`-An zSB+{HWxD(rD9OKyrZ!U2Wl?^tdf~H#s#~Evc&5$QNxi$4uQk#v+H-vN2l_&Nq~1#V z0d8wC=7X))2cq_h)rad*+J0@CwpM$oz1D`RB5$+TV>nqr3eY~>q^~kGQvrBIF}!VmRx_M3d^5B&1RG8pG-H3`7(@}L@qHe1OUX!vTli;m_}Ly=*pVUeLG`-5%A^kQnEzM0LOp|=1fnM)_* zTra1q(w*p=Od$P`u0$2m6g{0jM9-q^lpk3HzuK8PM~wy#QI?!dg+i6F9aY3$k|wJV zUl3)!6Z7=~%xddKtR;HuXY^Y7Frpr@k1%SAR;n)tmiQi3>><4&_>Hl8H0~eJU+K58 zX_&;e7q^4@1Hy-x4?Fsb=jpJjZ@{3J5DUlv@+?JBlc*--9&#!*mu`V*Sq#8^y)`>1!+HUd2? z)O%|?z_@Q#WJOTM$r3QlgYql+ysV| z{^zP$z?7$}C)FU63F{bk- zg|Eu5<#+O)d~N&|QAHsV9i}W_V;wzh8 za3Z&nTft3--&?^A;079H;|b$_;~k>|TUkT0F$AlnkFko;X!wpec*V#Y9$-oyW$-j~ zXWuaIkjdNzHW<&ehk|7*eT7~}51}5CPslE0b7G4g1FK!Ay;L=I6R=n(tf!KE6KHc2 zDG}!?QF0TXiPeQ{K@?OW26^^Qp$61?(XKopOsFaNxooZ+p^~svxFj4FS_^~m*Jk0A z&_JjsDB?J=yl4`~iVn#H>pCpPNoFxqERlSqO43y6i}Ve6wgK-VN##%pRl_@li3_9% zi54S-Ey5Dvh;U43=DO@!4?O6)s})pZ9h@7TYn>e&qT`-pC$xfV>?7>E>?>dyHSH$b zQE17|*e2O}+9GTitztWheGf`wOW)X**^+FpZBy}RF3`zyHW`Rgf&FiLzCF&tJ3{T6 z{g*ul+{t{$JVzIY#nH;K-%;X_99JFZ9hV(h&Iy>cSKSfq3~*j|G0;aHfd=7(Ylv&U zYn*GcYXpA36?|N!t}U+qu5K=;uuHfgOcFd`+je1<5Gy^k;Xd|H75)_sVkNP!P$Ik+RB@}+UK%Twibc}j(mZLQbVt(Vs&XxPD(t$SGE=#& zB!I0C>mK}f8@hsz5{ zzop9i(b#Y8EA+sz$E=Wvpt`A8NGr%PXX}>b^qyp*?oyS=hoi3#*$(6vId$3 zvp0W&XHA<-ZMh__u5le0ngxasb|aGyWqBR?39{9BN7iB@kCTm&{a+>b zk^PAr;uYx!|LjlPC&GvdL?C#COt1^PG`n_R+o?^!WW}$@+H#d!%5_x9f$~+kqjU|H z)dbd7RoLNDUE6T37CW4d2KKx58n!()|I%qC=SryJPsQ_#5{eo^o3_8OY{3iY2dd?N z0@vR^-#5>dR{#~jhP)|IqMghemDdicl?VCm`JQ(^Ab(}U|KQ@nT^bIa26Sc zmS8gu8sZU$rx;7PZD2>H;kJaYVXk8SY%!S=%=aw)tO3?T*2UHx;M5>%7-0uPI*By>5B^_R_u9d)htIppLOZcQC=D7`lUa zkDDH?ff7a_r+kT8qPz93r4V(-Hp?^1So25ocr(wR<7e}&Ob*jrE|1&6&E%SZ-xz2} zH>@;78P*#58%)RzHnB6>*YopWclrtNWor$k6T}*Q>2wP&=xW@=6&F3(Jvr%46ieVP~JEmSU`!Ca%UB-YJl- zYOWft5a%02vPzD-$o)eQxfa=U+eBcG1*QL#dX}s$E-Zdiycf9i=c3a^i;5~2-Y9%k z_`Gm=;gZ4`1qB7O3N{xUD;QcZxxh1jNdD0Lv-wZ3-OB%7z~ukP&n@UvaJV40;B3K^ zf{g`V3re7F8CH0(@J~^tqOL{Ti*kyq6%Q|NQ+%wXOiBNeJteD3W|b6{&MiGu8eRIT zG}%_kw%!(JD}|37XxnY?V!s2w`LF%7U2-gPTySh~^mJ@;q&k00gD zjM`)}{IA_53r*n1J|POs7e>PpPa~H|7j@(ceUbkSMjm)U;gnEhv~N`(^)K~b^@}!A z`>f?^n%-Ogi0QR2(MQvp+=l9PH1!Y>cser^Q?Rf=Ntsb*HntAxRXSlzC6<%^5>TYziyM1=t6pw%!8gveCNL+Su~Pa@}&! za>^2I>0rKMeq^a&aX0TX2bfJ}fBr2Wi+G;GU*u=-gZTQu$E%uT(^fFf6OaweH`V7} za%*9Evp64P0r<7%(CfA~Mi|x`%;{*0%BJB<<8$p#Pw~`$3n%GQK z(%0x7I;Y*!hO2v&BT7?b@@o(gCrRGoe6fibDBN&qz!wvoJsg=pu}h$9`($fcdZDyO zDN)j^*k1g)*jTiyXiQNEtY9cqPhX*Xs+fN|e@p(_{8o9X@K(>kwb}DjsHVo{&C5Fl z&vrg<75I)`c?0t%!ngeZ{yZr!3O;RG{($@@`K|JI6;K5|3RV`(FE~)h6%H?qE*cE( zq;}DuV$b5sC7~rtO9qx4DjiVjvdy#o_%D{)S$m$NpQDjuyknOm*SXz^Sxqi4S1Xq! zTo;^TYjLo+U1DG-E2K=hf!rQ_0GE~V%5x=A$x<>=H>GR!w02q;Zdu@rFB3*RTTdeP zko93L9^`cLEfql}(?K|f(X`GiW-GF@*!k=q!xUq%ajWq;dh*)+pSxJiUqp@-4@Aph z8Eg5+B3OG^Q{A4p*L2Hqd*$B6eL9$|SMFIJ4LxRf^!14JSnrVt{$jbuOpl!&x3M*W zwsnMiS@%HqaCg@2s@q>yhg*UX1#Wexs%*NQl)KDKjh}T#ECn^I$-uM z2oHp4ne6hm>{;s73s17O;`wq(ui{r=$eCEZJn!~Q*oxas=J~vd(6*y z)%nup>nev(hO!!OKC;WsW;h=a2)rBuAjSQ$Gbosk1Di75S z>K4qnEY%|5Rh@bb)Ks}dBrxhu=5d6Ux*v)y=i;IEB zwE>fAg+`?(Q;%VQ>y1H$cb{HQyP=}@qeL3x&8b_c>$ifl?gUkBOW>kkQO}>Ij6lI# zqXIoiUWZ=5K*o><$e&QXbOnYsm#TyAx8c+|+JmkEH1ROqmEJ}tg8{!z%cv{&Gs(<1 zMqqu>5fjCp$88^b2tMmL^t2}oiw!+-lZ_P+b@EWV{xH(Ulg4+(J;uexm%z|pa1l@h z+~lfoT~JYM;W(oM==wM?AKSTO+#C3g&F~?q+y(fM?c8jx7v~Ap!dR{y*NhA1TH{t7 zC`TI5){n;J#wrG<;g`V%KcgE~8zKz81`8{*8`-Admwi|(lgZ3Q%x=T5z`L^OeEJ`{ zHqhfA=wI2p0XKzDM5yp0SU<0ngZ?N9sdS)$h^!X`;?*Y1%j_YQ||6^$|29%YlT1L(OqW z8KDePdV{@qEB_14i~;(YkEk|9@sRjT@`D~_HDc#B@tT+@4iySTTC68ViX+5Fs65+> zx5O@Dv~)oxfsBO70rDy6mexR3b4m?R-yrJ^)Fx|p_5U!h0mLrkFiGSXGLc$Hy`a9) zzL@9u7FM#D*~~J)Gw-qm2D4$N;S7#jJydruj9)nu7sR#4Id}(cwVR1VPQ01-F};L7 zBn7!~W4<9jjX%iW<5N-7N0{Hj* z7F2Lc_*49NlM}Br6NuF;(-Kn;;8qv7d)zD7LIT&_m}C5Gyk&fVPtwOwfT)*jcnwQ> zXn1B=YVbkD7Q&XYsq8oQB6Mu0@cHYrW!M(z;;O==0^!!!5GY4JGE;G$XQPwr4tf)0 z@Bl^7gOs6d^krb)3G^vCg^ov8!hCue^6NRcO`r$T-QhtG;jaKH8>qs2WIii^x_2U- zlsncy5OC4E$hudNJ;+*Q8A2suhzrC!B9=HrtO7E<5}DBeA`1B_=841YqbU@CK)dW%%R^fVd1Hx)6|}N%wh3%+wkuP> z)?r^GH|@jrVhX`TRAnonOD~o=gnIoa^Ai6T3jeo;?uqkxln$hJqf2EJa4IL*fhL4T zx&zTT1mrgbs@X?SUbTl3YabL^R;{sG1f|p>AdkH2r)bJD)LHQ09*n8C%Ypu3APhF?J(5~o9wSMs7Y1(L2Qe|}p zaL#|!+S(?4y!MqiM~>HIrAS$!)zxaKsT!mHhDNI;)M0P5tx%4g2fCQ78+8xhrx$dC z-V?Qmx9+3217`M4&xeoM2?Qb^>o|r;N4L~GqJSJq-Y4^b%)WsizfWnD4Bb;hAlhZ= zpYYA$%x2~^^8q|pMa)yJ#?HY}9L0`jkFl@V>+DaUiYzM`I71MoyjC>$u<`6ow$R{* zd8|*^TkOAh<`(uKI}QI+m#xhDgAF>zbOT1*nW=zzu>0v&hy}iMf4U?1n{24B7E$F8 zH+;!#@-{gL?A|Z<&Q_#_*hJjJr|w7$!kXZ5^@Z2)m3#FC`bp^CR>Dg*(yMD!cqY4-J;(kq_^}CKm@dG#rQtjs0_t{?J&g0?WGgd%^lxZYjPx(O+BDis6~Pbu zMTL-OfXwzI9uez_uDJ5WBxKB)+8Tny%64QEHMMyV4^iq z23HKJMvN!^hX313jK*Wli1tKpY+d2`77)V_;qT&lBg=_~`YBvBe74aYc*a?P*XHob*j*^kSBLVnlKJ>14 z;qPepxW`zPPR(00s@du#^@{pgEyU};RS&9n)HJ-$5j@YRep8pJ1A%~F#&hPV)u31S zsWyhstcg!ITI~S#q%yR$<<Hmr)}CRt%-2>!3sWB}eGj(#NS6IklMlv9Zvs0xLYyI9ps(8i{v(iV zhc(|HJoHYiyiNG|j*LUk21U*!=aGHUySkM;3*UT@{D)jhZX@rJkC0Cv#=RqCG#*(- z4kkw-tM3dptt#1)tW8$H^G2YaYlsNl1Fx_E8NhsU1AcbG{uQY6y5ar0;2CA{2`ZD# z@ow!23E62Hkx5#i-@c8wa1IR03}hl*k*_u*LWs(^=1n|2?M{57{pioHg$R=iCA9`+ z^;&I?)&yG2fm$Us2glAiGax+MF_wV_ZC!s@677S0b{_9Nu6@;zvUDj?tPiZ!wX ztK_h9K)I{DK>e5q&zJ@eRSw^LDHLM9u%7_O<$=-F9>D-8L=b1X)lbes4=sALtK+e9b_219eP3QB}nx(9NTc-qd)VBWIc@bkmi z2T;1!HEc2LGh9Ru^E)FCW@4&wwsDqm2DC*ADxomr%l~VUWv-mj1~u|Iqs}b@yWwUO z!TaT)+R4CQkBo1jr#=KO@HV*J+s5z4Qlo@>M^IPcl1aFK*LcQw0nfUOXDtOPxfI%> zji|mZ7@wj7OEO-B8hZzRe*#x>5L)M3sKwjhIYYrSb~LikAbmvceHc2Vj;NxFFfYM@ zh%|?7$s{soffTNSf+P{&?j(4_D%3@)167Iggnl5Ij6|Mt18b%q`kk)oe#md`YumIa z_?$A((Vs*Pbxnb$OI`@9BN!ao8EK*vB+5AFJHLCBKzmf<9IEZAF47tA{EnKv7gPsPuBJd({;Si2fYm*7=DHe! zi||Lq{t(Yfau&Mky4IpTZ{n&C3@_a!xUzu_B)GDK%EDIRj&Mzg7psW>h|#FiTT7dy zeV7EDD2D>aTO`ZMNaeg5qE0|;J*SmHt#wxWpcU!3P33Y}awCOtx%TYaN89CU8 zzp)?AO}0_vDudNu2^CUT)Wl19yp8=Dvu)XA3(k!%X8Yyp`M*d_UvK#!6h90$GGMtPe>kto-rOJd29c?(jajxOTw>u(y99TjAkd9swKNj;R^_ zVM#N^wm6H!#lB(%!6g*Jre1?F+XpW6J&>W6LM@jLWy&Y$*wWC`f7~?zm`w*)W$+5$ zoViW~=+A9uA7^JUTchx^rL(+~bVyFdk?OeP*zVYanHdu?FN3k$z`8OHgFVrH*?z`; z(tZltbNfB}Y@oQgndiwJM0haudrt@ zwyX9x_7aDmqnYEdBia!MW=3@O29F!%-0J+`yaB8!0*LcRfyONHO~N@r5POMNkTvv_ zW`mP9$^GRy3ad<#3&B9IL;U*{?5Y)-=n_^{=Md+48Njoyy4 zu+TjCtt74?@R?=Y0ceoUaxZ{ZPc?PM9O~7k`#i&QrZm$v({N3L0vqTGbYTGBiRYn|e-2g46VnA#Uz0D;!Z}o8vXhwF~(3@q@a>jvH@*7d;k%~c}!3U!6%LJJ{6=nB?&wy*;DVMB1sy}^%; z7e?a#PT@5^>3iXTa8xKlpVLfnIeMEWh?@{cL*ci2V2aFcOorCvD0w7u#RMe)YSCqg z=lc-VKcW9>8gjrlno--Nz1My9fxuVy0*{zNJcYia25&3y1wT;?a4FTT&7FwoZ$|_W)y_I&jnu`x| zdw2O4qR!uPH(aqULiUv$k}Qd`mrP0Tz=m9vhD&SEvBp4)*Hx+|ZAWF1EQwBRqdf$S)=TSCgmqshfvhme1w4Mb!X$MdK8k(EFV66<$RPUx7z^1z+BX~n6F%Q^S zwh)zVEKs|F!0!~}Jn#{JI2Knd>Bud|HC?hzVbD!p;al?CaMpr&e|UuP{1JW^x_`E! zXC{-M#c#rS+Q#3+{DyyVzD~ny%*Lag_>ufX-Wyj$s0vMpm#G-+(+PeM=DnVSf4L1M z$}*@!%9)Os_L+|JMkshA;aj@l|JLxI%pv9q{4X)-*W#S@nbq!Qbt{9JMJ+JZBLE7%@@^LEZ|f%OzizDcnst_SICx#F zPFuEMVq~Iu9jxsRI&ka4(ys9H_&Vs&*a1##v?+w^WZVb+u(xp&dVm743No-F zMjKiis-pJ44y2|j=1*N=?lUu)8t`sY7+=`k4WRBV>2`E2^lT;q=gX#6Q{^cSvJ?pZ zZn7zu>f6w^4kfAqYn-S@>D4p`aFwN66{wBo;5?ScESF}A8+hC>+_YTU-J@8I5UAgh)o|P>`3A;ptpux9R6)yonnx=Azm-gkjio7fucEkhl{YNOTI7c+lC zxvktQ^ds&y{p15M`J*HMx7i;ZF^$bD!BHA;WuQKm1(u~?!(Ul+D~TC1+82YX5C6AOYE0In5o_ei>X{s3U6ORbbh+qW|{3_F4A= zQny$SgsRVi9@Yd{*aILStAMI}1sd}L_~apdjy_Xwu6KvhuaRC(Z>-nR1nnIVy@l`_ z5n6R1dFg5_Y;g%RR7;SNG(c7Egl6C(s`lH;6!@MM@OBjupF0A{3jibbFYI)!yholX zca_Va*4!vR#J!F33iKjh0hSl1c*(i)d0=@XfH`eMM0<>iE(6(4aOLx%Bz=UoA%^n4fVmT#RIittE}qxj01z*vn?;5G#kSQ}j*qV!Ta1kJ}| zo2#3mU2GuhG_IXz6E+)io7ik@5>@`^+Y954v+rFp4m~21!KP%`va63h+>`pL-6su z%9viDDq*mxP{kzw0s1BZ`>le0ZUgZBia;vc!P@Ghle&u%iT&-Bx=K^nUOQj}+mv&_ zF#n5&ACM*OM^ttxchFtbT^)ps=^>(aCQyMi%}oo@!jWTc(f-9sxdR+fgY|dU=VC={ zgLeKa*ufYbV}g{rG5vaME_`Z1cEh8~$? z#jO=*AXH%-$1G)ujqzEVG_o9LfD2d?HVb%T0<-%G#}uEN$9 z@7EeRPDf~N>x2L0C=054GtiBnnA4UBEl@PruoO~6#(j}I3d`z84uBS6Ai7W*f+J#y zQX&JG^h_{Zy@9Y!C0Y?CtiPAI7IPdBse0&_pQPnM+u^2F)TV2#fViwjPILrFR1ILp z9aJlh{A}RJpOsBuW;y|*_5my7hBf~N`H&6vmxNfhO+GE(gfX%dk4)mAc72 zq#P+z- z@hNqD=164>G>JWcq^$<_Gz-3Ni*g$%W_ftN6N(+(YL`*nrl2n~M#%tLtf@SH|AwMH zPDxe6R1#Twx&Jd&!D=1kWwlhRS{CT88GbxW4adHkYJ?hz`$6END&u||+z$d;Is;nc zfygp@L2a}NHhThpcYweDhT1v{+gkOBS^(VkIqIWSV759?-8|sDNviOFuN?(!5V8u* z1TMx34az`m7BY&dT6b*}e$UgoLK`0g-1{!h;v=wGZ=q&N2M*$;hikf4hv;U9XAJCWR^d(cU)<+?p zG*Z2B{3)ENKERca!D|FTiS!XuJb%IVmdQgfQ4%g9GLu@SD>HbCqx4g|8)1t`-!;MS+bX+WIzitEI;Vv6_)J^GnY{^eqlVh}n& z#z=#q^VtG*QZ)43Ig$B<`=N#ztpX(?BdmMevrYuHIGqq(75W*z+b zdK~*2>MC^vyi#Yip>jht;1g7a{Z+tgeOKbK-y0s!j!*be`JoixTRcEkxE?q~FPx_? zm=)6s^>AaL_ypp5366&axrZH`e1TF1=g}q?VP9EPv!jtGlprTGDIrREOh&1L`7kW7 zFde$fnW(E@DM#Uv+ba82Gu~|{zSnIq0GZ%AQovVMhdy|TT#9Gss$-Rd@Yo-a^W4Jm z?ueYD3(ko<^sO)C2l76w`N4=Ue}SAU5;Fx}sHVFE$k`0(}Y)En){KeF6o$=r5K5df5s+ z*VCbE?g)hH60n^mP`4cv&x$|)>qr4dSQG4_U1|k8`wO1rp!5j5M=hw~8{=np`3JPm z8OVG(VfscFFysR2{Zhn+319{%qCWVg7Q@%i1OBrUT~4L&o;{HV-bRixji>-$D}pcW zhrA^kIZ83fll4&RUx$`t5_qpeShLT_J7hZa7CFcZ1k90A|5Hjs!5Tsq;=V8T=99lL z&y5Fq`~teN7vxK51WqAmxBx!vAlCeFFk5Ya9FHO!kk!G3RU^HTmvc}N6oPSkjU3`8 zx{3}EV}KMF>N!x#cw{n$U89s-9ZM4MemRR?5!o3sewRb zmY^$gs5DtRiF30N{yq*dAy>+hTv8f3h(eJ`)Pav~huF~@I>s5uATFU-ECuWS5+*4d zG2O@m)?W7itDu_V4gb9of6s#MVK>(POyEV2;SCOB%6uxUmH}(p0nBp`Am`)3V~qpj zc>yf%Z5)w&)L?Pwd26BdgO418^X>)I&kOUue(GU*fF2A4unlw>2N0_pfZ=M0h*}#* zw>*69M136m?reP-w8|6o4p3rt*GD4;_txveFaHacX9?JkJjCc_dJMV(SxokwhqLxK z&fixe27WyXR0T_(n(QB0i&<>H_p5-e59Bq6)fWtcEGE z)4^iJa%H)R+$hW{I>7xfRW?;K4K^J`$E^ccviyGpc{T5cjt!lU=3}5b3+MCE#r=d| zfbOFw(3`#G_W>*F#JA!DO%i5+Z$h`^4$}r8h#kO>e1XDnBhaXZ=o;FBUdaZ~oXs-y z!~Bf<=#7lTq_p{%*P2ZKjc&7Z=!)aP?6ya4`-i1QMohwb4w9;Z zDIEfv$wFOZfQ8OLe%cDXMp@_#+bpzmY%c!t$1UYR+|IZ&Y4?g4$3b}k)xx;hI@znN z-?6|q!Lvgm!|GL?QBADTp{8Ez?^?zhnbjv%{Wt7ZNbmCB0weuyd+qYSQTcZ`UoE!W zY4d zhxjW$u5iBVgt||8Z&PxMGm_JN(_j6%pS0+U@Zmws`nV_GqGO^z9s3^qV;CmTHTY2{ zx$DpTWFlVszB?i6NA;wR@l4#ESX>A2=d#Sz8HUtGDO~2;K(Y@21CLh zRuU`G;bmI{wQUm7v+k8z4{E=zx3ED;gJHGz)DUa<)|^xGXDwr`_cia-$f%iE`|o;} z8a!<{q+w|N-}U>}YgBhqT}Qo}4eB-MT>pK83l072kF1kfE58<5r*WO+a6|aax_#?? zt)JGQPyH43d)MDkzfZl!bykHhthuYkqH3EepQ-dNv`U3p<&w*OEtBHA-n)*+acjK! zplPZhlL@9K5UE;{k|AY?3tTCVx3=3QD~pa7F3lhJ=WVw0ch|I=zkE|4{A`pkDfaB= zsqagk>yLUqiGS7o^`F;~FSkBRdDi}U#FO{;q}$tX^}o^gdgzVF>#eR0zrN(gtmuM! zsgM47G~uz=^GeT;KP!28^UZ~KMIVws?u|M2<@UGK??S?tAG1>Sq^-}anO*MB*u0qH zQp}S0W-6%TZ zSnmg8PK;{Y!_@3}<66zGHY?luSD*8v_D-rj?#sw>GwLqWXYC&-b!pZ+b4cq!O?&U^ za=q8~sAJvVb-&+ZRqyNl`t>j0>vN|%ZA&`!>AIxd>j-=ECoMiVjjG);bgSP2k7|Bh zEA9^aUO_HDq3m{Zq^DDjds>i;es^ByFXzr&RcHKKXD_mg|bJ%@FNV z$=yfI{A0;XaAi`1iza@5^1lDa7D-Za?1#<|Hrxn1wPNqVy~5Gn$EzP+esb;QyEhg* z%>VQwtxL|$M6XYLb|U-6Z>V1}-Tu$fL^kf+_m1CMe}0>IqadtsQ*LKhp()-xMyG{t zREvsVBQNxP*Zoz8!7b-Brt6NctOoj(8RJ`6rb)%7H3F-@46_Du+*M_ayp~;6Cb{f= z(>}Q_u6yrew~L)!RI#my%rD5h?o8F&f+HVJ<`X*c-uFEFjYYD8zDb#SxjdR)W(9d~!_-gQ^s4Fj4E$nM>v z?cGS9o*#$38GC;0`5`lUl(sjv@oeMWA}+k9U!X5l^?R)-KOcE(&hvCexafIG?-SeN zL5;^d5}qsR+#%ckcXKc7xwkasW6rt6I^VdA#ll>+D{)FoBWJtxjM(>sUROyzs$H>m z(ofh|aO%@#XVdT z?dOZGXP^1KUknQPr>V2Yj9&fQPOi1le~)P=Nk}vDzZQlXZk4rEx!)+d@#HdE(Zr(Z zfkPs=cG2w*HQmv$SJQzFlR|1UMMVjUR^wrp#O{kabZFYL%Bld}>>*3~z=}-s^>yXo z!RCb&&Fpg~|9Y4*Fl%hl23z*;Cm(*_k9_(#wVLy&qvfBsxn<>WW*0G0ZNvQKwb|{g z*flft_d{_OpT~VGu*GkRy`S_d=YH{n9FO$9>9+WzZ`VE#el;-G{pY%*7hjS-O!=gJ zZ<6Gb5d1OndDmC^?8s6k5j?}!?$R@K*Q z9wIvIA^@1)P0pm7xgg3fzZCEAO1>2IbRif8Vi)V^`C@BevWdY*PKX zg6*%oFEJf%jJ%w9tI_?Ur)M6$escVI=#5vWFPv+6%-8 zJqHBT@M=bvHO#VppnsIQ96$LbzL&i_`s-!x>Z3Dv{8;K_eAzNUm$J|Q(*FE53@S5? zY@ZgIv4HwmaZ7kn)fa(!nMq|Dc}+1bV|dC&^iv37oEGo)sq9R*JXdkaZAE4}5$j}5 zIHLC9YWS6UEV5nB3!(3ZQsGI#PIj%7&usQP89KPqw+e3F``nmv>#B6G^0-#tazp4j zZWrr{kQ<_OBf@I$Vk9*rGxBJ^yLmW2>86w`z5x$C$= zE-v`f)KvwElG>`V@q9> z@-#8{Ma#QaAO98CwmkH{N>N{Z>e9 zgjbuB!Ec}-46EeV<$T+|6~?I+DU~~I&I(#v>sPfp{{0P3O!BC09UZ(bFq5(upVZF= zIx1BtzryzgUt~7=M}~VvT&uIix4*r0>ePY_emfg(Zd6bu#%H<5udu~cXR^ev7hf;t z1bL09)}dm8XIES2w})=a?>+6um>KH(;>C%rez+GsAttge$I67sZ|z^L1%2EY&yz&H zlgTfW+&S@{u+cq>eNng~;Yh5WIP?4955HqhB<#x$m%5dV|J>q^a>M?3^6NW~8{Fk@ zoV#%TW{nofDoc6VC#m;JkP-^zDFcUM{#?rNM= zuT1q0mFHJJTX|@OoS+>+OM^K7<=%&_vBqqoL`_z%7h6-Br|q@1C~1)ukT)a8nHraS zvN$*EdaBp&CV3+=`ov{@E{ym3?(;6_ZD?Yj%vTw$)5G&R7o{h^j4AgssBl>hm;5EJ z{F{^S+x-a2ipo2j(=f64Q~!kgVwZfQRLmcjQSkNVn_n>t62$cLznA^gKgGTImfYJ( z2=y`+e-HT)o33YWPG6k9FnwW0t*qeO&ILzGc9vGnx{=cG=ZiE$PSxC2SvUUV+q&3W z7P{q6vyqN-xjAX0vfA36Twd_cD%-q^C91T%W^f-?-m8M2Pl>;8<^Ca!0;hy=RoyFj zRXSU7SoMQ#x^7D0Gx9mwD2i;k9mV7YvUP8v_1~C)kT4p{drgNfVJzuSjsr&8wm(W=D zSKy!bX(MqBsFXOLm^B}p#hm-(^&>F9w{wzE!wFXBT&o4hrBc0F9 zd4cu3zf;Xz)l1uzOm=S3HYoA9Dnq(<3Yvx0e0lc<#%kI*;)$uEhwjICkcP9CO~Gun zg<)5M%JDDcM5a@~hu~g8mxKER*7phUFnWyl)XQwB*f;D{jq>4jt7zr7`n2>}6}&X0 zL2yn5I;gS#UElSFa>HHtBR_=q0JLUVuX$5>iUg7zoj)i)5UQw}Wm}e3fpw}0M z6>QEs>Fn%!R1zVLr4QNb{o0iBChrzze@t{fA*Xn~_WofEwKdPam`@ipDaduKR{j+= zS3fCD+*Z=G&|JFMaX}~#En_;tu@ZBSplzO+-T&xhuGed8W9hLP?)N%0z~4=4p4-5& z+wF$8nXcumE|h1QnJ-#DnG5(=K4raXs2hr^I-^bD9yQHD9Lc_8eB26fg`^(t4r;jF zuXwrPKyc-t%iIlVv^L7qYvc?<917R_l>6O#<6TeN7al6>AMRy2$-(o3URb5 zm5QF`as_3fVe62$A*)+)kn4)0LDA#PutX{)tf;2Cmg#ON;Tq75q$IJ0x}9#wE-*GV zq$!;oCy6F}4BJRrtVMc#3YzCOm3(X&8q%i<7f`?vLRVLLI@J7-TOhqCNmd?NK3dw4 z?d2ij2x%B;WAnjHHRJmF#+2XY-@v?!Kk6G?u6+5v{=t4<{>RZ-fH#pXP&kvBcxq^i z6sJH7h2ri|+?}GkxVtSZu8X_FLl!Hpi@Uo!El^r$sU(w`OyvFW<_DBAqdIqCZ)!$0BU^8IN|7Yhci59^t8fIWw9T-LG73DE1) z^)-S@+xFwTeWa`E&0}4jCoHT}_Dk6la&^jf-u^6bW404HispEmBP{!j95+Kso0fY| z$(cXoq&q+Vc2;-%o4)18>x|RtdHG6ulOO)i`xC1D*eefp|IZtxjsGcqt>idjnk}~c z{`J|3C%3*$bNL)Szu!pt$B|dt=$!Vo*Xs^%b0#nSxjZE_<%=uR^soI-X}hcW_jxIu zGghhJ3~d9FjP;>!)saeApBlS*d%Kgw%C`6RjaH}G;G3om^o48Pe6P(Uy{&(E)@EGS zo|~TNYdZDm9o?6uANu*~zBJ{B>i)yf&%4l(;%jM{Y8qjzE@f$Dl?D1xLvc@(_lo68 za7)`||9fZCtb9IK@WQYGIX?vX?Ln4@=2^zP@CskjnQHdrQmcAS`I>3d{8udpOjVW6 z8Eu@EG)-T{zvO3&w_RT5`EJv-5N64$V}Q6Xq`Eb?Yj0X}*JiPjxkkXbfS1OB{^Hth z&7#)w47Y6xeHa>O?W=jcfq1Gfi9>y5>T%+vegmP-SXR|-IJC`fUeZs#4=5ZTu&dj6fo0a+gyTTh? zE+qgChCg$?Ymryy9_{Qe|MW)smucNH_WvmE>Z0GN3no4CQKK2mt@FhBinvoe-}L?U z5x#=1welVJZDow>sJ@>q%koTTasHKAU2fo6Xz3s+W8{a|;~R6PbgR zgm4Q&!FwDs(g65Juu(EajQ#Z|$A#N%qJ1 zb9#qr-{im3j-{n2uY9wV0%^@s?ar#IJw4;wjGrd&EPplFSH`>K^+~sqihjMF zHdt#d-j-f?OF5sqZ~Cu$d-^_!lf z+9Ca|d+a&v5A0lnpW3I`4fgrLo@@gH zmRg#c%9#h*_Xc0d=?cq}<9k3;>uR%0YU+!2k235Hd26YS1{+19$SDppj5C(E*9d8C z`{EDGc>nXHXOFSAakxItJkU2i{ zn9|C3OxMKU#52(C^^K9PiO19jjyy_V@@XSnZ_@iX9(k(^1;u8hp?$&~VVG%#&1zH) zCQB>JPpPVZg}0igp)UpE$zXc>?noc~1r*gY%XlVWpWSHaDwy=6U^psbGyMp$oYYV3X^Y7@DcYndv-YtHg0 z?jFi&?@N6<>9BdGZDhcez&5s3X35aS__w`aK(e{BkkhL-9?Ll`XLIX8($@n`BW&9& z!^L-+Lyh#kH%t_5_&>J#7V9jeAn%EVg!BFt!Yk7VOI`hI_euXeOMPRY?mwxl<(mC3 zyTNkR^3*;$ptBD_d=GN`x!5qR+_U}5^S@q!_AW|5w?}~vw@3M?T;Y3aW9 zMpw}D?4cnmgSG~$A`v9&h030ROlB_x~ifIn9Mk8O6~RqF`j zZqov5etTKlO|l^+1N^~5?3Zx99tiLR)d-BX*Ryqnp*1OZMy?jw`@;~f5_E)B!Z&*n z+d9)aF-f{;SfxMDj(ULqxi6dc%%5l)YHels!_!ZRbC=h4_@+o>%-M|-#7c(TrhoNc zb>pPn<{Z{4mS(0Q=E^1!{=iuC4BItZ49u@cdmY;d(@#?eX@L8@bFCKUU+1gk&C(Tu z9J*RxQtRbT^%vH45G>>$cI#g2E{lD2s`tMBl=V`O5Rx~zvi*_$iG2hNRS9MOKTBOp zOVa^qwO*4Rl72ZNnRR3I3k=u9e!6k`&8Azn|Jk~lR!fDYrH0qyL!VWN*ZwwiwN5sC zlwxf^LS|(v7BmrNW>0gvI7bS!%(u2TPq%&xs9}F^pJ=;k-DtgGFJ>EOxoHcskFYE^ zl_M+D8ZL7Jgn23ZjZjPOharnB^~_0u&9fB`)&k^^v$;2f70RiEObI?7^l!knfN=pu z?d=1K1qNEni&OMf4IPb}EbhS50Y9w$phuN34IsraRyr@ajQ<$Q@K@Mv`GcPa#@p-B z6f!YzES-eo0}t7A*xdGRR+A~h+y^$$HX0%~1sBV)H)Ml7&i*2(YT!ZJCQ~_m7DTq! z(mZjrZkBM)c*Hh8P_VWWOX!A*$)q|u8nY}GYgJ3A=>{q3oe=)ULwo*0PGpp2i#6VO z1xHv(dPzSU4_kg3uIl>x--!c^#q`;<>+VP1X6%+*y)%7_{l&Dw@>Ayv<%fU1;hSlc z*w8zb{jWRTqWvLxUnQ8O1EyfpBmCf^`LXS-t*Lp4Ay&Ak zJ8EcU*9G*qsD}Ac5#veoa?4ap592nHQ;*;ilohY)48HL~e&YpuO3++;uc_>Km@p>8FYLg){!np4;j@x+}}OU*r3j>t3k5z-ynX z-uLYEC3>qXQ&BaZdGy+3`G4#Nbe7#(6LubpuyYgd%cB!?xBUZfVV2XjC{AU7r>S73 zBesQ*4x{(IZo96ikS47$x3^8U9)%Qq$9PuM`^yTA=%%QokMXL$y!tJs#+KvO6PDia z7|OE;w%RhqJm2`(a9Da}NHFiPT?m+I!zXX}XxeWrW8V;v$GRU*LucEdfDS?3g60Jj zfUQ@}R@YY1uD6XfCc%wPmY$d%n;uE3aL;!OU))ID6seGYAZ+G}y29dX=#k^36h`<0 z5IZKAt6B;e2MP(k?Y`1Nfb^%-TX)gd-jm>#V5yW;K6)PbihJVSI_H+m+?j8k4V`(j zUSwvlQlBJuaWu@lN$czd#|L>LWRxB*Q7xcUa6HKTka^Ql!0C5BaQx|vfeRa!Rhe$# zm+-!a%7?kGKgitfD3O(%F)U+6){v}*8H+RKWVLgqy7PKX+6pokA?`PL@v3m`Ft{qK zk4SYCRI)4ao_W3!o;T_xd4_Y7oT1Edm++Xq<+U!#Ay=B>@>KAC(2l5Sq-5r57rnQc z`CezI_Mva1(A?jiUEw@*1zf|uSHrgx*GqYS1pCP2{grU@Zzs_|5vSE+?>$@=ZAnTT z(PX8F>zhYUMtGiQr@CG%;a%=or$))mWS?5q-C1jnSKyxaFY-(Sf2GiI51sT?q`Br0 z&cThIjoKp5Vt62fe38D9e#!sJ_etxmJam`wHuAOfp7$J7pS$KM7M$3p)OkuZdARGI z`z@J()?TysKe(y)xTj7kXB%B#4rRZl^EA_L;PZct%cGCS4{Jp8mGn+v*E^rPxhqw% z^BrT{d6lc$K6WYdyT7V6-4*daq){7q@T zvHp_&KYjo6Tyg@n{ja9y-HK+TdQMx|N5@ zD^j64b%iRqUMe-*G43RFjyyH%&&c?$S~z5lwOD$|t5 zS`P0`|9ag%|3hzH4R!@C@8x7F$KjQ1;2G>);>+#V=>|h$sEc!=gKn?TQg@H+d_`Sv z(#4ex%JgSOr?jv}`Z(_JmheYFi zU12m#F}M`0T0fjH zDR+RDHj`=jn+*6cpPrtT(>^o(X9=FZxRh79 zGqfip(5>#iYHe0V_q?O&|9yeeXNUW$mXi!wruz~eodH^eN7O>xJGD*ZW}10gXkR?n zybC>FwP)I5tp(nVnMdk9h?kb=B8qx*V7v{MN_x^Cy?fQ7uld0r-P8qHk|1r%pwKvu`hMNkR zvzfa5VvLwd(}v(C&oGC1Z;Yj*`IPAe+$Y7j#IV>f-56*Lg7H$uu#>clYRoc@G^~=| z8z!3u!)qko?a?w*v zxs6WaDWlKy$~@LGj;6C-CbMBFZu!qprjksF#!9&4Ul`xe_#SVZZzu+BqZUk!PlhH2 zvou*;t?w$F({F*AGgKcch&Z&X>F(%^zBYJfkK=>d=qrYo=AJJahquMs3eRp4r~#Q? zAKU;a*Z#kJr|=erd56MgJBRP}oY&!Lg70{hC!YSNKHdsALt7F8oJ+_Z^7Vv)s4v7;SbJ$FZ~! zzIrufo^n<#P20_Dyrp&25pJCpiN|dh)Tm!ns3Umdc=h1(+vr<^3$`{cpuyg|zI1;t ze?ea-?=oLiT$I^azh@_Xn@5)mhjtTPS4cHu7&R;qFzV~_;q6%pF@Gk!B3ZW%H&$t8 z?Y(s)h2i>k`qpq>y6Qd&1xO%m7e#TqWEDO5%^T6GBZ<8spG+4ULLplq^^)??J5XFo zBKIClj_z+*GJld)I4%irP%@#(REGqla_0O44JBN>CtWiOFZ--8%-#~aH7VD?cq2rqD|?%XcjBz zcS28V1xulikex<>sk(pBU@GeK2>tQjw}wAGj;!_?VV&+EZnu$SA>v5%&laZWO?cZ% zk?MaaMAJ8M69%;l=ju0c4y63g`a9wVX^_-`rm=#wGuZT}pi)cZ-dFlPoJj+PaIT>q zT?JSri*QLD^4B8+ACJH4Gc>VA5d3EQE%>ee@nzzV3}qf(5Ni4^-%8Z>fxe0`g2KJf zgtUG*gb%sn-EGvj>U`DdE~740Qj|X2=F;);i1v+B%4#(p9^zb8RGx4ht%l!dn|fb) zuN+o);|T7@7;{`X2qCpEdFQD#{wyOs|AmD6XeAgraYZG{rMb4dwlZ2|sUf6DOSlD? zVv)F%e!1J)LmQrouRa`S@j*{x?=@VtcfF5&dS5gCny$Whs2^`|gwOR=f|Ot-?=!}m zg+Kk1znj0P_Z7LG$-ZzrWCgs*I8iw=r2P0Pm{^I-kq0o4WbM=yF%UGeWuFnP`D-a*@|8O%tfmjtR z=yk`0+|W0A2yHl5VsxANspE7c_NIR#jvlE{-G2BR#dO{M+exrbfwy~|*1iY+VI&#m z`|9H;&qc%1L9&w%{CPN!&gcg79lLqfr<3k@gFkXFzoU|_y6&d1Ro?)*R}qL^Z-gcO zFHmll`TwG$pd-%7GrA!hqXPc5{FWiQAbfXvzZtHa&ex3e)Lh>bSU6*$cyxkl9uI$@ z6WPojIQn96av#MJ8OSJBmn_sVocEs@;S1pPoWr=a-z(v&O`^5B7de?o?FDYu!!VK@ zc!&LX2(#fe{vY|!E6j=Od%EM$eeB)IxR(>Z?t5=M^NS&P4nL7QSVq3;Z)W1tp)GBq zgK)cNl=jg*7nbE{2q0g`_=R(oq_)ld3}0J8b%lEwS&c067%_C>t#Mb;iqg?@&^y4h zjo;PD)0-K&0@-E+T}?qGH%7W&bM?-R5B?7H>vD>!4&o{~3HNJ9#jV_evZ`=~w{*+Q zdNO$Qaa?E1a(#b@)3XlA5QS^;3B1Nt7!B({i}?p9WM6L;e8oHQH{T~4SBGSLc1G&0 zK7;QsQmyBpY853H<`5bRJ7788Ck-}@Gp~cbAI;-aSb=xy=(#!y5ebgJ$u=gcIW_u=?s&yv9@Bn0a^!cVxQ>q0hS zJqg_6x)!<+*ht?<^v6N^ONYGhh<2d&bTX_Zi5E`#BAQNRJLlIlk`}A|ef&9~jHU4A zgSk-M-<_s|$1s@I_*z3`>gz8G(SIWMl?R$qDPC(U;lJgBcU2L}|217_=73ZEce%gI z5SWhBn9_(j67p{!B5F>gtO+uzk6;QNeLRgG2wHz}e& z=n(9wb2B@c$o=fnO@N)-LwAnUe@ma+uY+{++V=uh%Xem&*L-E+9Zf`0y$bim!ED)$ z|8=2njn_#sb|gO7s`#Lfd#gdIQaCee!6@qNo9}PRPjB(f;K=Or7xi}}Q=yk0~JY{ofMN*}1-PY2E{#-qlJYx!}y7KWhq zPMiU?@0i#_3Ws9XM#{+<@>zO=12&8Xq?rbUu_JUG>erI9nBZ=Bz!(!=@v`;z;Pwx@`FQ5sp1r)gyxO!#D5}tqsy;s}=xvw@f zzud3{uh6dWgN#}em_?7s!2icN+7xf^9^oLK?$adIM(XPdC%C%)3;*LEQit2fg$?Gr z_Xu-@{EUfxY1LhXzq~jE%|^Z_B;@c8CEwwWs}##=P&xplV-lf zT>T^G!4XddbLWu-rSHYtn1dpH<=bEal!x z`*Om982Fo{TN?7%aL%!=xS@;r4v-q^=2Q7~<2h7XmJlAJTqu>&3 zGXDi7bsIEP7i5=X^bCbsCR*B9c3b1DUvWS0wpz%+&w{!+fWCz05SjPEX`W_VK+{4& z((@gx9j$vw)5lu#LOtk@OWMb0N7GdHh#r|qRuSUHG)q}r)+NkQv|?R1PcW^gN#wR^ z4rCx5v-7sb7-na2w6orl&fw2%hytsF4%l0~$J(wrE6W3nW&KId781?OlCJCH1PAoY zd_s!woMb?6)({oR252-k?H2~(^)JlT_8iUV?>QPTxf<5sNO;6f`isI0p_qQ9G+7z| zZMHrM$MNEINym)wGiT&laXSptBBbMsF>=Pkz-`3*>y=)kPplp1>Lf8gsiatXPWD0h z41tq*mvnC{9!W{g&#JsS3qU)0t5@`?%ouBuQz}RPaf1FKkGu~gO)o#Y9h!1C_)V+H z|Nh6^@)M1boy8AQCuz4dj0UZHV!E{6IKVvGWD>6XI_b(WJ6uUWNuan*Do;8$Rhq*! zVu!c@lKLr_eRp`274%ma-xWxW&0uH@6MKt=^*?yrdtlFg;K~wB(i8qJJyum1KlVW1 zQD99R;b^W9&xyOCl`iMixEJ!TPNIfGnhn=>yWu_~MJlzel3!)scnw;CGL8#Y$z!id+OW7>n6yj2R5D)X5(tRFseb!+j2W^9NU}zFdty{hGrGe=)Z!3&*1e{W04hDK?`+raL`*ZnCh!%oX$S ze0Lx-TbT2s2|2bRoI|7ZQ6yjEp`ipY%FWa_*Oy}jsp`}8@AZ4(JT+kK4}hl=EjStP zIzxuL2D5pdz8}eliV)xq2uGP)+UTZ9{LM_NCwyR?aaXtj?R5l?CmV^{!d!Fj!BO&) zdpScI?iypxM;dV=1cApsmHBcc^W8Rrjw|O~s7gN>QOBRNtR^*cCE%jy56KWGr_++N~lR(VyV>a6ziNx3C~&OQ@#m}Ml@ z|DZ=s<4RM&V31z$_K_LUS3`H{z4V{KBz=)CNPjWng)@ixMZ2g2VKj$i=XE2~!xBL6 z;YE(}M*VrT`DJua-QtM$5!&j$awIZ%>%*KPAM>AeWJ?Q^Ued#h&*A$>8t^Q$<5=dX zcYkpJyeZ6m*L#CWm;DP(usK<;9MCFl=yBUf1J@x3+*qqca;qU}zeQwx`of7C3;*Yo z@?FtL{Pm*6xG5E96MT1k7fDVZ>5_;X3w_8QK|=8n zUiATp4colEcx)q?rAL#D%izd8CE+}a++Ls@-I# z(wO-_A|*8h!boK`kMfvim(OYewYi#IIj@X@Yt%5Zn`>|=cW}2tc4u+9Wb00sclKr zomaiA9;&+=ljf|C8d#rXS2u1|Xh3R17WZ!+Z?fA1LAwkozDDH2JCp5RP8KtnwBQ}> zx^`c?$(o`lO7uk3_c3G#JJCRp#WR;q?(mNGg!M*ml($+iQ?H{ZHb99kO;T?n>Cb-X zGlD89k7@Ur3yc1%(hi2xR95Ztl*!5&OW> z$gMqxzz7T9UEE!lWLp<^P4q@H|5oRD>cKjzHpH;%?(BS~9gL_mz&8mNuyH7P$!&Zk$YVD^ zPe>-CK8t%;Kz8jEtG5YIJ$iXtc?*(m70EB_yoJa!ej#(U8m8bSx(WAtnrlg%ou551 zC}JOZ7T3`mNB<~^+ZOa^Um{z5kEHKa{4K}b$9V4=sjLZ{7sK!c9pJ0+d~FNK>}jk~ z_jCInY0iEeufFcF{N3$nVG2bVc}VW}1h>=bHU8x|tM|xr-BI6jluEk`LaMAp{?7>E zKbHI6K?3XsiLOhK4linfoNa$_wpAzb7sHzfQ};hIi0gPHQ~4bY`MG?YO%i=$Stu|g zNQ2f_qgn5M;_Qi1IxG9>k7_~csHW1BUV$*zSNaPcy6!?pT;f{p+QZvw*E*<%e?dxI z%bwXH*9=sj(|pH6*Dcotcw?zbEU&+r>?KTB&Z(t%4K?Ex)=K@)U5In(JDJjkki$0e z*RSEsUQJH1HwiTN@1ysCT)Rwau?pG62>!Lxn|2jFGX~CPU-ITd(3h`3rd(&T=g?xp_UiMz+BxX9A*xA55h?j3DdXCH8WU&IfWGR<%Alz z-o>y!OJc1u9(wz2cEUBujD4^-Uk5OR+(J35ae=`Ffms^DcltU%^zt)CC=WGvK^ zDWpc%%A{q13OeppzB z%GiY!$9iU9XUHJ05k|sp+sW-D?uZTipU!Vh5I#XSXwU4XC3CSv;S1~cC_zQvtw$ST zTc`yx%3};Gg)Z!cG|-P`jX#rc3F>AA-b%tEFGMdvVcZ&ut`^OlC3J<*E30tzFNi|(i7WqkcpLpu zPRja=pe+WW5;~xCY=DRn&;Hk+zFxc%b2CckW~FSUJv)tY`UdCnA(+uqp@=PFCt)+U z12EZNaBiGORawUP+>&!A);p3j|2$`XBK&JNuY~Qa#9zS|NrO0Yh7tT1QTG8H=veP$ zpN_Bm@P+fcvY{v6Vs!Vy&CbrbH4R-R9=>j2e-j?*LR6twx?tuo4Iyzqr?bG#tG+t3 z-TFMA8%UP>A+FbAWjB}GN(eUTkm*Bsi)HrymzXNvV%<22wUZ)#XV0MqWc*UB;08#Y z(c^|m>uJ1tVbDunS_KjzD`iP8nE9cGdWM09F*FhMWj|>;{a8&5A(CvU&yGV?-YT+# zRh({uF|=kaq(5$nVHYc~ee7XOVKsKukVHepJHsJJP%8Ub;f7VLpXxz&4d&z8tjV&& z-p|EeSTLNYa>hn*533nV8DnV=yUaevPMSDQ&`-F__!sP`+Qt~xPtUmDNhm|T4c!fe z&}k;ZYHdh^$r@IWq54!PK6CZOIgekXTR-GD-PN6@o1!_~p;vGS7tn2*g2tyoLs5KQ z-oJ?^_MExoX_zSYp`x7dy~O<>`%C$&!EqVlOYjHr3g>4~KysiW7DW+B^L=C7v!lS3 z_vfKEIow|wmh=zq=LT$*$Bfsvd_Vj}*$EqsW8^8#sf%I$j)WCc3tvTEUlEj?Iw*Uk zm|GecN1E`JwvdzdK#lprOjd?G5=id60~z#{D147m))n@rV%aHJ#i;UvGyVYc*mt_m ztlw&KuE((!?98gLJ)_A{;SFQ?E|>ym*tdDiXtJNz`XXLSe%8|xui!%Z2-bMBc=$6IdqU>_IgA%|%^JGvp5Rg-Wd4 zr*T%TC%xVdji3ekL|JYzXbD9ao9fecksCFnHRID@G~xb`x$?4}Y(`5*ea_0wVt0DU zC$g4bh{`sXet<*pRxhDctbyXSjsNHH`7PoJ`nYYZrOfP{JJ9QLuv*T+$3apwt=p4X zGgYU@WjH#_e0ITpN-~WZr8qy^paFC;4C0KuZTMg`!zR0ho@irr-V4%LH{%EzfQNFn z{mY7d53j2Ze*bU4fW#cUu zug0R1MGBRQv45CAFUu7)^trI4$Do+(XE(7r%;bjbyQR`@!O{*2o(pYYlztOy!G3fY zMWPqQvM$ZbK29jAq=WY=F`8E5R+>40RUd`sRFKg&2V?LEM&t2}5YO}v(WMS^20TS^ z%MA@HFQdhD6qY^W1Gts@(Xbwhs_5YnhDm1LvT>aMg#EUMqwt6(^a4^A`;Bpi&W2@% zgYZFL(u`^`h8gR!t6iQZor}hk(A|zfHT{WN^3M2!#$KDLyfK*;n@p1k`}7VP%WR&3 zb`amXprXv8r*{^&k+hR8H3ZRTv|a_08DSKZvr z+|%3_s%k?zluDWNuxFm}>+7ae+-3*N!^{=)CACRPfwYe=Ye>FSJ z2`G_Y&9}_Y=QFOQ%K?m%Cs`E_Lc=Y{%r1rf2Af|*ODM@+#w2zCdZG*OhM7N-`Dq_k$y?}= zxxx26WE@TL`58A$K+vcMBV#rF5a<0)uD%7>yXyzbXf#dPT)DW4Z)Hrn&5SgHeSsmg z_*~PwXz|I1#yE>{<%al;=I3I(Ryxvfb6NUKV^tWhzrI{yPSXMsZ}@`#UlR?s4=lkh z#sScCJ)BK0{1tA_vF9cUHLr=O3`ez$sfMWyROZ?^`s(oBaQMt|rV?m?olHk~e;}IQ zBK8rs(;GdJfA@3FoPZO5#k7sjUNpUj34fg3ghz1Yx1tK(FumdH=OHks^6?<{ApS&2 zoXWp#X`c=;?lc@1Pw7pDsX+}xT1XqcrHv~BYTFyz8X8)Q=V2Y*GDTX3>1B7EaMQXf zu(5r${-w9P?yR|eKxbQhLqoBveyZ?;=g_IUF zqNO;Yh4kEf&fH!~5DMu#ng`o{n0JcnCBJ!@af%SH3)CMpE;Lr56*k%0*jCoC5HeMF z$!-{8yd%Ylw>Tp2jLl3rjNhciut1)Pqqw3xFwBtF`tSIL=)-xm_dM(tF=L(MX{z@3 zEYLOb&co+!*KHP8`o6jId7{ys7kYZT|I=j`POul5B%1Ut|0ms6Aw@UbUkh5`B!7Lu zB{k6-@C$s_AC_{m^Eg1CE}RqVFrxG_3>QoK9}7(+1AE0)_3_3$h6;Ko=XHv{gYb`k zrO&5prcaQ3QlOB}e_2?7|XeM9`Ec#IC*x>bE+b;I;q#cVyv2!p0D35)e-Ze zZ`Nh*KMFV7J^yE4AqY|1*)<>NISVW8DXX7sp5xwP_$Ldv+iCUu4RsrRS5O+Z!o@6w z#t;V~?Xb5tbfrb!yuJ_KMAfbCfEo2m4=h6;MYwy7=at)|nAK@oDP^&%KQ!HMIM@m) z5y~9bbft*uSHtB;@>(TW-2efO@)0LL`BrMA*r%iW4~{av(x-YAy;DD~8QP{|VA zX<9y|qjSIWgzLz!W<=D1PSD~%xGnCZP!MlIs#~TVgl<`o_r61#3wIyVCejf!0}@(G zTuk3RCUuQ60f(F7t>#&$`7}Men*Lf@PhIbL&wB`0e%6=^JzKr?eJ8!XUkw|+BmU>! zCAdC4=!s>$&zSk=fmJjaH|%QvA+wgu{SFqAr9SMyoKV5q< z5cG3uo#DdGc4xXLc`;_}FU$mLu? z@^a@g*?@;}p>i3bd>;D1m%H*fAIn+F5Z7IKnOs+1FCXLlh?FlmJ33lqJ#&OR57Ryn zkd=~IEwc)}qR$*b^fhZ)PG^X7wR4bTLDo-aHCH>=bUBv$4v@Ra5%OaA&4r!a9o?P% zo_5}LHljhkf@7?+qdd(yE^Bhu7rBDG&pFO9%rVm$;5;M8ISbNI@X}EVpX_t_ zfdi9a=5EItSA;A(?q_w)+TolgpK@Hu9Gv;uQP?ra8R7imc$>A=5hLfOpP-t&$=O{F zb^YtAAs3Oy(prDixyI4NS&+Xe#yQj3*l{q+@0cogaOs`9vV4ww{8bM5fz##8>ntay zDYKQyG;ns5`?yMTzLs;f;AnkOM=1F@{@c`&N==T-dZi_<AHk_U;0l(9 z(9Tdz_Ms+!cYTvbIlb~}NcuaVRabCT#~E4OH3uJXgtLuYl+M^|&S=L3$8@z=JmzJ5 z{;)houHbwipGL8sDW}V^uI9=PTq^O(CDjCHJ6iqnTV-vEue2A`wkA-W?x=ThT`fat z?F?CL2D=Dp?l|?MvR(1hNzf2wZic(HT7$tt)x7LI+)xkT1&dMc zyCbVoyqc)ftR-i+EC9TY>X}++~ zyB>!+xE)3Gh5F6 zFU-}Q_=u*!__NVFb_=3gxYiZQ>QJbB)8TR+)i!I7JrZQJwh&uuvCraS-y+zP2M@g! z4Wl!pK|ku-RQ84L(s5NDC88FD(8*}b1JIm5K=W0+Px+pa_yo4le-%KAEtQ?6_UIm; z&_;^*^3s~L(0d83V?X-XUOan4@r_RM#?hJ79jAU(&ttfOn>_9K-H)LbR`HC}zOYkL zL@NWmjm!v-vUcIolgvUdEeF@K79PC1P|m|qWOvimQ-JHx z2G1&py1D2LPQoYlp6;>nuyP~dV{Syd+T;Dz@{}7D>?#WMFs@(2e2?f$DTfPaHJayq zbg9369oc((&ik`*tLX5KOh-Gp#7yZ7KlPmzLoqy6Tj+^v=^w}%peO3F*}sAP$tV5{ ze-HGOIQks7LcX2G3S$Cusz>xi+~MtC|94#^yLEf@)eQ%YZ*_guRi5ttPrl9mbeilU z=(tmCrz3{nZ9~Tz3aYQ#1CXcc7vqva0^I=X-|L zb0n(h27MMCAbru&6VW)k;+>8})txVVV!k?&J!OU7(PR22sIj|QZLi^f7o0y6T4+D! zk#(4t7Sj9BNkUkqdFV0tiNCS}Ub&(ALnypW;Y~-tnl3K<#7Sh+$KxXT)x)|=KZoqp zEwtV(aAYsgNgHT|5;U_sEr1NuyS?#SA;?V?#vlnm??Pmy@@H$kVH7J9X zSuHNWJF*wYNEb0e?7{zsSbH_4SD`OTS_S?+hRfoR_>5*{2fn1xeFr zo4JEq>I!d(^byp-qZ49?FcdTtX2p6K2Q$DKR&38v2HViU{qmPf3$lAVR`|bs>eWm& zO<|^jG@G0;rI^D^(^#`VVr5;<^opjFwWiCg*niOOwa_$*HL}xequ*3`-RR^0z1 zFYGnP(y23nb#;8jtoF{2H53l5B>$=$l&&W2MKm zpL{S>qo*n#3hA%UF5xy1SNBF^5wwfahLh+-rTF|y!!#)gO|>q%X)i-A$&XI5&`?rJ z=c{$v^)5s*F zg~ZXacH5kj&&@Q=r-3Ba9Km{algW*qkw{O`Aaf+&I~djCAM-5Kk>aQyea)lHz3AGi zV{XAmMviQf=_f~fn7N&~7~08dh?Gms@hBgA%tOsb$r-#g!xS)ouoSd3ri&}YQrQx0 zmMx){0rZi~vs9z&<~j?*#`Rp^IhxFx}oNGnecbF$fQ>1FA`5#9`CbG&&8t?&KJcGQF?JU`!Qv-{W7 zoOAI2nnVYBe-`oHLVCPs@eFR`>|c-Cu+Y@Z)RI@sHyY~NnJlKfrWU-CY{pcRU@D8! zp)HnKV;1fi60p)|qj5dRkaB=JxtPR)@QcX^beJ>8EtuJBr;kPt^2HF z@#hVr*`}wpjMZlGTfSSKSsq&sT9#WDTUJ|USo+e9z0%T}vu3Degry^o(N1H|CG!K? zvhR|Nc}Ww}a`Pl!|7-cn%9=wsn$OX2u9{8e9A>LIfHT%XZ&H+bh_GV=u3WKj@a5z;AeN{$@U6zD&Pd723KxTKaLT z4Jn|XWxQpDWh>n}3oMstIXQ0GPJ_}(%Li+)RnOnB%W}u!!i{*F{;m(!?3Pr^1-|bN zx8wZeS-gh*E$`@Sx?>IGuPregPiYC?Lu=SWi;w%6Yw5u6 zAI`0xr6N5|SIyhe8TXr4@G7;E26Ezd{S&1t7De$Gtx{`^4baL)8zboozrdK*i{`RT zh7~k9`RU(1B<+w^lS$i#hTZ_DQg$f-wbz6T?H(HZaFoT7zphkbHnit|xGJ?^2l5Mw z{}J&bI{jrd;;m>8_1GO4K-ba#$S5SyhumFki3WL`eW=&$0Mr%p>65u)Ww0|aSggZ! z>@xcbbJ6mzvIj7LU4g?mr84j@o+pi8gU9g~zPQ=aUg9w_9MQstM(8t>jM6+ z5mGz$Dmu{09!at%9fkc1SJ=RnRIAPC|Gn_sRpXd_)*r-mcbu#D zMjCJi>npLJvlq{-iM`!@_>SAK57>jf`;xc;jlXl%&)E68!9HOUiH*Uedjt|p-wuD^D!Rilzsqjs z8X6Qf;>L=@%hH2Bl)6x~Lp>kyl&7+1o}bQ!Eo3lv;dIzd(r_EB?IWI3{2S-#28mqn zi9#(XtNlPfi16g4Rs1uA=l-lu7D0c%%sL=94vJ>@Ec!BgUWZ?$Cv)k)@K;D~7c<_< zWWx+}|31p8s-r!3;mcoIBGK;>qvPv3jyY zVDIVa&TS;~?5p&q-X;k$6vgBPjQF*y7W^Z-X!Mx-+q*N32AJ`zF6wIC z@tn1yY32vYmWU^%j28OaSJR0#^;_ILBXHgH!LxIXL~v95H;wSqY{J3P9XHJ&95!3= z;)LUZs*20zA67XctD55IZ69H>Z(uca7b5c|8c1uZ(duA)TOINE6;t(ivp(U+I*$)) zDO%1glgRN;o9q3KwDN{*Ff3qRY5)2p zujTP{mXEq}qlP5O>8@Z`l&ha>K8;`v=|ue7b<&mPdWJ_S8Ev$XQutRzj*=gb+-YSi zPPcocs=v}0rr@B9!1*@@hu<2!l`Cjuc){%qPR$Sa)5g-R5RKEXGHc6uw2DpS{~q*< zjex#hgOzGt&Vvf>Y^> zo6+_9C_%1dS2}0MZdxO!qp(z^74nF@foE+1N>X{bvK;2ja{kXb)H&HX#W@{qOmieS zE<0X0t~q8qnmH;t$~cNU!e|kVcGPy%%{r4cF)K4GD{FVw)ydUB@_sVA3=Dg*6E6=76 zZlyd|o+&Toj7)arm;Lf*8Zn#xex3)@{8q~KpDP<(y@{?buAlU*K67Q@KQk%S$sSh2 zg*FBk+7{)t3Y3Cl_)fLp-yDRxF_LWkJoO!^*5@>CjD))X1hW2H^(op&S)Rqp?g(DJ zP0>gO;nADKv)U97V>}Hh??{q;Ms4uZmFQx8^fA6Q!{u9mrm9>xJ?k<0RYr4YfR5h; zC7~j^OMgb*PPl+8k+>bq_m-jKXEz?*VR-XS;1Z4EJ3|YBoLYpwiCFSXQ*~I9%72@DL5_@fU_PXL!?Zt0us&?Sx`s^ZG5 zt7Q~f`GCLiJULVgJcotK5~$Q%+xc3Ws^fFl_^JCU zkx#yw!0WOY9@(Ey+$D)t@porRNfe{yIHQlTyKx2&R5~f5B4|M|F(ls{J^u1eXP}7rw7w=wg6xAI+q=Gp6L;I=Z9$vxl+&P3|@j>HzV2q&rISe?Gxyny3;*OVXXSq+yViQw(JgZvmV+5B*N(HO z8i~Hzq{qtRF`B?m{V6>2b9g=;`O-;f#gijD<@2!D-x_aI72HNWNNin2F+0tUeGFPz z9rEylNnxDFZ=pwBc1e6bHyyB(R&>n{47doN^cO$sH&0_m&Jt zkeG}ErZD$APuj#Beh(}U$&iEJy4Mhc3$7CL{6dD}%%^kmD^~zXerWsF`{wW0 zGhd&6Gx$xjH)Y>6d^7*8@y*sZbzV1oe&)&Tr=y=IzWDi~{?oA!M?YBjc=NO4FQQ*P zcdADh}b{j6iU zD<5>4`R@ImmfjXVx7gHjGvK6cy79hYsI_H|w}oGpFV@i0;d%Fs-HNoU)wE2*;Cd%& zYc)DlDOW)s?TBm=F|XK!Vx5bhD;a|vSFuV&<%Eh=$~TF*S3bP_t_l$qD^~1Z{yxv3 z5M8^>%jo{)>cq4!*S(Aul@!%0>T=Z5$V#PFL?)EZitZDAD0*V_ndlv5+-1U|#+5o( z(h~6_;-6waiWDwn5C4|$LY^O?r*l2au{xV6=t;mK+gM9wQ$9ljakQ{sSD8KKww^F} zMa$R;dM593)J@Nxvi|eykD>4MuV1{}@@(is=iT+U*W9Uicfj3qcXQtky}s>g_N!BF zG`Q9E#)&IuFZMlu?|iLu0sk#MoB#aEOL;F(y?pkH`AWAdORu)L*5>-9TXpYzxHshf z?1#gi6o0n%#rxMY-+p?3<>Ti>IcZ+X<%MBzUANo`IhivpN3Y-x zK~cfeL$-wE4A~R}m3`)#^4mI)?TT|ExPKYjmYye+|gi*VL_J^GP+=R}ZV-vDxwF z|2FDS$5DG|t(CRc){Luiu~K5yvNisxvOjuUM6IHK7mY7&Dt@)lj$Gk9m!0$@J>8WU zR~5Ch)WOn{l=@>+qAn}_+NW&aZb>nL?c5tbJi0&UNuBh~TDfgJSFg|5V%4A}oVKJ)mji}vdUFMYhJ`*hy_ zIH+52?~rFXMhCUh?fh{)v9@EJID=foD?=Uepky*t6HU$m->zkL33^$)T9G@2ZcqNyjgjR+s|06#-Xa=N6uu+_o>boy3wAeKD(`yy_i^8f6t(qJJ{yfZis~)PwvB3A;d<4= zRTh^ym48fFQmF-%_D4q-td(<8P*>Ab|88-&b)xOErMUJiHRJ2|_cxvy@3g}3Aa zN3Pwtd+dIr2mS9&eyn_)_VwXU3+uT*QV+gb`0UWDqc1OgPZjXeyRKv{`r0m~w)ch@ z>74qdbwa|=|7oq2vp?H^-1fxv)bP6Xn}U!3xOMqPb~Zle+*$tkpHE|xhNmp{=nP+7 z3lpop)2GMiCwU8`olY$9xpZc@?x-o=__wk(B`)KQKG;-HIO~m8CuM$cJ`NaHCa~)A z@;QrkwXg7flDY(jSc_YC=dNCSaOJ#>VjKOhY<$5>MbgX0)$G;aUCo>&l0!#?JPv%G z&s@1kohH>^SFKmhov(7>+?*%F%H`Nr;7Y{;H44{0T61f0?&=c9IE{vHdF-K+bvJ)} zOb$sqp)T;gPPvtMChNUpQ$pJ(b)J-Zy!>v7ON~x1z4F(qNr`u#4!SI!Z+Y#+y}1ud zJgoL4|BH!lx+T<1ou8HQed$+2)-hYbklKb8a--C7na$kitc7zm4T-Q<%NdZjVa_u- zM(606qkZnTdCwLOi$LwX!A2wZ>)Jx0KUyC1#*h-ZhRb@f>?*-e^`|Y=1HMcR`&;0Y#7+3S4s34bpiMgt~ z@%P}zgf}kMWb@f5?VMfX`S?C#p9l|pMx{fOtp&W zYW-bH7oO_3Yq>(+M^rA`xI}W!8>ah)yn(Jld!ufbww4@Qv~K=dc}^5*7TGo;x%jdY zeG6NQ*rIMmT0&t)y>0dCw)05d1CaswuL=zkmwpJ%jLAK>O!0!3vMJWdc!u{GPJ4QN ze~`HS!~foNf4}5MUq_eEi?5ZBZ@1^>xuc&Rf1Z4H@pfTj;Vs@rIdDzFGQV#`6`A+9$x!$l27>^;rfAsZwdiUoCnDVx}T?@GvvOhS|r!+g9p6=ye zd0wNKX8r0_DPLI9rDTKPM!t3U?G7TP#Si1>tYXn?jQ5OUy&i@w-WKF7d+q7*Rj%`QHVZ4}VpCv+*~{{AL#Z-Sh5pT)%?O zw$jP5zsICc$O=#WZ7Xfv;=V>dms>75y>Pd3uJ~YH<-be5wf)jPw$9&aQXsurscBnN zI559WhF{XdRMP%JPbSl-uS$fYKpo1Da9Lz6U*beWqs9a31Xd0RD&<+$+|4yN*j#3q zf1JxVQzI%7;wcE!-v5n)}|ET}% z+AH?ij~_)DEmP(v<@|n|;+iSOrQQ8>SNfK3Kg;YY>h`_krPU*BF7ru>6XA=C>&aJ(M=0X^)6=$V|!c1d8L)K zdRAi(Sv^YD@=g+h+~${G-C$^wnzda5AC)MonO4^*ThD8p|AJ8Oa;+-es`;T-!#Zs3 zhSiwz6-%uM?O!#yMoOh`rCdEiUCOxc5niyDyt2J(yG51o2#9gXknR=FVLo^eY%iyK zk!SHyN5h=QKVN-HjN4wgL%EjOHa;e)R_fslw?C`D)_IkGZ{m&b_lG^-^QP^m#j%Ak zo=^Hb6~Eq0+nY;f^hvsrDF1Dm`6gNWULt-^(E{VIb8$iE%%*>L{oeF@Yw6* z(S^-Ys(z{dact7h%<*y0pYMNC{_XRhqis8pX}U%w?PGExa)Q(IeoglzP@Ait! z4r`3-9%~Qstm8+)Yv*l?yH8u!a$5Ji&(2(*Wg&yS>sy_!{X9ZF-nt}O8hR{uCk4Yg z$UVjLiEl->Uwpi2vGt_Sm*A~_OW23DX1UA2sJ`G_C_OBse|?Van8+kWCmm1Je-y^G z`LyHhneXpXYyQrE*YR=4Ya*dd_T_vct!l!`*qJ{TBut5~A3rfED*aaW@9bl?#$Vq)>{qWqnzWWSNt;#XSIij2TqJ+oBWu7XaE1NI8VtW>D_77wsB5brCzJ=P9~ zwDYmjge;@Zvv(Bx3tjw2`oDMI_-H)^z6ml)<@D^$zj=Tf4bx~r8km490ToZ zwWa7Omv%NOI3~`NcPVbhO;R&fIB(d>6m~3#Dp;BCnY}YB`>*p`zhA9wUGnDr2}-)2 zx*~gf9#J5mikX||mL8v7u7D$YdeiProDuP1Ki%Y!R8i5rjEtNfY8UHievOf-{47Yy zy_s*zosv^rRAArkOp%x8U(G+t23!2Ztjyav&D1gM3*)1BR%xpHL01)Gymm2{%=52e zSwK+Est&uBCtS4VxlIq+RWZ4Y&BNb1&TEhNSC55(55s$wUg#GXur_#&_g>Q@LzGXb zttqp$hkFZ)KjTllq_gyVaU^}9q%|}yXo+Qlc+Yl64Avr~Dn<3|{q)zaUIEqo?pQ=F zN*HQxfz{_0<#q0~l+0fZzwY{+`|D-uoWFC@X5|jc?ORa7*$j^R!FJ#LJ_W1ADr5)x z6x3nus6S*6WwH2LYiOA5xwbxpZ0SVpbG`>TzgKZHeZEI$_Y}UI8dY@7F3M%}L&i7g zsJa^2q*d8dywT=a+)A284y2|VyV&-os$`KiR_&**Ww&?@@af5D_IgU9Yc;P7OL<~9 zz1=!y47d5hYx~(bYEw~zYky)I;9Ci&Q zh_n&Ee`gQSBANTnk2#Gqd~;4J!__i{LoyeonzMQpT+N=C>!Ah^Ht9fqmDKN9>xr%I zAi<~aiu<1Vh~MS$i9K8NE%&kWHdt*=#hlNl@5$dvZDF2Cnf58pPJLh3gEh zPi9dzqj-=|Y?0F}eXRq?rNt`>FFE%ZZG|VEw@L)~xApAo;%)xK&O_33d1bFuk{|6w znkXf;*uy!2d*SWpIoC9jn?kRU_Y^OZoyH(}gjiAOseLhusk`hO>t6FR)Udj`Uk~v2 zQr(N(2Q#tuU$*{IKO;i(cE%Y_PfyokWq84&;vl^MUCf2#e))D`#6SuGnunhKS!BFPvrh z6R<&kHD4i%<dHp%x-L`G+&!F-+S)m*6&- z;;eT)dU$5JPjREnv)MxS4mno!CuXs$h)nTzVa2@mw${>g!j+xM7jPTtwZt0bPT|tL z>CR_*z7`LyxEFeD=kyiCUZb4aR~bnLu{-n*j=JJirA^W7yu{)-c-mv-kwz^c&gHht z9cweTj}b(#GPyHblyPDua;v3{Kyy1RkKJwF_k5arFZRmt>h8AHCCswG6kuKJ(%96_ zRNWkJeQVjp`7-&IG>)Qz%7<9NE1!>xOZ z4QH%l|rgBs)zvIMi4{}1}6Qs!vOYtvwtW>yCs4X^b`G98I0PSYLhbE}tixocOK z`j!{gT8oQg{VHxD+@J;e9bU$O7MSWtPyKMAwci&^ttm#(6w1mA2M|EXk zhU*R&cXkdHW_ssU)5B)=WElE~aF#!#*RY=}Uha4#)>3*BS=4=lB8I~yc$CUx)(V=? zfH(k+=v6gUKc<$GwmY{wr^*}EbmfOQ-nrhmfm8vjl8atyE7@0;oyY86$|U`g!)E*C zj8h)S9*zttQcu$(#T&MZw&TtoAoxyJ!r>gfO8N8QY-POf``R zumUP9+O(EmNWajW>K(En&j?dM(tl6Aa;fEh&E=QnmNnA)(h^{5!8_P1bR02A^)t$H zhlDVCF5F{N=tul#v)%HWm5pSgH3)I@$;-4W`9Z!{yhzGr?r__UT$Rv|(&f0745L3+ z6@4w^Zt*nxftgc{{G?WqIOPwuPDtUtkkPb1`vkthhU|POU20JpvxU1!Ei*2{1vh{i z!Gs#I;M8BBEW|s&n`18VBODTb1 zGTAHKFJYzC+x3Q73|z;3W@O$<9&+a=G?2&22! z5q+o1YHgwyU}dKjdO!P~9l%XN zO~+68z^C#KZaM1f5`BS`nBKx7OLx-@CX1~OR`EHqueN~lMV7RaDm2#9(flvdX|5Nz zZJULzE+SGm@=+7N#H^?55Gm9O?kPW(T|?w+V+nt1A2Cr6GU~zOw+{@nShxs(lZ&WH z%q>2Ic}rXe&-0Qo7ETmFc1I8Gr+ilFtKQWPsju`5ay2ntw-Ige+tbnGoD5ELfnE+2 zg)?9+dTX+>Tipgvw4euTk@{h{ol}WuB^5pNQF3i9!Z=2rg9CB{ltwq1D7acVC}@@u zm35xz$HZ}!=(W^3`XsxQ-^_t6Nu@x|Gz|X9hvXxuT=r33Tm|+R+_G-WW9|s^m5ibn z3a3qzxr2C_?#K&n5>$t2d@0T*P<#*e zH?x&uK~=a%?I9l{y~&GS2QBLddJR>~7V_;G!I-MgA)1ml>N+wuJot-TcRC*Ihqd%p zwinlmO=QN?USuqC?Kz|^WD0*wxty80Pj6!5m^Da^a~eC~;fo{-)i0pRY*4!E4UG`B zff9(EfX!MxkX7cWwe<4FC;f!B21ye!YBG9~$F+IL#ppoJ)>Y6zmg>jQUA#+nCi`e3 z#FF;cVr%sre1E46U4O3aHO5hQsn5nw?UBKOy0O$aqrZdWUM3E}^VkX+stcfyrO=<) zj@(1;7<6aEBzS0(nWA(@8DQ|9@l_=1`^yU>Nk3B5p)q#g^B=|u{;q8TIwp| zlyMDw-ZRE=^`ufu{jTrV9zw5VQa5PZwf^!PC-2ze9PaD{&q`T)mZP`mfpn9qqFp|! zGzUHT8t6Zdq)c>}t2!ld6m&t)BwZRK&s0ZhH&j*rPYRXSDMzqA=_5ygx3o@aqfUY< zskGWr`vt}Qb}$x(fw(%=xcqwB-m@rBPM`K1ZiyzaRjW> ziN<98vbs{?)cZyva+o(^<)5T|1vR6q)=58N3K1 z03v{WPzh9zR>nTCz8>if;DaI5a*7IPMR}>C{2e{(LuzLg&J3xAxJB9|$Dq?)7Frm% zkEDmnXsxmOQu(M&A-wf$FlQcX<8%j{0j;zlN;cG3Ex?B1_t?NouV2TRkgx z1+Cr({qlE88BnGpq1qTFJqB-TCDdrWppS8p+(4un2~W{cX@U3??y_$7B*$B^3LJ@p z<)KP}T1FP(V!9?pE6YLRou*Aw=fJHqP1{Q`*pN1~{RgfiSU|m*)8Vgn=OV>u9bPWio{m?tD!-Ubz$WWu7 zF$X?Uot#Bfgu~~M7OP(Z3pWvtiB32M&4{MPQg}a(>i*hgqdvIel|jo328(tQHHRjt zFk+Q)lBi28HhOCv;q1v$A8Eaz09>f%>s7R_@)gnDSxOuNHrG!nNBkn5k}IO0PD|UN zHku>_!^JgEJ_qGUPv}8NwFF3Pui(v;

!cdfW50NVSe?29Y^a3sbu*?(zhvoWkTn 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 literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits/audiolab/test_data/test.raw b/telemeta/util/audiolab/scikits/audiolab/test_data/test.raw new file mode 100644 index 0000000000000000000000000000000000000000..fb2a04cb4cf4d6ef43082518fe97b7a238323cb2 GIT binary patch literal 22580 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 DLo_E2 literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits/audiolab/test_data/test.sdif b/telemeta/util/audiolab/scikits/audiolab/test_data/test.sdif new file mode 100644 index 0000000000000000000000000000000000000000..0125b89cd37072f3e004842722c9d0b519d51b75 GIT binary patch literal 91346 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⁣g&KAyC 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

  • U+>5(VVBPAX4S4lDWKj+V0F2))p0h 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 OOs8S1_R&)6uKPc-^p`~d literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits/audiolab/test_data/test.wav b/telemeta/util/audiolab/scikits/audiolab/test_data/test.wav new file mode 100644 index 0000000000000000000000000000000000000000..d6c80126c012e3dc0aa6144be9f42b1a7ce9516f GIT binary patch literal 90366 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 literal 0 HcmV?d00001 diff --git a/telemeta/util/audiolab/scikits/audiolab/tests/__init__.py b/telemeta/util/audiolab/scikits/audiolab/tests/__init__.py new file mode 100644 index 00000000..7f2fbc0c --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/tests/__init__.py @@ -0,0 +1,2 @@ +#! /usr/bin/env python +# Last Change: Mon May 21 12:00 PM 2007 J diff --git a/telemeta/util/audiolab/scikits/audiolab/tests/test_matapi.py b/telemeta/util/audiolab/scikits/audiolab/tests/test_matapi.py new file mode 100644 index 00000000..fe17b8e9 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/tests/test_matapi.py @@ -0,0 +1,164 @@ +#! /usr/bin/env python +# Last Change: Tue Jul 17 11:00 AM 2007 J +from os.path import join, dirname +from os import remove +from tempfile import mkstemp + +from numpy.testing import * +import numpy as N + +set_package_path() +from audiolab.matapi import wavread, auread, aiffread, sdifread, flacread +from audiolab.matapi import wavwrite, auwrite, aiffwrite, sdifwrite, flacwrite +from audiolab.pysndfile import PyaudioException, sndfile, formatinfo as audio_format +from audiolab.pysndfile import FlacUnsupported +restore_path() + +#Optional: +set_local_path() +# import modules that are located in the same directory as this file. +from testcommon import open_tmp_file, close_tmp_file +restore_path() + +class test_audiolab(NumpyTestCase): + def _test_read(self, func, format, filext): + # Create a tmp audio file, write some random data into it, and check it + # is the expected data when read from a function from the matapi. + rfd, fd, cfilename = open_tmp_file('pysndfiletest.' + filext) + try: + nbuff = 22050 + noise = 0.1 * N.random.randn(nbuff) + + # Open the copy file for writing + b = sndfile(cfilename, 'write', format, 1, nbuff) + b.write_frames(noise, nbuff) + b.close() + + # Reread the data + b = sndfile(cfilename, 'read') + rcnoise = b.read_frames(nbuff) + b.close() + + rnoise = func(cfilename)[0] + + assert_array_equal(rnoise, rcnoise) + finally: + close_tmp_file(rfd, cfilename) + + def test_wavread(self): + """ Check wavread """ + self._test_read(wavread, audio_format('wav', 'pcm16', 'file'), 'wav') + + def test_flacread(self): + """ Check flacread """ + try: + self._test_read(flacread, audio_format('flac', 'pcm16', 'file'), 'flac') + except FlacUnsupported: + print "Flac unsupported, flacread not tested" + + def test_auread(self): + """ Check auread """ + self._test_read(auread, audio_format('au', 'ulaw', 'file'), 'au') + + def test_aiffread(self): + """ Check aiffread """ + self._test_read(aiffread, audio_format('aiff', 'pcm16', 'file'), 'aiff') + + def test_sdifread(self): + """ Check sdifread (ircam format) """ + self._test_read(sdifread, audio_format('ircam', 'pcm16', 'file'), 'sdif') + + def test_bad_wavread(self): + """ Check wavread on bad file""" + # Create a tmp audio file with non wav format, write some random data into it, + # and check it can not be opened by wavread + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nbuff = 22050 + noise = 0.1 * N.random.randn(nbuff) + + # Open the copy file for writing + format = audio_format('aiff', 'pcm16') + b = sndfile(cfilename, 'write', format, 1, nbuff) + + b.write_frames(noise, nbuff) + + b.close() + + b = sndfile(cfilename, 'read') + rcnoise = b.read_frames(nbuff) + b.close() + + try: + rnoise = wavread(cfilename)[0] + raise Exception("wavread on non wav file succeded, expected to fail") + except PyaudioException, e: + pass + #print str(e) + ", as expected" + + finally: + close_tmp_file(rfd, cfilename) + + def _test_write(self, func, format, filext): + """ Check *write functions from matpi """ + rfd1, fd1, cfilename1 = open_tmp_file('pysndfiletest.' + filext) + rfd2, fd2, cfilename2 = open_tmp_file('pysndfiletest.' + filext) + try: + nbuff = 22050 + fs = nbuff + noise = 0.1 * N.random.randn(nbuff) + + # Open the first file for writing with sndfile + b = sndfile(cfilename1, 'write', format, 1, fs) + + b.write_frames(noise, nbuff) + + b.close() + + # Write same data with wavwrite + func(noise, cfilename2, fs) + + # Compare if both files have same hash + f1 = open(cfilename1) + f2 = open(cfilename2) + + import md5 + + m1 = md5.new() + m2 = md5.new() + + m1.update(f1.read()) + m2.update(f2.read()) + + f1.close() + f2.close() + assert m1.hexdigest() == m2.hexdigest() + finally: + close_tmp_file(rfd1, cfilename1) + close_tmp_file(rfd2, cfilename2) + + def test_wavwrite(self): + """ Check wavwrite """ + self._test_write(wavwrite, audio_format('wav', 'pcm16', 'file'), 'wav') + + def test_aiffwrite(self): + """ Check aiffwrite """ + self._test_write(aiffwrite, audio_format('aiff', 'pcm16', 'file'), 'aiff') + + def test_auwrite(self): + """ Check wavwrite """ + self._test_write(auwrite, audio_format('au', 'ulaw', 'file'), 'au') + + def test_sdifwrite(self): + """ Check wavwrite """ + self._test_write(sdifwrite, audio_format('ircam', 'pcm16', 'file'), 'sdif') + + def test_flacwrite(self): + """ Check flacwrite """ + try: + self._test_write(flacwrite, audio_format('flac', 'pcm16', 'file'), 'flac') + except FlacUnsupported: + print "Flac unsupported, flacwrite not tested" + +if __name__ == "__main__": + NumpyTest().run() diff --git a/telemeta/util/audiolab/scikits/audiolab/tests/test_pysndfile.py b/telemeta/util/audiolab/scikits/audiolab/tests/test_pysndfile.py new file mode 100644 index 00000000..632a4bc8 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/tests/test_pysndfile.py @@ -0,0 +1,396 @@ +#! /usr/bin/env python +# Last Change: Tue Jul 17 11:00 AM 2007 J +"""Test for the sndfile class.""" +from os.path import join, dirname +import os +import sys + +from numpy.testing import NumpyTestCase, assert_array_equal, NumpyTest, \ + assert_array_almost_equal, set_package_path, restore_path, set_local_path +import numpy as N + +set_package_path() +from audiolab import pysndfile +from audiolab.pysndfile import sndfile, formatinfo as audio_format +restore_path() + +set_local_path() +from testcommon import open_tmp_file, close_tmp_file +restore_path() + +# XXX: there is a lot to refactor here +class test_pysndfile(NumpyTestCase): + def test_basic_io(self): + """ Check open, close and basic read/write""" + # dirty ! + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nbuff = 22050 + + # Open the test file for reading + a = sndfile(ofilename, 'read') + nframes = a.get_nframes() + + # Open the copy file for writing + format = audio_format('wav', 'pcm16') + b = sndfile(fd, 'write', format, a.get_channels(), + a.get_samplerate()) + + # Copy the data + for i in range(nframes / nbuff): + tmpa = a.read_frames(nbuff) + assert tmpa.dtype == N.float + b.write_frames(tmpa, nbuff) + nrem = nframes % nbuff + tmpa = a.read_frames(nrem) + assert tmpa.dtype == N.float + b.write_frames(tmpa, nrem) + + a.close() + b.close() + finally: + close_tmp_file(rfd, cfilename) + + + def test_basic_io_fd(self): + """ Check open from fd works""" + # dirty ! + if sys.platform == 'win32': + print "Not testing opening by fd because does not work on win32" + else: + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + fd = os.open(ofilename, os.O_RDONLY) + hdl = sndfile(fd, 'read') + hdl.close() + + def test_raw(self): + rawname = join(dirname(pysndfile.__file__), 'test_data', 'test.raw') + format = audio_format('raw', 'pcm16', 'little') + a = sndfile(rawname, 'read', format, 1, 11025) + assert a.get_nframes() == 11290 + a.close() + + def test_float64(self): + """Check float64 write/read works""" + # dirty ! + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nbuff = 22050 + + # Open the test file for reading + a = sndfile(ofilename, 'read') + nframes = a.get_nframes() + + # Open the copy file for writing + format = audio_format('wav', 'float64') + b = sndfile(fd, 'write', format, a.get_channels(), + a.get_samplerate()) + + # Copy the data in the wav file + for i in range(nframes / nbuff): + tmpa = a.read_frames(nbuff, dtype = N.float64) + assert tmpa.dtype == N.float64 + b.write_frames(tmpa, nbuff) + nrem = nframes % nbuff + tmpa = a.read_frames(nrem) + b.write_frames(tmpa, nrem) + + a.close() + b.close() + + # Now, reopen both files in for reading, and check data are + # the same + a = sndfile(ofilename, 'read') + b = sndfile(cfilename, 'read') + for i in range(nframes / nbuff): + tmpa = a.read_frames(nbuff, dtype = N.float64) + tmpb = b.read_frames(nbuff, dtype = N.float64) + assert_array_equal(tmpa, tmpb) + + a.close() + b.close() + + finally: + close_tmp_file(rfd, cfilename) + + def test_float32(self): + """Check float write/read works""" + # dirty ! + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nbuff = 22050 + + # Open the test file for reading + a = sndfile(ofilename, 'read') + nframes = a.get_nframes() + + # Open the copy file for writing + format = audio_format('wav', 'float32') + b = sndfile(fd, 'write', format, a.get_channels(), + a.get_samplerate()) + + # Copy the data in the wav file + for i in range(nframes / nbuff): + tmpa = a.read_frames(nbuff, dtype = N.float32) + assert tmpa.dtype == N.float32 + b.write_frames(tmpa, nbuff) + nrem = nframes % nbuff + tmpa = a.read_frames(nrem) + b.write_frames(tmpa, nrem) + + a.close() + b.close() + + # Now, reopen both files in for reading, and check data are + # the same + a = sndfile(ofilename, 'read') + b = sndfile(cfilename, 'read') + for i in range(nframes / nbuff): + tmpa = a.read_frames(nbuff, dtype = N.float32) + tmpb = b.read_frames(nbuff, dtype = N.float32) + assert_array_equal(tmpa, tmpb) + + a.close() + b.close() + + finally: + close_tmp_file(rfd, cfilename) + + def test_supported_features(self): + msg = "\nsupported file format are : this test is broken FIXME" + #for i in pysndfile.supported_format(): + # msg += str(i) + ', ' + #print msg + #msg = "supported encoding format are : " + #for i in pysndfile.supported_encoding(): + # msg += str(i) + ', ' + #print msg + #msg = "supported endianness are : " + #for i in pysndfile.supported_endianness(): + # msg += str(i) + ', ' + print msg + + def test_short_io(self): + # TODO: check if neg or pos value is the highest in abs + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nb = 2 ** 14 + nbuff = 22050 + fs = 22050 + a = N.random.random_integers(-nb, nb, nbuff) + a = a.astype(N.short) + + # Open the file for writing + format = audio_format('wav', 'pcm16') + b = sndfile(fd, 'write', format, 1, fs) + + b.write_frames(a, nbuff) + b.close() + + b = sndfile(cfilename, 'read') + + read_a = b.read_frames(nbuff, dtype = N.short) + b.close() + + assert_array_equal(a, read_a) + + finally: + close_tmp_file(rfd, cfilename) + + def test_int_io(self): + # TODO: check if neg or pos value is the highest in abs + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + nb = 2 ** 25 + nbuff = 22050 + fs = 22050 + a = N.random.random_integers(-nb, nb, nbuff) + a = a.astype(N.int32) + + # Open the file for writing + format = audio_format('wav', 'pcm32') + b = sndfile(fd, 'write', format, 1, fs) + + b.write_frames(a, nbuff) + b.close() + + b = sndfile(cfilename, 'read') + + read_a = b.read_frames(nbuff, dtype = N.int32) + b.close() + + assert_array_equal(a, read_a) + + finally: + close_tmp_file(rfd, cfilename) + + def test_mismatch(self): + # This test open a file for writing, but with bad args (channels and + # nframes inverted) + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + # Open the file for writing + format = audio_format('wav', 'pcm16') + try: + b = sndfile(fd, 'write', \ + format, channels = 22000, samplerate = 1) + raise Exception("Try to open a file with more than 256 "\ + "channels, this should not succeed !") + except RuntimeError, e: + #print "Gave %d channels, error detected is \"%s\"" % (22000, e) + pass + + finally: + close_tmp_file(rfd, cfilename) + + def test_bigframes(self): + """ Try to seek really far""" + rawname = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + a = sndfile(rawname, 'read') + try: + try: + a.seek(2 ** 60) + raise Exception("Seek really succeded ! This should not happen") + except pysndfile.PyaudioIOError, e: + pass + finally: + a.close() + + def test_float_frames(self): + """ Check nframes can be a float""" + rfd, fd, cfilename = open_tmp_file('pysndfiletest.wav') + try: + # Open the file for writing + format = audio_format('wav', 'pcm16') + a = sndfile(fd, 'rwrite', format, channels = 1, + samplerate = 22050) + tmp = N.random.random_integers(-100, 100, 1000) + tmp = tmp.astype(N.short) + a.write_frames(tmp, tmp.size) + a.seek(0) + a.sync() + ctmp = a.read_frames(1e2, dtype = N.short) + a.close() + + finally: + close_tmp_file(rfd, cfilename) + + def test_nofile(self): + """ Check the failure when opening a non existing file.""" + try: + f = sndfile("floupi.wav", "read") + raise AssertionError("call to non existing file should not succeed") + except IOError: + pass + except Exception, e: + raise AssertionError("opening non existing file should raise a IOError exception, got %s instead" % e.__class__) + +class test_seek(NumpyTestCase): + def test_simple(self): + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + # Open the test file for reading + a = sndfile(ofilename, 'read') + nframes = a.get_nframes() + + buffsize = 1024 + buffsize = min(nframes, buffsize) + + # First, read some frames, go back, and compare buffers + buff = a.read_frames(buffsize) + a.seek(0) + buff2 = a.read_frames(buffsize) + assert_array_equal(buff, buff2) + + a.close() + + # Now, read some frames, go back, and compare buffers + # (check whence == 1 == SEEK_CUR) + a = sndfile(ofilename, 'read') + a.read_frames(buffsize) + buff = a.read_frames(buffsize) + a.seek(-buffsize, 1) + buff2 = a.read_frames(buffsize) + assert_array_equal(buff, buff2) + + a.close() + + # Now, read some frames, go back, and compare buffers + # (check whence == 2 == SEEK_END) + a = sndfile(ofilename, 'read') + buff = a.read_frames(nframes) + a.seek(-buffsize, 2) + buff2 = a.read_frames(buffsize) + assert_array_equal(buff[-buffsize:], buff2) + + def test_rw(self): + """Test read/write pointers for seek.""" + ofilename = join(dirname(pysndfile.__file__), 'test_data', 'test.wav') + rfd, fd, cfilename = open_tmp_file('rwseektest.wav') + try: + ref = sndfile(ofilename, 'read') + test = sndfile(fd, 'rwrite', format = ref._format, channels = + ref.get_channels(), samplerate = ref.get_samplerate()) + n = 1024 + + rbuff = ref.read_frames(n, dtype = N.int16) + test.write_frames(rbuff) + tbuff = test.read_frames(n, dtype = N.int16) + + assert_array_equal(rbuff, tbuff) + + # Test seeking both read and write pointers + test.seek(0, 0) + test.write_frames(rbuff) + tbuff = test.read_frames(n, dtype = N.int16) + assert_array_equal(rbuff, tbuff) + + # Test seeking only read pointer + rbuff1 = rbuff.copy() + rbuff2 = rbuff1 * 2 + 1 + rbuff2.clip(-30000, 30000) + test.seek(0, 0, 'r') + test.write_frames(rbuff2) + tbuff1 = test.read_frames(n, dtype = N.int16) + try: + tbuff2 = test.read_frames(n, dtype = N.int16) + except IOError, e: + msg = "write pointer was updated in read seek !" + msg += "\n(msg is %s)" % e + raise AssertionError(msg) + + assert_array_equal(rbuff1, tbuff1) + assert_array_equal(rbuff2, tbuff2) + if N.all(rbuff2 == tbuff1): + raise AssertionError("write pointer was updated"\ + " in read seek !") + + # Test seeking only write pointer + rbuff3 = rbuff1 * 2 - 1 + rbuff3.clip(-30000, 30000) + test.seek(0, 0, 'rw') + test.seek(n, 0, 'w') + test.write_frames(rbuff3) + tbuff1 = test.read_frames(n, N.int16) + try: + assert_array_equal(tbuff1, rbuff1) + except AssertionError: + raise AssertionError("read pointer was updated in write seek !") + + try: + tbuff3 = test.read_frames(n, N.int16) + except IOError, e: + msg = "read pointer was updated in write seek !" + msg += "\n(msg is %s)" % e + raise AssertionError(msg) + + assert_array_equal(tbuff3, rbuff3) + test.close() + + finally: + close_tmp_file(rfd, cfilename) + +if __name__ == "__main__": + NumpyTest().run() diff --git a/telemeta/util/audiolab/scikits/audiolab/tests/testcommon.py b/telemeta/util/audiolab/scikits/audiolab/tests/testcommon.py new file mode 100644 index 00000000..dd8c4a42 --- /dev/null +++ b/telemeta/util/audiolab/scikits/audiolab/tests/testcommon.py @@ -0,0 +1,20 @@ +import os +from tempfile import mkstemp +import sys + +def open_tmp_file(name): + """On any sane platforms, return a fd on a tmp file. On windows, returns + the filename, and as such, is not secure (someone else can reopen the file + in between).""" + fd, cfilename = mkstemp('pysndfiletest.wav') + if sys.platform == 'win32': + return fd, cfilename, cfilename + else: + return fd, fd, cfilename + +def close_tmp_file(fd, filename): + """On any sane platforms, remove the file . On windows, only close the + file.""" + os.close(fd) + os.remove(filename) + diff --git a/telemeta/util/audiolab/setup.cfg b/telemeta/util/audiolab/setup.cfg new file mode 100644 index 00000000..7b3b6f1b --- /dev/null +++ b/telemeta/util/audiolab/setup.cfg @@ -0,0 +1,4 @@ +[egg_info] +#tag_svn_revision = 1 +tag_build = .dev + diff --git a/telemeta/util/audiolab/setup.py b/telemeta/util/audiolab/setup.py new file mode 100644 index 00000000..0963848b --- /dev/null +++ b/telemeta/util/audiolab/setup.py @@ -0,0 +1,222 @@ +#! /usr/bin/env python +# Last Change: Tue Jul 29 12:00 PM 2008 J + +# Copyright (C) 2006-2007 Cournapeau David +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) any +# later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this library; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# TODO: +# - check how to handle cmd line build options with distutils and use +# it in the building process + +descr = """ audiolab is a small python package to import data from audio +files to numpy arrays and export data from numpy arrays to audio files. It uses +libsndfile from Erik Castro de Lopo for the underlying IO, which supports many +different audio formats: http://www.mega-nerd.com/libsndfile/ + +For now, the python api for audio IO should be stable; a matlab-like API is +also available for quick read/write (ala wavread, wavwrite, etc...). For 1.0 +release, I hope to add support for simple read/write to soundcard, to be able +to record and listen to data in numpy arrays. + +2006-2007, David Cournapeau + +LICENSE: audiolab is licensed under the LGPL, as is libsndfile itself. See +COPYING.txt for details. """ + +from os.path import join +import os +import sys + +DISTNAME = 'scikits.audiolab' +DESCRIPTION = 'A python module to make noise from numpy arrays' +LONG_DESCRIPTION = descr +MAINTAINER = 'David Cournapeau', +MAINTAINER_EMAIL = 'david@ar.media.kyoto-u.ac.jp', +URL = 'http://www.ar.media.kyoto-u.ac.jp/members/david/softwares/audiolab', +LICENSE = 'LGPL' +DOWNLOAD_URL = URL + +SNDFILE_MAJ_VERSION = 1 + +# The following is more or less random copy/paste from numpy.distutils ... +import setuptools +from distutils.errors import DistutilsError +from numpy.distutils.system_info import system_info, NotFoundError, dict_append, so_ext +from numpy.distutils.core import setup, Extension + +class SndfileNotFoundError(NotFoundError): + """ sndfile (http://www.mega-nerd.com/libsndfile/) library not found. + Directories to search for the libraries can be specified in the + site.cfg file (section [sndfile]).""" + +class sndfile_info(system_info): + #variables to override + section = 'sndfile' + notfounderror = SndfileNotFoundError + libname = 'sndfile' + header = 'sndfile.h' + + def __init__(self): + system_info.__init__(self) + + def library_extensions(self): + # We rewrite library_extension + exts = system_info.library_extensions(self) + if sys.platform == 'win32': + exts.insert(0, '.dll') + return exts + + def calc_info(self): + """ Compute the informations of the library """ + prefix = 'lib' + + # Look for the shared library + sndfile_libs = self.get_libs('sndfile_libs', self.libname) + lib_dirs = self.get_lib_dirs() + tmp = None + for i in lib_dirs: + tmp = self.check_libs(i, sndfile_libs) + if tmp is not None: + info = tmp + break + if tmp is None: + raise SndfileNotFoundError("sndfile library not found") + + # Look for the header file + include_dirs = self.get_include_dirs() + inc_dir = None + for d in include_dirs: + p = self.combine_paths(d,self.header) + if p: + inc_dir = os.path.dirname(p[0]) + headername = os.path.abspath(p[0]) + break + + if inc_dir is None: + raise SndfileNotFoundError("header not found") + + if inc_dir is not None and tmp is not None: + if sys.platform == 'win32': + # win32 case + fullname = prefix + tmp['libraries'][0] + \ + '.dll' + elif sys.platform == 'darwin': + # Mac Os X case + fullname = prefix + tmp['libraries'][0] + '.' + \ + str(SNDFILE_MAJ_VERSION) + '.dylib' + else: + # All others (Linux for sure; what about solaris) ? + fullname = prefix + tmp['libraries'][0] + '.so' + \ + '.' + str(SNDFILE_MAJ_VERSION) + fullname = os.path.join(info['library_dirs'][0], fullname) + dict_append(info, include_dirs=[inc_dir], + fullheadloc = headername, + fulllibloc = fullname) + else: + raise RuntimeError("This is a bug") + + #print self + self.set_info(**info) + return + +from header_parser import do_subst_in_file +def configuration(parent_package='',top_path=None, package_name=DISTNAME): + if os.path.exists('MANIFEST'): os.remove('MANIFEST') + if os.path.exists('scikits/audiolab/pysndfile.py'): os.remove('scikits/audiolab/pysndfile.py') + + pkg_prefix_dir = os.path.join('scikits', 'audiolab') + # Check that sndfile can be found and get necessary informations + # (assume only one header and one library file) + sf_info = sndfile_info() + sf_config = sf_info.get_info(2) + headername = sf_config['fullheadloc'] + libname = sf_config['fulllibloc'] + + # Now, generate pysndfile.py.in + from generate_const import generate_enum_dicts + repdict = generate_enum_dicts(headername) + repdict['%SHARED_LOCATION%'] = libname + #do_subst_in_file('pysndfile.py.in', 'pysndfile.py', repdict) + do_subst_in_file(os.path.join(pkg_prefix_dir, 'pysndfile.py.in'), + os.path.join(pkg_prefix_dir, 'pysndfile.py'), + repdict) + + # Get the version + from scikits.audiolab.info import VERSION as audiolab_version + + from numpy.distutils.misc_util import Configuration + config = Configuration(package_name,parent_package,top_path, + version = audiolab_version, + maintainer = MAINTAINER, + maintainer_email = MAINTAINER_EMAIL, + description = DESCRIPTION, + license = LICENSE, + url = URL, + download_url = DOWNLOAD_URL, + long_description = LONG_DESCRIPTION) + + # XXX: once in SVN, should add svn version... + #print config.make_svn_version_py() + + # package_data does not work with sdist for setuptools 0.5 (setuptools bug), + # so we need to add them here while the bug is not solved... + config.add_data_files(('docs', \ + ['scikits/audiolab/docs/' + i for i in DOC_FILES])) + + config.add_data_files(('test_data', \ + ['scikits/audiolab/test_data/' + i + for i in TEST_DATA_FILES])) + + config.add_data_files(('misc', \ + ['scikits/audiolab/misc/' + i + for i in BAD_FLAC_FILES])) + + config.add_data_dir(('examples', 'scikits/audiolab/docs/examples')) + + return config + +TEST_DATA_FILES = ['test.raw', 'test.flac', 'test.wav', 'test.au', + 'test.sdif'] +DOC_FILES = ['audiolab.pdf', 'index.txt'] +BAD_FLAC_FILES = ['Makefile', 'badflac.flac', 'badflac.c'] + +if __name__ == "__main__": + # setuptools version of config script + + # package_data does not work with sdist for setuptools 0.5 (setuptools bug) + # So we cannot add data files via setuptools yet. + + #data_files = ['test_data/' + i for i in TEST_DATA_FILES] + #data_files.extend(['docs/' + i for i in doc_files]) + + setup(configuration = configuration, + install_requires='numpy', # can also add version specifiers + namespace_packages=['scikits'], + packages=setuptools.find_packages(), + include_package_data = True, + #package_data = {'scikits.audiolab': data_files}, + test_suite="tester", # for python setup.py test + zip_safe=True, # the package can run out of an .egg file + #FIXME url, download_url, ext_modules + classifiers = + [ 'Development Status :: 4 - Beta', + 'Environment :: Console', + 'Intended Audience :: Developers', + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: LGPL License', + 'Topic :: Multimedia :: Sound/Audio', + 'Topic :: Scientific/Engineering'] + ) diff --git a/telemeta/util/audiolab/site.cfg.win32 b/telemeta/util/audiolab/site.cfg.win32 new file mode 100644 index 00000000..f9bdd910 --- /dev/null +++ b/telemeta/util/audiolab/site.cfg.win32 @@ -0,0 +1,5 @@ +# Check Win32 info for using audiolab on windows +[sndfile] +include_dirs = c:\local\include +library_dirs = c:\local\lib +sndfile_libs = sndfile-1 diff --git a/telemeta/util/audiolab/site.cfg_noflac b/telemeta/util/audiolab/site.cfg_noflac new file mode 100644 index 00000000..66adc498 --- /dev/null +++ b/telemeta/util/audiolab/site.cfg_noflac @@ -0,0 +1,8 @@ +[sndfile] +include_dirs = /usr/media/boulot/src/sigtools/pyaudio/local/include +library_dirs = /usr/media/boulot/src/sigtools/pyaudio/local/lib +sndfile_libs = sndfile +#include_dirs = /home/david/local/include +#library_dirs = /home/david/local/lib +#libraries = sndfile + diff --git a/telemeta/util/audiolab/tester.py b/telemeta/util/audiolab/tester.py new file mode 100644 index 00000000..e0f2262c --- /dev/null +++ b/telemeta/util/audiolab/tester.py @@ -0,0 +1,13 @@ +#! /usr/bin/env python +# Last Change: Sat Jul 21 03:00 PM 2007 J + +"""Mini script useful for top level testing of the learn package.""" + +from numpy.testing import NumpyTest + +def additional_tests(): + # XXX: does this guarantee that the package is the one in the dev trunk, and + # not scikits.foo installed somewhere else ? + import scikits.audiolab + np = NumpyTest(scikits.audiolab) + return np._test_suite_from_all_tests(np.package, level = 10, verbosity = 1) diff --git a/telemeta/visualization/octave_core.py b/telemeta/visualization/octave_core.py index 0664dc47..cb8f4475 100644 --- a/telemeta/visualization/octave_core.py +++ b/telemeta/visualization/octave_core.py @@ -47,8 +47,6 @@ class OctaveCoreVisualizer(Component): mFile_tmp = open(mFile_name,'w') self.pngFile = NamedTemporaryFile(suffix='.png') command = ['octave', mFile_name] - print command - print self.pngFile.name for line in self.get_mFile_line(): mFile_tmp.write(line) @@ -71,6 +69,6 @@ class OctaveCoreVisualizer(Component): self.ppmFile.close() self.pngFile.close() - #os.remove(mFile_name) + os.remove(mFile_name) diff --git a/telemeta/visualization/spectrogram3.py b/telemeta/visualization/spectrogram3.py index fa990c71..0930f502 100644 --- a/telemeta/visualization/spectrogram3.py +++ b/telemeta/visualization/spectrogram3.py @@ -18,9 +18,6 @@ class SpectrogramVisualizer3(Component): implements(IMediaItemVisualizer) - def __init__(self): - pass - def get_id(self): return "spectrogram3" diff --git a/telemeta/visualization/waveform3.py b/telemeta/visualization/waveform3.py index bc6eaf56..4d2e806c 100644 --- a/telemeta/visualization/waveform3.py +++ b/telemeta/visualization/waveform3.py @@ -18,9 +18,6 @@ class WaveFormVisualizer(Component): implements(IMediaItemVisualizer) - def __init__(self): - pass - def get_id(self): return "waveform3" @@ -47,5 +44,3 @@ class WaveFormVisualizer(Component): pngFile_w.close() pngFile_s.close() - - diff --git a/telemeta/web/base.py b/telemeta/web/base.py index af14cd8f..9f332ef1 100644 --- a/telemeta/web/base.py +++ b/telemeta/web/base.py @@ -47,12 +47,12 @@ class WebView(Component): formats.append({'name': exporter.get_format(), 'extension': exporter.get_file_extension()}) visualizers = [] for visualizer in self.visualizers: - visualizers.append({'name':visualizer.get_name(), 'id': + visualizers.append({'name':visualizer.get_name(), 'id': visualizer.get_id()}) if request.REQUEST.has_key('visualizer_id'): visualizer_id = request.REQUEST['visualizer_id'] else: - visualizer_id = 'waveform' + visualizer_id = 'waveform3' return render_to_response(template, {'item': item, 'export_formats': formats, @@ -302,10 +302,3 @@ class WebView(Component): template_name='geo_country_collections.html', paginate_by=20, extra_context={'country': country, 'continent': continent}) - - - - - - - -- 2.39.5